Chromium Code Reviews| Index: pdf/pdfium/pdfium_engine.cc |
| diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
| index 475d56933053765ad2f460b8ca1d7a89df84a095..5aa7e913a1fe2f016eca3a5b067883eb0dff7235 100644 |
| --- a/pdf/pdfium/pdfium_engine.cc |
| +++ b/pdf/pdfium/pdfium_engine.cc |
| @@ -294,6 +294,7 @@ void DeleteFont(struct _FPDF_SYSFONTINFO*, void* font_id) { |
| pp::Module::Get()->core()->ReleaseResource(res_id); |
| } |
| +// Font loading doesn't work in the renderer sandbox in Linux. |
| FPDF_SYSFONTINFO g_font_info = { |
| 1, |
| 0, |
| @@ -305,6 +306,90 @@ FPDF_SYSFONTINFO g_font_info = { |
| 0, |
| DeleteFont |
| }; |
| +#else |
| +struct FPDF_SYSFONTINFO_WITHMETRICS : public FPDF_SYSFONTINFO { |
| + FPDF_SYSFONTINFO_WITHMETRICS(FPDF_SYSFONTINFO* default_sysfontinfo) { |
|
Lei Zhang
2016/11/08 19:16:10
explicit
|
| + version = default_sysfontinfo->version; |
| + default_sysfontinfo_ = default_sysfontinfo; |
| + } |
| + |
| + FPDF_SYSFONTINFO* default_sysfontinfo_; |
| +}; |
| + |
| +void* MapFontWithMetrics(struct _FPDF_SYSFONTINFO* sysfontinfo, |
|
Lei Zhang
2016/11/08 19:16:10
Just FPDF_SYSFONTINFO*
npm
2016/11/08 19:54:36
The "_" is used on the Linux overrides in this fil
|
| + int weight, |
| + int italic, |
| + int charset, |
| + int pitch_family, |
| + const char* face, |
| + int* exact) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + void* mapped_font = fontinfo_with_metrics->default_sysfontinfo_->MapFont( |
| + fontinfo_with_metrics->default_sysfontinfo_, weight, italic, charset, |
| + pitch_family, face, exact); |
| + if (mapped_font && g_engine_for_fontmapper) |
| + g_engine_for_fontmapper->FontSubstituted(); |
| + return mapped_font; |
| +} |
| + |
| +void DeleteFont(struct _FPDF_SYSFONTINFO* sysfontinfo, void* font_id) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + fontinfo_with_metrics->default_sysfontinfo_->DeleteFont( |
| + fontinfo_with_metrics->default_sysfontinfo_, font_id); |
| +} |
| + |
| +void EnumFonts(struct _FPDF_SYSFONTINFO* sysfontinfo, void* mapper) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + fontinfo_with_metrics->default_sysfontinfo_->EnumFonts( |
| + fontinfo_with_metrics->default_sysfontinfo_, mapper); |
| +} |
| + |
| +unsigned long GetFaceName(struct _FPDF_SYSFONTINFO* sysfontinfo, |
| + void* hFont, |
| + char* buffer, |
| + unsigned long buffer_size) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + return fontinfo_with_metrics->default_sysfontinfo_->GetFaceName( |
| + fontinfo_with_metrics->default_sysfontinfo_, hFont, buffer, buffer_size); |
| +} |
| + |
| +void* GetFont(struct _FPDF_SYSFONTINFO* sysfontinfo, const char* face) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + return fontinfo_with_metrics->default_sysfontinfo_->GetFont( |
| + fontinfo_with_metrics->default_sysfontinfo_, face); |
| +} |
| + |
| +int GetFontCharset(struct _FPDF_SYSFONTINFO* sysfontinfo, void* hFont) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + return fontinfo_with_metrics->default_sysfontinfo_->GetFontCharset( |
| + fontinfo_with_metrics->default_sysfontinfo_, hFont); |
| +} |
| + |
| +unsigned long GetFontData(struct _FPDF_SYSFONTINFO* sysfontinfo, |
| + void* hFont, |
| + unsigned int table, |
| + unsigned char* buffer, |
| + unsigned long buf_size) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + return fontinfo_with_metrics->default_sysfontinfo_->GetFontData( |
| + fontinfo_with_metrics->default_sysfontinfo_, hFont, table, buffer, |
| + buf_size); |
| +} |
| + |
| +void Release(struct _FPDF_SYSFONTINFO* sysfontinfo) { |
| + auto* fontinfo_with_metrics = |
| + static_cast<FPDF_SYSFONTINFO_WITHMETRICS*>(sysfontinfo); |
| + fontinfo_with_metrics->default_sysfontinfo_->Release( |
| + fontinfo_with_metrics->default_sysfontinfo_); |
| + delete fontinfo_with_metrics->default_sysfontinfo_; |
| +} |
| #endif // defined(OS_LINUX) |
| PDFiumEngine* g_engine_for_unsupported = nullptr; |
| @@ -516,13 +601,32 @@ bool InitializeSDK() { |
| config.m_v8EmbedderSlot = gin::kEmbedderPDFium; |
| FPDF_InitLibraryWithConfig(&config); |
| -#if defined(OS_LINUX) |
| +#if !defined(OS_LINUX) |
| + FPDF_SYSFONTINFO_WITHMETRICS* g_font_info = |
|
Lei Zhang
2016/11/08 19:16:10
not a global
npm
2016/11/08 19:54:36
What do you mean? Declare pointer in namespace?
Lei Zhang
2016/11/08 19:58:31
The variable is named g_foo, yet it is a local var
|
| + new FPDF_SYSFONTINFO_WITHMETRICS(FPDF_GetDefaultSystemFontInfo()); |
|
Lei Zhang
2016/11/08 19:16:10
Does this get freed or if it a one time leak?
npm
2016/11/08 19:54:36
We FPDF_SetSystemFontInfo on it, and Release is ca
|
| + if (g_font_info->default_sysfontinfo_->Release) |
| + g_font_info->Release = Release; |
| + if (g_font_info->default_sysfontinfo_->EnumFonts) |
| + g_font_info->EnumFonts = EnumFonts; |
| + // Set new MapFont that calculates metrics |
| + if (g_font_info->default_sysfontinfo_->MapFont) |
|
Lei Zhang
2016/11/08 19:16:10
This is the only one you actual care about, right?
npm
2016/11/08 19:54:36
Actually, the default always gets assigned all of
Lei Zhang
2016/11/08 19:58:31
I guess stick with it since we want to follow the
|
| + g_font_info->MapFont = MapFontWithMetrics; |
| + if (g_font_info->default_sysfontinfo_->GetFont) |
| + g_font_info->GetFont = GetFont; |
| + if (g_font_info->default_sysfontinfo_->GetFaceName) |
| + g_font_info->GetFaceName = GetFaceName; |
| + if (g_font_info->default_sysfontinfo_->GetFontCharset) |
| + g_font_info->GetFontCharset = GetFontCharset; |
| + // These are required according to documentation |
| + g_font_info->GetFontData = GetFontData; |
| + g_font_info->DeleteFont = DeleteFont; |
| + FPDF_SetSystemFontInfo(g_font_info); |
| +#else |
| // Font loading doesn't work in the renderer sandbox in Linux. |
| FPDF_SetSystemFontInfo(&g_font_info); |
| #endif |
| FSDK_SetUnSpObjProcessHandler(&g_unsupported_info); |
| - |
| return true; |
| } |