Split CFX_FontMgr::GetBuiltinFont().
Split this method into GetStandardFont(), GetGenericSansFont(), and
GetGenericSerifFont(). Then all 3 well-defined methods can return spans
and there is no longer a need for absl::optional.
Along the way, consolidate some constants and split the 2 element
"mm fonts" array into a sans and a serif font.
Change-Id: Ibe9f9c5f8dd0545eb60c7083bd7e48d150af62c2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/86450
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index 5e894b1..53d97b1 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -28,11 +28,10 @@
namespace {
-constexpr int kNumStandardFonts = 14;
-static_assert(CFX_FontMapper::kLast + 1 == kNumStandardFonts,
+static_assert(CFX_FontMapper::kLast + 1 == CFX_FontMapper::kNumStandardFonts,
"StandardFont enum count mismatch");
-const char* const kBase14FontNames[kNumStandardFonts] = {
+const char* const kBase14FontNames[CFX_FontMapper::kNumStandardFonts] = {
"Courier",
"Courier-Bold",
"Courier-BoldOblique",
@@ -376,34 +375,31 @@
int weight,
int pitch_family) {
if (iBaseFont < kNumStandardFonts) {
- if (m_FoxitFaces[iBaseFont])
- return m_FoxitFaces[iBaseFont];
- absl::optional<pdfium::span<const uint8_t>> font_data =
- m_pFontMgr->GetBuiltinFont(iBaseFont);
- if (font_data.has_value()) {
- m_FoxitFaces[iBaseFont] =
- m_pFontMgr->NewFixedFace(nullptr, font_data.value(), 0);
- return m_FoxitFaces[iBaseFont];
+ if (!m_StandardFaces[iBaseFont]) {
+ m_StandardFaces[iBaseFont] = m_pFontMgr->NewFixedFace(
+ nullptr, m_pFontMgr->GetStandardFont(iBaseFont), 0);
}
+ return m_StandardFaces[iBaseFont];
}
+
pSubstFont->m_bFlagMM = true;
pSubstFont->m_ItalicAngle = italic_angle;
if (weight)
pSubstFont->m_Weight = weight;
if (FontFamilyIsRoman(pitch_family)) {
pSubstFont->UseChromeSerif();
- if (!m_MMFaces[1]) {
- m_MMFaces[1] = m_pFontMgr->NewFixedFace(
- nullptr, m_pFontMgr->GetBuiltinFont(14).value(), 0);
+ if (!m_GenericSerifFace) {
+ m_GenericSerifFace = m_pFontMgr->NewFixedFace(
+ nullptr, m_pFontMgr->GetGenericSerifFont(), 0);
}
- return m_MMFaces[1];
+ return m_GenericSerifFace;
}
pSubstFont->m_Family = "Chrome Sans";
- if (!m_MMFaces[0]) {
- m_MMFaces[0] = m_pFontMgr->NewFixedFace(
- nullptr, m_pFontMgr->GetBuiltinFont(15).value(), 0);
+ if (!m_GenericSansFace) {
+ m_GenericSansFace =
+ m_pFontMgr->NewFixedFace(nullptr, m_pFontMgr->GetGenericSansFont(), 0);
}
- return m_MMFaces[0];
+ return m_GenericSansFace;
}
RetainPtr<CFX_Face> CFX_FontMapper::FindSubstFont(const ByteString& name,
@@ -753,18 +749,6 @@
}
#endif // PDF_ENABLE_XFA
-bool CFX_FontMapper::IsBuiltinFace(const RetainPtr<CFX_Face>& face) const {
- for (size_t i = 0; i < MM_FACE_COUNT; ++i) {
- if (m_MMFaces[i] == face)
- return true;
- }
- for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) {
- if (m_FoxitFaces[i] == face)
- return true;
- }
- return false;
-}
-
RetainPtr<CFX_Face> CFX_FontMapper::GetCachedTTCFace(void* hFont,
uint32_t ttc_size,
uint32_t font_size) {
diff --git a/core/fxge/cfx_fontmapper.h b/core/fxge/cfx_fontmapper.h
index 4622145..930c924 100644
--- a/core/fxge/cfx_fontmapper.h
+++ b/core/fxge/cfx_fontmapper.h
@@ -43,6 +43,7 @@
kDingbats,
kLast = kDingbats
};
+ static constexpr int kNumStandardFonts = 14;
explicit CFX_FontMapper(CFX_FontMgr* mgr);
~CFX_FontMapper();
@@ -68,7 +69,6 @@
FX_CodePage code_page,
CFX_SubstFont* pSubstFont);
- bool IsBuiltinFace(const RetainPtr<CFX_Face>& face) const;
size_t GetFaceSize() const;
ByteString GetFaceName(size_t index) const { return m_FaceArray[index].name; }
bool HasInstalledFont(ByteStringView name) const;
@@ -88,9 +88,6 @@
#endif // PDF_ENABLE_XFA
private:
- static constexpr size_t MM_FACE_COUNT = 2;
- static constexpr size_t FOXIT_FACE_COUNT = 14;
-
uint32_t GetChecksumFromTT(void* hFont);
ByteString GetPSNameFromTT(void* hFont);
ByteString MatchInstalledFonts(const ByteString& norm_name);
@@ -120,8 +117,9 @@
UnownedPtr<CFX_FontMgr> const m_pFontMgr;
std::vector<ByteString> m_InstalledTTFonts;
std::vector<std::pair<ByteString, ByteString>> m_LocalizedTTFonts;
- RetainPtr<CFX_Face> m_MMFaces[MM_FACE_COUNT];
- RetainPtr<CFX_Face> m_FoxitFaces[FOXIT_FACE_COUNT];
+ RetainPtr<CFX_Face> m_StandardFaces[kNumStandardFonts];
+ RetainPtr<CFX_Face> m_GenericSansFace;
+ RetainPtr<CFX_Face> m_GenericSerifFace;
};
#endif // CORE_FXGE_CFX_FONTMAPPER_H_
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp
index 510617f..8513001 100644
--- a/core/fxge/cfx_fontmgr.cpp
+++ b/core/fxge/cfx_fontmgr.cpp
@@ -25,7 +25,7 @@
uint32_t m_dwSize;
};
-constexpr BuiltinFont kFoxitFonts[14] = {
+constexpr BuiltinFont kFoxitFonts[] = {
{kFoxitFixedFontData, 17597},
{kFoxitFixedBoldFontData, 18055},
{kFoxitFixedBoldItalicFontData, 19151},
@@ -41,11 +41,11 @@
{kFoxitSymbolFontData, 16729},
{kFoxitDingbatsFontData, 29513},
};
+static_assert(pdfium::size(kFoxitFonts) == CFX_FontMapper::kNumStandardFonts,
+ "Wrong font count");
-const BuiltinFont kMMFonts[2] = {
- {kFoxitSerifMMFontData, 113417},
- {kFoxitSansMMFontData, 66919},
-};
+constexpr BuiltinFont kGenericSansFont = {kFoxitSansMMFontData, 66919};
+constexpr BuiltinFont kGenericSerifFont = {kFoxitSerifMMFontData, 113417};
ByteString KeyNameFromFace(const ByteString& face_name,
int weight,
@@ -144,18 +144,22 @@
}
// static
-absl::optional<pdfium::span<const uint8_t>> CFX_FontMgr::GetBuiltinFont(
- size_t index) {
- if (index < pdfium::size(kFoxitFonts)) {
- return pdfium::make_span(kFoxitFonts[index].m_pFontData,
- kFoxitFonts[index].m_dwSize);
- }
- size_t mm_index = index - pdfium::size(kFoxitFonts);
- if (mm_index < pdfium::size(kMMFonts)) {
- return pdfium::make_span(kMMFonts[mm_index].m_pFontData,
- kMMFonts[mm_index].m_dwSize);
- }
- return absl::nullopt;
+pdfium::span<const uint8_t> CFX_FontMgr::GetStandardFont(size_t index) {
+ CHECK_LT(index, pdfium::size(kFoxitFonts));
+ return pdfium::make_span(kFoxitFonts[index].m_pFontData,
+ kFoxitFonts[index].m_dwSize);
+}
+
+// static
+pdfium::span<const uint8_t> CFX_FontMgr::GetGenericSansFont() {
+ return pdfium::make_span(kGenericSansFont.m_pFontData,
+ kGenericSansFont.m_dwSize);
+}
+
+// static
+pdfium::span<const uint8_t> CFX_FontMgr::GetGenericSerifFont() {
+ return pdfium::make_span(kGenericSerifFont.m_pFontData,
+ kGenericSerifFont.m_dwSize);
}
bool CFX_FontMgr::FreeTypeVersionSupportsHinting() const {
diff --git a/core/fxge/cfx_fontmgr.h b/core/fxge/cfx_fontmgr.h
index 232da1c..59cbf51 100644
--- a/core/fxge/cfx_fontmgr.h
+++ b/core/fxge/cfx_fontmgr.h
@@ -15,7 +15,6 @@
#include "core/fxcrt/observed_ptr.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxge/fx_freetype.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/base/span.h"
class CFX_Face;
@@ -42,8 +41,10 @@
ObservedPtr<CFX_Face> m_TTCFaces[16];
};
- static absl::optional<pdfium::span<const uint8_t>> GetBuiltinFont(
- size_t index);
+ // `index` must be less than `CFX_FontMapper::kNumStandardFonts`.
+ static pdfium::span<const uint8_t> GetStandardFont(size_t index);
+ static pdfium::span<const uint8_t> GetGenericSansFont();
+ static pdfium::span<const uint8_t> GetGenericSerifFont();
CFX_FontMgr();
~CFX_FontMgr();