summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fxge/ge/cfx_font.cpp8
-rw-r--r--core/fxge/include/fx_font.h4
-rw-r--r--xfa/fgas/font/fgas_gefont.cpp18
-rw-r--r--xfa/fgas/font/fgas_gefont.h3
4 files changed, 21 insertions, 12 deletions
diff --git a/core/fxge/ge/cfx_font.cpp b/core/fxge/ge/cfx_font.cpp
index 4aefec8d43..3d2e6d6499 100644
--- a/core/fxge/ge/cfx_font.cpp
+++ b/core/fxge/ge/cfx_font.cpp
@@ -220,7 +220,7 @@ const uint8_t CFX_Font::s_WeightPow_SHIFTJIS[] = {
CFX_Font::CFX_Font()
:
#ifdef PDF_ENABLE_XFA
- m_bLogic(FALSE),
+ m_bShallowCopy(false),
m_pOwnedStream(nullptr),
#endif // PDF_ENABLE_XFA
m_Face(nullptr),
@@ -239,7 +239,7 @@ FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) {
if (!pFont)
return FALSE;
- m_bLogic = TRUE;
+ m_bShallowCopy = true;
if (pFont->m_pSubstFont) {
m_pSubstFont.reset(new CFX_SubstFont);
m_pSubstFont->m_Charset = pFont->m_pSubstFont->m_Charset;
@@ -268,7 +268,7 @@ FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) {
CFX_Font::~CFX_Font() {
#ifdef PDF_ENABLE_XFA
- if (m_bLogic) {
+ if (m_bShallowCopy) {
m_OtfFontData.DetachBuffer();
return;
}
@@ -285,7 +285,7 @@ CFX_Font::~CFX_Font() {
CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
}
#ifdef PDF_ENABLE_XFA
- FX_Free(m_pOwnedStream);
+ delete m_pOwnedStream;
#endif // PDF_ENABLE_XFA
FX_Free(m_pGsubData);
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && !defined _SKIA_SUPPORT_
diff --git a/core/fxge/include/fx_font.h b/core/fxge/include/fx_font.h
index cdde643770..a607f3e0d5 100644
--- a/core/fxge/include/fx_font.h
+++ b/core/fxge/include/fx_font.h
@@ -151,8 +151,8 @@ class CFX_Font {
#ifdef PDF_ENABLE_XFA
protected:
CFX_BinaryBuf m_OtfFontData;
- FX_BOOL m_bLogic;
- void* m_pOwnedStream;
+ bool m_bShallowCopy;
+ FXFT_StreamRec* m_pOwnedStream;
#endif // PDF_ENABLE_XFA
private:
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;