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

Side by Side Diff: core/src/fxge/ge/fx_ge_fontmap.cpp

Issue 1297723002: CFX_MapByteStringToPtr considered harmful. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Separate reload & delete. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "../../../include/fxge/fx_ge.h" 9 #include "../../../include/fxge/fx_ge.h"
10 #include "../../../include/fxge/fx_freetype.h" 10 #include "../../../include/fxge/fx_freetype.h"
11 #include "text_int.h" 11 #include "text_int.h"
12
12 #define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1]) 13 #define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1])
13 #define GET_TT_LONG(w) \ 14 #define GET_TT_LONG(w) \
14 (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) 15 (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])
16
17 namespace {
18
19 CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name,
20 int weight,
21 FX_BOOL bItalic) {
22 CFX_ByteString key(face_name);
23 key += ',';
24 key += CFX_ByteString::FormatInteger(weight);
25 key += bItalic ? 'I' : 'N';
26 return key;
27 }
28
29 CFX_ByteString KeyNameFromSize(int ttc_size, FX_DWORD checksum) {
30 CFX_ByteString key;
31 key.Format("%d:%d", ttc_size, checksum);
32 return key;
33 }
34
35 } // namespace
36
15 CFX_SubstFont::CFX_SubstFont() { 37 CFX_SubstFont::CFX_SubstFont() {
16 m_ExtHandle = NULL; 38 m_ExtHandle = NULL;
17 m_Charset = 0; 39 m_Charset = 0;
18 m_SubstFlags = 0; 40 m_SubstFlags = 0;
19 m_Weight = 0; 41 m_Weight = 0;
20 m_ItalicAngle = 0; 42 m_ItalicAngle = 0;
21 m_bSubstOfCJK = FALSE; 43 m_bSubstOfCJK = FALSE;
22 m_WeightCJK = 0; 44 m_WeightCJK = 0;
23 m_bItlicCJK = FALSE; 45 m_bItlicCJK = FALSE;
24 } 46 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 if (m_FTLibrary) { 91 if (m_FTLibrary) {
70 FXFT_Done_FreeType(m_FTLibrary); 92 FXFT_Done_FreeType(m_FTLibrary);
71 } 93 }
72 } 94 }
73 void CFX_FontMgr::InitFTLibrary() { 95 void CFX_FontMgr::InitFTLibrary() {
74 if (m_FTLibrary == NULL) { 96 if (m_FTLibrary == NULL) {
75 FXFT_Init_FreeType(&m_FTLibrary); 97 FXFT_Init_FreeType(&m_FTLibrary);
76 } 98 }
77 } 99 }
78 void CFX_FontMgr::FreeCache() { 100 void CFX_FontMgr::FreeCache() {
79 FX_POSITION pos = m_FaceMap.GetStartPosition(); 101 auto it = m_FaceMap.begin();
80 while (pos) { 102 while (it != m_FaceMap.end()) {
Lei Zhang 2015/08/15 00:47:33 Range-Based For Loop?
Tom Sepez 2015/08/17 20:15:26 Done.
81 CFX_ByteString Key; 103 auto temp = it++;
82 CTTFontDesc* face; 104 delete temp->second;
83 m_FaceMap.GetNextAssoc(pos, Key, (void*&)face); 105 m_FaceMap.erase(temp);
84 delete face;
85 } 106 }
86 m_FaceMap.RemoveAll();
87 } 107 }
88 void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { 108 void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) {
89 m_pBuiltinMapper->SetSystemFontInfo(pFontInfo); 109 m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
90 } 110 }
91 FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, 111 FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name,
92 FX_BOOL bTrueType, 112 FX_BOOL bTrueType,
93 FX_DWORD flags, 113 FX_DWORD flags,
94 int weight, 114 int weight,
95 int italic_angle, 115 int italic_angle,
96 int CharsetCP, 116 int CharsetCP,
97 CFX_SubstFont* pSubstFont) { 117 CFX_SubstFont* pSubstFont) {
98 if (!m_FTLibrary) { 118 if (!m_FTLibrary) {
99 FXFT_Init_FreeType(&m_FTLibrary); 119 FXFT_Init_FreeType(&m_FTLibrary);
100 } 120 }
101 return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, 121 return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight,
102 italic_angle, CharsetCP, pSubstFont); 122 italic_angle, CharsetCP, pSubstFont);
103 } 123 }
104 FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, 124 FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
105 int weight, 125 int weight,
106 FX_BOOL bItalic, 126 FX_BOOL bItalic,
107 uint8_t*& pFontData) { 127 uint8_t*& pFontData) {
108 CFX_ByteString key(face_name); 128 auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic));
109 key += ','; 129 if (it == m_FaceMap.end())
110 key += CFX_ByteString::FormatInteger(weight); 130 return nullptr;
111 key += bItalic ? 'I' : 'N'; 131
112 CTTFontDesc* pFontDesc = NULL; 132 CTTFontDesc* pFontDesc = it->second;
113 m_FaceMap.Lookup(key, (void*&)pFontDesc); 133 pFontData = pFontDesc->m_pFontData;
114 if (pFontDesc) { 134 pFontDesc->m_RefCount++;
115 pFontData = pFontDesc->m_pFontData; 135 return pFontDesc->m_SingleFace.m_pFace;
116 pFontDesc->m_RefCount++;
117 return pFontDesc->m_SingleFace.m_pFace;
118 }
119 return NULL;
120 } 136 }
121 FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, 137 FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
122 int weight, 138 int weight,
123 FX_BOOL bItalic, 139 FX_BOOL bItalic,
124 uint8_t* pData, 140 uint8_t* pData,
125 FX_DWORD size, 141 FX_DWORD size,
126 int face_index) { 142 int face_index) {
127 CTTFontDesc* pFontDesc = new CTTFontDesc; 143 CTTFontDesc* pFontDesc = new CTTFontDesc;
128 pFontDesc->m_Type = 1; 144 pFontDesc->m_Type = 1;
129 pFontDesc->m_SingleFace.m_pFace = NULL; 145 pFontDesc->m_SingleFace.m_pFace = NULL;
(...skipping 10 matching lines...) Expand all
140 &pFontDesc->m_SingleFace.m_pFace); 156 &pFontDesc->m_SingleFace.m_pFace);
141 if (ret) { 157 if (ret) {
142 delete pFontDesc; 158 delete pFontDesc;
143 return NULL; 159 return NULL;
144 } 160 }
145 ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64); 161 ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);
146 if (ret) { 162 if (ret) {
147 delete pFontDesc; 163 delete pFontDesc;
148 return NULL; 164 return NULL;
149 } 165 }
150 CFX_ByteString key(face_name); 166 m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc;
151 key += ',';
152 key += CFX_ByteString::FormatInteger(weight);
153 key += bItalic ? 'I' : 'N';
154 m_FaceMap.SetAt(key, pFontDesc);
155 return pFontDesc->m_SingleFace.m_pFace; 167 return pFontDesc->m_SingleFace.m_pFace;
156 } 168 }
157 const FX_CHAR* const g_Base14FontNames[14] = { 169 const FX_CHAR* const g_Base14FontNames[14] = {
158 "Courier", 170 "Courier",
159 "Courier-Bold", 171 "Courier-Bold",
160 "Courier-BoldOblique", 172 "Courier-BoldOblique",
161 "Courier-Oblique", 173 "Courier-Oblique",
162 "Helvetica", 174 "Helvetica",
163 "Helvetica-Bold", 175 "Helvetica-Bold",
164 "Helvetica-BoldOblique", 176 "Helvetica-BoldOblique",
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 face_index = 0; 309 face_index = 0;
298 } else { 310 } else {
299 face_index = index; 311 face_index = index;
300 } 312 }
301 return face_index; 313 return face_index;
302 } 314 }
303 FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, 315 FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size,
304 FX_DWORD checksum, 316 FX_DWORD checksum,
305 int font_offset, 317 int font_offset,
306 uint8_t*& pFontData) { 318 uint8_t*& pFontData) {
307 CFX_ByteString key; 319 auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum));
308 key.Format("%d:%d", ttc_size, checksum); 320 if (it == m_FaceMap.end())
309 CTTFontDesc* pFontDesc = NULL; 321 return nullptr;
310 m_FaceMap.Lookup(key, (void*&)pFontDesc); 322
311 if (pFontDesc == NULL) { 323 CTTFontDesc* pFontDesc = it->second;
312 return NULL;
313 }
314 pFontData = pFontDesc->m_pFontData; 324 pFontData = pFontDesc->m_pFontData;
315 pFontDesc->m_RefCount++; 325 pFontDesc->m_RefCount++;
316 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); 326 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
317 if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) { 327 if (!pFontDesc->m_TTCFace.m_pFaces[face_index]) {
318 pFontDesc->m_TTCFace.m_pFaces[face_index] = 328 pFontDesc->m_TTCFace.m_pFaces[face_index] =
319 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); 329 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
320 } 330 }
321 return pFontDesc->m_TTCFace.m_pFaces[face_index]; 331 return pFontDesc->m_TTCFace.m_pFaces[face_index];
322 } 332 }
323 FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, 333 FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size,
324 FX_DWORD checksum, 334 FX_DWORD checksum,
325 uint8_t* pData, 335 uint8_t* pData,
326 FX_DWORD size, 336 FX_DWORD size,
327 int font_offset) { 337 int font_offset) {
328 CFX_ByteString key;
329 key.Format("%d:%d", ttc_size, checksum);
330 CTTFontDesc* pFontDesc = new CTTFontDesc; 338 CTTFontDesc* pFontDesc = new CTTFontDesc;
331 pFontDesc->m_Type = 2; 339 pFontDesc->m_Type = 2;
332 pFontDesc->m_pFontData = pData; 340 pFontDesc->m_pFontData = pData;
333 for (int i = 0; i < 16; i++) { 341 for (int i = 0; i < 16; i++) {
334 pFontDesc->m_TTCFace.m_pFaces[i] = NULL; 342 pFontDesc->m_TTCFace.m_pFaces[i] = NULL;
335 } 343 }
336 pFontDesc->m_RefCount++; 344 pFontDesc->m_RefCount++;
337 key.Format("%d:%d", ttc_size, checksum); 345 m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc;
338 m_FaceMap.SetAt(key, pFontDesc);
339 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); 346 int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
340 pFontDesc->m_TTCFace.m_pFaces[face_index] = 347 pFontDesc->m_TTCFace.m_pFaces[face_index] =
341 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); 348 GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
342 return pFontDesc->m_TTCFace.m_pFaces[face_index]; 349 return pFontDesc->m_TTCFace.m_pFaces[face_index];
343 } 350 }
344 FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData, 351 FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData,
345 FX_DWORD size, 352 FX_DWORD size,
346 int face_index) { 353 int face_index) {
347 FXFT_Library library; 354 FXFT_Library library;
348 if (m_FTLibrary == NULL) { 355 if (m_FTLibrary == NULL) {
(...skipping 22 matching lines...) Expand all
371 if (ret) { 378 if (ret) {
372 return NULL; 379 return NULL;
373 } 380 }
374 ret = FXFT_Set_Pixel_Sizes(face, 64, 64); 381 ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
375 if (ret) { 382 if (ret) {
376 return NULL; 383 return NULL;
377 } 384 }
378 return face; 385 return face;
379 } 386 }
380 void CFX_FontMgr::ReleaseFace(FXFT_Face face) { 387 void CFX_FontMgr::ReleaseFace(FXFT_Face face) {
381 if (face == NULL) { 388 if (!face) {
382 return; 389 return;
383 } 390 }
384 FX_POSITION pos = m_FaceMap.GetStartPosition(); 391 auto it = m_FaceMap.begin();
385 while (pos) { 392 while (it != m_FaceMap.end()) {
386 CFX_ByteString Key; 393 auto temp = it++;
387 CTTFontDesc* ttface; 394 if (temp->second->ReleaseFace(face)) {
388 m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface); 395 m_FaceMap.erase(temp);
389 if (ttface->ReleaseFace(face)) {
390 m_FaceMap.RemoveKey(Key);
391 } 396 }
392 } 397 }
393 } 398 }
394 extern "C" { 399 extern "C" {
395 extern const unsigned char g_FoxitFixedItalicFontData[18746]; 400 extern const unsigned char g_FoxitFixedItalicFontData[18746];
396 extern const unsigned char g_FoxitFixedFontData[17597]; 401 extern const unsigned char g_FoxitFixedFontData[17597];
397 extern const unsigned char g_FoxitSansItalicFontData[16339]; 402 extern const unsigned char g_FoxitSansItalicFontData[16339];
398 extern const unsigned char g_FoxitSansFontData[15025]; 403 extern const unsigned char g_FoxitSansFontData[15025];
399 extern const unsigned char g_FoxitSerifItalicFontData[21227]; 404 extern const unsigned char g_FoxitSerifItalicFontData[21227];
400 extern const unsigned char g_FoxitSerifFontData[19469]; 405 extern const unsigned char g_FoxitSerifFontData[19469];
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 FXFT_Face* Face, 1274 FXFT_Face* Face,
1270 IFX_FileRead* pFile, 1275 IFX_FileRead* pFile,
1271 FXFT_Stream* stream); 1276 FXFT_Stream* stream);
1272 #if _FX_OS_ == _FX_ANDROID_ 1277 #if _FX_OS_ == _FX_ANDROID_
1273 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { 1278 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) {
1274 return NULL; 1279 return NULL;
1275 } 1280 }
1276 #endif 1281 #endif
1277 CFX_FolderFontInfo::CFX_FolderFontInfo() {} 1282 CFX_FolderFontInfo::CFX_FolderFontInfo() {}
1278 CFX_FolderFontInfo::~CFX_FolderFontInfo() { 1283 CFX_FolderFontInfo::~CFX_FolderFontInfo() {
1279 FX_POSITION pos = m_FontList.GetStartPosition(); 1284 for (auto& pair : m_FontList) {
1280 while (pos) { 1285 delete pair.second;
1281 CFX_ByteString key;
1282 void* value;
1283 m_FontList.GetNextAssoc(pos, key, value);
1284 delete (CFX_FontFaceInfo*)value;
1285 } 1286 }
1286 } 1287 }
1287 void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { 1288 void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) {
1288 m_PathList.Add(path); 1289 m_PathList.Add(path);
1289 } 1290 }
1290 void CFX_FolderFontInfo::Release() { 1291 void CFX_FolderFontInfo::Release() {
1291 delete this; 1292 delete this;
1292 } 1293 }
1293 FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) { 1294 FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper) {
1294 m_pMapper = pMapper; 1295 m_pMapper = pMapper;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1384 if (tables.IsEmpty()) { 1385 if (tables.IsEmpty()) {
1385 return; 1386 return;
1386 } 1387 }
1387 CFX_ByteString names = 1388 CFX_ByteString names =
1388 _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65); 1389 _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
1389 CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1); 1390 CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);
1390 CFX_ByteString style = _FPDF_GetNameFromTT(names, 2); 1391 CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);
1391 if (style != "Regular") { 1392 if (style != "Regular") {
1392 facename += " " + style; 1393 facename += " " + style;
1393 } 1394 }
1394 void* p; 1395 if (m_FontList.find(facename) != m_FontList.end()) {
1395 if (m_FontList.Lookup(facename, p)) {
1396 return; 1396 return;
1397 } 1397 }
1398 CFX_FontFaceInfo* pInfo = 1398 CFX_FontFaceInfo* pInfo =
1399 new CFX_FontFaceInfo(path, facename, tables, offset, filesize); 1399 new CFX_FontFaceInfo(path, facename, tables, offset, filesize);
1400 CFX_ByteString os2 = 1400 CFX_ByteString os2 =
1401 _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32); 1401 _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
1402 if (os2.GetLength() >= 86) { 1402 if (os2.GetLength() >= 86) {
1403 const uint8_t* p = (const uint8_t*)os2 + 78; 1403 const uint8_t* p = (const uint8_t*)os2 + 78;
1404 FX_DWORD codepages = GET_TT_LONG(p); 1404 FX_DWORD codepages = GET_TT_LONG(p);
1405 if (codepages & (1 << 17)) { 1405 if (codepages & (1 << 17)) {
(...skipping 23 matching lines...) Expand all
1429 if (style.Find(FX_BSTRC("Bold")) > -1) { 1429 if (style.Find(FX_BSTRC("Bold")) > -1) {
1430 pInfo->m_Styles |= FXFONT_BOLD; 1430 pInfo->m_Styles |= FXFONT_BOLD;
1431 } 1431 }
1432 if (style.Find(FX_BSTRC("Italic")) > -1 || 1432 if (style.Find(FX_BSTRC("Italic")) > -1 ||
1433 style.Find(FX_BSTRC("Oblique")) > -1) { 1433 style.Find(FX_BSTRC("Oblique")) > -1) {
1434 pInfo->m_Styles |= FXFONT_ITALIC; 1434 pInfo->m_Styles |= FXFONT_ITALIC;
1435 } 1435 }
1436 if (facename.Find(FX_BSTRC("Serif")) > -1) { 1436 if (facename.Find(FX_BSTRC("Serif")) > -1) {
1437 pInfo->m_Styles |= FXFONT_SERIF; 1437 pInfo->m_Styles |= FXFONT_SERIF;
1438 } 1438 }
1439 m_FontList.SetAt(facename, pInfo); 1439 m_FontList[facename] = pInfo;
1440 } 1440 }
1441 void* CFX_FolderFontInfo::MapFont(int weight, 1441 void* CFX_FolderFontInfo::MapFont(int weight,
1442 FX_BOOL bItalic, 1442 FX_BOOL bItalic,
1443 int charset, 1443 int charset,
1444 int pitch_family, 1444 int pitch_family,
1445 const FX_CHAR* family, 1445 const FX_CHAR* family,
1446 int& iExact) { 1446 int& iExact) {
1447 return NULL; 1447 return NULL;
1448 } 1448 }
1449 void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) { 1449 void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) {
1450 void* p; 1450 auto it = m_FontList.find(face);
1451 if (!m_FontList.Lookup(face, p)) { 1451 return it != m_FontList.end() ? it->second : nullptr;
1452 return NULL;
1453 }
1454 return p;
1455 } 1452 }
1456 FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, 1453 FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont,
1457 FX_DWORD table, 1454 FX_DWORD table,
1458 uint8_t* buffer, 1455 uint8_t* buffer,
1459 FX_DWORD size) { 1456 FX_DWORD size) {
1460 if (hFont == NULL) { 1457 if (hFont == NULL) {
1461 return 0; 1458 return 0;
1462 } 1459 }
1463 CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont; 1460 CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont;
1464 FXSYS_FILE* pFile = NULL; 1461 FXSYS_FILE* pFile = NULL;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 if (hFont == NULL) { 1497 if (hFont == NULL) {
1501 return FALSE; 1498 return FALSE;
1502 } 1499 }
1503 CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont; 1500 CFX_FontFaceInfo* pFont = (CFX_FontFaceInfo*)hFont;
1504 name = pFont->m_FaceName; 1501 name = pFont->m_FaceName;
1505 return TRUE; 1502 return TRUE;
1506 } 1503 }
1507 FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) { 1504 FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset) {
1508 return FALSE; 1505 return FALSE;
1509 } 1506 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698