OLD | NEW |
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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 pFont = IFX_Font::LoadFont(pBuffer, iLength, this); | 169 pFont = IFX_Font::LoadFont(pBuffer, iLength, this); |
170 if (pFont != NULL) { | 170 if (pFont != NULL) { |
171 m_Fonts.Add(pFont); | 171 m_Fonts.Add(pFont); |
172 m_BufferFonts.SetAt((void*)pBuffer, pFont); | 172 m_BufferFonts.SetAt((void*)pBuffer, pFont); |
173 return pFont->Retain(); | 173 return pFont->Retain(); |
174 } | 174 } |
175 return NULL; | 175 return NULL; |
176 } | 176 } |
177 IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) { | 177 IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) { |
178 FXSYS_assert(pszFileName != NULL); | 178 FXSYS_assert(pszFileName != NULL); |
179 uint32_t dwHash = FX_HashCode_String_GetW(pszFileName, -1); | 179 uint32_t dwHash = FX_HashCode_GetW(pszFileName, false); |
180 IFX_Font* pFont = NULL; | 180 IFX_Font* pFont = NULL; |
181 if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { | 181 if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { |
182 if (pFont != NULL) { | 182 if (pFont != NULL) { |
183 return pFont->Retain(); | 183 return pFont->Retain(); |
184 } | 184 } |
185 } | 185 } |
186 pFont = IFX_Font::LoadFont(pszFileName, NULL); | 186 pFont = IFX_Font::LoadFont(pszFileName, NULL); |
187 if (pFont != NULL) { | 187 if (pFont != NULL) { |
188 m_Fonts.Add(pFont); | 188 m_Fonts.Add(pFont); |
189 m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 189 m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 } | 223 } |
224 IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font* pSrcFont, | 224 IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font* pSrcFont, |
225 uint32_t dwFontStyles, | 225 uint32_t dwFontStyles, |
226 uint16_t wCodePage) { | 226 uint16_t wCodePage) { |
227 FXSYS_assert(pSrcFont != NULL); | 227 FXSYS_assert(pSrcFont != NULL); |
228 if (pSrcFont->GetFontStyles() == dwFontStyles) { | 228 if (pSrcFont->GetFontStyles() == dwFontStyles) { |
229 return pSrcFont->Retain(); | 229 return pSrcFont->Retain(); |
230 } | 230 } |
231 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles, | 231 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles, |
232 (void*)(uintptr_t)wCodePage}; | 232 (void*)(uintptr_t)wCodePage}; |
233 uint32_t dwHash = | 233 uint32_t dwHash = FX_HashCode_GetA( |
234 FX_HashCode_String_GetA((const FX_CHAR*)buffer, 3 * sizeof(void*)); | 234 CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false); |
235 IFX_Font* pFont = NULL; | 235 IFX_Font* pFont = NULL; |
236 if (m_DeriveFonts.GetCount() > 0) { | 236 if (m_DeriveFonts.GetCount() > 0) { |
237 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont); | 237 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont); |
238 if (pFont != NULL) { | 238 if (pFont != NULL) { |
239 return pFont->Retain(); | 239 return pFont->Retain(); |
240 } | 240 } |
241 } | 241 } |
242 pFont = pSrcFont->Derive(dwFontStyles, wCodePage); | 242 pFont = pSrcFont->Derive(dwFontStyles, wCodePage); |
243 if (pFont != NULL) { | 243 if (pFont != NULL) { |
244 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 244 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 const FX_WCHAR* pszFontFamily) { | 695 const FX_WCHAR* pszFontFamily) { |
696 return nullptr; | 696 return nullptr; |
697 } | 697 } |
698 | 698 |
699 IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage, | 699 IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage, |
700 uint32_t dwFontStyles, | 700 uint32_t dwFontStyles, |
701 const FX_WCHAR* pszFontFamily) { | 701 const FX_WCHAR* pszFontFamily) { |
702 CFX_ByteString bsHash; | 702 CFX_ByteString bsHash; |
703 bsHash.Format("%d, %d", wCodePage, dwFontStyles); | 703 bsHash.Format("%d, %d", wCodePage, dwFontStyles); |
704 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); | 704 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); |
705 uint32_t dwHash = FX_HashCode_String_GetA(bsHash.c_str(), bsHash.GetLength()); | 705 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
706 | |
707 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; | 706 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; |
708 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { | 707 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { |
709 if (!pFonts) | 708 if (!pFonts) |
710 return nullptr; | 709 return nullptr; |
711 | 710 |
712 if (pFonts->GetSize() != 0) | 711 if (pFonts->GetSize() != 0) |
713 return pFonts->GetAt(0)->Retain(); | 712 return pFonts->GetAt(0)->Retain(); |
714 } | 713 } |
715 | 714 |
716 if (!pFonts) | 715 if (!pFonts) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 return nullptr; | 751 return nullptr; |
753 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); | 752 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); |
754 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF; | 753 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF; |
755 uint16_t wBitField = x ? x->wBitField : 0x03E7; | 754 uint16_t wBitField = x ? x->wBitField : 0x03E7; |
756 CFX_ByteString bsHash; | 755 CFX_ByteString bsHash; |
757 if (wCodePage == 0xFFFF) | 756 if (wCodePage == 0xFFFF) |
758 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); | 757 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); |
759 else | 758 else |
760 bsHash.Format("%d, %d", wCodePage, dwFontStyles); | 759 bsHash.Format("%d, %d", wCodePage, dwFontStyles); |
761 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); | 760 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); |
762 uint32_t dwHash = FX_HashCode_String_GetA(bsHash.c_str(), bsHash.GetLength()); | 761 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
763 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; | 762 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; |
764 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { | 763 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { |
765 if (!pFonts) | 764 if (!pFonts) |
766 return nullptr; | 765 return nullptr; |
767 for (int32_t i = 0; i < pFonts->GetSize(); ++i) { | 766 for (int32_t i = 0; i < pFonts->GetSize(); ++i) { |
768 if (VerifyUnicode(pFonts->GetAt(i), wUnicode)) | 767 if (VerifyUnicode(pFonts->GetAt(i), wUnicode)) |
769 return pFonts->GetAt(i)->Retain(); | 768 return pFonts->GetAt(i)->Retain(); |
770 } | 769 } |
771 } | 770 } |
772 if (!pFonts) | 771 if (!pFonts) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, | 839 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, |
841 pszFontFamily); | 840 pszFontFamily); |
842 } | 841 } |
843 | 842 |
844 IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer, | 843 IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer, |
845 int32_t iLength, | 844 int32_t iLength, |
846 int32_t iFaceIndex, | 845 int32_t iFaceIndex, |
847 int32_t* pFaceCount) { | 846 int32_t* pFaceCount) { |
848 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength}; | 847 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength}; |
849 uint32_t dwHash = | 848 uint32_t dwHash = |
850 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*)); | 849 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); |
851 IFX_FileAccess* pFontAccess = nullptr; | 850 IFX_FileAccess* pFontAccess = nullptr; |
852 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); | 851 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); |
853 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 852 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
854 : nullptr; | 853 : nullptr; |
855 } | 854 } |
856 | 855 |
857 IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName, | 856 IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName, |
858 int32_t iFaceIndex, | 857 int32_t iFaceIndex, |
859 int32_t* pFaceCount) { | 858 int32_t* pFaceCount) { |
860 CFX_ByteString bsHash; | 859 CFX_ByteString bsHash; |
861 bsHash += CFX_WideString(pszFileName).UTF8Encode(); | 860 bsHash += CFX_WideString(pszFileName).UTF8Encode(); |
862 | 861 |
863 uint32_t dwHash = FX_HashCode_String_GetA(bsHash.c_str(), bsHash.GetLength()); | 862 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
864 IFX_FileAccess* pFontAccess = nullptr; | 863 IFX_FileAccess* pFontAccess = nullptr; |
865 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { | 864 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { |
866 pFontAccess = FX_CreateDefaultFileAccess(pszFileName); | 865 pFontAccess = FX_CreateDefaultFileAccess(pszFileName); |
867 m_Hash2FileAccess.SetAt(dwHash, pFontAccess); | 866 m_Hash2FileAccess.SetAt(dwHash, pFontAccess); |
868 } | 867 } |
869 | 868 |
870 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 869 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
871 : nullptr; | 870 : nullptr; |
872 } | 871 } |
873 | 872 |
874 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream, | 873 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream, |
875 int32_t iFaceIndex, | 874 int32_t iFaceIndex, |
876 int32_t* pFaceCount, | 875 int32_t* pFaceCount, |
877 FX_BOOL bSaveStream) { | 876 FX_BOOL bSaveStream) { |
878 void* Hash[1] = {(void*)(uintptr_t)pFontStream}; | 877 void* Hash[1] = {(void*)(uintptr_t)pFontStream}; |
879 uint32_t dwHash = | 878 uint32_t dwHash = |
880 FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*)); | 879 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); |
881 IFX_FileAccess* pFontAccess = nullptr; | 880 IFX_FileAccess* pFontAccess = nullptr; |
882 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); | 881 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); |
883 | 882 |
884 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 883 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
885 : nullptr; | 884 : nullptr; |
886 } | 885 } |
887 | 886 |
888 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, | 887 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, |
889 int32_t iFaceIndex, | 888 int32_t iFaceIndex, |
890 int32_t* pFaceCount, | 889 int32_t* pFaceCount, |
891 FX_BOOL bWantCache) { | 890 FX_BOOL bWantCache) { |
892 uint32_t dwHash = 0; | 891 uint32_t dwHash = 0; |
893 IFX_Font* pFont = nullptr; | 892 IFX_Font* pFont = nullptr; |
894 if (bWantCache) { | 893 if (bWantCache) { |
895 CFX_ByteString bsHash; | 894 CFX_ByteString bsHash; |
896 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex); | 895 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex); |
897 dwHash = FX_HashCode_String_GetA(bsHash.c_str(), bsHash.GetLength()); | 896 dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
898 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { | 897 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { |
899 if (pFont) { | 898 if (pFont) { |
900 if (pFaceCount) | 899 if (pFaceCount) |
901 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; | 900 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; |
902 return pFont->Retain(); | 901 return pFont->Retain(); |
903 } | 902 } |
904 } | 903 } |
905 } | 904 } |
906 | 905 |
907 CFX_Font* pInternalFont = new CFX_Font; | 906 CFX_Font* pInternalFont = new CFX_Font; |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1503 } | 1502 } |
1504 } | 1503 } |
1505 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, | 1504 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, |
1506 const CFX_WideString& Name2) { | 1505 const CFX_WideString& Name2) { |
1507 if (Name1.Find(Name2.c_str()) != -1) { | 1506 if (Name1.Find(Name2.c_str()) != -1) { |
1508 return 1; | 1507 return 1; |
1509 } | 1508 } |
1510 return 0; | 1509 return 0; |
1511 } | 1510 } |
1512 #endif | 1511 #endif |
OLD | NEW |