Chromium Code Reviews| 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 446744328a7fc192e653ecb013d357137ea79684..ba3e28ea0670c59f8cd34be179d04e600472da97 100644 |
| --- a/core/src/fxge/ge/fx_ge_fontmap.cpp |
| +++ b/core/src/fxge/ge/fx_ge_fontmap.cpp |
| @@ -15,6 +15,11 @@ |
| #define GET_TT_LONG(w) \ |
| (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) |
| +#define FX_FONT_STYLE_None 0x00 |
| +#define FX_FONT_STYLE_Bold 0x01 |
| +#define FX_FONT_STYLE_Italic 0x02 |
| +#define FX_FONT_STYLE_BoldBold 0x04 |
| + |
| namespace { |
| struct BuiltinFont { |
| @@ -44,149 +49,6 @@ const BuiltinFont g_MMFonts[2] = { |
| {g_FoxitSansMMFontData, 66919}, |
| }; |
| -CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, |
| - int weight, |
| - FX_BOOL bItalic) { |
| - CFX_ByteString key(face_name); |
| - key += ','; |
| - key += CFX_ByteString::FormatInteger(weight); |
| - key += bItalic ? 'I' : 'N'; |
| - return key; |
| -} |
| - |
| -CFX_ByteString KeyNameFromSize(int ttc_size, FX_DWORD checksum) { |
| - CFX_ByteString key; |
| - key.Format("%d:%d", ttc_size, checksum); |
| - return key; |
| -} |
| - |
| -} // namespace |
| - |
| -CFX_SubstFont::CFX_SubstFont() { |
| - m_ExtHandle = NULL; |
| - m_Charset = 0; |
| - m_SubstFlags = 0; |
| - m_Weight = 0; |
| - m_ItalicAngle = 0; |
| - m_bSubstOfCJK = FALSE; |
| - m_WeightCJK = 0; |
| - m_bItlicCJK = FALSE; |
| -} |
| -CTTFontDesc::~CTTFontDesc() { |
| - if (m_Type == 1) { |
| - if (m_SingleFace.m_pFace) { |
| - FXFT_Done_Face(m_SingleFace.m_pFace); |
| - } |
| - } else if (m_Type == 2) { |
| - for (int i = 0; i < 16; i++) |
| - if (m_TTCFace.m_pFaces[i]) { |
| - FXFT_Done_Face(m_TTCFace.m_pFaces[i]); |
| - } |
| - } |
| - FX_Free(m_pFontData); |
| -} |
| -FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) { |
| - if (m_Type == 1) { |
| - if (m_SingleFace.m_pFace != face) { |
| - return FALSE; |
| - } |
| - } else if (m_Type == 2) { |
| - int i; |
| - for (i = 0; i < 16; i++) |
| - if (m_TTCFace.m_pFaces[i] == face) { |
| - break; |
| - } |
| - if (i == 16) { |
| - return FALSE; |
| - } |
| - } |
| - m_RefCount--; |
| - if (m_RefCount) { |
| - return FALSE; |
| - } |
| - delete this; |
| - return TRUE; |
| -} |
| - |
| -CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) { |
| - m_pBuiltinMapper.reset(new CFX_FontMapper(this)); |
| -} |
| - |
| -CFX_FontMgr::~CFX_FontMgr() { |
| - for (const auto& pair : m_FaceMap) |
| - delete pair.second; |
| - |
| - // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed |
| - // first. |
| - m_pBuiltinMapper.reset(); |
| - FXFT_Done_FreeType(m_FTLibrary); |
| -} |
| - |
| -void CFX_FontMgr::InitFTLibrary() { |
| - if (m_FTLibrary) |
| - return; |
| - FXFT_Init_FreeType(&m_FTLibrary); |
| -} |
| - |
| -void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { |
| - m_pBuiltinMapper->SetSystemFontInfo(pFontInfo); |
| -} |
| - |
| -FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, |
| - FX_BOOL bTrueType, |
| - FX_DWORD flags, |
| - int weight, |
| - int italic_angle, |
| - int CharsetCP, |
| - CFX_SubstFont* pSubstFont) { |
| - InitFTLibrary(); |
| - return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, |
| - italic_angle, CharsetCP, pSubstFont); |
| -} |
| - |
| -FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, |
| - int weight, |
| - FX_BOOL bItalic, |
| - uint8_t*& pFontData) { |
| - auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); |
| - if (it == m_FaceMap.end()) |
| - return nullptr; |
| - |
| - CTTFontDesc* pFontDesc = it->second; |
| - pFontData = pFontDesc->m_pFontData; |
| - pFontDesc->m_RefCount++; |
| - return pFontDesc->m_SingleFace.m_pFace; |
| -} |
| -FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, |
| - int weight, |
| - FX_BOOL bItalic, |
| - uint8_t* pData, |
| - FX_DWORD size, |
| - int face_index) { |
| - CTTFontDesc* pFontDesc = new CTTFontDesc; |
| - pFontDesc->m_Type = 1; |
| - pFontDesc->m_SingleFace.m_pFace = NULL; |
| - pFontDesc->m_SingleFace.m_bBold = weight; |
| - pFontDesc->m_SingleFace.m_bItalic = bItalic; |
| - pFontDesc->m_pFontData = pData; |
| - pFontDesc->m_RefCount = 1; |
| - |
| - InitFTLibrary(); |
| - FXFT_Library library = m_FTLibrary; |
| - int ret = FXFT_New_Memory_Face(library, pData, size, face_index, |
| - &pFontDesc->m_SingleFace.m_pFace); |
| - if (ret) { |
| - delete pFontDesc; |
| - return NULL; |
| - } |
| - ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); |
| - if (ret) { |
| - delete pFontDesc; |
| - return NULL; |
| - } |
| - m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; |
| - return pFontDesc->m_SingleFace.m_pFace; |
| -} |
| const FX_CHAR* const g_Base14FontNames[14] = { |
| "Courier", |
| "Courier-Bold", |
| @@ -203,6 +65,7 @@ const FX_CHAR* const g_Base14FontNames[14] = { |
| "Symbol", |
| "ZapfDingbats", |
| }; |
| + |
| const struct AltFontName { |
| const FX_CHAR* m_pName; |
| int m_Index; |
| @@ -297,10 +160,380 @@ const struct AltFontName { |
| {"TimesNewRomanPSMT,Italic", 11}, |
| {"ZapfDingbats", 13}, |
| }; |
| -extern "C" { |
| -static int compareString(const void* key, const void* element) { |
| + |
| +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"}, |
| +}; |
| + |
| +const struct AltFontFamily { |
| + const FX_CHAR* m_pFontName; |
| + const FX_CHAR* m_pFontFamily; |
| +} g_AltFontFamilies[] = { |
| + {"AGaramondPro", "Adobe Garamond Pro"}, |
| + {"BankGothicBT-Medium", "BankGothic Md BT"}, |
| + {"ForteMT", "Forte"}, |
| +}; |
| + |
| +const struct FX_FontStyle { |
| + const FX_CHAR* style; |
| + int32_t len; |
| +} g_FontStyles[] = { |
| + {"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, |
| +}; |
| + |
| +const struct CHARSET_MAP { |
| + uint8_t charset; |
| + FX_WORD codepage; |
| +} g_Codepage2CharsetTable[] = { |
| + {1, 0}, {2, 42}, {254, 437}, {255, 850}, {222, 874}, |
| + {128, 932}, {134, 936}, {129, 949}, {136, 950}, {238, 1250}, |
| + {204, 1251}, {0, 1252}, {161, 1253}, {162, 1254}, {177, 1255}, |
| + {178, 1256}, {186, 1257}, {163, 1258}, {130, 1361}, {77, 10000}, |
| + {78, 10001}, {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005}, |
| + {84, 10004}, {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029}, |
| + {89, 10007}, |
| +}; |
| + |
| +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) { |
| + return 0; |
| + } |
| + return FXSYS_stricmp((const FX_CHAR*)key, |
| + ((AltFontFamily*)element)->m_pFontName); |
| +} |
| + |
| +int CompareString(const void* key, const void* element) { |
| return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); |
| } |
| + |
| +CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, |
|
Tom Sepez
2015/11/09 18:05:18
This is just moving stuff around, right?
Lei Zhang
2015/11/09 18:41:03
Yep. Just shuffling code into the anonymous namesp
|
| + int weight, |
| + FX_BOOL bItalic) { |
| + CFX_ByteString key(face_name); |
| + key += ','; |
| + key += CFX_ByteString::FormatInteger(weight); |
| + key += bItalic ? 'I' : 'N'; |
| + return key; |
| +} |
| + |
| +CFX_ByteString KeyNameFromSize(int ttc_size, FX_DWORD checksum) { |
| + CFX_ByteString key; |
| + key.Format("%d:%d", ttc_size, checksum); |
| + return key; |
| +} |
| + |
| +CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
| + CFX_ByteString norm(family); |
| + norm.Remove(' '); |
| + norm.Remove('-'); |
| + norm.Remove(','); |
| + int pos = norm.Find('+'); |
| + if (pos > 0) { |
| + norm = norm.Left(pos); |
| + } |
| + norm.MakeLower(); |
| + return norm; |
| +} |
| + |
| +CFX_ByteString FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size) { |
| + CFX_ByteString buffer; |
| + if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) { |
| + return CFX_ByteString(); |
| + } |
| + buffer.ReleaseBuffer(size); |
| + return buffer; |
| +} |
| + |
| +CFX_ByteString FPDF_LoadTableFromTT(FXSYS_FILE* pFile, |
| + const uint8_t* pTables, |
| + FX_DWORD nTables, |
| + FX_DWORD tag) { |
| + for (FX_DWORD i = 0; i < nTables; i++) { |
| + const uint8_t* p = pTables + i * 16; |
| + if (GET_TT_LONG(p) == tag) { |
| + FX_DWORD offset = GET_TT_LONG(p + 8); |
| + FX_DWORD size = GET_TT_LONG(p + 12); |
| + FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); |
| + return FPDF_ReadStringFromFile(pFile, size); |
| + } |
| + } |
| + return CFX_ByteString(); |
| +} |
| + |
| +uint8_t GetCharsetFromCodePage(FX_WORD codepage) { |
| + int32_t iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1; |
| + FXSYS_assert(iEnd >= 0); |
| + int32_t iStart = 0, iMid; |
| + do { |
| + iMid = (iStart + iEnd) / 2; |
| + const CHARSET_MAP& cp = g_Codepage2CharsetTable[iMid]; |
| + if (codepage == cp.codepage) { |
| + return cp.charset; |
| + } |
| + if (codepage < cp.codepage) { |
| + iEnd = iMid - 1; |
| + } else { |
| + iStart = iMid + 1; |
| + } |
| + } while (iStart <= iEnd); |
| + return 1; |
| +} |
| + |
| +CFX_ByteString GetFontFamily(CFX_ByteString fontName, int nStyle) { |
| + if (fontName.Find("Script") >= 0) { |
| + if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) { |
| + fontName = "ScriptMTBold"; |
| + } else if (fontName.Find("Palace") >= 0) { |
| + fontName = "PalaceScriptMT"; |
| + } else if (fontName.Find("French") >= 0) { |
| + fontName = "FrenchScriptMT"; |
| + } else if (fontName.Find("FreeStyle") >= 0) { |
| + fontName = "FreeStyleScript"; |
| + } |
| + return fontName; |
| + } |
| + AltFontFamily* found = (AltFontFamily*)FXSYS_bsearch( |
| + fontName.c_str(), g_AltFontFamilies, |
| + sizeof g_AltFontFamilies / sizeof(AltFontFamily), sizeof(AltFontFamily), |
| + CompareFontFamilyString); |
| + if (found == NULL) { |
| + return fontName; |
| + } |
| + return found->m_pFontFamily; |
| +} |
| + |
| +CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { |
| + CFX_ByteTextBuf buf; |
| + if (!iLen || iLen <= iIndex) { |
| + return buf.GetByteString(); |
| + } |
| + while (iIndex < iLen) { |
| + if (pStyle[iIndex] == ',') { |
| + break; |
| + } |
| + buf.AppendChar(pStyle[iIndex]); |
| + ++iIndex; |
| + } |
| + return buf.GetByteString(); |
| +} |
| + |
| +int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) { |
| + int32_t iLen = bsStyle.GetLength(); |
| + if (!iLen) { |
| + return -1; |
| + } |
| + int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle); |
| + const FX_FontStyle* pStyle = NULL; |
| + 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) { |
| + return i; |
| + } |
| + } else { |
| + if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) { |
| + return i; |
| + } |
| + } |
| + } |
| + return -1; |
| +} |
| + |
| +FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
| + if (name == FX_BSTRC("MyriadPro")) { |
| + PitchFamily &= ~FXFONT_FF_ROMAN; |
| + return TRUE; |
| + } |
| + return FALSE; |
| +} |
| + |
| +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; |
| +} |
| + |
| +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; |
| +} |
| + |
| +} // namespace |
| + |
| +CFX_SubstFont::CFX_SubstFont() { |
| + m_ExtHandle = NULL; |
| + m_Charset = 0; |
| + m_SubstFlags = 0; |
| + m_Weight = 0; |
| + m_ItalicAngle = 0; |
| + m_bSubstOfCJK = FALSE; |
| + m_WeightCJK = 0; |
| + m_bItlicCJK = FALSE; |
| +} |
| +CTTFontDesc::~CTTFontDesc() { |
| + if (m_Type == 1) { |
| + if (m_SingleFace.m_pFace) { |
| + FXFT_Done_Face(m_SingleFace.m_pFace); |
| + } |
| + } else if (m_Type == 2) { |
| + for (int i = 0; i < 16; i++) |
| + if (m_TTCFace.m_pFaces[i]) { |
| + FXFT_Done_Face(m_TTCFace.m_pFaces[i]); |
| + } |
| + } |
| + FX_Free(m_pFontData); |
| +} |
| +FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) { |
| + if (m_Type == 1) { |
| + if (m_SingleFace.m_pFace != face) { |
| + return FALSE; |
| + } |
| + } else if (m_Type == 2) { |
| + int i; |
| + for (i = 0; i < 16; i++) |
| + if (m_TTCFace.m_pFaces[i] == face) { |
| + break; |
| + } |
| + if (i == 16) { |
| + return FALSE; |
| + } |
| + } |
| + m_RefCount--; |
| + if (m_RefCount) { |
| + return FALSE; |
| + } |
| + delete this; |
| + return TRUE; |
| +} |
| + |
| +CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) { |
| + m_pBuiltinMapper.reset(new CFX_FontMapper(this)); |
| +} |
| + |
| +CFX_FontMgr::~CFX_FontMgr() { |
| + for (const auto& pair : m_FaceMap) |
| + delete pair.second; |
| + |
| + // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed |
| + // first. |
| + m_pBuiltinMapper.reset(); |
| + FXFT_Done_FreeType(m_FTLibrary); |
| +} |
| + |
| +void CFX_FontMgr::InitFTLibrary() { |
| + if (m_FTLibrary) |
| + return; |
| + FXFT_Init_FreeType(&m_FTLibrary); |
| +} |
| + |
| +void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { |
| + m_pBuiltinMapper->SetSystemFontInfo(pFontInfo); |
| +} |
| + |
| +FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, |
| + FX_BOOL bTrueType, |
| + FX_DWORD flags, |
| + int weight, |
| + int italic_angle, |
| + int CharsetCP, |
| + CFX_SubstFont* pSubstFont) { |
| + InitFTLibrary(); |
| + return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, |
| + italic_angle, CharsetCP, pSubstFont); |
| +} |
| + |
| +FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, |
| + int weight, |
| + FX_BOOL bItalic, |
| + uint8_t*& pFontData) { |
| + auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); |
| + if (it == m_FaceMap.end()) |
| + return nullptr; |
| + |
| + CTTFontDesc* pFontDesc = it->second; |
| + pFontData = pFontDesc->m_pFontData; |
| + pFontDesc->m_RefCount++; |
| + return pFontDesc->m_SingleFace.m_pFace; |
| +} |
| +FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, |
| + int weight, |
| + FX_BOOL bItalic, |
| + uint8_t* pData, |
| + FX_DWORD size, |
| + int face_index) { |
| + CTTFontDesc* pFontDesc = new CTTFontDesc; |
| + pFontDesc->m_Type = 1; |
| + pFontDesc->m_SingleFace.m_pFace = NULL; |
| + pFontDesc->m_SingleFace.m_bBold = weight; |
| + pFontDesc->m_SingleFace.m_bItalic = bItalic; |
| + pFontDesc->m_pFontData = pData; |
| + pFontDesc->m_RefCount = 1; |
| + |
| + InitFTLibrary(); |
| + FXFT_Library library = m_FTLibrary; |
| + int ret = FXFT_New_Memory_Face(library, pData, size, face_index, |
| + &pFontDesc->m_SingleFace.m_pFace); |
| + if (ret) { |
| + delete pFontDesc; |
| + return NULL; |
| + } |
| + ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); |
| + if (ret) { |
| + delete pFontDesc; |
| + return NULL; |
| + } |
| + m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; |
| + return pFontDesc->m_SingleFace.m_pFace; |
| } |
| int GetTTCIndex(const uint8_t* pFontData, |
| @@ -443,18 +676,7 @@ void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { |
| } |
| m_pFontInfo = pFontInfo; |
| } |
| -static CFX_ByteString _TT_NormalizeName(const FX_CHAR* family) { |
| - CFX_ByteString norm(family); |
| - norm.Remove(' '); |
| - norm.Remove('-'); |
| - norm.Remove(','); |
| - int pos = norm.Find('+'); |
| - if (pos > 0) { |
| - norm = norm.Left(pos); |
| - } |
| - norm.MakeLower(); |
| - return norm; |
| -} |
| + |
| CFX_ByteString GetNameFromTT(const uint8_t* name_table, FX_DWORD name_id) { |
| const uint8_t* ptr = name_table + 2; |
| int name_count = GET_TT_SHORT(ptr); |
| @@ -471,49 +693,7 @@ CFX_ByteString GetNameFromTT(const uint8_t* name_table, FX_DWORD name_id) { |
| } |
| return CFX_ByteString(); |
| } |
| -static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, |
| - FX_DWORD size) { |
| - CFX_ByteString buffer; |
| - if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) { |
| - return CFX_ByteString(); |
| - } |
| - buffer.ReleaseBuffer(size); |
| - return buffer; |
| -} |
| -CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, |
| - const uint8_t* pTables, |
| - FX_DWORD nTables, |
| - FX_DWORD tag) { |
| - for (FX_DWORD i = 0; i < nTables; i++) { |
| - const uint8_t* p = pTables + i * 16; |
| - if (GET_TT_LONG(p) == tag) { |
| - FX_DWORD offset = GET_TT_LONG(p + 8); |
| - FX_DWORD size = GET_TT_LONG(p + 12); |
| - FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); |
| - return _FPDF_ReadStringFromFile(pFile, size); |
| - } |
| - } |
| - return CFX_ByteString(); |
| -} |
| -CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, |
|
Lei Zhang
2015/11/07 01:32:18
Dead
|
| - const uint8_t* pTables, |
| - FX_DWORD nTables, |
| - FX_DWORD tag) { |
| - for (FX_DWORD i = 0; i < nTables; i++) { |
| - const uint8_t* p = pTables + i * 16; |
| - if (GET_TT_LONG(p) == tag) { |
| - FX_DWORD offset = GET_TT_LONG(p + 8); |
| - FX_DWORD size = GET_TT_LONG(p + 12); |
| - CFX_ByteString buffer; |
| - if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) { |
| - return CFX_ByteString(); |
| - } |
| - buffer.ReleaseBuffer(size); |
| - return buffer; |
| - } |
| - } |
| - return CFX_ByteString(); |
| -} |
| + |
| CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { |
| if (m_pFontInfo == NULL) { |
| return CFX_ByteString(); |
| @@ -584,7 +764,7 @@ CFX_ByteString CFX_FontMapper::MatchInstalledFonts( |
| LoadInstalledFonts(); |
| int i; |
| for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i--) { |
| - CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]); |
| + CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i]); |
| if (norm1 == norm_name) { |
| break; |
| } |
| @@ -598,76 +778,7 @@ CFX_ByteString CFX_FontMapper::MatchInstalledFonts( |
| } |
| return match; |
| } |
| -typedef struct _CHARSET_MAP_ { |
| - uint8_t charset; |
| - FX_WORD codepage; |
| -} CHARSET_MAP; |
| -static const CHARSET_MAP g_Codepage2CharsetTable[] = { |
| - {1, 0}, {2, 42}, {254, 437}, {255, 850}, {222, 874}, |
| - {128, 932}, {134, 936}, {129, 949}, {136, 950}, {238, 1250}, |
| - {204, 1251}, {0, 1252}, {161, 1253}, {162, 1254}, {177, 1255}, |
| - {178, 1256}, {186, 1257}, {163, 1258}, {130, 1361}, {77, 10000}, |
| - {78, 10001}, {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005}, |
| - {84, 10004}, {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029}, |
| - {89, 10007}, |
| -}; |
| -uint8_t _GetCharsetFromCodePage(FX_WORD codepage) { |
| - int32_t iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1; |
| - FXSYS_assert(iEnd >= 0); |
| - int32_t iStart = 0, iMid; |
| - do { |
| - iMid = (iStart + iEnd) / 2; |
| - const CHARSET_MAP& cp = g_Codepage2CharsetTable[iMid]; |
| - if (codepage == cp.codepage) { |
| - return cp.charset; |
| - } |
| - if (codepage < cp.codepage) { |
| - iEnd = iMid - 1; |
| - } else { |
| - iStart = iMid + 1; |
| - } |
| - } while (iStart <= iEnd); |
| - return 1; |
| -} |
| -FX_DWORD _GetCodePageRangeFromCharset(int charset) { |
|
Lei Zhang
2015/11/07 01:32:18
Dead
|
| - if (charset == FXFONT_EASTEUROPE_CHARSET) { |
| - return 1 << 1; |
| - } |
| - if (charset == FXFONT_GREEK_CHARSET) { |
| - return 1 << 3; |
| - } |
| - if (charset == FXFONT_TURKISH_CHARSET) { |
| - return 1 << 4; |
| - } |
| - if (charset == FXFONT_HEBREW_CHARSET) { |
| - return 1 << 5; |
| - } |
| - if (charset == FXFONT_ARABIC_CHARSET) { |
| - return 1 << 6; |
| - } |
| - if (charset == FXFONT_BALTIC_CHARSET) { |
| - return 1 << 7; |
| - } |
| - if (charset == FXFONT_THAI_CHARSET) { |
| - return 1 << 16; |
| - } |
| - if (charset == FXFONT_SHIFTJIS_CHARSET) { |
| - return 1 << 17; |
| - } |
| - if (charset == FXFONT_GB2312_CHARSET) { |
| - return 1 << 18; |
| - } |
| - if (charset == FXFONT_CHINESEBIG5_CHARSET) { |
| - return 1 << 20; |
| - } |
| - if (charset == FXFONT_HANGEUL_CHARSET) { |
| - return 1 << 19; |
| - } |
| - if (charset == FXFONT_SYMBOL_CHARSET) { |
| - return 1 << 31; |
| - } |
| - return 1 << 21; |
| -} |
| + |
| FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, |
| int iBaseFont, |
| int italic_angle, |
| @@ -711,102 +822,7 @@ FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, |
| m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
| return m_MMFaces[0]; |
| } |
| -const struct _AltFontFamily { |
| - const FX_CHAR* m_pFontName; |
| - const FX_CHAR* m_pFontFamily; |
| -} g_AltFontFamilies[] = { |
| - {"AGaramondPro", "Adobe Garamond Pro"}, |
| - {"BankGothicBT-Medium", "BankGothic Md BT"}, |
| - {"ForteMT", "Forte"}, |
| -}; |
| -extern "C" { |
| -static 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) { |
| - return 0; |
| - } |
| - return FXSYS_stricmp((const FX_CHAR*)key, |
| - ((_AltFontFamily*)element)->m_pFontName); |
| -} |
| -} |
| -#define FX_FONT_STYLE_None 0x00 |
| -#define FX_FONT_STYLE_Bold 0x01 |
| -#define FX_FONT_STYLE_Italic 0x02 |
| -#define FX_FONT_STYLE_BoldBold 0x04 |
| -static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle) { |
| - if (fontName.Find("Script") >= 0) { |
| - if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) { |
| - fontName = "ScriptMTBold"; |
| - } else if (fontName.Find("Palace") >= 0) { |
| - fontName = "PalaceScriptMT"; |
| - } else if (fontName.Find("French") >= 0) { |
| - fontName = "FrenchScriptMT"; |
| - } else if (fontName.Find("FreeStyle") >= 0) { |
| - fontName = "FreeStyleScript"; |
| - } |
| - return fontName; |
| - } |
| - _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch( |
| - fontName.c_str(), g_AltFontFamilies, |
| - sizeof g_AltFontFamilies / sizeof(_AltFontFamily), sizeof(_AltFontFamily), |
| - compareFontFamilyString); |
| - if (found == NULL) { |
| - return fontName; |
| - } |
| - return found->m_pFontFamily; |
| -}; |
| -typedef struct _FX_FontStyle { |
| - const FX_CHAR* style; |
| - int32_t len; |
| -} FX_FontStyle; |
| -const FX_FontStyle g_FontStyles[] = { |
| - {"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, |
| -}; |
| -CFX_ByteString ParseStyle(const FX_CHAR* pStyle, int iLen, int iIndex) { |
| - CFX_ByteTextBuf buf; |
| - if (!iLen || iLen <= iIndex) { |
| - return buf.GetByteString(); |
| - } |
| - while (iIndex < iLen) { |
| - if (pStyle[iIndex] == ',') { |
| - break; |
| - } |
| - buf.AppendChar(pStyle[iIndex]); |
| - ++iIndex; |
| - } |
| - return buf.GetByteString(); |
| -} |
| -int32_t GetStyleType(const CFX_ByteString& bsStyle, FX_BOOL bRevert) { |
| - int32_t iLen = bsStyle.GetLength(); |
| - if (!iLen) { |
| - return -1; |
| - } |
| - int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle); |
| - const FX_FontStyle* pStyle = NULL; |
| - 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) { |
| - return i; |
| - } |
| - } else { |
| - if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) { |
| - return i; |
| - } |
| - } |
| - } |
| - return -1; |
| -} |
| -FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
| - if (name == FX_BSTRC("MyriadPro")) { |
| - PitchFamily &= ~FXFONT_FF_ROMAN; |
| - return TRUE; |
| - } |
| - return FALSE; |
| -} |
| + |
| FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, |
| FX_BOOL bTrueType, |
| FX_DWORD flags, |
| @@ -982,7 +998,7 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, |
| int iExact = 0; |
| int Charset = FXFONT_ANSI_CHARSET; |
| if (WindowCP) { |
| - Charset = _GetCharsetFromCodePage(WindowCP); |
| + Charset = GetCharsetFromCodePage(WindowCP); |
| } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) { |
| Charset = FXFONT_SYMBOL_CHARSET; |
| } |
| @@ -996,11 +1012,11 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, |
| return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, |
| PitchFamily); |
| } |
| - family = _GetFontFamily(family, nStyle); |
| - CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family)); |
| + family = GetFontFamily(family, nStyle); |
| + CFX_ByteString match = MatchInstalledFonts(TT_NormalizeName(family)); |
| if (match.IsEmpty() && family != SubstName && |
| (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) { |
| - match = MatchInstalledFonts(_TT_NormalizeName(SubstName)); |
| + match = MatchInstalledFonts(TT_NormalizeName(SubstName)); |
| } |
| if (match.IsEmpty() && iBaseFont >= 12) { |
| if (!bCJK) { |
| @@ -1301,12 +1317,12 @@ void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, |
| return; |
| } |
| FX_DWORD nTables = GET_TT_SHORT(buffer + 4); |
| - CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16); |
| + CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16); |
| if (tables.IsEmpty()) { |
| return; |
| } |
| CFX_ByteString names = |
| - _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65); |
| + FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65); |
| CFX_ByteString facename = GetNameFromTT(names, 1); |
| CFX_ByteString style = GetNameFromTT(names, 2); |
| if (style != "Regular") { |
| @@ -1317,8 +1333,7 @@ void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, |
| } |
| CFX_FontFaceInfo* pInfo = |
| new CFX_FontFaceInfo(path, facename, tables, offset, filesize); |
| - CFX_ByteString os2 = |
| - _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32); |
| + CFX_ByteString os2 = FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32); |
|
Tom Sepez
2015/11/09 18:05:17
nit: Isn't there some macro in somewhere in this c
Lei Zhang
2015/11/09 18:41:03
I have other CLs to fix these.
|
| if (os2.GetLength() >= 86) { |
| const uint8_t* p = (const uint8_t*)os2 + 78; |
| FX_DWORD codepages = GET_TT_LONG(p); |
| @@ -1358,23 +1373,7 @@ 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++) { |
| @@ -1384,47 +1383,7 @@ void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) { |
| } |
| 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, |
| @@ -1435,7 +1394,7 @@ void* CFX_FolderFontInfo::FindFont(int weight, |
| if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) { |
| return GetFont("Courier New"); |
| } |
| - FX_DWORD charset_flag = _GetCharset(charset); |
| + FX_DWORD charset_flag = GetCharset(charset); |
| int32_t iBestSimilar = 0; |
| for (const auto& it : m_FontList) { |
| const CFX_ByteString& bsName = it.first; |
| @@ -1449,7 +1408,7 @@ void* CFX_FolderFontInfo::FindFont(int weight, |
| continue; |
| } |
| int32_t iSimilarValue = |
| - _GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); |
| + GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); |
| if (iSimilarValue > iBestSimilar) { |
| iBestSimilar = iSimilarValue; |
| pFind = pFont; |
| @@ -1527,7 +1486,7 @@ FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) { |
| int PDF_GetStandardFontName(CFX_ByteString* name) { |
| AltFontName* found = static_cast<AltFontName*>( |
| FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |
| - sizeof(AltFontName), compareString)); |
| + sizeof(AltFontName), CompareString)); |
|
Tom Sepez
2015/11/09 18:05:18
nit: used more than once? else [](){} is your frie
Lei Zhang
2015/11/09 18:41:03
bsearch() is not std::binary_search(), so it does
|
| if (!found) |
| return -1; |