summaryrefslogtreecommitdiff
path: root/xfa/fgas/font/cfgas_gefont.h
diff options
context:
space:
mode:
authortsepez <tsepez@chromium.org>2017-01-05 12:57:00 -0800
committerCommit bot <commit-bot@chromium.org>2017-01-05 12:57:00 -0800
commite647799f6a2f7f747c9f55d9f0ce08dcdfbd53f4 (patch)
tree282c502bd9f807f385d0cbcc1692bb475c8a4df1 /xfa/fgas/font/cfgas_gefont.h
parent6bb3b894488fd6f38c096b708980a9f08286ac5c (diff)
downloadpdfium-e647799f6a2f7f747c9f55d9f0ce08dcdfbd53f4.tar.xz
Properly ref-count CFGAS_GEFont with CFX_RetainPtr.
We worry about cyclical references, but no leaks found. Review-Url: https://codereview.chromium.org/2609423003
Diffstat (limited to 'xfa/fgas/font/cfgas_gefont.h')
-rw-r--r--xfa/fgas/font/cfgas_gefont.h58
1 files changed, 32 insertions, 26 deletions
diff --git a/xfa/fgas/font/cfgas_gefont.h b/xfa/fgas/font/cfgas_gefont.h
index 86e5e4c955..962b93fbb5 100644
--- a/xfa/fgas/font/cfgas_gefont.h
+++ b/xfa/fgas/font/cfgas_gefont.h
@@ -9,40 +9,47 @@
#include <map>
#include <memory>
+#include <vector>
+#include "core/fxcrt/cfx_retain_ptr.h"
#include "core/fxcrt/fx_memory.h"
#include "xfa/fgas/crt/fgas_utils.h"
#include "xfa/fgas/font/cfgas_fontmgr.h"
#define FXFONT_SUBST_ITALIC 0x02
+class CFGAS_FontMgr;
class CFX_UnicodeEncoding;
class CXFA_PDFFontMgr;
-class CFGAS_GEFont {
+class CFGAS_GEFont : public CFX_Retainable {
public:
- static CFGAS_GEFont* LoadFont(const FX_WCHAR* pszFontFamily,
- uint32_t dwFontStyles,
- uint16_t wCodePage,
- CFGAS_FontMgr* pFontMgr);
- static CFGAS_GEFont* LoadFont(CFX_Font* pExternalFont,
- CFGAS_FontMgr* pFontMgr);
- static CFGAS_GEFont* LoadFont(std::unique_ptr<CFX_Font> pInternalFont,
- CFGAS_FontMgr* pFontMgr);
+ template <typename T, typename... Args>
+ friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
+ static CFX_RetainPtr<CFGAS_GEFont> LoadFont(const FX_WCHAR* pszFontFamily,
+ uint32_t dwFontStyles,
+ uint16_t wCodePage,
+ CFGAS_FontMgr* pFontMgr);
+ static CFX_RetainPtr<CFGAS_GEFont> LoadFont(CFX_Font* pExternalFont,
+ CFGAS_FontMgr* pFontMgr);
+ static CFX_RetainPtr<CFGAS_GEFont> LoadFont(
+ std::unique_ptr<CFX_Font> pInternalFont,
+ CFGAS_FontMgr* pFontMgr);
#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
- static CFGAS_GEFont* LoadFont(const uint8_t* pBuffer,
- int32_t iLength,
- CFGAS_FontMgr* pFontMgr);
- static CFGAS_GEFont* LoadFont(const CFX_RetainPtr<IFGAS_Stream>& pFontStream,
- CFGAS_FontMgr* pFontMgr,
- bool bSaveStream);
+ static CFX_RetainPtr<CFGAS_GEFont> LoadFont(const uint8_t* pBuffer,
+ int32_t iLength,
+ CFGAS_FontMgr* pFontMgr);
+ static CFX_RetainPtr<CFGAS_GEFont> LoadFont(
+ const CFX_RetainPtr<IFGAS_Stream>& pFontStream,
+ CFGAS_FontMgr* pFontMgr,
+ bool bSaveStream);
#endif
- ~CFGAS_GEFont();
+ ~CFGAS_GEFont() override;
- void Release();
- CFGAS_GEFont* Retain();
- CFGAS_GEFont* Derive(uint32_t dwFontStyles, uint16_t wCodePage = 0);
+ CFX_RetainPtr<CFGAS_GEFont> Derive(uint32_t dwFontStyles,
+ uint16_t wCodePage = 0);
uint32_t GetFontStyles() const;
bool GetCharWidth(FX_WCHAR wUnicode, int32_t& iWidth, bool bCharCode);
int32_t GetGlyphIndex(FX_WCHAR wUnicode, bool bCharCode = false);
@@ -50,7 +57,7 @@ class CFGAS_GEFont {
int32_t GetDescent() const;
bool GetCharBBox(FX_WCHAR wUnicode, CFX_Rect& bbox, bool bCharCode = false);
bool GetBBox(CFX_Rect& bbox);
- CFGAS_GEFont* GetSubstFont(int32_t iGlyphIndex) const;
+ CFX_RetainPtr<CFGAS_GEFont> GetSubstFont(int32_t iGlyphIndex) const;
CFX_Font* GetDevFont() const { return m_pFont; }
void SetFontProvider(CXFA_PDFFontMgr* pProvider) { m_pProvider = pProvider; }
#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
@@ -62,7 +69,7 @@ class CFGAS_GEFont {
private:
explicit CFGAS_GEFont(CFGAS_FontMgr* pFontMgr);
- CFGAS_GEFont(CFGAS_GEFont* src, uint32_t dwFontStyles);
+ CFGAS_GEFont(const CFX_RetainPtr<CFGAS_GEFont>& src, uint32_t dwFontStyles);
#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
bool LoadFontInternal(const FX_WCHAR* pszFontFamily,
@@ -85,7 +92,7 @@ class CFGAS_GEFont {
bool bCharCode);
int32_t GetGlyphIndex(FX_WCHAR wUnicode,
bool bRecursive,
- CFGAS_GEFont** ppFont,
+ CFX_RetainPtr<CFGAS_GEFont>* ppFont,
bool bCharCode = false);
CFX_WideString GetFamilyName() const;
@@ -94,9 +101,8 @@ class CFGAS_GEFont {
uint32_t m_dwLogFontStyle;
#endif
CFX_Font* m_pFont;
- CFGAS_GEFont* const m_pSrcFont;
+ CFX_RetainPtr<CFGAS_GEFont> m_pSrcFont; // Only set by ctor, so no cycles.
CFGAS_FontMgr* const m_pFontMgr;
- int32_t m_iRefCount;
bool m_bExternalFont;
CFX_RetainPtr<IFGAS_Stream> m_pStream;
CFX_RetainPtr<IFX_SeekableReadStream> m_pFileRead;
@@ -105,8 +111,8 @@ class CFGAS_GEFont {
std::unique_ptr<CFX_MassArrayTemplate<CFX_Rect>> m_pRectArray;
std::unique_ptr<CFX_MapPtrToPtr> m_pBBoxMap;
CXFA_PDFFontMgr* m_pProvider; // not owned.
- CFX_ArrayTemplate<CFGAS_GEFont*> m_SubstFonts;
- std::map<FX_WCHAR, CFGAS_GEFont*> m_FontMapper;
+ std::vector<CFX_RetainPtr<CFGAS_GEFont>> m_SubstFonts;
+ std::map<FX_WCHAR, CFX_RetainPtr<CFGAS_GEFont>> m_FontMapper;
};
#endif // XFA_FGAS_FONT_CFGAS_GEFONT_H_