Merge 2 identical standard font name constants. Remove CBA_FontMap::IsStandardFont(), which contains a standard font name constant, and add CFX_FontMapper::IsStandardFontName(). Then IsStandardFontName() can use the standard font name constant in cfx_fontmapper.cpp. Also add a unit test for IsStandardFontName() and fix some nits in related code along the way. Change-Id: I0292f1e7c644661f6ad1079b0eddd6b820096bcf Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/79630 Reviewed-by: Hui Yingst <nigi@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfdoc/cba_fontmap.cpp b/core/fpdfdoc/cba_fontmap.cpp index 9e3ddb6..8d81eb6 100644 --- a/core/fpdfdoc/cba_fontmap.cpp +++ b/core/fpdfdoc/cba_fontmap.cpp
@@ -422,34 +422,12 @@ RetainPtr<CPDF_Font> CBA_FontMap::AddFontToDocument(ByteString sFontName, uint8_t nCharset) { - if (IsStandardFont(sFontName)) + if (CFX_FontMapper::IsStandardFontName(sFontName)) return AddStandardFont(sFontName); return AddSystemFont(sFontName, nCharset); } -bool CBA_FontMap::IsStandardFont(const ByteString& sFontName) { - static const char* const kStandardFontNames[] = {"Courier", - "Courier-Bold", - "Courier-BoldOblique", - "Courier-Oblique", - "Helvetica", - "Helvetica-Bold", - "Helvetica-BoldOblique", - "Helvetica-Oblique", - "Times-Roman", - "Times-Bold", - "Times-Italic", - "Times-BoldItalic", - "Symbol", - "ZapfDingbats"}; - for (const char* name : kStandardFontNames) { - if (sFontName == name) - return true; - } - return false; -} - RetainPtr<CPDF_Font> CBA_FontMap::AddStandardFont(ByteString sFontName) { auto* pPageData = CPDF_DocPageData::FromDocument(m_pDocument.Get()); if (sFontName == "ZapfDingbats")
diff --git a/core/fpdfdoc/cba_fontmap.h b/core/fpdfdoc/cba_fontmap.h index af9255d..78390d4 100644 --- a/core/fpdfdoc/cba_fontmap.h +++ b/core/fpdfdoc/cba_fontmap.h
@@ -76,7 +76,6 @@ int32_t FindFont(const ByteString& sFontName, int32_t nCharset); ByteString GetNativeFontName(int32_t nCharset); ByteString GetCachedNativeFontName(int32_t nCharset); - bool IsStandardFont(const ByteString& sFontName); RetainPtr<CPDF_Font> AddFontToDocument(ByteString sFontName, uint8_t nCharset); RetainPtr<CPDF_Font> AddStandardFont(ByteString sFontName);
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp index 1e69776..7c0ef78 100644 --- a/core/fxge/cfx_fontmapper.cpp +++ b/core/fxge/cfx_fontmapper.cpp
@@ -26,11 +26,11 @@ namespace { -const int kNumStandardFonts = 14; -static_assert(CFX_FontMapper::kDingbats + 1 == kNumStandardFonts, +constexpr int kNumStandardFonts = 14; +static_assert(CFX_FontMapper::kLast + 1 == kNumStandardFonts, "StandardFont enum count mismatch"); -const char* const g_Base14FontNames[kNumStandardFonts] = { +const char* const kBase14FontNames[kNumStandardFonts] = { "Courier", "Courier-Bold", "Courier-BoldOblique", @@ -448,7 +448,7 @@ } } for (; iBaseFont < 12; iBaseFont++) { - if (family == ByteStringView(g_Base14FontNames[iBaseFont])) + if (family == kBase14FontNames[iBaseFont]) break; } int PitchFamily = 0; @@ -594,7 +594,7 @@ else if (FontStyleIsItalic(nStyle)) iBaseFont += 3; } - family = g_Base14FontNames[iBaseFont]; + family = kBase14FontNames[iBaseFont]; } } else if (FontStyleIsItalic(flags)) { bItalic = true; @@ -790,13 +790,22 @@ return FXSYS_stricmp(element.m_pName, name) < 0; }); if (found == end || FXSYS_stricmp(found->m_pName, name->c_str())) - return {}; + return pdfium::nullopt; - *name = g_Base14FontNames[static_cast<size_t>(found->m_Index)]; + *name = kBase14FontNames[static_cast<size_t>(found->m_Index)]; return found->m_Index; } // static +bool CFX_FontMapper::IsStandardFontName(const ByteString& name) { + for (const char* standard_name : kBase14FontNames) { + if (name == standard_name) + return true; + } + return false; +} + +// static bool CFX_FontMapper::IsSymbolicFont(StandardFont font) { return font == StandardFont::kSymbol || font == StandardFont::kDingbats; }
diff --git a/core/fxge/cfx_fontmapper.h b/core/fxge/cfx_fontmapper.h index 955cc68..91a9d7d 100644 --- a/core/fxge/cfx_fontmapper.h +++ b/core/fxge/cfx_fontmapper.h
@@ -39,12 +39,14 @@ kTimesOblique, kSymbol, kDingbats, + kLast = kDingbats }; explicit CFX_FontMapper(CFX_FontMgr* mgr); ~CFX_FontMapper(); static Optional<StandardFont> GetStandardFontName(ByteString* name); + static bool IsStandardFontName(const ByteString& name); static bool IsSymbolicFont(StandardFont font); static bool IsFixedFont(StandardFont font); static constexpr uint32_t MakeTag(char c1, char c2, char c3, char c4) {
diff --git a/core/fxge/cfx_fontmapper_unittest.cpp b/core/fxge/cfx_fontmapper_unittest.cpp index e69387d..1d54526 100644 --- a/core/fxge/cfx_fontmapper_unittest.cpp +++ b/core/fxge/cfx_fontmapper_unittest.cpp
@@ -9,6 +9,28 @@ // Deliberately give this global variable external linkage. char g_maybe_changes = '\xff'; +TEST(CFX_FontMapper, IsStandardFontName) { + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Courier")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Courier-Bold")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Courier-BoldOblique")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Courier-Oblique")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Helvetica")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Helvetica-Bold")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Helvetica-BoldOblique")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Helvetica-Oblique")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Times-Roman")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Times-Bold")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Times-BoldItalic")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Times-Italic")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("Symbol")); + EXPECT_TRUE(CFX_FontMapper::IsStandardFontName("ZapfDingbats")); + + EXPECT_FALSE(CFX_FontMapper::IsStandardFontName("Courie")); + EXPECT_FALSE(CFX_FontMapper::IsStandardFontName("Courier-")); + EXPECT_FALSE(CFX_FontMapper::IsStandardFontName("Helvetica+Bold")); + EXPECT_FALSE(CFX_FontMapper::IsStandardFontName("YapfDingbats")); +} + TEST(CFX_FontMapper, MakeTag) { EXPECT_EQ(0x61626364u, CFX_FontMapper::MakeTag('a', 'b', 'c', 'd')); EXPECT_EQ(0x00000000u, CFX_FontMapper::MakeTag('\0', '\0', '\0', '\0'));