OLD | NEW |
1 // Copyright 2016 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 "core/fxge/cfx_fontmapper.h" | 7 #include "core/fxge/cfx_fontmapper.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) | 251 if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) |
252 return i; | 252 return i; |
253 } else { | 253 } else { |
254 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) | 254 if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) |
255 return i; | 255 return i; |
256 } | 256 } |
257 } | 257 } |
258 return -1; | 258 return -1; |
259 } | 259 } |
260 | 260 |
261 FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { | 261 bool CheckSupportThirdPartFont(CFX_ByteString name, int& PitchFamily) { |
262 if (name == "MyriadPro") { | 262 if (name == "MyriadPro") { |
263 PitchFamily &= ~FXFONT_FF_ROMAN; | 263 PitchFamily &= ~FXFONT_FF_ROMAN; |
264 return TRUE; | 264 return true; |
265 } | 265 } |
266 return FALSE; | 266 return false; |
267 } | 267 } |
268 | 268 |
269 void UpdatePitchFamily(uint32_t flags, int& PitchFamily) { | 269 void UpdatePitchFamily(uint32_t flags, int& PitchFamily) { |
270 if (flags & FXFONT_SERIF) | 270 if (flags & FXFONT_SERIF) |
271 PitchFamily |= FXFONT_FF_ROMAN; | 271 PitchFamily |= FXFONT_FF_ROMAN; |
272 if (flags & FXFONT_SCRIPT) | 272 if (flags & FXFONT_SCRIPT) |
273 PitchFamily |= FXFONT_FF_SCRIPT; | 273 PitchFamily |= FXFONT_FF_SCRIPT; |
274 if (flags & FXFONT_FIXED_PITCH) | 274 if (flags & FXFONT_FIXED_PITCH) |
275 PitchFamily |= FXFONT_FF_FIXEDPITCH; | 275 PitchFamily |= FXFONT_FF_FIXEDPITCH; |
276 } | 276 } |
277 | 277 |
278 } // namespace | 278 } // namespace |
279 | 279 |
280 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) | 280 CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) |
281 : m_bListLoaded(FALSE), m_pFontMgr(mgr) { | 281 : m_bListLoaded(false), m_pFontMgr(mgr) { |
282 m_MMFaces[0] = nullptr; | 282 m_MMFaces[0] = nullptr; |
283 m_MMFaces[1] = nullptr; | 283 m_MMFaces[1] = nullptr; |
284 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); | 284 FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); |
285 } | 285 } |
286 | 286 |
287 CFX_FontMapper::~CFX_FontMapper() { | 287 CFX_FontMapper::~CFX_FontMapper() { |
288 for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { | 288 for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { |
289 if (m_FoxitFaces[i]) | 289 if (m_FoxitFaces[i]) |
290 FXFT_Done_Face(m_FoxitFaces[i]); | 290 FXFT_Done_Face(m_FoxitFaces[i]); |
291 } | 291 } |
(...skipping 29 matching lines...) Expand all Loading... |
321 | 321 |
322 void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { | 322 void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset) { |
323 if (!m_pFontInfo) | 323 if (!m_pFontInfo) |
324 return; | 324 return; |
325 | 325 |
326 m_FaceArray.push_back({name, static_cast<uint32_t>(charset)}); | 326 m_FaceArray.push_back({name, static_cast<uint32_t>(charset)}); |
327 if (name == m_LastFamily) | 327 if (name == m_LastFamily) |
328 return; | 328 return; |
329 | 329 |
330 const uint8_t* ptr = name.raw_str(); | 330 const uint8_t* ptr = name.raw_str(); |
331 FX_BOOL bLocalized = FALSE; | 331 bool bLocalized = false; |
332 for (int i = 0; i < name.GetLength(); i++) { | 332 for (int i = 0; i < name.GetLength(); i++) { |
333 if (ptr[i] > 0x80) { | 333 if (ptr[i] > 0x80) { |
334 bLocalized = TRUE; | 334 bLocalized = true; |
335 break; | 335 break; |
336 } | 336 } |
337 } | 337 } |
338 | 338 |
339 if (bLocalized) { | 339 if (bLocalized) { |
340 void* hFont = m_pFontInfo->GetFont(name.c_str()); | 340 void* hFont = m_pFontInfo->GetFont(name.c_str()); |
341 if (!hFont) { | 341 if (!hFont) { |
342 int iExact; | 342 int iExact; |
343 hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, | 343 hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, |
344 name.c_str(), iExact); | 344 name.c_str(), iExact); |
345 if (!hFont) | 345 if (!hFont) |
346 return; | 346 return; |
347 } | 347 } |
348 | 348 |
349 CFX_ByteString new_name = GetPSNameFromTT(hFont); | 349 CFX_ByteString new_name = GetPSNameFromTT(hFont); |
350 if (!new_name.IsEmpty()) | 350 if (!new_name.IsEmpty()) |
351 m_LocalizedTTFonts.push_back(std::make_pair(new_name, name)); | 351 m_LocalizedTTFonts.push_back(std::make_pair(new_name, name)); |
352 m_pFontInfo->DeleteFont(hFont); | 352 m_pFontInfo->DeleteFont(hFont); |
353 } | 353 } |
354 m_InstalledTTFonts.push_back(name); | 354 m_InstalledTTFonts.push_back(name); |
355 m_LastFamily = name; | 355 m_LastFamily = name; |
356 } | 356 } |
357 | 357 |
358 void CFX_FontMapper::LoadInstalledFonts() { | 358 void CFX_FontMapper::LoadInstalledFonts() { |
359 if (!m_pFontInfo || m_bListLoaded) | 359 if (!m_pFontInfo || m_bListLoaded) |
360 return; | 360 return; |
361 | 361 |
362 m_pFontInfo->EnumFontList(this); | 362 m_pFontInfo->EnumFontList(this); |
363 m_bListLoaded = TRUE; | 363 m_bListLoaded = true; |
364 } | 364 } |
365 | 365 |
366 CFX_ByteString CFX_FontMapper::MatchInstalledFonts( | 366 CFX_ByteString CFX_FontMapper::MatchInstalledFonts( |
367 const CFX_ByteString& norm_name) { | 367 const CFX_ByteString& norm_name) { |
368 LoadInstalledFonts(); | 368 LoadInstalledFonts(); |
369 int i; | 369 int i; |
370 for (i = pdfium::CollectionSize<int>(m_InstalledTTFonts) - 1; i >= 0; i--) { | 370 for (i = pdfium::CollectionSize<int>(m_InstalledTTFonts) - 1; i >= 0; i--) { |
371 CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); | 371 CFX_ByteString norm1 = TT_NormalizeName(m_InstalledTTFonts[i].c_str()); |
372 if (norm1 == norm_name) | 372 if (norm1 == norm_name) |
373 return m_InstalledTTFonts[i]; | 373 return m_InstalledTTFonts[i]; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 if (m_MMFaces[0]) | 415 if (m_MMFaces[0]) |
416 return m_MMFaces[0]; | 416 return m_MMFaces[0]; |
417 const uint8_t* pFontData = nullptr; | 417 const uint8_t* pFontData = nullptr; |
418 uint32_t size = 0; | 418 uint32_t size = 0; |
419 m_pFontMgr->GetBuiltinFont(15, &pFontData, &size); | 419 m_pFontMgr->GetBuiltinFont(15, &pFontData, &size); |
420 m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); | 420 m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0); |
421 return m_MMFaces[0]; | 421 return m_MMFaces[0]; |
422 } | 422 } |
423 | 423 |
424 FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, | 424 FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, |
425 FX_BOOL bTrueType, | 425 bool bTrueType, |
426 uint32_t flags, | 426 uint32_t flags, |
427 int weight, | 427 int weight, |
428 int italic_angle, | 428 int italic_angle, |
429 int WindowCP, | 429 int WindowCP, |
430 CFX_SubstFont* pSubstFont) { | 430 CFX_SubstFont* pSubstFont) { |
431 if (!(flags & FXFONT_USEEXTERNATTR)) { | 431 if (!(flags & FXFONT_USEEXTERNATTR)) { |
432 weight = FXFONT_FW_NORMAL; | 432 weight = FXFONT_FW_NORMAL; |
433 italic_angle = 0; | 433 italic_angle = 0; |
434 } | 434 } |
435 CFX_ByteString SubstName = name; | 435 CFX_ByteString SubstName = name; |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 } | 707 } |
708 | 708 |
709 #ifdef PDF_ENABLE_XFA | 709 #ifdef PDF_ENABLE_XFA |
710 FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, | 710 FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(uint32_t dwUnicode, |
711 uint32_t flags, | 711 uint32_t flags, |
712 int weight, | 712 int weight, |
713 int italic_angle) { | 713 int italic_angle) { |
714 if (!m_pFontInfo) | 714 if (!m_pFontInfo) |
715 return nullptr; | 715 return nullptr; |
716 | 716 |
717 FX_BOOL bItalic = (flags & FXFONT_ITALIC) != 0; | 717 bool bItalic = (flags & FXFONT_ITALIC) != 0; |
718 int PitchFamily = 0; | 718 int PitchFamily = 0; |
719 UpdatePitchFamily(flags, PitchFamily); | 719 UpdatePitchFamily(flags, PitchFamily); |
720 void* hFont = | 720 void* hFont = |
721 m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily); | 721 m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily); |
722 if (!hFont) | 722 if (!hFont) |
723 return nullptr; | 723 return nullptr; |
724 | 724 |
725 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, nullptr, 0); | 725 uint32_t ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, nullptr, 0); |
726 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); | 726 uint32_t font_size = m_pFontInfo->GetFontData(hFont, 0, nullptr, 0); |
727 if (font_size == 0 && ttc_size == 0) { | 727 if (font_size == 0 && ttc_size == 0) { |
(...skipping 10 matching lines...) Expand all Loading... |
738 } | 738 } |
739 m_pFontInfo->DeleteFont(hFont); | 739 m_pFontInfo->DeleteFont(hFont); |
740 return face; | 740 return face; |
741 } | 741 } |
742 #endif // PDF_ENABLE_XFA | 742 #endif // PDF_ENABLE_XFA |
743 | 743 |
744 int CFX_FontMapper::GetFaceSize() const { | 744 int CFX_FontMapper::GetFaceSize() const { |
745 return pdfium::CollectionSize<int>(m_FaceArray); | 745 return pdfium::CollectionSize<int>(m_FaceArray); |
746 } | 746 } |
747 | 747 |
748 FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { | 748 bool CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const { |
749 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { | 749 for (size_t i = 0; i < MM_FACE_COUNT; ++i) { |
750 if (m_MMFaces[i] == face) | 750 if (m_MMFaces[i] == face) |
751 return TRUE; | 751 return true; |
752 } | 752 } |
753 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { | 753 for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { |
754 if (m_FoxitFaces[i] == face) | 754 if (m_FoxitFaces[i] == face) |
755 return TRUE; | 755 return true; |
756 } | 756 } |
757 return FALSE; | 757 return false; |
758 } | 758 } |
759 | 759 |
760 FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, | 760 FXFT_Face CFX_FontMapper::GetCachedTTCFace(void* hFont, |
761 const uint32_t tableTTCF, | 761 const uint32_t tableTTCF, |
762 uint32_t ttc_size, | 762 uint32_t ttc_size, |
763 uint32_t font_size) { | 763 uint32_t font_size) { |
764 FXFT_Face face; | 764 FXFT_Face face; |
765 uint8_t buffer[1024]; | 765 uint8_t buffer[1024]; |
766 m_pFontInfo->GetFontData(hFont, tableTTCF, buffer, FX_ArraySize(buffer)); | 766 m_pFontInfo->GetFontData(hFont, tableTTCF, buffer, FX_ArraySize(buffer)); |
767 uint32_t* pBuffer = reinterpret_cast<uint32_t*>(buffer); | 767 uint32_t* pBuffer = reinterpret_cast<uint32_t*>(buffer); |
768 uint32_t checksum = 0; | 768 uint32_t checksum = 0; |
769 for (int i = 0; i < 256; i++) | 769 for (int i = 0; i < 256; i++) |
770 checksum += pBuffer[i]; | 770 checksum += pBuffer[i]; |
771 uint8_t* pFontData; | 771 uint8_t* pFontData; |
772 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, | 772 face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, |
773 pFontData); | 773 pFontData); |
774 if (!face) { | 774 if (!face) { |
775 pFontData = FX_Alloc(uint8_t, ttc_size); | 775 pFontData = FX_Alloc(uint8_t, ttc_size); |
776 m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); | 776 m_pFontInfo->GetFontData(hFont, tableTTCF, pFontData, ttc_size); |
777 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, | 777 face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size, |
778 ttc_size - font_size); | 778 ttc_size - font_size); |
779 } | 779 } |
780 return face; | 780 return face; |
781 } | 781 } |
782 | 782 |
783 FXFT_Face CFX_FontMapper::GetCachedFace(void* hFont, | 783 FXFT_Face CFX_FontMapper::GetCachedFace(void* hFont, |
784 CFX_ByteString SubstName, | 784 CFX_ByteString SubstName, |
785 int weight, | 785 int weight, |
786 FX_BOOL bItalic, | 786 bool bItalic, |
787 uint32_t font_size) { | 787 uint32_t font_size) { |
788 FXFT_Face face; | 788 FXFT_Face face; |
789 uint8_t* pFontData; | 789 uint8_t* pFontData; |
790 face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); | 790 face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData); |
791 if (!face) { | 791 if (!face) { |
792 pFontData = FX_Alloc(uint8_t, font_size); | 792 pFontData = FX_Alloc(uint8_t, font_size); |
793 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); | 793 m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size); |
794 face = | 794 face = |
795 m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, | 795 m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, |
796 font_size, m_pFontInfo->GetFaceIndex(hFont)); | 796 font_size, m_pFontInfo->GetFaceIndex(hFont)); |
797 } | 797 } |
798 return face; | 798 return face; |
799 } | 799 } |
800 | 800 |
801 int PDF_GetStandardFontName(CFX_ByteString* name) { | 801 int PDF_GetStandardFontName(CFX_ByteString* name) { |
802 AltFontName* found = static_cast<AltFontName*>( | 802 AltFontName* found = static_cast<AltFontName*>( |
803 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), | 803 FXSYS_bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), |
804 sizeof(AltFontName), CompareString)); | 804 sizeof(AltFontName), CompareString)); |
805 if (!found) | 805 if (!found) |
806 return -1; | 806 return -1; |
807 | 807 |
808 *name = g_Base14FontNames[found->m_Index]; | 808 *name = g_Base14FontNames[found->m_Index]; |
809 return found->m_Index; | 809 return found->m_Index; |
810 } | 810 } |
OLD | NEW |