void testFormatting() { // class Tester { public: LFormattedText txt; void addLine( const lChar16 * str, int flags, LVFontRef font ) { lString16 s( str ); txt.AddSourceLine( s.c_str(), /* pointer to unicode text string */ s.length(), /* number of chars in text, 0 for auto(strlen) */ 0x000000, /* text color */ 0xFFFFFF, /* background color */ font.get(), /* font to draw string */ flags, 16, /* interline space, *16 (16=single, 32=double) */ 30, /* first line margin */ NULL, 0 ); } }; LVFontRef font1 = fontMan->GetFont(20, 300, false, css_ff_sans_serif, lString8("Arial") ); LVFontRef font2 = fontMan->GetFont(20, 300, false, css_ff_serif, lString8("Times New Roman") ); Tester t; t.addLine( L"Testing simple paragraph formatting. Just a test. ", LTEXT_ALIGN_WIDTH|LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L"Another fragment of text. ", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L"And the last one written with another font", LTEXT_FLAG_OWNTEXT, font2 ); t.addLine( L"Next paragraph: left-aligned. ", LTEXT_ALIGN_LEFT|LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L"One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L"One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L"Testing simple paragraph formatting. Just a test. ", LTEXT_ALIGN_WIDTH|LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font2 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font2 ); t.addLine( L" Word", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); t.addLine( L" One more sentence. Second sentence.", LTEXT_FLAG_OWNTEXT, font1 ); int N = 100000; int i; time_t start1 = time((time_t*)0); for ( i=0; i<N; i++ ) t.txt.FormatNew( 400, 300 ); time_t end1 = time((time_t*)0); time_t start2 = time((time_t*)0); for ( i=0; i<N; i++ ) t.txt.FormatOld( 400, 300 ); time_t end2 = time((time_t*)0); int t1 = (int)(end1-start1); int t2 = (int)(end2-start2); int delta = (t2-t1) * 100 / t2; CRLog::debug("new formatter performance gain is %d%%", delta); }
lString8 LVDocFormatCssFileName(int fmt) { switch (fmt) { case doc_format_fb2: return lString8("fb2.css"); case doc_format_txt: return lString8("txt.css"); case doc_format_rtf: return lString8("rtf.css"); case doc_format_epub: return lString8("epub.css"); case doc_format_html: return lString8("htm.css"); case doc_format_txt_bookmark: return lString8("txt.css"); case doc_format_chm: return lString8("chm.css"); case doc_format_doc: return lString8("doc.css"); case doc_format_pdb: return lString8("htm.css"); default: return lString8("txt.css"); } }
/// translate string by key, return default value if not found virtual lString16 translateString( const char * key, const char * defValue ) { CRLog::trace("Translate(%s)", key); lString16 res; //static char buf[2048]; const char * res8 = NULL; //v3_callbacks->GetString( (char *)key ); if ( res8 && res8[0] ) { CRLog::trace(" found(%s)", res8); res = Utf8ToUnicode( lString8(res8) ); } else { CRLog::trace(" not found"); res = Utf8ToUnicode( lString8(defValue) ); } return res; }
/* * Class: org_coolreader_crengine_Engine * Method: checkFontLanguageCompatibilityInternal * Signature: (Ljava/lang/String;Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_Engine_checkFontLanguageCompatibilityInternal (JNIEnv *env, jclass cls, jstring fontFace, jstring langCode) { jboolean res = JNI_TRUE; const char* fontFace_ptr = env->GetStringUTFChars(fontFace, 0); const char* langCode_ptr = env->GetStringUTFChars(langCode, 0); if (fontFace_ptr && langCode_ptr) { res = fontMan->checkFontLangCompat(lString8(fontFace_ptr), lString8(langCode_ptr)) ? JNI_TRUE : JNI_FALSE; } if (langCode_ptr) env->ReleaseStringUTFChars(langCode, langCode_ptr); if (fontFace_ptr) env->ReleaseStringUTFChars(fontFace, fontFace_ptr); return res; }
bool InitCREngine( const char * exename, lString16Collection & fontDirs) { CRLog::trace("InitCREngine(%s)", exename); InitFontManager(lString8()); // Load font definitions into font manager // fonts are in files font1.lbf, font2.lbf, ... font32.lbf // use fontconfig lString16 fontExt = L".ttf"; lString16Collection fonts; getDirectoryFonts( fontDirs, fontExt, fonts, true ); // load fonts from file CRLog::debug("%d font files found", fonts.length()); if (!fontMan->GetFontCount()) { for (int fi=0; fi<fonts.length(); fi++ ) { lString8 fn = UnicodeToLocal(fonts[fi]); CRLog::trace("loading font: %s", fn.c_str()); if ( !fontMan->RegisterFont(fn) ) CRLog::trace(" failed\n"); } } if (!fontMan->GetFontCount()) { printf("Fatal Error: Cannot open font file(s) .ttf \nCannot work without font\n" ); return false; } printf("%d fonts loaded.\n", fontMan->GetFontCount()); return true; }
/* * Class: org_coolreader_crengine_Engine * Method: isLink * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_coolreader_crengine_Engine_isLink (JNIEnv * env, jclass obj, jstring pathname) { //CRLog::trace("isLink : enter"); if (!pathname) return NULL; //CRLog::trace("isLink : pathname is not null"); int res = JNI_FALSE; jboolean iscopy; const char * s = env->GetStringUTFChars(pathname, &iscopy); //CRLog::trace("isLink : read utf from pathname"); struct stat st; lString8 path; if ( !lstat( s, &st) ) { if ( S_ISLNK(st.st_mode) ) { char buf[2048]; int len = readlink(s, buf, sizeof(buf) - 1); if (len != -1) { buf[len] = 0; path = lString8(buf); } } } //CRLog::trace("isLink : releasing utf pathname"); env->ReleaseStringUTFChars(pathname, s); //CRLog::trace("isLink : returning"); return !path.empty() ? (jstring)env->NewGlobalRef(env->NewStringUTF(path.c_str())) : NULL; }
static int registerFont(lua_State *L) { const char *fontfile = luaL_checkstring(L, 1); if ( !fontMan->RegisterFont(lString8(fontfile)) ) { return luaL_error(L, "cannot register font <%s>", fontfile); } return 0; }
/* * Class: org_coolreader_crengine_Engine * Method: initInternal * Signature: ([Ljava/lang/String;)Z */ JNIEXPORT jboolean JNICALL Java_org_coolreader_crengine_Engine_initInternal (JNIEnv * penv, jobject obj, jobjectArray fontArray) { CRJNIEnv env(penv); LOGI("initInternal called"); // set fatal error handler crSetFatalErrorHandler( &cr3androidFatalErrorHandler ); LOGD("Redirecting CDRLog to Android"); CRLog::setLogger( new JNICDRLogger() ); CRLog::setLogLevel( CRLog::LL_TRACE ); CRLog::info("CREngine log redirected"); CRLog::info("CRENGINE version %s %s", CR_ENGINE_VERSION, CR_ENGINE_BUILD_DATE); CRLog::info("initializing hyphenation manager"); HyphMan::initDictionaries(lString16()); //don't look for dictionaries HyphMan::activateDictionary(lString16(HYPH_DICT_ID_NONE)); CRLog::info("creating font manager"); InitFontManager(lString8()); CRLog::debug("converting fonts array: %d items", (int)env->GetArrayLength(fontArray)); lString16Collection fonts; env.fromJavaStringArray(fontArray, fonts); int len = fonts.length(); CRLog::debug("registering fonts: %d fonts in list", len); for ( int i=0; i<len; i++ ) { lString8 fontName = UnicodeToUtf8(fonts[i]); CRLog::debug("registering font %s", fontName.c_str()); if ( !fontMan->RegisterFont( fontName ) ) CRLog::error("cannot load font %s", fontName.c_str()); } CRLog::info("%d fonts registered", (int)fontMan->GetFontCount()); return fontMan->GetFontCount() ? JNI_TRUE : JNI_FALSE; }
bool DetectEpubFormat( LVStreamRef stream ) { LVContainerRef m_arc = LVOpenArchieve( stream ); if ( m_arc.isNull() ) return false; // not a ZIP archive //dumpZip( m_arc ); // read "mimetype" file contents from root of archive lString16 mimeType; { LVStreamRef mtStream = m_arc->OpenStream(L"mimetype", LVOM_READ ); if ( !mtStream.isNull() ) { int size = mtStream->GetSize(); if ( size>4 && size<100 ) { LVArray<char> buf( size+1, '\0' ); if ( mtStream->Read( buf.get(), size, NULL )==LVERR_OK ) { for ( int i=0; i<size; i++ ) if ( buf[i]<32 || ((unsigned char)buf[i])>127 ) buf[i] = 0; buf[size] = 0; if ( buf[0] ) mimeType = Utf8ToUnicode( lString8( buf.get() ) ); } } } } if ( mimeType != L"application/epub+zip" ) return false; return true; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { wchar_t buf0[MAX_PATH]; GetModuleFileNameW(NULL, buf0, MAX_PATH-1); lString16 str016(buf0); #ifdef _UNICODE lString16 str116(lpCmdLine); #else lString8 str18(lpCmdLine); lString16 str116 = LocalToUnicode(str18); #endif lString8 str0 = UnicodeToUtf8(str016); lString8 str1 = UnicodeToUtf8(str116); if ( !str1.empty() && str1[0]=='\"' ) { // quoted filename support str1.erase(0, 1); int pos = str1.pos(lString8("\"")); if ( pos>=0 ) str1 = str1.substr(0, pos); } char * argv[2]; argv[0] = str0.modify(); argv[1] = str1.modify(); int argc = str1.empty() ? 1 : 2; return main(argc, argv); }
static int setHeaderFont(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); const char *face = luaL_checkstring(L, 2); doc->text_view->setStatusFontFace(lString8(face)); return 0; }
static int setFontFace(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); const char *face = luaL_checkstring(L, 2); doc->text_view->setDefaultFontFace(lString8(face)); //fontMan->SetFallbackFontFace(lString8(face)); return 0; }
QString FilePropsDialog::getDocText( const char * path, const char * delim ) { ldomDocument * doc = _docview->getDocument(); lString16 res; for ( int i=0; i<100; i++ ) { lString8 p = lString8(path) + "[" + lString8::itoa(i+1) + "]"; lString16 p16 = Utf8ToUnicode(p); ldomXPointer ptr = doc->createXPointer( p16 ); if ( ptr.isNull() ) break; lString16 s = ptr.getText( L' ' ); if ( s.empty() ) continue; if ( !res.empty() && delim!=NULL ) res << Utf8ToUnicode( lString8( delim ) ); res << s; } return cr2qt(res); }
lString16 getDocAuthors( ldomDocument * doc, const char * path, const char * delim ) { lString16 res; for ( int i=0; i<100; i++ ) { lString8 p = lString8(path) + "[" + lString8::itoa(i+1) + "]"; //CRLog::trace("checking doc path %s", p.c_str() ); lString16 firstName = getDocText( doc, (p + "/first-name").c_str(), " " ); lString16 lastName = getDocText( doc, (p + "/last-name").c_str(), " " ); lString16 middleName = getDocText( doc, (p + "/middle-name").c_str(), " " ); lString16 nickName = getDocText( doc, (p + "/nickname").c_str(), " " ); lString16 homePage = getDocText( doc, (p + "/homepage").c_str(), " " ); lString16 email = getDocText( doc, (p + "/email").c_str(), " " ); lString16 s = firstName; if ( !middleName.empty() ) s << L" " << middleName; if ( !lastName.empty() ) { if ( !s.empty() ) s << L" "; s << lastName; } if ( !nickName.empty() ) { if ( !s.empty() ) s << L" "; s << nickName; } if ( !homePage.empty() ) { if ( !s.empty() ) s << L" "; s << homePage; } if ( !email.empty() ) { if ( !s.empty() ) s << L" "; s << email; } if ( s.empty() ) continue; if ( !res.empty() && delim!=NULL ) res << Utf8ToUnicode( lString8( delim ) ); res << s; } return res; }
lString16 getDocText( ldomDocument * doc, const char * path, const char * delim ) { lString16 res; for ( int i=0; i<100; i++ ) { lString8 p = lString8(path) + "[" + lString8::itoa(i+1) + "]"; //CRLog::trace("checking doc path %s", p.c_str() ); lString16 p16 = Utf8ToUnicode(p); ldomXPointer ptr = doc->createXPointer( p16 ); if ( ptr.isNull() ) break; lString16 s = ptr.getText( L' ' ); if ( s.empty() ) continue; if ( !res.empty() && delim!=NULL ) res << Utf8ToUnicode( lString8( delim ) ); res << s; } return res; }
QString FilePropsDialog::getDocAuthors( const char * path, const char * delim ) { lString16 res; for ( int i=0; i<100; i++ ) { lString8 p = lString8(path) + "[" + lString8::itoa(i+1) + "]"; lString16 firstName = qt2cr(getDocText( (p + "/first-name").c_str(), " " )); lString16 lastName = qt2cr(getDocText( (p + "/last-name").c_str(), " " )); lString16 middleName = qt2cr(getDocText( (p + "/middle-name").c_str(), " " )); lString16 nickName = qt2cr(getDocText( (p + "/nickname").c_str(), " " )); lString16 homePage = qt2cr(getDocText( (p + "/homepage").c_str(), " " )); lString16 email = qt2cr(getDocText( (p + "/email").c_str(), " " )); lString16 s = firstName; if ( !middleName.empty() ) s << L" " << middleName; if ( !lastName.empty() ) { if ( !s.empty() ) s << L" "; s << lastName; } if ( !nickName.empty() ) { if ( !s.empty() ) s << L" "; s << nickName; } if ( !homePage.empty() ) { if ( !s.empty() ) s << L" "; s << homePage; } if ( !email.empty() ) { if ( !s.empty() ) s << L" "; s << email; } if ( s.empty() ) continue; if ( !res.empty() && delim!=NULL ) res << Utf8ToUnicode( lString8( delim ) ); res << s; } return cr2qt(res); }
virtual void draw() { BackgroundFitWindow::draw(); CRRectSkinRef skin = _wm->getSkin()->getWindowSkin( L"#dialog" )->getClientSkin(); LVDrawBuf * buf = _wm->getScreen()->getCanvas().get(); skin->draw( *buf, _rect ); lvRect borders = skin->getBorderWidths(); #ifdef CR_POCKETBOOK lString16 prompt; switch (_selectedIndex) { case 0: prompt = lString16(_("Select next/prev paragraph")); break; case 1: prompt = lString16(_("Select one more paragraph")); break; case 2: prompt = lString16(_("Deselect paragraph")); break; case 3: prompt = lString16(_("Select one more phrase")); break; case 4: prompt = lString16(_("Deselect phrase")); break; } lvRect keyRect = _rect; int promptWidth = skin->measureText(prompt).x; keyRect.right = keyRect.left + promptWidth + borders.left + borders.right; if ( !keyRect.isEmpty() ) { skin->draw( *_wm->getScreen()->getCanvas(), keyRect ); skin->drawText( *_wm->getScreen()->getCanvas(), keyRect, prompt ); } CRToolBarSkinRef tbSkin = _wm->getSkin()->getToolBarSkin( L"#cite-toolbar" ); if (!tbSkin.isNull()) { keyRect.left += (borders.right + _wm->getScreen()->getWidth() * 2/3/*promptWidth*/); keyRect.right = _rect.right; CRButtonListRef buttons = tbSkin->getButtons(); if (!(buttons.isNull() || _itemsCount != buttons->length())) tbSkin->drawToolBar(*_wm->getScreen()->getCanvas(), keyRect, true, _selectedIndex); } #else lString16 prompt(_("Select text")); buf->FillRect( _rect, 0xAAAAAA ); lvRect keyRect = _rect; LVFontRef font = fontMan->GetFont( 20, 600, false, css_ff_sans_serif, lString8("Arial")); //skin->getFont(); // int margin = 4; keyRect.right = _rect.right; if ( !keyRect.isEmpty() ) { skin->draw( *_wm->getScreen()->getCanvas(), keyRect ); skin->drawText( *_wm->getScreen()->getCanvas(), keyRect, prompt ); } #endif }
lString16 CRFileHistRecord::getLastTimeString( bool longFormat ) { time_t t = getLastTime(); tm * bt = localtime(&t); char str[20]; if ( !longFormat ) sprintf(str, "%02d.%02d.%04d", bt->tm_mday, 1+bt->tm_mon, 1900+bt->tm_year ); else sprintf(str, "%02d.%02d.%04d %02d:%02d", bt->tm_mday, 1+bt->tm_mon, 1900+bt->tm_year, bt->tm_hour, bt->tm_min); return Utf8ToUnicode( lString8( str ) ); }
/// returns current time representation string static lString16 getDateTimeString( time_t t ) { tm * bt = localtime(&t); char str[32]; #ifdef _LINUX snprintf(str, 32, #else sprintf(str, #endif "%04d/%02d/%02d %02d:%02d", bt->tm_year+1900, bt->tm_mon+1, bt->tm_mday, bt->tm_hour, bt->tm_min); str[31] = 0; return Utf8ToUnicode( lString8( str ) ); }
static int setStyleSheet(lua_State *L) { CreDocument *doc = (CreDocument*) luaL_checkudata(L, 1, "credocument"); const char* style_sheet = luaL_checkstring(L, 2); lString8 css; if (LVLoadStylesheetFile(lString16(style_sheet), css)){ doc->text_view->setStyleSheet(css); } else { doc->text_view->setStyleSheet(lString8()); } return 0; }
ReaderViewNative::ReaderViewNative() { _docview = new LVDocView(16); //16bpp LVRefVec<LVImageSource> icons = getBatteryIcons( 0x000000 ); _docview->setBatteryIcons( icons ); LVArray<int> sizes( cr_font_sizes, sizeof(cr_font_sizes)/sizeof(int) ); _docview->setShowCover( true ); _docview->setFontSizes( sizes, true ); _docview->setFontSize(24); _docview->setBatteryFont( fontMan->GetFont( 16, 600, false, css_ff_sans_serif, lString8("Droid Sans") )); _docview->createDefaultDocument(lString16("Welcome to CoolReader"), lString16("Please select file to open")); }
int luaopen_cre(lua_State *L) { luaL_newmetatable(L, "credocument"); lua_pushstring(L, "__index"); lua_pushvalue(L, -2); lua_settable(L, -3); luaL_register(L, NULL, credocument_meth); lua_pop(L, 1); luaL_register(L, "cre", cre_func); /* initialize font manager for CREngine */ InitFontManager(lString8()); #if DEBUG_CRENGINE CRLog::setStdoutLogger(); CRLog::setLogLevel(CRLog::LL_TRACE); #endif return 1; }
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; }
static css_decl_code parse_property_name( const char * & res ) { const char * str = res; for (int i=1; css_decl_name[i]; i++) { if (substr_compare( css_decl_name[i], str )) { // found! skip_spaces(str); if ( substr_compare( ":", str )) { #ifdef DUMP_CSS_PARSING CRLog::trace("property name: %s", lString8(res, str-res).c_str() ); #endif skip_spaces(str); res = str; return (css_decl_code)i; } } } return cssd_unknown; }
void V3DocViewWin::showAboutDialog() { _docview->savePosition(); CRFileHistRecord * hist = _docview->getCurrentFileHistRecord(); lString16 title = L"Cool Reader "; #ifndef PACKAGE_VERSION #define PACKAGE_VERSION CR_ENGINE_VERSION #endif title << Utf8ToUnicode(lString8(PACKAGE_VERSION)); lString8 txt; //========================================================= txt << "<table><col width=\"30%\"/><col width=\"70%\"/>\n"; CRPropRef props = _docview->getDocProps(); lString8 statusInfo; addPropLine( statusInfo, _("Current page"), lString16::itoa(_docview->getCurPage()+1) ); addPropLine( statusInfo, _("Total pages"), lString16::itoa(_docview->getPageCount()) ); addPropLine( statusInfo, _("Battery state"), _docview->getBatteryState()==-1 ? lString16(_("charging...")) : lString16::itoa(_docview->getBatteryState()) + L"%" ); addPropLine( statusInfo, _("Current Time"), _docview->getTimeString() ); // TODO: if ( hist ) { CRBookmark * lastpos = hist->getLastPos(); if ( lastpos ) { addPropLine( statusInfo, _("Current chapter"), lastpos->getTitleText() ); } } addInfoSection( txt, statusInfo, _("Status") ); lString8 fileInfo; addPropLine( fileInfo, _("Archive name"), props->getStringDef(DOC_PROP_ARC_NAME) ); addPropLine( fileInfo, _("Archive path"), props->getStringDef(DOC_PROP_ARC_PATH) ); addPropLine( fileInfo, _("Archive size"), props->getStringDef(DOC_PROP_ARC_SIZE) ); addPropLine( fileInfo, _("File name"), props->getStringDef(DOC_PROP_FILE_NAME) ); addPropLine( fileInfo, _("File path"), props->getStringDef(DOC_PROP_FILE_PATH) ); addPropLine( fileInfo, _("File size"), props->getStringDef(DOC_PROP_FILE_SIZE) ); addPropLine( fileInfo, _("File format"), props->getStringDef(DOC_PROP_FILE_FORMAT) ); addInfoSection( txt, fileInfo, _("File info") ); lString8 bookInfo; addPropLine( bookInfo, _("Title"), props->getStringDef(DOC_PROP_TITLE) ); addPropLine( bookInfo, _("Author(s)"), props->getStringDef(DOC_PROP_AUTHORS) ); addPropLine( bookInfo, _("Series name"), props->getStringDef(DOC_PROP_SERIES_NAME) ); addPropLine( bookInfo, _("Series number"), props->getStringDef(DOC_PROP_SERIES_NUMBER) ); addPropLine( bookInfo, _("Date"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/date", ", " ) ); addPropLine( bookInfo, _("Genres"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/genre", ", " ) ); addPropLine( bookInfo, _("Translator"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/translator", ", " ) ); addInfoSection( txt, bookInfo, _("Book info") ); lString8 docInfo; addPropLine( docInfo, _("Document author"), getDocAuthors( getDocView()->getDocument(), "/FictionBook/description/document-info/author", " " ) ); addPropLine( docInfo, _("Document date"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/date", " " ) ); addPropLine( docInfo, _("Document source URL"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/src-url", " " ) ); addPropLine( docInfo, _("OCR by"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/src-ocr", " " ) ); addPropLine( docInfo, _("Document version"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/version", " " ) ); addPropLine( docInfo, _("Change history"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/history", " " ) ); addInfoSection( txt, docInfo, _("Document info") ); lString8 pubInfo; addPropLine( pubInfo, _("Publication name"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/book-name", " " ) ); addPropLine( pubInfo, _("Publisher"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/publisher", " " ) ); addPropLine( pubInfo, _("Publisher city"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/city", " " ) ); addPropLine( pubInfo, _("Publication year"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/year", " " ) ); addPropLine( pubInfo, _("ISBN"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/isbn", " " ) ); addInfoSection( txt, pubInfo, _("Publication info") ); addPropLine( txt, _("Custom info"), getDocText( getDocView()->getDocument(), "/FictionBook/description/custom-info", " " ) ); txt << "</table>\n"; //CRLog::trace(txt.c_str()); //========================================================= txt = CRViewDialog::makeFb2Xml(txt); CRViewDialog * dlg = new CRViewDialog( _wm, title, txt, lvRect(), true, true ); dlg->getDocView()->setVisiblePageCount(1); //int fs = _props->getIntDef( PROP_FILE_PROPS_FONT_SIZE, 26 ); //dlg->getDocView()->setFontSize(fs); _wm->activateWindow( dlg ); }
static bool GetBookProperties(const char *name, BookProperties * pBookProps) { CRLog::trace("GetBookProperties( %s )", name); // check archieve lString16 arcPathName; lString16 arcItemPathName; bool isArchiveFile = LVSplitArcName( lString16(name), arcPathName, arcItemPathName ); // open stream LVStreamRef stream = LVOpenFileStream( (isArchiveFile ? arcPathName : Utf8ToUnicode(lString8(name))).c_str() , LVOM_READ); if (!stream) { CRLog::error("cannot open file %s", name); return false; } if ( DetectEpubFormat( stream ) ) { CRLog::trace("GetBookProperties() : epub format detected"); return GetEPUBBookProperties( name, stream, pBookProps ); } time_t t = (time_t)time(0); if ( isArchiveFile ) { int arcsize = (int)stream->GetSize(); LVContainerRef container = LVOpenArchieve(stream); if ( container.isNull() ) { CRLog::error( "Cannot read archive contents from %s", LCSTR(arcPathName) ); return false; } stream = container->OpenStream(arcItemPathName.c_str(), LVOM_READ); if ( stream.isNull() ) { CRLog::error( "Cannot open archive file item stream %s", LCSTR(lString16(name)) ); return false; } } struct stat fs; if ( !stat( name, &fs ) ) { t = fs.st_mtime; } // read document #if COMPACT_DOM==1 ldomDocument doc(stream, 0); #else ldomDocument doc; #endif ldomDocumentWriter writer(&doc, true); doc.setNodeTypes( fb2_elem_table ); doc.setAttributeTypes( fb2_attr_table ); doc.setNameSpaceTypes( fb2_ns_table ); LVXMLParser parser( stream, &writer ); CRLog::trace( "checking format..." ); if ( !parser.CheckFormat() ) { return false; } CRLog::trace( "parsing..." ); if ( !parser.Parse() ) { return false; } CRLog::trace( "parsed" ); #if 0 char ofname[512]; sprintf(ofname, "%s.xml", name); CRLog::trace(" writing to file %s", ofname); LVStreamRef out = LVOpenFileStream(ofname, LVOM_WRITE); doc.saveToStream(out, "utf16"); #endif lString16 authors = extractDocAuthors( &doc, lString16("|"), false ); lString16 title = extractDocTitle( &doc ); lString16 language = extractDocLanguage( &doc ).lowercase(); lString16 series = extractDocSeries( &doc, &pBookProps->seriesNumber ); #if SERIES_IN_AUTHORS==1 if ( !series.empty() ) authors << " " << series; #endif pBookProps->title = title; pBookProps->author = authors; pBookProps->series = series; pBookProps->filesize = (long)stream->GetSize(); pBookProps->filename = lString16(name); pBookProps->filedate = getDateTimeString( t ); pBookProps->language = language; return true; }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { CRLog::setFileLogger( "crengine.log", true ); CRLog::setLogLevel( CRLog::LL_TRACE ); //InitCREngineLog("/root/abook/crengine/crlog.ini"); #if 0 MMapTest(); #endif lString8 exe_dir; char exe_fn[MAX_PATH+1]; GetModuleFileNameA( NULL, exe_fn, MAX_PATH ); lChar16 exe_fn16[MAX_PATH+1]; GetModuleFileNameW( NULL, exe_fn16, MAX_PATH ); lString16 exedir = LVExtractPath(lString16(exe_fn16)); lString8 exedir8 = UnicodeToUtf8( exedir ); CRLog::debug("exedir=%s", exedir8.c_str()); CRMoFileTranslator * translator = new CRMoFileTranslator(); translator->openMoFile(exedir + L"/po/ru.mo"); CRI18NTranslator::setTranslator( translator ); lChar16 sysdir[MAX_PATH+1]; GetWindowsDirectoryW(sysdir, MAX_PATH); lString16 fontdir( sysdir ); fontdir << L"\\Fonts\\"; lString8 fontdir8( UnicodeToUtf8(fontdir) ); lString8 fd = UnicodeToLocal(exedir); lString16Collection fontDirs; //fontDirs.add( fontdir ); fontDirs.add( exedir + L"fonts" ); InitCREngine( exe_fn, fontDirs ); const char * fontnames[] = { #if 1 "arial.ttf", "ariali.ttf", "arialb.ttf", "arialbi.ttf", #endif "arialn.ttf", "arialni.ttf", "arialnb.ttf", "arialnbi.ttf", "cour.ttf", "couri.ttf", "courbd.ttf", "courbi.ttf", "times.ttf", "timesi.ttf", "timesb.ttf", "timesbi.ttf", #if 0 "comic.ttf", "comicbd.ttf", "verdana.ttf", "verdanai.ttf", "verdanab.ttf", "verdanaz.ttf", "bookos.ttf", "bookosi.ttf", "bookosb.ttf", "bookosbi.ttf", #endif #if 0 "calibri.ttf", "calibrii.ttf", "calibrib.ttf", "calibriz.ttf", "cambria.ttf", "cambriai.ttf", "cambriab.ttf", "cambriaz.ttf", "georgia.ttf", "georgiai.ttf", "georgiab.ttf", "georgiaz.ttf", #endif NULL }; for ( int fi = 0; fontnames[fi]; fi++ ) { fontMan->RegisterFont( fontdir8 + fontnames[fi] ); } //LVCHECKPOINT("WinMain start"); if (!fontMan->GetFontCount()) { //error char str[1000]; #if (USE_FREETYPE==1) sprintf(str, "Cannot open font file(s) fonts/*.ttf \nCannot work without font\nPlace some TTF files to font\\ directory" ); #else sprintf(str, "Cannot open font file(s) font#.lbf \nCannot work without font\nUse FontConv utility to generate .lbf fonts from TTF" ); #endif MessageBoxA( NULL, str, "CR Engine :: Fb2Test -- fatal error!", MB_OK); return 1; } lString8 cmdline(lpCmdLine); if ( cmdline.empty() ) return 2; // need filename hInst = hInstance; MyRegisterClass(hInstance); { CRWin32WindowManager winman(500, 700); const char * keymap_locations [] = { exedir8.c_str(), NULL, }; loadKeymaps( winman, keymap_locations ); ldomDocCache::init( exedir + L"cache", 0x100000 * 96 ); /*96Mb*/ winman.loadSkin( LVExtractPath(LocalToUnicode(lString8(exe_fn))) + L"skin" ); V3DocViewWin * main_win = new V3DocViewWin( &winman, LVExtractPath(LocalToUnicode(lString8(exe_fn))) ); main_win->getDocView()->setBackgroundColor(0xFFFFFF); main_win->getDocView()->setTextColor(0x000000); main_win->getDocView()->setFontSize( 20 ); main_win->loadCSS( exedir + L"fb2.css" ); main_win->loadSettings( exedir + L"cr3.ini" ); main_win->saveSettings(lString16()); main_win->setHelpFile( exedir + L"cr3-manual-ru.fb2" ); HyphMan::initDictionaries( exedir + L"hyph\\" ); main_win->loadDefaultCover( exedir + L"cr3_def_cover.png" ); main_win->setBookmarkDir(lString16("c:\\cr3\\bookmarks\\")); lString8 exedir8 = UnicodeToUtf8( exedir ); const char * dirs[] = { exedir8.c_str(), NULL }; loadKeymaps( winman, dirs ); main_win->loadHistory( exedir + L"cr3hist.bmk" ); winman.activateWindow( main_win ); if ( !main_win->loadDocument( LocalToUnicode( cmdline )) ) { char str[100]; sprintf(str, "Cannot open document file %s", cmdline.c_str()); MessageBoxA( NULL, str, "CR Engine :: Fb2Test -- fatal error!", MB_OK); return 1; } else { winman.runEventLoop(); } } //ShutdownFontManager(); return 0; }
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; }
int main(int argc, char *argv[]) { int res = 0; { Device::instance(); // initialize device #ifndef i386 QProcess::execute("eips -c"); pTouch = new TouchScreen(); #endif lString16 exedir = LVExtractPath(LocalToUnicode(lString8(argv[0]))); LVAppendPathDelimiter(exedir); lString16 datadir = exedir + "data/"; lString16 exefontpath = exedir + "fonts"; lString16Collection fontDirs; fontDirs.add(exefontpath); #ifndef i386 fontDirs.add("/usr/java/lib/fonts"); fontDirs.add("/mnt/us/fonts"); #endif CRPropRef props = LVCreatePropsContainer(); { LVStreamRef cfg = LVOpenFileStream(UnicodeToUtf8(datadir + "cr3.ini").data(), LVOM_READ); if(!cfg.isNull()) props->loadFromStream(cfg.get()); } lString16 lang = props->getStringDef(PROP_WINDOW_LANG, ""); InitCREngineLog(props); CRLog::info("main()"); if(!InitCREngine(argv[0], fontDirs)) { printf("Cannot init CREngine - exiting\n"); return 2; } #ifndef i386 PrintString(1, 1, "crengine version: " + QString(CR_ENGINE_VERSION)); PrintString(1, 2, QString("build date: %1 %2").arg(__DATE__).arg(__TIME__)); if (!Device::isTouch()) { QString message = "Please wait while application is loading..."; int xpos = ((Device::getWidth()/12-1)-message.length())/2; int ypos = (Device::getHeight()/20-2)/2; PrintString(xpos, ypos, message); } #endif // to catch crashes and remove current cache file on crash (SIGSEGV etc.) crSetSignalHandler(); // set row count depending on device model (used in lists) int rc = props->getIntDef(PROP_WINDOW_ROW_COUNT, 0); if(!rc) { #ifndef i386 switch(Device::getModel()) { case Device::KDX: rc = 20; break; case Device::KT: case Device::KPW: rc = 8; break; default: rc = 10; } props->setInt(PROP_WINDOW_ROW_COUNT, rc); #else props->setInt(PROP_WINDOW_ROW_COUNT, 10); #endif LVStreamRef cfg = LVOpenFileStream(UnicodeToUtf8(datadir + "cr3.ini").data(), LVOM_WRITE); props->saveToStream(cfg.get()); } QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); MyApplication a(argc, argv); pMyApp = &a; // set app stylesheet #ifndef i386 QString style = Device::isTouch() ? "stylesheet_pw.qss" : "stylesheet_k3.qss"; QFile qss(QDir::toNativeSeparators(cr2qt(datadir)) + style); // set up full update interval for the graphics driver Device::setFullScreenUpdateEvery(props->getIntDef(PROP_DISPLAY_FULL_UPDATE_INTERVAL, 1)); #else QFile qss(QDir::toNativeSeparators(cr2qt(datadir)) + "stylesheet_k3.qss"); #endif qss.open(QFile::ReadOnly); if(qss.error() == QFile::NoError) { a.setStyleSheet(qss.readAll()); qss.close(); } QMap<QString, QString> langToCode; langToCode["Russian"] = "ru"; langToCode["French"] = "fr"; langToCode["Hungarian"] = "hu"; langToCode["Italian"] = "it"; langToCode["German"] = "de"; langToCode["Ukrainian"] = "uk"; QString translations = cr2qt(datadir) + "i18n"; QTranslator myappTranslator, qtr; if (!lang.empty() && lang.compare("English")) { QString lng = cr2qt(lang); if (myappTranslator.load(lng, translations)) { // default translator for Qt standard dialogs if (qtr.load("qt_" + langToCode[lng], translations)) { QApplication::installTranslator(&qtr); } else { qDebug() << "Failed to load Qt translation for " << lng; } // load after default to allow overriding translations QApplication::installTranslator(&myappTranslator); } else { qDebug() << "Can`t load translation file " << lng << " from dir " << translations; } } (void) signal(SIGUSR1, sigCatcher); MainWindow mainWin; a.setMainWindow(&mainWin); mainWin.showFullScreen(); mainWin.doStartupActions(); res = a.exec(); } ShutdownCREngine(); return res; }
const lString8 CRI18NTranslator::translate8( const char * src ) { return lString8( translate( src ) ); }