Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1968)

Unified Diff: core/fpdfapi/fpdf_render/fpdf_render_text.cpp

Issue 2276653002: Add fallback fonts in pdfium (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Only fallbacks in vector Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: core/fpdfapi/fpdf_render/fpdf_render_text.cpp
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 080a7578a77dfa2f7a97a223e7318edfa6e0a23a..b98f2abd756f72f19e03badc7f994daa5ec9edd2 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -371,6 +371,7 @@ class CPDF_RefType3Cache {
CPDF_Type3Font* const m_pType3Font;
};
+// TODO(npm) Font fallback for type 3 fonts? (Completely separate code!!)
Lei Zhang 2016/08/24 04:43:11 TODO(username): Comment.
npm 2016/08/24 14:39:22 Done.
FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj,
const CFX_Matrix* pObj2Device) {
CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->AsType3Font();
@@ -572,6 +573,17 @@ void CPDF_CharPosList::Load(int nChars,
charpos.m_bFontStyle = true;
}
charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);
+ if (charpos.m_GlyphIndex != static_cast<uint32_t>(-1)) {
+ charpos.m_FallbackFontPosition = -1;
+ } else {
+ charpos.m_FallbackFontPosition =
+ pFont->FallbackFontFromCharcode(CharCode, &bVert);
+ if (charpos.m_FallbackFontPosition >= 0) {
+ charpos.m_GlyphIndex = pFont->FallbackGlyphFromCharcode(
+ charpos.m_FallbackFontPosition, CharCode, &bVert);
+ }
+ }
+// TODO(npm) Figure out how this affects m_ExtGID
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);
#endif
@@ -629,10 +641,30 @@ FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice,
: nullptr;
CPDF_CharPosList CharPosList;
CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
- return pDevice->DrawTextPathWithFlags(
- CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache,
- font_size, pText2User, pUser2Device, pGraphState, fill_argb, stroke_argb,
- pClippingPath, nFlag);
+ FX_BOOL bDraw = TRUE;
Lei Zhang 2016/08/24 04:43:11 Use bool?
npm 2016/08/24 14:39:22 DrawTextPath returns FX_BOOL
+ int32_t pFontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition;
dsinclair 2016/08/23 20:58:02 can m_pCharPos length be 0?
npm 2016/08/24 14:39:22 Done.
+ uint32_t pStartIndex = 0;
Lei Zhang 2016/08/24 04:43:11 Not a pointer, ditto for |pFontPosition| above.
npm 2016/08/24 14:39:22 Done.
+ for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
+ int32_t pCurFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition;
+ if (pFontPosition != pCurFontPosition) {
dsinclair 2016/08/23 20:58:01 if (pFontPosition == pCurFontPosition) continue;
npm 2016/08/24 14:39:22 Done.
+ auto font = pFontPosition == -1
Lei Zhang 2016/08/24 04:43:11 Is |font| a pointer? Use auto*
npm 2016/08/24 14:39:22 Done.
+ ? &pFont->m_Font
+ : pFont->m_FontFallbacks[pFontPosition].get();
+ bDraw &= pDevice->DrawTextPathWithFlags(
+ i - pStartIndex, CharPosList.m_pCharPos + pStartIndex, font, pCache,
+ font_size, pText2User, pUser2Device, pGraphState, fill_argb,
+ stroke_argb, pClippingPath, nFlag);
+ pFontPosition = pCurFontPosition;
+ pStartIndex = i;
+ }
+ }
+ auto font = pFontPosition == -1 ? &pFont->m_Font
+ : pFont->m_FontFallbacks[pFontPosition].get();
+ bDraw &= pDevice->DrawTextPathWithFlags(
+ CharPosList.m_nChars - pStartIndex, CharPosList.m_pCharPos + pStartIndex,
+ font, pCache, font_size, pText2User, pUser2Device, pGraphState, fill_argb,
+ stroke_argb, pClippingPath, nFlag);
+ return bDraw;
}
// static
@@ -735,9 +767,28 @@ FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice,
if (pFont->IsCIDFont()) {
FXGE_flags |= FXFONT_CIDFONT;
}
- return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos,
- &pFont->m_Font, pCache, font_size,
- pText2Device, fill_argb, FXGE_flags);
+ FX_BOOL bDraw = TRUE;
+ int32_t pFontPosition = CharPosList.m_pCharPos[0].m_FallbackFontPosition;
dsinclair 2016/08/23 20:58:01 Same comments as above.
npm 2016/08/24 14:39:22 Done.
+ uint32_t pStartIndex = 0;
+ for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
+ int32_t pCurFontPosition = CharPosList.m_pCharPos[i].m_FallbackFontPosition;
+ if (pFontPosition != pCurFontPosition) {
+ auto font = pFontPosition == -1
+ ? &pFont->m_Font
+ : pFont->m_FontFallbacks[pFontPosition].get();
+ bDraw &= pDevice->DrawNormalText(
+ i - pStartIndex, CharPosList.m_pCharPos + pStartIndex, font, pCache,
+ font_size, pText2Device, fill_argb, FXGE_flags);
+ pFontPosition = pCurFontPosition;
+ pStartIndex = i;
+ }
+ }
+ auto font = pFontPosition == -1 ? &pFont->m_Font
+ : pFont->m_FontFallbacks[pFontPosition].get();
+ bDraw &= pDevice->DrawNormalText(
+ CharPosList.m_nChars - pStartIndex, CharPosList.m_pCharPos + pStartIndex,
+ font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);
+ return bDraw;
}
void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj,
@@ -770,15 +821,26 @@ void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj,
} else {
pCache = CFX_GEModule::Get()->GetFontCache();
}
- CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);
- CFX_AutoFontCache autoFontCache(pCache, &pFont->m_Font);
CPDF_CharPosList CharPosList;
CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes,
textobj->m_pCharPos, pFont, font_size);
+ std::vector<CFX_FaceCache*> pFaceCaches;
Lei Zhang 2016/08/24 04:43:11 Also not a pointer, thus the p-prefix is slightly
npm 2016/08/24 14:39:22 Done.
+ std::vector<CFX_AutoFontCache> autoFontCaches;
+ pFaceCaches.push_back(pCache->GetCachedFace(&pFont->m_Font));
+ autoFontCaches.push_back(CFX_AutoFontCache(pCache, &pFont->m_Font));
+ for (auto& font : pFont->m_FontFallbacks) {
+ pFaceCaches.push_back(pCache->GetCachedFace(font.get()));
+ autoFontCaches.push_back(CFX_AutoFontCache(pCache, font.get()));
+ }
for (uint32_t i = 0; i < CharPosList.m_nChars; i++) {
FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];
- const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(
- &pFont->m_Font, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ auto font =
+ charpos.m_FallbackFontPosition == -1
+ ? &pFont->m_Font
+ : pFont->m_FontFallbacks[charpos.m_FallbackFontPosition].get();
+ const CFX_PathData* pPath =
+ pFaceCaches[charpos.m_FallbackFontPosition + 1]->LoadGlyphPath(
+ font, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
if (!pPath) {
continue;
}

Powered by Google App Engine
This is Rietveld 408576698