From 6f62d53b7650311afc490bfdaa48f5e8536b8b4e Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 23 Sep 2015 15:31:44 -0700 Subject: Merge to XFA: Allow external font-path configuration from pdfium_test. TBR=tsepez@chromium.org Review URL: https://codereview.chromium.org/1268323004 . (cherry picked from commit 9311163b564785a3a3ccdcb09bd3b7d0b2976d1a) Review URL: https://codereview.chromium.org/1368513002 . --- core/include/fxge/fx_font.h | 2 +- core/include/fxge/fx_ge.h | 5 +++-- core/src/fxge/apple/fx_mac_imp.cpp | 4 ++-- core/src/fxge/ge/fx_ge.cpp | 10 ++++------ core/src/fxge/ge/fx_ge_fontmap.cpp | 2 +- core/src/fxge/ge/fx_ge_linux.cpp | 22 +++++++++++++--------- core/src/fxge/win32/fx_win32_device.cpp | 4 ++-- fpdfsdk/src/fpdf_sysfontinfo.cpp | 2 +- fpdfsdk/src/fpdfview.cpp | 7 ++++++- fpdfsdk/src/fpdfview_c_api_test.c | 1 + public/fpdfview.h | 26 +++++++++++++++++++++++++- samples/pdfium_test.cc | 25 ++++++++++++++++++++++--- 12 files changed, 81 insertions(+), 29 deletions(-) diff --git a/core/include/fxge/fx_font.h b/core/include/fxge/fx_font.h index 2d19db614f..3484196187 100644 --- a/core/include/fxge/fx_font.h +++ b/core/include/fxge/fx_font.h @@ -349,7 +349,7 @@ class CFX_FontMapper { class IFX_SystemFontInfo { public: - static IFX_SystemFontInfo* CreateDefault(); + static IFX_SystemFontInfo* CreateDefault(const char** pUserPaths); virtual void Release() = 0; virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) = 0; diff --git a/core/include/fxge/fx_ge.h b/core/include/fxge/fx_ge.h index 23be3648d1..4cfe622007 100644 --- a/core/include/fxge/fx_ge.h +++ b/core/include/fxge/fx_ge.h @@ -19,7 +19,7 @@ class CCodec_ModuleMgr; class CFX_GEModule { public: - static void Create(); + static void Create(const char** pUserFontPaths); static void Use(CFX_GEModule* pMgr); @@ -41,7 +41,7 @@ class CFX_GEModule { void* GetPlatformData() { return m_pPlatformData; } protected: - CFX_GEModule(); + explicit CFX_GEModule(const char** pUserFontPaths); ~CFX_GEModule(); void InitPlatform(); @@ -53,6 +53,7 @@ class CFX_GEModule { CFX_FontMgr* m_pFontMgr; CCodec_ModuleMgr* m_pCodecModule; void* m_pPlatformData; + const char** m_pUserFontPaths; }; typedef struct { FX_FLOAT m_PointX; diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp index 88a51bd78c..07e3d02c4c 100644 --- a/core/src/fxge/apple/fx_mac_imp.cpp +++ b/core/src/fxge/apple/fx_mac_imp.cpp @@ -94,7 +94,7 @@ void* CFX_MacFontInfo::MapFont(int weight, return NULL; } -IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { +IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { CFX_MacFontInfo* pInfo = new CFX_MacFontInfo; if (!pInfo) { return NULL; @@ -106,7 +106,7 @@ IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { } void CFX_GEModule::InitPlatform() { m_pPlatformData = new CApplePlatform; - m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault()); + m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); } void CFX_GEModule::DestroyPlatform() { delete (CApplePlatform*)m_pPlatformData; diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp index 607c9ee559..6dfed8837c 100644 --- a/core/src/fxge/ge/fx_ge.cpp +++ b/core/src/fxge/ge/fx_ge.cpp @@ -7,12 +7,13 @@ #include "../../../include/fxge/fx_ge.h" #include "text_int.h" static CFX_GEModule* g_pGEModule = NULL; -CFX_GEModule::CFX_GEModule() { +CFX_GEModule::CFX_GEModule(const char** pUserFontPaths) { m_pFontCache = NULL; m_pFontMgr = NULL; m_FTLibrary = NULL; m_pCodecModule = NULL; m_pPlatformData = NULL; + m_pUserFontPaths = pUserFontPaths; } CFX_GEModule::~CFX_GEModule() { delete m_pFontCache; @@ -24,11 +25,8 @@ CFX_GEModule::~CFX_GEModule() { CFX_GEModule* CFX_GEModule::Get() { return g_pGEModule; } -void CFX_GEModule::Create() { - g_pGEModule = new CFX_GEModule; - if (!g_pGEModule) { - return; - } +void CFX_GEModule::Create(const char** userFontPaths) { + g_pGEModule = new CFX_GEModule(userFontPaths); g_pGEModule->m_pFontMgr = new CFX_FontMgr; g_pGEModule->InitPlatform(); g_pGEModule->SetTextGamma(2.2f); diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp index 63d8181656..e1f25684ad 100644 --- a/core/src/fxge/ge/fx_ge_fontmap.cpp +++ b/core/src/fxge/ge/fx_ge_fontmap.cpp @@ -1343,7 +1343,7 @@ CFontFileFaceInfo::~CFontFileFaceInfo() { m_Face = NULL; } #if _FX_OS_ == _FX_ANDROID_ -IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { +IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { return NULL; } #endif diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp index 4e713dc412..065fd124bb 100644 --- a/core/src/fxge/ge/fx_ge_linux.cpp +++ b/core/src/fxge/ge/fx_ge_linux.cpp @@ -34,7 +34,7 @@ class CFX_LinuxFontInfo : public CFX_FolderFontInfo { int pitch_family, const FX_CHAR* family, int& iExact) override; - FX_BOOL ParseFontCfg(); + FX_BOOL ParseFontCfg(const char** pUserPaths); void* FindFont(int weight, FX_BOOL bItalic, int charset, @@ -226,12 +226,9 @@ void* CFX_LinuxFontInfo::FindFont(int weight, } return pFind; } -IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { +IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) { CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo; - if (!pInfo) { - return NULL; - } - if (!pInfo->ParseFontCfg()) { + if (!pInfo->ParseFontCfg(pUserPaths)) { pInfo->AddPath("/usr/share/fonts"); pInfo->AddPath("/usr/share/X11/fonts/Type1"); pInfo->AddPath("/usr/share/X11/fonts/TTF"); @@ -239,11 +236,18 @@ IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { } return pInfo; } -FX_BOOL CFX_LinuxFontInfo::ParseFontCfg() { - return FALSE; +FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) { + if (!pUserPaths) { + return FALSE; + } + for (const char** pPath = pUserPaths; *pPath; ++pPath) { + AddPath(*pPath); + } + return TRUE; } void CFX_GEModule::InitPlatform() { - m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault()); + m_pFontMgr->SetSystemFontInfo( + IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths)); } void CFX_GEModule::DestroyPlatform() {} #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp index d5f29686c9..a0ccb83ae4 100644 --- a/core/src/fxge/win32/fx_win32_device.cpp +++ b/core/src/fxge/win32/fx_win32_device.cpp @@ -405,7 +405,7 @@ FX_BOOL CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) { charset = tm.tmCharSet; return TRUE; } -IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { +IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { return new CFX_Win32FontInfo; } void CFX_GEModule::InitPlatform() { @@ -419,7 +419,7 @@ void CFX_GEModule::InitPlatform() { pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5; pPlatformData->m_GdiplusExt.Load(); m_pPlatformData = pPlatformData; - m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault()); + m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); } void CFX_GEModule::DestroyPlatform() { delete (CWin32Platform*)m_pPlatformData; diff --git a/fpdfsdk/src/fpdf_sysfontinfo.cpp b/fpdfsdk/src/fpdf_sysfontinfo.cpp index 53610b040e..a004e86ba1 100644 --- a/fpdfsdk/src/fpdf_sysfontinfo.cpp +++ b/fpdfsdk/src/fpdf_sysfontinfo.cpp @@ -168,7 +168,7 @@ static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont) { } DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo() { - IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault(); + IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault(nullptr); if (pFontInfo == NULL) return NULL; diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp index c2b53bebcd..414ade7070 100644 --- a/fpdfsdk/src/fpdfview.cpp +++ b/fpdfsdk/src/fpdfview.cpp @@ -180,9 +180,14 @@ FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy) { CCodec_ModuleMgr* g_pCodecModule = nullptr; DLLEXPORT void STDCALL FPDF_InitLibrary() { + FPDF_InitLibraryWithConfig(nullptr); +} + +DLLEXPORT void STDCALL +FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* cfg) { g_pCodecModule = new CCodec_ModuleMgr(); - CFX_GEModule::Create(); + CFX_GEModule::Create(cfg ? cfg->m_pUserFontPaths : nullptr); CFX_GEModule::Get()->SetCodecModule(g_pCodecModule); CPDF_ModuleMgr::Create(); diff --git a/fpdfsdk/src/fpdfview_c_api_test.c b/fpdfsdk/src/fpdfview_c_api_test.c index d16bf99f07..4205ca119e 100644 --- a/fpdfsdk/src/fpdfview_c_api_test.c +++ b/fpdfsdk/src/fpdfview_c_api_test.c @@ -192,6 +192,7 @@ int CheckPDFiumCApi() { // fpdfview.h CHK(FPDF_InitLibrary); + CHK(FPDF_InitLibraryWithConfig); CHK(FPDF_DestroyLibrary); CHK(FPDF_SetSandBoxPolicy); CHK(FPDF_LoadDocument); diff --git a/public/fpdfview.h b/public/fpdfview.h index 158f8215a4..bfa13c43c1 100644 --- a/public/fpdfview.h +++ b/public/fpdfview.h @@ -152,9 +152,33 @@ extern "C" { // Return value: // None. // Comments: +// Convenience function to call FPDF_InitLibraryWithConfig() for +// backwards comatibility purposes. +DLLEXPORT void STDCALL FPDF_InitLibrary(); + +// Process-wide options for initializing library. +typedef struct FPDF_LIBRARY_CONFIG_ { + // Version number of the interface. Currently must be 1. + int version; + + // Array of paths to scan in place of the defaults when using built-in + // FXGE font loading code. The array is terminated by a NULL pointer. + // The Array may be NULL itself to use the default paths. May be ignored + // entirely depending upon the platform. + const char** m_pUserFontPaths; +} FPDF_LIBRARY_CONFIG; + +// Function: FPDF_InitLibraryWithConfig +// Initialize the FPDFSDK library +// Parameters: +// cfg - configuration information as above. +// Return value: +// None. +// Comments: // You have to call this function before you can call any PDF // processing functions. -DLLEXPORT void STDCALL FPDF_InitLibrary(); +DLLEXPORT void STDCALL +FPDF_InitLibraryWithConfig(const FPDF_LIBRARY_CONFIG* config); // Function: FPDF_DestroyLibary // Release all resources allocated by the FPDFSDK library. diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc index f060eb018b..bf10675573 100644 --- a/samples/pdfium_test.cc +++ b/samples/pdfium_test.cc @@ -48,6 +48,7 @@ struct Options { std::string scale_factor_as_string; std::string exe_path; std::string bin_directory; + std::string font_directory; }; // Reads the entire contents of a file into a newly malloc'd buffer. @@ -348,6 +349,13 @@ bool ParseCommandLine(const std::vector& args, return false; } options->output_format = OUTPUT_PNG; + } else if (cur_arg.size() > 11 && + cur_arg.compare(0, 11, "--font-dir=") == 0) { + if (!options->font_directory.empty()) { + fprintf(stderr, "Duplicate --font-dir argument\n"); + return false; + } + options->font_directory = cur_arg.substr(11); } #ifdef _WIN32 else if (cur_arg == "--emf") { @@ -578,8 +586,9 @@ void RenderPdf(const std::string& name, const char* pBuf, size_t len, static const char usage_string[] = "Usage: pdfium_test [OPTION] [FILE]...\n" - " --bin-dir= - override path to v8 external data\n" - " --scale= - scale output size by number (e.g. 0.5)\n" + " --bin-dir= - override path to v8 external data\n" + " --font-dir= - override path to external fonts\n" + " --scale= - scale output size by number (e.g. 0.5)\n" #ifdef _WIN32 " --bmp - write page images ..bmp\n" " --emf - write page meta files ..emf\n" @@ -612,7 +621,17 @@ int main(int argc, const char* argv[]) { v8::V8::SetSnapshotDataBlob(&snapshot); #endif // V8_USE_EXTERNAL_STARTUP_DATA - FPDF_InitLibrary(); + if (!options.font_directory.empty()) { + const char* path_array[2]; + path_array[0] = options.font_directory.c_str(); + path_array[1] = nullptr; + FPDF_LIBRARY_CONFIG config; + config.version = 1; + config.m_pUserFontPaths = path_array; + FPDF_InitLibraryWithConfig(&config); + } else { + FPDF_InitLibrary(); + } UNSUPPORT_INFO unsuppored_info; memset(&unsuppored_info, '\0', sizeof(unsuppored_info)); -- cgit v1.2.3