| 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> |
| 10 #include <utility> |
| 11 |
| 9 #include "core/fxge/include/cfx_substfont.h" | 12 #include "core/fxge/include/cfx_substfont.h" |
| 10 #include "core/fxge/include/cfx_unicodeencoding.h" | 13 #include "core/fxge/include/cfx_unicodeencoding.h" |
| 11 #include "core/fxge/include/cfx_unicodeencodingex.h" | 14 #include "core/fxge/include/cfx_unicodeencodingex.h" |
| 12 #include "xfa/fgas/crt/fgas_codepage.h" | 15 #include "xfa/fgas/crt/fgas_codepage.h" |
| 13 #include "xfa/fgas/font/fgas_fontutils.h" | 16 #include "xfa/fgas/font/fgas_fontutils.h" |
| 14 #include "xfa/fxfa/include/xfa_fontmgr.h" | 17 #include "xfa/fxfa/include/xfa_fontmgr.h" |
| 15 | 18 |
| 16 // static | 19 // static |
| 17 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, | 20 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, |
| 18 uint32_t dwFontStyles, | 21 uint32_t dwFontStyles, |
| 19 uint16_t wCodePage, | 22 uint16_t wCodePage, |
| 20 IFGAS_FontMgr* pFontMgr) { | 23 IFGAS_FontMgr* pFontMgr) { |
| 21 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 24 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| 22 if (pFontMgr) { | 25 if (pFontMgr) |
| 23 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); | 26 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); |
| 24 } | |
| 25 return nullptr; | 27 return nullptr; |
| 26 #else | 28 #else |
| 27 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 29 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
| 28 if (!pFont->LoadFontInternal(pszFontFamily, dwFontStyles, wCodePage)) { | 30 if (!pFont->LoadFontInternal(pszFontFamily, dwFontStyles, wCodePage)) { |
| 29 pFont->Release(); | 31 pFont->Release(); |
| 30 return nullptr; | 32 return nullptr; |
| 31 } | 33 } |
| 32 return pFont; | 34 return pFont; |
| 33 #endif | 35 #endif |
| 34 } | 36 } |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 wsFamily = CFX_WideString::FromLocal(m_pFont->GetFamilyName().AsStringC()); | 279 wsFamily = CFX_WideString::FromLocal(m_pFont->GetFamilyName().AsStringC()); |
| 278 } else { | 280 } else { |
| 279 wsFamily = CFX_WideString::FromLocal( | 281 wsFamily = CFX_WideString::FromLocal( |
| 280 m_pFont->GetSubstFont()->m_Family.AsStringC()); | 282 m_pFont->GetSubstFont()->m_Family.AsStringC()); |
| 281 } | 283 } |
| 282 } | 284 } |
| 283 | 285 |
| 284 uint32_t CFGAS_GEFont::GetFontStyles() const { | 286 uint32_t CFGAS_GEFont::GetFontStyles() const { |
| 285 ASSERT(m_pFont); | 287 ASSERT(m_pFont); |
| 286 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 288 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
| 287 if (m_bUseLogFontStyle) { | 289 if (m_bUseLogFontStyle) |
| 288 return m_dwLogFontStyle; | 290 return m_dwLogFontStyle; |
| 289 } | |
| 290 #endif | 291 #endif |
| 292 |
| 291 uint32_t dwStyles = 0; | 293 uint32_t dwStyles = 0; |
| 292 if (!m_pFont->GetSubstFont()) { | 294 auto* pSubstFont = m_pFont->GetSubstFont(); |
| 293 if (m_pFont->IsBold()) { | 295 if (pSubstFont) { |
| 296 if (pSubstFont->m_Weight == FXFONT_FW_BOLD) |
| 294 dwStyles |= FX_FONTSTYLE_Bold; | 297 dwStyles |= FX_FONTSTYLE_Bold; |
| 295 } | 298 if (pSubstFont->m_SubstFlags & FXFONT_SUBST_ITALIC) |
| 296 if (m_pFont->IsItalic()) { | |
| 297 dwStyles |= FX_FONTSTYLE_Italic; | 299 dwStyles |= FX_FONTSTYLE_Italic; |
| 298 } | |
| 299 } else { | 300 } else { |
| 300 if (m_pFont->GetSubstFont()->m_Weight == FXFONT_FW_BOLD) { | 301 if (m_pFont->IsBold()) |
| 301 dwStyles |= FX_FONTSTYLE_Bold; | 302 dwStyles |= FX_FONTSTYLE_Bold; |
| 302 } | 303 if (m_pFont->IsItalic()) |
| 303 if (m_pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_ITALIC) { | |
| 304 dwStyles |= FX_FONTSTYLE_Italic; | 304 dwStyles |= FX_FONTSTYLE_Italic; |
| 305 } | |
| 306 } | 305 } |
| 307 return dwStyles; | 306 return dwStyles; |
| 308 } | 307 } |
| 308 |
| 309 FX_BOOL CFGAS_GEFont::GetCharWidth(FX_WCHAR wUnicode, | 309 FX_BOOL CFGAS_GEFont::GetCharWidth(FX_WCHAR wUnicode, |
| 310 int32_t& iWidth, | 310 int32_t& iWidth, |
| 311 FX_BOOL bCharCode) { | 311 bool bCharCode) { |
| 312 return GetCharWidthInternal(wUnicode, iWidth, TRUE, bCharCode); | 312 return GetCharWidthInternal(wUnicode, iWidth, true, bCharCode); |
| 313 } | 313 } |
| 314 |
| 314 FX_BOOL CFGAS_GEFont::GetCharWidthInternal(FX_WCHAR wUnicode, | 315 FX_BOOL CFGAS_GEFont::GetCharWidthInternal(FX_WCHAR wUnicode, |
| 315 int32_t& iWidth, | 316 int32_t& iWidth, |
| 316 FX_BOOL bRecursive, | 317 bool bRecursive, |
| 317 FX_BOOL bCharCode) { | 318 bool bCharCode) { |
| 318 ASSERT(m_pCharWidthMap); | 319 ASSERT(m_pCharWidthMap); |
| 319 iWidth = m_pCharWidthMap->GetAt(wUnicode, 0); | 320 iWidth = m_pCharWidthMap->GetAt(wUnicode, 0); |
| 320 if (iWidth < 1) { | 321 if (iWidth == 65535) |
| 321 if (!m_pProvider || | 322 return FALSE; |
| 322 !m_pProvider->GetCharWidth(this, wUnicode, iWidth, bCharCode)) { | 323 |
| 323 CFGAS_GEFont* pFont = nullptr; | 324 if (iWidth > 0) |
| 324 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); | 325 return TRUE; |
| 325 if (iGlyph != 0xFFFF && pFont) { | 326 |
| 326 if (pFont == this) { | 327 if (!m_pProvider || |
| 327 iWidth = m_pFont->GetGlyphWidth(iGlyph); | 328 !m_pProvider->GetCharWidth(this, wUnicode, bCharCode, &iWidth)) { |
| 328 if (iWidth < 0) { | 329 CFGAS_GEFont* pFont = nullptr; |
| 329 iWidth = -1; | 330 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); |
| 330 } | 331 if (iGlyph != 0xFFFF && pFont) { |
| 331 } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, FALSE, | 332 if (pFont == this) { |
| 332 bCharCode)) { | 333 iWidth = m_pFont->GetGlyphWidth(iGlyph); |
| 333 return TRUE; | 334 if (iWidth < 0) { |
| 335 iWidth = -1; |
| 334 } | 336 } |
| 335 } else { | 337 } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, false, |
| 336 iWidth = -1; | 338 bCharCode)) { |
| 339 return TRUE; |
| 337 } | 340 } |
| 341 } else { |
| 342 iWidth = -1; |
| 338 } | 343 } |
| 339 m_pCharWidthMap->SetAtGrow(wUnicode, (int16_t)iWidth); | |
| 340 } else if (iWidth == 65535) { | |
| 341 iWidth = -1; | |
| 342 } | 344 } |
| 345 m_pCharWidthMap->SetAtGrow(wUnicode, iWidth); |
| 343 return iWidth > 0; | 346 return iWidth > 0; |
| 344 } | 347 } |
| 348 |
| 345 FX_BOOL CFGAS_GEFont::GetCharBBox(FX_WCHAR wUnicode, | 349 FX_BOOL CFGAS_GEFont::GetCharBBox(FX_WCHAR wUnicode, |
| 346 CFX_Rect& bbox, | 350 CFX_Rect& bbox, |
| 347 FX_BOOL bCharCode) { | 351 FX_BOOL bCharCode) { |
| 348 return GetCharBBoxInternal(wUnicode, bbox, TRUE, bCharCode); | 352 return GetCharBBoxInternal(wUnicode, bbox, TRUE, bCharCode); |
| 349 } | 353 } |
| 354 |
| 350 FX_BOOL CFGAS_GEFont::GetCharBBoxInternal(FX_WCHAR wUnicode, | 355 FX_BOOL CFGAS_GEFont::GetCharBBoxInternal(FX_WCHAR wUnicode, |
| 351 CFX_Rect& bbox, | 356 CFX_Rect& bbox, |
| 352 FX_BOOL bRecursive, | 357 FX_BOOL bRecursive, |
| 353 FX_BOOL bCharCode) { | 358 FX_BOOL bCharCode) { |
| 354 ASSERT(m_pRectArray); | 359 ASSERT(m_pRectArray); |
| 355 ASSERT(m_pBBoxMap); | 360 ASSERT(m_pBBoxMap); |
| 356 void* pRect = nullptr; | 361 void* pRect = nullptr; |
| 357 if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) { | 362 if (!m_pBBoxMap->Lookup((void*)(uintptr_t)wUnicode, pRect)) { |
| 358 CFGAS_GEFont* pFont = nullptr; | 363 CFGAS_GEFont* pFont = nullptr; |
| 359 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); | 364 int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 } | 485 } |
| 481 if (m_pRectArray) { | 486 if (m_pRectArray) { |
| 482 m_pRectArray->RemoveAll(FALSE); | 487 m_pRectArray->RemoveAll(FALSE); |
| 483 } | 488 } |
| 484 } | 489 } |
| 485 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { | 490 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { |
| 486 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; | 491 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; |
| 487 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) | 492 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) |
| 488 : m_SubstFonts[iGlyphIndex - 1]; | 493 : m_SubstFonts[iGlyphIndex - 1]; |
| 489 } | 494 } |
| OLD | NEW |