FX_DWORD CFX_UnicodeEncodingEx::GlyphFromCharCode(FX_DWORD charcode) { FXFT_Face face = m_pFont->GetFace(); FT_UInt nIndex = FXFT_Get_Char_Index(face, charcode); if (nIndex > 0) { return nIndex; } int nmaps = FXFT_Get_Face_CharmapCount(face); int m = 0; while (m < nmaps) { int nEncodingID = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[m++]); if (m_nEncodingID == nEncodingID) { continue; } int error = FXFT_Select_Charmap(face, nEncodingID); if (error) { continue; } nIndex = FXFT_Get_Char_Index(face, charcode); if (nIndex > 0) { m_nEncodingID = nEncodingID; return nIndex; } } FXFT_Select_Charmap(face, m_nEncodingID); return 0; }
uint32_t CFX_UnicodeEncodingEx::CharCodeFromUnicode(FX_WCHAR Unicode) const { if (m_nEncodingID == FXFM_ENCODING_UNICODE || m_nEncodingID == FXFM_ENCODING_MS_SYMBOL) { return Unicode; } FXFT_Face face = m_pFont->GetFace(); int nmaps = FXFT_Get_Face_CharmapCount(face); for (int i = 0; i < nmaps; i++) { int nEncodingID = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]); if (nEncodingID == FXFM_ENCODING_UNICODE || nEncodingID == FXFM_ENCODING_MS_SYMBOL) { return Unicode; } } return CPDF_Font::kInvalidCharCode; }
FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding) { FXFT_Face face = m_pFont->GetFace(); if (!face) { return charcode; } if (encoding == ENCODING_UNICODE) { return GlyphFromCharCode(charcode); } else { int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face); int i = 0; while (i < nmaps) { int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]); if (encoding != FXFT_ENCODING_UNICODE) { FXFT_Select_Charmap(face, encoding); break; } } } return FXFT_Get_Char_Index(face, charcode); }
int CPDF_CIDFont::GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) { if (pVertGlyph) *pVertGlyph = false; if (!m_pFontFile && !m_pStreamAcc) { uint16_t cid = CIDFromCharCode(charcode); FX_WCHAR unicode = 0; if (m_bCIDIsGID) { #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ return cid; #else if (m_Flags & FXFONT_SYMBOLIC) return cid; CFX_WideString uni_str = UnicodeFromCharCode(charcode); if (uni_str.IsEmpty()) return cid; unicode = uni_str.GetAt(0); #endif } else { if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid); if (unicode == 0) unicode = GetUnicodeFromCharCode(charcode); if (unicode == 0) { CFX_WideString unicode_str = UnicodeFromCharCode(charcode); if (!unicode_str.IsEmpty()) unicode = unicode_str.GetAt(0); } } FXFT_Face face = m_Font.GetFace(); if (unicode == 0) { if (!m_bAdobeCourierStd) return charcode ? static_cast<int>(charcode) : -1; charcode += 31; bool bMSUnicode = FT_UseTTCharmap(face, 3, 1); bool bMacRoman = !bMSUnicode && FT_UseTTCharmap(face, 1, 0); int iBaseEncoding = PDFFONT_ENCODING_STANDARD; if (bMSUnicode) iBaseEncoding = PDFFONT_ENCODING_WINANSI; else if (bMacRoman) iBaseEncoding = PDFFONT_ENCODING_MACROMAN; const FX_CHAR* name = GetAdobeCharName( iBaseEncoding, std::vector<CFX_ByteString>(), charcode); if (!name) return charcode ? static_cast<int>(charcode) : -1; int index = 0; uint16_t name_unicode = PDF_UnicodeFromAdobeName(name); if (!name_unicode) return charcode ? static_cast<int>(charcode) : -1; if (iBaseEncoding == PDFFONT_ENCODING_STANDARD) return FXFT_Get_Char_Index(face, name_unicode); if (iBaseEncoding == PDFFONT_ENCODING_WINANSI) { index = FXFT_Get_Char_Index(face, name_unicode); } else { ASSERT(iBaseEncoding == PDFFONT_ENCODING_MACROMAN); uint32_t maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, name_unicode); index = maccode ? FXFT_Get_Char_Index(face, maccode) : FXFT_Get_Name_Index(face, const_cast<char*>(name)); } if (index == 0 || index == 0xffff) return charcode ? static_cast<int>(charcode) : -1; return index; } if (m_Charset == CIDSET_JAPAN1) { if (unicode == '\\') { unicode = '/'; #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ } else if (unicode == 0xa5) { unicode = 0x5c; #endif } } if (!face) return unicode; int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); if (err) { int i; for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { uint32_t ret = FT_CharCodeFromUnicode( FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]), static_cast<FX_WCHAR>(charcode)); if (ret == 0) continue; FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]); unicode = static_cast<FX_WCHAR>(ret); break; } if (i == FXFT_Get_Face_CharmapCount(face) && i) { FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]); unicode = static_cast<FX_WCHAR>(charcode); } } if (FXFT_Get_Face_Charmap(face)) { int index = GetGlyphIndex(unicode, pVertGlyph); return index != 0 ? index : -1; } return unicode; } if (!m_Font.GetFace()) return -1; uint16_t cid = CIDFromCharCode(charcode); if (!m_pStreamAcc) { if (m_bType1) return cid; if (m_pFontFile && !m_pCMap->m_pMapping) return cid; if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || !FXFT_Get_Face_Charmap(m_Font.GetFace())) { return cid; } if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.GetFace())) == FXFT_ENCODING_UNICODE) { CFX_WideString unicode_str = UnicodeFromCharCode(charcode); if (unicode_str.IsEmpty()) return -1; charcode = unicode_str.GetAt(0); } return GetGlyphIndex(charcode, pVertGlyph); } uint32_t byte_pos = cid * 2; if (byte_pos + 2 > m_pStreamAcc->GetSize()) return -1; const uint8_t* pdata = m_pStreamAcc->GetData() + byte_pos; return pdata[0] * 256 + pdata[1]; }