OLD | NEW |
1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 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 "xfa/fgas/font/fgas_stdfontmgr.h" | 7 #include "xfa/fgas/font/fgas_stdfontmgr.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_stream.h" | 9 #include "core/fxcrt/include/fx_stream.h" |
10 #include "core/fxge/include/cfx_fontmapper.h" | 10 #include "core/fxge/include/cfx_fontmapper.h" |
11 #include "core/fxge/include/cfx_fontmgr.h" | 11 #include "core/fxge/include/cfx_fontmgr.h" |
12 #include "core/fxge/include/cfx_gemodule.h" | 12 #include "core/fxge/include/cfx_gemodule.h" |
13 #include "core/fxge/include/ifx_systemfontinfo.h" | 13 #include "core/fxge/include/ifx_systemfontinfo.h" |
14 #include "xfa/fgas/crt/fgas_codepage.h" | 14 #include "xfa/fgas/crt/fgas_codepage.h" |
15 #include "xfa/fgas/font/fgas_fontutils.h" | 15 #include "xfa/fgas/font/fgas_fontutils.h" |
16 #include "xfa/fgas/font/fgas_gefont.h" | 16 #include "xfa/fgas/font/fgas_gefont.h" |
17 | 17 |
18 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 18 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
19 | 19 |
20 IFGAS_FontMgr* IFGAS_FontMgr::Create(FX_LPEnumAllFonts pEnumerator) { | 20 std::unique_ptr<IFGAS_FontMgr> IFGAS_FontMgr::Create( |
21 return new CFGAS_StdFontMgrImp(pEnumerator); | 21 FX_LPEnumAllFonts pEnumerator) { |
| 22 return std::unique_ptr<IFGAS_FontMgr>(new CFGAS_StdFontMgrImp(pEnumerator)); |
22 } | 23 } |
23 | 24 |
24 CFGAS_StdFontMgrImp::CFGAS_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator) | 25 CFGAS_StdFontMgrImp::CFGAS_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator) |
25 : m_pEnumerator(pEnumerator), | 26 : m_pEnumerator(pEnumerator), |
26 m_FontFaces(100), | 27 m_FontFaces(100), |
27 m_CPFonts(8), | 28 m_CPFonts(8), |
28 m_FamilyFonts(16), | 29 m_FamilyFonts(16), |
29 m_UnicodeFonts(16), | 30 m_UnicodeFonts(16), |
30 m_BufferFonts(4), | 31 m_BufferFonts(4), |
31 m_StreamFonts(4), | 32 m_StreamFonts(4), |
32 m_DeriveFonts(4) { | 33 m_DeriveFonts(4) { |
33 if (m_pEnumerator) { | 34 if (m_pEnumerator) { |
34 m_pEnumerator(m_FontFaces, nullptr, 0xFEFF); | 35 m_pEnumerator(m_FontFaces, nullptr, 0xFEFF); |
35 } | 36 } |
36 } | 37 } |
37 | 38 |
38 CFGAS_StdFontMgrImp::~CFGAS_StdFontMgrImp() { | 39 CFGAS_StdFontMgrImp::~CFGAS_StdFontMgrImp() { |
39 m_FontFaces.RemoveAll(FALSE); | 40 m_FontFaces.RemoveAll(FALSE); |
40 m_CPFonts.RemoveAll(); | 41 m_CPFonts.RemoveAll(); |
41 m_FamilyFonts.RemoveAll(); | 42 m_FamilyFonts.RemoveAll(); |
42 m_UnicodeFonts.RemoveAll(); | 43 m_UnicodeFonts.RemoveAll(); |
43 m_BufferFonts.RemoveAll(); | 44 m_BufferFonts.RemoveAll(); |
44 m_StreamFonts.RemoveAll(); | 45 m_StreamFonts.RemoveAll(); |
45 m_DeriveFonts.RemoveAll(); | 46 m_DeriveFonts.RemoveAll(); |
46 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) | 47 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) |
47 m_Fonts[i]->Release(); | 48 m_Fonts[i]->Release(); |
48 } | 49 } |
49 | 50 |
50 void CFGAS_StdFontMgrImp::Release() { | |
51 delete this; | |
52 } | |
53 | |
54 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCodePage( | 51 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCodePage( |
55 uint16_t wCodePage, | 52 uint16_t wCodePage, |
56 uint32_t dwFontStyles, | 53 uint32_t dwFontStyles, |
57 const FX_WCHAR* pszFontFamily) { | 54 const FX_WCHAR* pszFontFamily) { |
58 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); | 55 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); |
59 CFGAS_GEFont* pFont = nullptr; | 56 CFGAS_GEFont* pFont = nullptr; |
60 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { | 57 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { |
61 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr; | 58 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr; |
62 } | 59 } |
63 FX_FONTDESCRIPTOR const* pFD = | 60 FX_FONTDESCRIPTOR const* pFD = |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 return (FX_POSITION)-1; | 554 return (FX_POSITION)-1; |
558 } | 555 } |
559 | 556 |
560 IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos) { | 557 IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos) { |
561 IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext.AsStringC()); | 558 IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext.AsStringC()); |
562 m_wsNext = GetNextFile().UTF8Decode(); | 559 m_wsNext = GetNextFile().UTF8Decode(); |
563 pos = m_wsNext.GetLength() != 0 ? pAccess : nullptr; | 560 pos = m_wsNext.GetLength() != 0 ? pAccess : nullptr; |
564 return pAccess; | 561 return pAccess; |
565 } | 562 } |
566 | 563 |
567 IFGAS_FontMgr* IFGAS_FontMgr::Create(CFX_FontSourceEnum_File* pFontEnum) { | 564 std::unique_ptr<IFGAS_FontMgr> IFGAS_FontMgr::Create( |
| 565 CFX_FontSourceEnum_File* pFontEnum) { |
568 if (!pFontEnum) | 566 if (!pFontEnum) |
569 return nullptr; | 567 return nullptr; |
570 | 568 |
571 std::unique_ptr<CFGAS_FontMgrImp> pFontMgr(new CFGAS_FontMgrImp(pFontEnum)); | 569 std::unique_ptr<CFGAS_FontMgrImp> pFontMgr(new CFGAS_FontMgrImp(pFontEnum)); |
572 if (!pFontMgr->EnumFonts()) | 570 if (!pFontMgr->EnumFonts()) |
573 return nullptr; | 571 return nullptr; |
574 return pFontMgr.release(); | 572 return std::move(pFontMgr); |
575 } | 573 } |
576 | 574 |
577 CFGAS_FontMgrImp::CFGAS_FontMgrImp(CFX_FontSourceEnum_File* pFontEnum) | 575 CFGAS_FontMgrImp::CFGAS_FontMgrImp(CFX_FontSourceEnum_File* pFontEnum) |
578 : m_pFontSource(pFontEnum) {} | 576 : m_pFontSource(pFontEnum) {} |
579 | 577 |
580 CFGAS_FontMgrImp::~CFGAS_FontMgrImp() {} | 578 CFGAS_FontMgrImp::~CFGAS_FontMgrImp() { |
| 579 for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) { |
| 580 delete m_InstalledFonts[i]; |
| 581 } |
| 582 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); |
| 583 while (pos) { |
| 584 uint32_t dwHash; |
| 585 CFX_FontDescriptorInfos* pDescs; |
| 586 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); |
| 587 delete pDescs; |
| 588 } |
| 589 pos = m_Hash2Fonts.GetStartPosition(); |
| 590 while (pos) { |
| 591 uint32_t dwHash; |
| 592 CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts; |
| 593 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); |
| 594 delete pFonts; |
| 595 } |
| 596 m_Hash2Fonts.RemoveAll(); |
| 597 pos = m_IFXFont2FileRead.GetStartPosition(); |
| 598 while (pos) { |
| 599 CFGAS_GEFont* pFont; |
| 600 IFX_FileRead* pFileRead; |
| 601 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); |
| 602 pFileRead->Release(); |
| 603 } |
| 604 } |
581 | 605 |
582 FX_BOOL CFGAS_FontMgrImp::EnumFontsFromFontMapper() { | 606 FX_BOOL CFGAS_FontMgrImp::EnumFontsFromFontMapper() { |
583 CFX_FontMapper* pFontMapper = | 607 CFX_FontMapper* pFontMapper = |
584 CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper(); | 608 CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper(); |
585 if (!pFontMapper) | 609 if (!pFontMapper) |
586 return FALSE; | 610 return FALSE; |
587 | 611 |
588 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); | 612 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); |
589 if (!pSystemFontInfo) | 613 if (!pSystemFontInfo) |
590 return FALSE; | 614 return FALSE; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 return FALSE; | 651 return FALSE; |
628 return TRUE; | 652 return TRUE; |
629 } | 653 } |
630 | 654 |
631 FX_BOOL CFGAS_FontMgrImp::EnumFonts() { | 655 FX_BOOL CFGAS_FontMgrImp::EnumFonts() { |
632 if (EnumFontsFromFontMapper()) | 656 if (EnumFontsFromFontMapper()) |
633 return TRUE; | 657 return TRUE; |
634 return EnumFontsFromFiles(); | 658 return EnumFontsFromFiles(); |
635 } | 659 } |
636 | 660 |
637 void CFGAS_FontMgrImp::Release() { | |
638 for (int32_t i = 0; i < m_InstalledFonts.GetSize(); i++) { | |
639 delete m_InstalledFonts[i]; | |
640 } | |
641 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); | |
642 while (pos) { | |
643 uint32_t dwHash; | |
644 CFX_FontDescriptorInfos* pDescs; | |
645 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); | |
646 delete pDescs; | |
647 } | |
648 pos = m_Hash2Fonts.GetStartPosition(); | |
649 while (pos) { | |
650 uint32_t dwHash; | |
651 CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts; | |
652 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); | |
653 delete pFonts; | |
654 } | |
655 m_Hash2Fonts.RemoveAll(); | |
656 pos = m_IFXFont2FileRead.GetStartPosition(); | |
657 while (pos) { | |
658 CFGAS_GEFont* pFont; | |
659 IFX_FileRead* pFileRead; | |
660 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); | |
661 pFileRead->Release(); | |
662 } | |
663 delete this; | |
664 } | |
665 | |
666 CFGAS_GEFont* CFGAS_FontMgrImp::GetDefFontByCodePage( | 661 CFGAS_GEFont* CFGAS_FontMgrImp::GetDefFontByCodePage( |
667 uint16_t wCodePage, | 662 uint16_t wCodePage, |
668 uint32_t dwFontStyles, | 663 uint32_t dwFontStyles, |
669 const FX_WCHAR* pszFontFamily) { | 664 const FX_WCHAR* pszFontFamily) { |
670 return nullptr; | 665 return nullptr; |
671 } | 666 } |
672 | 667 |
673 CFGAS_GEFont* CFGAS_FontMgrImp::GetDefFontByCharset( | 668 CFGAS_GEFont* CFGAS_FontMgrImp::GetDefFontByCharset( |
674 uint8_t nCharset, | 669 uint8_t nCharset, |
675 uint32_t dwFontStyles, | 670 uint32_t dwFontStyles, |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1391 | 1386 |
1392 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1, | 1387 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1, |
1393 const CFX_WideString& Name2) { | 1388 const CFX_WideString& Name2) { |
1394 if (Name1.Find(Name2.c_str()) != -1) { | 1389 if (Name1.Find(Name2.c_str()) != -1) { |
1395 return 1; | 1390 return 1; |
1396 } | 1391 } |
1397 return 0; | 1392 return 0; |
1398 } | 1393 } |
1399 | 1394 |
1400 #endif | 1395 #endif |
OLD | NEW |