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_gefont.h" | 7 #include "xfa/fgas/font/fgas_gefont.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 if (!pFont->LoadFontInternal(pBuffer, iLength)) { | 66 if (!pFont->LoadFontInternal(pBuffer, iLength)) { |
67 pFont->Release(); | 67 pFont->Release(); |
68 return nullptr; | 68 return nullptr; |
69 } | 69 } |
70 return pFont; | 70 return pFont; |
71 } | 71 } |
72 | 72 |
73 // static | 73 // static |
74 CFGAS_GEFont* CFGAS_GEFont::LoadFont(IFX_Stream* pFontStream, | 74 CFGAS_GEFont* CFGAS_GEFont::LoadFont(IFX_Stream* pFontStream, |
75 IFGAS_FontMgr* pFontMgr, | 75 IFGAS_FontMgr* pFontMgr, |
76 FX_BOOL bSaveStream) { | 76 bool bSaveStream) { |
77 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 77 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
78 if (!pFont->LoadFontInternal(pFontStream, bSaveStream)) { | 78 if (!pFont->LoadFontInternal(pFontStream, bSaveStream)) { |
79 pFont->Release(); | 79 pFont->Release(); |
80 return nullptr; | 80 return nullptr; |
81 } | 81 } |
82 return pFont; | 82 return pFont; |
83 } | 83 } |
84 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 84 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
85 | 85 |
86 CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) | 86 CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) |
87 : | 87 : |
88 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 88 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
89 m_bUseLogFontStyle(FALSE), | 89 m_bUseLogFontStyle(false), |
90 m_dwLogFontStyle(0), | 90 m_dwLogFontStyle(0), |
91 #endif | 91 #endif |
92 m_pFont(nullptr), | 92 m_pFont(nullptr), |
93 m_pSrcFont(nullptr), | 93 m_pSrcFont(nullptr), |
94 m_pFontMgr(pFontMgr), | 94 m_pFontMgr(pFontMgr), |
95 m_iRefCount(1), | 95 m_iRefCount(1), |
96 m_bExternalFont(false), | 96 m_bExternalFont(false), |
97 m_pProvider(nullptr) { | 97 m_pProvider(nullptr) { |
98 } | 98 } |
99 | 99 |
100 CFGAS_GEFont::CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles) | 100 CFGAS_GEFont::CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles) |
101 : | 101 : |
102 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 102 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
103 m_bUseLogFontStyle(FALSE), | 103 m_bUseLogFontStyle(false), |
104 m_dwLogFontStyle(0), | 104 m_dwLogFontStyle(0), |
105 #endif | 105 #endif |
106 m_pFont(nullptr), | 106 m_pFont(nullptr), |
107 m_pSrcFont(src), | 107 m_pSrcFont(src), |
108 m_pFontMgr(src->m_pFontMgr), | 108 m_pFontMgr(src->m_pFontMgr), |
109 m_iRefCount(1), | 109 m_iRefCount(1), |
110 m_bExternalFont(false), | 110 m_bExternalFont(false), |
111 m_pProvider(nullptr) { | 111 m_pProvider(nullptr) { |
112 ASSERT(m_pSrcFont->m_pFont); | 112 ASSERT(m_pSrcFont->m_pFont); |
113 m_pSrcFont->Retain(); | 113 m_pSrcFont->Retain(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 } | 149 } |
150 delete this; | 150 delete this; |
151 } | 151 } |
152 } | 152 } |
153 CFGAS_GEFont* CFGAS_GEFont::Retain() { | 153 CFGAS_GEFont* CFGAS_GEFont::Retain() { |
154 ++m_iRefCount; | 154 ++m_iRefCount; |
155 return this; | 155 return this; |
156 } | 156 } |
157 | 157 |
158 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 158 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
159 FX_BOOL CFGAS_GEFont::LoadFontInternal(const FX_WCHAR* pszFontFamily, | 159 bool CFGAS_GEFont::LoadFontInternal(const FX_WCHAR* pszFontFamily, |
160 uint32_t dwFontStyles, | 160 uint32_t dwFontStyles, |
161 uint16_t wCodePage) { | 161 uint16_t wCodePage) { |
162 if (m_pFont) { | 162 if (m_pFont) { |
163 return FALSE; | 163 return false; |
164 } | 164 } |
165 CFX_ByteString csFontFamily; | 165 CFX_ByteString csFontFamily; |
166 if (pszFontFamily) { | 166 if (pszFontFamily) { |
167 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); | 167 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); |
168 } | 168 } |
169 uint32_t dwFlags = 0; | 169 uint32_t dwFlags = 0; |
170 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { | 170 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { |
171 dwFlags |= FXFONT_FIXED_PITCH; | 171 dwFlags |= FXFONT_FIXED_PITCH; |
172 } | 172 } |
173 if (dwFontStyles & FX_FONTSTYLE_Serif) { | 173 if (dwFontStyles & FX_FONTSTYLE_Serif) { |
(...skipping 17 matching lines...) Expand all Loading... |
191 int32_t iWeight = | 191 int32_t iWeight = |
192 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; | 192 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; |
193 m_pFont = new CFX_Font; | 193 m_pFont = new CFX_Font; |
194 if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) { | 194 if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) { |
195 csFontFamily += ",BoldItalic"; | 195 csFontFamily += ",BoldItalic"; |
196 } else if (dwFlags & FXFONT_BOLD) { | 196 } else if (dwFlags & FXFONT_BOLD) { |
197 csFontFamily += ",Bold"; | 197 csFontFamily += ",Bold"; |
198 } else if (dwFlags & FXFONT_ITALIC) { | 198 } else if (dwFlags & FXFONT_ITALIC) { |
199 csFontFamily += ",Italic"; | 199 csFontFamily += ",Italic"; |
200 } | 200 } |
201 m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage, false); | 201 m_pFont->LoadSubst(csFontFamily, true, dwFlags, iWeight, 0, wCodePage, false); |
202 if (!m_pFont->GetFace()) | 202 if (!m_pFont->GetFace()) |
203 return false; | 203 return false; |
204 return InitFont(); | 204 return InitFont(); |
205 } | 205 } |
206 | 206 |
207 FX_BOOL CFGAS_GEFont::LoadFontInternal(const uint8_t* pBuffer, int32_t length) { | 207 bool CFGAS_GEFont::LoadFontInternal(const uint8_t* pBuffer, int32_t length) { |
208 if (m_pFont) | 208 if (m_pFont) |
209 return FALSE; | 209 return false; |
210 | 210 |
211 m_pFont = new CFX_Font; | 211 m_pFont = new CFX_Font; |
212 if (!m_pFont->LoadEmbedded(pBuffer, length)) | 212 if (!m_pFont->LoadEmbedded(pBuffer, length)) |
213 return FALSE; | 213 return false; |
214 return InitFont(); | 214 return InitFont(); |
215 } | 215 } |
216 | 216 |
217 FX_BOOL CFGAS_GEFont::LoadFontInternal(IFX_Stream* pFontStream, | 217 bool CFGAS_GEFont::LoadFontInternal(IFX_Stream* pFontStream, bool bSaveStream) { |
218 FX_BOOL bSaveStream) { | |
219 if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) | 218 if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) |
220 return FALSE; | 219 return false; |
221 if (bSaveStream) | 220 if (bSaveStream) |
222 m_pStream.reset(pFontStream); | 221 m_pStream.reset(pFontStream); |
223 | 222 |
224 m_pFileRead.reset(FX_CreateFileRead(pFontStream, FALSE)); | 223 m_pFileRead.reset(FX_CreateFileRead(pFontStream, false)); |
225 m_pFont = new CFX_Font; | 224 m_pFont = new CFX_Font; |
226 if (m_pFont->LoadFile(m_pFileRead.get())) | 225 if (m_pFont->LoadFile(m_pFileRead.get())) |
227 return InitFont(); | 226 return InitFont(); |
228 m_pFileRead.reset(); | 227 m_pFileRead.reset(); |
229 return FALSE; | 228 return false; |
230 } | 229 } |
231 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 230 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
232 | 231 |
233 FX_BOOL CFGAS_GEFont::LoadFontInternal(CFX_Font* pExternalFont) { | 232 bool CFGAS_GEFont::LoadFontInternal(CFX_Font* pExternalFont) { |
234 if (m_pFont || !pExternalFont) | 233 if (m_pFont || !pExternalFont) |
235 return FALSE; | 234 return false; |
236 | 235 |
237 m_pFont = pExternalFont; | 236 m_pFont = pExternalFont; |
238 m_bExternalFont = true; | 237 m_bExternalFont = true; |
239 return InitFont(); | 238 return InitFont(); |
240 } | 239 } |
241 | 240 |
242 FX_BOOL CFGAS_GEFont::LoadFontInternal( | 241 bool CFGAS_GEFont::LoadFontInternal(std::unique_ptr<CFX_Font> pInternalFont) { |
243 std::unique_ptr<CFX_Font> pInternalFont) { | |
244 if (m_pFont || !pInternalFont) | 242 if (m_pFont || !pInternalFont) |
245 return FALSE; | 243 return false; |
246 | 244 |
247 m_pFont = pInternalFont.release(); | 245 m_pFont = pInternalFont.release(); |
248 m_bExternalFont = false; | 246 m_bExternalFont = false; |
249 return InitFont(); | 247 return InitFont(); |
250 } | 248 } |
251 | 249 |
252 FX_BOOL CFGAS_GEFont::InitFont() { | 250 bool CFGAS_GEFont::InitFont() { |
253 if (!m_pFont) | 251 if (!m_pFont) |
254 return FALSE; | 252 return false; |
255 if (!m_pFontEncoding) { | 253 if (!m_pFontEncoding) { |
256 m_pFontEncoding.reset(FX_CreateFontEncodingEx(m_pFont)); | 254 m_pFontEncoding.reset(FX_CreateFontEncodingEx(m_pFont)); |
257 if (!m_pFontEncoding) | 255 if (!m_pFontEncoding) |
258 return FALSE; | 256 return false; |
259 } | 257 } |
260 if (!m_pCharWidthMap) | 258 if (!m_pCharWidthMap) |
261 m_pCharWidthMap.reset(new CFX_DiscreteArrayTemplate<uint16_t>(1024)); | 259 m_pCharWidthMap.reset(new CFX_DiscreteArrayTemplate<uint16_t>(1024)); |
262 if (!m_pRectArray) | 260 if (!m_pRectArray) |
263 m_pRectArray.reset(new CFX_MassArrayTemplate<CFX_Rect>(16)); | 261 m_pRectArray.reset(new CFX_MassArrayTemplate<CFX_Rect>(16)); |
264 if (!m_pBBoxMap) | 262 if (!m_pBBoxMap) |
265 m_pBBoxMap.reset(new CFX_MapPtrToPtr(16)); | 263 m_pBBoxMap.reset(new CFX_MapPtrToPtr(16)); |
266 | 264 |
267 return TRUE; | 265 return true; |
268 } | 266 } |
269 | 267 |
270 CFGAS_GEFont* CFGAS_GEFont::Derive(uint32_t dwFontStyles, uint16_t wCodePage) { | 268 CFGAS_GEFont* CFGAS_GEFont::Derive(uint32_t dwFontStyles, uint16_t wCodePage) { |
271 if (GetFontStyles() == dwFontStyles) | 269 if (GetFontStyles() == dwFontStyles) |
272 return Retain(); | 270 return Retain(); |
273 return new CFGAS_GEFont(this, dwFontStyles); | 271 return new CFGAS_GEFont(this, dwFontStyles); |
274 } | 272 } |
275 | 273 |
276 void CFGAS_GEFont::GetFamilyName(CFX_WideString& wsFamily) const { | 274 void CFGAS_GEFont::GetFamilyName(CFX_WideString& wsFamily) const { |
277 if (!m_pFont->GetSubstFont() || | 275 if (!m_pFont->GetSubstFont() || |
(...skipping 21 matching lines...) Expand all Loading... |
299 dwStyles |= FX_FONTSTYLE_Italic; | 297 dwStyles |= FX_FONTSTYLE_Italic; |
300 } else { | 298 } else { |
301 if (m_pFont->IsBold()) | 299 if (m_pFont->IsBold()) |
302 dwStyles |= FX_FONTSTYLE_Bold; | 300 dwStyles |= FX_FONTSTYLE_Bold; |
303 if (m_pFont->IsItalic()) | 301 if (m_pFont->IsItalic()) |
304 dwStyles |= FX_FONTSTYLE_Italic; | 302 dwStyles |= FX_FONTSTYLE_Italic; |
305 } | 303 } |
306 return dwStyles; | 304 return dwStyles; |
307 } | 305 } |
308 | 306 |
309 FX_BOOL CFGAS_GEFont::GetCharWidth(FX_WCHAR wUnicode, | 307 bool CFGAS_GEFont::GetCharWidth(FX_WCHAR wUnicode, |
310 int32_t& iWidth, | 308 int32_t& iWidth, |
311 bool bCharCode) { | 309 bool bCharCode) { |
312 return GetCharWidthInternal(wUnicode, iWidth, true, bCharCode); | 310 return GetCharWidthInternal(wUnicode, iWidth, true, bCharCode); |
313 } | 311 } |
314 | 312 |
315 FX_BOOL CFGAS_GEFont::GetCharWidthInternal(FX_WCHAR wUnicode, | 313 bool CFGAS_GEFont::GetCharWidthInternal(FX_WCHAR wUnicode, |
316 int32_t& iWidth, | 314 int32_t& iWidth, |
317 bool bRecursive, | 315 bool bRecursive, |
318 bool bCharCode) { | 316 bool bCharCode) { |
319 ASSERT(m_pCharWidthMap); | 317 ASSERT(m_pCharWidthMap); |
320 iWidth = m_pCharWidthMap->GetAt(wUnicode, 0); | 318 iWidth = m_pCharWidthMap->GetAt(wUnicode, 0); |
321 if (iWidth == 65535) | 319 if (iWidth == 65535) |
322 return FALSE; | 320 return false; |
323 | 321 |
324 if (iWidth > 0) | 322 if (iWidth > 0) |
325 return TRUE; | 323 return true; |
326 | 324 |
327 if (!m_pProvider || | 325 if (!m_pProvider || |
328 !m_pProvider->GetCharWidth(this, wUnicode, bCharCode, &iWidth)) { | 326 !m_pProvider->GetCharWidth(this, wUnicode, bCharCode, &iWidth)) { |
329 CFGAS_GEFont* pFont = nullptr; | 327 CFGAS_GEFont* pFont = nullptr; |
330 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); | 328 int32_t iGlyph = GetGlyphIndex(wUnicode, true, &pFont, bCharCode); |
331 if (iGlyph != 0xFFFF && pFont) { | 329 if (iGlyph != 0xFFFF && pFont) { |
332 if (pFont == this) { | 330 if (pFont == this) { |
333 iWidth = m_pFont->GetGlyphWidth(iGlyph); | 331 iWidth = m_pFont->GetGlyphWidth(iGlyph); |
334 if (iWidth < 0) { | 332 if (iWidth < 0) { |
335 iWidth = -1; | 333 iWidth = -1; |
336 } | 334 } |
337 } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, false, | 335 } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, false, |
338 bCharCode)) { | 336 bCharCode)) { |
339 return TRUE; | 337 return true; |
340 } | 338 } |
341 } else { | 339 } else { |
342 iWidth = -1; | 340 iWidth = -1; |
343 } | 341 } |
344 } | 342 } |
345 m_pCharWidthMap->SetAtGrow(wUnicode, iWidth); | 343 m_pCharWidthMap->SetAtGrow(wUnicode, iWidth); |
346 return iWidth > 0; | 344 return iWidth > 0; |
347 } | 345 } |
348 | 346 |
349 FX_BOOL CFGAS_GEFont::GetCharBBox(FX_WCHAR wUnicode, | 347 bool CFGAS_GEFont::GetCharBBox(FX_WCHAR wUnicode, |
350 CFX_Rect& bbox, | 348 CFX_Rect& bbox, |
351 FX_BOOL bCharCode) { | 349 bool bCharCode) { |
352 return GetCharBBoxInternal(wUnicode, bbox, TRUE, bCharCode); | 350 return GetCharBBoxInternal(wUnicode, bbox, true, bCharCode); |
353 } | 351 } |
354 | 352 |
355 FX_BOOL CFGAS_GEFont::GetCharBBoxInternal(FX_WCHAR wUnicode, | 353 bool CFGAS_GEFont::GetCharBBoxInternal(FX_WCHAR wUnicode, |
356 CFX_Rect& bbox, | 354 CFX_Rect& bbox, |
357 FX_BOOL bRecursive, | 355 bool bRecursive, |
358 FX_BOOL bCharCode) { | 356 bool bCharCode) { |
359 ASSERT(m_pRectArray); | 357 ASSERT(m_pRectArray); |
360 ASSERT(m_pBBoxMap); | 358 ASSERT(m_pBBoxMap); |
361 void* pRect = nullptr; | 359 void* pRect = nullptr; |
362 if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) { | 360 if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) { |
363 CFGAS_GEFont* pFont = nullptr; | 361 CFGAS_GEFont* pFont = nullptr; |
364 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); | 362 int32_t iGlyph = GetGlyphIndex(wUnicode, true, &pFont, bCharCode); |
365 if (iGlyph != 0xFFFF && pFont) { | 363 if (iGlyph != 0xFFFF && pFont) { |
366 if (pFont == this) { | 364 if (pFont == this) { |
367 FX_RECT rtBBox; | 365 FX_RECT rtBBox; |
368 if (m_pFont->GetGlyphBBox(iGlyph, rtBBox)) { | 366 if (m_pFont->GetGlyphBBox(iGlyph, rtBBox)) { |
369 CFX_Rect rt; | 367 CFX_Rect rt; |
370 rt.Set(rtBBox.left, rtBBox.top, rtBBox.Width(), rtBBox.Height()); | 368 rt.Set(rtBBox.left, rtBBox.top, rtBBox.Width(), rtBBox.Height()); |
371 int32_t index = m_pRectArray->Add(rt); | 369 int32_t index = m_pRectArray->Add(rt); |
372 pRect = m_pRectArray->GetPtrAt(index); | 370 pRect = m_pRectArray->GetPtrAt(index); |
373 m_pBBoxMap->SetAt((void*)(uintptr_t)wUnicode, pRect); | 371 m_pBBoxMap->SetAt((void*)(uintptr_t)wUnicode, pRect); |
374 } | 372 } |
375 } else if (pFont->GetCharBBoxInternal(wUnicode, bbox, FALSE, bCharCode)) { | 373 } else if (pFont->GetCharBBoxInternal(wUnicode, bbox, false, bCharCode)) { |
376 return TRUE; | 374 return true; |
377 } | 375 } |
378 } | 376 } |
379 } | 377 } |
380 if (!pRect) | 378 if (!pRect) |
381 return FALSE; | 379 return false; |
382 | 380 |
383 bbox = *static_cast<const CFX_Rect*>(pRect); | 381 bbox = *static_cast<const CFX_Rect*>(pRect); |
384 return TRUE; | 382 return true; |
385 } | 383 } |
386 FX_BOOL CFGAS_GEFont::GetBBox(CFX_Rect& bbox) { | 384 bool CFGAS_GEFont::GetBBox(CFX_Rect& bbox) { |
387 FX_RECT rt(0, 0, 0, 0); | 385 FX_RECT rt(0, 0, 0, 0); |
388 FX_BOOL bRet = m_pFont->GetBBox(rt); | 386 bool bRet = m_pFont->GetBBox(rt); |
389 if (bRet) { | 387 if (bRet) { |
390 bbox.left = rt.left; | 388 bbox.left = rt.left; |
391 bbox.width = rt.Width(); | 389 bbox.width = rt.Width(); |
392 bbox.top = rt.bottom; | 390 bbox.top = rt.bottom; |
393 bbox.height = -rt.Height(); | 391 bbox.height = -rt.Height(); |
394 } | 392 } |
395 return bRet; | 393 return bRet; |
396 } | 394 } |
397 int32_t CFGAS_GEFont::GetItalicAngle() const { | 395 int32_t CFGAS_GEFont::GetItalicAngle() const { |
398 if (!m_pFont->GetSubstFont()) { | 396 if (!m_pFont->GetSubstFont()) { |
399 return 0; | 397 return 0; |
400 } | 398 } |
401 return m_pFont->GetSubstFont()->m_ItalicAngle; | 399 return m_pFont->GetSubstFont()->m_ItalicAngle; |
402 } | 400 } |
403 int32_t CFGAS_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode) { | 401 int32_t CFGAS_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, bool bCharCode) { |
404 return GetGlyphIndex(wUnicode, TRUE, nullptr, bCharCode); | 402 return GetGlyphIndex(wUnicode, true, nullptr, bCharCode); |
405 } | 403 } |
406 int32_t CFGAS_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, | 404 int32_t CFGAS_GEFont::GetGlyphIndex(FX_WCHAR wUnicode, |
407 FX_BOOL bRecursive, | 405 bool bRecursive, |
408 CFGAS_GEFont** ppFont, | 406 CFGAS_GEFont** ppFont, |
409 FX_BOOL bCharCode) { | 407 bool bCharCode) { |
410 ASSERT(m_pFontEncoding); | 408 ASSERT(m_pFontEncoding); |
411 int32_t iGlyphIndex = m_pFontEncoding->GlyphFromCharCode(wUnicode); | 409 int32_t iGlyphIndex = m_pFontEncoding->GlyphFromCharCode(wUnicode); |
412 if (iGlyphIndex > 0) { | 410 if (iGlyphIndex > 0) { |
413 if (ppFont) { | 411 if (ppFont) { |
414 *ppFont = this; | 412 *ppFont = this; |
415 } | 413 } |
416 return iGlyphIndex; | 414 return iGlyphIndex; |
417 } | 415 } |
418 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode); | 416 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode); |
419 if (!pFontUSB) { | 417 if (!pFontUSB) { |
420 return 0xFFFF; | 418 return 0xFFFF; |
421 } | 419 } |
422 uint16_t wBitField = pFontUSB->wBitField; | 420 uint16_t wBitField = pFontUSB->wBitField; |
423 if (wBitField >= 128) { | 421 if (wBitField >= 128) { |
424 return 0xFFFF; | 422 return 0xFFFF; |
425 } | 423 } |
426 auto it = m_FontMapper.find(wUnicode); | 424 auto it = m_FontMapper.find(wUnicode); |
427 CFGAS_GEFont* pFont = it != m_FontMapper.end() ? it->second : nullptr; | 425 CFGAS_GEFont* pFont = it != m_FontMapper.end() ? it->second : nullptr; |
428 if (pFont && pFont != this) { | 426 if (pFont && pFont != this) { |
429 iGlyphIndex = pFont->GetGlyphIndex(wUnicode, FALSE, nullptr, bCharCode); | 427 iGlyphIndex = pFont->GetGlyphIndex(wUnicode, false, nullptr, bCharCode); |
430 if (iGlyphIndex != 0xFFFF) { | 428 if (iGlyphIndex != 0xFFFF) { |
431 int32_t i = m_SubstFonts.Find(pFont); | 429 int32_t i = m_SubstFonts.Find(pFont); |
432 if (i > -1) { | 430 if (i > -1) { |
433 iGlyphIndex |= ((i + 1) << 24); | 431 iGlyphIndex |= ((i + 1) << 24); |
434 if (ppFont) | 432 if (ppFont) |
435 *ppFont = pFont; | 433 *ppFont = pFont; |
436 return iGlyphIndex; | 434 return iGlyphIndex; |
437 } | 435 } |
438 } | 436 } |
439 } | 437 } |
(...skipping 10 matching lines...) Expand all Loading... |
450 pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), nullptr); | 448 pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), nullptr); |
451 #endif | 449 #endif |
452 if (pFont) { | 450 if (pFont) { |
453 if (pFont == this) { | 451 if (pFont == this) { |
454 pFont->Release(); | 452 pFont->Release(); |
455 return 0xFFFF; | 453 return 0xFFFF; |
456 } | 454 } |
457 m_FontMapper[wUnicode] = pFont; | 455 m_FontMapper[wUnicode] = pFont; |
458 int32_t i = m_SubstFonts.GetSize(); | 456 int32_t i = m_SubstFonts.GetSize(); |
459 m_SubstFonts.Add(pFont); | 457 m_SubstFonts.Add(pFont); |
460 iGlyphIndex = pFont->GetGlyphIndex(wUnicode, FALSE, nullptr, bCharCode); | 458 iGlyphIndex = pFont->GetGlyphIndex(wUnicode, false, nullptr, bCharCode); |
461 if (iGlyphIndex != 0xFFFF) { | 459 if (iGlyphIndex != 0xFFFF) { |
462 iGlyphIndex |= ((i + 1) << 24); | 460 iGlyphIndex |= ((i + 1) << 24); |
463 if (ppFont) | 461 if (ppFont) |
464 *ppFont = pFont; | 462 *ppFont = pFont; |
465 return iGlyphIndex; | 463 return iGlyphIndex; |
466 } | 464 } |
467 } | 465 } |
468 } | 466 } |
469 return 0xFFFF; | 467 return 0xFFFF; |
470 } | 468 } |
471 int32_t CFGAS_GEFont::GetAscent() const { | 469 int32_t CFGAS_GEFont::GetAscent() const { |
472 return m_pFont->GetAscent(); | 470 return m_pFont->GetAscent(); |
473 } | 471 } |
474 int32_t CFGAS_GEFont::GetDescent() const { | 472 int32_t CFGAS_GEFont::GetDescent() const { |
475 return m_pFont->GetDescent(); | 473 return m_pFont->GetDescent(); |
476 } | 474 } |
477 void CFGAS_GEFont::Reset() { | 475 void CFGAS_GEFont::Reset() { |
478 for (int32_t i = 0; i < m_SubstFonts.GetSize(); i++) | 476 for (int32_t i = 0; i < m_SubstFonts.GetSize(); i++) |
479 m_SubstFonts[i]->Reset(); | 477 m_SubstFonts[i]->Reset(); |
480 if (m_pCharWidthMap) { | 478 if (m_pCharWidthMap) { |
481 m_pCharWidthMap->RemoveAll(); | 479 m_pCharWidthMap->RemoveAll(); |
482 } | 480 } |
483 if (m_pBBoxMap) { | 481 if (m_pBBoxMap) { |
484 m_pBBoxMap->RemoveAll(); | 482 m_pBBoxMap->RemoveAll(); |
485 } | 483 } |
486 if (m_pRectArray) { | 484 if (m_pRectArray) { |
487 m_pRectArray->RemoveAll(FALSE); | 485 m_pRectArray->RemoveAll(false); |
488 } | 486 } |
489 } | 487 } |
490 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { | 488 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { |
491 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; | 489 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; |
492 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) | 490 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) |
493 : m_SubstFonts[iGlyphIndex - 1]; | 491 : m_SubstFonts[iGlyphIndex - 1]; |
494 } | 492 } |
OLD | NEW |