| Index: core/src/fpdfapi/fpdf_font/fpdf_font.cpp
|
| diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
|
| index 1e9335f30f4b5cad8ec37a401d3bb4b0adcf1755..fb601e71131289bbec21611e5474f0c580dc528b 100644
|
| --- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
|
| +++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
|
| @@ -19,6 +19,77 @@
|
| #include "core/src/fxge/apple/apple_int.h"
|
| #endif
|
|
|
| +namespace {
|
| +
|
| +#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
| +struct GlyphNameMap {
|
| + const FX_CHAR* m_pStrAdobe;
|
| + const FX_CHAR* m_pStrUnicode;
|
| +};
|
| +
|
| +const GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"},
|
| + {"fi", "uniFB01"},
|
| + {"fl", "uniFB02"},
|
| + {"ffi", "uniFB03"},
|
| + {"ffl", "uniFB04"}};
|
| +
|
| +int compareString(const void* key, const void* element) {
|
| + return FXSYS_stricmp((const FX_CHAR*)key,
|
| + ((GlyphNameMap*)element)->m_pStrAdobe);
|
| +}
|
| +
|
| +const FX_CHAR* GlyphNameRemap(const FX_CHAR* pStrAdobe) {
|
| + GlyphNameMap* found = (GlyphNameMap*)FXSYS_bsearch(
|
| + pStrAdobe, g_GlyphNameSubsts,
|
| + sizeof(g_GlyphNameSubsts) / sizeof(GlyphNameMap), sizeof(GlyphNameMap),
|
| + compareString);
|
| + if (found)
|
| + return found->m_pStrUnicode;
|
| + return NULL;
|
| +}
|
| +#endif
|
| +
|
| +const uint8_t ChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00},
|
| + {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
|
| + {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
|
| + {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
|
| + {0xD0, 0xC2, 0xCB, 0xCE, 0x00}};
|
| +
|
| +FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value) {
|
| + if (value == "WinAnsiEncoding") {
|
| + basemap = PDFFONT_ENCODING_WINANSI;
|
| + } else if (value == "MacRomanEncoding") {
|
| + basemap = PDFFONT_ENCODING_MACROMAN;
|
| + } else if (value == "MacExpertEncoding") {
|
| + basemap = PDFFONT_ENCODING_MACEXPERT;
|
| + } else if (value == "PDFDocEncoding") {
|
| + basemap = PDFFONT_ENCODING_PDFDOC;
|
| + } else {
|
| + return FALSE;
|
| + }
|
| + return TRUE;
|
| +}
|
| +
|
| +FX_BOOL FT_UseType1Charmap(FXFT_Face face) {
|
| + if (FXFT_Get_Face_CharmapCount(face) == 0) {
|
| + return FALSE;
|
| + }
|
| + if (FXFT_Get_Face_CharmapCount(face) == 1 &&
|
| + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
|
| + FXFT_ENCODING_UNICODE) {
|
| + return FALSE;
|
| + }
|
| + if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
|
| + FXFT_ENCODING_UNICODE) {
|
| + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
|
| + } else {
|
| + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
|
| + }
|
| + return TRUE;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) {
|
| for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) {
|
| if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) ==
|
| @@ -81,14 +152,17 @@ void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) {
|
| m_StockMap.erase(pDoc);
|
| }
|
|
|
| -CPDF_Font::CPDF_Font(int fonttype) : m_FontType(fonttype) {
|
| - m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;
|
| - m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;
|
| - m_pFontFile = NULL;
|
| - m_Flags = 0;
|
| - m_pToUnicodeMap = NULL;
|
| - m_bToUnicodeLoaded = FALSE;
|
| -}
|
| +CPDF_Font::CPDF_Font()
|
| + : m_pFontFile(nullptr),
|
| + m_pFontDict(nullptr),
|
| + m_pToUnicodeMap(nullptr),
|
| + m_bToUnicodeLoaded(FALSE),
|
| + m_Flags(0),
|
| + m_StemV(0),
|
| + m_Ascent(0),
|
| + m_Descent(0),
|
| + m_ItalicAngle(0) {}
|
| +
|
| CPDF_Font::~CPDF_Font() {
|
| delete m_pToUnicodeMap;
|
| m_pToUnicodeMap = NULL;
|
| @@ -98,9 +172,10 @@ CPDF_Font::~CPDF_Font() {
|
| const_cast<CPDF_Stream*>(m_pFontFile->GetStream()->AsStream()));
|
| }
|
| }
|
| +
|
| FX_BOOL CPDF_Font::IsVertWriting() const {
|
| FX_BOOL bVertWriting = FALSE;
|
| - CPDF_CIDFont* pCIDFont = GetCIDFont();
|
| + const CPDF_CIDFont* pCIDFont = AsCIDFont();
|
| if (pCIDFont) {
|
| bVertWriting = pCIDFont->IsVertWriting();
|
| } else {
|
| @@ -108,19 +183,12 @@ FX_BOOL CPDF_Font::IsVertWriting() const {
|
| }
|
| return bVertWriting;
|
| }
|
| -CFX_ByteString CPDF_Font::GetFontTypeName() const {
|
| - switch (m_FontType) {
|
| - case PDFFONT_TYPE1:
|
| - return "Type1";
|
| - case PDFFONT_TRUETYPE:
|
| - return "TrueType";
|
| - case PDFFONT_TYPE3:
|
| - return "Type3";
|
| - case PDFFONT_CIDFONT:
|
| - return "Type0";
|
| - }
|
| - return CFX_ByteString();
|
| +
|
| +int CPDF_Font::AppendChar(FX_CHAR* buf, FX_DWORD charcode) const {
|
| + *buf = (FX_CHAR)charcode;
|
| + return 1;
|
| }
|
| +
|
| void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const {
|
| char buf[4];
|
| int len = AppendChar(buf, charcode);
|
| @@ -130,33 +198,23 @@ void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const {
|
| str += CFX_ByteString(buf, len);
|
| }
|
| }
|
| +
|
| CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const {
|
| - if (!m_bToUnicodeLoaded) {
|
| + if (!m_bToUnicodeLoaded)
|
| ((CPDF_Font*)this)->LoadUnicodeMap();
|
| - }
|
| - if (m_pToUnicodeMap) {
|
| - CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);
|
| - if (!wsRet.IsEmpty()) {
|
| - return wsRet;
|
| - }
|
| - }
|
| - FX_WCHAR unicode = _UnicodeFromCharCode(charcode);
|
| - if (unicode == 0) {
|
| - return CFX_WideString();
|
| - }
|
| - return unicode;
|
| +
|
| + if (m_pToUnicodeMap)
|
| + return m_pToUnicodeMap->Lookup(charcode);
|
| + return CFX_WideString();
|
| }
|
| +
|
| FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const {
|
| - if (!m_bToUnicodeLoaded) {
|
| + if (!m_bToUnicodeLoaded)
|
| ((CPDF_Font*)this)->LoadUnicodeMap();
|
| - }
|
| - if (m_pToUnicodeMap) {
|
| - FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);
|
| - if (charcode) {
|
| - return charcode;
|
| - }
|
| - }
|
| - return _CharCodeFromUnicode(unicode);
|
| +
|
| + if (m_pToUnicodeMap)
|
| + return m_pToUnicodeMap->ReverseLookup(unicode);
|
| + return 0;
|
| }
|
|
|
| void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) {
|
| @@ -233,6 +291,7 @@ short TT2PDF(int m, FXFT_Face face) {
|
| }
|
| return (m * 1000 + upm / 2) / upm;
|
| }
|
| +
|
| void CPDF_Font::CheckFontMetrics() {
|
| if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 &&
|
| m_FontBBox.right == 0) {
|
| @@ -288,6 +347,7 @@ void CPDF_Font::CheckFontMetrics() {
|
| }
|
| }
|
| }
|
| +
|
| void CPDF_Font::LoadUnicodeMap() {
|
| m_bToUnicodeLoaded = TRUE;
|
| CPDF_Stream* pStream = m_pFontDict->GetStreamBy("ToUnicode");
|
| @@ -297,6 +357,7 @@ void CPDF_Font::LoadUnicodeMap() {
|
| m_pToUnicodeMap = new CPDF_ToUnicodeMap;
|
| m_pToUnicodeMap->Load(pStream);
|
| }
|
| +
|
| int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) {
|
| int offset = 0;
|
| int width = 0;
|
| @@ -306,16 +367,6 @@ int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) {
|
| }
|
| return width;
|
| }
|
| -int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode) {
|
| - if (!m_Font.GetFace())
|
| - return 0;
|
| -
|
| - int glyph_index = GlyphFromCharCode(charcode);
|
| - if (glyph_index == 0xffff) {
|
| - return 0;
|
| - }
|
| - return m_Font.GetGlyphWidth(glyph_index);
|
| -}
|
|
|
| CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc,
|
| const CFX_ByteStringC& name) {
|
| @@ -339,11 +390,7 @@ CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc,
|
| pFontGlobals->Set(pDoc, font_id, pFont);
|
| return pFont;
|
| }
|
| -const uint8_t ChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00},
|
| - {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
|
| - {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
|
| - {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
|
| - {0xD0, 0xC2, 0xCB, 0xCE, 0x00}};
|
| +
|
| CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc,
|
| CPDF_Dictionary* pFontDict) {
|
| CFX_ByteString type = pFontDict->GetStringBy("Subtype");
|
| @@ -369,6 +416,7 @@ CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc,
|
| pFont = new CPDF_CIDFont;
|
| pFont->m_pFontDict = pFontDict;
|
| pFont->m_pDocument = pDoc;
|
| + pFont->m_BaseFont = pFontDict->GetStringBy("BaseFont");
|
| if (!pFont->Load()) {
|
| delete pFont;
|
| return NULL;
|
| @@ -388,23 +436,13 @@ CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc,
|
| }
|
| pFont->m_pFontDict = pFontDict;
|
| pFont->m_pDocument = pDoc;
|
| + pFont->m_BaseFont = pFontDict->GetStringBy("BaseFont");
|
| if (!pFont->Load()) {
|
| delete pFont;
|
| return NULL;
|
| }
|
| return pFont;
|
| }
|
| -FX_BOOL CPDF_Font::Load() {
|
| - if (!m_pFontDict) {
|
| - return FALSE;
|
| - }
|
| - CFX_ByteString type = m_pFontDict->GetStringBy("Subtype");
|
| - m_BaseFont = m_pFontDict->GetStringBy("BaseFont");
|
| - if (type == "MMType1") {
|
| - type = "Type1";
|
| - }
|
| - return _Load();
|
| -}
|
|
|
| CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode) {
|
| auto it = m_Map.find(charcode);
|
| @@ -434,6 +472,7 @@ CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode) {
|
| }
|
| return CFX_WideString();
|
| }
|
| +
|
| FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) {
|
| for (const auto& pair : m_Map) {
|
| if (pair.second == unicode)
|
| @@ -461,6 +500,7 @@ FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) {
|
|
|
| return result;
|
| }
|
| +
|
| static CFX_WideString StringDataAdd(CFX_WideString str) {
|
| CFX_WideString ret;
|
| int len = str.GetLength();
|
| @@ -505,6 +545,7 @@ CFX_WideString CPDF_ToUnicodeMap::StringToWideString(
|
| }
|
| return result;
|
| }
|
| +
|
| void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
|
| CIDSet cid_set = CIDSET_UNKNOWN;
|
| CPDF_StreamAcc stream;
|
| @@ -612,21 +653,17 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
|
| m_pBaseMap = NULL;
|
| }
|
| }
|
| -static FX_BOOL GetPredefinedEncoding(int& basemap,
|
| - const CFX_ByteString& value) {
|
| - if (value == "WinAnsiEncoding") {
|
| - basemap = PDFFONT_ENCODING_WINANSI;
|
| - } else if (value == "MacRomanEncoding") {
|
| - basemap = PDFFONT_ENCODING_MACROMAN;
|
| - } else if (value == "MacExpertEncoding") {
|
| - basemap = PDFFONT_ENCODING_MACEXPERT;
|
| - } else if (value == "PDFDocEncoding") {
|
| - basemap = PDFFONT_ENCODING_PDFDOC;
|
| - } else {
|
| - return FALSE;
|
| +
|
| +FX_DWORD CPDF_Font::GetNextChar(const FX_CHAR* pString,
|
| + int nStrLen,
|
| + int& offset) const {
|
| + if (offset < 0 || nStrLen < 1) {
|
| + return 0;
|
| }
|
| - return TRUE;
|
| + uint8_t ch = offset < nStrLen ? pString[offset++] : pString[nStrLen - 1];
|
| + return static_cast<FX_DWORD>(ch);
|
| }
|
| +
|
| void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding,
|
| int& iBaseEncoding,
|
| CFX_ByteString*& pCharNames,
|
| @@ -697,15 +734,16 @@ void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding,
|
| }
|
|
|
| FX_BOOL CPDF_Font::IsStandardFont() const {
|
| - if (m_FontType != PDFFONT_TYPE1)
|
| + if (!IsType1Font())
|
| return FALSE;
|
| if (m_pFontFile)
|
| return FALSE;
|
| - if (((CPDF_Type1Font*)this)->GetBase14Font() < 0)
|
| + if (AsType1Font()->GetBase14Font() < 0)
|
| return FALSE;
|
| return TRUE;
|
| }
|
| -CPDF_SimpleFont::CPDF_SimpleFont(int fonttype) : CPDF_Font(fonttype) {
|
| +
|
| +CPDF_SimpleFont::CPDF_SimpleFont() {
|
| FXSYS_memset(m_CharBBox, 0xff, sizeof m_CharBBox);
|
| FXSYS_memset(m_CharWidth, 0xff, sizeof m_CharWidth);
|
| FXSYS_memset(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);
|
| @@ -713,9 +751,11 @@ CPDF_SimpleFont::CPDF_SimpleFont(int fonttype) : CPDF_Font(fonttype) {
|
| m_pCharNames = NULL;
|
| m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
|
| }
|
| +
|
| CPDF_SimpleFont::~CPDF_SimpleFont() {
|
| delete[] m_pCharNames;
|
| }
|
| +
|
| int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) {
|
| if (pVertGlyph) {
|
| *pVertGlyph = FALSE;
|
| @@ -729,6 +769,7 @@ int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) {
|
| }
|
| return index;
|
| }
|
| +
|
| void CPDF_SimpleFont::LoadCharMetrics(int charcode) {
|
| if (!m_Font.GetFace())
|
| return;
|
| @@ -772,6 +813,7 @@ void CPDF_SimpleFont::LoadCharMetrics(int charcode) {
|
| }
|
| }
|
| }
|
| +
|
| int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level) {
|
| if (charcode > 0xff) {
|
| charcode = 0;
|
| @@ -784,6 +826,7 @@ int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level) {
|
| }
|
| return (int16_t)m_CharWidth[charcode];
|
| }
|
| +
|
| void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) {
|
| if (charcode > 0xff) {
|
| charcode = 0;
|
| @@ -796,6 +839,7 @@ void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) {
|
| rect.bottom = m_CharBBox[charcode].Bottom;
|
| rect.top = m_CharBBox[charcode].Top;
|
| }
|
| +
|
| const FX_CHAR* GetAdobeCharName(int iBaseEncoding,
|
| const CFX_ByteString* pCharNames,
|
| int charcode) {
|
| @@ -812,6 +856,7 @@ const FX_CHAR* GetAdobeCharName(int iBaseEncoding,
|
| }
|
| return name && name[0] ? name : nullptr;
|
| }
|
| +
|
| FX_BOOL CPDF_SimpleFont::LoadCommon() {
|
| CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor");
|
| if (pFontDesc) {
|
| @@ -880,6 +925,7 @@ FX_BOOL CPDF_SimpleFont::LoadCommon() {
|
| CheckFontMetrics();
|
| return TRUE;
|
| }
|
| +
|
| void CPDF_SimpleFont::LoadSubstFont() {
|
| if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {
|
| int width = 0, i;
|
| @@ -898,20 +944,38 @@ void CPDF_SimpleFont::LoadSubstFont() {
|
| }
|
| }
|
| int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
|
| - m_Font.LoadSubst(m_BaseFont, IsFontType(PDFFONT_TRUETYPE), m_Flags, weight,
|
| - m_ItalicAngle, 0);
|
| + m_Font.LoadSubst(m_BaseFont, IsTrueTypeFont(), m_Flags, weight, m_ItalicAngle,
|
| + 0);
|
| if (m_Font.GetSubstFont()->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
|
| }
|
| }
|
| +
|
| FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const {
|
| return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN &&
|
| m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
|
| m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;
|
| }
|
| -CPDF_Type1Font::CPDF_Type1Font() : CPDF_SimpleFont(PDFFONT_TYPE1) {
|
| - m_Base14Font = -1;
|
| +
|
| +CFX_WideString CPDF_SimpleFont::UnicodeFromCharCode(FX_DWORD charcode) const {
|
| + CFX_WideString unicode = CPDF_Font::UnicodeFromCharCode(charcode);
|
| + if (!unicode.IsEmpty())
|
| + return unicode;
|
| + FX_WCHAR ret = m_Encoding.UnicodeFromCharCode((uint8_t)charcode);
|
| + if (ret == 0)
|
| + return CFX_WideString();
|
| + return ret;
|
| +}
|
| +
|
| +FX_DWORD CPDF_SimpleFont::CharCodeFromUnicode(FX_WCHAR unicode) const {
|
| + FX_DWORD ret = CPDF_Font::CharCodeFromUnicode(unicode);
|
| + if (ret)
|
| + return ret;
|
| + return m_Encoding.CharCodeFromUnicode(unicode);
|
| }
|
| -FX_BOOL CPDF_Type1Font::_Load() {
|
| +
|
| +CPDF_Type1Font::CPDF_Type1Font() : m_Base14Font(-1) {}
|
| +
|
| +FX_BOOL CPDF_Type1Font::Load() {
|
| m_Base14Font = PDF_GetStandardFontName(&m_BaseFont);
|
| if (m_Base14Font >= 0) {
|
| CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor");
|
| @@ -934,23 +998,7 @@ FX_BOOL CPDF_Type1Font::_Load() {
|
| }
|
| return LoadCommon();
|
| }
|
| -static FX_BOOL FT_UseType1Charmap(FXFT_Face face) {
|
| - if (FXFT_Get_Face_CharmapCount(face) == 0) {
|
| - return FALSE;
|
| - }
|
| - if (FXFT_Get_Face_CharmapCount(face) == 1 &&
|
| - FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
|
| - FXFT_ENCODING_UNICODE) {
|
| - return FALSE;
|
| - }
|
| - if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) ==
|
| - FXFT_ENCODING_UNICODE) {
|
| - FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
|
| - } else {
|
| - FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
|
| - }
|
| - return TRUE;
|
| -}
|
| +
|
| int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode) {
|
| if (charcode > 0xff) {
|
| return -1;
|
| @@ -961,33 +1009,7 @@ int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode) {
|
| }
|
| return index;
|
| }
|
| -#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
| -struct _GlyphNameMap {
|
| - const FX_CHAR* m_pStrAdobe;
|
| - const FX_CHAR* m_pStrUnicode;
|
| -};
|
| -static const _GlyphNameMap g_GlyphNameSubsts[] = {{"ff", "uniFB00"},
|
| - {"fi", "uniFB01"},
|
| - {"fl", "uniFB02"},
|
| - {"ffi", "uniFB03"},
|
| - {"ffl", "uniFB04"}};
|
| -extern "C" {
|
| -static int compareString(const void* key, const void* element) {
|
| - return FXSYS_stricmp((const FX_CHAR*)key,
|
| - ((_GlyphNameMap*)element)->m_pStrAdobe);
|
| -}
|
| -}
|
| -static const FX_CHAR* _GlyphNameRemap(const FX_CHAR* pStrAdobe) {
|
| - _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(
|
| - pStrAdobe, g_GlyphNameSubsts,
|
| - sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),
|
| - compareString);
|
| - if (found) {
|
| - return found->m_pStrUnicode;
|
| - }
|
| - return NULL;
|
| -}
|
| -#endif
|
| +
|
| void CPDF_Type1Font::LoadGlyphMap() {
|
| if (!m_Font.GetFace())
|
| return;
|
| @@ -1157,7 +1179,7 @@ void CPDF_Type1Font::LoadGlyphMap() {
|
| continue;
|
| }
|
| m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
|
| - const FX_CHAR* pStrUnicode = _GlyphNameRemap(name);
|
| + const FX_CHAR* pStrUnicode = GlyphNameRemap(name);
|
| if (pStrUnicode &&
|
| 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) {
|
| name = pStrUnicode;
|
| @@ -1280,6 +1302,7 @@ void CPDF_Type1Font::LoadGlyphMap() {
|
| CPDF_FontEncoding::CPDF_FontEncoding() {
|
| FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes));
|
| }
|
| +
|
| int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const {
|
| for (int i = 0; i < 256; i++)
|
| if (m_Unicodes[i] == unicode) {
|
| @@ -1287,6 +1310,7 @@ int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const {
|
| }
|
| return -1;
|
| }
|
| +
|
| CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding) {
|
| const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);
|
| if (!pSrc) {
|
| @@ -1296,10 +1320,12 @@ CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding) {
|
| m_Unicodes[i] = pSrc[i];
|
| }
|
| }
|
| +
|
| FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const {
|
| return FXSYS_memcmp(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) ==
|
| 0;
|
| }
|
| +
|
| CPDF_Object* CPDF_FontEncoding::Realize() {
|
| int predefined = 0;
|
| for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS;
|
| @@ -1345,10 +1371,13 @@ CPDF_Object* CPDF_FontEncoding::Realize() {
|
| pDict->SetAt("Differences", pDiff);
|
| return pDict;
|
| }
|
| -CPDF_TrueTypeFont::CPDF_TrueTypeFont() : CPDF_SimpleFont(PDFFONT_TRUETYPE) {}
|
| -FX_BOOL CPDF_TrueTypeFont::_Load() {
|
| +
|
| +CPDF_TrueTypeFont::CPDF_TrueTypeFont() {}
|
| +
|
| +FX_BOOL CPDF_TrueTypeFont::Load() {
|
| return LoadCommon();
|
| }
|
| +
|
| void CPDF_TrueTypeFont::LoadGlyphMap() {
|
| if (!m_Font.GetFace())
|
| return;
|
| @@ -1546,8 +1575,7 @@ void CPDF_TrueTypeFont::LoadGlyphMap() {
|
| }
|
|
|
| CPDF_Type3Font::CPDF_Type3Font()
|
| - : CPDF_SimpleFont(PDFFONT_TYPE3),
|
| - m_pCharProcs(nullptr),
|
| + : m_pCharProcs(nullptr),
|
| m_pPageResources(nullptr),
|
| m_pFontResources(nullptr) {
|
| FXSYS_memset(m_CharWidthL, 0, sizeof(m_CharWidthL));
|
| @@ -1558,7 +1586,7 @@ CPDF_Type3Font::~CPDF_Type3Font() {
|
| delete it.second;
|
| }
|
|
|
| -FX_BOOL CPDF_Type3Font::_Load() {
|
| +FX_BOOL CPDF_Type3Font::Load() {
|
| m_pFontResources = m_pFontDict->GetDictBy("Resources");
|
| CPDF_Array* pMatrix = m_pFontDict->GetArrayBy("FontMatrix");
|
| FX_FLOAT xscale = 1.0f, yscale = 1.0f;
|
| @@ -1604,6 +1632,7 @@ FX_BOOL CPDF_Type3Font::_Load() {
|
| }
|
| return TRUE;
|
| }
|
| +
|
| void CPDF_Type3Font::CheckType3FontMetrics() {
|
| CheckFontMetrics();
|
| }
|
|
|