Refactor some CFX_FontMapper code into ParseStyles().
Refactor part of CFX_FontMapper::FindSubstFont() into ParseStyles().
Change-Id: Iae8ba67bdb52c31bfeb4e3e453057da5fd7360f6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91939
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index 22f519b..dc08f5c 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -231,6 +231,51 @@
return nullptr;
}
+bool ParseStyles(const ByteString& style_str,
+ bool* is_style_available,
+ int* weight,
+ uint32_t* style) {
+ if (style_str.IsEmpty())
+ return false;
+
+ size_t i = 0;
+ bool is_first_item = true;
+ while (i < style_str.GetLength()) {
+ ByteString buf = ParseStyle(style_str, i);
+ const FX_FontStyle* style_result =
+ GetStyleType(buf.AsStringView(), /*reverse_search=*/false);
+ if ((i && !*is_style_available) || (!i && !style_result))
+ return true;
+
+ if (style_result)
+ *is_style_available = true;
+
+ if (FontStyleIsForceBold(style_result->style)) {
+ // If we're already bold, then we're double bold, use special weight.
+ if (FontStyleIsForceBold(*style)) {
+ *weight = FXFONT_FW_BOLD_BOLD;
+ } else {
+ *weight = FXFONT_FW_BOLD;
+ *style |= FXFONT_FORCE_BOLD;
+ }
+
+ is_first_item = false;
+ }
+ if (FontStyleIsItalic(style_result->style) &&
+ FontStyleIsForceBold(style_result->style)) {
+ *style |= FXFONT_ITALIC;
+ } else if (FontStyleIsItalic(style_result->style)) {
+ if (!is_first_item)
+ return true;
+
+ *style |= FXFONT_ITALIC;
+ break;
+ }
+ i += buf.GetLength() + 1;
+ }
+ return false;
+}
+
bool CheckSupportThirdPartFont(const ByteString& name, int* pitch_family) {
if (name != "MyriadPro")
return false;
@@ -592,46 +637,9 @@
if (FontStyleIsForceBold(nStyle))
weight = FXFONT_FW_BOLD;
- if (!style.IsEmpty()) {
- size_t i = 0;
- bool is_first_item = true;
- while (i < style.GetLength()) {
- ByteString buf = ParseStyle(style, i);
- const FX_FontStyle* style_result =
- GetStyleType(buf.AsStringView(), /*reverse_search=*/false);
- if ((i && !is_style_available) || (!i && !style_result)) {
- family = subst_name;
- base_font = kNumStandardFonts;
- break;
- }
- if (style_result)
- is_style_available = true;
-
- if (FontStyleIsForceBold(style_result->style)) {
- // If we're already bold, then we're double bold, use special weight.
- if (FontStyleIsForceBold(nStyle)) {
- weight = FXFONT_FW_BOLD_BOLD;
- } else {
- weight = FXFONT_FW_BOLD;
- nStyle |= FXFONT_FORCE_BOLD;
- }
-
- is_first_item = false;
- }
- if (FontStyleIsItalic(style_result->style) &&
- FontStyleIsForceBold(style_result->style)) {
- nStyle |= FXFONT_ITALIC;
- } else if (FontStyleIsItalic(style_result->style)) {
- if (is_first_item) {
- nStyle |= FXFONT_ITALIC;
- } else {
- family = subst_name;
- base_font = kNumStandardFonts;
- }
- break;
- }
- i += buf.GetLength() + 1;
- }
+ if (ParseStyles(style, &is_style_available, &weight, &nStyle)) {
+ family = subst_name;
+ base_font = kNumStandardFonts;
}
if (!m_pFontInfo) {