| Index: core/src/fxge/ge/fx_ge_fontmap.cpp
|
| diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| index 90b3c52546fe03e2fc9d01085300e7d6289daae4..826caa0b18bb43f375db3971f34e3c43c4b5df2b 100644
|
| --- a/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| +++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| @@ -1407,6 +1407,105 @@ void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path,
|
| }
|
| m_FontList[facename] = pInfo;
|
| }
|
| +static const struct {
|
| + const FX_CHAR* m_pName;
|
| + const FX_CHAR* m_pSubstName;
|
| +} Base14Substs[] = {
|
| + {"Courier", "Courier New"},
|
| + {"Courier-Bold", "Courier New Bold"},
|
| + {"Courier-BoldOblique", "Courier New Bold Italic"},
|
| + {"Courier-Oblique", "Courier New Italic"},
|
| + {"Helvetica", "Arial"},
|
| + {"Helvetica-Bold", "Arial Bold"},
|
| + {"Helvetica-BoldOblique", "Arial Bold Italic"},
|
| + {"Helvetica-Oblique", "Arial Italic"},
|
| + {"Times-Roman", "Times New Roman"},
|
| + {"Times-Bold", "Times New Roman Bold"},
|
| + {"Times-BoldItalic", "Times New Roman Bold Italic"},
|
| + {"Times-Italic", "Times New Roman Italic"},
|
| +};
|
| +void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) {
|
| + for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs);
|
| + iBaseFont++) {
|
| + if (face == Base14Substs[iBaseFont].m_pName) {
|
| + return GetFont(Base14Substs[iBaseFont].m_pSubstName);
|
| + }
|
| + }
|
| + return nullptr;
|
| +}
|
| +static FX_DWORD _GetCharset(int charset) {
|
| + switch (charset) {
|
| + case FXFONT_SHIFTJIS_CHARSET:
|
| + return CHARSET_FLAG_SHIFTJIS;
|
| + case FXFONT_GB2312_CHARSET:
|
| + return CHARSET_FLAG_GB;
|
| + case FXFONT_CHINESEBIG5_CHARSET:
|
| + return CHARSET_FLAG_BIG5;
|
| + case FXFONT_HANGEUL_CHARSET:
|
| + return CHARSET_FLAG_KOREAN;
|
| + case FXFONT_SYMBOL_CHARSET:
|
| + return CHARSET_FLAG_SYMBOL;
|
| + case FXFONT_ANSI_CHARSET:
|
| + return CHARSET_FLAG_ANSI;
|
| + default:
|
| + break;
|
| + }
|
| + return 0;
|
| +}
|
| +static int32_t _GetSimilarValue(int weight,
|
| + FX_BOOL bItalic,
|
| + int pitch_family,
|
| + FX_DWORD style) {
|
| + int32_t iSimilarValue = 0;
|
| + if ((style & FXFONT_BOLD) == (weight > 400)) {
|
| + iSimilarValue += 16;
|
| + }
|
| + if ((style & FXFONT_ITALIC) == bItalic) {
|
| + iSimilarValue += 16;
|
| + }
|
| + if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
|
| + iSimilarValue += 16;
|
| + }
|
| + if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
|
| + iSimilarValue += 8;
|
| + }
|
| + if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
|
| + iSimilarValue += 8;
|
| + }
|
| + return iSimilarValue;
|
| +}
|
| +void* CFX_FolderFontInfo::FindFont(int weight,
|
| + FX_BOOL bItalic,
|
| + int charset,
|
| + int pitch_family,
|
| + const FX_CHAR* family,
|
| + FX_BOOL bMatchName) {
|
| + CFX_FontFaceInfo* pFind = nullptr;
|
| + if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
|
| + return GetFont("Courier New");
|
| + }
|
| + FX_DWORD charset_flag = _GetCharset(charset);
|
| + int32_t iBestSimilar = 0;
|
| + for (const auto& it : m_FontList) {
|
| + const CFX_ByteString& bsName = it.first;
|
| + CFX_FontFaceInfo* pFont = it.second;
|
| + if (!(pFont->m_Charsets & charset_flag) &&
|
| + charset != FXFONT_DEFAULT_CHARSET) {
|
| + continue;
|
| + }
|
| + int32_t index = bsName.Find(family);
|
| + if (bMatchName && index < 0) {
|
| + continue;
|
| + }
|
| + int32_t iSimilarValue =
|
| + _GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
|
| + if (iSimilarValue > iBestSimilar) {
|
| + iBestSimilar = iSimilarValue;
|
| + pFind = pFont;
|
| + }
|
| + }
|
| + return pFind;
|
| +}
|
| void* CFX_FolderFontInfo::MapFont(int weight,
|
| FX_BOOL bItalic,
|
| int charset,
|
|
|