| Index: core/fxge/ge/cfx_fontmapper.cpp
|
| diff --git a/core/fxge/ge/cfx_fontmapper.cpp b/core/fxge/ge/cfx_fontmapper.cpp
|
| index 9486932f61d441101c176d00047c172d82f393b1..56bfdcac5e73a0c096d519cd23c10bf972e8c28c 100644
|
| --- a/core/fxge/ge/cfx_fontmapper.cpp
|
| +++ b/core/fxge/ge/cfx_fontmapper.cpp
|
| @@ -6,6 +6,10 @@
|
|
|
| #include "core/fxge/include/cfx_fontmapper.h"
|
|
|
| +#include <memory>
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| #include "core/fxge/include/ifx_systemfontinfo.h"
|
| #include "core/fxge/include/fx_font.h"
|
|
|
| @@ -18,6 +22,8 @@
|
|
|
| namespace {
|
|
|
| +const int kExternalFontIndex = 12;
|
| +
|
| const FX_CHAR* const g_Base14FontNames[14] = {
|
| "Courier",
|
| "Courier-Bold",
|
| @@ -161,14 +167,16 @@ const struct CODEPAGE_MAP {
|
|
|
| int CompareFontFamilyString(const void* key, const void* element) {
|
| CFX_ByteString str_key((const FX_CHAR*)key);
|
| - if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1)
|
| + const AltFontFamily* family = reinterpret_cast<const AltFontFamily*>(element);
|
| + if (str_key.Find(family->m_pFontName) != -1)
|
| return 0;
|
| - return FXSYS_stricmp((const FX_CHAR*)key,
|
| - ((AltFontFamily*)element)->m_pFontName);
|
| + return FXSYS_stricmp(reinterpret_cast<const FX_CHAR*>(key),
|
| + family->m_pFontName);
|
| }
|
|
|
| int CompareString(const void* key, const void* element) {
|
| - return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName);
|
| + return FXSYS_stricmp(reinterpret_cast<const FX_CHAR*>(key),
|
| + reinterpret_cast<const AltFontName*>(element)->m_pName);
|
| }
|
|
|
| CFX_ByteString TT_NormalizeName(const FX_CHAR* family) {
|
| @@ -208,10 +216,9 @@ CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) {
|
| fontName = "FreeStyleScript";
|
| return fontName;
|
| }
|
| - AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch(
|
| - fontName.c_str(), g_AltFontFamilies,
|
| - sizeof g_AltFontFamilies / sizeof(AltFontFamily), sizeof(AltFontFamily),
|
| - CompareFontFamilyString);
|
| + AltFontFamily* found = reinterpret_cast<AltFontFamily*>(FXSYS_bsearch(
|
| + fontName.c_str(), g_AltFontFamilies, FX_ArraySize(g_AltFontFamilies),
|
| + sizeof(AltFontFamily), CompareFontFamilyString));
|
| return found ? CFX_ByteString(found->m_pFontFamily) : fontName;
|
| }
|
|
|
| @@ -228,21 +235,22 @@ CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) {
|
| return buf.MakeString();
|
| }
|
|
|
| -int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) {
|
| +int32_t GetStyleType(const CFX_ByteString& bsStyle, bool bReverse) {
|
| int32_t iLen = bsStyle.GetLength();
|
| if (!iLen)
|
| return -1;
|
| - int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
|
| + int iSize = FX_ArraySize(g_FontStyles);
|
| const FX_FontStyle* pStyle = nullptr;
|
| for (int i = iSize - 1; i >= 0; --i) {
|
| pStyle = g_FontStyles + i;
|
| if (!pStyle || pStyle->len > iLen)
|
| continue;
|
| - if (!bRevert) {
|
| - if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0)
|
| +
|
| + if (bReverse) {
|
| + if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0)
|
| return i;
|
| } else {
|
| - if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0)
|
| + if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0)
|
| return i;
|
| }
|
| }
|
| @@ -378,7 +386,7 @@ FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont,
|
| int italic_angle,
|
| int weight,
|
| int picthfamily) {
|
| - if (iBaseFont < 12) {
|
| + if (iBaseFont < kExternalFontIndex) {
|
| if (m_FoxitFaces[iBaseFont])
|
| return m_FoxitFaces[iBaseFont];
|
| const uint8_t* pFontData = nullptr;
|
| @@ -425,7 +433,7 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| italic_angle = 0;
|
| }
|
| CFX_ByteString SubstName = name;
|
| - SubstName.Remove(0x20);
|
| + SubstName.Remove(' ');
|
| if (bTrueType && name[0] == '@')
|
| SubstName = name.Mid(1);
|
| PDF_GetStandardFontName(&SubstName);
|
| @@ -454,27 +462,28 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| return m_FoxitFaces[13];
|
| }
|
| int iBaseFont = 0;
|
| - CFX_ByteString family, style;
|
| - FX_BOOL bHasComma = FALSE;
|
| - FX_BOOL bHasHypen = FALSE;
|
| + CFX_ByteString family;
|
| + CFX_ByteString style;
|
| + bool bHasComma = false;
|
| + bool bHasHyphen = false;
|
| int find = SubstName.Find(",", 0);
|
| if (find >= 0) {
|
| family = SubstName.Left(find);
|
| PDF_GetStandardFontName(&family);
|
| style = SubstName.Mid(find + 1);
|
| - bHasComma = TRUE;
|
| + bHasComma = true;
|
| } else {
|
| family = SubstName;
|
| }
|
| - for (; iBaseFont < 12; iBaseFont++) {
|
| + for (; iBaseFont < kExternalFontIndex; iBaseFont++) {
|
| if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont]))
|
| break;
|
| }
|
| int PitchFamily = 0;
|
| - FX_BOOL bItalic = FALSE;
|
| + bool bItalic = false;
|
| uint32_t nStyle = 0;
|
| - FX_BOOL bStyleAvail = FALSE;
|
| - if (iBaseFont < 12) {
|
| + bool bStyleAvail = false;
|
| + if (iBaseFont < kExternalFontIndex) {
|
| if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2)
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| if ((iBaseFont % 4) / 2)
|
| @@ -489,19 +498,19 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| if (find >= 0) {
|
| style = family.Mid(find + 1);
|
| family = family.Left(find);
|
| - bHasHypen = TRUE;
|
| + bHasHyphen = true;
|
| }
|
| }
|
| - if (!bHasHypen) {
|
| + if (!bHasHyphen) {
|
| int nLen = family.GetLength();
|
| - int32_t nRet = GetStyleType(family, TRUE);
|
| + int32_t nRet = GetStyleType(family, true);
|
| if (nRet > -1) {
|
| family = family.Left(nLen - g_FontStyles[nRet].len);
|
| if (nRet == 0)
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - if (nRet == 1)
|
| + else if (nRet == 1)
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| - if (nRet == 2)
|
| + else if (nRet == 2)
|
| nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
|
| }
|
| }
|
| @@ -511,41 +520,41 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| int nLen = style.GetLength();
|
| const FX_CHAR* pStyle = style.c_str();
|
| int i = 0;
|
| - FX_BOOL bFirstItem = TRUE;
|
| + bool bFirstItem = true;
|
| CFX_ByteString buf;
|
| while (i < nLen) {
|
| buf = ParseStyle(pStyle, nLen, i);
|
| - int32_t nRet = GetStyleType(buf, FALSE);
|
| + int32_t nRet = GetStyleType(buf, false);
|
| if ((i && !bStyleAvail) || (!i && nRet < 0)) {
|
| family = SubstName;
|
| - iBaseFont = 12;
|
| + iBaseFont = kExternalFontIndex;
|
| break;
|
| - } else if (nRet >= 0) {
|
| - bStyleAvail = TRUE;
|
| }
|
| - if (nRet == 0) {
|
| - if (nStyle & FX_FONT_STYLE_Bold)
|
| - nStyle |= FX_FONT_STYLE_BoldBold;
|
| - else
|
| - nStyle |= FX_FONT_STYLE_Bold;
|
| - bFirstItem = FALSE;
|
| + if (nRet >= 0) {
|
| + bStyleAvail = true;
|
| }
|
| if (nRet == 1) {
|
| if (bFirstItem) {
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| } else {
|
| family = SubstName;
|
| - iBaseFont = 12;
|
| + iBaseFont = kExternalFontIndex;
|
| }
|
| break;
|
| }
|
| - if (nRet == 2) {
|
| + if (nRet == 0) {
|
| + if (nStyle & FX_FONT_STYLE_Bold)
|
| + nStyle |= FX_FONT_STYLE_BoldBold;
|
| + else
|
| + nStyle |= FX_FONT_STYLE_Bold;
|
| + bFirstItem = false;
|
| + } else if (nRet == 2) {
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| if (nStyle & FX_FONT_STYLE_Bold)
|
| nStyle |= FX_FONT_STYLE_BoldBold;
|
| else
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - bFirstItem = FALSE;
|
| + bFirstItem = false;
|
| }
|
| i += buf.GetLength() + 1;
|
| }
|
| @@ -559,19 +568,17 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
|
| }
|
| if (nStyle & FX_FONT_STYLE_Italic)
|
| - bItalic = TRUE;
|
| - FX_BOOL bCJK = FALSE;
|
| + bItalic = true;
|
| int iExact = 0;
|
| int Charset = FXFONT_ANSI_CHARSET;
|
| if (WindowCP)
|
| Charset = GetCharsetFromCodePage(WindowCP);
|
| - else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC))
|
| + else if (iBaseFont == kExternalFontIndex && (flags & FXFONT_SYMBOLIC))
|
| Charset = FXFONT_SYMBOL_CHARSET;
|
| - if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
|
| - Charset == FXFONT_HANGEUL_CHARSET ||
|
| - Charset == FXFONT_CHINESEBIG5_CHARSET) {
|
| - bCJK = TRUE;
|
| - }
|
| + bool bCJK =
|
| + (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
|
| + Charset == FXFONT_HANGEUL_CHARSET ||
|
| + Charset == FXFONT_CHINESEBIG5_CHARSET);
|
| if (!m_pFontInfo) {
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight,
|
| @@ -580,24 +587,19 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| family = GetFontFamily(family, nStyle);
|
| CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str()));
|
| if (match.IsEmpty() && family != SubstName &&
|
| - (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {
|
| + (!bHasComma && (!bHasHyphen || (bHasHyphen && !bStyleAvail)))) {
|
| match = MatchInstalledFonts(TT_NormalizeName(SubstName.c_str()));
|
| }
|
| - if (match.IsEmpty() && iBaseFont >= 12) {
|
| + if (match.IsEmpty() && iBaseFont >= kExternalFontIndex) {
|
| if (!bCJK) {
|
| if (!CheckSupportThirdPartFont(family, PitchFamily)) {
|
| - if (italic_angle != 0)
|
| - bItalic = TRUE;
|
| - else
|
| - bItalic = FALSE;
|
| + bItalic = italic_angle != 0;
|
| weight = old_weight;
|
| }
|
| } else {
|
| pSubstFont->m_bSubstCJK = true;
|
| if (nStyle)
|
| - pSubstFont->m_WeightCJK = weight;
|
| - else
|
| - pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
|
| + pSubstFont->m_WeightCJK = nStyle ? weight : FXFONT_FW_NORMAL;
|
| if (nStyle & FX_FONT_STYLE_Italic)
|
| pSubstFont->m_bItalicCJK = true;
|
| }
|
| @@ -608,10 +610,10 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| ? 900
|
| : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
|
| }
|
| - if (!match.IsEmpty() || iBaseFont < 12) {
|
| + if (!match.IsEmpty() || iBaseFont < kExternalFontIndex) {
|
| if (!match.IsEmpty())
|
| family = match;
|
| - if (iBaseFont < 12) {
|
| + if (iBaseFont < kExternalFontIndex) {
|
| if (nStyle && !(iBaseFont % 4)) {
|
| if ((nStyle & 0x3) == 1)
|
| iBaseFont += 1;
|
| @@ -625,7 +627,7 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| }
|
| } else {
|
| if (flags & FXFONT_ITALIC)
|
| - bItalic = TRUE;
|
| + bItalic = true;
|
| }
|
| iExact = !match.IsEmpty();
|
| void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily,
|
| @@ -638,10 +640,7 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| return nullptr;
|
| #endif // PDF_ENABLE_XFA
|
| if (bCJK) {
|
| - if (italic_angle != 0)
|
| - bItalic = TRUE;
|
| - else
|
| - bItalic = FALSE;
|
| + bItalic = italic_angle != 0;
|
| weight = old_weight;
|
| }
|
| if (!match.IsEmpty()) {
|
| @@ -712,18 +711,11 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| }
|
| pSubstFont->m_Family = SubstName;
|
| pSubstFont->m_Charset = Charset;
|
| - FX_BOOL bNeedUpdateWeight = FALSE;
|
| - if (FXFT_Is_Face_Bold(face)) {
|
| - if (weight == FXFONT_FW_BOLD)
|
| - bNeedUpdateWeight = FALSE;
|
| - else
|
| - bNeedUpdateWeight = TRUE;
|
| - } else {
|
| - if (weight == FXFONT_FW_NORMAL)
|
| - bNeedUpdateWeight = FALSE;
|
| - else
|
| - bNeedUpdateWeight = TRUE;
|
| - }
|
| + bool bNeedUpdateWeight = false;
|
| + if (FXFT_Is_Face_Bold(face))
|
| + bNeedUpdateWeight = weight != FXFONT_FW_BOLD;
|
| + else
|
| + bNeedUpdateWeight = weight != FXFONT_FW_NORMAL;
|
| if (bNeedUpdateWeight)
|
| pSubstFont->m_Weight = weight;
|
| if (bItalic && !FXFT_Is_Face_Italic(face)) {
|
| @@ -793,11 +785,12 @@ FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont,
|
| uint32_t ttc_size,
|
| uint32_t font_size) {
|
| FXFT_Face face;
|
| - uint8_t temp[1024];
|
| - m_pFontInfo->GetFontData(hFont, tableTTCF, temp, 1024);
|
| + uint8_t buffer[1024];
|
| + m_pFontInfo->GetFontData(hFont, tableTTCF, buffer, FX_ArraySize(buffer));
|
| + uint32_t* pBuffer = reinterpret_cast<uint32_t*>(buffer);
|
| uint32_t checksum = 0;
|
| for (int i = 0; i < 256; i++)
|
| - checksum += ((uint32_t*)temp)[i];
|
| + checksum += pBuffer[i];
|
| uint8_t* pFontData;
|
| face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size,
|
| pFontData);
|
|
|