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 "core/fxge/include/fx_ge.h" | 10 #include "core/fxge/include/fx_ge.h" |
11 #include "xfa/fgas/crt/fgas_codepage.h" | 11 #include "xfa/fgas/crt/fgas_codepage.h" |
12 #include "xfa/fgas/font/fgas_fontutils.h" | 12 #include "xfa/fgas/font/fgas_fontutils.h" |
13 #include "xfa/fgas/font/fgas_gefont.h" | |
13 | 14 |
14 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 15 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
15 IFX_FontMgr* IFX_FontMgr::Create(FX_LPEnumAllFonts pEnumerator) { | 16 IFX_FontMgr* IFX_FontMgr::Create(FX_LPEnumAllFonts pEnumerator) { |
16 return new CFX_StdFontMgrImp(pEnumerator); | 17 return new CFX_StdFontMgrImp(pEnumerator); |
17 } | 18 } |
18 CFX_StdFontMgrImp::CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator) | 19 CFX_StdFontMgrImp::CFX_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator) |
19 : m_pEnumerator(pEnumerator), | 20 : m_pEnumerator(pEnumerator), |
20 m_FontFaces(), | 21 m_FontFaces(), |
21 m_CPFonts(8), | 22 m_CPFonts(8), |
22 m_FamilyFonts(16), | 23 m_FamilyFonts(16), |
(...skipping 13 matching lines...) Expand all Loading... | |
36 m_FamilyFonts.RemoveAll(); | 37 m_FamilyFonts.RemoveAll(); |
37 m_UnicodeFonts.RemoveAll(); | 38 m_UnicodeFonts.RemoveAll(); |
38 m_BufferFonts.RemoveAll(); | 39 m_BufferFonts.RemoveAll(); |
39 m_FileFonts.RemoveAll(); | 40 m_FileFonts.RemoveAll(); |
40 m_StreamFonts.RemoveAll(); | 41 m_StreamFonts.RemoveAll(); |
41 m_DeriveFonts.RemoveAll(); | 42 m_DeriveFonts.RemoveAll(); |
42 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) | 43 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) |
43 m_Fonts[i]->Release(); | 44 m_Fonts[i]->Release(); |
44 } | 45 } |
45 | 46 |
46 IFX_Font* CFX_StdFontMgrImp::GetDefFontByCodePage( | 47 CFX_GEFont* CFX_StdFontMgrImp::GetDefFontByCodePage( |
47 uint16_t wCodePage, | 48 uint16_t wCodePage, |
48 uint32_t dwFontStyles, | 49 uint32_t dwFontStyles, |
49 const FX_WCHAR* pszFontFamily) { | 50 const FX_WCHAR* pszFontFamily) { |
50 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); | 51 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); |
51 IFX_Font* pFont = NULL; | 52 CFX_GEFont* pFont = NULL; |
dsinclair
2016/06/02 17:37:39
nit: nullptr and others.
| |
52 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { | 53 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { |
53 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; | 54 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; |
54 } | 55 } |
55 FX_FONTDESCRIPTOR const* pFD; | 56 FX_FONTDESCRIPTOR const* pFD; |
56 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { | 57 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { |
dsinclair
2016/06/02 17:37:39
nit: if (!( ... and drop the == NULL
| |
57 if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) { | 58 if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) { |
58 if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL) | 59 if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL) |
59 return NULL; | 60 return NULL; |
60 } | 61 } |
61 } | 62 } |
62 ASSERT(pFD); | 63 ASSERT(pFD); |
63 pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); | 64 pFont = CFX_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); |
64 if (pFont) { | 65 if (pFont) { |
65 m_Fonts.Add(pFont); | 66 m_Fonts.Add(pFont); |
66 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 67 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
67 dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage); | 68 dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage); |
68 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 69 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
69 return LoadFont(pFont, dwFontStyles, wCodePage); | 70 return LoadFont(pFont, dwFontStyles, wCodePage); |
70 } | 71 } |
71 return NULL; | 72 return NULL; |
72 } | 73 } |
73 IFX_Font* CFX_StdFontMgrImp::GetDefFontByCharset( | 74 CFX_GEFont* CFX_StdFontMgrImp::GetDefFontByCharset( |
74 uint8_t nCharset, | 75 uint8_t nCharset, |
75 uint32_t dwFontStyles, | 76 uint32_t dwFontStyles, |
76 const FX_WCHAR* pszFontFamily) { | 77 const FX_WCHAR* pszFontFamily) { |
77 return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, | 78 return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, |
78 pszFontFamily); | 79 pszFontFamily); |
79 } | 80 } |
80 | 81 |
81 IFX_Font* CFX_StdFontMgrImp::GetDefFontByUnicode( | 82 CFX_GEFont* CFX_StdFontMgrImp::GetDefFontByUnicode( |
82 FX_WCHAR wUnicode, | 83 FX_WCHAR wUnicode, |
83 uint32_t dwFontStyles, | 84 uint32_t dwFontStyles, |
84 const FX_WCHAR* pszFontFamily) { | 85 const FX_WCHAR* pszFontFamily) { |
85 const FGAS_FONTUSB* pRet = FGAS_GetUnicodeBitField(wUnicode); | 86 const FGAS_FONTUSB* pRet = FGAS_GetUnicodeBitField(wUnicode); |
86 if (pRet->wBitField == 999) | 87 if (pRet->wBitField == 999) |
87 return nullptr; | 88 return nullptr; |
88 | 89 |
89 uint32_t dwHash = | 90 uint32_t dwHash = |
90 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField); | 91 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField); |
91 IFX_Font* pFont = nullptr; | 92 CFX_GEFont* pFont = nullptr; |
92 if (m_UnicodeFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) | 93 if (m_UnicodeFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) |
93 return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : nullptr; | 94 return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : nullptr; |
94 | 95 |
95 FX_FONTDESCRIPTOR const* pFD = | 96 FX_FONTDESCRIPTOR const* pFD = |
96 FindFont(pszFontFamily, dwFontStyles, FALSE, pRet->wCodePage, | 97 FindFont(pszFontFamily, dwFontStyles, FALSE, pRet->wCodePage, |
97 pRet->wBitField, wUnicode); | 98 pRet->wBitField, wUnicode); |
98 if (!pFD && pszFontFamily) { | 99 if (!pFD && pszFontFamily) { |
99 pFD = FindFont(nullptr, dwFontStyles, FALSE, pRet->wCodePage, | 100 pFD = FindFont(nullptr, dwFontStyles, FALSE, pRet->wCodePage, |
100 pRet->wBitField, wUnicode); | 101 pRet->wBitField, wUnicode); |
101 } | 102 } |
102 if (!pFD) | 103 if (!pFD) |
103 return nullptr; | 104 return nullptr; |
104 | 105 |
105 uint16_t wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); | 106 uint16_t wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); |
106 const FX_WCHAR* pFontFace = pFD->wsFontFace; | 107 const FX_WCHAR* pFontFace = pFD->wsFontFace; |
107 pFont = IFX_Font::LoadFont(pFontFace, dwFontStyles, wCodePage, this); | 108 pFont = CFX_GEFont::LoadFont(pFontFace, dwFontStyles, wCodePage, this); |
108 if (pFont) { | 109 if (pFont) { |
109 m_Fonts.Add(pFont); | 110 m_Fonts.Add(pFont); |
110 m_UnicodeFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 111 m_UnicodeFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
111 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); | 112 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); |
112 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 113 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
113 dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage); | 114 dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage); |
114 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 115 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
115 return LoadFont(pFont, dwFontStyles, wCodePage); | 116 return LoadFont(pFont, dwFontStyles, wCodePage); |
116 } | 117 } |
117 return nullptr; | 118 return nullptr; |
118 } | 119 } |
119 | 120 |
120 IFX_Font* CFX_StdFontMgrImp::GetDefFontByLanguage( | 121 CFX_GEFont* CFX_StdFontMgrImp::GetDefFontByLanguage( |
121 uint16_t wLanguage, | 122 uint16_t wLanguage, |
122 uint32_t dwFontStyles, | 123 uint32_t dwFontStyles, |
123 const FX_WCHAR* pszFontFamily) { | 124 const FX_WCHAR* pszFontFamily) { |
124 return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), | 125 return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), |
125 dwFontStyles, pszFontFamily); | 126 dwFontStyles, pszFontFamily); |
126 } | 127 } |
127 IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily, | 128 CFX_GEFont* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily, |
128 uint32_t dwFontStyles, | 129 uint32_t dwFontStyles, |
129 uint16_t wCodePage) { | 130 uint16_t wCodePage) { |
130 uint32_t dwHash = | 131 uint32_t dwHash = |
131 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage); | 132 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage); |
132 IFX_Font* pFont = NULL; | 133 CFX_GEFont* pFont = NULL; |
133 if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { | 134 if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { |
134 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; | 135 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; |
135 } | 136 } |
136 FX_FONTDESCRIPTOR const* pFD = NULL; | 137 FX_FONTDESCRIPTOR const* pFD = NULL; |
137 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { | 138 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { |
138 if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) == | 139 if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) == |
139 NULL) { | 140 NULL) { |
140 return NULL; | 141 return NULL; |
141 } | 142 } |
142 } | 143 } |
143 ASSERT(pFD); | 144 ASSERT(pFD); |
144 if (wCodePage == 0xFFFF) { | 145 if (wCodePage == 0xFFFF) { |
145 wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); | 146 wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); |
146 } | 147 } |
147 pFont = IFX_Font::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); | 148 pFont = CFX_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); |
148 if (pFont) { | 149 if (pFont) { |
149 m_Fonts.Add(pFont); | 150 m_Fonts.Add(pFont); |
150 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 151 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
151 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); | 152 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); |
152 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 153 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
153 return LoadFont(pFont, dwFontStyles, wCodePage); | 154 return LoadFont(pFont, dwFontStyles, wCodePage); |
154 } | 155 } |
155 return NULL; | 156 return NULL; |
156 } | 157 } |
157 IFX_Font* CFX_StdFontMgrImp::LoadFont(const uint8_t* pBuffer, int32_t iLength) { | 158 CFX_GEFont* CFX_StdFontMgrImp::LoadFont(const uint8_t* pBuffer, |
159 int32_t iLength) { | |
158 ASSERT(pBuffer && iLength > 0); | 160 ASSERT(pBuffer && iLength > 0); |
159 IFX_Font* pFont = NULL; | 161 CFX_GEFont* pFont = NULL; |
160 if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) { | 162 if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) { |
161 if (pFont) { | 163 if (pFont) { |
162 return pFont->Retain(); | 164 return pFont->Retain(); |
163 } | 165 } |
164 } | 166 } |
165 pFont = IFX_Font::LoadFont(pBuffer, iLength, this); | 167 pFont = CFX_GEFont::LoadFont(pBuffer, iLength, this); |
166 if (pFont) { | 168 if (pFont) { |
167 m_Fonts.Add(pFont); | 169 m_Fonts.Add(pFont); |
168 m_BufferFonts.SetAt((void*)pBuffer, pFont); | 170 m_BufferFonts.SetAt((void*)pBuffer, pFont); |
169 return pFont->Retain(); | 171 return pFont->Retain(); |
170 } | 172 } |
171 return NULL; | 173 return NULL; |
172 } | 174 } |
173 IFX_Font* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) { | 175 CFX_GEFont* CFX_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFileName) { |
174 ASSERT(pszFileName); | 176 ASSERT(pszFileName); |
175 uint32_t dwHash = FX_HashCode_GetW(pszFileName, false); | 177 uint32_t dwHash = FX_HashCode_GetW(pszFileName, false); |
176 IFX_Font* pFont = NULL; | 178 CFX_GEFont* pFont = NULL; |
177 if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { | 179 if (m_FileFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { |
178 if (pFont) { | 180 if (pFont) { |
179 return pFont->Retain(); | 181 return pFont->Retain(); |
180 } | 182 } |
181 } | 183 } |
182 pFont = IFX_Font::LoadFont(pszFileName, NULL); | 184 pFont = CFX_GEFont::LoadFont(pszFileName); |
183 if (pFont) { | 185 if (pFont) { |
184 m_Fonts.Add(pFont); | 186 m_Fonts.Add(pFont); |
185 m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 187 m_FileFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
186 return pFont->Retain(); | 188 return pFont->Retain(); |
187 } | 189 } |
188 return NULL; | 190 return NULL; |
189 } | 191 } |
190 IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream, | 192 CFX_GEFont* CFX_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream, |
191 const FX_WCHAR* pszFontAlias, | 193 const FX_WCHAR* pszFontAlias, |
192 uint32_t dwFontStyles, | 194 uint32_t dwFontStyles, |
193 uint16_t wCodePage, | 195 uint16_t wCodePage, |
194 FX_BOOL bSaveStream) { | 196 FX_BOOL bSaveStream) { |
195 ASSERT(pFontStream && pFontStream->GetLength() > 0); | 197 ASSERT(pFontStream && pFontStream->GetLength() > 0); |
196 IFX_Font* pFont = NULL; | 198 CFX_GEFont* pFont = NULL; |
197 if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) { | 199 if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) { |
198 if (pFont) { | 200 if (pFont) { |
199 if (pszFontAlias) { | 201 if (pszFontAlias) { |
200 uint32_t dwHash = | 202 uint32_t dwHash = |
201 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); | 203 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); |
202 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 204 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
203 } | 205 } |
204 return LoadFont(pFont, dwFontStyles, wCodePage); | 206 return LoadFont(pFont, dwFontStyles, wCodePage); |
205 } | 207 } |
206 } | 208 } |
207 pFont = IFX_Font::LoadFont(pFontStream, this, bSaveStream); | 209 pFont = CFX_GEFont::LoadFont(pFontStream, this, bSaveStream); |
208 if (pFont) { | 210 if (pFont) { |
209 m_Fonts.Add(pFont); | 211 m_Fonts.Add(pFont); |
210 m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont); | 212 m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont); |
211 if (pszFontAlias) { | 213 if (pszFontAlias) { |
212 uint32_t dwHash = | 214 uint32_t dwHash = |
213 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); | 215 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); |
214 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 216 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
215 } | 217 } |
216 return LoadFont(pFont, dwFontStyles, wCodePage); | 218 return LoadFont(pFont, dwFontStyles, wCodePage); |
217 } | 219 } |
218 return NULL; | 220 return NULL; |
219 } | 221 } |
220 IFX_Font* CFX_StdFontMgrImp::LoadFont(IFX_Font* pSrcFont, | 222 CFX_GEFont* CFX_StdFontMgrImp::LoadFont(CFX_GEFont* pSrcFont, |
221 uint32_t dwFontStyles, | 223 uint32_t dwFontStyles, |
222 uint16_t wCodePage) { | 224 uint16_t wCodePage) { |
223 ASSERT(pSrcFont); | 225 ASSERT(pSrcFont); |
224 if (pSrcFont->GetFontStyles() == dwFontStyles) { | 226 if (pSrcFont->GetFontStyles() == dwFontStyles) { |
225 return pSrcFont->Retain(); | 227 return pSrcFont->Retain(); |
226 } | 228 } |
227 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles, | 229 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles, |
228 (void*)(uintptr_t)wCodePage}; | 230 (void*)(uintptr_t)wCodePage}; |
229 uint32_t dwHash = FX_HashCode_GetA( | 231 uint32_t dwHash = FX_HashCode_GetA( |
230 CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false); | 232 CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false); |
231 IFX_Font* pFont = NULL; | 233 CFX_GEFont* pFont = NULL; |
232 if (m_DeriveFonts.GetCount() > 0) { | 234 if (m_DeriveFonts.GetCount() > 0) { |
233 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont); | 235 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont); |
234 if (pFont) { | 236 if (pFont) { |
235 return pFont->Retain(); | 237 return pFont->Retain(); |
236 } | 238 } |
237 } | 239 } |
238 pFont = pSrcFont->Derive(dwFontStyles, wCodePage); | 240 pFont = pSrcFont->Derive(dwFontStyles, wCodePage); |
239 if (pFont) { | 241 if (pFont) { |
240 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); | 242 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); |
241 int32_t index = m_Fonts.Find(pFont); | 243 int32_t index = m_Fonts.Find(pFont); |
242 if (index < 0) { | 244 if (index < 0) { |
243 m_Fonts.Add(pFont); | 245 m_Fonts.Add(pFont); |
244 pFont->Retain(); | 246 pFont->Retain(); |
245 } | 247 } |
246 return pFont; | 248 return pFont; |
247 } | 249 } |
248 return NULL; | 250 return NULL; |
249 } | 251 } |
250 | 252 |
251 void CFX_StdFontMgrImp::ClearFontCache() { | 253 void CFX_StdFontMgrImp::ClearFontCache() { |
252 for (int32_t i = 0; i < m_Fonts.GetSize(); i++) | 254 for (int32_t i = 0; i < m_Fonts.GetSize(); i++) |
253 m_Fonts[i]->Reset(); | 255 m_Fonts[i]->Reset(); |
254 } | 256 } |
255 | 257 |
256 void CFX_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap, IFX_Font* pFont) { | 258 void CFX_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap, |
259 CFX_GEFont* pFont) { | |
257 FX_POSITION pos = fontMap.GetStartPosition(); | 260 FX_POSITION pos = fontMap.GetStartPosition(); |
258 void* pKey; | 261 void* pKey; |
259 void* pFind; | 262 void* pFind; |
260 while (pos) { | 263 while (pos) { |
261 pFind = NULL; | 264 pFind = NULL; |
262 fontMap.GetNextAssoc(pos, pKey, pFind); | 265 fontMap.GetNextAssoc(pos, pKey, pFind); |
263 if (pFind != (void*)pFont) { | 266 if (pFind != (void*)pFont) { |
264 continue; | 267 continue; |
265 } | 268 } |
266 fontMap.RemoveKey(pKey); | 269 fontMap.RemoveKey(pKey); |
267 break; | 270 break; |
268 } | 271 } |
269 } | 272 } |
270 void CFX_StdFontMgrImp::RemoveFont(IFX_Font* pFont) { | 273 void CFX_StdFontMgrImp::RemoveFont(CFX_GEFont* pFont) { |
271 RemoveFont(m_CPFonts, pFont); | 274 RemoveFont(m_CPFonts, pFont); |
272 RemoveFont(m_FamilyFonts, pFont); | 275 RemoveFont(m_FamilyFonts, pFont); |
273 RemoveFont(m_UnicodeFonts, pFont); | 276 RemoveFont(m_UnicodeFonts, pFont); |
274 RemoveFont(m_BufferFonts, pFont); | 277 RemoveFont(m_BufferFonts, pFont); |
275 RemoveFont(m_FileFonts, pFont); | 278 RemoveFont(m_FileFonts, pFont); |
276 RemoveFont(m_StreamFonts, pFont); | 279 RemoveFont(m_StreamFonts, pFont); |
277 RemoveFont(m_DeriveFonts, pFont); | 280 RemoveFont(m_DeriveFonts, pFont); |
278 int32_t iFind = m_Fonts.Find(pFont); | 281 int32_t iFind = m_Fonts.Find(pFont); |
279 if (iFind > -1) { | 282 if (iFind > -1) { |
280 m_Fonts.RemoveAt(iFind, 1); | 283 m_Fonts.RemoveAt(iFind, 1); |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
622 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); | 625 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); |
623 while (pos) { | 626 while (pos) { |
624 uint32_t dwHash; | 627 uint32_t dwHash; |
625 CFX_FontDescriptorInfos* pDescs; | 628 CFX_FontDescriptorInfos* pDescs; |
626 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); | 629 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); |
627 delete pDescs; | 630 delete pDescs; |
628 } | 631 } |
629 pos = m_Hash2Fonts.GetStartPosition(); | 632 pos = m_Hash2Fonts.GetStartPosition(); |
630 while (pos) { | 633 while (pos) { |
631 uint32_t dwHash; | 634 uint32_t dwHash; |
632 CFX_ArrayTemplate<IFX_Font*>* pFonts; | 635 CFX_ArrayTemplate<CFX_GEFont*>* pFonts; |
633 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); | 636 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); |
634 delete pFonts; | 637 delete pFonts; |
635 } | 638 } |
636 m_Hash2Fonts.RemoveAll(); | 639 m_Hash2Fonts.RemoveAll(); |
637 pos = m_Hash2FileAccess.GetStartPosition(); | 640 pos = m_Hash2FileAccess.GetStartPosition(); |
638 while (pos) { | 641 while (pos) { |
639 uint32_t dwHash; | 642 uint32_t dwHash; |
640 IFX_FileAccess* pFileAccess; | 643 IFX_FileAccess* pFileAccess; |
641 m_Hash2FileAccess.GetNextAssoc(pos, dwHash, pFileAccess); | 644 m_Hash2FileAccess.GetNextAssoc(pos, dwHash, pFileAccess); |
642 if (NULL != pFileAccess) { | 645 if (NULL != pFileAccess) { |
643 pFileAccess->Release(); | 646 pFileAccess->Release(); |
644 } | 647 } |
645 } | 648 } |
646 pos = m_FileAccess2IFXFont.GetStartPosition(); | 649 pos = m_FileAccess2IFXFont.GetStartPosition(); |
647 while (pos) { | 650 while (pos) { |
648 uint32_t dwHash; | 651 uint32_t dwHash; |
649 IFX_Font* pFont; | 652 CFX_GEFont* pFont; |
650 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); | 653 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); |
651 if (NULL != pFont) { | 654 if (NULL != pFont) { |
652 pFont->Release(); | 655 pFont->Release(); |
653 } | 656 } |
654 } | 657 } |
655 pos = m_IFXFont2FileRead.GetStartPosition(); | 658 pos = m_IFXFont2FileRead.GetStartPosition(); |
656 while (pos) { | 659 while (pos) { |
657 IFX_Font* pFont; | 660 CFX_GEFont* pFont; |
658 IFX_FileRead* pFileRead; | 661 IFX_FileRead* pFileRead; |
659 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); | 662 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); |
660 pFileRead->Release(); | 663 pFileRead->Release(); |
661 } | 664 } |
662 delete this; | 665 delete this; |
663 } | 666 } |
664 IFX_Font* CFX_FontMgrImp::GetDefFontByCodePage(uint16_t wCodePage, | 667 CFX_GEFont* CFX_FontMgrImp::GetDefFontByCodePage( |
665 uint32_t dwFontStyles, | 668 uint16_t wCodePage, |
666 const FX_WCHAR* pszFontFamily) { | 669 uint32_t dwFontStyles, |
670 const FX_WCHAR* pszFontFamily) { | |
667 return nullptr; | 671 return nullptr; |
668 } | 672 } |
669 IFX_Font* CFX_FontMgrImp::GetDefFontByCharset(uint8_t nCharset, | 673 CFX_GEFont* CFX_FontMgrImp::GetDefFontByCharset(uint8_t nCharset, |
670 uint32_t dwFontStyles, | 674 uint32_t dwFontStyles, |
671 const FX_WCHAR* pszFontFamily) { | 675 const FX_WCHAR* pszFontFamily) { |
672 return nullptr; | 676 return nullptr; |
673 } | 677 } |
674 IFX_Font* CFX_FontMgrImp::GetDefFontByUnicode(FX_WCHAR wUnicode, | 678 CFX_GEFont* CFX_FontMgrImp::GetDefFontByUnicode(FX_WCHAR wUnicode, |
675 uint32_t dwFontStyles, | 679 uint32_t dwFontStyles, |
676 const FX_WCHAR* pszFontFamily) { | 680 const FX_WCHAR* pszFontFamily) { |
677 return nullptr; | 681 return nullptr; |
678 } | 682 } |
679 IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(uint16_t wLanguage, | 683 CFX_GEFont* CFX_FontMgrImp::GetDefFontByLanguage( |
680 uint32_t dwFontStyles, | 684 uint16_t wLanguage, |
681 const FX_WCHAR* pszFontFamily) { | 685 uint32_t dwFontStyles, |
686 const FX_WCHAR* pszFontFamily) { | |
682 return nullptr; | 687 return nullptr; |
683 } | 688 } |
684 | 689 |
685 IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage, | 690 CFX_GEFont* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage, |
686 uint32_t dwFontStyles, | 691 uint32_t dwFontStyles, |
687 const FX_WCHAR* pszFontFamily) { | 692 const FX_WCHAR* pszFontFamily) { |
688 CFX_ByteString bsHash; | 693 CFX_ByteString bsHash; |
689 bsHash.Format("%d, %d", wCodePage, dwFontStyles); | 694 bsHash.Format("%d, %d", wCodePage, dwFontStyles); |
690 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); | 695 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); |
691 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); | 696 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
692 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; | 697 CFX_ArrayTemplate<CFX_GEFont*>* pFonts = nullptr; |
693 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { | 698 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { |
694 if (!pFonts) | 699 if (!pFonts) |
695 return nullptr; | 700 return nullptr; |
696 | 701 |
697 if (pFonts->GetSize() != 0) | 702 if (pFonts->GetSize() != 0) |
698 return pFonts->GetAt(0)->Retain(); | 703 return pFonts->GetAt(0)->Retain(); |
699 } | 704 } |
700 | 705 |
701 if (!pFonts) | 706 if (!pFonts) |
702 pFonts = new CFX_ArrayTemplate<IFX_Font*>; | 707 pFonts = new CFX_ArrayTemplate<CFX_GEFont*>; |
703 | 708 |
704 m_Hash2Fonts.SetAt(dwHash, pFonts); | 709 m_Hash2Fonts.SetAt(dwHash, pFonts); |
705 CFX_FontDescriptorInfos* sortedFonts = nullptr; | 710 CFX_FontDescriptorInfos* sortedFonts = nullptr; |
706 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { | 711 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { |
707 sortedFonts = new CFX_FontDescriptorInfos; | 712 sortedFonts = new CFX_FontDescriptorInfos; |
708 MatchFonts(*sortedFonts, wCodePage, dwFontStyles, | 713 MatchFonts(*sortedFonts, wCodePage, dwFontStyles, |
709 CFX_WideString(pszFontFamily), 0); | 714 CFX_WideString(pszFontFamily), 0); |
710 m_Hash2CandidateList.SetAt(dwHash, sortedFonts); | 715 m_Hash2CandidateList.SetAt(dwHash, sortedFonts); |
711 } | 716 } |
712 if (sortedFonts->GetSize() == 0) | 717 if (sortedFonts->GetSize() == 0) |
713 return nullptr; | 718 return nullptr; |
714 | 719 |
715 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; | 720 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont; |
716 IFX_Font* pFont = | 721 CFX_GEFont* pFont = |
717 pDesc->m_pFileAccess | 722 pDesc->m_pFileAccess |
718 ? LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr) | 723 ? LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr) |
719 : LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); | 724 : LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); |
720 if (pFont) | 725 if (pFont) |
721 pFont->SetLogicalFontStyle(dwFontStyles); | 726 pFont->SetLogicalFontStyle(dwFontStyles); |
722 | 727 |
723 pFonts->Add(pFont); | 728 pFonts->Add(pFont); |
724 return pFont; | 729 return pFont; |
725 } | 730 } |
726 IFX_Font* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset, | 731 CFX_GEFont* CFX_FontMgrImp::GetFontByCharset(uint8_t nCharset, |
727 uint32_t dwFontStyles, | 732 uint32_t dwFontStyles, |
728 const FX_WCHAR* pszFontFamily) { | 733 const FX_WCHAR* pszFontFamily) { |
729 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, | 734 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, |
730 pszFontFamily); | 735 pszFontFamily); |
731 } | 736 } |
732 IFX_Font* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode, | 737 CFX_GEFont* CFX_FontMgrImp::GetFontByUnicode(FX_WCHAR wUnicode, |
733 uint32_t dwFontStyles, | 738 uint32_t dwFontStyles, |
734 const FX_WCHAR* pszFontFamily) { | 739 const FX_WCHAR* pszFontFamily) { |
735 IFX_Font* pFont = nullptr; | 740 CFX_GEFont* pFont = nullptr; |
736 if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont)) | 741 if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont)) |
737 return nullptr; | 742 return nullptr; |
738 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); | 743 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); |
739 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF; | 744 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF; |
740 uint16_t wBitField = x ? x->wBitField : 0x03E7; | 745 uint16_t wBitField = x ? x->wBitField : 0x03E7; |
741 CFX_ByteString bsHash; | 746 CFX_ByteString bsHash; |
742 if (wCodePage == 0xFFFF) | 747 if (wCodePage == 0xFFFF) |
743 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); | 748 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); |
744 else | 749 else |
745 bsHash.Format("%d, %d", wCodePage, dwFontStyles); | 750 bsHash.Format("%d, %d", wCodePage, dwFontStyles); |
746 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); | 751 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); |
747 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); | 752 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
748 CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr; | 753 CFX_ArrayTemplate<CFX_GEFont*>* pFonts = nullptr; |
749 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { | 754 if (m_Hash2Fonts.Lookup(dwHash, pFonts)) { |
750 if (!pFonts) | 755 if (!pFonts) |
751 return nullptr; | 756 return nullptr; |
752 for (int32_t i = 0; i < pFonts->GetSize(); ++i) { | 757 for (int32_t i = 0; i < pFonts->GetSize(); ++i) { |
753 if (VerifyUnicode(pFonts->GetAt(i), wUnicode)) | 758 if (VerifyUnicode(pFonts->GetAt(i), wUnicode)) |
754 return pFonts->GetAt(i)->Retain(); | 759 return pFonts->GetAt(i)->Retain(); |
755 } | 760 } |
756 } | 761 } |
757 if (!pFonts) | 762 if (!pFonts) |
758 pFonts = new CFX_ArrayTemplate<IFX_Font*>; | 763 pFonts = new CFX_ArrayTemplate<CFX_GEFont*>; |
759 m_Hash2Fonts.SetAt(dwHash, pFonts); | 764 m_Hash2Fonts.SetAt(dwHash, pFonts); |
760 CFX_FontDescriptorInfos* sortedFonts = nullptr; | 765 CFX_FontDescriptorInfos* sortedFonts = nullptr; |
761 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { | 766 if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) { |
762 sortedFonts = new CFX_FontDescriptorInfos; | 767 sortedFonts = new CFX_FontDescriptorInfos; |
763 MatchFonts(*sortedFonts, wCodePage, dwFontStyles, | 768 MatchFonts(*sortedFonts, wCodePage, dwFontStyles, |
764 CFX_WideString(pszFontFamily), wUnicode); | 769 CFX_WideString(pszFontFamily), wUnicode); |
765 m_Hash2CandidateList.SetAt(dwHash, sortedFonts); | 770 m_Hash2CandidateList.SetAt(dwHash, sortedFonts); |
766 } | 771 } |
767 for (int32_t i = 0; i < sortedFonts->GetSize(); ++i) { | 772 for (int32_t i = 0; i < sortedFonts->GetSize(); ++i) { |
768 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont; | 773 CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont; |
(...skipping 27 matching lines...) Expand all Loading... | |
796 FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode); | 801 FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode); |
797 pFileRead->Release(); | 802 pFileRead->Release(); |
798 if (!pFace) | 803 if (!pFace) |
799 return FALSE; | 804 return FALSE; |
800 if (FXFT_Get_Face_External_Stream(pFace)) | 805 if (FXFT_Get_Face_External_Stream(pFace)) |
801 FXFT_Clear_Face_External_Stream(pFace); | 806 FXFT_Clear_Face_External_Stream(pFace); |
802 FXFT_Done_Face(pFace); | 807 FXFT_Done_Face(pFace); |
803 return !retCharmap && retIndex; | 808 return !retCharmap && retIndex; |
804 } | 809 } |
805 | 810 |
806 FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) { | 811 FX_BOOL CFX_FontMgrImp::VerifyUnicode(CFX_GEFont* pFont, FX_WCHAR wcUnicode) { |
807 if (!pFont) | 812 if (!pFont) |
808 return FALSE; | 813 return FALSE; |
809 | 814 |
810 FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace(); | 815 FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace(); |
811 FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace); | 816 FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace); |
812 if (FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE) != 0) | 817 if (FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE) != 0) |
813 return FALSE; | 818 return FALSE; |
814 | 819 |
815 if (FXFT_Get_Char_Index(pFace, wcUnicode) == 0) { | 820 if (FXFT_Get_Char_Index(pFace, wcUnicode) == 0) { |
816 FXFT_Set_Charmap(pFace, charmap); | 821 FXFT_Set_Charmap(pFace, charmap); |
817 return FALSE; | 822 return FALSE; |
818 } | 823 } |
819 return TRUE; | 824 return TRUE; |
820 } | 825 } |
821 | 826 |
822 IFX_Font* CFX_FontMgrImp::GetFontByLanguage(uint16_t wLanguage, | 827 CFX_GEFont* CFX_FontMgrImp::GetFontByLanguage(uint16_t wLanguage, |
823 uint32_t dwFontStyles, | 828 uint32_t dwFontStyles, |
824 const FX_WCHAR* pszFontFamily) { | 829 const FX_WCHAR* pszFontFamily) { |
825 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, | 830 return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles, |
826 pszFontFamily); | 831 pszFontFamily); |
827 } | 832 } |
828 | 833 |
829 IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer, | 834 CFX_GEFont* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer, |
830 int32_t iLength, | 835 int32_t iLength, |
831 int32_t iFaceIndex, | 836 int32_t iFaceIndex, |
832 int32_t* pFaceCount) { | 837 int32_t* pFaceCount) { |
833 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength}; | 838 void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength}; |
834 uint32_t dwHash = | 839 uint32_t dwHash = |
835 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); | 840 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); |
836 IFX_FileAccess* pFontAccess = nullptr; | 841 IFX_FileAccess* pFontAccess = nullptr; |
837 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); | 842 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); |
838 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 843 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
839 : nullptr; | 844 : nullptr; |
840 } | 845 } |
841 | 846 |
842 IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName, | 847 CFX_GEFont* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName, |
843 int32_t iFaceIndex, | 848 int32_t iFaceIndex, |
844 int32_t* pFaceCount) { | 849 int32_t* pFaceCount) { |
845 CFX_ByteString bsHash; | 850 CFX_ByteString bsHash; |
846 bsHash += CFX_WideString(pszFileName).UTF8Encode(); | 851 bsHash += CFX_WideString(pszFileName).UTF8Encode(); |
847 | 852 |
848 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); | 853 uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
849 IFX_FileAccess* pFontAccess = nullptr; | 854 IFX_FileAccess* pFontAccess = nullptr; |
850 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { | 855 if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) { |
851 pFontAccess = FX_CreateDefaultFileAccess(pszFileName); | 856 pFontAccess = FX_CreateDefaultFileAccess(pszFileName); |
852 m_Hash2FileAccess.SetAt(dwHash, pFontAccess); | 857 m_Hash2FileAccess.SetAt(dwHash, pFontAccess); |
853 } | 858 } |
854 | 859 |
855 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 860 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
856 : nullptr; | 861 : nullptr; |
857 } | 862 } |
858 | 863 |
859 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream, | 864 CFX_GEFont* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream, |
860 int32_t iFaceIndex, | 865 int32_t iFaceIndex, |
861 int32_t* pFaceCount, | 866 int32_t* pFaceCount, |
862 FX_BOOL bSaveStream) { | 867 FX_BOOL bSaveStream) { |
863 void* Hash[1] = {(void*)(uintptr_t)pFontStream}; | 868 void* Hash[1] = {(void*)(uintptr_t)pFontStream}; |
864 uint32_t dwHash = | 869 uint32_t dwHash = |
865 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); | 870 FX_HashCode_GetA(CFX_ByteStringC((uint8_t*)Hash, sizeof(Hash)), false); |
866 IFX_FileAccess* pFontAccess = nullptr; | 871 IFX_FileAccess* pFontAccess = nullptr; |
867 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); | 872 m_Hash2FileAccess.Lookup(dwHash, pFontAccess); |
868 | 873 |
869 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) | 874 return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE) |
870 : nullptr; | 875 : nullptr; |
871 } | 876 } |
872 | 877 |
873 IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, | 878 CFX_GEFont* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess, |
874 int32_t iFaceIndex, | 879 int32_t iFaceIndex, |
875 int32_t* pFaceCount, | 880 int32_t* pFaceCount, |
876 FX_BOOL bWantCache) { | 881 FX_BOOL bWantCache) { |
877 uint32_t dwHash = 0; | 882 uint32_t dwHash = 0; |
878 IFX_Font* pFont = nullptr; | 883 CFX_GEFont* pFont = nullptr; |
879 if (bWantCache) { | 884 if (bWantCache) { |
880 CFX_ByteString bsHash; | 885 CFX_ByteString bsHash; |
881 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex); | 886 bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex); |
882 dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); | 887 dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false); |
883 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { | 888 if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) { |
884 if (pFont) { | 889 if (pFont) { |
885 if (pFaceCount) | 890 if (pFaceCount) |
886 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; | 891 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; |
887 return pFont->Retain(); | 892 return pFont->Retain(); |
888 } | 893 } |
889 } | 894 } |
890 } | 895 } |
891 | 896 |
892 CFX_Font* pInternalFont = new CFX_Font; | 897 CFX_Font* pInternalFont = new CFX_Font; |
893 IFX_FileRead* pFontStream = | 898 IFX_FileRead* pFontStream = |
894 pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly); | 899 pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly); |
895 if (!pFontStream) { | 900 if (!pFontStream) { |
896 delete pInternalFont; | 901 delete pInternalFont; |
897 return nullptr; | 902 return nullptr; |
898 } | 903 } |
899 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { | 904 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { |
900 delete pInternalFont; | 905 delete pInternalFont; |
901 pFontStream->Release(); | 906 pFontStream->Release(); |
902 return nullptr; | 907 return nullptr; |
903 } | 908 } |
904 pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE); | 909 pFont = CFX_GEFont::LoadFont(pInternalFont, this, TRUE); |
905 if (!pFont) { | 910 if (!pFont) { |
906 delete pInternalFont; | 911 delete pInternalFont; |
907 pFontStream->Release(); | 912 pFontStream->Release(); |
908 return nullptr; | 913 return nullptr; |
909 } | 914 } |
910 if (bWantCache) | 915 if (bWantCache) |
911 m_FileAccess2IFXFont.SetAt(dwHash, pFont); | 916 m_FileAccess2IFXFont.SetAt(dwHash, pFont); |
912 | 917 |
913 m_IFXFont2FileRead.SetAt(pFont, pFontStream); | 918 m_IFXFont2FileRead.SetAt(pFont, pFontStream); |
914 if (pFaceCount) | 919 if (pFaceCount) |
915 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; | 920 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; |
916 | 921 |
917 return pFont; | 922 return pFont; |
918 } | 923 } |
919 | 924 |
920 IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName, | 925 CFX_GEFont* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName, |
921 int32_t iFaceIndex, | 926 int32_t iFaceIndex, |
922 int32_t* pFaceCount) { | 927 int32_t* pFaceCount) { |
923 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); | 928 CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); |
924 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); | 929 CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); |
925 if (!pFontMapper) | 930 if (!pFontMapper) |
926 return nullptr; | 931 return nullptr; |
927 | 932 |
928 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); | 933 IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo(); |
929 if (!pSystemFontInfo) | 934 if (!pSystemFontInfo) |
930 return nullptr; | 935 return nullptr; |
931 | 936 |
932 IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode()); | 937 IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode()); |
933 if (!pFontStream) | 938 if (!pFontStream) |
934 return nullptr; | 939 return nullptr; |
935 | 940 |
936 if (!LoadFace(pFontStream, 0)) { | 941 if (!LoadFace(pFontStream, 0)) { |
937 pFontStream->Release(); | 942 pFontStream->Release(); |
938 return nullptr; | 943 return nullptr; |
939 } | 944 } |
940 | 945 |
941 CFX_Font* pInternalFont = new CFX_Font(); | 946 CFX_Font* pInternalFont = new CFX_Font(); |
942 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { | 947 if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { |
943 pFontStream->Release(); | 948 pFontStream->Release(); |
944 return nullptr; | 949 return nullptr; |
945 } | 950 } |
946 | 951 |
947 IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE); | 952 CFX_GEFont* pFont = CFX_GEFont::LoadFont(pInternalFont, this, FALSE); |
948 if (!pFont) { | 953 if (!pFont) { |
949 pFontStream->Release(); | 954 pFontStream->Release(); |
950 return nullptr; | 955 return nullptr; |
951 } | 956 } |
952 | 957 |
953 m_IFXFont2FileRead.SetAt(pFont, pFontStream); | 958 m_IFXFont2FileRead.SetAt(pFont, pFontStream); |
954 if (pFaceCount) | 959 if (pFaceCount) |
955 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; | 960 *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces; |
956 | 961 |
957 return pFont; | 962 return pFont; |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1201 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); | 1206 FX_POSITION pos = m_Hash2CandidateList.GetStartPosition(); |
1202 while (pos) { | 1207 while (pos) { |
1203 uint32_t dwHash; | 1208 uint32_t dwHash; |
1204 CFX_FontDescriptorInfos* pDescs; | 1209 CFX_FontDescriptorInfos* pDescs; |
1205 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); | 1210 m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs); |
1206 delete pDescs; | 1211 delete pDescs; |
1207 } | 1212 } |
1208 pos = m_FileAccess2IFXFont.GetStartPosition(); | 1213 pos = m_FileAccess2IFXFont.GetStartPosition(); |
1209 while (pos) { | 1214 while (pos) { |
1210 uint32_t dwHash; | 1215 uint32_t dwHash; |
1211 IFX_Font* pFont; | 1216 CFX_GEFont* pFont; |
1212 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); | 1217 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pFont); |
1213 if (NULL != pFont) { | 1218 if (NULL != pFont) { |
1214 pFont->Release(); | 1219 pFont->Release(); |
1215 } | 1220 } |
1216 } | 1221 } |
1217 pos = m_IFXFont2FileRead.GetStartPosition(); | 1222 pos = m_IFXFont2FileRead.GetStartPosition(); |
1218 while (pos) { | 1223 while (pos) { |
1219 IFX_Font* pFont; | 1224 CFX_GEFont* pFont; |
1220 IFX_FileRead* pFileRead; | 1225 IFX_FileRead* pFileRead; |
1221 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); | 1226 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); |
1222 pFileRead->Release(); | 1227 pFileRead->Release(); |
1223 } | 1228 } |
1224 } | 1229 } |
1225 void CFX_FontMgrImp::RemoveFont(IFX_Font* pEFont) { | 1230 void CFX_FontMgrImp::RemoveFont(CFX_GEFont* pEFont) { |
1226 if (NULL == pEFont) { | 1231 if (NULL == pEFont) { |
1227 return; | 1232 return; |
1228 } | 1233 } |
1229 IFX_FileRead* pFileRead; | 1234 IFX_FileRead* pFileRead; |
1230 if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) { | 1235 if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) { |
1231 pFileRead->Release(); | 1236 pFileRead->Release(); |
1232 m_IFXFont2FileRead.RemoveKey(pEFont); | 1237 m_IFXFont2FileRead.RemoveKey(pEFont); |
1233 } | 1238 } |
1234 FX_POSITION pos; | 1239 FX_POSITION pos; |
1235 pos = m_FileAccess2IFXFont.GetStartPosition(); | 1240 pos = m_FileAccess2IFXFont.GetStartPosition(); |
1236 while (pos) { | 1241 while (pos) { |
1237 uint32_t dwHash; | 1242 uint32_t dwHash; |
1238 IFX_Font* pCFont; | 1243 CFX_GEFont* pCFont; |
1239 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pCFont); | 1244 m_FileAccess2IFXFont.GetNextAssoc(pos, dwHash, pCFont); |
1240 if (pCFont == pEFont) { | 1245 if (pCFont == pEFont) { |
1241 m_FileAccess2IFXFont.RemoveKey(dwHash); | 1246 m_FileAccess2IFXFont.RemoveKey(dwHash); |
1242 break; | 1247 break; |
1243 } | 1248 } |
1244 } | 1249 } |
1245 pos = m_Hash2Fonts.GetStartPosition(); | 1250 pos = m_Hash2Fonts.GetStartPosition(); |
1246 while (pos) { | 1251 while (pos) { |
1247 uint32_t dwHash; | 1252 uint32_t dwHash; |
1248 CFX_ArrayTemplate<IFX_Font*>* pFonts; | 1253 CFX_ArrayTemplate<CFX_GEFont*>* pFonts; |
1249 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); | 1254 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); |
1250 if (NULL != pFonts) { | 1255 if (NULL != pFonts) { |
1251 for (int32_t i = 0; i < pFonts->GetSize(); i++) { | 1256 for (int32_t i = 0; i < pFonts->GetSize(); i++) { |
1252 if (pFonts->GetAt(i) == pEFont) { | 1257 if (pFonts->GetAt(i) == pEFont) { |
1253 pFonts->SetAt(i, NULL); | 1258 pFonts->SetAt(i, NULL); |
1254 } | 1259 } |
1255 } | 1260 } |
1256 } else { | 1261 } else { |
1257 m_Hash2Fonts.RemoveKey(dwHash); | 1262 m_Hash2Fonts.RemoveKey(dwHash); |
1258 } | 1263 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1486 } | 1491 } |
1487 } | 1492 } |
1488 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, | 1493 int32_t CFX_FontMgrImp::IsPartName(const CFX_WideString& Name1, |
1489 const CFX_WideString& Name2) { | 1494 const CFX_WideString& Name2) { |
1490 if (Name1.Find(Name2.c_str()) != -1) { | 1495 if (Name1.Find(Name2.c_str()) != -1) { |
1491 return 1; | 1496 return 1; |
1492 } | 1497 } |
1493 return 0; | 1498 return 0; |
1494 } | 1499 } |
1495 #endif | 1500 #endif |
OLD | NEW |