bool InitCREngine( const char * exename, lString16Collection & fontDirs ) { CRLog::trace("InitCREngine(%s)", exename); #ifdef _WIN32 lString16 appname( exename ); int lastSlash=-1; lChar16 slashChar = '/'; for ( int p=0; p<(int)appname.length(); p++ ) { if ( appname[p]=='\\' ) { slashChar = '\\'; lastSlash = p; } else if ( appname[p]=='/' ) { slashChar = '/'; lastSlash=p; } } lString16 appPath; if ( lastSlash>=0 ) appPath = appname.substr( 0, lastSlash+1 ); InitCREngineLog(UnicodeToUtf8(appPath).c_str()); lString16 datadir = appPath; #else lString16 datadir = lString16(CR3_DATA_DIR); #endif lString16 fontDir = datadir + L"fonts"; lString8 fontDir8_ = UnicodeToUtf8(fontDir); fontDirs.add( fontDir ); LVAppendPathDelimiter( fontDir ); lString8 fontDir8 = UnicodeToLocal(fontDir); //const char * fontDir8s = fontDir8.c_str(); //InitFontManager( fontDir8 ); InitFontManager( lString8() ); #ifdef _WIN32 lChar16 sysdir[MAX_PATH+1]; GetWindowsDirectoryW(sysdir, MAX_PATH); lString16 fontdir( sysdir ); fontdir << L"\\Fonts\\"; lString8 fontdir8( UnicodeToUtf8(fontdir) ); const char * fontnames[] = { "arial.ttf", "ariali.ttf", "arialb.ttf", "arialbi.ttf", "arialn.ttf", "arialni.ttf", "arialnb.ttf", "arialnbi.ttf", "cour.ttf", "couri.ttf", "courbd.ttf", "courbi.ttf", "times.ttf", "timesi.ttf", "timesb.ttf", "timesbi.ttf", "comic.ttf", "comicbd.ttf", "verdana.ttf", "verdanai.ttf", "verdanab.ttf", "verdanaz.ttf", "bookos.ttf", "bookosi.ttf", "bookosb.ttf", "bookosbi.ttf", "calibri.ttf", "calibrii.ttf", "calibrib.ttf", "calibriz.ttf", "cambria.ttf", "cambriai.ttf", "cambriab.ttf", "cambriaz.ttf", "georgia.ttf", "georgiai.ttf", "georgiab.ttf", "georgiaz.ttf", NULL }; for ( int fi = 0; fontnames[fi]; fi++ ) { fontMan->RegisterFont( fontdir8 + fontnames[fi] ); } #endif // Load font definitions into font manager // fonts are in files font1.lbf, font2.lbf, ... font32.lbf // use fontconfig lString16Collection fontExt; fontExt.add(lString16(L".ttf")); fontExt.add(lString16(L".otf")); fontExt.add(lString16(L".pfa")); fontExt.add(lString16(L".pfb")); lString16Collection fonts; getDirectoryFonts( fontDirs, fontExt, fonts, true ); // load fonts from file CRLog::debug("%d font files found", fonts.length()); //if (!fontMan->GetFontCount()) { for ( unsigned 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"); } } //} // init hyphenation manager //char hyphfn[1024]; //sprintf(hyphfn, "Russian_EnUS_hyphen_(Alan).pdb" ); //if ( !initHyph( (UnicodeToLocal(appPath) + hyphfn).c_str() ) ) { #ifdef _LINUX // initHyph( "/usr/share/crengine/hyph/Russian_EnUS_hyphen_(Alan).pdb" ); #endif //} if (!fontMan->GetFontCount()) { //error #if (USE_FREETYPE==1) printf("Fatal Error: Cannot open font file(s) .ttf \nCannot work without font\n" ); #else printf("Fatal Error: Cannot open font file(s) font#.lbf \nCannot work without font\nUse FontConv utility to generate .lbf fonts from TTF\n" ); #endif return false; } printf("%d fonts loaded.\n", fontMan->GetFontCount()); 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 main(int argc, char** argv) { std::vector<std::string> args; for (int i=1;i<argc;++i) { args.push_back(argv[i]); } bool quiet = std::find(args.begin(), args.end(), "-q")!=args.end(); try { BOOST_TEST(set_working_dir(args)); std::string fontdir("fonts/"); BOOST_TEST( mapnik::util::exists( fontdir ) ); BOOST_TEST( mapnik::util::is_directory( fontdir ) ); std::vector<std::string> face_names; std::string foo("foo"); // fake directories BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo , true ) ); face_names = mapnik::freetype_engine::face_names(); BOOST_TEST( face_names.size() == 0 ); BOOST_TEST( !mapnik::freetype_engine::register_fonts(foo) ); face_names = mapnik::freetype_engine::face_names(); BOOST_TEST( face_names.size() == 0 ); // directories without fonts std::string src("src"); // an empty directory will not return true // we need to register at least one font and not fail on any // to return true BOOST_TEST( mapnik::freetype_engine::register_font(src) == false ); BOOST_TEST( mapnik::freetype_engine::register_fonts(src, true) == false ); BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 ); // bogus, emtpy file that looks like font BOOST_TEST( mapnik::freetype_engine::register_font("tests/data/fonts/fake.ttf") == false ); BOOST_TEST( mapnik::freetype_engine::register_fonts("tests/data/fonts/fake.ttf") == false ); BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 ); BOOST_TEST( mapnik::freetype_engine::register_font("tests/data/fonts/intentionally-broken.ttf") == false ); BOOST_TEST( mapnik::freetype_engine::register_fonts("tests/data/fonts/intentionally-broken.ttf") == false ); BOOST_TEST( mapnik::freetype_engine::face_names().size() == 0 ); // register unifont, since we know it sits in the root fonts/ dir BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir) ); face_names = mapnik::freetype_engine::face_names(); //std::clog << "number of registered fonts: " << face_names.size() << std::endl; BOOST_TEST( face_names.size() > 0 ); BOOST_TEST( face_names.size() == 1 ); // re-register unifont, should not have any affect BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, false) ); face_names = mapnik::freetype_engine::face_names(); //std::clog << "number of registered fonts: " << face_names.size() << std::endl; BOOST_TEST( face_names.size() == 1 ); // register a single dejavu font std::string dejavu_bold_oblique("tests/data/fonts/DejaVuSansMono-BoldOblique.ttf"); BOOST_TEST( mapnik::freetype_engine::register_font(dejavu_bold_oblique) ); face_names = mapnik::freetype_engine::face_names(); //std::clog << "number of registered fonts: " << face_names.size() << std::endl; BOOST_TEST( face_names.size() == 2 ); // recurse to find all dejavu fonts BOOST_TEST( mapnik::freetype_engine::register_fonts(fontdir, true) ); face_names = mapnik::freetype_engine::face_names(); //std::clog << "number of registered fonts: " << face_names.size() << std::endl; BOOST_TEST( face_names.size() == 22 ); } catch (std::exception const & ex) { std::clog << "C++ fonts registration problem: " << ex.what() << "\n"; BOOST_TEST(false); } if (!::boost::detail::test_errors()) { if (quiet) std::clog << "\x1b[1;32m.\x1b[0m"; else std::clog << "C++ fonts registration: \x1b[1;32m✓ \x1b[0m\n"; #if BOOST_VERSION >= 104600 ::boost::detail::report_errors_remind().called_report_errors_function = true; #endif } else { return ::boost::report_errors(); } }