Introduce unique_ptr deleters for FT objects. Change-Id: I9dff4bbac8e60d5eda3b44367f65c964dcffd4f0 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55755 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp index 597e9f0..7d853ff 100644 --- a/core/fxge/android/cfpf_skiafontmgr.cpp +++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -232,14 +232,19 @@ CFPF_SkiaFontMgr::~CFPF_SkiaFontMgr() { m_FamilyFonts.clear(); m_FontFaces.clear(); - if (m_FTLibrary) - FT_Done_FreeType(m_FTLibrary); } bool CFPF_SkiaFontMgr::InitFTLibrary() { - if (!m_FTLibrary) - FT_Init_FreeType(&m_FTLibrary); - return !!m_FTLibrary; + if (m_FTLibrary) + return true; + + FXFT_LibraryRec* pLibrary = nullptr; + FT_Init_FreeType(&pLibrary); + if (!pLibrary) + return false; + + m_FTLibrary.reset(pLibrary); + return true; } void CFPF_SkiaFontMgr::LoadSystemFonts() { @@ -342,7 +347,7 @@ args.flags = FT_OPEN_PATHNAME; args.pathname = const_cast<FT_String*>(bsFile.unterminated_c_str()); FXFT_FaceRec* face; - if (FT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) + if (FT_Open_Face(m_FTLibrary.get(), &args, iFaceIndex, &face)) return nullptr; FT_Set_Pixel_Sizes(face, 0, 64); return face;
diff --git a/core/fxge/android/cfpf_skiafontmgr.h b/core/fxge/android/cfpf_skiafontmgr.h index 49d1516..3b660f5 100644 --- a/core/fxge/android/cfpf_skiafontmgr.h +++ b/core/fxge/android/cfpf_skiafontmgr.h
@@ -37,7 +37,7 @@ const ByteString& file); bool m_bLoaded = false; - FXFT_LibraryRec* m_FTLibrary = nullptr; + ScopedFXFTLibraryRec m_FTLibrary; std::vector<std::unique_ptr<CFPF_SkiaPathFont>> m_FontFaces; std::map<uint32_t, std::unique_ptr<CFPF_SkiaFont>> m_FamilyFonts; };
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp index 9e792d0..c3df1cb 100644 --- a/core/fxge/cfx_fontmapper.cpp +++ b/core/fxge/cfx_fontmapper.cpp
@@ -255,23 +255,9 @@ } // namespace -CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) - : m_bListLoaded(false), m_pFontMgr(mgr) { - m_MMFaces[0] = nullptr; - m_MMFaces[1] = nullptr; - memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces)); -} +CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr) : m_pFontMgr(mgr) {} -CFX_FontMapper::~CFX_FontMapper() { - for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) { - if (m_FoxitFaces[i]) - FT_Done_Face(m_FoxitFaces[i]); - } - if (m_MMFaces[0]) - FT_Done_Face(m_MMFaces[0]); - if (m_MMFaces[1]) - FT_Done_Face(m_MMFaces[1]); -} +CFX_FontMapper::~CFX_FontMapper() = default; void CFX_FontMapper::SetSystemFontInfo( std::unique_ptr<SystemFontInfoIface> pFontInfo) { @@ -357,12 +343,13 @@ int pitch_family) { if (iBaseFont < kNumStandardFonts) { if (m_FoxitFaces[iBaseFont]) - return m_FoxitFaces[iBaseFont]; + return m_FoxitFaces[iBaseFont].get(); Optional<pdfium::span<const uint8_t>> font_data = m_pFontMgr->GetBuiltinFont(iBaseFont); if (font_data.has_value()) { - m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(font_data.value(), 0); - return m_FoxitFaces[iBaseFont]; + m_FoxitFaces[iBaseFont].reset( + m_pFontMgr->GetFixedFace(font_data.value(), 0)); + return m_FoxitFaces[iBaseFont].get(); } } pSubstFont->m_bFlagMM = true; @@ -373,17 +360,17 @@ pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5; pSubstFont->m_Family = "Chrome Serif"; if (!m_MMFaces[1]) { - m_MMFaces[1] = - m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(14).value(), 0); + m_MMFaces[1].reset( + m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(14).value(), 0)); } - return m_MMFaces[1]; + return m_MMFaces[1].get(); } pSubstFont->m_Family = "Chrome Sans"; if (!m_MMFaces[0]) { - m_MMFaces[0] = - m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(15).value(), 0); + m_MMFaces[0].reset( + m_pFontMgr->GetFixedFace(m_pFontMgr->GetBuiltinFont(15).value(), 0)); } - return m_MMFaces[0]; + return m_MMFaces[0].get(); } FXFT_FaceRec* CFX_FontMapper::FindSubstFont(const ByteString& name, @@ -673,11 +660,11 @@ bool CFX_FontMapper::IsBuiltinFace(const FXFT_FaceRec* face) const { for (size_t i = 0; i < MM_FACE_COUNT; ++i) { - if (m_MMFaces[i] == face) + if (m_MMFaces[i].get() == face) return true; } for (size_t i = 0; i < FOXIT_FACE_COUNT; ++i) { - if (m_FoxitFaces[i] == face) + if (m_FoxitFaces[i].get() == face) return true; } return false;
diff --git a/core/fxge/cfx_fontmapper.h b/core/fxge/cfx_fontmapper.h index 8096976..7b9b00b 100644 --- a/core/fxge/cfx_fontmapper.h +++ b/core/fxge/cfx_fontmapper.h
@@ -71,13 +71,13 @@ uint32_t charset; }; - bool m_bListLoaded; + bool m_bListLoaded = false; ByteString m_LastFamily; std::vector<FaceData> m_FaceArray; std::unique_ptr<SystemFontInfoIface> m_pFontInfo; UnownedPtr<CFX_FontMgr> const m_pFontMgr; - FXFT_FaceRec* m_MMFaces[MM_FACE_COUNT]; - FXFT_FaceRec* m_FoxitFaces[FOXIT_FACE_COUNT]; + ScopedFXFTFaceRec m_MMFaces[MM_FACE_COUNT]; + ScopedFXFTFaceRec m_FoxitFaces[FOXIT_FACE_COUNT]; }; #endif // CORE_FXGE_CFX_FONTMAPPER_H_
diff --git a/core/fxge/cfx_fontmgr.cpp b/core/fxge/cfx_fontmgr.cpp index aff16d1..28a7e1e 100644 --- a/core/fxge/cfx_fontmgr.cpp +++ b/core/fxge/cfx_fontmgr.cpp
@@ -79,19 +79,15 @@ CFX_FontMgr::CFX_FontMgr() : m_pBuiltinMapper(pdfium::MakeUnique<CFX_FontMapper>(this)) {} -CFX_FontMgr::~CFX_FontMgr() { - // |m_FaceMap| and |m_pBuiltinMapper| reference |m_FTLibrary|, so they must - // be destroyed first. - m_FaceMap.clear(); - m_pBuiltinMapper.reset(); - FT_Done_FreeType(m_FTLibrary); -} +CFX_FontMgr::~CFX_FontMgr() = default; void CFX_FontMgr::InitFTLibrary() { if (m_FTLibrary) return; - FT_Init_FreeType(&m_FTLibrary); + FXFT_LibraryRec* pLibrary = nullptr; + FT_Init_FreeType(&pLibrary); + m_FTLibrary.reset(pLibrary); m_FTLibrarySupportsHinting = SetLcdFilterMode() || FreeTypeVersionSupportsHinting(); } @@ -137,8 +133,8 @@ InitFTLibrary(); FXFT_FaceRec* face = nullptr; - int ret = - FT_New_Memory_Face(m_FTLibrary, pData.get(), size, face_index, &face); + int ret = FT_New_Memory_Face(m_FTLibrary.get(), pData.get(), size, face_index, + &face); if (ret) return nullptr; @@ -192,8 +188,8 @@ int face_index) { InitFTLibrary(); FXFT_FaceRec* face = nullptr; - if (FT_New_Memory_Face(m_FTLibrary, span.data(), span.size(), face_index, - &face)) { + if (FT_New_Memory_Face(m_FTLibrary.get(), span.data(), span.size(), + face_index, &face)) { return nullptr; } return FT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face; @@ -235,7 +231,7 @@ FT_Int major; FT_Int minor; FT_Int patch; - FT_Library_Version(m_FTLibrary, &major, &minor, &patch); + FT_Library_Version(m_FTLibrary.get(), &major, &minor, &patch); // Freetype versions >= 2.8.1 support hinting even if subpixel rendering is // disabled. https://sourceforge.net/projects/freetype/files/freetype2/2.8.1/ return major > 2 || (major == 2 && minor > 8) || @@ -243,6 +239,6 @@ } bool CFX_FontMgr::SetLcdFilterMode() const { - return FT_Library_SetLcdFilter(m_FTLibrary, FT_LCD_FILTER_DEFAULT) != + return FT_Library_SetLcdFilter(m_FTLibrary.get(), FT_LCD_FILTER_DEFAULT) != FT_Err_Unimplemented_Feature; }
diff --git a/core/fxge/cfx_fontmgr.h b/core/fxge/cfx_fontmgr.h index f021866..bb388db 100644 --- a/core/fxge/cfx_fontmgr.h +++ b/core/fxge/cfx_fontmgr.h
@@ -63,16 +63,18 @@ // Always present. CFX_FontMapper* GetBuiltinMapper() const { return m_pBuiltinMapper.get(); } - FXFT_LibraryRec* GetFTLibrary() const { return m_FTLibrary; } + FXFT_LibraryRec* GetFTLibrary() const { return m_FTLibrary.get(); } bool FTLibrarySupportsHinting() const { return m_FTLibrarySupportsHinting; } private: bool FreeTypeVersionSupportsHinting() const; bool SetLcdFilterMode() const; + // Must come before |m_pBuiltinMapper| and |m_FaceMap|. + ScopedFXFTLibraryRec m_FTLibrary; + std::unique_ptr<CFX_FontMapper> m_pBuiltinMapper; std::map<ByteString, std::unique_ptr<CTTFontDesc>> m_FaceMap; - FXFT_LibraryRec* m_FTLibrary = nullptr; bool m_FTLibrarySupportsHinting = false; };
diff --git a/core/fxge/fx_freetype.h b/core/fxge/fx_freetype.h index 0832d50..2dd379a 100644 --- a/core/fxge/fx_freetype.h +++ b/core/fxge/fx_freetype.h
@@ -8,6 +8,9 @@ #define CORE_FXGE_FX_FREETYPE_H_ #include <ft2build.h> + +#include <memory> + #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_LCD_FILTER_H @@ -20,6 +23,24 @@ using FXFT_StreamRec = struct FT_StreamRec_; using FXFT_MM_VarPtr = FT_MM_Var*; +struct FXFTFaceRecDeleter { + inline void operator()(FXFT_FaceRec* pRec) { + if (pRec) + FT_Done_Face(pRec); + } +}; + +struct FXFTLibraryRecDeleter { + inline void operator()(FXFT_LibraryRec* pRec) { + if (pRec) + FT_Done_FreeType(pRec); + } +}; + +using ScopedFXFTFaceRec = std::unique_ptr<FXFT_FaceRec, FXFTFaceRecDeleter>; +using ScopedFXFTLibraryRec = + std::unique_ptr<FXFT_LibraryRec, FXFTLibraryRecDeleter>; + #define FXFT_Select_Charmap(face, encoding) \ FT_Select_Charmap(face, static_cast<FT_Encoding>(encoding)) #define FXFT_Get_Name_Index(face, name) \