| Index: core/fxge/ge/cfx_fontmapper.cpp
|
| diff --git a/core/fxge/ge/cfx_fontmapper.cpp b/core/fxge/ge/cfx_fontmapper.cpp
|
| index 5846574ce47a0ee2c56bd8a2058e855c1ae28c9e..27853a044301a798bc1e4c1130a5ea196428fdda 100644
|
| --- a/core/fxge/ge/cfx_fontmapper.cpp
|
| +++ b/core/fxge/ge/cfx_fontmapper.cpp
|
| @@ -161,9 +161,8 @@ 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) {
|
| + if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1)
|
| return 0;
|
| - }
|
| return FXSYS_stricmp((const FX_CHAR*)key,
|
| ((AltFontFamily*)element)->m_pFontName);
|
| }
|
| @@ -178,9 +177,8 @@ CFX_ByteString TT_NormalizeName(const FX_CHAR* family) {
|
| norm.Remove('-');
|
| norm.Remove(',');
|
| int pos = norm.Find('+');
|
| - if (pos > 0) {
|
| + if (pos > 0)
|
| norm = norm.Left(pos);
|
| - }
|
| norm.MakeLower();
|
| return norm;
|
| }
|
| @@ -200,15 +198,14 @@ uint8_t GetCharsetFromCodePage(uint16_t codepage) {
|
|
|
| CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) {
|
| if (fontName.Find("Script") >= 0) {
|
| - if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {
|
| + if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold)
|
| fontName = "ScriptMTBold";
|
| - } else if (fontName.Find("Palace") >= 0) {
|
| + else if (fontName.Find("Palace") >= 0)
|
| fontName = "PalaceScriptMT";
|
| - } else if (fontName.Find("French") >= 0) {
|
| + else if (fontName.Find("French") >= 0)
|
| fontName = "FrenchScriptMT";
|
| - } else if (fontName.Find("FreeStyle") >= 0) {
|
| + else if (fontName.Find("FreeStyle") >= 0)
|
| fontName = "FreeStyleScript";
|
| - }
|
| return fontName;
|
| }
|
| AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch(
|
| @@ -220,13 +217,11 @@ CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) {
|
|
|
| CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) {
|
| CFX_ByteTextBuf buf;
|
| - if (!iLen || iLen <= iIndex) {
|
| + if (!iLen || iLen <= iIndex)
|
| return buf.MakeString();
|
| - }
|
| while (iIndex < iLen) {
|
| - if (pStyle[iIndex] == ',') {
|
| + if (pStyle[iIndex] == ',')
|
| break;
|
| - }
|
| buf.AppendChar(pStyle[iIndex]);
|
| ++iIndex;
|
| }
|
| @@ -235,24 +230,20 @@ CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) {
|
|
|
| int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) {
|
| int32_t iLen = bsStyle.GetLength();
|
| - if (!iLen) {
|
| + if (!iLen)
|
| return -1;
|
| - }
|
| int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
|
| const FX_FontStyle* pStyle = nullptr;
|
| for (int i = iSize - 1; i >= 0; --i) {
|
| pStyle = g_FontStyles + i;
|
| - if (!pStyle || pStyle->len > iLen) {
|
| + if (!pStyle || pStyle->len > iLen)
|
| continue;
|
| - }
|
| if (!bRevert) {
|
| - if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {
|
| + if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0)
|
| return i;
|
| - }
|
| } else {
|
| - if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {
|
| + if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0)
|
| return i;
|
| - }
|
| }
|
| }
|
| return -1;
|
| @@ -266,6 +257,15 @@ FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) {
|
| return FALSE;
|
| }
|
|
|
| +void UpdatePitchFamily(uint32_t flags, int& PitchFamily) {
|
| + if (flags & FXFONT_SERIF)
|
| + PitchFamily |= FXFONT_FF_ROMAN;
|
| + if (flags & FXFONT_SCRIPT)
|
| + PitchFamily |= FXFONT_FF_SCRIPT;
|
| + if (flags & FXFONT_FIXED_PITCH)
|
| + PitchFamily |= FXFONT_FF_FIXEDPITCH;
|
| +}
|
| +
|
| } // namespace
|
|
|
| CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr)
|
| @@ -362,17 +362,14 @@ CFX_ByteString CFX_FontMapper::MatchInstalledFonts(
|
| int i;
|
| for (i = pdfium::CollectionSize<int>(m_InstalledTTFonts) - 1; i >= 0; i--) {
|
| CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str());
|
| - if (norm1 == norm_name) {
|
| + if (norm1 == norm_name)
|
| break;
|
| - }
|
| }
|
| - if (i < 0) {
|
| + if (i < 0)
|
| return CFX_ByteString();
|
| - }
|
| CFX_ByteString match = m_InstalledTTFonts[i];
|
| - if (match[0] == ' ') {
|
| + if (match[0] == ' ')
|
| match = m_InstalledTTFonts[i + 1];
|
| - }
|
| return match;
|
| }
|
|
|
| @@ -382,9 +379,8 @@ FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont,
|
| int weight,
|
| int picthfamily) {
|
| if (iBaseFont < 12) {
|
| - if (m_FoxitFaces[iBaseFont]) {
|
| + if (m_FoxitFaces[iBaseFont])
|
| return m_FoxitFaces[iBaseFont];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| if (m_pFontMgr->GetBuiltinFont(iBaseFont, &pFontData, &size)) {
|
| @@ -394,15 +390,13 @@ FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont,
|
| }
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;
|
| pSubstFont->m_ItalicAngle = italic_angle;
|
| - if (weight) {
|
| + if (weight)
|
| pSubstFont->m_Weight = weight;
|
| - }
|
| if (picthfamily & FXFONT_FF_ROMAN) {
|
| pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;
|
| pSubstFont->m_Family = "Chrome Serif";
|
| - if (m_MMFaces[1]) {
|
| + if (m_MMFaces[1])
|
| return m_MMFaces[1];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| m_pFontMgr->GetBuiltinFont(14, &pFontData, &size);
|
| @@ -410,9 +404,8 @@ FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont,
|
| return m_MMFaces[1];
|
| }
|
| pSubstFont->m_Family = "Chrome Sans";
|
| - if (m_MMFaces[0]) {
|
| + if (m_MMFaces[0])
|
| return m_MMFaces[0];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| m_pFontMgr->GetBuiltinFont(15, &pFontData, &size);
|
| @@ -433,19 +426,15 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| }
|
| CFX_ByteString SubstName = name;
|
| SubstName.Remove(0x20);
|
| - if (bTrueType) {
|
| - if (name[0] == '@') {
|
| - SubstName = name.Mid(1);
|
| - }
|
| - }
|
| + if (bTrueType && name[0] == '@')
|
| + SubstName = name.Mid(1);
|
| PDF_GetStandardFontName(&SubstName);
|
| if (SubstName == "Symbol" && !bTrueType) {
|
| pSubstFont->m_Family = "Chrome Symbol";
|
| pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| - if (m_FoxitFaces[12]) {
|
| + if (m_FoxitFaces[12])
|
| return m_FoxitFaces[12];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| m_pFontMgr->GetBuiltinFont(12, &pFontData, &size);
|
| @@ -456,9 +445,8 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| pSubstFont->m_Family = "Chrome Dingbats";
|
| pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| - if (m_FoxitFaces[13]) {
|
| + if (m_FoxitFaces[13])
|
| return m_FoxitFaces[13];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| m_pFontMgr->GetBuiltinFont(13, &pFontData, &size);
|
| @@ -478,28 +466,23 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| } else {
|
| family = SubstName;
|
| }
|
| - for (; iBaseFont < 12; iBaseFont++)
|
| - if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {
|
| + for (; iBaseFont < 12; iBaseFont++) {
|
| + if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont]))
|
| break;
|
| - }
|
| + }
|
| int PitchFamily = 0;
|
| FX_BOOL bItalic = FALSE;
|
| uint32_t nStyle = 0;
|
| FX_BOOL bStyleAvail = FALSE;
|
| if (iBaseFont < 12) {
|
| - family = g_Base14FontNames[iBaseFont];
|
| - if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {
|
| + if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2)
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - }
|
| - if ((iBaseFont % 4) / 2) {
|
| + if ((iBaseFont % 4) / 2)
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| - }
|
| - if (iBaseFont < 4) {
|
| + if (iBaseFont < 4)
|
| PitchFamily |= FXFONT_FF_FIXEDPITCH;
|
| - }
|
| - if (iBaseFont >= 8) {
|
| + if (iBaseFont >= 8)
|
| PitchFamily |= FXFONT_FF_ROMAN;
|
| - }
|
| } else {
|
| if (!bHasComma) {
|
| find = family.ReverseFind('-');
|
| @@ -514,26 +497,15 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| int32_t nRet = GetStyleType(family, TRUE);
|
| if (nRet > -1) {
|
| family = family.Left(nLen - g_FontStyles[nRet].len);
|
| - if (nRet == 0) {
|
| + if (nRet == 0)
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - }
|
| - if (nRet == 1) {
|
| + if (nRet == 1)
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| - }
|
| - if (nRet == 2) {
|
| + if (nRet == 2)
|
| nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
|
| - }
|
| }
|
| }
|
| - if (flags & FXFONT_SERIF) {
|
| - PitchFamily |= FXFONT_FF_ROMAN;
|
| - }
|
| - if (flags & FXFONT_SCRIPT) {
|
| - PitchFamily |= FXFONT_FF_SCRIPT;
|
| - }
|
| - if (flags & FXFONT_FIXED_PITCH) {
|
| - PitchFamily |= FXFONT_FF_FIXEDPITCH;
|
| - }
|
| + UpdatePitchFamily(flags, PitchFamily);
|
| }
|
| if (!style.IsEmpty()) {
|
| int nLen = style.GetLength();
|
| @@ -552,11 +524,10 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| bStyleAvail = TRUE;
|
| }
|
| if (nRet == 0) {
|
| - if (nStyle & FX_FONT_STYLE_Bold) {
|
| + if (nStyle & FX_FONT_STYLE_Bold)
|
| nStyle |= FX_FONT_STYLE_BoldBold;
|
| - } else {
|
| + else
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - }
|
| bFirstItem = FALSE;
|
| }
|
| if (nRet == 1) {
|
| @@ -570,11 +541,10 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| }
|
| if (nRet == 2) {
|
| nStyle |= FX_FONT_STYLE_Italic;
|
| - if (nStyle & FX_FONT_STYLE_Bold) {
|
| + if (nStyle & FX_FONT_STYLE_Bold)
|
| nStyle |= FX_FONT_STYLE_BoldBold;
|
| - } else {
|
| + else
|
| nStyle |= FX_FONT_STYLE_Bold;
|
| - }
|
| bFirstItem = FALSE;
|
| }
|
| i += buf.GetLength() + 1;
|
| @@ -588,17 +558,15 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| ? 900
|
| : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
|
| }
|
| - if (nStyle & FX_FONT_STYLE_Italic) {
|
| + if (nStyle & FX_FONT_STYLE_Italic)
|
| bItalic = TRUE;
|
| - }
|
| FX_BOOL bCJK = FALSE;
|
| int iExact = 0;
|
| int Charset = FXFONT_ANSI_CHARSET;
|
| - if (WindowCP) {
|
| + if (WindowCP)
|
| Charset = GetCharsetFromCodePage(WindowCP);
|
| - } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {
|
| + else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC))
|
| Charset = FXFONT_SYMBOL_CHARSET;
|
| - }
|
| if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
|
| Charset == FXFONT_HANGEUL_CHARSET ||
|
| Charset == FXFONT_CHINESEBIG5_CHARSET) {
|
| @@ -618,23 +586,20 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| if (match.IsEmpty() && iBaseFont >= 12) {
|
| if (!bCJK) {
|
| if (!CheckSupportThirdPartFont(family, PitchFamily)) {
|
| - if (italic_angle != 0) {
|
| + if (italic_angle != 0)
|
| bItalic = TRUE;
|
| - } else {
|
| + else
|
| bItalic = FALSE;
|
| - }
|
| weight = old_weight;
|
| }
|
| } else {
|
| pSubstFont->m_bSubstCJK = true;
|
| - if (nStyle) {
|
| + if (nStyle)
|
| pSubstFont->m_WeightCJK = weight;
|
| - } else {
|
| + else
|
| pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
|
| - }
|
| - if (nStyle & FX_FONT_STYLE_Italic) {
|
| + if (nStyle & FX_FONT_STYLE_Italic)
|
| pSubstFont->m_bItalicCJK = true;
|
| - }
|
| }
|
| } else {
|
| italic_angle = 0;
|
| @@ -644,47 +609,39 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
|
| }
|
| if (!match.IsEmpty() || iBaseFont < 12) {
|
| - if (!match.IsEmpty()) {
|
| + if (!match.IsEmpty())
|
| family = match;
|
| - }
|
| if (iBaseFont < 12) {
|
| if (nStyle && !(iBaseFont % 4)) {
|
| - if ((nStyle & 0x3) == 1) {
|
| + if ((nStyle & 0x3) == 1)
|
| iBaseFont += 1;
|
| - }
|
| - if ((nStyle & 0x3) == 2) {
|
| + if ((nStyle & 0x3) == 2)
|
| iBaseFont += 3;
|
| - }
|
| - if ((nStyle & 0x3) == 3) {
|
| + if ((nStyle & 0x3) == 3)
|
| iBaseFont += 2;
|
| - }
|
| }
|
| family = g_Base14FontNames[iBaseFont];
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| }
|
| } else {
|
| - if (flags & FXFONT_ITALIC) {
|
| + if (flags & FXFONT_ITALIC)
|
| bItalic = TRUE;
|
| - }
|
| }
|
| iExact = !match.IsEmpty();
|
| void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily,
|
| family.c_str(), iExact);
|
| - if (iExact) {
|
| + if (iExact)
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
|
| - }
|
| if (!hFont) {
|
| #ifdef PDF_ENABLE_XFA
|
| - if (flags & FXFONT_EXACTMATCH) {
|
| + if (flags & FXFONT_EXACTMATCH)
|
| return nullptr;
|
| - }
|
| #endif // PDF_ENABLE_XFA
|
| if (bCJK) {
|
| - if (italic_angle != 0) {
|
| + if (italic_angle != 0)
|
| bItalic = TRUE;
|
| - } else {
|
| + else
|
| bItalic = FALSE;
|
| - }
|
| weight = old_weight;
|
| }
|
| if (!match.IsEmpty()) {
|
| @@ -701,9 +658,8 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| pSubstFont->m_Family = "Chrome Symbol";
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
|
| - if (m_FoxitFaces[12]) {
|
| + if (m_FoxitFaces[12])
|
| return m_FoxitFaces[12];
|
| - }
|
| const uint8_t* pFontData = nullptr;
|
| uint32_t size = 0;
|
| m_pFontMgr->GetBuiltinFont(12, &pFontData, &size);
|
| @@ -738,9 +694,8 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| return nullptr;
|
|
|
| m_pFontInfo->GetFaceName(hFont, SubstName);
|
| - if (Charset == FXFONT_DEFAULT_CHARSET) {
|
| + if (Charset == FXFONT_DEFAULT_CHARSET)
|
| m_pFontInfo->GetFontCharset(hFont, Charset);
|
| - }
|
| uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, kTableTTCF, nullptr, 0);
|
| uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0);
|
| if (font_size == 0 && ttc_size == 0) {
|
| @@ -748,33 +703,10 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| return nullptr;
|
| }
|
| FXFT_Face face = nullptr;
|
| - if (ttc_size) {
|
| - uint8_t temp[1024];
|
| - m_pFontInfo->GetFontData(hFont, kTableTTCF, temp, 1024);
|
| - uint32_t checksum = 0;
|
| - for (int i = 0; i < 256; i++) {
|
| - checksum += ((uint32_t*)temp)[i];
|
| - }
|
| - uint8_t* pFontData;
|
| - face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum,
|
| - ttc_size - font_size, pFontData);
|
| - if (!face) {
|
| - pFontData = FX_Alloc(uint8_t, ttc_size);
|
| - m_pFontInfo->GetFontData(hFont, kTableTTCF, pFontData, ttc_size);
|
| - face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData,
|
| - ttc_size, ttc_size - font_size);
|
| - }
|
| - } else {
|
| - uint8_t* pFontData;
|
| - face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
|
| - if (!face) {
|
| - pFontData = FX_Alloc(uint8_t, font_size);
|
| - m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
|
| - face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData,
|
| - font_size,
|
| - m_pFontInfo->GetFaceIndex(hFont));
|
| - }
|
| - }
|
| + if (ttc_size)
|
| + face = GetCachedTTCFace(hFont, kTableTTCF, ttc_size, font_size);
|
| + else
|
| + face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size);
|
| if (!face) {
|
| m_pFontInfo->DeleteFont(hFont);
|
| return nullptr;
|
| @@ -783,32 +715,29 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| pSubstFont->m_Charset = Charset;
|
| FX_BOOL bNeedUpdateWeight = FALSE;
|
| if (FXFT_Is_Face_Bold(face)) {
|
| - if (weight == FXFONT_FW_BOLD) {
|
| + if (weight == FXFONT_FW_BOLD)
|
| bNeedUpdateWeight = FALSE;
|
| - } else {
|
| + else
|
| bNeedUpdateWeight = TRUE;
|
| - }
|
| } else {
|
| - if (weight == FXFONT_FW_NORMAL) {
|
| + if (weight == FXFONT_FW_NORMAL)
|
| bNeedUpdateWeight = FALSE;
|
| - } else {
|
| + else
|
| bNeedUpdateWeight = TRUE;
|
| - }
|
| }
|
| - if (bNeedUpdateWeight) {
|
| + if (bNeedUpdateWeight)
|
| pSubstFont->m_Weight = weight;
|
| - }
|
| if (bItalic && !FXFT_Is_Face_Italic(face)) {
|
| - if (italic_angle == 0) {
|
| + if (italic_angle == 0)
|
| italic_angle = -12;
|
| - } else if (FXSYS_abs(italic_angle) < 5) {
|
| + else if (FXSYS_abs(italic_angle) < 5)
|
| italic_angle = 0;
|
| - }
|
| pSubstFont->m_ItalicAngle = italic_angle;
|
| }
|
| m_pFontInfo->DeleteFont(hFont);
|
| return face;
|
| }
|
| +
|
| #ifdef PDF_ENABLE_XFA
|
| FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode,
|
| uint32_t flags,
|
| @@ -819,15 +748,7 @@ FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode,
|
|
|
| FX_BOOL bItalic = (flags & FXFONT_ITALIC) != 0;
|
| int PitchFamily = 0;
|
| - if (flags & FXFONT_SERIF) {
|
| - PitchFamily |= FXFONT_FF_ROMAN;
|
| - }
|
| - if (flags & FXFONT_SCRIPT) {
|
| - PitchFamily |= FXFONT_FF_SCRIPT;
|
| - }
|
| - if (flags & FXFONT_FIXED_PITCH) {
|
| - PitchFamily |= FXFONT_FF_FIXEDPITCH;
|
| - }
|
| + UpdatePitchFamily(flags, PitchFamily);
|
| void* hFont =
|
| m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily);
|
| if (!hFont)
|
| @@ -841,39 +762,11 @@ FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode,
|
| }
|
| FXFT_Face face = nullptr;
|
| if (ttc_size) {
|
| - uint8_t temp[1024];
|
| - m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
|
| - uint32_t checksum = 0;
|
| - for (int i = 0; i < 256; i++) {
|
| - checksum += ((uint32_t*)temp)[i];
|
| - }
|
| - uint8_t* pFontData;
|
| - face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum,
|
| - ttc_size - font_size, pFontData);
|
| - if (!face) {
|
| - pFontData = FX_Alloc(uint8_t, ttc_size);
|
| - if (pFontData) {
|
| - m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
|
| - face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData,
|
| - ttc_size, ttc_size - font_size);
|
| - }
|
| - }
|
| + face = GetCachedTTCFace(hFont, 0x74746366, ttc_size, font_size);
|
| } else {
|
| CFX_ByteString SubstName;
|
| m_pFontInfo->GetFaceName(hFont, SubstName);
|
| - uint8_t* pFontData;
|
| - face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
|
| - if (!face) {
|
| - pFontData = FX_Alloc(uint8_t, font_size);
|
| - if (!pFontData) {
|
| - m_pFontInfo->DeleteFont(hFont);
|
| - return nullptr;
|
| - }
|
| - m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
|
| - face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData,
|
| - font_size,
|
| - m_pFontInfo->GetFaceIndex(hFont));
|
| - }
|
| + face = GetCachedFace(hFont, SubstName, weight, bItalic, font_size);
|
| }
|
| m_pFontInfo->DeleteFont(hFont);
|
| return face;
|
| @@ -886,18 +779,56 @@ int CFX_FontMapper::GetFaceSize() const {
|
|
|
| FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const {
|
| for (size_t i = 0; i < MM_FACE_COUNT; ++i) {
|
| - if (m_MMFaces[i] == face) {
|
| + if (m_MMFaces[i] == face)
|
| return TRUE;
|
| - }
|
| }
|
| for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) {
|
| - if (m_FoxitFaces[i] == face) {
|
| + if (m_FoxitFaces[i] == face)
|
| return TRUE;
|
| - }
|
| }
|
| return FALSE;
|
| }
|
|
|
| +FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont,
|
| + const uint32_t tableTTCF,
|
| + uint32_t ttc_size,
|
| + uint32_t font_size) {
|
| + FXFT_Face face;
|
| + uint8_t temp[1024];
|
| + m_pFontInfo->GetFontData(hFont, tableTTCF, temp, 1024);
|
| + uint32_t checksum = 0;
|
| + for (int i = 0; i < 256; i++)
|
| + checksum += ((uint32_t*)temp)[i];
|
| + uint8_t* pFontData;
|
| + face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size,
|
| + pFontData);
|
| + if (!face) {
|
| + pFontData = FX_Alloc(uint8_t, ttc_size);
|
| + m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size);
|
| + face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,
|
| + ttc_size - font_size);
|
| + }
|
| + return face;
|
| +}
|
| +
|
| +FXFT_Face CFX_FontMapper::GetCachedFace(void* hFont,
|
| + CFX_ByteString SubstName,
|
| + int weight,
|
| + FX_BOOL bItalic,
|
| + uint32_t font_size) {
|
| + FXFT_Face face;
|
| + uint8_t* pFontData;
|
| + face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
|
| + if (!face) {
|
| + pFontData = FX_Alloc(uint8_t, font_size);
|
| + m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
|
| + face =
|
| + m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData,
|
| + font_size, m_pFontInfo->GetFaceIndex(hFont));
|
| + }
|
| + return face;
|
| +}
|
| +
|
| int PDF_GetStandardFontName(CFX_ByteString* name) {
|
| AltFontName* found = static_cast<AltFontName*>(
|
| FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames),
|
|
|