| Index: core/fxge/ge/fx_ge_font.cpp
|
| diff --git a/core/fxge/ge/fx_ge_font.cpp b/core/fxge/ge/fx_ge_font.cpp
|
| index bd0bb0e3e52f56f46b917d276e095e9787d38a17..1aa5f9fd1a6963e0340f89542b8d7217260d6d4c 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;
|
|
|