int main(int argc, char **argv) { if ( argc<4 ) { printf("Usage: logocnv startlogo stoplogo outfile\n"); exit(1); } LVImageSourceRef startimg = LVCreateFileCopyImageSource( lString16(argv[1]) ); if ( startimg.isNull() ) { printf("Cannot open image from file %s\n", argv[1]); exit(1); } printf("Start image: %s %d x %d\n", argv[1], startimg->GetWidth(), startimg->GetHeight()); LVGrayDrawBuf buf1( 600, 800, 3 ); buf1.Draw(startimg, 0, 0, 600, 800, true); LVImageSourceRef stopimg = LVCreateFileCopyImageSource( lString16(argv[2]) ); if ( stopimg.isNull() ) { printf("Cannot open image from file %s\n", argv[2]); exit(1); } printf("Stop image: %s %d x %d\n", argv[1], startimg->GetWidth(), startimg->GetHeight()); LVGrayDrawBuf buf2( 600, 800, 3 ); buf2.Draw(stopimg, 0, 0, 600, 800, true); FILE * out = fopen( argv[3], "wb" ); if ( !out ) { printf("Cannot create output file %s", argv[3]); exit(1); } int written = 0; written += fwrite(buf1.GetScanLine(0), 1, buf1.GetRowSize()*buf1.GetHeight(), out ); written += fwrite(buf2.GetScanLine(0), 1, buf2.GetRowSize()*buf2.GetHeight(), out ); fclose(out); printf("%d bytes written to file %s\n", written, argv[3]); }
bool V3DocViewWin::loadDefaultCover( lString16 filename ) { LVImageSourceRef cover = LVCreateFileCopyImageSource( filename.c_str() ); if ( !cover.isNull() ) { _docview->setDefaultCover( cover ); return true; } else { IMAGE_SOURCE_FROM_BYTES(defCover, cr3_def_cover_gif); _docview->setDefaultCover( defCover ); return false; } }
static int drawCoverPage(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); BlitBuffer *bb = (BlitBuffer*) lua_topointer(L, 2); int w = bb->w, h = bb->h; /* Set DrawBuf to 8bpp */ LVGrayDrawBuf drawBuf(w, h, 8, bb->data); LVImageSourceRef cover = doc->text_view->getCoverPageImage(); if (!cover.isNull()) printf("cover size:%d,%d\n", cover->GetWidth(), cover->GetHeight()); else printf("cover page is null.\n"); LVDrawBookCover(drawBuf, cover, lString8("Droid Sans Fallback"), lString16("test"), lString16("test"), lString16("test"), 0); return 0; }
bool ImportEpubDocument( LVStreamRef stream, ldomDocument * m_doc, LVDocViewCallback * progressCallback, CacheLoadingCallback * formatCallback ) { LVContainerRef arc = LVOpenArchieve( stream ); if ( arc.isNull() ) return false; // not a ZIP archive // check root media type lString16 rootfilePath = EpubGetRootFilePath(arc); if ( rootfilePath.empty() ) return false; EncryptedDataContainer * decryptor = new EncryptedDataContainer(arc); if (decryptor->open()) { CRLog::debug("EPUB: encrypted items detected"); } LVContainerRef m_arc = LVContainerRef(decryptor); if (decryptor->hasUnsupportedEncryption()) { // DRM!!! createEncryptedEpubWarningDocument(m_doc); return true; } m_doc->setContainer(m_arc); // read content.opf EpubItems epubItems; //EpubItem * epubToc = NULL; //TODO LVArray<EpubItem*> spineItems; lString16 codeBase; //lString16 css; // { codeBase=LVExtractPath(rootfilePath, false); CRLog::trace("codeBase=%s", LCSTR(codeBase)); } LVStreamRef content_stream = m_arc->OpenStream(rootfilePath.c_str(), LVOM_READ); if ( content_stream.isNull() ) return false; lString16 ncxHref; lString16 coverId; LVEmbeddedFontList fontList; EmbeddedFontStyleParser styleParser(fontList); // reading content stream { ldomDocument * doc = LVParseXMLStream( content_stream ); if ( !doc ) return false; CRPropRef m_doc_props = m_doc->getProps(); lString16 author = doc->textFromXPath( lString16(L"package/metadata/creator")); lString16 title = doc->textFromXPath( lString16(L"package/metadata/title")); m_doc_props->setString(DOC_PROP_TITLE, title); m_doc_props->setString(DOC_PROP_AUTHORS, author ); for ( int i=1; i<50; i++ ) { ldomNode * item = doc->nodeFromXPath( lString16(L"package/metadata/identifier[") + lString16::itoa(i) + L"]" ); if (!item) break; lString16 key = item->getText(); if (decryptor->setManglingKey(key)) { CRLog::debug("Using font mangling key %s", LCSTR(key)); break; } } CRLog::info("Author: %s Title: %s", LCSTR(author), LCSTR(title)); for ( int i=1; i<20; i++ ) { ldomNode * item = doc->nodeFromXPath( lString16(L"package/metadata/meta[") + lString16::itoa(i) + L"]" ); if ( !item ) break; lString16 name = item->getAttributeValue(L"name"); lString16 content = item->getAttributeValue(L"content"); if ( name == L"cover" ) coverId = content; else if ( name==L"calibre:series" ) m_doc_props->setString(DOC_PROP_SERIES_NAME, content ); else if ( name==L"calibre:series_index" ) m_doc_props->setInt(DOC_PROP_SERIES_NUMBER, content.atoi() ); } // items for ( int i=1; i<50000; i++ ) { ldomNode * item = doc->nodeFromXPath( lString16(L"package/manifest/item[") + lString16::itoa(i) + L"]" ); if ( !item ) break; lString16 href = item->getAttributeValue(L"href"); lString16 mediaType = item->getAttributeValue(L"media-type"); lString16 id = item->getAttributeValue(L"id"); if ( !href.empty() && !id.empty() ) { if ( id==coverId ) { // coverpage file lString16 coverFileName = codeBase + href; CRLog::info("EPUB coverpage file: %s", LCSTR(coverFileName)); LVStreamRef stream = m_arc->OpenStream(coverFileName.c_str(), LVOM_READ); if ( !stream.isNull() ) { LVImageSourceRef img = LVCreateStreamImageSource(stream); if ( !img.isNull() ) { CRLog::info("EPUB coverpage image is correct: %d x %d", img->GetWidth(), img->GetHeight() ); m_doc_props->setString(DOC_PROP_COVER_FILE, coverFileName); } } } EpubItem * epubItem = new EpubItem; epubItem->href = href; epubItem->id = id; epubItem->mediaType = mediaType; epubItems.add( epubItem ); // // register embedded document fonts // if (mediaType == L"application/vnd.ms-opentype" // || mediaType == L"application/x-font-otf" // || mediaType == L"application/x-font-ttf") { // TODO: more media types? // // TODO: // fontList.add(codeBase + href); // } } if ( mediaType==L"text/css" ) { lString16 name = LVCombinePaths(codeBase, href); LVStreamRef cssStream = m_arc->OpenStream(name.c_str(), LVOM_READ); if (!cssStream.isNull()) { lString8 cssFile = UnicodeToUtf8(LVReadTextFile(cssStream)); lString16 base = name; LVExtractLastPathElement(base); CRLog::trace("style: %s", cssFile.c_str()); styleParser.parse(base, cssFile); } } } // spine == itemrefs if ( epubItems.length()>0 ) { ldomNode * spine = doc->nodeFromXPath( lString16(L"package/spine") ); if ( spine ) { EpubItem * ncx = epubItems.findById( spine->getAttributeValue(L"toc") ); //TODO //EpubItem * ncx = epubItems.findById(lString16("ncx")); if ( ncx!=NULL ) ncxHref = codeBase + ncx->href; for ( int i=1; i<50000; i++ ) { ldomNode * item = doc->nodeFromXPath( lString16(L"package/spine/itemref[") + lString16::itoa(i) + L"]" ); if ( !item ) break; EpubItem * epubItem = epubItems.findById( item->getAttributeValue(L"idref") ); if ( epubItem ) { // TODO: add to document spineItems.add( epubItem ); } } } } delete doc; } if ( spineItems.length()==0 ) return false; #if BUILD_LITE!=1 if ( m_doc->openFromCache(formatCallback) ) { if ( progressCallback ) { progressCallback->OnLoadFileEnd( ); } return true; } #endif lUInt32 saveFlags = m_doc->getDocFlags(); m_doc->setDocFlags( saveFlags ); m_doc->setContainer( m_arc ); ldomDocumentWriter writer(m_doc); #if 0 m_doc->setNodeTypes( fb2_elem_table ); m_doc->setAttributeTypes( fb2_attr_table ); m_doc->setNameSpaceTypes( fb2_ns_table ); #endif //m_doc->setCodeBase( codeBase ); ldomDocumentFragmentWriter appender(&writer, lString16(L"body"), lString16(L"DocFragment"), lString16::empty_str ); writer.OnStart(NULL); writer.OnTagOpenNoAttr(L"", L"body"); int fragmentCount = 0; for ( int i=0; i<spineItems.length(); i++ ) { if ( spineItems[i]->mediaType==L"application/xhtml+xml" ) { lString16 name = codeBase + spineItems[i]->href; appender.addPathSubstitution( name, lString16(L"_doc_fragment_") + lString16::itoa(i) ); } } for ( int i=0; i<spineItems.length(); i++ ) { if ( spineItems[i]->mediaType==L"application/xhtml+xml" ) { lString16 name = codeBase + spineItems[i]->href; { CRLog::debug("Checking fragment: %s", LCSTR(name)); LVStreamRef stream = m_arc->OpenStream(name.c_str(), LVOM_READ); if ( !stream.isNull() ) { appender.setCodeBase( name ); lString16 base = name; LVExtractLastPathElement(base); //CRLog::trace("base: %s", LCSTR(base)); //LVXMLParser LVHTMLParser parser(stream, &appender); if ( parser.CheckFormat() && parser.Parse() ) { // valid fragmentCount++; lString8 headCss = appender.getHeadStyleText(); //CRLog::trace("style: %s", headCss.c_str()); styleParser.parse(base, headCss); } else { CRLog::error("Document type is not XML/XHTML for fragment %s", LCSTR(name)); } } } } } ldomDocument * ncxdoc = NULL; if ( !ncxHref.empty() ) { LVStreamRef stream = m_arc->OpenStream(ncxHref.c_str(), LVOM_READ); lString16 codeBase = LVExtractPath( ncxHref ); if ( codeBase.length()>0 && codeBase.lastChar()!='/' ) codeBase.append(1, L'/'); appender.setCodeBase(codeBase); if ( !stream.isNull() ) { ldomDocument * ncxdoc = LVParseXMLStream( stream ); if ( ncxdoc!=NULL ) { ldomNode * navMap = ncxdoc->nodeFromXPath( lString16(L"ncx/navMap")); if ( navMap!=NULL ) ReadEpubToc( m_doc, navMap, m_doc->getToc(), appender ); delete ncxdoc; } } } writer.OnTagClose(L"", L"body"); writer.OnStop(); CRLog::debug("EPUB: %d documents merged", fragmentCount); if (!fontList.empty()) { // set document font list, and register fonts m_doc->getEmbeddedFontList().set(fontList); m_doc->registerEmbeddedFonts(); m_doc->forceReinitStyles(); } if ( fragmentCount==0 ) return false; #if 0 // set stylesheet //m_doc->getStyleSheet()->clear(); m_doc->setStyleSheet( NULL, true ); //m_doc->getStyleSheet()->parse(m_stylesheet.c_str()); if ( !css.empty() && m_doc->getDocFlag(DOC_FLAG_ENABLE_INTERNAL_STYLES) ) { m_doc->setStyleSheet( "p.p { text-align: justify }\n" "svg { text-align: center }\n" "i { display: inline; font-style: italic }\n" "b { display: inline; font-weight: bold }\n" "abbr { display: inline }\n" "acronym { display: inline }\n" "address { display: inline }\n" "p.title-p { hyphenate: none }\n" //abbr, acronym, address, blockquote, br, cite, code, dfn, div, em, h1, h2, h3, h4, h5, h6, kbd, p, pre, q, samp, span, strong, var , false); m_doc->setStyleSheet( UnicodeToUtf8(css).c_str(), false ); //m_doc->getStyleSheet()->parse(UnicodeToUtf8(css).c_str()); } else { //m_doc->getStyleSheet()->parse(m_stylesheet.c_str()); //m_doc->setStyleSheet( m_stylesheet.c_str(), false ); } #endif #if 0 LVStreamRef out = LVOpenFileStream( L"c:\\doc.xml" , LVOM_WRITE ); if ( !out.isNull() ) m_doc->saveToStream( out, "utf-8" ); #endif // DONE! if ( progressCallback ) { progressCallback->OnLoadFileEnd( ); m_doc->compact(); m_doc->dumpStatistics(); } return true; }
int InitDoc(char *fileName) { static const lChar16 * css_file_name = L"fb2.css"; // fb2 CRLog::trace("InitDoc()"); #ifdef __i386__ //CRLog::setFileLogger("/root/abook/crengine.log"); CRLog::setStdoutLogger(); CRLog::setLogLevel(CRLog::LL_TRACE); #else //InitCREngineLog(NULL); #if 0 CRLog::setFileLogger("/root/abook/.cr3/cr3.log", true); CRLog::setLogLevel(CRLog::LL_TRACE); #else InitCREngineLog("/root/abook/crengine/crlog.ini"); #endif #endif CRLog::trace("creating window manager..."); CRJinkeWindowManager * wm = new CRJinkeWindowManager(600,800); CRLog::trace("loading skin..."); if ( !wm->loadSkin( lString16( L"/root/abook/crengine/skin" ) ) ) if ( !wm->loadSkin( lString16( L"/home/crengine/skin" ) ) ) wm->loadSkin( lString16( L"/root/crengine/skin" ) ); CRLog::trace("drawing progressbar 0%%..."); //wm->getScreen()->getCanvas()->Clear(0xFFFFFF); //wm->getScreen()->invalidateRect( lvRect(0, 0, 600, 800) ); //wm->showProgress(lString16("cr3_wait_icon.png"), 10); { const lChar16 * imgname = ( wm->getScreenOrientation()&1 ) ? L"cr3_logo_screen_landscape.png" : L"cr3_logo_screen.png"; LVImageSourceRef img = wm->getSkin()->getImage(imgname); if ( !img.isNull() ) { wm->getScreen()->getCanvas()->Draw(img, 0, 0, wm->getScreen()->getWidth(), wm->getScreen()->getHeight(), false ); } } lString16 bookmarkDir("/root/abook/bookmarks/"); { lString8 fn(fileName); if ( fn.startsWith(lString8("/home")) ) { strcpy( history_file_name, "/home/.cr3hist" ); bookmarkDir = lString16("/home/bookmarks/"); } CRLog::info( "History file name: %s", history_file_name ); } char manual_file[512] = ""; { const char * lang = getLang(); if ( lang && lang[0] ) { // set translator CRLog::info("Current language is %s, looking for translation file", lang); lString16 mofilename = L"/root/crengine/i18n/" + lString16(lang) + L".mo"; lString16 mofilename2 = L"/root/abook/crengine/i18n/" + lString16(lang) + L".mo"; CRMoFileTranslator * t = new CRMoFileTranslator(); if ( t->openMoFile( mofilename2 ) || t->openMoFile( mofilename ) ) { CRLog::info("translation file %s.mo found", lang); CRI18NTranslator::setTranslator( t ); } else { CRLog::info("translation file %s.mo not found", lang); delete t; } sprintf( manual_file, "/root/abook/crengine/manual/cr3-manual-%s.fb2", lang ); if ( !LVFileExists( lString16(manual_file).c_str() ) ) sprintf( manual_file, "/root/crengine/manual/cr3-manual-%s.fb2", lang ); } } const lChar16 * ini_fname = L"cr3.ini"; #ifdef SEPARATE_INI_FILES if ( strstr(fileName, ".txt")!=NULL || strstr(fileName, ".tcr")!=NULL) { ini_fname = L"cr3-txt.ini"; css_file_name = L"txt.css"; } else if ( strstr(fileName, ".rtf")!=NULL ) { ini_fname = L"cr3-rtf.ini"; css_file_name = L"rtf.css"; } else if ( strstr(fileName, ".htm")!=NULL ) { ini_fname = L"cr3-htm.ini"; css_file_name = L"htm.css"; } else if ( strstr(fileName, ".epub")!=NULL ) { ini_fname = L"cr3-epub.ini"; css_file_name = L"epub.css"; } else { ini_fname = L"cr3-fb2.ini"; css_file_name = L"fb2.css"; } #endif lString16Collection fontDirs; fontDirs.add( lString16(L"/root/abook/fonts/") ); fontDirs.add( lString16(L"/home/fonts/") ); //fontDirs.add( lString16(L"/root/crengine/fonts") ); // will be added CRLog::info("INIT..."); if ( !InitCREngine( "/root/crengine/", fontDirs ) ) return 0; #ifdef ALLOW_RUN_EXE { __pid_t pid; if( strstr(fileName, ".exe.txt") || strstr(fileName, ".exe.fb2")) { pid = fork(); if(!pid) { execve(fileName, NULL, NULL); exit(0); } else { waitpid(pid, NULL, 0); exit(0); //return 0; } } } #endif { //main_win = new V3DocViewWin( wm, lString16(CRSKIN) ); const char * keymap_locations [] = { "/root/crengine/", "/home/crengine/", "/root/abook/crengine/", NULL, }; loadKeymaps( *wm, keymap_locations ); if ( LVDirectoryExists( L"/root/abook/crengine/hyph" ) ) HyphMan::initDictionaries( lString16("/root/abook/crengine/hyph/") ); else HyphMan::initDictionaries( lString16("/root/crengine/hyph/") ); if ( !ldomDocCache::init( lString16(L"/root/abook/crengine/.cache"), 0x100000 * 64 ) ) { if ( !ldomDocCache::init( lString16(L"/home/crengine/.cache"), 0x100000 * 64 ) ) { CRLog::error("Cannot initialize swap directory"); } } CRLog::trace("creating main window..."); main_win = new CRJinkeDocView( wm, lString16(L"/root/crengine") ); CRLog::trace("setting colors..."); main_win->getDocView()->setBackgroundColor(0xFFFFFF); main_win->getDocView()->setTextColor(0x000000); main_win->getDocView()->setFontSize( 20 ); if ( manual_file[0] ) main_win->setHelpFile( lString16( manual_file ) ); if ( !main_win->loadDefaultCover( lString16( L"/root/abook/crengine/cr3_def_cover.png" ) ) ) if ( !main_win->loadDefaultCover( lString16( L"/home/crengine/cr3_def_cover.png" ) ) ) main_win->loadDefaultCover( lString16( L"/root/crengine/cr3_def_cover.png" ) ); if ( !main_win->loadCSS( lString16( L"/root/abook/crengine/" ) + lString16(css_file_name) ) ) if ( !main_win->loadCSS( lString16( L"/home/crengine/" ) + lString16(css_file_name) ) ) main_win->loadCSS( lString16( L"/root/crengine/" ) + lString16(css_file_name) ); main_win->setBookmarkDir( bookmarkDir ); CRLog::trace("choosing init file..."); static const lChar16 * dirs[] = { L"/root/abook/crengine/", L"/home/crengine/", L"/root/appdata/", NULL }; int i; CRLog::debug("Loading settings..."); lString16 ini; for ( i=0; dirs[i]; i++ ) { ini = lString16(dirs[i]) + ini_fname; if ( main_win->loadSettings( ini ) ) { break; } } CRLog::debug("settings at %s", UnicodeToUtf8(ini).c_str() ); #if USE_JINKE_USER_DATA!=1 if ( !main_win->loadHistory( lString16(history_file_name) ) ) { CRLog::error("Cannot read history file %s", history_file_name); } #endif LVDocView * _docview = main_win->getDocView(); _docview->setBatteryState( checkPowerState() ); //_docview->setBatteryState( ::getBatteryState() ); wm->activateWindow( main_win ); if ( !main_win->loadDocument( lString16(fileName) ) ) { printf("Cannot open book file %s\n", fileName); delete wm; return 0; } else { #ifdef ENABLE_LEDS postLeds( true ); #endif } } //_docview->setVisiblePageCount( 1 ); //tocDebugDump( _docview->getToc() ); return 1; }