| Index: xfa/fgas/font/fgas_gefont.cpp
|
| diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp
|
| index 8233705342108a9fbaa5a872b733003ec64f71dd..c272f9160d897944df886c56c8cf7d75ffdc5bcc 100644
|
| --- a/xfa/fgas/font/fgas_gefont.cpp
|
| +++ b/xfa/fgas/font/fgas_gefont.cpp
|
| @@ -6,6 +6,9 @@
|
|
|
| #include "xfa/fgas/font/fgas_gefont.h"
|
|
|
| +#include <memory>
|
| +#include <utility>
|
| +
|
| #include "core/fxge/include/cfx_substfont.h"
|
| #include "core/fxge/include/cfx_unicodeencoding.h"
|
| #include "core/fxge/include/cfx_unicodeencodingex.h"
|
| @@ -19,9 +22,8 @@ CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily,
|
| uint16_t wCodePage,
|
| IFGAS_FontMgr* pFontMgr) {
|
| #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| - if (pFontMgr) {
|
| + if (pFontMgr)
|
| return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
|
| - }
|
| return nullptr;
|
| #else
|
| CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr);
|
| @@ -284,69 +286,72 @@ void CFGAS_GEFont::GetFamilyName(CFX_WideString& wsFamily) const {
|
| uint32_t CFGAS_GEFont::GetFontStyles() const {
|
| ASSERT(m_pFont);
|
| #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
|
| - if (m_bUseLogFontStyle) {
|
| + if (m_bUseLogFontStyle)
|
| return m_dwLogFontStyle;
|
| - }
|
| #endif
|
| +
|
| uint32_t dwStyles = 0;
|
| - if (!m_pFont->GetSubstFont()) {
|
| - if (m_pFont->IsBold()) {
|
| + auto* pSubstFont = m_pFont->GetSubstFont();
|
| + if (pSubstFont) {
|
| + if (pSubstFont->m_Weight == FXFONT_FW_BOLD)
|
| dwStyles |= FX_FONTSTYLE_Bold;
|
| - }
|
| - if (m_pFont->IsItalic()) {
|
| + if (pSubstFont->m_SubstFlags & FXFONT_SUBST_ITALIC)
|
| dwStyles |= FX_FONTSTYLE_Italic;
|
| - }
|
| } else {
|
| - if (m_pFont->GetSubstFont()->m_Weight == FXFONT_FW_BOLD) {
|
| + if (m_pFont->IsBold())
|
| dwStyles |= FX_FONTSTYLE_Bold;
|
| - }
|
| - if (m_pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_ITALIC) {
|
| + if (m_pFont->IsItalic())
|
| dwStyles |= FX_FONTSTYLE_Italic;
|
| - }
|
| }
|
| return dwStyles;
|
| }
|
| +
|
| FX_BOOL CFGAS_GEFont::GetCharWidth(FX_WCHAR wUnicode,
|
| int32_t& iWidth,
|
| - FX_BOOL bCharCode) {
|
| - return GetCharWidthInternal(wUnicode, iWidth, TRUE, bCharCode);
|
| + bool bCharCode) {
|
| + return GetCharWidthInternal(wUnicode, iWidth, true, bCharCode);
|
| }
|
| +
|
| FX_BOOL CFGAS_GEFont::GetCharWidthInternal(FX_WCHAR wUnicode,
|
| int32_t& iWidth,
|
| - FX_BOOL bRecursive,
|
| - FX_BOOL bCharCode) {
|
| + bool bRecursive,
|
| + bool bCharCode) {
|
| ASSERT(m_pCharWidthMap);
|
| iWidth = m_pCharWidthMap->GetAt(wUnicode, 0);
|
| - if (iWidth < 1) {
|
| - if (!m_pProvider ||
|
| - !m_pProvider->GetCharWidth(this, wUnicode, iWidth, bCharCode)) {
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
|
| - if (iGlyph != 0xFFFF && pFont) {
|
| - if (pFont == this) {
|
| - iWidth = m_pFont->GetGlyphWidth(iGlyph);
|
| - if (iWidth < 0) {
|
| - iWidth = -1;
|
| - }
|
| - } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, FALSE,
|
| - bCharCode)) {
|
| - return TRUE;
|
| + if (iWidth == 65535)
|
| + return FALSE;
|
| +
|
| + if (iWidth > 0)
|
| + return TRUE;
|
| +
|
| + if (!m_pProvider ||
|
| + !m_pProvider->GetCharWidth(this, wUnicode, bCharCode, &iWidth)) {
|
| + CFGAS_GEFont* pFont = nullptr;
|
| + int32_t iGlyph = GetGlyphIndex(wUnicode, TRUE, &pFont, bCharCode);
|
| + if (iGlyph != 0xFFFF && pFont) {
|
| + if (pFont == this) {
|
| + iWidth = m_pFont->GetGlyphWidth(iGlyph);
|
| + if (iWidth < 0) {
|
| + iWidth = -1;
|
| }
|
| - } else {
|
| - iWidth = -1;
|
| + } else if (pFont->GetCharWidthInternal(wUnicode, iWidth, false,
|
| + bCharCode)) {
|
| + return TRUE;
|
| }
|
| + } else {
|
| + iWidth = -1;
|
| }
|
| - m_pCharWidthMap->SetAtGrow(wUnicode, (int16_t)iWidth);
|
| - } else if (iWidth == 65535) {
|
| - iWidth = -1;
|
| }
|
| + m_pCharWidthMap->SetAtGrow(wUnicode, iWidth);
|
| return iWidth > 0;
|
| }
|
| +
|
| FX_BOOL CFGAS_GEFont::GetCharBBox(FX_WCHAR wUnicode,
|
| CFX_Rect& bbox,
|
| FX_BOOL bCharCode) {
|
| return GetCharBBoxInternal(wUnicode, bbox, TRUE, bCharCode);
|
| }
|
| +
|
| FX_BOOL CFGAS_GEFont::GetCharBBoxInternal(FX_WCHAR wUnicode,
|
| CFX_Rect& bbox,
|
| FX_BOOL bRecursive,
|
|
|