summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLei Zhang <thestig@chromium.org>2015-09-23 15:31:44 -0700
committerLei Zhang <thestig@chromium.org>2015-09-23 15:31:44 -0700
commit6f62d53b7650311afc490bfdaa48f5e8536b8b4e (patch)
tree9b1e1cc17f3d75d6f9bd2413281d5b29450f1fcd
parent5377ebf967ea860eec4b3cfa3877ed30b84509dc (diff)
downloadpdfium-6f62d53b7650311afc490bfdaa48f5e8536b8b4e.tar.xz
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 .
-rw-r--r--core/include/fxge/fx_font.h2
-rw-r--r--core/include/fxge/fx_ge.h5
-rw-r--r--core/src/fxge/apple/fx_mac_imp.cpp4
-rw-r--r--core/src/fxge/ge/fx_ge.cpp10
-rw-r--r--core/src/fxge/ge/fx_ge_fontmap.cpp2
-rw-r--r--core/src/fxge/ge/fx_ge_linux.cpp22
-rw-r--r--core/src/fxge/win32/fx_win32_device.cpp4
-rw-r--r--fpdfsdk/src/fpdf_sysfontinfo.cpp2
-rw-r--r--fpdfsdk/src/fpdfview.cpp7
-rw-r--r--fpdfsdk/src/fpdfview_c_api_test.c1
-rw-r--r--public/fpdfview.h26
-rw-r--r--samples/pdfium_test.cc25
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<std::string>& 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=<path> - override path to v8 external data\n"
- " --scale=<number> - scale output size by number (e.g. 0.5)\n"
+ " --bin-dir=<path> - override path to v8 external data\n"
+ " --font-dir=<path> - override path to external fonts\n"
+ " --scale=<number> - scale output size by number (e.g. 0.5)\n"
#ifdef _WIN32
" --bmp - write page images <pdf-name>.<page-number>.bmp\n"
" --emf - write page meta files <pdf-name>.<page-number>.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));