diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp | 6 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_font/fpdf_font.cpp | 249 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp | 83 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_font/ttgsubtable.cpp | 16 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp | 6 | ||||
-rw-r--r-- | core/src/fxge/ge/fx_ge_font.cpp | 158 |
6 files changed, 229 insertions, 289 deletions
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp index ed055459d4..a259a0bab4 100644 --- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp +++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp @@ -980,7 +980,7 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { pFontDesc->SetAtInteger("Flags", flags); pFontDesc->SetAtInteger( "ItalicAngle", - pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0); + pFont->GetSubstFont() ? pFont->GetSubstFont()->m_ItalicAngle : 0); pFontDesc->SetAtInteger("Ascent", pFont->GetAscent()); pFontDesc->SetAtInteger("Descent", pFont->GetDescent()); FX_RECT bbox; @@ -992,8 +992,8 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { pBBox->AddInteger(bbox.top); pFontDesc->SetAt("FontBBox", pBBox); int32_t nStemV = 0; - if (pFont->m_pSubstFont) { - nStemV = pFont->m_pSubstFont->m_Weight / 5; + if (pFont->GetSubstFont()) { + nStemV = pFont->GetSubstFont()->m_Weight / 5; } else { static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'}; const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]); diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp index 7f593c7be3..37b0c019a5 100644 --- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp +++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp @@ -212,6 +212,7 @@ CFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const { result.ReleaseBuffer(dest_pos); return result; } + void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) { m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC); int ItalicAngle = 0; @@ -257,26 +258,28 @@ void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) { m_FontBBox.right = pBBox->GetInteger(2); m_FontBBox.top = pBBox->GetInteger(3); } + CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile")); - if (pFontFile == NULL) { + if (!pFontFile) pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2")); - } - if (pFontFile == NULL) { + if (!pFontFile) pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3")); - } - if (pFontFile) { - m_pFontFile = m_pDocument->LoadFontFile(pFontFile); - if (m_pFontFile == NULL) { - return; - } - const uint8_t* pFontData = m_pFontFile->GetData(); - FX_DWORD dwFontSize = m_pFontFile->GetSize(); - m_Font.LoadEmbedded(pFontData, dwFontSize); - if (m_Font.m_Face == NULL) { - m_pFontFile = NULL; - } + if (!pFontFile) + return; + + m_pFontFile = m_pDocument->LoadFontFile(pFontFile); + if (!m_pFontFile) + return; + + const uint8_t* pFontData = m_pFontFile->GetData(); + FX_DWORD dwFontSize = m_pFontFile->GetSize(); + if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) { + m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( + (CPDF_Stream*)m_pFontFile->GetStream()); + m_pFontFile = nullptr; } } + short TT2PDF(int m, FXFT_Face face) { int upm = FXFT_Get_Face_UnitsPerEM(face); if (upm == 0) { @@ -287,16 +290,14 @@ short TT2PDF(int m, FXFT_Face face) { void CPDF_Font::CheckFontMetrics() { if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) { - if (m_Font.m_Face) { - m_FontBBox.left = - TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face); - m_FontBBox.bottom = - TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face); - m_FontBBox.right = - TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face); - m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face); - m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face); - m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face); + FXFT_Face face = m_Font.GetFace(); + if (face) { + m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face); + m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(face), face); + m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(face), face); + m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(face), face); + m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(face), face); + m_Descent = TT2PDF(FXFT_Get_Face_Descender(face), face); } else { FX_BOOL bFirst = TRUE; for (int i = 0; i < 256; i++) { @@ -360,9 +361,9 @@ int CPDF_Font::GetStringWidth(const FX_CHAR* pString, int size) { return width; } int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode) { - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return 0; - } + int glyph_index = GlyphFromCharCode(charcode); if (glyph_index == 0xffff) { return 0; @@ -782,15 +783,12 @@ void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, } } FX_BOOL CPDF_Font::IsStandardFont() const { - if (m_FontType != PDFFONT_TYPE1) { + if (m_FontType != PDFFONT_TYPE1) return FALSE; - } - if (m_pFontFile != NULL) { + if (m_pFontFile) return FALSE; - } - if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) { + if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) return FALSE; - } return TRUE; } CPDF_SimpleFont::CPDF_SimpleFont(int fonttype) : CPDF_Font(fonttype) { @@ -818,15 +816,15 @@ int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { return index; } void CPDF_SimpleFont::LoadCharMetrics(int charcode) { - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return; - } + if (charcode < 0 || charcode > 0xff) { return; } int glyph_index = m_GlyphIndex[charcode]; if (glyph_index == 0xffff) { - if (m_pFontFile == NULL && charcode != 32) { + if (!m_pFontFile && charcode != 32) { LoadCharMetrics(32); m_CharBBox[charcode] = m_CharBBox[32]; if (m_bUseFontWidth) { @@ -835,27 +833,21 @@ void CPDF_SimpleFont::LoadCharMetrics(int charcode) { } return; } + FXFT_Face face = m_Font.GetFace(); int err = FXFT_Load_Glyph( - m_Font.m_Face, glyph_index, + face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (err) { return; } - m_CharBBox[charcode].Left = - TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face); - m_CharBBox[charcode].Right = - TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + - FXFT_Get_Glyph_Width(m_Font.m_Face), - m_Font.m_Face); - m_CharBBox[charcode].Top = - TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face); - m_CharBBox[charcode].Bottom = - TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - - FXFT_Get_Glyph_Height(m_Font.m_Face), - m_Font.m_Face); + m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face); + m_CharBBox[charcode].Right = TT2PDF( + FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face); + m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face); + m_CharBBox[charcode].Bottom = TT2PDF( + FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face); if (m_bUseFontWidth) { - int TT_Width = - TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face); + int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(face), face); if (m_CharWidth[charcode] == 0xffff) { m_CharWidth[charcode] = TT_Width; } else if (TT_Width && !IsEmbedded()) { @@ -940,12 +932,12 @@ FX_BOOL CPDF_SimpleFont::LoadCommon() { } } } - if (m_pFontFile == NULL) { - LoadSubstFont(); - } else { + if (m_pFontFile) { if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') { m_BaseFont = m_BaseFont.Mid(8); } + } else { + LoadSubstFont(); } if (!(m_Flags & PDFFONT_SYMBOLIC)) { m_BaseEncoding = PDFFONT_ENCODING_STANDARD; @@ -956,14 +948,14 @@ FX_BOOL CPDF_SimpleFont::LoadCommon() { LoadGlyphMap(); delete[] m_pCharNames; m_pCharNames = NULL; - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return TRUE; - } + if (m_Flags & PDFFONT_ALLCAP) { unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd}; for (size_t range = 0; range < sizeof lowercases / 2; range++) { for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i++) { - if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) { + if (m_GlyphIndex[i] != 0xffff && m_pFontFile) { continue; } m_GlyphIndex[i] = m_GlyphIndex[i - 32]; @@ -997,7 +989,7 @@ 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); - if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) { + if (m_Font.GetSubstFont()->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) { } } FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const { @@ -1091,9 +1083,9 @@ static const FX_CHAR* _GlyphNameRemap(const FX_CHAR* pStrAdobe) { } #endif void CPDF_Type1Font::LoadGlyphMap() { - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return; - } + #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ FX_BOOL bCoreText = TRUE; CQuartz2D& quartz2d = @@ -1110,17 +1102,18 @@ void CPDF_Type1Font::LoadGlyphMap() { } #endif if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) { - if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) { + if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) { FX_BOOL bGotOne = FALSE; for (int charcode = 0; charcode < 256; charcode++) { const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; for (int j = 0; j < 4; j++) { FX_WORD unicode = prefix[j] * 256 + charcode; - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode); + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), unicode); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ FX_CHAR name_glyph[256]; - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, - 256); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); name_glyph[255] = 0; CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, @@ -1146,7 +1139,7 @@ void CPDF_Type1Font::LoadGlyphMap() { return; } } - FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE); + FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); if (m_BaseEncoding == 0) { m_BaseEncoding = PDFFONT_ENCODING_STANDARD; } @@ -1157,11 +1150,11 @@ void CPDF_Type1Font::LoadGlyphMap() { continue; } m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); - m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ FX_CHAR name_glyph[256]; - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph, 256); name_glyph[255] = 0; CFStringRef name_ct = CFStringCreateWithCStringNoCopy( @@ -1175,11 +1168,11 @@ void CPDF_Type1Font::LoadGlyphMap() { #endif if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) { m_Encoding.m_Unicodes[charcode] = 0x20; - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 0x20); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ FX_CHAR name_glyph[256]; - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, - 256); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); name_glyph[255] = 0; CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, @@ -1199,7 +1192,7 @@ void CPDF_Type1Font::LoadGlyphMap() { #endif return; } - FT_UseType1Charmap(m_Font.m_Face); + FT_UseType1Charmap(m_Font.GetFace()); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ if (bCoreText) { if (m_Flags & PDFFONT_SYMBOLIC) { @@ -1209,7 +1202,7 @@ void CPDF_Type1Font::LoadGlyphMap() { if (name) { m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); m_GlyphIndex[charcode] = - FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull); @@ -1219,7 +1212,8 @@ void CPDF_Type1Font::LoadGlyphMap() { CFRelease(name_ct); } } else { - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode); + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); FX_WCHAR unicode = 0; if (m_GlyphIndex[charcode]) { unicode = @@ -1227,8 +1221,8 @@ void CPDF_Type1Font::LoadGlyphMap() { } FX_CHAR name_glyph[256]; FXSYS_memset(name_glyph, 0, sizeof(name_glyph)); - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, - 256); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); name_glyph[255] = 0; if (unicode == 0 && name_glyph[0] != 0) { unicode = PDF_UnicodeFromAdobeName(name_glyph); @@ -1247,7 +1241,7 @@ void CPDF_Type1Font::LoadGlyphMap() { return; } FX_BOOL bUnicode = FALSE; - if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) { + if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { bUnicode = TRUE; } for (int charcode = 0; charcode < 256; charcode++) { @@ -1258,10 +1252,12 @@ void CPDF_Type1Font::LoadGlyphMap() { } m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); const FX_CHAR* pStrUnicode = _GlyphNameRemap(name); - if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) { + if (pStrUnicode && + 0 == FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name)) { name = pStrUnicode; } - m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull); m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName( @@ -1273,11 +1269,11 @@ void CPDF_Type1Font::LoadGlyphMap() { if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) { m_GlyphIndex[charcode] = FXFT_Get_Char_Index( - m_Font.m_Face, + m_Font.GetFace(), bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode); FX_CHAR name_glyph[256]; - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, - 256); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); name_glyph[255] = 0; CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, @@ -1290,10 +1286,10 @@ void CPDF_Type1Font::LoadGlyphMap() { } else { m_Encoding.m_Unicodes[charcode] = 0x20; m_GlyphIndex[charcode] = - bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff; + bUnicode ? FXFT_Get_Char_Index(m_Font.GetFace(), 0x20) : 0xffff; FX_CHAR name_glyph[256]; - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, - 256); + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], + name_glyph, 256); name_glyph[255] = 0; CFStringRef name_ct = CFStringCreateWithCStringNoCopy( kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, @@ -1316,16 +1312,17 @@ void CPDF_Type1Font::LoadGlyphMap() { if (name) { m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); m_GlyphIndex[charcode] = - FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); } else { - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode); + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); if (m_GlyphIndex[charcode]) { FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode); if (unicode == 0) { FX_CHAR name_glyph[256]; FXSYS_memset(name_glyph, 0, sizeof(name_glyph)); - FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], + FXFT_Get_Glyph_Name(m_Font.GetFace(), m_GlyphIndex[charcode], name_glyph, 256); name_glyph[255] = 0; if (name_glyph[0] != 0) { @@ -1344,7 +1341,7 @@ void CPDF_Type1Font::LoadGlyphMap() { return; } FX_BOOL bUnicode = FALSE; - if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) { + if (0 == FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE)) { bUnicode = TRUE; } for (int charcode = 0; charcode < 256; charcode++) { @@ -1354,12 +1351,12 @@ void CPDF_Type1Font::LoadGlyphMap() { continue; } m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); - m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); if (m_GlyphIndex[charcode] == 0) { if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) { m_GlyphIndex[charcode] = FXFT_Get_Char_Index( - m_Font.m_Face, + m_Font.GetFace(), bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode); } else { m_Encoding.m_Unicodes[charcode] = 0x20; @@ -1373,6 +1370,7 @@ void CPDF_Type1Font::LoadGlyphMap() { } #endif } + CPDF_FontEncoding::CPDF_FontEncoding() { FXSYS_memset(m_Unicodes, 0, sizeof(m_Unicodes)); } @@ -1445,19 +1443,19 @@ FX_BOOL CPDF_TrueTypeFont::_Load() { return LoadCommon(); } void CPDF_TrueTypeFont::LoadGlyphMap() { - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return; - } + int baseEncoding = m_BaseEncoding; - if (m_pFontFile && m_Font.m_Face->num_charmaps > 0 && + if (m_pFontFile && m_Font.GetFace()->num_charmaps > 0 && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI) && (m_Flags & PDFFONT_SYMBOLIC)) { FX_BOOL bSupportWin = FALSE; FX_BOOL bSupportMac = FALSE; - for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) { - int platform_id = - FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]); + for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.GetFace()); i++) { + int platform_id = FXFT_Get_Charmap_PlatformID( + FXFT_Get_Face_Charmaps(m_Font.GetFace())[i]); if (platform_id == 0 || platform_id == 3) { bSupportWin = TRUE; } else if (platform_id == 0 || platform_id == 1) { @@ -1476,8 +1474,8 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { baseEncoding == PDFFONT_ENCODING_WINANSI) && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) { - if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && - (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) { + if (!FXFT_Has_Glyph_Names(m_Font.GetFace()) && + (!m_Font.GetFace()->num_charmaps || !m_Font.GetFace()->charmaps)) { int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar")); if (nStartChar < 0 || nStartChar > 255) return; @@ -1492,15 +1490,15 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { } return; } - FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1); + FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.GetFace(), 3, 1); FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE; if (!bMSUnicode) { if (m_Flags & PDFFONT_NONSYMBOLIC) { - bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0); - bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0); + bMacRoman = FT_UseTTCharmap(m_Font.GetFace(), 1, 0); + bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.GetFace(), 3, 0); } else { - bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0); - bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0); + bMSSymbol = FT_UseTTCharmap(m_Font.GetFace(), 3, 0); + bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.GetFace(), 1, 0); } } FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode")); @@ -1509,7 +1507,7 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { GetAdobeCharName(baseEncoding, m_pCharNames, charcode); if (name == NULL) { m_GlyphIndex[charcode] = - m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1; + m_pFontFile ? FXFT_Get_Char_Index(m_Font.GetFace(), charcode) : -1; continue; } m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); @@ -1517,7 +1515,8 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; for (int j = 0; j < 4; j++) { FX_WORD unicode = prefix[j] * 256 + charcode; - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode); + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), unicode); if (m_GlyphIndex[charcode]) { break; } @@ -1525,38 +1524,38 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { } else if (m_Encoding.m_Unicodes[charcode]) { if (bMSUnicode) { m_GlyphIndex[charcode] = FXFT_Get_Char_Index( - m_Font.m_Face, m_Encoding.m_Unicodes[charcode]); + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); } else if (bMacRoman) { FX_DWORD maccode = FT_CharCodeFromUnicode( FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]); if (!maccode) { m_GlyphIndex[charcode] = - FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); } else { m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.m_Face, maccode); + FXFT_Get_Char_Index(m_Font.GetFace(), maccode); } } } if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) { if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) { - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 32); } else { m_GlyphIndex[charcode] = - FXFT_Get_Name_Index(m_Font.m_Face, (char*)name); + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); if (m_GlyphIndex[charcode] == 0) { if (bToUnicode) { CFX_WideString wsUnicode = UnicodeFromCharCode(charcode); if (!wsUnicode.IsEmpty()) { m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]); + FXFT_Get_Char_Index(m_Font.GetFace(), wsUnicode[0]); m_Encoding.m_Unicodes[charcode] = wsUnicode[0]; } } if (m_GlyphIndex[charcode] == 0) { m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.m_Face, charcode); + FXFT_Get_Char_Index(m_Font.GetFace(), charcode); } } } @@ -1564,13 +1563,13 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { } return; } - if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) { + if (FT_UseTTCharmap(m_Font.GetFace(), 3, 0)) { const uint8_t prefix[4] = {0x00, 0xf0, 0xf1, 0xf2}; FX_BOOL bGotOne = FALSE; for (int charcode = 0; charcode < 256; charcode++) { for (int j = 0; j < 4; j++) { FX_WORD unicode = prefix[j] * 256 + charcode; - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), unicode); if (m_GlyphIndex[charcode]) { bGotOne = TRUE; break; @@ -1587,7 +1586,7 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { } m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); } - } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) { + } else if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) { for (int charcode = 0; charcode < 256; charcode++) { m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode); @@ -1596,10 +1595,10 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { return; } } - if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) { + if (FT_UseTTCharmap(m_Font.GetFace(), 1, 0)) { FX_BOOL bGotOne = FALSE; for (int charcode = 0; charcode < 256; charcode++) { - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), charcode); m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode); if (m_GlyphIndex[charcode]) { @@ -1610,22 +1609,22 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { return; } } - if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) { + if (FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE) == 0) { FX_BOOL bGotOne = FALSE; const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding); for (int charcode = 0; charcode < 256; charcode++) { - if (m_pFontFile == NULL) { + if (m_pFontFile) { + m_Encoding.m_Unicodes[charcode] = charcode; + } else { const FX_CHAR* name = GetAdobeCharName(0, m_pCharNames, charcode); - if (name != NULL) { + if (name) { m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name); } else if (pUnicodes) { m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode]; } - } else { - m_Encoding.m_Unicodes[charcode] = charcode; } - m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]); + m_GlyphIndex[charcode] = FXFT_Get_Char_Index( + m_Font.GetFace(), m_Encoding.m_Unicodes[charcode]); if (m_GlyphIndex[charcode]) { bGotOne = TRUE; } diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp index ca6c04fef9..4814e93e7b 100644 --- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp +++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp @@ -1119,11 +1119,9 @@ void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { } FX_BOOL bVert = FALSE; int glyph_index = GlyphFromCharCode(charcode, &bVert); - if (m_Font.m_Face == NULL) { - rect = FX_RECT(0, 0, 0, 0); - } else { + FXFT_Face face = m_Font.GetFace(); + if (face) { rect.left = rect.bottom = rect.right = rect.top = 0; - FXFT_Face face = m_Font.m_Face; if (FXFT_Is_Face_Tricky(face)) { int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); @@ -1169,6 +1167,8 @@ void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { face); } } + } else { + rect = FX_RECT(0, 0, 0, 0); } if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) { FX_WORD CID = CIDFromCharCode(charcode); @@ -1245,7 +1245,8 @@ int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL* pVertGlyph) { if (pVertGlyph) { *pVertGlyph = FALSE; } - int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode); + FXFT_Face face = m_Font.GetFace(); + int index = FXFT_Get_Char_Index(face, unicode); if (unicode == 0x2502) { return index; } @@ -1261,20 +1262,19 @@ int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL* pVertGlyph) { } return index; } - if (NULL == m_Font.m_pGsubData) { + if (!m_Font.GetSubData()) { unsigned long length = 0; - int error = FXFT_Load_Sfnt_Table( - m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length); + int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, + NULL, &length); if (!error) { - m_Font.m_pGsubData = (unsigned char*)FX_Alloc(uint8_t, length); + m_Font.SetSubData((uint8_t*)FX_Alloc(uint8_t, length)); } } - int error = - FXFT_Load_Sfnt_Table(m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, - m_Font.m_pGsubData, NULL); - if (!error && m_Font.m_pGsubData) { + int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, + m_Font.GetSubData(), NULL); + if (!error && m_Font.GetSubData()) { m_pTTGSUBTable = new CFX_CTTGSUBTable; - m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData); + m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData()); TT_uint32_t vindex = 0; m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); if (vindex) { @@ -1322,16 +1322,17 @@ int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { unicode = UnicodeFromCharCode(charcode).GetAt(0); } } + FXFT_Face face = m_Font.GetFace(); if (unicode == 0) { if (!m_bAdobeCourierStd) { return charcode == 0 ? -1 : (int)charcode; } charcode += 31; int index = 0, iBaseEncoding; - FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1); + FX_BOOL bMSUnicode = FT_UseTTCharmap(face, 3, 1); FX_BOOL bMacRoman = FALSE; if (!bMSUnicode) { - bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0); + bMacRoman = FT_UseTTCharmap(face, 1, 0); } iBaseEncoding = PDFFONT_ENCODING_STANDARD; if (bMSUnicode) { @@ -1346,14 +1347,14 @@ int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { FX_WORD unicode = PDF_UnicodeFromAdobeName(name); if (unicode) { if (bMSUnicode) { - index = FXFT_Get_Char_Index(m_Font.m_Face, unicode); + index = FXFT_Get_Char_Index(face, unicode); } else if (bMacRoman) { FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode); - index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char*)name) - : FXFT_Get_Char_Index(m_Font.m_Face, maccode); + index = !maccode ? FXFT_Get_Name_Index(face, (char*)name) + : FXFT_Get_Char_Index(face, maccode); } else { - return FXFT_Get_Char_Index(m_Font.m_Face, unicode); + return FXFT_Get_Char_Index(face, unicode); } } else { return charcode == 0 ? -1 : (int)charcode; @@ -1373,57 +1374,53 @@ int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { } #endif } - if (m_Font.m_Face == NULL) { + if (!face) return unicode; - } - int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE); + + int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); if (err != 0) { int i; - for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) { + for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { FX_DWORD ret = FT_CharCodeFromUnicode( - FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), + FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]), (FX_WCHAR)charcode); if (ret == 0) { continue; } - FXFT_Set_Charmap(m_Font.m_Face, - FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]); + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]); unicode = (FX_WCHAR)ret; break; } - if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) { - FXFT_Set_Charmap(m_Font.m_Face, - FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]); + if (i == FXFT_Get_Face_CharmapCount(face) && i) { + FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]); unicode = (FX_WCHAR)charcode; } } - if (FXFT_Get_Face_Charmap(m_Font.m_Face)) { + if (FXFT_Get_Face_Charmap(face)) { int index = GetGlyphIndex(unicode, pVertGlyph); - if (index == 0) { + if (index == 0) return -1; - } return index; } return unicode; } - if (m_Font.m_Face == NULL) { + if (!m_Font.GetFace()) return -1; - } + FX_WORD cid = CIDFromCharCode(charcode); if (m_bType1) { - if (NULL == m_pCIDToGIDMap) { + if (!m_pCIDToGIDMap) { return cid; } } else { - if (m_pCIDToGIDMap == NULL) { - if (m_pFontFile && m_pCMap->m_pMapping == NULL) { + if (!m_pCIDToGIDMap) { + if (m_pFontFile && !m_pCMap->m_pMapping) return cid; - } if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || - FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) { + !FXFT_Get_Face_Charmap(m_Font.GetFace())) { return cid; } - if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == + 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()) { @@ -1435,9 +1432,9 @@ int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) { } } FX_DWORD byte_pos = cid * 2; - if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) { + if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) return -1; - } + const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos; return pdata[0] * 256 + pdata[1]; } diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp index 81383fa869..c45384feee 100644 --- a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp +++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp @@ -388,23 +388,23 @@ IFX_GSUBTable* IFX_GSUBTable::Create(CFX_Font* pFont) { if (!pFont) { return NULL; } - if (NULL == pFont->m_pGsubData) { + if (!pFont->GetSubData()) { unsigned long length = 0; int error = FXFT_Load_Sfnt_Table( - pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length); + pFont->GetFace(), FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length); if (!error) { - pFont->m_pGsubData = (unsigned char*)FX_Alloc(uint8_t, length); + pFont->SetSubData((uint8_t*)FX_Alloc(uint8_t, length)); } - if (!pFont->m_pGsubData) { + if (!pFont->GetSubData()) { return NULL; } } int error = - FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, - pFont->m_pGsubData, NULL); - if (!error && pFont->m_pGsubData) { + FXFT_Load_Sfnt_Table(pFont->GetFace(), FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, + pFont->GetSubData(), NULL); + if (!error && pFont->GetSubData()) { nonstd::unique_ptr<CFX_GSUBTable> pGsubTable(new CFX_GSUBTable); - if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) { + if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->GetSubData())) { return pGsubTable.release(); } } diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp index 50388332f8..1b16356a64 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp @@ -788,10 +788,10 @@ void CPDF_RenderStatus::DrawTextPathWithPattern( ProcessPath(&path, pObj2Device); } } + CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width) { int glyph_index = GlyphFromCharCode(charcode); - if (m_Font.m_Face == NULL) { - return NULL; - } + if (!m_Font.GetFace()) + return nullptr; return m_Font.LoadGlyphPath(glyph_index, dest_width); } diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp index d72adc36bf..d729d2ac1d 100644 --- a/core/src/fxge/ge/fx_ge_font.cpp +++ b/core/src/fxge/ge/fx_ge_font.cpp @@ -19,7 +19,6 @@ CFX_Font::CFX_Font() { m_pFontData = NULL; m_pFontDataAllocation = NULL; m_dwSize = 0; - m_pOwnedStream = NULL; m_pGsubData = NULL; m_pPlatformFont = NULL; m_pPlatformFontCollection = NULL; @@ -42,8 +41,6 @@ CFX_Font::~CFX_Font() { CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); } } - FX_Free(m_pOwnedStream); - m_pOwnedStream = NULL; FX_Free(m_pGsubData); m_pGsubData = NULL; #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ @@ -79,61 +76,7 @@ FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, } return TRUE; } -extern "C" { -unsigned long _FTStreamRead(FXFT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count) { - if (count == 0) { - return 0; - } - IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer; - int res = pFile->ReadBlock(buffer, offset, count); - if (res) { - return count; - } - return 0; -} -void _FTStreamClose(FXFT_Stream stream) {} -}; -FX_BOOL _LoadFile(FXFT_Library library, - FXFT_Face* Face, - IFX_FileRead* pFile, - FXFT_Stream* stream) { - FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(uint8_t, sizeof(FXFT_StreamRec)); - stream1->base = NULL; - stream1->size = (unsigned long)pFile->GetSize(); - stream1->pos = 0; - stream1->descriptor.pointer = pFile; - stream1->close = _FTStreamClose; - stream1->read = _FTStreamRead; - FXFT_Open_Args args; - args.flags = FT_OPEN_STREAM; - args.stream = stream1; - if (FXFT_Open_Face(library, &args, 0, Face)) { - FX_Free(stream1); - return FALSE; - } - if (stream) { - *stream = stream1; - } - return TRUE; -} -FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile) { - m_bEmbedded = FALSE; - FXFT_Library library; - if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) { - FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary); - } - library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; - FXFT_Stream stream = NULL; - if (!_LoadFile(library, &m_Face, pFile, &stream)) { - return FALSE; - } - m_pOwnedStream = stream; - FXFT_Set_Pixel_Sizes(m_Face, 0, 64); - return TRUE; -} + int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index) { if (!m_Face) { return 0; @@ -177,32 +120,31 @@ FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) { m_dwSize = size; return m_Face != NULL; } -FX_BOOL CFX_Font::IsTTFont() { - if (m_Face == NULL) { + +FX_BOOL CFX_Font::IsTTFont() const { + if (!m_Face) return FALSE; - } return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; } + int CFX_Font::GetAscent() const { - if (m_Face == NULL) { + if (!m_Face) return 0; - } - int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_Ascender(m_Face)); - return ascent; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Ascender(m_Face)); } + int CFX_Font::GetDescent() const { - if (m_Face == NULL) { + if (!m_Face) return 0; - } - int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_Descender(m_Face)); - return descent; + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Descender(m_Face)); } + FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox) { - if (m_Face == NULL) { + if (!m_Face) return FALSE; - } + if (FXFT_Is_Face_Tricky(m_Face)) { int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72); if (error) { @@ -265,10 +207,11 @@ FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox) { } return TRUE; } -FX_BOOL CFX_Font::IsItalic() { - if (m_Face == NULL) { + +FX_BOOL CFX_Font::IsItalic() const { + if (!m_Face) return FALSE; - } + FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC; if (!ret) { CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); @@ -279,18 +222,19 @@ FX_BOOL CFX_Font::IsItalic() { } return ret; } -FX_BOOL CFX_Font::IsBold() { - if (m_Face == NULL) { + +FX_BOOL CFX_Font::IsBold() const { + if (!m_Face) return FALSE; - } return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; } -FX_BOOL CFX_Font::IsFixedWidth() { - if (m_Face == NULL) { + +FX_BOOL CFX_Font::IsFixedWidth() const { + if (!m_Face) return FALSE; - } return FXFT_Is_Face_fixedwidth(m_Face); } + CFX_WideString CFX_Font::GetPsName() const { if (m_Face == NULL) { return CFX_WideString(); @@ -347,37 +291,37 @@ FX_BOOL CFX_Font::GetBBox(FX_RECT& bbox) { } return TRUE; } -int CFX_Font::GetHeight() { - if (m_Face == NULL) { + +int CFX_Font::GetHeight() const { + if (!m_Face) return 0; - } - int height = - EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face)); - return height; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_Height(m_Face)); } -int CFX_Font::GetMaxAdvanceWidth() { - if (m_Face == NULL) { + +int CFX_Font::GetMaxAdvanceWidth() const { + if (!m_Face) return 0; - } - int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_MaxAdvanceWidth(m_Face)); - return width; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_MaxAdvanceWidth(m_Face)); } -int CFX_Font::GetULPos() { - if (m_Face == NULL) { + +int CFX_Font::GetULPos() const { + if (!m_Face) return 0; - } - int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_UnderLinePosition(m_Face)); - return pos; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_UnderLinePosition(m_Face)); } -int CFX_Font::GetULthickness() { - if (m_Face == NULL) { + +int CFX_Font::GetULthickness() const { + if (!m_Face) return 0; - } - int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), - FXFT_Get_Face_UnderLineThickness(m_Face)); - return thickness; + + return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), + FXFT_Get_Face_UnderLineThickness(m_Face)); } CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) { @@ -394,7 +338,7 @@ FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode) { if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) return FXFT_Get_Char_Index(face, charcode); - if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) { + if (m_pFont->GetSubstFont() && m_pFont->GetSubstFont()->m_Charset == 2) { FX_DWORD index = 0; if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) index = FXFT_Get_Char_Index(face, charcode); |