Add enum FontWeight

Replace #defines in core/fxge/fx_font.h with an enum, both to modernize
the code, and to avoid confusion with FXFONT_FW_FOO #defines in
public/fpdf_sysfontinfo.h.

Also add the kExtraLight value and use it in place of the raw integer
value.

Bug: 42270078
Change-Id: I0edcd4eb86127060ce4001bdce8a9f609dfba33f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/126931
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Thomas Sepez <tsepez@google.com>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 5b22355..2ecb0c4 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -810,12 +810,12 @@
 }
 
 void CPDF_CIDFont::LoadSubstFont() {
-  FX_SAFE_INT32 safeStemV(m_StemV);
-  safeStemV *= 5;
-  m_Font.LoadSubst(m_BaseFontName, m_FontType == CIDFontType::kTrueType,
-                   m_Flags, safeStemV.ValueOrDefault(FXFONT_FW_NORMAL),
-                   m_ItalicAngle, kCharsetCodePages[m_Charset],
-                   IsVertWriting());
+  FX_SAFE_INT32 safe_stem_v(m_StemV);
+  safe_stem_v *= 5;
+  m_Font.LoadSubst(
+      m_BaseFontName, m_FontType == CIDFontType::kTrueType, m_Flags,
+      safe_stem_v.ValueOrDefault(pdfium::kFontWeightNormal), m_ItalicAngle,
+      kCharsetCodePages[m_Charset], IsVertWriting());
 }
 
 // static
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index 0ceefeb..5debeb3 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -372,12 +372,12 @@
 uint32_t CPDF_Font::FallbackFontFromCharcode(uint32_t charcode) {
   if (m_FontFallbacks.empty()) {
     m_FontFallbacks.push_back(std::make_unique<CFX_Font>());
-    FX_SAFE_INT32 safeWeight = m_StemV;
-    safeWeight *= 5;
-    m_FontFallbacks[0]->LoadSubst("Arial", IsTrueTypeFont(), m_Flags,
-                                  safeWeight.ValueOrDefault(FXFONT_FW_NORMAL),
-                                  m_ItalicAngle, FX_CodePage::kDefANSI,
-                                  IsVertWriting());
+    FX_SAFE_INT32 safe_weight = m_StemV;
+    safe_weight *= 5;
+    m_FontFallbacks[0]->LoadSubst(
+        "Arial", IsTrueTypeFont(), m_Flags,
+        safe_weight.ValueOrDefault(pdfium::kFontWeightNormal), m_ItalicAngle,
+        FX_CodePage::kDefANSI, IsVertWriting());
   }
   return 0;
 }
diff --git a/core/fpdfapi/font/cpdf_simplefont.cpp b/core/fpdfapi/font/cpdf_simplefont.cpp
index a7e0642..ce99662 100644
--- a/core/fpdfapi/font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/font/cpdf_simplefont.cpp
@@ -284,9 +284,10 @@
     }
   }
 
-  int weight = GetFontWeight().value_or(FXFONT_FW_NORMAL);
-  if (weight < 100 || weight > FXFONT_FW_BOLD_BOLD) {
-    weight = FXFONT_FW_NORMAL;
+  int weight = GetFontWeight().value_or(pdfium::kFontWeightNormal);
+  if (weight < pdfium::kFontWeightExtraLight ||
+      weight > pdfium::kFontWeightExtraBold) {
+    weight = pdfium::kFontWeightNormal;
   }
   m_Font.LoadSubst(m_BaseFontName, IsTrueTypeFont(), m_Flags, weight,
                    m_ItalicAngle, FX_CodePage::kDefANSI, /*bVertical=*/false);
diff --git a/core/fxge/cfx_font.cpp b/core/fxge/cfx_font.cpp
index 274ca34..d1d3103 100644
--- a/core/fxge/cfx_font.cpp
+++ b/core/fxge/cfx_font.cpp
@@ -370,7 +370,8 @@
 #if defined(PDF_USE_SKIA)
 bool CFX_Font::IsSubstFontBold() const {
   CFX_SubstFont* subst_font = GetSubstFont();
-  return subst_font && subst_font->GetOriginalWeight() >= FXFONT_FW_BOLD;
+  return subst_font &&
+         subst_font->GetOriginalWeight() >= pdfium::kFontWeightBold;
 }
 #endif
 
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index c81271a..fbf7084 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -262,9 +262,9 @@
     if (FontStyleIsForceBold(parsed_style)) {
       // If we're already bold, then we're double bold, use special weight.
       if (FontStyleIsForceBold(*style)) {
-        *weight = FXFONT_FW_BOLD_BOLD;
+        *weight = pdfium::kFontWeightExtraBold;
       } else {
-        *weight = FXFONT_FW_BOLD;
+        *weight = pdfium::kFontWeightBold;
         *style |= FXFONT_FORCE_BOLD;
       }
 
@@ -552,7 +552,8 @@
 
   subst_font->m_Family = face_name;
   subst_font->m_Charset = charset;
-  int face_weight = face->IsBold() ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
+  int face_weight =
+      face->IsBold() ? pdfium::kFontWeightBold : pdfium::kFontWeightNormal;
   if (weight != face_weight)
     subst_font->m_Weight = weight;
   if (is_italic && !face->IsItalic()) {
@@ -572,11 +573,12 @@
                                                   int italic_angle,
                                                   FX_CodePage code_page,
                                                   CFX_SubstFont* subst_font) {
-  if (weight == 0)
-    weight = FXFONT_FW_NORMAL;
+  if (weight == 0) {
+    weight = pdfium::kFontWeightNormal;
+  }
 
   if (!(flags & FXFONT_USEEXTERNATTR)) {
-    weight = FXFONT_FW_NORMAL;
+    weight = pdfium::kFontWeightNormal;
     italic_angle = 0;
   }
   const ByteString subst_name = GetSubstName(name, is_truetype);
@@ -640,8 +642,9 @@
   }
 
   const int old_weight = weight;
-  if (FontStyleIsForceBold(nStyle))
-    weight = FXFONT_FW_BOLD;
+  if (FontStyleIsForceBold(nStyle)) {
+    weight = pdfium::kFontWeightBold;
+  }
 
   if (ParseStyles(style, &is_style_available, &weight, &nStyle)) {
     family = subst_name;
@@ -673,19 +676,23 @@
         is_italic = italic_angle != 0;
         weight = old_weight;
       }
-      if (IsNarrowFontName(subst_name))
+      if (IsNarrowFontName(subst_name)) {
         family = kNarrowFamily;
+      }
     } else {
       subst_font->m_bSubstCJK = true;
-      if (nStyle)
-        subst_font->m_WeightCJK = nStyle ? weight : FXFONT_FW_NORMAL;
-      if (FontStyleIsItalic(nStyle))
+      if (nStyle) {
+        subst_font->m_WeightCJK = nStyle ? weight : pdfium::kFontWeightNormal;
+      }
+      if (FontStyleIsItalic(nStyle)) {
         subst_font->m_bItalicCJK = true;
+      }
     }
   } else {
     italic_angle = 0;
-    if (nStyle == FXFONT_NORMAL)
-      weight = FXFONT_FW_NORMAL;
+    if (nStyle == FXFONT_NORMAL) {
+      weight = pdfium::kFontWeightNormal;
+    }
   }
 
   if (!match.IsEmpty() || base_font < kNumStandardFonts) {
diff --git a/core/fxge/fx_font.h b/core/fxge/fx_font.h
index d2ef744..7d871f2 100644
--- a/core/fxge/fx_font.h
+++ b/core/fxge/fx_font.h
@@ -15,16 +15,23 @@
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/span.h"
 
+namespace pdfium {
+
+// Font weight values that are in use.
+enum FontWeight {
+  kFontWeightExtraLight = 100,
+  kFontWeightNormal = 400,
+  kFontWeightBold = 700,
+  kFontWeightExtraBold = 900,
+};
+
+}  // namespace pdfium
+
 /* Font pitch and family flags */
 #define FXFONT_FF_FIXEDPITCH (1 << 0)
 #define FXFONT_FF_ROMAN (1 << 4)
 #define FXFONT_FF_SCRIPT (4 << 4)
 
-/* Typical weight values */
-#define FXFONT_FW_NORMAL 400
-#define FXFONT_FW_BOLD 700
-#define FXFONT_FW_BOLD_BOLD 900
-
 /* Font styles as defined in PDF 1.7 Table 5.20 */
 #define FXFONT_NORMAL (0)
 #define FXFONT_FIXED_PITCH (1 << 0)
diff --git a/fpdfsdk/fpdf_sysfontinfo.cpp b/fpdfsdk/fpdf_sysfontinfo.cpp
index 04c3da0..15b9845 100644
--- a/fpdfsdk/fpdf_sysfontinfo.cpp
+++ b/fpdfsdk/fpdf_sysfontinfo.cpp
@@ -75,6 +75,9 @@
 static_assert(sizeof(CFX_Font::CharsetFontMap) == sizeof(FPDF_CharsetFontMap),
               "CFX_Font::CharsetFontMap must be same as FPDF_CharsetFontMap");
 
+static_assert(FXFONT_FW_NORMAL == pdfium::kFontWeightNormal);
+static_assert(FXFONT_FW_BOLD == pdfium::kFontWeightBold);
+
 class CFX_ExternalFontInfo final : public SystemFontInfoIface {
  public:
   explicit CFX_ExternalFontInfo(FPDF_SYSFONTINFO* pInfo) : m_pInfo(pInfo) {}
diff --git a/testing/fuzzers/pdf_bidi_fuzzer.cc b/testing/fuzzers/pdf_bidi_fuzzer.cc
index aeae3db..7db15d7 100644
--- a/testing/fuzzers/pdf_bidi_fuzzer.cc
+++ b/testing/fuzzers/pdf_bidi_fuzzer.cc
@@ -20,8 +20,8 @@
     return 0;
 
   auto font = std::make_unique<CFX_Font>();
-  font->LoadSubst("Arial", true, 0, FXFONT_FW_NORMAL, 0, FX_CodePage::kDefANSI,
-                  false);
+  font->LoadSubst("Arial", true, 0, pdfium::kFontWeightNormal, 0,
+                  FX_CodePage::kDefANSI, false);
   assert(font);
 
   CFGAS_RTFBreak rtf_break(CFGAS_Break::LayoutStyle::kExpandTab);
diff --git a/xfa/fgas/font/cfgas_gefont.cpp b/xfa/fgas/font/cfgas_gefont.cpp
index 8ed130e..13f3542 100644
--- a/xfa/fgas/font/cfgas_gefont.cpp
+++ b/xfa/fgas/font/cfgas_gefont.cpp
@@ -77,8 +77,9 @@
   if (pszFontFamily)
     csFontFamily = WideString(pszFontFamily).ToDefANSI();
 
-  int32_t iWeight =
-      FontStyleIsForceBold(dwFontStyles) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
+  int32_t iWeight = FontStyleIsForceBold(dwFontStyles)
+                        ? pdfium::kFontWeightBold
+                        : pdfium::kFontWeightNormal;
   m_pFont = std::make_unique<CFX_Font>();
   if (FontStyleIsItalic(dwFontStyles) && FontStyleIsForceBold(dwFontStyles))
     csFontFamily += ",BoldItalic";
@@ -139,13 +140,16 @@
   uint32_t dwStyles = 0;
   auto* pSubstFont = m_pFont->GetSubstFont();
   if (pSubstFont) {
-    if (pSubstFont->m_Weight == FXFONT_FW_BOLD)
+    if (pSubstFont->m_Weight == pdfium::kFontWeightBold) {
       dwStyles |= FXFONT_FORCE_BOLD;
+    }
   } else {
-    if (m_pFont->IsBold())
+    if (m_pFont->IsBold()) {
       dwStyles |= FXFONT_FORCE_BOLD;
-    if (m_pFont->IsItalic())
+    }
+    if (m_pFont->IsItalic()) {
       dwStyles |= FXFONT_ITALIC;
+    }
   }
   return dwStyles;
 }
diff --git a/xfa/fxfa/cxfa_textparser.cpp b/xfa/fxfa/cxfa_textparser.cpp
index 9abfdca..1c1b8d2 100644
--- a/xfa/fxfa/cxfa_textparser.cpp
+++ b/xfa/fxfa/cxfa_textparser.cpp
@@ -151,7 +151,8 @@
     pStyle->SetColor(font->GetColor());
     pStyle->SetFontStyle(font->IsItalic() ? CFX_CSSFontStyle::Italic
                                           : CFX_CSSFontStyle::Normal);
-    pStyle->SetFontWeight(font->IsBold() ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+    pStyle->SetFontWeight(font->IsBold() ? pdfium::kFontWeightBold
+                                         : pdfium::kFontWeightNormal);
     pStyle->SetNumberVerticalAlign(-font->GetBaselineShift());
     fFontSize = font->GetFontSize();
     CFX_CSSLength letterSpacing;
@@ -351,14 +352,17 @@
 
   if (pStyle) {
     std::optional<WideString> last_family = pStyle->GetLastFontFamily();
-    if (last_family.has_value())
+    if (last_family.has_value()) {
       wsFamily = last_family.value();
+    }
 
     dwStyle = 0;
-    if (pStyle->GetFontWeight() > FXFONT_FW_NORMAL)
+    if (pStyle->GetFontWeight() > pdfium::kFontWeightNormal) {
       dwStyle |= FXFONT_FORCE_BOLD;
-    if (pStyle->GetFontStyle() == CFX_CSSFontStyle::Italic)
+    }
+    if (pStyle->GetFontStyle() == CFX_CSSFontStyle::Italic) {
       dwStyle |= FXFONT_ITALIC;
+    }
   }
 
   CXFA_FontMgr* pFontMgr = doc->GetApp()->GetXFAFontMgr();