Index: xfa/fgas/font/cfgas_fontmgr.cpp |
diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp |
index f211e64bc3486d24bf5bea6343fb4b2c613a9b8e..060dd95b48aff8aade8d7c94a1bd5d65d3844cf3 100644 |
--- a/xfa/fgas/font/cfgas_fontmgr.cpp |
+++ b/xfa/fgas/font/cfgas_fontmgr.cpp |
@@ -607,13 +607,6 @@ CFGAS_FontMgr::~CFGAS_FontMgr() { |
delete pFonts; |
} |
m_Hash2Fonts.RemoveAll(); |
- pos = m_IFXFont2FileRead.GetStartPosition(); |
- while (pos) { |
- CFGAS_GEFont* pFont; |
- IFX_SeekableReadStream* pFileRead; |
- m_IFXFont2FileRead.GetNextAssoc(pos, pFont, pFileRead); |
- pFileRead->Release(); |
- } |
} |
bool CFGAS_FontMgr::EnumFontsFromFontMapper() { |
@@ -628,7 +621,7 @@ bool CFGAS_FontMgr::EnumFontsFromFontMapper() { |
pSystemFontInfo->EnumFontList(pFontMapper); |
for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) { |
- IFX_SeekableReadStream* pFontStream = |
+ CFX_RetainPtr<IFX_SeekableReadStream> pFontStream = |
CreateFontStream(pFontMapper, pSystemFontInfo, i); |
if (!pFontStream) |
continue; |
@@ -636,19 +629,15 @@ bool CFGAS_FontMgr::EnumFontsFromFontMapper() { |
CFX_WideString wsFaceName = |
CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str()); |
RegisterFaces(pFontStream, &wsFaceName); |
- pFontStream->Release(); |
} |
- if (m_InstalledFonts.GetSize() == 0) |
- return false; |
- |
- return true; |
+ return m_InstalledFonts.GetSize() != 0; |
} |
bool CFGAS_FontMgr::EnumFontsFromFiles() { |
CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary(); |
FX_POSITION pos = m_pFontSource->GetStartPosition(); |
IFX_FileAccess* pFontSource = nullptr; |
- IFX_SeekableReadStream* pFontStream = nullptr; |
+ CFX_RetainPtr<IFX_SeekableReadStream> pFontStream; |
while (pos) { |
pFontSource = m_pFontSource->GetNext(pos); |
pFontStream = pFontSource->CreateFileStream(FX_FILEMODE_ReadOnly); |
@@ -657,12 +646,9 @@ bool CFGAS_FontMgr::EnumFontsFromFiles() { |
continue; |
} |
RegisterFaces(pFontStream, nullptr); |
- pFontStream->Release(); |
pFontSource->Release(); |
} |
- if (m_InstalledFonts.GetSize() == 0) |
- return false; |
- return true; |
+ return m_InstalledFonts.GetSize() != 0; |
} |
bool CFGAS_FontMgr::EnumFonts() { |
@@ -765,7 +751,7 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode, |
bool CFGAS_FontMgr::VerifyUnicode(CFX_FontDescriptor* pDesc, |
FX_WCHAR wcUnicode) { |
- IFX_SeekableReadStream* pFileRead = |
+ CFX_RetainPtr<IFX_SeekableReadStream> pFileRead = |
CreateFontStream(pDesc->m_wsFaceName.UTF8Encode()); |
if (!pFileRead) |
return false; |
@@ -773,12 +759,12 @@ bool CFGAS_FontMgr::VerifyUnicode(CFX_FontDescriptor* pDesc, |
FXFT_Face pFace = LoadFace(pFileRead, pDesc->m_nFaceIndex); |
FT_Error retCharmap = FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE); |
FT_Error retIndex = FXFT_Get_Char_Index(pFace, wcUnicode); |
- pFileRead->Release(); |
if (!pFace) |
return false; |
if (FXFT_Get_Face_External_Stream(pFace)) |
FXFT_Clear_Face_External_Stream(pFace); |
+ |
FXFT_Done_Face(pFace); |
return !retCharmap && retIndex; |
} |
@@ -811,24 +797,20 @@ CFGAS_GEFont* CFGAS_FontMgr::LoadFont(const CFX_WideString& wsFaceName, |
if (!pSystemFontInfo) |
return nullptr; |
- IFX_SeekableReadStream* pFontStream = |
+ CFX_RetainPtr<IFX_SeekableReadStream> pFontStream = |
CreateFontStream(wsFaceName.UTF8Encode()); |
if (!pFontStream) |
return nullptr; |
- std::unique_ptr<CFX_Font> pInternalFont(new CFX_Font()); |
- if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) { |
- pFontStream->Release(); |
+ auto pInternalFont = pdfium::MakeUnique<CFX_Font>(); |
+ if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) |
return nullptr; |
- } |
CFGAS_GEFont* pFont = CFGAS_GEFont::LoadFont(std::move(pInternalFont), this); |
- if (!pFont) { |
- pFontStream->Release(); |
+ if (!pFont) |
return nullptr; |
- } |
- m_IFXFont2FileRead.SetAt(pFont, pFontStream); |
+ m_IFXFont2FileRead[pFont] = pFontStream; |
if (pFaceCount) |
*pFaceCount = pFont->GetDevFont()->GetFace()->num_faces; |
@@ -845,24 +827,26 @@ unsigned long _ftStreamRead(FXFT_Stream stream, |
return 0; |
IFX_SeekableReadStream* pFile = |
- (IFX_SeekableReadStream*)stream->descriptor.pointer; |
- int res = pFile->ReadBlock(buffer, offset, count); |
- if (res) |
- return count; |
- return 0; |
+ static_cast<IFX_SeekableReadStream*>(stream->descriptor.pointer); |
+ if (!pFile->ReadBlock(buffer, offset, count)) |
+ return 0; |
+ |
+ return count; |
} |
void _ftStreamClose(FXFT_Stream stream) {} |
}; // extern "C" |
-FXFT_Face CFGAS_FontMgr::LoadFace(IFX_SeekableReadStream* pFontStream, |
- int32_t iFaceIndex) { |
+FXFT_Face CFGAS_FontMgr::LoadFace( |
+ const CFX_RetainPtr<IFX_SeekableReadStream>& pFontStream, |
+ int32_t iFaceIndex) { |
if (!pFontStream) |
return nullptr; |
CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); |
pFontMgr->InitFTLibrary(); |
+ |
FXFT_Library library = pFontMgr->GetFTLibrary(); |
if (!library) |
return nullptr; |
@@ -870,7 +854,7 @@ FXFT_Face CFGAS_FontMgr::LoadFace(IFX_SeekableReadStream* pFontStream, |
FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1); |
FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec)); |
ftStream->base = nullptr; |
- ftStream->descriptor.pointer = pFontStream; |
+ ftStream->descriptor.pointer = static_cast<void*>(pFontStream.Get()); |
ftStream->pos = 0; |
ftStream->size = static_cast<unsigned long>(pFontStream->GetSize()); |
ftStream->read = _ftStreamRead; |
@@ -891,7 +875,7 @@ FXFT_Face CFGAS_FontMgr::LoadFace(IFX_SeekableReadStream* pFontStream, |
return pFace; |
} |
-IFX_SeekableReadStream* CFGAS_FontMgr::CreateFontStream( |
+CFX_RetainPtr<IFX_SeekableReadStream> CFGAS_FontMgr::CreateFontStream( |
CFX_FontMapper* pFontMapper, |
IFX_SystemFontInfo* pSystemFontInfo, |
uint32_t index) { |
@@ -912,11 +896,10 @@ IFX_SeekableReadStream* CFGAS_FontMgr::CreateFontStream( |
return IFX_MemoryStream::Create(pBuffer, dwFileSize, true); |
} |
-IFX_SeekableReadStream* CFGAS_FontMgr::CreateFontStream( |
+CFX_RetainPtr<IFX_SeekableReadStream> CFGAS_FontMgr::CreateFontStream( |
const CFX_ByteString& bsFaceName) { |
CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr(); |
CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper(); |
- |
if (!pFontMapper) |
return nullptr; |
@@ -1039,11 +1022,8 @@ void CFGAS_FontMgr::RemoveFont(CFGAS_GEFont* pEFont) { |
if (!pEFont) |
return; |
- IFX_SeekableReadStream* pFileRead; |
- if (m_IFXFont2FileRead.Lookup(pEFont, pFileRead)) { |
- pFileRead->Release(); |
- m_IFXFont2FileRead.RemoveKey(pEFont); |
- } |
+ m_IFXFont2FileRead.erase(pEFont); |
+ |
FX_POSITION pos; |
pos = m_Hash2Fonts.GetStartPosition(); |
while (pos) { |
@@ -1096,8 +1076,9 @@ void CFGAS_FontMgr::RegisterFace(FXFT_Face pFace, |
m_InstalledFonts.Add(pFont.release()); |
} |
-void CFGAS_FontMgr::RegisterFaces(IFX_SeekableReadStream* pFontStream, |
- const CFX_WideString* pFaceName) { |
+void CFGAS_FontMgr::RegisterFaces( |
+ const CFX_RetainPtr<IFX_SeekableReadStream>& pFontStream, |
+ const CFX_WideString* pFaceName) { |
int32_t index = 0; |
int32_t num_faces = 0; |
do { |