Index: xfa/fgas/font/fgas_gefont.cpp |
diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp |
index 1507fa4840a22c21e6ff185c22d390490ae77554..d3be9dcb48a44ac17de9d0651c0a680b30112304 100644 |
--- a/xfa/fgas/font/fgas_gefont.cpp |
+++ b/xfa/fgas/font/fgas_gefont.cpp |
@@ -77,26 +77,29 @@ CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) |
m_dwLogFontStyle(0), |
#endif |
m_pFont(nullptr), |
+ m_pSrcFont(nullptr), |
m_pFontMgr(pFontMgr), |
m_iRefCount(1), |
m_bExtFont(FALSE), |
m_pProvider(nullptr) { |
} |
-CFGAS_GEFont::CFGAS_GEFont(const CFGAS_GEFont& src, uint32_t dwFontStyles) |
+CFGAS_GEFont::CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles) |
: |
#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
m_bUseLogFontStyle(FALSE), |
m_dwLogFontStyle(0), |
#endif |
m_pFont(nullptr), |
- m_pFontMgr(src.m_pFontMgr), |
+ m_pSrcFont(src), |
+ m_pFontMgr(src->m_pFontMgr), |
m_iRefCount(1), |
m_bExtFont(FALSE), |
m_pProvider(nullptr) { |
- ASSERT(src.m_pFont); |
+ ASSERT(m_pSrcFont->m_pFont); |
+ m_pSrcFont->Retain(); |
m_pFont = new CFX_Font; |
- m_pFont->LoadClone(src.m_pFont); |
+ m_pFont->LoadClone(m_pSrcFont->m_pFont); |
CFX_SubstFont* pSubst = m_pFont->GetSubstFont(); |
if (!pSubst) { |
pSubst = new CFX_SubstFont; |
@@ -119,6 +122,11 @@ CFGAS_GEFont::~CFGAS_GEFont() { |
if (!m_bExtFont) |
delete m_pFont; |
+ |
+ // If it is a shallow copy of another source font, |
+ // decrease the refcount of the source font. |
+ if (m_pSrcFont) |
+ m_pSrcFont->Release(); |
} |
void CFGAS_GEFont::Release() { |
@@ -239,7 +247,7 @@ FX_BOOL CFGAS_GEFont::InitFont() { |
CFGAS_GEFont* CFGAS_GEFont::Derive(uint32_t dwFontStyles, uint16_t wCodePage) { |
if (GetFontStyles() == dwFontStyles) |
return Retain(); |
- return new CFGAS_GEFont(*this, dwFontStyles); |
+ return new CFGAS_GEFont(this, dwFontStyles); |
} |
void CFGAS_GEFont::GetFamilyName(CFX_WideString& wsFamily) const { |