Split part of CPDF_TrueTypeFont into DetermineEncoding().
Refactor one chunk of LoadGlyphMap() into DetermineEncoding(). Then make
some minor improvements in DetermineEncoding():
- Break out of a for-loop early when possible.
- Reuse pre-existing constants in fx_font.cpp. Move them to fx_font.h.
- Remove an impossible check.
Change-Id: I1043882f82919053df1fc11ac734a7ce6a3e8977
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91792
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp
index ebbb92c..1fbefa3 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.cpp
+++ b/core/fpdfapi/font/cpdf_truetypefont.cpp
@@ -14,6 +14,11 @@
const uint8_t kPrefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+bool IsWinAnsiOrMacRomanEncoding(int encoding) {
+ return encoding == PDFFONT_ENCODING_WINANSI ||
+ encoding == PDFFONT_ENCODING_MACROMAN;
+}
+
} // namespace
CPDF_TrueTypeFont::CPDF_TrueTypeFont(CPDF_Document* pDocument,
@@ -43,32 +48,8 @@
if (!face)
return;
- int baseEncoding = m_BaseEncoding;
- if (m_pFontFile && face->num_charmaps > 0 &&
- (baseEncoding == PDFFONT_ENCODING_MACROMAN ||
- baseEncoding == PDFFONT_ENCODING_WINANSI) &&
- FontStyleIsSymbolic(m_Flags)) {
- bool bSupportWin = false;
- bool bSupportMac = false;
- for (int i = 0; i < face->num_charmaps; i++) {
- int platform_id = FXFT_Get_Charmap_PlatformID(face->charmaps[i]);
- if (platform_id == 0 || platform_id == 3) {
- bSupportWin = true;
- } else if (platform_id == 0 || platform_id == 1) {
- bSupportMac = true;
- }
- }
- if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {
- baseEncoding =
- bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
- } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {
- baseEncoding =
- bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
- }
- }
- if (((baseEncoding == PDFFONT_ENCODING_MACROMAN ||
- baseEncoding == PDFFONT_ENCODING_WINANSI) &&
- m_CharNames.empty()) ||
+ const int base_encoding = DetermineEncoding();
+ if ((IsWinAnsiOrMacRomanEncoding(base_encoding) && m_CharNames.empty()) ||
FontStyleIsNonSymbolic(m_Flags)) {
if (!FXFT_Has_Glyph_Names(face) &&
(!face->num_charmaps || !face->charmaps)) {
@@ -98,7 +79,7 @@
}
bool bToUnicode = m_pFontDict->KeyExist("ToUnicode");
for (uint32_t charcode = 0; charcode < 256; charcode++) {
- const char* name = GetAdobeCharName(baseEncoding, m_CharNames, charcode);
+ const char* name = GetAdobeCharName(base_encoding, m_CharNames, charcode);
if (!name) {
m_GlyphIndex[charcode] =
m_pFontFile ? FT_Get_Char_Index(face, charcode) : -1;
@@ -160,10 +141,10 @@
}
}
if (bFound) {
- if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {
+ if (base_encoding != PDFFONT_ENCODING_BUILTIN) {
for (uint32_t charcode = 0; charcode < 256; charcode++) {
const char* name =
- GetAdobeCharName(baseEncoding, m_CharNames, charcode);
+ GetAdobeCharName(base_encoding, m_CharNames, charcode);
if (name)
m_Encoding.SetUnicode(charcode, PDF_UnicodeFromAdobeName(name));
}
@@ -192,7 +173,7 @@
}
if (FXFT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0) {
bool bFound = false;
- const uint16_t* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
+ const uint16_t* pUnicodes = PDF_UnicodesForPredefinedCharSet(base_encoding);
for (uint32_t charcode = 0; charcode < 256; charcode++) {
if (m_pFontFile) {
m_Encoding.SetUnicode(charcode, charcode);
@@ -214,3 +195,35 @@
for (int charcode = 0; charcode < 256; charcode++)
m_GlyphIndex[charcode] = charcode;
}
+
+int CPDF_TrueTypeFont::DetermineEncoding() const {
+ if (!m_pFontFile || !FontStyleIsSymbolic(m_Flags) ||
+ !IsWinAnsiOrMacRomanEncoding(m_BaseEncoding)) {
+ return m_BaseEncoding;
+ }
+
+ // Not null - caller checked.
+ FXFT_FaceRec* face = m_Font.GetFaceRec();
+ if (face->num_charmaps <= 0)
+ return m_BaseEncoding;
+
+ bool support_win = false;
+ bool support_mac = false;
+ for (int i = 0; i < face->num_charmaps; i++) {
+ int platform_id = FXFT_Get_Charmap_PlatformID(face->charmaps[i]);
+ if (platform_id == kNamePlatformAppleUnicode ||
+ platform_id == kNamePlatformWindows) {
+ support_win = true;
+ } else if (platform_id == kNamePlatformMac) {
+ support_mac = true;
+ }
+ if (support_win && support_mac)
+ break;
+ }
+
+ if (m_BaseEncoding == PDFFONT_ENCODING_WINANSI && !support_win)
+ return support_mac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
+ if (m_BaseEncoding == PDFFONT_ENCODING_MACROMAN && !support_mac)
+ return support_win ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
+ return m_BaseEncoding;
+}
diff --git a/core/fpdfapi/font/cpdf_truetypefont.h b/core/fpdfapi/font/cpdf_truetypefont.h
index 4359478..a17a7f0 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.h
+++ b/core/fpdfapi/font/cpdf_truetypefont.h
@@ -28,6 +28,8 @@
// CPDF_SimpleFont:
void LoadGlyphMap() override;
+
+ int DetermineEncoding() const;
};
#endif // CORE_FPDFAPI_FONT_CPDF_TRUETYPEFONT_H_
diff --git a/core/fxge/fx_font.cpp b/core/fxge/fx_font.cpp
index 4f5ea68..7a35280 100644
--- a/core/fxge/fx_font.cpp
+++ b/core/fxge/fx_font.cpp
@@ -17,9 +17,7 @@
namespace {
// These numbers come from the OpenType name table specification.
-constexpr uint16_t kNamePlatformMac = 1;
constexpr uint16_t kNameMacEncodingRoman = 0;
-constexpr uint16_t kNamePlatformWindows = 3;
constexpr uint16_t kNameWindowsEncodingUnicode = 1;
ByteString GetStringFromTable(pdfium::span<const uint8_t> string_span,
diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h
index ca8d470..ecb539b 100644
--- a/core/fxge/fx_font.h
+++ b/core/fxge/fx_font.h
@@ -38,6 +38,11 @@
/* Other font flags */
#define FXFONT_USEEXTERNATTR 0x80000
+// These numbers come from the OpenType name table specification.
+constexpr uint16_t kNamePlatformAppleUnicode = 0;
+constexpr uint16_t kNamePlatformMac = 1;
+constexpr uint16_t kNamePlatformWindows = 3;
+
#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
class SkTypeface;