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

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

Issue 2095653002: Remove NULL in xfa/ (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 6 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
« no previous file with comments | « xfa/fgas/font/fgas_stdfontmgr.h ('k') | xfa/fgas/layout/fgas_rtfbreak.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 PDFium Authors. All rights reserved. 1 // Copyright 2015 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fgas/font/fgas_stdfontmgr.h" 7 #include "xfa/fgas/font/fgas_stdfontmgr.h"
8 8
9 #include "core/fxcrt/include/fx_stream.h" 9 #include "core/fxcrt/include/fx_stream.h"
10 #include "core/fxge/include/fx_ge.h" 10 #include "core/fxge/include/fx_ge.h"
(...skipping 10 matching lines...) Expand all
21 CFGAS_StdFontMgrImp::CFGAS_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator) 21 CFGAS_StdFontMgrImp::CFGAS_StdFontMgrImp(FX_LPEnumAllFonts pEnumerator)
22 : m_pEnumerator(pEnumerator), 22 : m_pEnumerator(pEnumerator),
23 m_FontFaces(), 23 m_FontFaces(),
24 m_CPFonts(8), 24 m_CPFonts(8),
25 m_FamilyFonts(16), 25 m_FamilyFonts(16),
26 m_UnicodeFonts(16), 26 m_UnicodeFonts(16),
27 m_BufferFonts(4), 27 m_BufferFonts(4),
28 m_StreamFonts(4), 28 m_StreamFonts(4),
29 m_DeriveFonts(4) { 29 m_DeriveFonts(4) {
30 if (m_pEnumerator) { 30 if (m_pEnumerator) {
31 m_pEnumerator(m_FontFaces, NULL, 0xFEFF); 31 m_pEnumerator(m_FontFaces, nullptr, 0xFEFF);
32 } 32 }
33 } 33 }
34 34
35 CFGAS_StdFontMgrImp::~CFGAS_StdFontMgrImp() { 35 CFGAS_StdFontMgrImp::~CFGAS_StdFontMgrImp() {
36 m_FontFaces.RemoveAll(); 36 m_FontFaces.RemoveAll();
37 m_CPFonts.RemoveAll(); 37 m_CPFonts.RemoveAll();
38 m_FamilyFonts.RemoveAll(); 38 m_FamilyFonts.RemoveAll();
39 m_UnicodeFonts.RemoveAll(); 39 m_UnicodeFonts.RemoveAll();
40 m_BufferFonts.RemoveAll(); 40 m_BufferFonts.RemoveAll();
41 m_StreamFonts.RemoveAll(); 41 m_StreamFonts.RemoveAll();
42 m_DeriveFonts.RemoveAll(); 42 m_DeriveFonts.RemoveAll();
43 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--) 43 for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--)
44 m_Fonts[i]->Release(); 44 m_Fonts[i]->Release();
45 } 45 }
46 46
47 void CFGAS_StdFontMgrImp::Release() { 47 void CFGAS_StdFontMgrImp::Release() {
48 delete this; 48 delete this;
49 } 49 }
50 50
51 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCodePage( 51 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCodePage(
52 uint16_t wCodePage, 52 uint16_t wCodePage,
53 uint32_t dwFontStyles, 53 uint32_t dwFontStyles,
54 const FX_WCHAR* pszFontFamily) { 54 const FX_WCHAR* pszFontFamily) {
55 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); 55 uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
56 CFGAS_GEFont* pFont = NULL; 56 CFGAS_GEFont* pFont = nullptr;
57 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { 57 if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
58 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; 58 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr;
59 } 59 }
60 FX_FONTDESCRIPTOR const* pFD; 60 FX_FONTDESCRIPTOR const* pFD =
61 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { 61 FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage);
62 if ((pFD = FindFont(NULL, dwFontStyles, TRUE, wCodePage)) == NULL) { 62 if (!pFD)
63 if ((pFD = FindFont(NULL, dwFontStyles, FALSE, wCodePage)) == NULL) 63 pFD = FindFont(nullptr, dwFontStyles, TRUE, wCodePage);
64 return NULL; 64 if (!pFD)
65 } 65 pFD = FindFont(nullptr, dwFontStyles, FALSE, wCodePage);
66 } 66 if (!pFD)
67 ASSERT(pFD); 67 return nullptr;
68
68 pFont = 69 pFont =
69 CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); 70 CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
70 if (pFont) { 71 if (pFont) {
71 m_Fonts.Add(pFont); 72 m_Fonts.Add(pFont);
72 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 73 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
73 dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage); 74 dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage);
74 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 75 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
75 return LoadFont(pFont, dwFontStyles, wCodePage); 76 return LoadFont(pFont, dwFontStyles, wCodePage);
76 } 77 }
77 return NULL; 78 return nullptr;
78 } 79 }
79 80
80 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCharset( 81 CFGAS_GEFont* CFGAS_StdFontMgrImp::GetDefFontByCharset(
81 uint8_t nCharset, 82 uint8_t nCharset,
82 uint32_t dwFontStyles, 83 uint32_t dwFontStyles,
83 const FX_WCHAR* pszFontFamily) { 84 const FX_WCHAR* pszFontFamily) {
84 return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, 85 return GetDefFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
85 pszFontFamily); 86 pszFontFamily);
86 } 87 }
87 88
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 const FX_WCHAR* pszFontFamily) { 131 const FX_WCHAR* pszFontFamily) {
131 return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), 132 return GetDefFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage),
132 dwFontStyles, pszFontFamily); 133 dwFontStyles, pszFontFamily);
133 } 134 }
134 135
135 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily, 136 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(const FX_WCHAR* pszFontFamily,
136 uint32_t dwFontStyles, 137 uint32_t dwFontStyles,
137 uint16_t wCodePage) { 138 uint16_t wCodePage) {
138 uint32_t dwHash = 139 uint32_t dwHash =
139 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage); 140 FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage);
140 CFGAS_GEFont* pFont = NULL; 141 CFGAS_GEFont* pFont = nullptr;
141 if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) { 142 if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont)) {
142 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : NULL; 143 return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr;
143 } 144 }
144 FX_FONTDESCRIPTOR const* pFD = NULL; 145 FX_FONTDESCRIPTOR const* pFD =
145 if ((pFD = FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage)) == NULL) { 146 FindFont(pszFontFamily, dwFontStyles, TRUE, wCodePage);
146 if ((pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage)) == 147 if (!pFD)
147 NULL) { 148 pFD = FindFont(pszFontFamily, dwFontStyles, FALSE, wCodePage);
148 return NULL; 149 if (!pFD)
149 } 150 return nullptr;
150 } 151
151 ASSERT(pFD);
152 if (wCodePage == 0xFFFF) { 152 if (wCodePage == 0xFFFF) {
153 wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet); 153 wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
154 } 154 }
155 pFont = 155 pFont =
156 CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this); 156 CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
157 if (pFont) { 157 if (pFont) {
158 m_Fonts.Add(pFont); 158 m_Fonts.Add(pFont);
159 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 159 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
160 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles); 160 dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
161 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 161 m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
162 return LoadFont(pFont, dwFontStyles, wCodePage); 162 return LoadFont(pFont, dwFontStyles, wCodePage);
163 } 163 }
164 return NULL; 164 return nullptr;
165 } 165 }
166 166
167 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(const uint8_t* pBuffer, 167 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(const uint8_t* pBuffer,
168 int32_t iLength) { 168 int32_t iLength) {
169 ASSERT(pBuffer && iLength > 0); 169 ASSERT(pBuffer && iLength > 0);
170 CFGAS_GEFont* pFont = NULL; 170 CFGAS_GEFont* pFont = nullptr;
171 if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) { 171 if (m_BufferFonts.Lookup((void*)pBuffer, (void*&)pFont)) {
172 if (pFont) { 172 if (pFont) {
173 return pFont->Retain(); 173 return pFont->Retain();
174 } 174 }
175 } 175 }
176 pFont = CFGAS_GEFont::LoadFont(pBuffer, iLength, this); 176 pFont = CFGAS_GEFont::LoadFont(pBuffer, iLength, this);
177 if (pFont) { 177 if (pFont) {
178 m_Fonts.Add(pFont); 178 m_Fonts.Add(pFont);
179 m_BufferFonts.SetAt((void*)pBuffer, pFont); 179 m_BufferFonts.SetAt((void*)pBuffer, pFont);
180 return pFont->Retain(); 180 return pFont->Retain();
181 } 181 }
182 return NULL; 182 return nullptr;
183 } 183 }
184 184
185 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream, 185 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(IFX_Stream* pFontStream,
186 const FX_WCHAR* pszFontAlias, 186 const FX_WCHAR* pszFontAlias,
187 uint32_t dwFontStyles, 187 uint32_t dwFontStyles,
188 uint16_t wCodePage, 188 uint16_t wCodePage,
189 FX_BOOL bSaveStream) { 189 FX_BOOL bSaveStream) {
190 ASSERT(pFontStream && pFontStream->GetLength() > 0); 190 ASSERT(pFontStream && pFontStream->GetLength() > 0);
191 CFGAS_GEFont* pFont = NULL; 191 CFGAS_GEFont* pFont = nullptr;
192 if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) { 192 if (m_StreamFonts.Lookup((void*)pFontStream, (void*&)pFont)) {
193 if (pFont) { 193 if (pFont) {
194 if (pszFontAlias) { 194 if (pszFontAlias) {
195 uint32_t dwHash = 195 uint32_t dwHash =
196 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); 196 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
197 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 197 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
198 } 198 }
199 return LoadFont(pFont, dwFontStyles, wCodePage); 199 return LoadFont(pFont, dwFontStyles, wCodePage);
200 } 200 }
201 } 201 }
202 pFont = CFGAS_GEFont::LoadFont(pFontStream, this, bSaveStream); 202 pFont = CFGAS_GEFont::LoadFont(pFontStream, this, bSaveStream);
203 if (pFont) { 203 if (pFont) {
204 m_Fonts.Add(pFont); 204 m_Fonts.Add(pFont);
205 m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont); 205 m_StreamFonts.SetAt((void*)pFontStream, (void*)pFont);
206 if (pszFontAlias) { 206 if (pszFontAlias) {
207 uint32_t dwHash = 207 uint32_t dwHash =
208 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage); 208 FGAS_GetFontFamilyHash(pszFontAlias, dwFontStyles, wCodePage);
209 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 209 m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
210 } 210 }
211 return LoadFont(pFont, dwFontStyles, wCodePage); 211 return LoadFont(pFont, dwFontStyles, wCodePage);
212 } 212 }
213 return NULL; 213 return nullptr;
214 } 214 }
215 215
216 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(CFGAS_GEFont* pSrcFont, 216 CFGAS_GEFont* CFGAS_StdFontMgrImp::LoadFont(CFGAS_GEFont* pSrcFont,
217 uint32_t dwFontStyles, 217 uint32_t dwFontStyles,
218 uint16_t wCodePage) { 218 uint16_t wCodePage) {
219 ASSERT(pSrcFont); 219 ASSERT(pSrcFont);
220 if (pSrcFont->GetFontStyles() == dwFontStyles) { 220 if (pSrcFont->GetFontStyles() == dwFontStyles) {
221 return pSrcFont->Retain(); 221 return pSrcFont->Retain();
222 } 222 }
223 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles, 223 void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles,
224 (void*)(uintptr_t)wCodePage}; 224 (void*)(uintptr_t)wCodePage};
225 uint32_t dwHash = FX_HashCode_GetA( 225 uint32_t dwHash = FX_HashCode_GetA(
226 CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false); 226 CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false);
227 CFGAS_GEFont* pFont = NULL; 227 CFGAS_GEFont* pFont = nullptr;
228 if (m_DeriveFonts.GetCount() > 0) { 228 if (m_DeriveFonts.GetCount() > 0) {
229 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont); 229 m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont);
230 if (pFont) { 230 if (pFont) {
231 return pFont->Retain(); 231 return pFont->Retain();
232 } 232 }
233 } 233 }
234 pFont = pSrcFont->Derive(dwFontStyles, wCodePage); 234 pFont = pSrcFont->Derive(dwFontStyles, wCodePage);
235 if (pFont) { 235 if (pFont) {
236 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont); 236 m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
237 int32_t index = m_Fonts.Find(pFont); 237 int32_t index = m_Fonts.Find(pFont);
238 if (index < 0) { 238 if (index < 0) {
239 m_Fonts.Add(pFont); 239 m_Fonts.Add(pFont);
240 pFont->Retain(); 240 pFont->Retain();
241 } 241 }
242 return pFont; 242 return pFont;
243 } 243 }
244 return NULL; 244 return nullptr;
245 } 245 }
246 246
247 void CFGAS_StdFontMgrImp::ClearFontCache() { 247 void CFGAS_StdFontMgrImp::ClearFontCache() {
248 for (int32_t i = 0; i < m_Fonts.GetSize(); i++) 248 for (int32_t i = 0; i < m_Fonts.GetSize(); i++)
249 m_Fonts[i]->Reset(); 249 m_Fonts[i]->Reset();
250 } 250 }
251 251
252 void CFGAS_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap, 252 void CFGAS_StdFontMgrImp::RemoveFont(CFX_MapPtrToPtr& fontMap,
253 CFGAS_GEFont* pFont) { 253 CFGAS_GEFont* pFont) {
254 FX_POSITION pos = fontMap.GetStartPosition(); 254 FX_POSITION pos = fontMap.GetStartPosition();
255 void* pKey; 255 void* pKey;
256 void* pFind; 256 void* pFind;
257 while (pos) { 257 while (pos) {
258 pFind = NULL; 258 pFind = nullptr;
259 fontMap.GetNextAssoc(pos, pKey, pFind); 259 fontMap.GetNextAssoc(pos, pKey, pFind);
260 if (pFind != (void*)pFont) { 260 if (pFind != (void*)pFont) {
261 continue; 261 continue;
262 } 262 }
263 fontMap.RemoveKey(pKey); 263 fontMap.RemoveKey(pKey);
264 break; 264 break;
265 } 265 }
266 } 266 }
267 267
268 void CFGAS_StdFontMgrImp::RemoveFont(CFGAS_GEFont* pFont) { 268 void CFGAS_StdFontMgrImp::RemoveFont(CFGAS_GEFont* pFont) {
(...skipping 24 matching lines...) Expand all
293 params.pwsFamily = pszFontFamily; 293 params.pwsFamily = pszFontFamily;
294 params.dwFontStyles = dwFontStyles; 294 params.dwFontStyles = dwFontStyles;
295 params.dwMatchFlags = dwMatchFlags; 295 params.dwMatchFlags = dwMatchFlags;
296 FX_FONTDESCRIPTOR const* pDesc = FX_DefFontMatcher(&params, m_FontFaces); 296 FX_FONTDESCRIPTOR const* pDesc = FX_DefFontMatcher(&params, m_FontFaces);
297 if (pDesc) { 297 if (pDesc) {
298 return pDesc; 298 return pDesc;
299 } 299 }
300 if (pszFontFamily && m_pEnumerator) { 300 if (pszFontFamily && m_pEnumerator) {
301 CFX_FontDescriptors namedFonts; 301 CFX_FontDescriptors namedFonts;
302 m_pEnumerator(namedFonts, pszFontFamily, wUnicode); 302 m_pEnumerator(namedFonts, pszFontFamily, wUnicode);
303 params.pwsFamily = NULL; 303 params.pwsFamily = nullptr;
304 pDesc = FX_DefFontMatcher(&params, namedFonts); 304 pDesc = FX_DefFontMatcher(&params, namedFonts);
305 if (pDesc == NULL) { 305 if (!pDesc) {
306 return NULL; 306 return nullptr;
307 } 307 }
308 for (int32_t i = m_FontFaces.GetSize() - 1; i >= 0; i--) { 308 for (int32_t i = m_FontFaces.GetSize() - 1; i >= 0; i--) {
309 FX_FONTDESCRIPTOR const* pMatch = m_FontFaces.GetPtrAt(i); 309 FX_FONTDESCRIPTOR const* pMatch = m_FontFaces.GetPtrAt(i);
310 if (*pMatch == *pDesc) { 310 if (*pMatch == *pDesc) {
311 return pMatch; 311 return pMatch;
312 } 312 }
313 } 313 }
314 int index = m_FontFaces.Add(*pDesc); 314 int index = m_FontFaces.Add(*pDesc);
315 return m_FontFaces.GetPtrAt(index); 315 return m_FontFaces.GetPtrAt(index);
316 } 316 }
317 return NULL; 317 return nullptr;
318 } 318 }
319 319
320 FX_FONTDESCRIPTOR const* FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams, 320 FX_FONTDESCRIPTOR const* FX_DefFontMatcher(FX_LPFONTMATCHPARAMS pParams,
321 const CFX_FontDescriptors& fonts) { 321 const CFX_FontDescriptors& fonts) {
322 FX_FONTDESCRIPTOR const* pBestFont = NULL; 322 FX_FONTDESCRIPTOR const* pBestFont = nullptr;
323 int32_t iBestSimilar = 0; 323 int32_t iBestSimilar = 0;
324 FX_BOOL bMatchStyle = 324 FX_BOOL bMatchStyle =
325 (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0; 325 (pParams->dwMatchFlags & FX_FONTMATCHPARA_MacthStyle) > 0;
326 int32_t iCount = fonts.GetSize(); 326 int32_t iCount = fonts.GetSize();
327 for (int32_t i = 0; i < iCount; ++i) { 327 for (int32_t i = 0; i < iCount; ++i) {
328 FX_FONTDESCRIPTOR const* pFont = fonts.GetPtrAt(i); 328 FX_FONTDESCRIPTOR const* pFont = fonts.GetPtrAt(i);
329 if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) == 329 if ((pFont->dwFontStyles & FX_FONTSTYLE_BoldItalic) ==
330 FX_FONTSTYLE_BoldItalic) { 330 FX_FONTSTYLE_BoldItalic) {
331 continue; 331 continue;
332 } 332 }
(...skipping 30 matching lines...) Expand all
363 if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) { 363 if (FXSYS_wcsicmp(pParams->pwsFamily, pFont->wsFontFace) == 0) {
364 return pFont; 364 return pFont;
365 } 365 }
366 } 366 }
367 int32_t iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles); 367 int32_t iSimilarValue = FX_GetSimilarValue(pFont, pParams->dwFontStyles);
368 if (iBestSimilar < iSimilarValue) { 368 if (iBestSimilar < iSimilarValue) {
369 iBestSimilar = iSimilarValue; 369 iBestSimilar = iSimilarValue;
370 pBestFont = pFont; 370 pBestFont = pFont;
371 } 371 }
372 } 372 }
373 return iBestSimilar < 1 ? NULL : pBestFont; 373 return iBestSimilar < 1 ? nullptr : pBestFont;
374 } 374 }
375 375
376 int32_t FX_GetSimilarValue(FX_FONTDESCRIPTOR const* pFont, 376 int32_t FX_GetSimilarValue(FX_FONTDESCRIPTOR const* pFont,
377 uint32_t dwFontStyles) { 377 uint32_t dwFontStyles) {
378 int32_t iValue = 0; 378 int32_t iValue = 0;
379 if ((dwFontStyles & FX_FONTSTYLE_Symbolic) == 379 if ((dwFontStyles & FX_FONTSTYLE_Symbolic) ==
380 (pFont->dwFontStyles & FX_FONTSTYLE_Symbolic)) { 380 (pFont->dwFontStyles & FX_FONTSTYLE_Symbolic)) {
381 iValue += 64; 381 iValue += 64;
382 } 382 }
383 if ((dwFontStyles & FX_FONTSTYLE_FixedPitch) == 383 if ((dwFontStyles & FX_FONTSTYLE_FixedPitch) ==
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 FXSYS_memcpy(&pFont->FontSignature, &lpntme->ntmFontSig, 437 FXSYS_memcpy(&pFont->FontSignature, &lpntme->ntmFontSig,
438 sizeof(lpntme->ntmFontSig)); 438 sizeof(lpntme->ntmFontSig));
439 ((CFX_FontDescriptors*)lParam)->Add(*pFont); 439 ((CFX_FontDescriptors*)lParam)->Add(*pFont);
440 FX_Free(pFont); 440 FX_Free(pFont);
441 return 1; 441 return 1;
442 } 442 }
443 443
444 static void FX_EnumGdiFonts(CFX_FontDescriptors& fonts, 444 static void FX_EnumGdiFonts(CFX_FontDescriptors& fonts,
445 const FX_WCHAR* pwsFaceName, 445 const FX_WCHAR* pwsFaceName,
446 FX_WCHAR wUnicode) { 446 FX_WCHAR wUnicode) {
447 HDC hDC = ::GetDC(NULL); 447 HDC hDC = ::GetDC(nullptr);
448 LOGFONTW lfFind; 448 LOGFONTW lfFind;
449 FXSYS_memset(&lfFind, 0, sizeof(lfFind)); 449 FXSYS_memset(&lfFind, 0, sizeof(lfFind));
450 lfFind.lfCharSet = DEFAULT_CHARSET; 450 lfFind.lfCharSet = DEFAULT_CHARSET;
451 if (pwsFaceName) { 451 if (pwsFaceName) {
452 FXSYS_wcsncpy(lfFind.lfFaceName, pwsFaceName, 31); 452 FXSYS_wcsncpy(lfFind.lfFaceName, pwsFaceName, 31);
453 lfFind.lfFaceName[31] = 0; 453 lfFind.lfFaceName[31] = 0;
454 } 454 }
455 EnumFontFamiliesExW(hDC, (LPLOGFONTW)&lfFind, 455 EnumFontFamiliesExW(hDC, (LPLOGFONTW)&lfFind,
456 (FONTENUMPROCW)FX_GdiFontEnumProc, (LPARAM)&fonts, 0); 456 (FONTENUMPROCW)FX_GdiFontEnumProc, (LPARAM)&fonts, 0);
457 ::ReleaseDC(NULL, hDC); 457 ::ReleaseDC(nullptr, hDC);
458 } 458 }
459 459
460 FX_LPEnumAllFonts FX_GetDefFontEnumerator() { 460 FX_LPEnumAllFonts FX_GetDefFontEnumerator() {
461 return FX_EnumGdiFonts; 461 return FX_EnumGdiFonts;
462 } 462 }
463 463
464 #else 464 #else
465 const FX_CHAR* g_FontFolders[] = { 465 const FX_CHAR* g_FontFolders[] = {
466 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ 466 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
467 "/usr/share/fonts", "/usr/share/X11/fonts/Type1", 467 "/usr/share/fonts", "/usr/share/X11/fonts/Type1",
(...skipping 13 matching lines...) Expand all
481 CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() { 481 CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() {
482 for (size_t i = 0; i < FX_ArraySize(g_FontFolders); ++i) 482 for (size_t i = 0; i < FX_ArraySize(g_FontFolders); ++i)
483 m_FolderPaths.Add(g_FontFolders[i]); 483 m_FolderPaths.Add(g_FontFolders[i]);
484 } 484 }
485 485
486 CFX_FontSourceEnum_File::~CFX_FontSourceEnum_File() {} 486 CFX_FontSourceEnum_File::~CFX_FontSourceEnum_File() {}
487 487
488 CFX_ByteString CFX_FontSourceEnum_File::GetNextFile() { 488 CFX_ByteString CFX_FontSourceEnum_File::GetNextFile() {
489 Restart: 489 Restart:
490 void* pCurHandle = 490 void* pCurHandle =
491 m_FolderQueue.GetSize() == 0 491 m_FolderQueue.GetSize() != 0
492 ? NULL 492 ? m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle
493 : m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->pFileHandle; 493 : nullptr;
494 if (NULL == pCurHandle) { 494 if (!pCurHandle) {
495 if (m_FolderPaths.GetSize() < 1) { 495 if (m_FolderPaths.GetSize() < 1) {
496 return ""; 496 return "";
497 } 497 }
498 pCurHandle = 498 pCurHandle =
499 FX_OpenFolder(m_FolderPaths[m_FolderPaths.GetSize() - 1].c_str()); 499 FX_OpenFolder(m_FolderPaths[m_FolderPaths.GetSize() - 1].c_str());
500 FX_HandleParentPath hpp; 500 FX_HandleParentPath hpp;
501 hpp.pFileHandle = pCurHandle; 501 hpp.pFileHandle = pCurHandle;
502 hpp.bsParentPath = m_FolderPaths[m_FolderPaths.GetSize() - 1]; 502 hpp.bsParentPath = m_FolderPaths[m_FolderPaths.GetSize() - 1];
503 m_FolderQueue.Add(hpp); 503 m_FolderQueue.Add(hpp);
504 } 504 }
(...skipping 19 matching lines...) Expand all
524 } 524 }
525 if (bsName == "." || bsName == "..") { 525 if (bsName == "." || bsName == "..") {
526 continue; 526 continue;
527 } 527 }
528 if (bFolder) { 528 if (bFolder) {
529 FX_HandleParentPath hpp; 529 FX_HandleParentPath hpp;
530 hpp.bsParentPath = 530 hpp.bsParentPath =
531 m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath + 531 m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
532 bsFolderSpearator + bsName; 532 bsFolderSpearator + bsName;
533 hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath.c_str()); 533 hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath.c_str());
534 if (hpp.pFileHandle == NULL) { 534 if (!hpp.pFileHandle) {
535 continue; 535 continue;
536 } 536 }
537 m_FolderQueue.Add(hpp); 537 m_FolderQueue.Add(hpp);
538 pCurHandle = hpp.pFileHandle; 538 pCurHandle = hpp.pFileHandle;
539 continue; 539 continue;
540 } 540 }
541 bsName = 541 bsName =
542 m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath + 542 m_FolderQueue.GetDataPtr(m_FolderQueue.GetSize() - 1)->bsParentPath +
543 bsFolderSpearator + bsName; 543 bsFolderSpearator + bsName;
544 break; 544 break;
545 } 545 }
546 return bsName; 546 return bsName;
547 } 547 }
548 548
549 FX_POSITION CFX_FontSourceEnum_File::GetStartPosition() { 549 FX_POSITION CFX_FontSourceEnum_File::GetStartPosition() {
550 m_wsNext = GetNextFile().UTF8Decode(); 550 m_wsNext = GetNextFile().UTF8Decode();
551 if (0 == m_wsNext.GetLength()) { 551 if (m_wsNext.GetLength() == 0) {
552 return (FX_POSITION)0; 552 return (FX_POSITION)0;
553 } 553 }
554 return (FX_POSITION)-1; 554 return (FX_POSITION)-1;
555 } 555 }
556 556
557 IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos) { 557 IFX_FileAccess* CFX_FontSourceEnum_File::GetNext(FX_POSITION& pos) {
558 IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext.AsStringC()); 558 IFX_FileAccess* pAccess = FX_CreateDefaultFileAccess(m_wsNext.AsStringC());
559 m_wsNext = GetNextFile().UTF8Decode(); 559 m_wsNext = GetNextFile().UTF8Decode();
560 pos = 0 != m_wsNext.GetLength() ? pAccess : NULL; 560 pos = m_wsNext.GetLength() != 0 ? pAccess : nullptr;
561 return pAccess; 561 return pAccess;
562 } 562 }
563 563
564 IFGAS_FontMgr* IFGAS_FontMgr::Create(CFX_FontSourceEnum_File* pFontEnum) { 564 IFGAS_FontMgr* IFGAS_FontMgr::Create(CFX_FontSourceEnum_File* pFontEnum) {
565 if (!pFontEnum) 565 if (!pFontEnum)
566 return nullptr; 566 return nullptr;
567 567
568 std::unique_ptr<CFGAS_FontMgrImp> pFontMgr(new CFGAS_FontMgrImp(pFontEnum)); 568 std::unique_ptr<CFGAS_FontMgrImp> pFontMgr(new CFGAS_FontMgrImp(pFontEnum));
569 if (!pFontMgr->EnumFonts()) 569 if (!pFontMgr->EnumFonts())
570 return nullptr; 570 return nullptr;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 const FX_WCHAR* pszFontFamily) { 735 const FX_WCHAR* pszFontFamily) {
736 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles, 736 return GetFontByCodePage(FX_GetCodePageFromCharset(nCharset), dwFontStyles,
737 pszFontFamily); 737 pszFontFamily);
738 } 738 }
739 739
740 CFGAS_GEFont* CFGAS_FontMgrImp::GetFontByUnicode( 740 CFGAS_GEFont* CFGAS_FontMgrImp::GetFontByUnicode(
741 FX_WCHAR wUnicode, 741 FX_WCHAR wUnicode,
742 uint32_t dwFontStyles, 742 uint32_t dwFontStyles,
743 const FX_WCHAR* pszFontFamily) { 743 const FX_WCHAR* pszFontFamily) {
744 CFGAS_GEFont* pFont = nullptr; 744 CFGAS_GEFont* pFont = nullptr;
745 if (m_FailedUnicodes2NULL.Lookup(wUnicode, pFont)) 745 if (m_FailedUnicodes2Nullptr.Lookup(wUnicode, pFont))
746 return nullptr; 746 return nullptr;
747 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode); 747 const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode);
748 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF; 748 uint16_t wCodePage = x ? x->wCodePage : 0xFFFF;
749 uint16_t wBitField = x ? x->wBitField : 0x03E7; 749 uint16_t wBitField = x ? x->wBitField : 0x03E7;
750 CFX_ByteString bsHash; 750 CFX_ByteString bsHash;
751 if (wCodePage == 0xFFFF) 751 if (wCodePage == 0xFFFF)
752 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles); 752 bsHash.Format("%d, %d, %d", wCodePage, wBitField, dwFontStyles);
753 else 753 else
754 bsHash.Format("%d, %d", wCodePage, dwFontStyles); 754 bsHash.Format("%d, %d", wCodePage, dwFontStyles);
755 bsHash += CFX_WideString(pszFontFamily).UTF8Encode(); 755 bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
(...skipping 22 matching lines...) Expand all
778 if (!VerifyUnicode(pDesc, wUnicode)) 778 if (!VerifyUnicode(pDesc, wUnicode))
779 continue; 779 continue;
780 pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr); 780 pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
781 if (!pFont) 781 if (!pFont)
782 continue; 782 continue;
783 pFont->SetLogicalFontStyle(dwFontStyles); 783 pFont->SetLogicalFontStyle(dwFontStyles);
784 pFonts->Add(pFont); 784 pFonts->Add(pFont);
785 return pFont; 785 return pFont;
786 } 786 }
787 if (!pszFontFamily) 787 if (!pszFontFamily)
788 m_FailedUnicodes2NULL.SetAt(wUnicode, nullptr); 788 m_FailedUnicodes2Nullptr.SetAt(wUnicode, nullptr);
789 return nullptr; 789 return nullptr;
790 } 790 }
791 791
792 FX_BOOL CFGAS_FontMgrImp::VerifyUnicode(CFX_FontDescriptor* pDesc, 792 FX_BOOL CFGAS_FontMgrImp::VerifyUnicode(CFX_FontDescriptor* pDesc,
793 FX_WCHAR wcUnicode) { 793 FX_WCHAR wcUnicode) {
794 IFX_FileRead* pFileRead = CreateFontStream(pDesc->m_wsFaceName.UTF8Encode()); 794 IFX_FileRead* pFileRead = CreateFontStream(pDesc->m_wsFaceName.UTF8Encode());
795 if (!pFileRead) 795 if (!pFileRead)
796 return FALSE; 796 return FALSE;
797 FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex); 797 FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex);
798 FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE); 798 FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE);
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 pos = m_IFXFont2FileRead.GetStartPosition(); 1124 pos = m_IFXFont2FileRead.GetStartPosition();
1125 while (pos) { 1125 while (pos) {
1126 CFGAS_GEFont* pFont; 1126 CFGAS_GEFont* pFont;
1127 IFX_FileRead* pFileRead; 1127 IFX_FileRead* pFileRead;
1128 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); 1128 m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead);
1129 pFileRead->Release(); 1129 pFileRead->Release();
1130 } 1130 }
1131 } 1131 }
1132 1132
1133 void CFGAS_FontMgrImp::RemoveFont(CFGAS_GEFont* pEFont) { 1133 void CFGAS_FontMgrImp::RemoveFont(CFGAS_GEFont* pEFont) {
1134 if (NULL == pEFont) { 1134 if (!pEFont) {
1135 return; 1135 return;
1136 } 1136 }
1137 IFX_FileRead* pFileRead; 1137 IFX_FileRead* pFileRead;
1138 if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) { 1138 if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) {
1139 pFileRead->Release(); 1139 pFileRead->Release();
1140 m_IFXFont2FileRead.RemoveKey(pEFont); 1140 m_IFXFont2FileRead.RemoveKey(pEFont);
1141 } 1141 }
1142 FX_POSITION pos; 1142 FX_POSITION pos;
1143 pos = m_Hash2Fonts.GetStartPosition(); 1143 pos = m_Hash2Fonts.GetStartPosition();
1144 while (pos) { 1144 while (pos) {
1145 uint32_t dwHash; 1145 uint32_t dwHash;
1146 CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts; 1146 CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts;
1147 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts); 1147 m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
1148 if (NULL != pFonts) { 1148 if (pFonts) {
1149 for (int32_t i = 0; i < pFonts->GetSize(); i++) { 1149 for (int32_t i = 0; i < pFonts->GetSize(); i++) {
1150 if (pFonts->GetAt(i) == pEFont) { 1150 if (pFonts->GetAt(i) == pEFont) {
1151 pFonts->SetAt(i, NULL); 1151 pFonts->SetAt(i, nullptr);
1152 } 1152 }
1153 } 1153 }
1154 } else { 1154 } else {
1155 m_Hash2Fonts.RemoveKey(dwHash); 1155 m_Hash2Fonts.RemoveKey(dwHash);
1156 } 1156 }
1157 } 1157 }
1158 } 1158 }
1159 1159
1160 void CFGAS_FontMgrImp::RegisterFace(FXFT_Face pFace, 1160 void CFGAS_FontMgrImp::RegisterFace(FXFT_Face pFace,
1161 CFX_FontDescriptors& Fonts, 1161 CFX_FontDescriptors& Fonts,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1232 return flag; 1232 return flag;
1233 } 1233 }
1234 1234
1235 #define GetUInt8(p) ((uint8_t)((p)[0])) 1235 #define GetUInt8(p) ((uint8_t)((p)[0]))
1236 #define GetUInt16(p) ((uint16_t)((p)[0] << 8 | (p)[1])) 1236 #define GetUInt16(p) ((uint16_t)((p)[0] << 8 | (p)[1]))
1237 #define GetUInt32(p) \ 1237 #define GetUInt32(p) \
1238 ((uint32_t)((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])) 1238 ((uint32_t)((p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3]))
1239 1239
1240 void CFGAS_FontMgrImp::GetNames(const uint8_t* name_table, 1240 void CFGAS_FontMgrImp::GetNames(const uint8_t* name_table,
1241 CFX_WideStringArray& Names) { 1241 CFX_WideStringArray& Names) {
1242 if (NULL == name_table) { 1242 if (!name_table) {
1243 return; 1243 return;
1244 } 1244 }
1245 uint8_t* lpTable = (uint8_t*)name_table; 1245 uint8_t* lpTable = (uint8_t*)name_table;
1246 CFX_WideString wsFamily; 1246 CFX_WideString wsFamily;
1247 uint8_t* sp = lpTable + 2; 1247 uint8_t* sp = lpTable + 2;
1248 uint8_t* lpNameRecord = lpTable + 6; 1248 uint8_t* lpNameRecord = lpTable + 6;
1249 uint16_t nNameCount = GetUInt16(sp); 1249 uint16_t nNameCount = GetUInt16(sp);
1250 uint8_t* lpStr = lpTable + GetUInt16(sp + 2); 1250 uint8_t* lpStr = lpTable + GetUInt16(sp + 2);
1251 for (uint16_t j = 0; j < nNameCount; j++) { 1251 for (uint16_t j = 0; j < nNameCount; j++) {
1252 uint16_t nNameID = GetUInt16(lpNameRecord + j * 12 + 6); 1252 uint16_t nNameID = GetUInt16(lpNameRecord + j * 12 + 6);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 charsets.push_back(FX_CHARSET_Default); 1362 charsets.push_back(FX_CHARSET_Default);
1363 } 1363 }
1364 return charsets; 1364 return charsets;
1365 } 1365 }
1366 1366
1367 #undef CODEPAGERANGE_IMPLEMENT 1367 #undef CODEPAGERANGE_IMPLEMENT
1368 void CFGAS_FontMgrImp::GetUSBCSB(FXFT_Face pFace, 1368 void CFGAS_FontMgrImp::GetUSBCSB(FXFT_Face pFace,
1369 uint32_t* USB, 1369 uint32_t* USB,
1370 uint32_t* CSB) { 1370 uint32_t* CSB) {
1371 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); 1371 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2);
1372 if (NULL != pOS2) { 1372 if (pOS2) {
1373 USB[0] = pOS2->ulUnicodeRange1; 1373 USB[0] = pOS2->ulUnicodeRange1;
1374 USB[1] = pOS2->ulUnicodeRange2; 1374 USB[1] = pOS2->ulUnicodeRange2;
1375 USB[2] = pOS2->ulUnicodeRange3; 1375 USB[2] = pOS2->ulUnicodeRange3;
1376 USB[3] = pOS2->ulUnicodeRange4; 1376 USB[3] = pOS2->ulUnicodeRange4;
1377 CSB[0] = pOS2->ulCodePageRange1; 1377 CSB[0] = pOS2->ulCodePageRange1;
1378 CSB[1] = pOS2->ulCodePageRange2; 1378 CSB[1] = pOS2->ulCodePageRange2;
1379 } else { 1379 } else {
1380 USB[0] = 0; 1380 USB[0] = 0;
1381 USB[1] = 0; 1381 USB[1] = 0;
1382 USB[2] = 0; 1382 USB[2] = 0;
1383 USB[3] = 0; 1383 USB[3] = 0;
1384 CSB[0] = 0; 1384 CSB[0] = 0;
1385 CSB[1] = 0; 1385 CSB[1] = 0;
1386 } 1386 }
1387 } 1387 }
1388 1388
1389 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1, 1389 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1,
1390 const CFX_WideString& Name2) { 1390 const CFX_WideString& Name2) {
1391 if (Name1.Find(Name2.c_str()) != -1) { 1391 if (Name1.Find(Name2.c_str()) != -1) {
1392 return 1; 1392 return 1;
1393 } 1393 }
1394 return 0; 1394 return 0;
1395 } 1395 }
1396 1396
1397 #endif 1397 #endif
OLDNEW
« no previous file with comments | « xfa/fgas/font/fgas_stdfontmgr.h ('k') | xfa/fgas/layout/fgas_rtfbreak.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698