diff options
Diffstat (limited to 'xfa')
-rw-r--r-- | xfa/fgas/font/fgas_gefont.cpp | 18 | ||||
-rw-r--r-- | xfa/fgas/font/fgas_gefont.h | 3 |
2 files changed, 15 insertions, 6 deletions
diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp index 1507fa4840..d3be9dcb48 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 { diff --git a/xfa/fgas/font/fgas_gefont.h b/xfa/fgas/font/fgas_gefont.h index cdb19338a2..d139d445f4 100644 --- a/xfa/fgas/font/fgas_gefont.h +++ b/xfa/fgas/font/fgas_gefont.h @@ -65,7 +65,7 @@ class CFGAS_GEFont { protected: explicit CFGAS_GEFont(IFGAS_FontMgr* pFontMgr); - CFGAS_GEFont(const CFGAS_GEFont& src, uint32_t dwFontStyles); + CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles); #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ FX_BOOL LoadFontInternal(const FX_WCHAR* pszFontFamily, @@ -94,6 +94,7 @@ class CFGAS_GEFont { uint32_t m_dwLogFontStyle; #endif CFX_Font* m_pFont; + CFGAS_GEFont* const m_pSrcFont; IFGAS_FontMgr* const m_pFontMgr; int32_t m_iRefCount; FX_BOOL m_bExtFont; |