Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: xfa/fgas/font/fgas_stdfontmgr.cpp

Issue 1874433002: Record all fonts, not just one per charset. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 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 "xfa/fgas/crt/fgas_codepage.h" 10 #include "xfa/fgas/crt/fgas_codepage.h"
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 void* pUserData) 589 void* pUserData)
590 : m_pFontSource(pFontEnum), 590 : m_pFontSource(pFontEnum),
591 m_pDelegate(pDelegate), 591 m_pDelegate(pDelegate),
592 m_pUserData(pUserData) {} 592 m_pUserData(pUserData) {}
593 593
594 FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() { 594 FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() {
595 CFX_FontMapper* pFontMapper = 595 CFX_FontMapper* pFontMapper =
596 CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper(); 596 CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper();
597 if (!pFontMapper) 597 if (!pFontMapper)
598 return FALSE; 598 return FALSE;
599
599 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); 600 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
600 if (!pSystemFontInfo) 601 if (!pSystemFontInfo)
601 return FALSE; 602 return FALSE;
603
602 pSystemFontInfo->EnumFontList(pFontMapper); 604 pSystemFontInfo->EnumFontList(pFontMapper);
603 for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) { 605 for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
604 IFX_FileRead* pFontStream = 606 IFX_FileRead* pFontStream =
605 CreateFontStream(pFontMapper, pSystemFontInfo, i); 607 CreateFontStream(pFontMapper, pSystemFontInfo, i);
606 if (!pFontStream) 608 if (!pFontStream)
607 continue; 609 continue;
610
608 CFX_WideString wsFaceName = 611 CFX_WideString wsFaceName =
609 CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str()); 612 CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str());
610 RegisterFaces(pFontStream, &wsFaceName); 613 RegisterFaces(pFontStream, &wsFaceName);
611 pFontStream->Release(); 614 pFontStream->Release();
612 } 615 }
613 if (m_InstalledFonts.GetSize() == 0) 616 if (m_InstalledFonts.GetSize() == 0)
614 return FALSE; 617 return FALSE;
618
615 return TRUE; 619 return TRUE;
616 } 620 }
621
617 FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() { 622 FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() {
618 CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary(); 623 CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary();
619 FX_POSITION pos = m_pFontSource->GetStartPosition(); 624 FX_POSITION pos = m_pFontSource->GetStartPosition();
620 IFX_FileAccess* pFontSource = nullptr; 625 IFX_FileAccess* pFontSource = nullptr;
621 IFX_FileRead* pFontStream = nullptr; 626 IFX_FileRead* pFontStream = nullptr;
622 while (pos) { 627 while (pos) {
623 pFontSource = m_pFontSource->GetNext(pos); 628 pFontSource = m_pFontSource->GetNext(pos);
624 pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly); 629 pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly);
625 if (!pFontStream) { 630 if (!pFontStream) {
626 pFontSource->Release(); 631 pFontSource->Release();
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 : m_pDelegate->GetDefFontByUnicode( 715 : m_pDelegate->GetDefFontByUnicode(
711 this, wUnicode, dwFontStyles, pszFontFamily); 716 this, wUnicode, dwFontStyles, pszFontFamily);
712 } 717 }
713 IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(uint16_t wLanguage, 718 IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(uint16_t wLanguage,
714 uint32_t dwFontStyles, 719 uint32_t dwFontStyles,
715 const FX_WCHAR* pszFontFamily) { 720 const FX_WCHAR* pszFontFamily) {
716 return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByLanguage( 721 return NULL == m_pDelegate ? NULL : m_pDelegate->GetDefFontByLanguage(
717 this, wLanguage, dwFontStyles, 722 this, wLanguage, dwFontStyles,
718 pszFontFamily); 723 pszFontFamily);
719 } 724 }
725
720 IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage, 726 IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage,
721 uint32_t dwFontStyles, 727 uint32_t dwFontStyles,
722 const FX_WCHAR* pszFontFamily) { 728 const FX_WCHAR* pszFontFamily) {
723 CFX_ByteString bsHash; 729 CFX_ByteString bsHash;
724 bsHash.Format("%d, %d", wCodePage, dwFontStyles); 730 bsHash.Format("%d, %d", wCodePage, dwFontStyles);
725 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); 731 bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
726 uint32_t dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength()); 732 uint32_t dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
727 CFX_ArrayTemplate<IFX_Font*>* pFonts = NULL; 733
728 IFX_Font* pFont = NULL; 734 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr;
729 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { 735 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
730 if (NULL == pFonts) { 736 if (!pFonts)
731 return NULL; 737 return nullptr;
732 } 738
733 if (0 != pFonts->GetSize()) { 739 if (pFonts->GetSize() != 0)
734 return pFonts->GetAt(0)->Retain(); 740 return pFonts->GetAt(0)->Retain();
735 }
736 } 741 }
742
737 if (!pFonts) 743 if (!pFonts)
738 pFonts = new CFX_ArrayTemplate<IFX_Font*>; 744 pFonts = new CFX_ArrayTemplate<IFX_Font*>;
745
739 m_Hash2Fonts.SetAt(dwHash, pFonts); 746 m_Hash2Fonts.SetAt(dwHash, pFonts);
740 CFX_FontDescriptorInfos* sortedFonts = NULL; 747 CFX_FontDescriptorInfos* sortedFonts = nullptr;
741 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { 748 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
742 sortedFonts = new CFX_FontDescriptorInfos; 749 sortedFonts = new CFX_FontDescriptorInfos;
743 MatchFonts(*sortedFonts, wCodePage, dwFontStyles, 750 MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
744 CFX_WideString(pszFontFamily), 0); 751 CFX_WideString(pszFontFamily), 0);
745 m_Hash2CandidateList.SetAt(dwHash, sortedFonts); 752 m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
746 } 753 }
747 if (sortedFonts->GetSize() == 0) { 754 if (sortedFonts->GetSize() == 0)
748 return NULL; 755 return nullptr;
749 } 756
750 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; 757 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont;
751 if (pDesc->m_pFileAccess) 758 IFX_Font* pFont =
752 pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr); 759 pDesc->m_pFileAccess
753 else 760 ? LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr)
754 pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); 761 : LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
755 if (NULL != pFont) { 762 if (pFont)
756 pFont->SetLogicalFontStyle(dwFontStyles); 763 pFont->SetLogicalFontStyle(dwFontStyles);
757 } 764
758 pFonts->Add(pFont); 765 pFonts->Add(pFont);
759 return pFont; 766 return pFont;
760 } 767 }
761 IFX_Font* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset, 768 IFX_Font* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset,
762 uint32_t dwFontStyles, 769 uint32_t dwFontStyles,
763 const FX_WCHAR* pszFontFamily) { 770 const FX_WCHAR* pszFontFamily) {
764 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, 771 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
765 pszFontFamily); 772 pszFontFamily);
766 } 773 }
767 IFX_Font* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode, 774 IFX_Font* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE); 837 FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE);
831 FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode); 838 FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode);
832 pFileRead->Release(); 839 pFileRead->Release();
833 if (!pFace) 840 if (!pFace)
834 return FALSE; 841 return FALSE;
835 if (FXFT_Get_Face_External_Stream(pFace)) 842 if (FXFT_Get_Face_External_Stream(pFace))
836 FXFT_Clear_Face_External_Stream(pFace); 843 FXFT_Clear_Face_External_Stream(pFace);
837 FXFT_Done_Face(pFace); 844 FXFT_Done_Face(pFace);
838 return !retCharmap && retIndex; 845 return !retCharmap && retIndex;
839 } 846 }
847
840 FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) { 848 FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) {
841 if (NULL == pFont) { 849 if (!pFont)
842 return FALSE; 850 return FALSE;
843 } 851
844 FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace(); 852 FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace();
845 FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace); 853 FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace);
846 if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) { 854 if (FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE) != 0)
847 return FALSE; 855 return FALSE;
848 } 856
849 if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) { 857 if (FXFT_Get_Char_Index(pFace, wcUnicode) == 0) {
850 FXFT_Set_Charmap(pFace, charmap); 858 FXFT_Set_Charmap(pFace, charmap);
851 return FALSE; 859 return FALSE;
852 } 860 }
853 return TRUE; 861 return TRUE;
854 } 862 }
863
855 IFX_Font* CFX_FontMgrImp::GetFontByLanguage(uint16_t wLanguage, 864 IFX_Font* CFX_FontMgrImp::GetFontByLanguage(uint16_t wLanguage,
856 uint32_t dwFontStyles, 865 uint32_t dwFontStyles,
857 const FX_WCHAR* pszFontFamily) { 866 const FX_WCHAR* pszFontFamily) {
858 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, 867 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles,
859 pszFontFamily); 868 pszFontFamily);
860 } 869 }
870
861 IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer, 871 IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer,
862 int32_t iLength, 872 int32_t iLength,
863 int32_t iFaceIndex, 873 int32_t iFaceIndex,
864 int32_t* pFaceCount) { 874 int32_t* pFaceCount) {
865 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength}; 875 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength};
866 uint32_t dwHash = 876 uint32_t dwHash =
867 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*)); 877 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*));
868 IFX_FileAccess* pFontAccess = NULL; 878 IFX_FileAccess* pFontAccess = nullptr;
869 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { 879 m_Hash2FileAccess.Lookup(dwHash, pFontAccess);
870 } 880 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
871 if (NULL != pFontAccess) { 881 : nullptr;
872 return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
873 } else {
874 return NULL;
875 }
876 } 882 }
883
877 IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName, 884 IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName,
878 int32_t iFaceIndex, 885 int32_t iFaceIndex,
879 int32_t* pFaceCount) { 886 int32_t* pFaceCount) {
880 CFX_ByteString bsHash; 887 CFX_ByteString bsHash;
881 bsHash += CFX_WideString(pszFileName).UTF8Encode(); 888 bsHash += CFX_WideString(pszFileName).UTF8Encode();
889
882 uint32_t dwHash = 890 uint32_t dwHash =
883 FX_HashCode_String_GetA((const FX_CHAR*)bsHash, bsHash.GetLength()); 891 FX_HashCode_String_GetA((const FX_CHAR*)bsHash, bsHash.GetLength());
884 IFX_FileAccess* pFontAccess = NULL; 892 IFX_FileAccess* pFontAccess = nullptr;
885 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { 893 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
886 pFontAccess = FX_CreateDefaultFileAccess(pszFileName); 894 pFontAccess = FX_CreateDefaultFileAccess(pszFileName);
887 m_Hash2FileAccess.SetAt(dwHash, pFontAccess); 895 m_Hash2FileAccess.SetAt(dwHash, pFontAccess);
888 } 896 }
889 if (NULL != pFontAccess) { 897
890 return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE); 898 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
891 } else { 899 : nullptr;
892 return NULL;
893 }
894 } 900 }
901
895 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream, 902 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream,
896 int32_t iFaceIndex, 903 int32_t iFaceIndex,
897 int32_t* pFaceCount, 904 int32_t* pFaceCount,
898 FX_BOOL bSaveStream) { 905 FX_BOOL bSaveStream) {
899 void* Hash[1] = {(void*)(uintptr_t)pFontStream}; 906 void* Hash[1] = {(void*)(uintptr_t)pFontStream};
900 uint32_t dwHash = 907 uint32_t dwHash =
901 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*)); 908 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*));
902 IFX_FileAccess* pFontAccess = NULL; 909 IFX_FileAccess* pFontAccess = nullptr;
903 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { 910 m_Hash2FileAccess.Lookup(dwHash, pFontAccess);
904 } 911
905 if (NULL != pFontAccess) { 912 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
906 return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE); 913 : nullptr;
907 } else {
908 return NULL;
909 }
910 } 914 }
915
911 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, 916 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess,
912 int32_t iFaceIndex, 917 int32_t iFaceIndex,
913 int32_t* pFaceCount, 918 int32_t* pFaceCount,
914 FX_BOOL bWantCache) { 919 FX_BOOL bWantCache) {
915 uint32_t dwHash = 0; 920 uint32_t dwHash = 0;
916 IFX_Font* pFont = NULL; 921 IFX_Font* pFont = nullptr;
917 if (bWantCache) { 922 if (bWantCache) {
918 CFX_ByteString bsHash; 923 CFX_ByteString bsHash;
919 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex); 924 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex);
920 dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength()); 925 dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
921 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { 926 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) {
922 if (NULL != pFont) { 927 if (pFont) {
923 if (NULL != pFaceCount) { 928 if (pFaceCount)
924 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; 929 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
925 }
926 return pFont->Retain(); 930 return pFont->Retain();
927 } 931 }
928 } 932 }
929 } 933 }
934
930 CFX_Font* pInternalFont = new CFX_Font; 935 CFX_Font* pInternalFont = new CFX_Font;
931 IFX_FileRead* pFontStream = 936 IFX_FileRead* pFontStream =
932 pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly); 937 pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
933 if (NULL == pFontStream) { 938 if (!pFontStream) {
934 delete pInternalFont; 939 delete pInternalFont;
935 return NULL; 940 return nullptr;
936 } 941 }
937 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { 942 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
938 delete pInternalFont; 943 delete pInternalFont;
939 pFontStream->Release(); 944 pFontStream->Release();
940 return NULL; 945 return nullptr;
941 } 946 }
942 pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE); 947 pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE);
943 if (NULL == pFont) { 948 if (!pFont) {
944 delete pInternalFont; 949 delete pInternalFont;
945 pFontStream->Release(); 950 pFontStream->Release();
946 return NULL; 951 return nullptr;
947 } 952 }
948 if (bWantCache) { 953 if (bWantCache)
949 m_FileAccess2IFXFont.SetAt(dwHash, pFont); 954 m_FileAccess2IFXFont.SetAt(dwHash, pFont);
950 } 955
951 m_IFXFont2FileRead.SetAt(pFont, pFontStream); 956 m_IFXFont2FileRead.SetAt(pFont, pFontStream);
952 if (NULL != pFaceCount) { 957 if (pFaceCount)
953 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; 958 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
954 } 959
955 return pFont; 960 return pFont;
956 } 961 }
962
957 IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName, 963 IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName,
958 int32_t iFaceIndex, 964 int32_t iFaceIndex,
959 int32_t* pFaceCount) { 965 int32_t* pFaceCount) {
960 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); 966 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
961 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); 967 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
962 if (!pFontMapper) 968 if (!pFontMapper)
963 return nullptr; 969 return nullptr;
970
964 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); 971 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
965 if (!pSystemFontInfo) 972 if (!pSystemFontInfo)
966 return nullptr; 973 return nullptr;
974
967 IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode()); 975 IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode());
968 if (!pFontStream) 976 if (!pFontStream)
969 return nullptr; 977 return nullptr;
978
970 if (!LoadFace(pFontStream, 0)) { 979 if (!LoadFace(pFontStream, 0)) {
971 pFontStream->Release(); 980 pFontStream->Release();
972 return nullptr; 981 return nullptr;
973 } 982 }
983
974 CFX_Font* pInternalFont = new CFX_Font(); 984 CFX_Font* pInternalFont = new CFX_Font();
975 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { 985 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
976 pFontStream->Release(); 986 pFontStream->Release();
977 return nullptr; 987 return nullptr;
978 } 988 }
989
979 IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE); 990 IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE);
980 if (!pFont) { 991 if (!pFont) {
981 pFontStream->Release(); 992 pFontStream->Release();
982 return nullptr; 993 return nullptr;
983 } 994 }
995
984 m_IFXFont2FileRead.SetAt(pFont, pFontStream); 996 m_IFXFont2FileRead.SetAt(pFont, pFontStream);
985 if (pFaceCount) 997 if (pFaceCount)
986 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; 998 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
999
987 return pFont; 1000 return pFont;
988 } 1001 }
1002
989 extern "C" { 1003 extern "C" {
1004
990 unsigned long _ftStreamRead(FXFT_Stream stream, 1005 unsigned long _ftStreamRead(FXFT_Stream stream,
991 unsigned long offset, 1006 unsigned long offset,
992 unsigned char* buffer, 1007 unsigned char* buffer,
993 unsigned long count) { 1008 unsigned long count) {
994 if (count == 0) { 1009 if (count == 0)
995 return 0; 1010 return 0;
996 } 1011
997 IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer; 1012 IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
998 int res = pFile->ReadBlock(buffer, offset, count); 1013 int res = pFile->ReadBlock(buffer, offset, count);
999 if (res) { 1014 if (res)
1000 return count; 1015 return count;
1001 }
1002 return 0; 1016 return 0;
1003 } 1017 }
1018
1004 void _ftStreamClose(FXFT_Stream stream) {} 1019 void _ftStreamClose(FXFT_Stream stream) {}
1005 }; 1020
1021 }; // extern "C"
1006 1022
1007 FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream, 1023 FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
1008 int32_t iFaceIndex) { 1024 int32_t iFaceIndex) {
1009 if (!pFontStream) 1025 if (!pFontStream)
1010 return nullptr; 1026 return nullptr;
1011 1027
1012 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); 1028 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
1013 pFontMgr->InitFTLibrary(); 1029 pFontMgr->InitFTLibrary();
1014 FXFT_Library library = pFontMgr->GetFTLibrary(); 1030 FXFT_Library library = pFontMgr->GetFTLibrary();
1015 if (!library) 1031 if (!library)
1016 return nullptr; 1032 return nullptr;
1017 1033
1018 FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1); 1034 FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1);
1019 FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec)); 1035 FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec));
1020 ftStream->base = NULL; 1036 ftStream->base = nullptr;
1021 ftStream->descriptor.pointer = pFontStream; 1037 ftStream->descriptor.pointer = pFontStream;
1022 ftStream->pos = 0; 1038 ftStream->pos = 0;
1023 ftStream->size = (unsigned long)pFontStream->GetSize(); 1039 ftStream->size = (unsigned long)pFontStream->GetSize();
1024 ftStream->read = _ftStreamRead; 1040 ftStream->read = _ftStreamRead;
1025 ftStream->close = _ftStreamClose; 1041 ftStream->close = _ftStreamClose;
1026 1042
1027 FXFT_Open_Args ftArgs; 1043 FXFT_Open_Args ftArgs;
1028 FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args)); 1044 FXSYS_memset(&ftArgs, 0, sizeof(FXFT_Open_Args));
1029 ftArgs.flags |= FT_OPEN_STREAM; 1045 ftArgs.flags |= FT_OPEN_STREAM;
1030 ftArgs.stream = ftStream; 1046 ftArgs.stream = ftStream;
1031 1047
1032 FXFT_Face pFace = NULL; 1048 FXFT_Face pFace = nullptr;
1033 if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) { 1049 if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) {
1034 FX_Free(ftStream); 1050 FX_Free(ftStream);
1035 return nullptr; 1051 return nullptr;
1036 } 1052 }
1037 1053
1038 FXFT_Set_Pixel_Sizes(pFace, 0, 64); 1054 FXFT_Set_Pixel_Sizes(pFace, 0, 64);
1039 return pFace; 1055 return pFace;
1040 } 1056 }
1041 1057
1042 IFX_FileRead* CFX_FontMgrImp::CreateFontStream( 1058 IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
1043 CFX_FontMapper* pFontMapper, 1059 CFX_FontMapper* pFontMapper,
1044 IFX_SystemFontInfo* pSystemFontInfo, 1060 IFX_SystemFontInfo* pSystemFontInfo,
1045 uint32_t index) { 1061 uint32_t index) {
1046 int iExact = 0; 1062 int iExact = 0;
1047 void* hFont = pSystemFontInfo->MapFont( 1063 void* hFont = pSystemFontInfo->MapFont(
1048 0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact); 1064 0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact);
1049 if (!hFont) 1065 if (!hFont)
1050 return nullptr; 1066 return nullptr;
1067
1051 uint32_t dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0); 1068 uint32_t dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0);
1052 if (dwFileSize == 0) 1069 if (dwFileSize == 0)
1053 return nullptr; 1070 return nullptr;
1071
1054 uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1); 1072 uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1);
1055 dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize); 1073 dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize);
1074
1056 return FX_CreateMemoryStream(pBuffer, dwFileSize, TRUE); 1075 return FX_CreateMemoryStream(pBuffer, dwFileSize, TRUE);
1057 } 1076 }
1058 1077
1059 IFX_FileRead* CFX_FontMgrImp::CreateFontStream( 1078 IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
1060 const CFX_ByteString& bsFaceName) { 1079 const CFX_ByteString& bsFaceName) {
1061 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); 1080 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
1062 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); 1081 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
1082
1063 if (!pFontMapper) 1083 if (!pFontMapper)
1064 return nullptr; 1084 return nullptr;
1085
1065 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); 1086 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
1066 if (!pSystemFontInfo) 1087 if (!pSystemFontInfo)
1067 return nullptr; 1088 return nullptr;
1089
1068 pSystemFontInfo->EnumFontList(pFontMapper); 1090 pSystemFontInfo->EnumFontList(pFontMapper);
1069 for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) { 1091 for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
1070 if (pFontMapper->GetFaceName(i) == bsFaceName) 1092 if (pFontMapper->GetFaceName(i) == bsFaceName)
1071 return CreateFontStream(pFontMapper, pSystemFontInfo, i); 1093 return CreateFontStream(pFontMapper, pSystemFontInfo, i);
1072 } 1094 }
1073 return nullptr; 1095 return nullptr;
1074 } 1096 }
1075 int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts, 1097 int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
1076 uint16_t wCodePage, 1098 uint16_t wCodePage,
1077 uint32_t dwFontStyles, 1099 uint32_t dwFontStyles,
1078 const CFX_WideString& FontName, 1100 const CFX_WideString& FontName,
1079 FX_WCHAR wcUnicode) { 1101 FX_WCHAR wcUnicode) {
1080 MatchedFonts.RemoveAll(); 1102 MatchedFonts.RemoveAll();
1081 CFX_WideString wsNormalizedFontName = FontName; 1103 CFX_WideString wsNormalizedFontName = FontName;
1082 static const int32_t nMax = 0xffff; 1104
1083 CFX_FontDescriptor* pFont = NULL; 1105 CFX_FontDescriptor* pFont = nullptr;
1084 int32_t nCount = m_InstalledFonts.GetSize(); 1106 int32_t nCount = m_InstalledFonts.GetSize();
1085 for (int32_t i = 0; i < nCount; i++) { 1107 for (int32_t i = 0; i < nCount; i++) {
1086 pFont = m_InstalledFonts[i]; 1108 pFont = m_InstalledFonts[i];
1087 int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles, 1109 int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles,
1088 wsNormalizedFontName, wcUnicode); 1110 wsNormalizedFontName, wcUnicode);
1089 if (nPenalty >= 0xFFFF) { 1111 if (nPenalty >= 0xffff)
1090 continue; 1112 continue;
1091 } 1113
1092 FX_FontDescriptorInfo FontInfo; 1114 FX_FontDescriptorInfo FontInfo;
1093 FontInfo.pFont = pFont; 1115 FontInfo.pFont = pFont;
1094 FontInfo.nPenalty = nPenalty; 1116 FontInfo.nPenalty = nPenalty;
1095 MatchedFonts.Add(FontInfo); 1117 MatchedFonts.Add(FontInfo);
1096 if (MatchedFonts.GetSize() == nMax) { 1118 if (MatchedFonts.GetSize() == 0xffff)
1097 break; 1119 break;
1098 }
1099 } 1120 }
1100 if (MatchedFonts.GetSize() == 0) { 1121 if (MatchedFonts.GetSize() == 0)
1101 return 0; 1122 return 0;
1102 } 1123
1103 CFX_SSortTemplate<FX_FontDescriptorInfo> ssort; 1124 CFX_SSortTemplate<FX_FontDescriptorInfo> ssort;
1104 ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize()); 1125 ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize());
1105 return MatchedFonts.GetSize(); 1126 return MatchedFonts.GetSize();
1106 } 1127 }
1128
1107 struct FX_BitCodePage { 1129 struct FX_BitCodePage {
1108 uint16_t wBit; 1130 uint16_t wBit;
1109 uint16_t wCodePage; 1131 uint16_t wCodePage;
1110 }; 1132 };
1111 static const FX_BitCodePage g_Bit2CodePage[] = { 1133 static const FX_BitCodePage g_Bit2CodePage[] = {
1112 {0, 1252}, {1, 1250}, {2, 1251}, {3, 1253}, {4, 1254}, {5, 1255}, 1134 {0, 1252}, {1, 1250}, {2, 1251}, {3, 1253}, {4, 1254}, {5, 1255},
1113 {6, 1256}, {7, 1257}, {8, 1258}, {9, 0}, {10, 0}, {11, 0}, 1135 {6, 1256}, {7, 1257}, {8, 1258}, {9, 0}, {10, 0}, {11, 0},
1114 {12, 0}, {13, 0}, {14, 0}, {15, 0}, {16, 874}, {17, 932}, 1136 {12, 0}, {13, 0}, {14, 0}, {15, 0}, {16, 874}, {17, 932},
1115 {18, 936}, {19, 949}, {20, 950}, {21, 1361}, {22, 0}, {23, 0}, 1137 {18, 936}, {19, 949}, {20, 950}, {21, 1361}, {22, 0}, {23, 0},
1116 {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0}, 1138 {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0},
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1273 for (int32_t i = 0; i < pFonts->GetSize(); i++) { 1295 for (int32_t i = 0; i < pFonts->GetSize(); i++) {
1274 if (pFonts->GetAt(i) == pEFont) { 1296 if (pFonts->GetAt(i) == pEFont) {
1275 pFonts->SetAt(i, NULL); 1297 pFonts->SetAt(i, NULL);
1276 } 1298 }
1277 } 1299 }
1278 } else { 1300 } else {
1279 m_Hash2Fonts.RemoveKey(dwHash); 1301 m_Hash2Fonts.RemoveKey(dwHash);
1280 } 1302 }
1281 } 1303 }
1282 } 1304 }
1305
1283 void CFX_FontMgrImp::RegisterFace(FXFT_Face pFace, 1306 void CFX_FontMgrImp::RegisterFace(FXFT_Face pFace,
1284 CFX_FontDescriptors& Fonts, 1307 CFX_FontDescriptors& Fonts,
1285 const CFX_WideString* pFaceName, 1308 const CFX_WideString* pFaceName,
1286 IFX_FileAccess* pFontAccess) { 1309 IFX_FileAccess* pFontAccess) {
1287 if (0 == (pFace->face_flags & FT_FACE_FLAG_SCALABLE)) { 1310 if ((pFace->face_flags & FT_FACE_FLAG_SCALABLE) == 0)
1288 return; 1311 return;
1289 } 1312
1290 CFX_FontDescriptor* pFont = new CFX_FontDescriptor; 1313 CFX_FontDescriptor* pFont = new CFX_FontDescriptor;
1291 pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0; 1314 pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0;
1292 pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0; 1315 pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0;
1293 pFont->m_dwFontStyles |= GetFlags(pFace); 1316 pFont->m_dwFontStyles |= GetFlags(pFace);
1317
1294 CFX_ArrayTemplate<uint16_t> Charsets; 1318 CFX_ArrayTemplate<uint16_t> Charsets;
1295 GetCharsets(pFace, Charsets); 1319 GetCharsets(pFace, Charsets);
1296 GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb); 1320 GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb);
1321
1322 FT_ULong dwTag;
1323 uint8_t* pTable = nullptr;
1324 FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e');
1325
1297 unsigned long nLength = 0; 1326 unsigned long nLength = 0;
1298 FT_ULong dwTag; 1327 unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, nullptr, &nLength);
1299 uint8_t* pTable = NULL; 1328 if (error == 0 && nLength != 0) {
1300 FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e');
1301 unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, NULL, &nLength);
1302 if (0 == error && 0 != nLength) {
1303 pTable = FX_Alloc(uint8_t, nLength); 1329 pTable = FX_Alloc(uint8_t, nLength);
1304 error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, NULL); 1330 error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, nullptr);
1305 if (0 != error) { 1331 if (0 != error) {
1306 FX_Free(pTable); 1332 FX_Free(pTable);
1307 pTable = NULL; 1333 pTable = nullptr;
1308 } 1334 }
1309 } 1335 }
1310 GetNames(pTable, pFont->m_wsFamilyNames); 1336 GetNames(pTable, pFont->m_wsFamilyNames);
1311 if (NULL != pTable) { 1337 if (pTable)
1312 FX_Free(pTable); 1338 FX_Free(pTable);
1313 } 1339
1314 pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode()); 1340 pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode());
1315 if (pFaceName) { 1341 pFont->m_wsFaceName =
1316 pFont->m_wsFaceName = *pFaceName; 1342 pFaceName ? *pFaceName
1317 } else { 1343 : CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
1318 pFont->m_wsFaceName =
1319 CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
1320 }
1321 pFont->m_nFaceIndex = pFace->face_index; 1344 pFont->m_nFaceIndex = pFace->face_index;
1322 if (pFontAccess) 1345 pFont->m_pFileAccess = pFontAccess ? pFontAccess->Retain() : nullptr;
1323 pFont->m_pFileAccess = pFontAccess->Retain(); 1346
1324 else
1325 pFont->m_pFileAccess = nullptr;
1326 Fonts.Add(pFont); 1347 Fonts.Add(pFont);
1327 } 1348 }
1349
1328 void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream, 1350 void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream,
1329 const CFX_WideString* pFaceName) { 1351 const CFX_WideString* pFaceName) {
1330 int32_t index = 0; 1352 int32_t index = 0;
1331 int32_t num_faces = 0; 1353 int32_t num_faces = 0;
1332 do { 1354 do {
1333 FXFT_Face pFace = LoadFace(pFontStream, index++); 1355 FXFT_Face pFace = LoadFace(pFontStream, index++);
1334 if (!pFace) 1356 if (!pFace)
1335 continue; 1357 continue;
1336 // All faces keep number of faces. It can be retrieved from any one face. 1358 // All faces keep number of faces. It can be retrieved from any one face.
1337 if (!num_faces) 1359 if (num_faces == 0)
1338 num_faces = pFace->num_faces; 1360 num_faces = pFace->num_faces;
1339 RegisterFace(pFace, m_InstalledFonts, pFaceName, nullptr); 1361 RegisterFace(pFace, m_InstalledFonts, pFaceName, nullptr);
1340 if (FXFT_Get_Face_External_Stream(pFace)) 1362 if (FXFT_Get_Face_External_Stream(pFace))
1341 FXFT_Clear_Face_External_Stream(pFace); 1363 FXFT_Clear_Face_External_Stream(pFace);
1342 FXFT_Done_Face(pFace); 1364 FXFT_Done_Face(pFace);
1343 } while (index < num_faces); 1365 } while (index < num_faces);
1344 } 1366 }
1345 uint32_t CFX_FontMgrImp::GetFlags(FXFT_Face pFace) { 1367 uint32_t CFX_FontMgrImp::GetFlags(FXFT_Face pFace) {
1346 uint32_t flag = 0; 1368 uint32_t flag = 0;
1347 if (FT_IS_FIXED_WIDTH(pFace)) { 1369 if (FT_IS_FIXED_WIDTH(pFace)) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1508 } 1530 }
1509 } 1531 }
1510 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, 1532 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1,
1511 const CFX_WideString& Name2) { 1533 const CFX_WideString& Name2) {
1512 if (Name1.Find((const FX_WCHAR*)Name2) != -1) { 1534 if (Name1.Find((const FX_WCHAR*)Name2) != -1) {
1513 return 1; 1535 return 1;
1514 } 1536 }
1515 return 0; 1537 return 0;
1516 } 1538 }
1517 #endif 1539 #endif
OLDNEW
« core/fxge/ge/fx_ge_fontmap.cpp ('K') | « core/fxge/ge/fx_ge_fontmap.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698