Add enum class fxge::FontEncoding
This enum class's values are the same as FreeType's. Use it in place of
FT_ENCODING_* in the code base. Also replace the existing constants in
cfx_unicodeencodingex.cpp.
Bug: pdfium:2037
Change-Id: I09d1c232b881d544b526f128f2aacc06c448a582
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/114771
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index f9beb2f..932a79d 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -195,26 +195,27 @@
#endif // !BUILDFLAG(IS_WIN)
void FT_UseCIDCharmap(FXFT_FaceRec* face, CIDCoding coding) {
- int encoding;
+ fxge::FontEncoding encoding;
switch (coding) {
case CIDCoding::kGB:
- encoding = FT_ENCODING_GB2312;
+ encoding = fxge::FontEncoding::kGB2312;
break;
case CIDCoding::kBIG5:
- encoding = FT_ENCODING_BIG5;
+ encoding = fxge::FontEncoding::kBig5;
break;
case CIDCoding::kJIS:
- encoding = FT_ENCODING_SJIS;
+ encoding = fxge::FontEncoding::kSjis;
break;
case CIDCoding::kKOREA:
- encoding = FT_ENCODING_JOHAB;
+ encoding = fxge::FontEncoding::kJohab;
break;
default:
- encoding = FT_ENCODING_UNICODE;
+ encoding = fxge::FontEncoding::kUnicode;
}
int err = FXFT_Select_Charmap(face, encoding);
if (err)
- err = FXFT_Select_Charmap(face, FT_ENCODING_UNICODE);
+ err = FXFT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
if (err && face->charmaps)
FT_Set_Charmap(face, face->charmaps[0]);
}
@@ -469,7 +470,9 @@
}
if (m_Font.GetFaceRec()) {
if (m_FontType == CIDFontType::kType1)
- FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE);
+ FXFT_Select_Charmap(
+ m_Font.GetFaceRec(),
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
else
FT_UseCIDCharmap(m_Font.GetFaceRec(), m_pCMap->GetCoding());
}
@@ -744,8 +747,8 @@
index = FT_Get_Char_Index(face, name_unicode);
} else {
DCHECK_EQ(base_encoding, FontEncoding::kMacRoman);
- uint32_t maccode = CharCodeFromUnicodeForFreetypeEncoding(
- FT_ENCODING_APPLE_ROMAN, name_unicode);
+ uint32_t maccode = CharCodeFromUnicodeForEncoding(
+ fxge::FontEncoding::kAppleRoman, name_unicode);
index = maccode ? FT_Get_Char_Index(face, maccode)
: FT_Get_Name_Index(face, name);
}
@@ -765,12 +768,14 @@
if (!face)
return unicode;
- int err = FXFT_Select_Charmap(face, FT_ENCODING_UNICODE);
+ int err = FXFT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
if (err) {
int i;
for (i = 0; i < face->num_charmaps; i++) {
- uint32_t ret = CharCodeFromUnicodeForFreetypeEncoding(
- FXFT_Get_Charmap_Encoding(face->charmaps[i]),
+ uint32_t ret = CharCodeFromUnicodeForEncoding(
+ static_cast<fxge::FontEncoding>(
+ FXFT_Get_Charmap_Encoding(face->charmaps[i])),
static_cast<wchar_t>(charcode));
if (ret == 0)
continue;
@@ -804,7 +809,8 @@
if (!charmap || m_pCMap->GetCoding() == CIDCoding::kUNKNOWN)
return cid;
- if (FXFT_Get_Charmap_Encoding(charmap) == FT_ENCODING_UNICODE) {
+ if (FXFT_Get_Charmap_Encoding(charmap) ==
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) {
WideString unicode_str = UnicodeFromCharCode(charcode);
if (unicode_str.IsEmpty())
return -1;
diff --git a/core/fpdfapi/font/cpdf_fontencoding.cpp b/core/fpdfapi/font/cpdf_fontencoding.cpp
index 9ac25aa..7ed59c0 100644
--- a/core/fpdfapi/font/cpdf_fontencoding.cpp
+++ b/core/fpdfapi/font/cpdf_fontencoding.cpp
@@ -14,8 +14,8 @@
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/fpdf_parser_decode.h"
-#include "core/fxge/freetype/fx_freetype.h"
#include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace {
@@ -1735,24 +1735,26 @@
return pDict;
}
-uint32_t CharCodeFromUnicodeForFreetypeEncoding(int encoding, wchar_t unicode) {
+uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding,
+ wchar_t unicode) {
switch (encoding) {
- case FT_ENCODING_UNICODE:
+ case fxge::FontEncoding::kUnicode:
return unicode;
- case FT_ENCODING_ADOBE_STANDARD:
+ case fxge::FontEncoding::kAdobeStandard:
return PDF_FindCode(kStandardEncoding, unicode);
- case FT_ENCODING_ADOBE_EXPERT:
+ case fxge::FontEncoding::kAdobeExpert:
return PDF_FindCode(kMacExpertEncoding, unicode);
- case FT_ENCODING_ADOBE_LATIN_1:
+ case fxge::FontEncoding::kLatin1:
return PDF_FindCode(kAdobeWinAnsiEncoding, unicode);
- case FT_ENCODING_APPLE_ROMAN:
+ case fxge::FontEncoding::kAppleRoman:
return PDF_FindCode(kMacRomanEncoding, unicode);
- case FT_ENCODING_ADOBE_CUSTOM:
+ case fxge::FontEncoding::kAdobeCustom:
return PDF_FindCode(kPDFDocEncoding, unicode);
- case FT_ENCODING_MS_SYMBOL:
+ case fxge::FontEncoding::kSymbol:
return PDF_FindCode(kMSSymbolEncoding, unicode);
+ default:
+ return 0;
}
- return 0;
}
wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode) {
diff --git a/core/fpdfapi/font/cpdf_fontencoding.h b/core/fpdfapi/font/cpdf_fontencoding.h
index 3553400..c0a5e6c 100644
--- a/core/fpdfapi/font/cpdf_fontencoding.h
+++ b/core/fpdfapi/font/cpdf_fontencoding.h
@@ -11,6 +11,7 @@
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/string_pool_template.h"
#include "core/fxcrt/weak_ptr.h"
+#include "core/fxge/fx_fontencoding.h"
#include "third_party/base/containers/span.h"
enum class FontEncoding {
@@ -25,7 +26,13 @@
kMsSymbol = 8,
};
-uint32_t CharCodeFromUnicodeForFreetypeEncoding(int encoding, wchar_t unicode);
+// For `encoding`, the caller can safely cast any FreeType FT_ENCODING_* value
+// into fxge::FontEncoding.
+// TODO(crbug.com/pdfium/2037): Always pass in fxge::FontEncoding values and
+// remove this comment.
+uint32_t CharCodeFromUnicodeForEncoding(fxge::FontEncoding encoding,
+ wchar_t unicode);
+
wchar_t UnicodeFromAppleRomanCharCode(uint8_t charcode);
pdfium::span<const uint16_t> UnicodesForPredefinedCharSet(
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp
index 5a01950..e090a25 100644
--- a/core/fpdfapi/font/cpdf_truetypefont.cpp
+++ b/core/fpdfapi/font/cpdf_truetypefont.cpp
@@ -86,8 +86,8 @@
m_GlyphIndex[charcode] =
FT_Get_Char_Index(face, m_Encoding.UnicodeFromCharCode(charcode));
} else if (charmap_type == CharmapType::kMacRoman) {
- uint32_t maccode = CharCodeFromUnicodeForFreetypeEncoding(
- FT_ENCODING_APPLE_ROMAN,
+ uint32_t maccode = CharCodeFromUnicodeForEncoding(
+ fxge::FontEncoding::kAppleRoman,
m_Encoding.UnicodeFromCharCode(charcode));
if (!maccode) {
m_GlyphIndex[charcode] = FT_Get_Name_Index(face, name);
@@ -144,7 +144,8 @@
if (m_pFontFile || HasAnyGlyphIndex())
return;
}
- if (FXFT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0) {
+ if (FXFT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0) {
pdfium::span<const uint16_t> unicodes =
UnicodesForPredefinedCharSet(base_encoding);
for (uint32_t charcode = 0; charcode < 256; charcode++) {
diff --git a/core/fpdfapi/font/cpdf_type1font.cpp b/core/fpdfapi/font/cpdf_type1font.cpp
index 55510e7..5e33da4 100644
--- a/core/fpdfapi/font/cpdf_type1font.cpp
+++ b/core/fpdfapi/font/cpdf_type1font.cpp
@@ -53,7 +53,8 @@
return false;
bool is_first_charmap_unicode =
- FXFT_Get_Charmap_Encoding(face->charmaps[0]) == FT_ENCODING_UNICODE;
+ FXFT_Get_Charmap_Encoding(face->charmaps[0]) ==
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode);
if (face->num_charmaps == 1 && is_first_charmap_unicode)
return false;
@@ -165,7 +166,8 @@
return;
}
}
- FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE);
+ FXFT_Select_Charmap(m_Font.GetFaceRec(),
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
if (m_BaseEncoding == FontEncoding::kBuiltin)
m_BaseEncoding = FontEncoding::kStandard;
@@ -225,7 +227,9 @@
}
bool bUnicode =
- FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE) == 0;
+ FXFT_Select_Charmap(
+ m_Font.GetFaceRec(),
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0;
for (uint32_t charcode = 0; charcode < kInternalTableSize; charcode++) {
const char* name =
GetAdobeCharName(m_BaseEncoding, m_CharNames, charcode);
@@ -286,7 +290,9 @@
}
bool bUnicode =
- FXFT_Select_Charmap(m_Font.GetFaceRec(), FT_ENCODING_UNICODE) == 0;
+ FXFT_Select_Charmap(
+ m_Font.GetFaceRec(),
+ static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0;
for (size_t charcode = 0; charcode < kInternalTableSize; charcode++) {
const char* name = GetAdobeCharName(m_BaseEncoding, m_CharNames,
static_cast<uint32_t>(charcode));
diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn
index f647432..b7b1b0d 100644
--- a/core/fxge/BUILD.gn
+++ b/core/fxge/BUILD.gn
@@ -98,6 +98,8 @@
"freetype/fx_freetype.h",
"fx_font.cpp",
"fx_font.h",
+ "fx_fontencoding.cpp",
+ "fx_fontencoding.h",
"render_defines.h",
"renderdevicedriver_iface.cpp",
"renderdevicedriver_iface.h",
diff --git a/core/fxge/android/cfpf_skiafont.cpp b/core/fxge/android/cfpf_skiafont.cpp
index 47423e5..ab6ca81 100644
--- a/core/fxge/android/cfpf_skiafont.cpp
+++ b/core/fxge/android/cfpf_skiafont.cpp
@@ -14,6 +14,7 @@
#include "core/fxge/android/cfpf_skiafontmgr.h"
#include "core/fxge/android/cfpf_skiapathfont.h"
#include "core/fxge/freetype/fx_freetype.h"
+#include "core/fxge/fx_fontencoding.h"
#include "third_party/base/numerics/safe_conversions.h"
#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em)
@@ -45,8 +46,10 @@
int32_t CFPF_SkiaFont::GetGlyphIndex(wchar_t wUnicode) {
if (!m_Face)
return wUnicode;
- if (FXFT_Select_Charmap(GetFaceRec(), FT_ENCODING_UNICODE))
+ if (FXFT_Select_Charmap(GetFaceRec(), static_cast<FT_Encoding>(
+ fxge::FontEncoding::kUnicode))) {
return 0;
+ }
return FT_Get_Char_Index(GetFaceRec(), wUnicode);
}
diff --git a/core/fxge/cfx_unicodeencoding.cpp b/core/fxge/cfx_unicodeencoding.cpp
index b8f818a..309ba4a 100644
--- a/core/fxge/cfx_unicodeencoding.cpp
+++ b/core/fxge/cfx_unicodeencoding.cpp
@@ -11,6 +11,7 @@
#include "core/fxge/cfx_substfont.h"
#include "core/fxge/freetype/fx_freetype.h"
#include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
CFX_UnicodeEncoding::CFX_UnicodeEncoding(const CFX_Font* pFont)
: m_pFont(pFont) {}
@@ -22,16 +23,23 @@
if (!face)
return charcode;
- if (FT_Select_Charmap(face, FT_ENCODING_UNICODE) == 0)
+ if (FT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode)) == 0) {
return FT_Get_Char_Index(face, charcode);
+ }
if (m_pFont->GetSubstFont() &&
m_pFont->GetSubstFont()->m_Charset == FX_Charset::kSymbol) {
uint32_t index = 0;
- if (FT_Select_Charmap(face, FT_ENCODING_MS_SYMBOL) == 0)
+ if (FT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kSymbol)) == 0) {
index = FT_Get_Char_Index(face, charcode);
- if (!index && !FT_Select_Charmap(face, FT_ENCODING_APPLE_ROMAN))
+ }
+ if (!index &&
+ !FT_Select_Charmap(
+ face, static_cast<FT_Encoding>(fxge::FontEncoding::kAppleRoman))) {
return FT_Get_Char_Index(face, charcode);
+ }
}
return charcode;
}
diff --git a/core/fxge/cfx_unicodeencodingex.cpp b/core/fxge/cfx_unicodeencodingex.cpp
index 683e2d0..c757599 100644
--- a/core/fxge/cfx_unicodeencodingex.cpp
+++ b/core/fxge/cfx_unicodeencodingex.cpp
@@ -11,48 +11,35 @@
#include "core/fxge/cfx_font.h"
#include "core/fxge/freetype/fx_freetype.h"
#include "core/fxge/fx_font.h"
-
-#define ENC_TAG(a, b, c, d) \
- (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | \
- (uint32_t)(d))
+#include "core/fxge/fx_fontencoding.h"
namespace {
-constexpr uint32_t kEncodingExSymbol = ENC_TAG('s', 'y', 'm', 'b');
-constexpr uint32_t kEncodingExUnicode = ENC_TAG('u', 'n', 'i', 'c');
-constexpr uint32_t kEncodingExSjis = ENC_TAG('s', 'j', 'i', 's');
-constexpr uint32_t kEncodingExGB2312 = ENC_TAG('g', 'b', ' ', ' ');
-constexpr uint32_t kEncodingExBig5 = ENC_TAG('b', 'i', 'g', '5');
-constexpr uint32_t kEncodingExWansung = ENC_TAG('w', 'a', 'n', 's');
-constexpr uint32_t kEncodingExJohab = ENC_TAG('j', 'o', 'h', 'a');
-constexpr uint32_t kEncodingExAdobeStandard = ENC_TAG('A', 'D', 'O', 'B');
-constexpr uint32_t kEncodingExAdobeExpert = ENC_TAG('A', 'D', 'B', 'E');
-constexpr uint32_t kEncodingExAdobeCustom = ENC_TAG('A', 'D', 'B', 'C');
-constexpr uint32_t kEncodingExLatin1 = ENC_TAG('l', 'a', 't', '1');
-constexpr uint32_t kEncodingExOldLatin2 = ENC_TAG('l', 'a', 't', '2');
-constexpr uint32_t kEncodingExAppleRoman = ENC_TAG('a', 'r', 'm', 'n');
-
-constexpr uint32_t kEncodingID[] = {
- kEncodingExSymbol, kEncodingExUnicode, kEncodingExSjis,
- kEncodingExGB2312, kEncodingExBig5, kEncodingExWansung,
- kEncodingExJohab, kEncodingExAdobeStandard, kEncodingExAdobeExpert,
- kEncodingExAdobeCustom, kEncodingExLatin1, kEncodingExOldLatin2,
- kEncodingExAppleRoman,
+constexpr fxge::FontEncoding kEncodingIDs[] = {
+ fxge::FontEncoding::kSymbol, fxge::FontEncoding::kUnicode,
+ fxge::FontEncoding::kSjis, fxge::FontEncoding::kGB2312,
+ fxge::FontEncoding::kBig5, fxge::FontEncoding::kWansung,
+ fxge::FontEncoding::kJohab, fxge::FontEncoding::kAdobeStandard,
+ fxge::FontEncoding::kAdobeExpert, fxge::FontEncoding::kAdobeCustom,
+ fxge::FontEncoding::kLatin1, fxge::FontEncoding::kOldLatin2,
+ fxge::FontEncoding::kAppleRoman,
};
std::unique_ptr<CFX_UnicodeEncodingEx> FXFM_CreateFontEncoding(
CFX_Font* pFont,
- uint32_t nEncodingID) {
- if (FXFT_Select_Charmap(pFont->GetFaceRec(), nEncodingID))
+ fxge::FontEncoding encoding_id) {
+ if (FXFT_Select_Charmap(pFont->GetFaceRec(),
+ static_cast<FT_Encoding>(encoding_id))) {
return nullptr;
- return std::make_unique<CFX_UnicodeEncodingEx>(pFont, nEncodingID);
+ }
+ return std::make_unique<CFX_UnicodeEncodingEx>(pFont, encoding_id);
}
} // namespace
CFX_UnicodeEncodingEx::CFX_UnicodeEncodingEx(CFX_Font* pFont,
- uint32_t EncodingID)
- : CFX_UnicodeEncoding(pFont), m_nEncodingID(EncodingID) {}
+ fxge::FontEncoding encoding_id)
+ : CFX_UnicodeEncoding(pFont), encoding_id_(encoding_id) {}
CFX_UnicodeEncodingEx::~CFX_UnicodeEncodingEx() = default;
@@ -63,31 +50,36 @@
return nIndex;
int m = 0;
while (m < face->num_charmaps) {
- uint32_t nEncodingID = FXFT_Get_Charmap_Encoding(face->charmaps[m++]);
- if (m_nEncodingID == nEncodingID)
+ auto encoding_id = static_cast<fxge::FontEncoding>(
+ FXFT_Get_Charmap_Encoding(face->charmaps[m++]));
+ if (encoding_id_ == encoding_id) {
continue;
- int error = FXFT_Select_Charmap(face, nEncodingID);
+ }
+ int error =
+ FXFT_Select_Charmap(face, static_cast<FT_Encoding>(encoding_id));
if (error)
continue;
nIndex = FT_Get_Char_Index(face, charcode);
if (nIndex > 0) {
- m_nEncodingID = nEncodingID;
+ encoding_id_ = encoding_id;
return nIndex;
}
}
- FXFT_Select_Charmap(face, m_nEncodingID);
+ FXFT_Select_Charmap(face, static_cast<FT_Encoding>(encoding_id_));
return 0;
}
uint32_t CFX_UnicodeEncodingEx::CharCodeFromUnicode(wchar_t Unicode) const {
- if (m_nEncodingID == kEncodingExUnicode ||
- m_nEncodingID == kEncodingExSymbol) {
+ if (encoding_id_ == fxge::FontEncoding::kUnicode ||
+ encoding_id_ == fxge::FontEncoding::kSymbol) {
return Unicode;
}
FXFT_FaceRec* face = m_pFont->GetFaceRec();
for (int i = 0; i < face->num_charmaps; i++) {
- int nEncodingID = FXFT_Get_Charmap_Encoding(face->charmaps[i]);
- if (nEncodingID == kEncodingExUnicode || nEncodingID == kEncodingExSymbol) {
+ auto encoding_id = static_cast<fxge::FontEncoding>(
+ FXFT_Get_Charmap_Encoding(face->charmaps[i]));
+ if (encoding_id == fxge::FontEncoding::kUnicode ||
+ encoding_id == fxge::FontEncoding::kSymbol) {
return Unicode;
}
}
@@ -99,7 +91,7 @@
if (!pFont || !pFont->GetFaceRec())
return nullptr;
- for (uint32_t id : kEncodingID) {
+ for (fxge::FontEncoding id : kEncodingIDs) {
auto pFontEncoding = FXFM_CreateFontEncoding(pFont, id);
if (pFontEncoding)
return pFontEncoding;
diff --git a/core/fxge/cfx_unicodeencodingex.h b/core/fxge/cfx_unicodeencodingex.h
index da87d7e..306ca68 100644
--- a/core/fxge/cfx_unicodeencodingex.h
+++ b/core/fxge/cfx_unicodeencodingex.h
@@ -11,13 +11,15 @@
#include <memory>
+#include "core/fxge/cfx_face.h"
#include "core/fxge/cfx_unicodeencoding.h"
+#include "core/fxge/fx_fontencoding.h"
class CFX_UnicodeEncodingEx final : public CFX_UnicodeEncoding {
public:
static constexpr uint32_t kInvalidCharCode = static_cast<uint32_t>(-1);
- CFX_UnicodeEncodingEx(CFX_Font* pFont, uint32_t EncodingID);
+ CFX_UnicodeEncodingEx(CFX_Font* pFont, fxge::FontEncoding encoding_id);
~CFX_UnicodeEncodingEx() override;
// CFX_UnicodeEncoding:
@@ -27,7 +29,7 @@
uint32_t CharCodeFromUnicode(wchar_t Unicode) const;
private:
- uint32_t m_nEncodingID;
+ fxge::FontEncoding encoding_id_;
};
std::unique_ptr<CFX_UnicodeEncodingEx> FX_CreateFontEncodingEx(CFX_Font* pFont);
diff --git a/core/fxge/fx_fontencoding.cpp b/core/fxge/fx_fontencoding.cpp
new file mode 100644
index 0000000..46b3e5b
--- /dev/null
+++ b/core/fxge/fx_fontencoding.cpp
@@ -0,0 +1,47 @@
+// Copyright 2023 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/fxge/fx_fontencoding.h"
+
+#include "core/fxge/freetype/fx_freetype.h"
+
+namespace fxge {
+
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeCustom) ==
+ FT_ENCODING_ADOBE_CUSTOM,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeExpert) ==
+ FT_ENCODING_ADOBE_EXPERT,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAdobeStandard) ==
+ FT_ENCODING_ADOBE_STANDARD,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kAppleRoman) ==
+ FT_ENCODING_APPLE_ROMAN,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kBig5) == FT_ENCODING_BIG5,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kGB2312) == FT_ENCODING_PRC,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kJohab) == FT_ENCODING_JOHAB,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kLatin1) ==
+ FT_ENCODING_ADOBE_LATIN_1,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kOldLatin2) ==
+ FT_ENCODING_OLD_LATIN_2,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kSjis) == FT_ENCODING_SJIS,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kSymbol) ==
+ FT_ENCODING_MS_SYMBOL,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kUnicode) ==
+ FT_ENCODING_UNICODE,
+ "wrong encoding");
+static_assert(static_cast<uint32_t>(FontEncoding::kWansung) ==
+ FT_ENCODING_WANSUNG,
+ "wrong encoding");
+
+} // namespace fxge
diff --git a/core/fxge/fx_fontencoding.h b/core/fxge/fx_fontencoding.h
new file mode 100644
index 0000000..d81ae8b
--- /dev/null
+++ b/core/fxge/fx_fontencoding.h
@@ -0,0 +1,33 @@
+// Copyright 2023 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CORE_FXGE_FX_FONTENCODING_H_
+#define CORE_FXGE_FX_FONTENCODING_H_
+
+#include <stdint.h>
+
+#include "core/fxcrt/fx_string.h"
+
+namespace fxge {
+
+// The values here match FreeType FT_Encoding values with similar names.
+enum class FontEncoding : uint32_t {
+ kAdobeCustom = FXBSTR_ID('A', 'D', 'B', 'C'),
+ kAdobeExpert = FXBSTR_ID('A', 'D', 'B', 'E'),
+ kAdobeStandard = FXBSTR_ID('A', 'D', 'O', 'B'),
+ kAppleRoman = FXBSTR_ID('a', 'r', 'm', 'n'),
+ kBig5 = FXBSTR_ID('b', 'i', 'g', '5'),
+ kGB2312 = FXBSTR_ID('g', 'b', ' ', ' '),
+ kJohab = FXBSTR_ID('j', 'o', 'h', 'a'),
+ kLatin1 = FXBSTR_ID('l', 'a', 't', '1'),
+ kOldLatin2 = FXBSTR_ID('l', 'a', 't', '2'),
+ kSjis = FXBSTR_ID('s', 'j', 'i', 's'),
+ kSymbol = FXBSTR_ID('s', 'y', 'm', 'b'),
+ kUnicode = FXBSTR_ID('u', 'n', 'i', 'c'),
+ kWansung = FXBSTR_ID('w', 'a', 'n', 's'),
+};
+
+} // namespace fxge
+
+#endif // CORE_FXGE_FX_FONTENCODING_H_
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
index 0d36325..ebaf4de 100644
--- a/xfa/fgas/font/cfgas_fontmgr.cpp
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp
@@ -26,6 +26,7 @@
#include "core/fxge/cfx_fontmgr.h"
#include "core/fxge/cfx_gemodule.h"
#include "core/fxge/fx_font.h"
+#include "core/fxge/fx_fontencoding.h"
#include "third_party/base/check.h"
#include "third_party/base/containers/contains.h"
#include "third_party/base/containers/span.h"
@@ -42,8 +43,10 @@
FXFT_FaceRec* pFaceRec = pFace->GetRec();
FT_CharMap charmap = pFaceRec->charmap;
- if (FXFT_Select_Charmap(pFaceRec, FT_ENCODING_UNICODE) != 0)
+ if (FXFT_Select_Charmap(pFaceRec, static_cast<FT_Encoding>(
+ fxge::FontEncoding::kUnicode)) != 0) {
return false;
+ }
if (FT_Get_Char_Index(pFaceRec, wcUnicode) == 0) {
FT_Set_Charmap(pFaceRec, charmap);
@@ -548,8 +551,8 @@
if (!pFace)
return false;
- FT_Error retCharmap =
- FXFT_Select_Charmap(pFace->GetRec(), FT_ENCODING_UNICODE);
+ FT_Error retCharmap = FXFT_Select_Charmap(
+ pFace->GetRec(), static_cast<FT_Encoding>(fxge::FontEncoding::kUnicode));
FT_Error retIndex = FT_Get_Char_Index(pFace->GetRec(), wcUnicode);
pFace->ClearExternalStream();