| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include "core/fxge/include/cfx_fontmapper.h" |
| 8 #include <limits> | |
| 9 #include <utility> | |
| 10 #include <vector> | |
| 11 | 8 |
| 9 #include "core/fxge/include/ifx_systemfontinfo.h" |
| 12 #include "core/fxge/include/fx_font.h" | 10 #include "core/fxge/include/fx_font.h" |
| 13 | 11 |
| 14 #include "core/fxge/fontdata/chromefontdata/chromefontdata.h" | |
| 15 #include "core/fxge/include/fx_freetype.h" | |
| 16 #include "core/fxge/include/fx_ge.h" | |
| 17 #include "third_party/base/stl_util.h" | 12 #include "third_party/base/stl_util.h" |
| 18 | 13 |
| 19 #define GET_TT_SHORT(w) (uint16_t)(((w)[0] << 8) | (w)[1]) | |
| 20 #define GET_TT_LONG(w) \ | |
| 21 (uint32_t)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) | |
| 22 | |
| 23 #define FX_FONT_STYLE_None 0x00 | 14 #define FX_FONT_STYLE_None 0x00 |
| 24 #define FX_FONT_STYLE_Bold 0x01 | 15 #define FX_FONT_STYLE_Bold 0x01 |
| 25 #define FX_FONT_STYLE_Italic 0x02 | 16 #define FX_FONT_STYLE_Italic 0x02 |
| 26 #define FX_FONT_STYLE_BoldBold 0x04 | 17 #define FX_FONT_STYLE_BoldBold 0x04 |
| 27 | 18 |
| 28 namespace { | 19 namespace { |
| 29 | 20 |
| 30 struct BuiltinFont { | |
| 31 const uint8_t* m_pFontData; | |
| 32 uint32_t m_dwSize; | |
| 33 }; | |
| 34 | |
| 35 const BuiltinFont g_FoxitFonts[14] = { | |
| 36 {g_FoxitFixedFontData, 17597}, | |
| 37 {g_FoxitFixedBoldFontData, 18055}, | |
| 38 {g_FoxitFixedBoldItalicFontData, 19151}, | |
| 39 {g_FoxitFixedItalicFontData, 18746}, | |
| 40 {g_FoxitSansFontData, 15025}, | |
| 41 {g_FoxitSansBoldFontData, 16344}, | |
| 42 {g_FoxitSansBoldItalicFontData, 16418}, | |
| 43 {g_FoxitSansItalicFontData, 16339}, | |
| 44 {g_FoxitSerifFontData, 19469}, | |
| 45 {g_FoxitSerifBoldFontData, 19395}, | |
| 46 {g_FoxitSerifBoldItalicFontData, 20733}, | |
| 47 {g_FoxitSerifItalicFontData, 21227}, | |
| 48 {g_FoxitSymbolFontData, 16729}, | |
| 49 {g_FoxitDingbatsFontData, 29513}, | |
| 50 }; | |
| 51 | |
| 52 const BuiltinFont g_MMFonts[2] = { | |
| 53 {g_FoxitSerifMMFontData, 113417}, | |
| 54 {g_FoxitSansMMFontData, 66919}, | |
| 55 }; | |
| 56 | |
| 57 const FX_CHAR* const g_Base14FontNames[14] = { | 21 const FX_CHAR* const g_Base14FontNames[14] = { |
| 58 "Courier", | 22 "Courier", |
| 59 "Courier-Bold", | 23 "Courier-Bold", |
| 60 "Courier-BoldOblique", | 24 "Courier-BoldOblique", |
| 61 "Courier-Oblique", | 25 "Courier-Oblique", |
| 62 "Helvetica", | 26 "Helvetica", |
| 63 "Helvetica-Bold", | 27 "Helvetica-Bold", |
| 64 "Helvetica-BoldOblique", | 28 "Helvetica-BoldOblique", |
| 65 "Helvetica-Oblique", | 29 "Helvetica-Oblique", |
| 66 "Times-Roman", | 30 "Times-Roman", |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 {"TimesNewRomanPS-BoldMT", 9}, | 123 {"TimesNewRomanPS-BoldMT", 9}, |
| 160 {"TimesNewRomanPS-Italic", 11}, | 124 {"TimesNewRomanPS-Italic", 11}, |
| 161 {"TimesNewRomanPS-ItalicMT", 11}, | 125 {"TimesNewRomanPS-ItalicMT", 11}, |
| 162 {"TimesNewRomanPSMT", 8}, | 126 {"TimesNewRomanPSMT", 8}, |
| 163 {"TimesNewRomanPSMT,Bold", 9}, | 127 {"TimesNewRomanPSMT,Bold", 9}, |
| 164 {"TimesNewRomanPSMT,BoldItalic", 10}, | 128 {"TimesNewRomanPSMT,BoldItalic", 10}, |
| 165 {"TimesNewRomanPSMT,Italic", 11}, | 129 {"TimesNewRomanPSMT,Italic", 11}, |
| 166 {"ZapfDingbats", 13}, | 130 {"ZapfDingbats", 13}, |
| 167 }; | 131 }; |
| 168 | 132 |
| 169 const struct { | |
| 170 const FX_CHAR* m_pName; | |
| 171 const FX_CHAR* m_pSubstName; | |
| 172 } Base14Substs[] = { | |
| 173 {"Courier", "Courier New"}, | |
| 174 {"Courier-Bold", "Courier New Bold"}, | |
| 175 {"Courier-BoldOblique", "Courier New Bold Italic"}, | |
| 176 {"Courier-Oblique", "Courier New Italic"}, | |
| 177 {"Helvetica", "Arial"}, | |
| 178 {"Helvetica-Bold", "Arial Bold"}, | |
| 179 {"Helvetica-BoldOblique", "Arial Bold Italic"}, | |
| 180 {"Helvetica-Oblique", "Arial Italic"}, | |
| 181 {"Times-Roman", "Times New Roman"}, | |
| 182 {"Times-Bold", "Times New Roman Bold"}, | |
| 183 {"Times-BoldItalic", "Times New Roman Bold Italic"}, | |
| 184 {"Times-Italic", "Times New Roman Italic"}, | |
| 185 }; | |
| 186 | |
| 187 const struct AltFontFamily { | 133 const struct AltFontFamily { |
| 188 const FX_CHAR* m_pFontName; | 134 const FX_CHAR* m_pFontName; |
| 189 const FX_CHAR* m_pFontFamily; | 135 const FX_CHAR* m_pFontFamily; |
| 190 } g_AltFontFamilies[] = { | 136 } g_AltFontFamilies[] = { |
| 191 {"AGaramondPro", "Adobe Garamond Pro"}, | 137 {"AGaramondPro", "Adobe Garamond Pro"}, |
| 192 {"BankGothicBT-Medium", "BankGothic Md BT"}, | 138 {"BankGothicBT-Medium", "BankGothic Md BT"}, |
| 193 {"ForteMT", "Forte"}, | 139 {"ForteMT", "Forte"}, |
| 194 }; | 140 }; |
| 195 | 141 |
| 196 const struct FX_FontStyle { | 142 const struct FX_FontStyle { |
| 197 const FX_CHAR* style; | 143 const FX_CHAR* style; |
| 198 int32_t len; | 144 int32_t len; |
| 199 } g_FontStyles[] = { | 145 } g_FontStyles[] = { |
| 200 {"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, | 146 {"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, |
| 201 }; | 147 }; |
| 202 | 148 |
| 203 const struct CODEPAGE_MAP { | 149 const struct CODEPAGE_MAP { |
| 204 uint16_t codepage; | 150 uint16_t codepage; |
| 205 uint8_t charset; | 151 uint8_t charset; |
| 206 } g_Codepage2CharsetTable[] = { | 152 } g_Codepage2CharsetTable[] = { |
| 207 {0, 1}, {42, 2}, {437, 254}, {850, 255}, {874, 222}, | 153 {0, 1}, {42, 2}, {437, 254}, {850, 255}, {874, 222}, |
| 208 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, | 154 {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, |
| 209 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, | 155 {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, |
| 210 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, | 156 {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, |
| 211 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, | 157 {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, |
| 212 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, | 158 {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, |
| 213 {10081, 86}, | 159 {10081, 86}, |
| 214 }; | 160 }; |
| 215 | 161 |
| 216 const uint32_t kTableNAME = FXDWORD_GET_MSBFIRST("name"); | |
| 217 const uint32_t kTableTTCF = FXDWORD_GET_MSBFIRST("ttcf"); | |
| 218 | |
| 219 int CompareFontFamilyString(const void* key, const void* element) { | 162 int CompareFontFamilyString(const void* key, const void* element) { |
| 220 CFX_ByteString str_key((const FX_CHAR*)key); | 163 CFX_ByteString str_key((const FX_CHAR*)key); |
| 221 if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) { | 164 if (str_key.Find(((AltFontFamily*)element)->m_pFontName) != -1) { |
| 222 return 0; | 165 return 0; |
| 223 } | 166 } |
| 224 return FXSYS_stricmp((const FX_CHAR*)key, | 167 return FXSYS_stricmp((const FX_CHAR*)key, |
| 225 ((AltFontFamily*)element)->m_pFontName); | 168 ((AltFontFamily*)element)->m_pFontName); |
| 226 } | 169 } |
| 227 | 170 |
| 228 int CompareString(const void* key, const void* element) { | 171 int CompareString(const void* key, const void* element) { |
| 229 return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); | 172 return FXSYS_stricmp((const FX_CHAR*)key, ((AltFontName*)element)->m_pName); |
| 230 } | 173 } |
| 231 | 174 |
| 232 CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, | |
| 233 int weight, | |
| 234 FX_BOOL bItalic) { | |
| 235 CFX_ByteString key(face_name); | |
| 236 key += ','; | |
| 237 key += CFX_ByteString::FormatInteger(weight); | |
| 238 key += bItalic ? 'I' : 'N'; | |
| 239 return key; | |
| 240 } | |
| 241 | |
| 242 CFX_ByteString KeyNameFromSize(int ttc_size, uint32_t checksum) { | |
| 243 CFX_ByteString key; | |
| 244 key.Format("%d:%d", ttc_size, checksum); | |
| 245 return key; | |
| 246 } | |
| 247 | |
| 248 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { | 175 CFX_ByteString TT_NormalizeName(const FX_CHAR* family) { |
| 249 CFX_ByteString norm(family); | 176 CFX_ByteString norm(family); |
| 250 norm.Remove(' '); | 177 norm.Remove(' '); |
| 251 norm.Remove('-'); | 178 norm.Remove('-'); |
| 252 norm.Remove(','); | 179 norm.Remove(','); |
| 253 int pos = norm.Find('+'); | 180 int pos = norm.Find('+'); |
| 254 if (pos > 0) { | 181 if (pos > 0) { |
| 255 norm = norm.Left(pos); | 182 norm = norm.Left(pos); |
| 256 } | 183 } |
| 257 norm.MakeLower(); | 184 norm.MakeLower(); |
| 258 return norm; | 185 return norm; |
| 259 } | 186 } |
| 260 | 187 |
| 261 CFX_ByteString FPDF_ReadStringFromFile(FXSYS_FILE* pFile, uint32_t size) { | |
| 262 CFX_ByteString buffer; | |
| 263 if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) { | |
| 264 return CFX_ByteString(); | |
| 265 } | |
| 266 buffer.ReleaseBuffer(size); | |
| 267 return buffer; | |
| 268 } | |
| 269 | |
| 270 CFX_ByteString FPDF_LoadTableFromTT(FXSYS_FILE* pFile, | |
| 271 const uint8_t* pTables, | |
| 272 uint32_t nTables, | |
| 273 uint32_t tag) { | |
| 274 for (uint32_t i = 0; i < nTables; i++) { | |
| 275 const uint8_t* p = pTables + i * 16; | |
| 276 if (GET_TT_LONG(p) == tag) { | |
| 277 uint32_t offset = GET_TT_LONG(p + 8); | |
| 278 uint32_t size = GET_TT_LONG(p + 12); | |
| 279 FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); | |
| 280 return FPDF_ReadStringFromFile(pFile, size); | |
| 281 } | |
| 282 } | |
| 283 return CFX_ByteString(); | |
| 284 } | |
| 285 | |
| 286 uint8_t GetCharsetFromCodePage(uint16_t codepage) { | 188 uint8_t GetCharsetFromCodePage(uint16_t codepage) { |
| 287 const CODEPAGE_MAP* pEnd = | 189 const CODEPAGE_MAP* pEnd = |
| 288 g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); | 190 g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); |
| 289 const CODEPAGE_MAP* pCharmap = | 191 const CODEPAGE_MAP* pCharmap = |
| 290 std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, | 192 std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, |
| 291 [](const CODEPAGE_MAP& charset, uint16_t page) { | 193 [](const CODEPAGE_MAP& charset, uint16_t page) { |
| 292 return charset.codepage < page; | 194 return charset.codepage < page; |
| 293 }); | 195 }); |
| 294 if (pCharmap < pEnd && codepage == pCharmap->codepage) | 196 if (pCharmap < pEnd && codepage == pCharmap->codepage) |
| 295 return pCharmap->charset; | 197 return pCharmap->charset; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 } | 259 } |
| 358 | 260 |
| 359 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { | 261 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
| 360 if (name == "MyriadPro") { | 262 if (name == "MyriadPro") { |
| 361 PitchFamily &= ~FXFONT_FF_ROMAN; | 263 PitchFamily &= ~FXFONT_FF_ROMAN; |
| 362 return TRUE; | 264 return TRUE; |
| 363 } | 265 } |
| 364 return FALSE; | 266 return FALSE; |
| 365 } | 267 } |
| 366 | 268 |
| 367 uint32_t GetCharset(int charset) { | |
| 368 switch (charset) { | |
| 369 case FXFONT_SHIFTJIS_CHARSET: | |
| 370 return CHARSET_FLAG_SHIFTJIS; | |
| 371 case FXFONT_GB2312_CHARSET: | |
| 372 return CHARSET_FLAG_GB; | |
| 373 case FXFONT_CHINESEBIG5_CHARSET: | |
| 374 return CHARSET_FLAG_BIG5; | |
| 375 case FXFONT_HANGEUL_CHARSET: | |
| 376 return CHARSET_FLAG_KOREAN; | |
| 377 case FXFONT_SYMBOL_CHARSET: | |
| 378 return CHARSET_FLAG_SYMBOL; | |
| 379 case FXFONT_ANSI_CHARSET: | |
| 380 return CHARSET_FLAG_ANSI; | |
| 381 default: | |
| 382 break; | |
| 383 } | |
| 384 return 0; | |
| 385 } | |
| 386 | |
| 387 int32_t GetSimilarValue(int weight, | |
| 388 FX_BOOL bItalic, | |
| 389 int pitch_family, | |
| 390 uint32_t style) { | |
| 391 int32_t iSimilarValue = 0; | |
| 392 if (!!(style & FXFONT_BOLD) == (weight > 400)) { | |
| 393 iSimilarValue += 16; | |
| 394 } | |
| 395 if (!!(style & FXFONT_ITALIC) == bItalic) { | |
| 396 iSimilarValue += 16; | |
| 397 } | |
| 398 if (!!(style & FXFONT_SERIF) == !!(pitch_family & FXFONT_FF_ROMAN)) { | |
| 399 iSimilarValue += 16; | |
| 400 } | |
| 401 if (!!(style & FXFONT_SCRIPT) == !!(pitch_family & FXFONT_FF_SCRIPT)) { | |
| 402 iSimilarValue += 8; | |
| 403 } | |
| 404 if (!!(style & FXFONT_FIXED_PITCH) == | |
| 405 !!(pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
| 406 iSimilarValue += 8; | |
| 407 } | |
| 408 return iSimilarValue; | |
| 409 } | |
| 410 | |
| 411 } // namespace | 269 } // namespace |
| 412 | 270 |
| 413 CFX_SubstFont::CFX_SubstFont() { | |
| 414 m_ExtHandle = nullptr; | |
| 415 m_Charset = FXFONT_ANSI_CHARSET; | |
| 416 m_SubstFlags = 0; | |
| 417 m_Weight = 0; | |
| 418 m_ItalicAngle = 0; | |
| 419 m_bSubstCJK = false; | |
| 420 m_WeightCJK = 0; | |
| 421 m_bItalicCJK = false; | |
| 422 } | |
| 423 | |
| 424 CTTFontDesc::~CTTFontDesc() { | |
| 425 if (m_Type == 1) { | |
| 426 if (m_SingleFace.m_pFace) { | |
| 427 FXFT_Done_Face(m_SingleFace.m_pFace); | |
| 428 } | |
| 429 } else if (m_Type == 2) { | |
| 430 for (int i = 0; i < 16; i++) | |
| 431 if (m_TTCFace.m_pFaces[i]) { | |
| 432 FXFT_Done_Face(m_TTCFace.m_pFaces[i]); | |
| 433 } | |
| 434 } | |
| 435 FX_Free(m_pFontData); | |
| 436 } | |
| 437 int CTTFontDesc::ReleaseFace(FXFT_Face face) { | |
| 438 if (m_Type == 1) { | |
| 439 if (m_SingleFace.m_pFace != face) { | |
| 440 return -1; | |
| 441 } | |
| 442 } else if (m_Type == 2) { | |
| 443 int i; | |
| 444 for (i = 0; i < 16; i++) | |
| 445 if (m_TTCFace.m_pFaces[i] == face) { | |
| 446 break; | |
| 447 } | |
| 448 if (i == 16) { | |
| 449 return -1; | |
| 450 } | |
| 451 } | |
| 452 m_RefCount--; | |
| 453 if (m_RefCount) { | |
| 454 return m_RefCount; | |
| 455 } | |
| 456 delete this; | |
| 457 return 0; | |
| 458 } | |
| 459 | |
| 460 CFX_FontMgr::CFX_FontMgr() | |
| 461 : m_FTLibrary(nullptr), m_FTLibrarySupportsHinting(false) { | |
| 462 m_pBuiltinMapper.reset(new CFX_FontMapper(this)); | |
| 463 } | |
| 464 | |
| 465 CFX_FontMgr::~CFX_FontMgr() { | |
| 466 for (const auto& pair : m_FaceMap) | |
| 467 delete pair.second; | |
| 468 | |
| 469 // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed | |
| 470 // first. | |
| 471 m_pBuiltinMapper.reset(); | |
| 472 FXFT_Done_FreeType(m_FTLibrary); | |
| 473 } | |
| 474 | |
| 475 void CFX_FontMgr::InitFTLibrary() { | |
| 476 if (m_FTLibrary) | |
| 477 return; | |
| 478 FXFT_Init_FreeType(&m_FTLibrary); | |
| 479 m_FTLibrarySupportsHinting = | |
| 480 FXFT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != | |
| 481 FT_Err_Unimplemented_Feature; | |
| 482 } | |
| 483 | |
| 484 void CFX_FontMgr::SetSystemFontInfo( | |
| 485 std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { | |
| 486 m_pBuiltinMapper->SetSystemFontInfo(std::move(pFontInfo)); | |
| 487 } | |
| 488 | |
| 489 FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, | |
| 490 FX_BOOL bTrueType, | |
| 491 uint32_t flags, | |
| 492 int weight, | |
| 493 int italic_angle, | |
| 494 int CharsetCP, | |
| 495 CFX_SubstFont* pSubstFont) { | |
| 496 InitFTLibrary(); | |
| 497 return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, | |
| 498 italic_angle, CharsetCP, pSubstFont); | |
| 499 } | |
| 500 | |
| 501 FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, | |
| 502 int weight, | |
| 503 FX_BOOL bItalic, | |
| 504 uint8_t*& pFontData) { | |
| 505 auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); | |
| 506 if (it == m_FaceMap.end()) | |
| 507 return nullptr; | |
| 508 | |
| 509 CTTFontDesc* pFontDesc = it->second; | |
| 510 pFontData = pFontDesc->m_pFontData; | |
| 511 pFontDesc->m_RefCount++; | |
| 512 return pFontDesc->m_SingleFace.m_pFace; | |
| 513 } | |
| 514 FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, | |
| 515 int weight, | |
| 516 FX_BOOL bItalic, | |
| 517 uint8_t* pData, | |
| 518 uint32_t size, | |
| 519 int face_index) { | |
| 520 CTTFontDesc* pFontDesc = new CTTFontDesc; | |
| 521 pFontDesc->m_Type = 1; | |
| 522 pFontDesc->m_SingleFace.m_pFace = nullptr; | |
| 523 pFontDesc->m_SingleFace.m_bBold = weight; | |
| 524 pFontDesc->m_SingleFace.m_bItalic = bItalic; | |
| 525 pFontDesc->m_pFontData = pData; | |
| 526 pFontDesc->m_RefCount = 1; | |
| 527 | |
| 528 InitFTLibrary(); | |
| 529 FXFT_Library library = m_FTLibrary; | |
| 530 int ret = FXFT_New_Memory_Face(library, pData, size, face_index, | |
| 531 &pFontDesc->m_SingleFace.m_pFace); | |
| 532 if (ret) { | |
| 533 delete pFontDesc; | |
| 534 return nullptr; | |
| 535 } | |
| 536 ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); | |
| 537 if (ret) { | |
| 538 delete pFontDesc; | |
| 539 return nullptr; | |
| 540 } | |
| 541 m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; | |
| 542 return pFontDesc->m_SingleFace.m_pFace; | |
| 543 } | |
| 544 | |
| 545 int GetTTCIndex(const uint8_t* pFontData, | |
| 546 uint32_t ttc_size, | |
| 547 uint32_t font_offset) { | |
| 548 int face_index = 0; | |
| 549 const uint8_t* p = pFontData + 8; | |
| 550 uint32_t nfont = GET_TT_LONG(p); | |
| 551 uint32_t index; | |
| 552 for (index = 0; index < nfont; index++) { | |
| 553 p = pFontData + 12 + index * 4; | |
| 554 if (GET_TT_LONG(p) == font_offset) { | |
| 555 break; | |
| 556 } | |
| 557 } | |
| 558 if (index >= nfont) { | |
| 559 face_index = 0; | |
| 560 } else { | |
| 561 face_index = index; | |
| 562 } | |
| 563 return face_index; | |
| 564 } | |
| 565 FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, | |
| 566 uint32_t checksum, | |
| 567 int font_offset, | |
| 568 uint8_t*& pFontData) { | |
| 569 auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); | |
| 570 if (it == m_FaceMap.end()) | |
| 571 return nullptr; | |
| 572 | |
| 573 CTTFontDesc* pFontDesc = it->second; | |
| 574 pFontData = pFontDesc->m_pFontData; | |
| 575 pFontDesc->m_RefCount++; | |
| 576 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); | |
| 577 if (!pFontDesc->m_TTCFace.m_pFaces[face_index]) { | |
| 578 pFontDesc->m_TTCFace.m_pFaces[face_index] = | |
| 579 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); | |
| 580 } | |
| 581 return pFontDesc->m_TTCFace.m_pFaces[face_index]; | |
| 582 } | |
| 583 FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, | |
| 584 uint32_t checksum, | |
| 585 uint8_t* pData, | |
| 586 uint32_t size, | |
| 587 int font_offset) { | |
| 588 CTTFontDesc* pFontDesc = new CTTFontDesc; | |
| 589 pFontDesc->m_Type = 2; | |
| 590 pFontDesc->m_pFontData = pData; | |
| 591 for (int i = 0; i < 16; i++) { | |
| 592 pFontDesc->m_TTCFace.m_pFaces[i] = nullptr; | |
| 593 } | |
| 594 pFontDesc->m_RefCount++; | |
| 595 m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc; | |
| 596 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); | |
| 597 pFontDesc->m_TTCFace.m_pFaces[face_index] = | |
| 598 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); | |
| 599 return pFontDesc->m_TTCFace.m_pFaces[face_index]; | |
| 600 } | |
| 601 | |
| 602 FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, | |
| 603 uint32_t size, | |
| 604 int face_index) { | |
| 605 InitFTLibrary(); | |
| 606 FXFT_Library library = m_FTLibrary; | |
| 607 FXFT_Face face = nullptr; | |
| 608 if (FXFT_New_Memory_Face(library, pData, size, face_index, &face)) | |
| 609 return nullptr; | |
| 610 return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; | |
| 611 } | |
| 612 | |
| 613 FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) { | |
| 614 InitFTLibrary(); | |
| 615 FXFT_Library library = m_FTLibrary; | |
| 616 FXFT_Face face = nullptr; | |
| 617 if (FXFT_New_Face(library, filename, face_index, &face)) | |
| 618 return nullptr; | |
| 619 return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; | |
| 620 } | |
| 621 | |
| 622 void CFX_FontMgr::ReleaseFace(FXFT_Face face) { | |
| 623 if (!face) { | |
| 624 return; | |
| 625 } | |
| 626 FX_BOOL bNeedFaceDone = TRUE; | |
| 627 auto it = m_FaceMap.begin(); | |
| 628 while (it != m_FaceMap.end()) { | |
| 629 auto temp = it++; | |
| 630 int nRet = temp->second->ReleaseFace(face); | |
| 631 if (nRet == -1) | |
| 632 continue; | |
| 633 bNeedFaceDone = FALSE; | |
| 634 if (nRet == 0) | |
| 635 m_FaceMap.erase(temp); | |
| 636 break; | |
| 637 } | |
| 638 if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) | |
| 639 FXFT_Done_Face(face); | |
| 640 } | |
| 641 | |
| 642 bool CFX_FontMgr::GetBuiltinFont(size_t index, | |
| 643 const uint8_t** pFontData, | |
| 644 uint32_t* size) { | |
| 645 if (index < FX_ArraySize(g_FoxitFonts)) { | |
| 646 *pFontData = g_FoxitFonts[index].m_pFontData; | |
| 647 *size = g_FoxitFonts[index].m_dwSize; | |
| 648 return true; | |
| 649 } | |
| 650 index -= FX_ArraySize(g_FoxitFonts); | |
| 651 if (index < FX_ArraySize(g_MMFonts)) { | |
| 652 *pFontData = g_MMFonts[index].m_pFontData; | |
| 653 *size = g_MMFonts[index].m_dwSize; | |
| 654 return true; | |
| 655 } | |
| 656 return false; | |
| 657 } | |
| 658 | |
| 659 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) | 271 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) |
| 660 : m_bListLoaded(FALSE), | 272 : m_bListLoaded(FALSE), m_pFontMgr(mgr) { |
| 661 m_pFontMgr(mgr) { | |
| 662 m_MMFaces[0] = nullptr; | 273 m_MMFaces[0] = nullptr; |
| 663 m_MMFaces[1] = nullptr; | 274 m_MMFaces[1] = nullptr; |
| 664 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); | 275 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); |
| 665 } | 276 } |
| 666 | 277 |
| 667 CFX_FontMapper::~CFX_FontMapper() { | 278 CFX_FontMapper::~CFX_FontMapper() { |
| 668 for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { | 279 for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { |
| 669 if (m_FoxitFaces[i]) | 280 if (m_FoxitFaces[i]) |
| 670 FXFT_Done_Face(m_FoxitFaces[i]); | 281 FXFT_Done_Face(m_FoxitFaces[i]); |
| 671 } | 282 } |
| 672 if (m_MMFaces[0]) | 283 if (m_MMFaces[0]) |
| 673 FXFT_Done_Face(m_MMFaces[0]); | 284 FXFT_Done_Face(m_MMFaces[0]); |
| 674 if (m_MMFaces[1]) | 285 if (m_MMFaces[1]) |
| 675 FXFT_Done_Face(m_MMFaces[1]); | 286 FXFT_Done_Face(m_MMFaces[1]); |
| 676 } | 287 } |
| 677 | 288 |
| 678 void CFX_FontMapper::SetSystemFontInfo( | 289 void CFX_FontMapper::SetSystemFontInfo( |
| 679 std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { | 290 std::unique_ptr<IFX_SystemFontInfo> pFontInfo) { |
| 680 if (!pFontInfo) | 291 if (!pFontInfo) |
| 681 return; | 292 return; |
| 682 | 293 |
| 683 m_pFontInfo = std::move(pFontInfo); | 294 m_pFontInfo = std::move(pFontInfo); |
| 684 } | 295 } |
| 685 | 296 |
| 686 static CFX_ByteString GetStringFromTable(const uint8_t* string_ptr, | |
| 687 uint32_t string_ptr_length, | |
| 688 uint16_t offset, | |
| 689 uint16_t length) { | |
| 690 if (string_ptr_length < static_cast<uint32_t>(offset + length)) { | |
| 691 return CFX_ByteString(); | |
| 692 } | |
| 693 return CFX_ByteString(string_ptr + offset, length); | |
| 694 } | |
| 695 | |
| 696 CFX_ByteString GetNameFromTT(const uint8_t* name_table, | |
| 697 uint32_t name_table_size, | |
| 698 uint32_t name_id) { | |
| 699 if (!name_table || name_table_size < 6) { | |
| 700 return CFX_ByteString(); | |
| 701 } | |
| 702 uint32_t name_count = GET_TT_SHORT(name_table + 2); | |
| 703 uint32_t string_offset = GET_TT_SHORT(name_table + 4); | |
| 704 // We will ignore the possibility of overlap of structures and | |
| 705 // string table as if it's all corrupt there's not a lot we can do. | |
| 706 if (name_table_size < string_offset) { | |
| 707 return CFX_ByteString(); | |
| 708 } | |
| 709 | |
| 710 const uint8_t* string_ptr = name_table + string_offset; | |
| 711 uint32_t string_ptr_size = name_table_size - string_offset; | |
| 712 name_table += 6; | |
| 713 name_table_size -= 6; | |
| 714 if (name_table_size < name_count * 12) { | |
| 715 return CFX_ByteString(); | |
| 716 } | |
| 717 | |
| 718 for (uint32_t i = 0; i < name_count; i++, name_table += 12) { | |
| 719 if (GET_TT_SHORT(name_table + 6) == name_id && | |
| 720 GET_TT_SHORT(name_table) == 1 && GET_TT_SHORT(name_table + 2) == 0) { | |
| 721 return GetStringFromTable(string_ptr, string_ptr_size, | |
| 722 GET_TT_SHORT(name_table + 10), | |
| 723 GET_TT_SHORT(name_table + 8)); | |
| 724 } | |
| 725 } | |
| 726 return CFX_ByteString(); | |
| 727 } | |
| 728 | |
| 729 CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { | 297 CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont) { |
| 730 if (!m_pFontInfo) | 298 if (!m_pFontInfo) |
| 731 return CFX_ByteString(); | 299 return CFX_ByteString(); |
| 732 | 300 |
| 733 uint32_t size = m_pFontInfo->GetFontData(hFont, kTableNAME, nullptr, 0); | 301 uint32_t size = m_pFontInfo->GetFontData(hFont, kTableNAME, nullptr, 0); |
| 734 if (!size) | 302 if (!size) |
| 735 return CFX_ByteString(); | 303 return CFX_ByteString(); |
| 736 | 304 |
| 737 std::vector<uint8_t> buffer(size); | 305 std::vector<uint8_t> buffer(size); |
| 738 uint8_t* buffer_ptr = buffer.data(); | 306 uint8_t* buffer_ptr = buffer.data(); |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 } | 871 } |
| 1304 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); | 872 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); |
| 1305 face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, | 873 face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, |
| 1306 font_size, | 874 font_size, |
| 1307 m_pFontInfo->GetFaceIndex(hFont)); | 875 m_pFontInfo->GetFaceIndex(hFont)); |
| 1308 } | 876 } |
| 1309 } | 877 } |
| 1310 m_pFontInfo->DeleteFont(hFont); | 878 m_pFontInfo->DeleteFont(hFont); |
| 1311 return face; | 879 return face; |
| 1312 } | 880 } |
| 1313 | |
| 1314 void* IFX_SystemFontInfo::MapFontByUnicode(uint32_t dwUnicode, | |
| 1315 int weight, | |
| 1316 FX_BOOL bItalic, | |
| 1317 int pitch_family) { | |
| 1318 return nullptr; | |
| 1319 } | |
| 1320 #endif // PDF_ENABLE_XFA | 881 #endif // PDF_ENABLE_XFA |
| 1321 | 882 |
| 1322 int IFX_SystemFontInfo::GetFaceIndex(void* hFont) { | |
| 1323 return 0; | |
| 1324 } | |
| 1325 | |
| 1326 void* IFX_SystemFontInfo::RetainFont(void* hFont) { | |
| 1327 return nullptr; | |
| 1328 } | |
| 1329 | |
| 1330 int CFX_FontMapper::GetFaceSize() const { | 883 int CFX_FontMapper::GetFaceSize() const { |
| 1331 return pdfium::CollectionSize<int>(m_FaceArray); | 884 return pdfium::CollectionSize<int>(m_FaceArray); |
| 1332 } | 885 } |
| 1333 | 886 |
| 1334 FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { | 887 FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { |
| 1335 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { | 888 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { |
| 1336 if (m_MMFaces[i] == face) { | 889 if (m_MMFaces[i] == face) { |
| 1337 return TRUE; | 890 return TRUE; |
| 1338 } | 891 } |
| 1339 } | 892 } |
| 1340 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { | 893 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { |
| 1341 if (m_FoxitFaces[i] == face) { | 894 if (m_FoxitFaces[i] == face) { |
| 1342 return TRUE; | 895 return TRUE; |
| 1343 } | 896 } |
| 1344 } | 897 } |
| 1345 return FALSE; | 898 return FALSE; |
| 1346 } | 899 } |
| 1347 | 900 |
| 1348 extern "C" { | |
| 1349 unsigned long _FTStreamRead(FXFT_Stream stream, | |
| 1350 unsigned long offset, | |
| 1351 unsigned char* buffer, | |
| 1352 unsigned long count); | |
| 1353 void _FTStreamClose(FXFT_Stream stream); | |
| 1354 }; | |
| 1355 | |
| 1356 #if _FX_OS_ == _FX_ANDROID_ | |
| 1357 std::unique_ptr<IFX_SystemFontInfo> IFX_SystemFontInfo::CreateDefault( | |
| 1358 const char** pUnused) { | |
| 1359 return nullptr; | |
| 1360 } | |
| 1361 #endif | |
| 1362 | |
| 1363 CFX_FontFaceInfo::CFX_FontFaceInfo(CFX_ByteString filePath, | |
| 1364 CFX_ByteString faceName, | |
| 1365 CFX_ByteString fontTables, | |
| 1366 uint32_t fontOffset, | |
| 1367 uint32_t fileSize) | |
| 1368 : m_FilePath(filePath), | |
| 1369 m_FaceName(faceName), | |
| 1370 m_FontTables(fontTables), | |
| 1371 m_FontOffset(fontOffset), | |
| 1372 m_FileSize(fileSize), | |
| 1373 m_Styles(0), | |
| 1374 m_Charsets(0) {} | |
| 1375 | |
| 1376 CFX_FolderFontInfo::CFX_FolderFontInfo() {} | |
| 1377 | |
| 1378 CFX_FolderFontInfo::~CFX_FolderFontInfo() { | |
| 1379 for (const auto& pair : m_FontList) { | |
| 1380 delete pair.second; | |
| 1381 } | |
| 1382 } | |
| 1383 | |
| 1384 void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { | |
| 1385 m_PathList.push_back(CFX_ByteString(path)); | |
| 1386 } | |
| 1387 | |
| 1388 FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { | |
| 1389 m_pMapper = pMapper; | |
| 1390 for (const auto& path : m_PathList) | |
| 1391 ScanPath(path); | |
| 1392 return TRUE; | |
| 1393 } | |
| 1394 void CFX_FolderFontInfo::ScanPath(const CFX_ByteString& path) { | |
| 1395 void* handle = FX_OpenFolder(path.c_str()); | |
| 1396 if (!handle) | |
| 1397 return; | |
| 1398 | |
| 1399 CFX_ByteString filename; | |
| 1400 FX_BOOL bFolder; | |
| 1401 while (FX_GetNextFile(handle, filename, bFolder)) { | |
| 1402 if (bFolder) { | |
| 1403 if (filename == "." || filename == "..") | |
| 1404 continue; | |
| 1405 } else { | |
| 1406 CFX_ByteString ext = filename.Right(4); | |
| 1407 ext.MakeUpper(); | |
| 1408 if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") | |
| 1409 continue; | |
| 1410 } | |
| 1411 | |
| 1412 CFX_ByteString fullpath = path; | |
| 1413 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | |
| 1414 fullpath += "\\"; | |
| 1415 #else | |
| 1416 fullpath += "/"; | |
| 1417 #endif | |
| 1418 | |
| 1419 fullpath += filename; | |
| 1420 bFolder ? ScanPath(fullpath) : ScanFile(fullpath); | |
| 1421 } | |
| 1422 FX_CloseFolder(handle); | |
| 1423 } | |
| 1424 | |
| 1425 void CFX_FolderFontInfo::ScanFile(const CFX_ByteString& path) { | |
| 1426 FXSYS_FILE* pFile = FXSYS_fopen(path.c_str(), "rb"); | |
| 1427 if (!pFile) | |
| 1428 return; | |
| 1429 | |
| 1430 FXSYS_fseek(pFile, 0, FXSYS_SEEK_END); | |
| 1431 | |
| 1432 uint32_t filesize = FXSYS_ftell(pFile); | |
| 1433 uint8_t buffer[16]; | |
| 1434 FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET); | |
| 1435 | |
| 1436 size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile); | |
| 1437 if (readCnt != 1) { | |
| 1438 FXSYS_fclose(pFile); | |
| 1439 return; | |
| 1440 } | |
| 1441 | |
| 1442 if (GET_TT_LONG(buffer) == kTableTTCF) { | |
| 1443 uint32_t nFaces = GET_TT_LONG(buffer + 8); | |
| 1444 if (nFaces > std::numeric_limits<uint32_t>::max() / 4) { | |
| 1445 FXSYS_fclose(pFile); | |
| 1446 return; | |
| 1447 } | |
| 1448 uint32_t face_bytes = nFaces * 4; | |
| 1449 uint8_t* offsets = FX_Alloc(uint8_t, face_bytes); | |
| 1450 readCnt = FXSYS_fread(offsets, 1, face_bytes, pFile); | |
| 1451 if (readCnt != face_bytes) { | |
| 1452 FX_Free(offsets); | |
| 1453 FXSYS_fclose(pFile); | |
| 1454 return; | |
| 1455 } | |
| 1456 for (uint32_t i = 0; i < nFaces; i++) { | |
| 1457 uint8_t* p = offsets + i * 4; | |
| 1458 ReportFace(path, pFile, filesize, GET_TT_LONG(p)); | |
| 1459 } | |
| 1460 FX_Free(offsets); | |
| 1461 } else { | |
| 1462 ReportFace(path, pFile, filesize, 0); | |
| 1463 } | |
| 1464 FXSYS_fclose(pFile); | |
| 1465 } | |
| 1466 void CFX_FolderFontInfo::ReportFace(const CFX_ByteString& path, | |
| 1467 FXSYS_FILE* pFile, | |
| 1468 uint32_t filesize, | |
| 1469 uint32_t offset) { | |
| 1470 FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET); | |
| 1471 char buffer[16]; | |
| 1472 if (!FXSYS_fread(buffer, 12, 1, pFile)) | |
| 1473 return; | |
| 1474 | |
| 1475 uint32_t nTables = GET_TT_SHORT(buffer + 4); | |
| 1476 CFX_ByteString tables = FPDF_ReadStringFromFile(pFile, nTables * 16); | |
| 1477 if (tables.IsEmpty()) | |
| 1478 return; | |
| 1479 | |
| 1480 CFX_ByteString names = | |
| 1481 FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x6e616d65); | |
| 1482 if (names.IsEmpty()) | |
| 1483 return; | |
| 1484 | |
| 1485 CFX_ByteString facename = | |
| 1486 GetNameFromTT(names.raw_str(), names.GetLength(), 1); | |
| 1487 if (facename.IsEmpty()) | |
| 1488 return; | |
| 1489 | |
| 1490 CFX_ByteString style = GetNameFromTT(names.raw_str(), names.GetLength(), 2); | |
| 1491 if (style != "Regular") | |
| 1492 facename += " " + style; | |
| 1493 | |
| 1494 if (pdfium::ContainsKey(m_FontList, facename)) | |
| 1495 return; | |
| 1496 | |
| 1497 CFX_FontFaceInfo* pInfo = | |
| 1498 new CFX_FontFaceInfo(path, facename, tables, offset, filesize); | |
| 1499 CFX_ByteString os2 = | |
| 1500 FPDF_LoadTableFromTT(pFile, tables.raw_str(), nTables, 0x4f532f32); | |
| 1501 if (os2.GetLength() >= 86) { | |
| 1502 const uint8_t* p = os2.raw_str() + 78; | |
| 1503 uint32_t codepages = GET_TT_LONG(p); | |
| 1504 if (codepages & (1 << 17)) { | |
| 1505 m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET); | |
| 1506 pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS; | |
| 1507 } | |
| 1508 if (codepages & (1 << 18)) { | |
| 1509 m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET); | |
| 1510 pInfo->m_Charsets |= CHARSET_FLAG_GB; | |
| 1511 } | |
| 1512 if (codepages & (1 << 20)) { | |
| 1513 m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET); | |
| 1514 pInfo->m_Charsets |= CHARSET_FLAG_BIG5; | |
| 1515 } | |
| 1516 if ((codepages & (1 << 19)) || (codepages & (1 << 21))) { | |
| 1517 m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET); | |
| 1518 pInfo->m_Charsets |= CHARSET_FLAG_KOREAN; | |
| 1519 } | |
| 1520 if (codepages & (1 << 31)) { | |
| 1521 m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET); | |
| 1522 pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL; | |
| 1523 } | |
| 1524 } | |
| 1525 m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET); | |
| 1526 pInfo->m_Charsets |= CHARSET_FLAG_ANSI; | |
| 1527 pInfo->m_Styles = 0; | |
| 1528 if (style.Find("Bold") > -1) | |
| 1529 pInfo->m_Styles |= FXFONT_BOLD; | |
| 1530 if (style.Find("Italic") > -1 || style.Find("Oblique") > -1) | |
| 1531 pInfo->m_Styles |= FXFONT_ITALIC; | |
| 1532 if (facename.Find("Serif") > -1) | |
| 1533 pInfo->m_Styles |= FXFONT_SERIF; | |
| 1534 | |
| 1535 m_FontList[facename] = pInfo; | |
| 1536 } | |
| 1537 | |
| 1538 void* CFX_FolderFontInfo::GetSubstFont(const CFX_ByteString& face) { | |
| 1539 for (size_t iBaseFont = 0; iBaseFont < FX_ArraySize(Base14Substs); | |
| 1540 iBaseFont++) { | |
| 1541 if (face == Base14Substs[iBaseFont].m_pName) | |
| 1542 return GetFont(Base14Substs[iBaseFont].m_pSubstName); | |
| 1543 } | |
| 1544 return nullptr; | |
| 1545 } | |
| 1546 | |
| 1547 void* CFX_FolderFontInfo::FindFont(int weight, | |
| 1548 FX_BOOL bItalic, | |
| 1549 int charset, | |
| 1550 int pitch_family, | |
| 1551 const FX_CHAR* family, | |
| 1552 FX_BOOL bMatchName) { | |
| 1553 CFX_FontFaceInfo* pFind = nullptr; | |
| 1554 if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
| 1555 return GetFont("Courier New"); | |
| 1556 } | |
| 1557 uint32_t charset_flag = GetCharset(charset); | |
| 1558 int32_t iBestSimilar = 0; | |
| 1559 for (const auto& it : m_FontList) { | |
| 1560 const CFX_ByteString& bsName = it.first; | |
| 1561 CFX_FontFaceInfo* pFont = it.second; | |
| 1562 if (!(pFont->m_Charsets & charset_flag) && | |
| 1563 charset != FXFONT_DEFAULT_CHARSET) { | |
| 1564 continue; | |
| 1565 } | |
| 1566 int32_t index = bsName.Find(family); | |
| 1567 if (bMatchName && index < 0) { | |
| 1568 continue; | |
| 1569 } | |
| 1570 int32_t iSimilarValue = | |
| 1571 GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); | |
| 1572 if (iSimilarValue > iBestSimilar) { | |
| 1573 iBestSimilar = iSimilarValue; | |
| 1574 pFind = pFont; | |
| 1575 } | |
| 1576 } | |
| 1577 return pFind; | |
| 1578 } | |
| 1579 void* CFX_FolderFontInfo::MapFont(int weight, | |
| 1580 FX_BOOL bItalic, | |
| 1581 int charset, | |
| 1582 int pitch_family, | |
| 1583 const FX_CHAR* family, | |
| 1584 int& iExact) { | |
| 1585 return nullptr; | |
| 1586 } | |
| 1587 | |
| 1588 #ifdef PDF_ENABLE_XFA | |
| 1589 void* CFX_FolderFontInfo::MapFontByUnicode(uint32_t dwUnicode, | |
| 1590 int weight, | |
| 1591 FX_BOOL bItalic, | |
| 1592 int pitch_family) { | |
| 1593 return nullptr; | |
| 1594 } | |
| 1595 #endif // PDF_ENABLE_XFA | |
| 1596 | |
| 1597 void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) { | |
| 1598 auto it = m_FontList.find(face); | |
| 1599 return it != m_FontList.end() ? it->second : nullptr; | |
| 1600 } | |
| 1601 | |
| 1602 uint32_t CFX_FolderFontInfo::GetFontData(void* hFont, | |
| 1603 uint32_t table, | |
| 1604 uint8_t* buffer, | |
| 1605 uint32_t size) { | |
| 1606 if (!hFont) | |
| 1607 return 0; | |
| 1608 | |
| 1609 const CFX_FontFaceInfo* pFont = static_cast<CFX_FontFaceInfo*>(hFont); | |
| 1610 uint32_t datasize = 0; | |
| 1611 uint32_t offset = 0; | |
| 1612 if (table == 0) { | |
| 1613 datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize; | |
| 1614 } else if (table == kTableTTCF) { | |
| 1615 datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0; | |
| 1616 } else { | |
| 1617 uint32_t nTables = pFont->m_FontTables.GetLength() / 16; | |
| 1618 for (uint32_t i = 0; i < nTables; i++) { | |
| 1619 const uint8_t* p = pFont->m_FontTables.raw_str() + i * 16; | |
| 1620 if (GET_TT_LONG(p) == table) { | |
| 1621 offset = GET_TT_LONG(p + 8); | |
| 1622 datasize = GET_TT_LONG(p + 12); | |
| 1623 } | |
| 1624 } | |
| 1625 } | |
| 1626 | |
| 1627 if (!datasize || size < datasize) | |
| 1628 return datasize; | |
| 1629 | |
| 1630 FXSYS_FILE* pFile = FXSYS_fopen(pFont->m_FilePath.c_str(), "rb"); | |
| 1631 if (!pFile) | |
| 1632 return 0; | |
| 1633 | |
| 1634 if (FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET) < 0 || | |
| 1635 FXSYS_fread(buffer, datasize, 1, pFile) != 1) { | |
| 1636 datasize = 0; | |
| 1637 } | |
| 1638 FXSYS_fclose(pFile); | |
| 1639 return datasize; | |
| 1640 } | |
| 1641 | |
| 1642 void CFX_FolderFontInfo::DeleteFont(void* hFont) {} | |
| 1643 FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name) { | |
| 1644 if (!hFont) { | |
| 1645 return FALSE; | |
| 1646 } | |
| 1647 CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont; | |
| 1648 name = pFont->m_FaceName; | |
| 1649 return TRUE; | |
| 1650 } | |
| 1651 FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) { | |
| 1652 return FALSE; | |
| 1653 } | |
| 1654 | |
| 1655 int PDF_GetStandardFontName(CFX_ByteString* name) { | 901 int PDF_GetStandardFontName(CFX_ByteString* name) { |
| 1656 AltFontName* found = static_cast<AltFontName*>( | 902 AltFontName* found = static_cast<AltFontName*>( |
| 1657 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), | 903 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |
| 1658 sizeof(AltFontName), CompareString)); | 904 sizeof(AltFontName), CompareString)); |
| 1659 if (!found) | 905 if (!found) |
| 1660 return -1; | 906 return -1; |
| 1661 | 907 |
| 1662 *name = g_Base14FontNames[found->m_Index]; | 908 *name = g_Base14FontNames[found->m_Index]; |
| 1663 return found->m_Index; | 909 return found->m_Index; |
| 1664 } | 910 } |
| OLD | NEW |