summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Harrison <rharrison@chromium.org>2018-05-18 18:04:46 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-05-18 18:04:46 +0000
commit377bd931d8d77d322095c7dcffd3c2cc31641fba (patch)
tree3e708aa3be33bd3c8ac1ce6e62a365faf6654429
parentdd8da5e2f0f4558d98a8a6f93f9cb14b5b091277 (diff)
downloadpdfium-377bd931d8d77d322095c7dcffd3c2cc31641fba.tar.xz
Fix issues with XFA font loading
This fixes two partially interrelated bugs with font loading in XFA documents. First, it adds falling back to the builtin fonts if there are no viable embedded or installed font for the top-level XFA font manager. Additionally it changes the load font code path in CXFA_FWLTheme to use the top level XFA font manager, instead of the one that just handles the system installed fonts. The main visible issue that this patch fixes is that currently using --font-dir with pdfium_test on a XFA PDF can cause text to not be displayed in widgets and/or NOTREACHED asserts. This occurs if there isn't a needed fonts embedded in the document or in the font directory, since currently PDFium will not correctly fall back to the builtins. BUG=pdfium:1008,pdfium:1020 Change-Id: I451a8aede63d639e401c0cc076443e61d8b7a2f8 Reviewed-on: https://pdfium-review.googlesource.com/32730 Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Commit-Queue: Ryan Harrison <rharrison@chromium.org>
-rw-r--r--xfa/fxfa/cxfa_ffapp.cpp4
-rw-r--r--xfa/fxfa/cxfa_ffapp.h2
-rw-r--r--xfa/fxfa/cxfa_fffield.cpp2
-rw-r--r--xfa/fxfa/cxfa_fontmgr.cpp13
-rw-r--r--xfa/fxfa/cxfa_fwltheme.cpp6
-rw-r--r--xfa/fxfa/cxfa_fwltheme.h2
6 files changed, 21 insertions, 8 deletions
diff --git a/xfa/fxfa/cxfa_ffapp.cpp b/xfa/fxfa/cxfa_ffapp.cpp
index a2b0c005f0..1367a77b87 100644
--- a/xfa/fxfa/cxfa_ffapp.cpp
+++ b/xfa/fxfa/cxfa_ffapp.cpp
@@ -51,10 +51,10 @@ CFGAS_FontMgr* CXFA_FFApp::GetFDEFontMgr() {
return m_pFDEFontMgr.get();
}
-CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme() {
+CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme(CXFA_FFDoc* doc) {
if (!m_pFWLTheme) {
auto fwl_theme = pdfium::MakeUnique<CXFA_FWLTheme>(this);
- if (fwl_theme->LoadCalendarFont())
+ if (fwl_theme->LoadCalendarFont(doc))
m_pFWLTheme = std::move(fwl_theme);
}
return m_pFWLTheme.get();
diff --git a/xfa/fxfa/cxfa_ffapp.h b/xfa/fxfa/cxfa_ffapp.h
index 1b1b40a512..c43cb3e6b2 100644
--- a/xfa/fxfa/cxfa_ffapp.h
+++ b/xfa/fxfa/cxfa_ffapp.h
@@ -40,7 +40,7 @@ class CXFA_FFApp {
CFWL_WidgetMgr* GetFWLWidgetMgr() const { return m_pFWLApp->GetWidgetMgr(); }
CFGAS_FontMgr* GetFDEFontMgr();
- CXFA_FWLTheme* GetFWLTheme();
+ CXFA_FWLTheme* GetFWLTheme(CXFA_FFDoc* doc);
IXFA_AppProvider* GetAppProvider() const { return m_pProvider.Get(); }
const CFWL_App* GetFWLApp() const { return m_pFWLApp.get(); }
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index ce8e70ea0c..f1b8cffa8f 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -119,7 +119,7 @@ void CXFA_FFField::DrawFocus(CXFA_Graphics* pGS, CFX_Matrix* pMatrix) {
void CXFA_FFField::SetFWLThemeProvider() {
if (m_pNormalWidget)
- m_pNormalWidget->SetThemeProvider(GetApp()->GetFWLTheme());
+ m_pNormalWidget->SetThemeProvider(GetApp()->GetFWLTheme(GetDoc()));
}
bool CXFA_FFField::IsLoaded() {
diff --git a/xfa/fxfa/cxfa_fontmgr.cpp b/xfa/fxfa/cxfa_fontmgr.cpp
index 7770825b26..c35b10c9bc 100644
--- a/xfa/fxfa/cxfa_fontmgr.cpp
+++ b/xfa/fxfa/cxfa_fontmgr.cpp
@@ -13,6 +13,8 @@
#include "core/fpdfapi/font/cpdf_font.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_document.h"
+#include "core/fxge/cfx_fontmgr.h"
+#include "core/fxge/cfx_gemodule.h"
#include "third_party/base/ptr_util.h"
#include "xfa/fgas/font/cfgas_gefont.h"
#include "xfa/fgas/font/fgas_fontutils.h"
@@ -55,11 +57,22 @@ RetainPtr<CFGAS_GEFont> CXFA_FontMgr::GetFont(
if (pFont)
return pFont;
}
+
if (!pFont) {
pFont = m_pDefFontMgr.GetDefaultFont(hDoc->GetApp()->GetFDEFontMgr(),
wsFontFamily, dwFontStyles);
}
+ if (!pFont) {
+ ByteString font_family =
+ ByteString::Format("%ls", WideString(wsFontFamily).c_str());
+ CPDF_Font* stock_font =
+ CPDF_Font::GetStockFont(hDoc->GetPDFDoc(), font_family.AsStringView());
+ if (stock_font)
+ pFont = CFGAS_GEFont::LoadFont(stock_font->GetFont(),
+ hDoc->GetApp()->GetFDEFontMgr());
+ }
+
if (pFont) {
if (pPDFFont) {
pMgr->SetFont(pFont, pPDFFont);
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 94d963d70e..1a94ba6446 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -62,11 +62,11 @@ CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp)
m_Rect.Reset();
}
-bool CXFA_FWLTheme::LoadCalendarFont() {
+bool CXFA_FWLTheme::LoadCalendarFont(CXFA_FFDoc* doc) {
for (size_t i = 0; !m_pCalendarFont && i < FX_ArraySize(g_FWLTheme_CalFonts);
++i) {
- m_pCalendarFont = CFGAS_GEFont::LoadFont(g_FWLTheme_CalFonts[i], 0, 0,
- m_pApp->GetFDEFontMgr());
+ m_pCalendarFont =
+ m_pApp->GetXFAFontMgr()->GetFont(doc, g_FWLTheme_CalFonts[i], 0);
}
if (!m_pCalendarFont) {
diff --git a/xfa/fxfa/cxfa_fwltheme.h b/xfa/fxfa/cxfa_fwltheme.h
index 289bbd4fe5..31e29bf4eb 100644
--- a/xfa/fxfa/cxfa_fwltheme.h
+++ b/xfa/fxfa/cxfa_fwltheme.h
@@ -29,7 +29,7 @@ class CXFA_FWLTheme final : public IFWL_ThemeProvider {
explicit CXFA_FWLTheme(CXFA_FFApp* pApp);
~CXFA_FWLTheme() override;
- bool LoadCalendarFont();
+ bool LoadCalendarFont(CXFA_FFDoc* doc);
// IFWL_ThemeProvider:
void DrawBackground(CFWL_ThemeBackground* pParams) override;