diff options
author | weili <weili@chromium.org> | 2016-07-25 07:40:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-07-25 07:40:27 -0700 |
commit | 9b671ace8aec906683b05399cf8a2882ed8ef7b6 (patch) | |
tree | ca6193f08a18ffe917301fd523c6c668becb7bdb /core/fxge/ge | |
parent | d780735def22c4c2ec3a0cc89856c86486c25494 (diff) | |
download | pdfium-9b671ace8aec906683b05399cf8a2882ed8ef7b6.tar.xz |
Use smart pointers for CFX_Font and CFX_Type3Font classes
For the class owned member variables, use std::unique_ptr or
std::vector for memory management.
BUG=pdfium:518
Review-Url: https://codereview.chromium.org/2169793002
Diffstat (limited to 'core/fxge/ge')
-rw-r--r-- | core/fxge/ge/fx_ge_font.cpp | 104 |
1 files changed, 48 insertions, 56 deletions
diff --git a/core/fxge/ge/fx_ge_font.cpp b/core/fxge/ge/fx_ge_font.cpp index bd0bb0e3e5..1aa5f9fd1a 100644 --- a/core/fxge/ge/fx_ge_font.cpp +++ b/core/fxge/ge/fx_ge_font.cpp @@ -32,6 +32,41 @@ CFX_UnicodeEncodingEx* _FXFM_CreateFontEncoding(CFX_Font* pFont, return nullptr; return new CFX_UnicodeEncodingEx(pFont, nEncodingID); } + +unsigned long FTStreamRead(FXFT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count) { + if (count == 0) + return 0; + + IFX_FileRead* pFile = static_cast<IFX_FileRead*>(stream->descriptor.pointer); + return pFile->ReadBlock(buffer, offset, count) ? count : 0; +} + +void FTStreamClose(FXFT_Stream stream) {} + +FX_BOOL LoadFileImp(FXFT_Library library, + FXFT_Face* Face, + IFX_FileRead* pFile, + int32_t faceIndex, + std::unique_ptr<FXFT_StreamRec>* stream) { + std::unique_ptr<FXFT_StreamRec> stream1(new FXFT_StreamRec()); + stream1->base = nullptr; + stream1->size = static_cast<unsigned long>(pFile->GetSize()); + stream1->pos = 0; + stream1->descriptor.pointer = pFile; + stream1->close = FTStreamClose; + stream1->read = FTStreamRead; + FXFT_Open_Args args; + args.flags = FT_OPEN_STREAM; + args.stream = stream1.get(); + if (FXFT_Open_Face(library, &args, faceIndex, Face)) + return FALSE; + if (stream) + *stream = std::move(stream1); + return TRUE; +} #endif // PDF_ENABLE_XFA FXFT_Face FT_LoadFont(const uint8_t* pData, int size) { @@ -48,8 +83,6 @@ CFX_Font::CFX_Font() #else : m_Face(nullptr), #endif // PDF_ENABLE_XFA - m_pSubstFont(nullptr), - m_pFontDataAllocation(nullptr), m_pFontData(nullptr), m_pGsubData(nullptr), m_dwSize(0), @@ -67,7 +100,7 @@ FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) { m_bLogic = TRUE; if (pFont->m_pSubstFont) { - m_pSubstFont = new CFX_SubstFont; + m_pSubstFont.reset(new CFX_SubstFont); m_pSubstFont->m_Charset = pFont->m_pSubstFont->m_Charset; m_pSubstFont->m_ExtHandle = pFont->m_pSubstFont->m_ExtHandle; m_pSubstFont->m_SubstFlags = pFont->m_pSubstFont->m_SubstFlags; @@ -94,8 +127,6 @@ FX_BOOL CFX_Font::LoadClone(const CFX_Font* pFont) { #endif // PDF_ENABLE_XFA CFX_Font::~CFX_Font() { - delete m_pSubstFont; - FX_Free(m_pFontDataAllocation); #ifdef PDF_ENABLE_XFA if (m_bLogic) { m_OtfFontData.DetachBuffer(); @@ -122,10 +153,12 @@ CFX_Font::~CFX_Font() { ReleasePlatformResource(); #endif } + void CFX_Font::DeleteFace() { FXFT_Done_Face(m_Face); m_Face = nullptr; } + void CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, uint32_t flags, @@ -135,10 +168,10 @@ void CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bVertical) { m_bEmbedded = FALSE; m_bVertical = bVertical; - m_pSubstFont = new CFX_SubstFont; + m_pSubstFont.reset(new CFX_SubstFont); m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont( face_name, bTrueType, flags, weight, italic_angle, CharsetCP, - m_pSubstFont); + m_pSubstFont.get()); #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ if (m_pSubstFont->m_ExtHandle) { m_pPlatformFont = m_pSubstFont->m_ExtHandle; @@ -150,49 +183,8 @@ void CFX_Font::LoadSubst(const CFX_ByteString& face_name, m_dwSize = FXFT_Get_Face_Stream_Size(m_Face); } } -#ifdef PDF_ENABLE_XFA -extern "C" { -unsigned long _FTStreamRead(FXFT_Stream stream, - unsigned long offset, - unsigned char* buffer, - unsigned long count) { - if (count == 0) { - return 0; - } - IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer; - int res = pFile->ReadBlock(buffer, offset, count); - if (res) { - return count; - } - return 0; -} -void _FTStreamClose(FXFT_Stream stream) {} -}; -FX_BOOL _LoadFile(FXFT_Library library, - FXFT_Face* Face, - IFX_FileRead* pFile, - FXFT_Stream* stream, - int32_t faceIndex = 0) { - FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(uint8_t, sizeof(FXFT_StreamRec)); - stream1->base = nullptr; - stream1->size = (unsigned long)pFile->GetSize(); - stream1->pos = 0; - stream1->descriptor.pointer = pFile; - stream1->close = _FTStreamClose; - stream1->read = _FTStreamRead; - FXFT_Open_Args args; - args.flags = FT_OPEN_STREAM; - args.stream = stream1; - if (FXFT_Open_Face(library, &args, faceIndex, Face)) { - FX_Free(stream1); - return FALSE; - } - if (stream) { - *stream = stream1; - } - return TRUE; -} +#ifdef PDF_ENABLE_XFA FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile, int nFaceIndex, int* pFaceCount) { @@ -202,13 +194,13 @@ FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile, pFontMgr->InitFTLibrary(); FXFT_Library library = pFontMgr->GetFTLibrary(); - FXFT_Stream stream = nullptr; - if (!_LoadFile(library, &m_Face, pFile, &stream, nFaceIndex)) + std::unique_ptr<FXFT_StreamRec> stream; + if (!LoadFileImp(library, &m_Face, pFile, nFaceIndex, &stream)) return FALSE; if (pFaceCount) *pFaceCount = (int)m_Face->num_faces; - m_pOwnedStream = stream; + m_pOwnedStream = stream.release(); FXFT_Set_Pixel_Sizes(m_Face, 0, 64); return TRUE; } @@ -233,10 +225,10 @@ int CFX_Font::GetGlyphWidth(uint32_t glyph_index) { } FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, uint32_t size) { - m_pFontDataAllocation = FX_Alloc(uint8_t, size); - FXSYS_memcpy(m_pFontDataAllocation, data, size); - m_Face = FT_LoadFont(m_pFontDataAllocation, size); - m_pFontData = m_pFontDataAllocation; + std::vector<uint8_t> temp(data, data + size); + m_pFontDataAllocation.swap(temp); + m_Face = FT_LoadFont(m_pFontDataAllocation.data(), size); + m_pFontData = m_pFontDataAllocation.data(); m_bEmbedded = TRUE; m_dwSize = size; return !!m_Face; |