| Index: xfa/fgas/font/fgas_stdfontmgr.cpp
|
| diff --git a/xfa/fgas/font/fgas_stdfontmgr.cpp b/xfa/fgas/font/fgas_stdfontmgr.cpp
|
| index 37c9e78c3cf38f669924193c09232a9b13361738..3d2bfdbf2a535e7138654e3912d5bce108ebe514 100644
|
| --- a/xfa/fgas/font/fgas_stdfontmgr.cpp
|
| +++ b/xfa/fgas/font/fgas_stdfontmgr.cpp
|
| @@ -595,15 +595,18 @@ FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() {
|
| CFX_GEModule::Get()->GetFontMgr()->GetBuiltinMapper();
|
| if (!pFontMapper)
|
| return FALSE;
|
| +
|
| IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
|
| if (!pSystemFontInfo)
|
| return FALSE;
|
| +
|
| pSystemFontInfo->EnumFontList(pFontMapper);
|
| for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
|
| IFX_FileRead* pFontStream =
|
| CreateFontStream(pFontMapper, pSystemFontInfo, i);
|
| if (!pFontStream)
|
| continue;
|
| +
|
| CFX_WideString wsFaceName =
|
| CFX_WideString::FromLocal(pFontMapper->GetFaceName(i).c_str());
|
| RegisterFaces(pFontStream, &wsFaceName);
|
| @@ -611,8 +614,10 @@ FX_BOOL CFX_FontMgrImp::EnumFontsFromFontMapper() {
|
| }
|
| if (m_InstalledFonts.GetSize() == 0)
|
| return FALSE;
|
| +
|
| return TRUE;
|
| }
|
| +
|
| FX_BOOL CFX_FontMgrImp::EnumFontsFromFiles() {
|
| CFX_GEModule::Get()->GetFontMgr()->InitFTLibrary();
|
| FX_POSITION pos = m_pFontSource->GetStartPosition();
|
| @@ -716,6 +721,7 @@ IFX_Font* CFX_FontMgrImp::GetDefFontByLanguage(uint16_t wLanguage,
|
| this, wLanguage, dwFontStyles,
|
| pszFontFamily);
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage,
|
| uint32_t dwFontStyles,
|
| const FX_WCHAR* pszFontFamily) {
|
| @@ -723,37 +729,38 @@ IFX_Font* CFX_FontMgrImp::GetFontByCodePage(uint16_t wCodePage,
|
| bsHash.Format("%d, %d", wCodePage, dwFontStyles);
|
| bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
|
| uint32_t dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
|
| - CFX_ArrayTemplate<IFX_Font*>* pFonts = NULL;
|
| - IFX_Font* pFont = NULL;
|
| +
|
| + CFX_ArrayTemplate<IFX_Font*>* pFonts = nullptr;
|
| if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
|
| - if (NULL == pFonts) {
|
| - return NULL;
|
| - }
|
| - if (0 != pFonts->GetSize()) {
|
| + if (!pFonts)
|
| + return nullptr;
|
| +
|
| + if (pFonts->GetSize() != 0)
|
| return pFonts->GetAt(0)->Retain();
|
| - }
|
| }
|
| +
|
| if (!pFonts)
|
| pFonts = new CFX_ArrayTemplate<IFX_Font*>;
|
| +
|
| m_Hash2Fonts.SetAt(dwHash, pFonts);
|
| - CFX_FontDescriptorInfos* sortedFonts = NULL;
|
| + CFX_FontDescriptorInfos* sortedFonts = nullptr;
|
| if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
|
| sortedFonts = new CFX_FontDescriptorInfos;
|
| MatchFonts(*sortedFonts, wCodePage, dwFontStyles,
|
| CFX_WideString(pszFontFamily), 0);
|
| m_Hash2CandidateList.SetAt(dwHash, sortedFonts);
|
| }
|
| - if (sortedFonts->GetSize() == 0) {
|
| - return NULL;
|
| - }
|
| + if (sortedFonts->GetSize() == 0)
|
| + return nullptr;
|
| +
|
| CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont;
|
| - if (pDesc->m_pFileAccess)
|
| - pFont = LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr);
|
| - else
|
| - pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
|
| - if (NULL != pFont) {
|
| + IFX_Font* pFont =
|
| + pDesc->m_pFileAccess
|
| + ? LoadFont(pDesc->m_pFileAccess, pDesc->m_nFaceIndex, nullptr)
|
| + : LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
|
| + if (pFont)
|
| pFont->SetLogicalFontStyle(dwFontStyles);
|
| - }
|
| +
|
| pFonts->Add(pFont);
|
| return pFont;
|
| }
|
| @@ -836,27 +843,30 @@ FX_BOOL CFX_FontMgrImp::VerifyUnicode(CFX_FontDescriptor* pDesc,
|
| FXFT_Done_Face(pFace);
|
| return !retCharmap && retIndex;
|
| }
|
| +
|
| FX_BOOL CFX_FontMgrImp::VerifyUnicode(IFX_Font* pFont, FX_WCHAR wcUnicode) {
|
| - if (NULL == pFont) {
|
| + if (!pFont)
|
| return FALSE;
|
| - }
|
| +
|
| FXFT_Face pFace = ((CFX_Font*)pFont->GetDevFont())->GetFace();
|
| FXFT_CharMap charmap = FXFT_Get_Face_Charmap(pFace);
|
| - if (0 != FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE)) {
|
| + if (FXFT_Select_Charmap(pFace, FXFT_ENCODING_UNICODE) != 0)
|
| return FALSE;
|
| - }
|
| - if (0 == FXFT_Get_Char_Index(pFace, wcUnicode)) {
|
| +
|
| + if (FXFT_Get_Char_Index(pFace, wcUnicode) == 0) {
|
| FXFT_Set_Charmap(pFace, charmap);
|
| return FALSE;
|
| }
|
| return TRUE;
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::GetFontByLanguage(uint16_t wLanguage,
|
| uint32_t dwFontStyles,
|
| const FX_WCHAR* pszFontFamily) {
|
| return GetFontByCodePage(FX_GetDefCodePageByLanguage(wLanguage), dwFontStyles,
|
| pszFontFamily);
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer,
|
| int32_t iLength,
|
| int32_t iFaceIndex,
|
| @@ -864,33 +874,30 @@ IFX_Font* CFX_FontMgrImp::LoadFont(const uint8_t* pBuffer,
|
| void* Hash[2] = {(void*)(uintptr_t)pBuffer, (void*)(uintptr_t)iLength};
|
| uint32_t dwHash =
|
| FX_HashCode_String_GetA((const FX_CHAR*)Hash, 2 * sizeof(void*));
|
| - IFX_FileAccess* pFontAccess = NULL;
|
| - if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
|
| - }
|
| - if (NULL != pFontAccess) {
|
| - return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
|
| - } else {
|
| - return NULL;
|
| - }
|
| + IFX_FileAccess* pFontAccess = nullptr;
|
| + m_Hash2FileAccess.Lookup(dwHash, pFontAccess);
|
| + return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
|
| + : nullptr;
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::LoadFont(const FX_WCHAR* pszFileName,
|
| int32_t iFaceIndex,
|
| int32_t* pFaceCount) {
|
| CFX_ByteString bsHash;
|
| bsHash += CFX_WideString(pszFileName).UTF8Encode();
|
| +
|
| uint32_t dwHash =
|
| FX_HashCode_String_GetA((const FX_CHAR*)bsHash, bsHash.GetLength());
|
| - IFX_FileAccess* pFontAccess = NULL;
|
| + IFX_FileAccess* pFontAccess = nullptr;
|
| if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
|
| pFontAccess = FX_CreateDefaultFileAccess(pszFileName);
|
| m_Hash2FileAccess.SetAt(dwHash, pFontAccess);
|
| }
|
| - if (NULL != pFontAccess) {
|
| - return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
|
| - } else {
|
| - return NULL;
|
| - }
|
| +
|
| + return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
|
| + : nullptr;
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream,
|
| int32_t iFaceIndex,
|
| int32_t* pFaceCount,
|
| @@ -898,61 +905,60 @@ IFX_Font* CFX_FontMgrImp::LoadFont(IFX_Stream* pFontStream,
|
| void* Hash[1] = {(void*)(uintptr_t)pFontStream};
|
| uint32_t dwHash =
|
| FX_HashCode_String_GetA((const FX_CHAR*)Hash, 1 * sizeof(void*));
|
| - IFX_FileAccess* pFontAccess = NULL;
|
| - if (!m_Hash2FileAccess.Lookup(dwHash, pFontAccess)) {
|
| - }
|
| - if (NULL != pFontAccess) {
|
| - return LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE);
|
| - } else {
|
| - return NULL;
|
| - }
|
| + IFX_FileAccess* pFontAccess = nullptr;
|
| + m_Hash2FileAccess.Lookup(dwHash, pFontAccess);
|
| +
|
| + return pFontAccess ? LoadFont(pFontAccess, iFaceIndex, pFaceCount, TRUE)
|
| + : nullptr;
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::LoadFont(IFX_FileAccess* pFontAccess,
|
| int32_t iFaceIndex,
|
| int32_t* pFaceCount,
|
| FX_BOOL bWantCache) {
|
| uint32_t dwHash = 0;
|
| - IFX_Font* pFont = NULL;
|
| + IFX_Font* pFont = nullptr;
|
| if (bWantCache) {
|
| CFX_ByteString bsHash;
|
| bsHash.Format("%d, %d", (uintptr_t)pFontAccess, iFaceIndex);
|
| dwHash = FX_HashCode_String_GetA(bsHash, bsHash.GetLength());
|
| if (m_FileAccess2IFXFont.Lookup(dwHash, pFont)) {
|
| - if (NULL != pFont) {
|
| - if (NULL != pFaceCount) {
|
| + if (pFont) {
|
| + if (pFaceCount)
|
| *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
|
| - }
|
| return pFont->Retain();
|
| }
|
| }
|
| }
|
| +
|
| CFX_Font* pInternalFont = new CFX_Font;
|
| IFX_FileRead* pFontStream =
|
| pFontAccess->CreateFileStream(FX_FILEMODE_ReadOnly);
|
| - if (NULL == pFontStream) {
|
| + if (!pFontStream) {
|
| delete pInternalFont;
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
|
| delete pInternalFont;
|
| pFontStream->Release();
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| pFont = IFX_Font::LoadFont(pInternalFont, this, TRUE);
|
| - if (NULL == pFont) {
|
| + if (!pFont) {
|
| delete pInternalFont;
|
| pFontStream->Release();
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| - if (bWantCache) {
|
| + if (bWantCache)
|
| m_FileAccess2IFXFont.SetAt(dwHash, pFont);
|
| - }
|
| +
|
| m_IFXFont2FileRead.SetAt(pFont, pFontStream);
|
| - if (NULL != pFaceCount) {
|
| + if (pFaceCount)
|
| *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
|
| - }
|
| +
|
| return pFont;
|
| }
|
| +
|
| IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName,
|
| int32_t iFaceIndex,
|
| int32_t* pFaceCount) {
|
| @@ -960,48 +966,58 @@ IFX_Font* CFX_FontMgrImp::LoadFont(const CFX_WideString& wsFaceName,
|
| CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
|
| if (!pFontMapper)
|
| return nullptr;
|
| +
|
| IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
|
| if (!pSystemFontInfo)
|
| return nullptr;
|
| +
|
| IFX_FileRead* pFontStream = CreateFontStream(wsFaceName.UTF8Encode());
|
| if (!pFontStream)
|
| return nullptr;
|
| +
|
| if (!LoadFace(pFontStream, 0)) {
|
| pFontStream->Release();
|
| return nullptr;
|
| }
|
| +
|
| CFX_Font* pInternalFont = new CFX_Font();
|
| if (!pInternalFont->LoadFile(pFontStream, iFaceIndex)) {
|
| pFontStream->Release();
|
| return nullptr;
|
| }
|
| +
|
| IFX_Font* pFont = IFX_Font::LoadFont(pInternalFont, this, FALSE);
|
| if (!pFont) {
|
| pFontStream->Release();
|
| return nullptr;
|
| }
|
| +
|
| m_IFXFont2FileRead.SetAt(pFont, pFontStream);
|
| if (pFaceCount)
|
| *pFaceCount = ((CFX_Font*)pFont->GetDevFont())->GetFace()->num_faces;
|
| +
|
| return pFont;
|
| }
|
| +
|
| extern "C" {
|
| +
|
| unsigned long _ftStreamRead(FXFT_Stream stream,
|
| unsigned long offset,
|
| unsigned char* buffer,
|
| unsigned long count) {
|
| - if (count == 0) {
|
| + if (count == 0)
|
| return 0;
|
| - }
|
| +
|
| IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
|
| int res = pFile->ReadBlock(buffer, offset, count);
|
| - if (res) {
|
| + if (res)
|
| return count;
|
| - }
|
| return 0;
|
| }
|
| +
|
| void _ftStreamClose(FXFT_Stream stream) {}
|
| -};
|
| +
|
| +}; // extern "C"
|
|
|
| FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
|
| int32_t iFaceIndex) {
|
| @@ -1016,7 +1032,7 @@ FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
|
|
|
| FXFT_Stream ftStream = FX_Alloc(FXFT_StreamRec, 1);
|
| FXSYS_memset(ftStream, 0, sizeof(FXFT_StreamRec));
|
| - ftStream->base = NULL;
|
| + ftStream->base = nullptr;
|
| ftStream->descriptor.pointer = pFontStream;
|
| ftStream->pos = 0;
|
| ftStream->size = (unsigned long)pFontStream->GetSize();
|
| @@ -1028,7 +1044,7 @@ FXFT_Face CFX_FontMgrImp::LoadFace(IFX_FileRead* pFontStream,
|
| ftArgs.flags |= FT_OPEN_STREAM;
|
| ftArgs.stream = ftStream;
|
|
|
| - FXFT_Face pFace = NULL;
|
| + FXFT_Face pFace = nullptr;
|
| if (FXFT_Open_Face(library, &ftArgs, iFaceIndex, &pFace)) {
|
| FX_Free(ftStream);
|
| return nullptr;
|
| @@ -1047,11 +1063,14 @@ IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
|
| 0, 0, FXFONT_DEFAULT_CHARSET, 0, pFontMapper->GetFaceName(index), iExact);
|
| if (!hFont)
|
| return nullptr;
|
| +
|
| uint32_t dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, nullptr, 0);
|
| if (dwFileSize == 0)
|
| return nullptr;
|
| +
|
| uint8_t* pBuffer = FX_Alloc(uint8_t, dwFileSize + 1);
|
| dwFileSize = pSystemFontInfo->GetFontData(hFont, 0, pBuffer, dwFileSize);
|
| +
|
| return FX_CreateMemoryStream(pBuffer, dwFileSize, TRUE);
|
| }
|
|
|
| @@ -1059,11 +1078,14 @@ IFX_FileRead* CFX_FontMgrImp::CreateFontStream(
|
| const CFX_ByteString& bsFaceName) {
|
| CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
|
| CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
|
| +
|
| if (!pFontMapper)
|
| return nullptr;
|
| +
|
| IFX_SystemFontInfo* pSystemFontInfo = pFontMapper->GetSystemFontInfo();
|
| if (!pSystemFontInfo)
|
| return nullptr;
|
| +
|
| pSystemFontInfo->EnumFontList(pFontMapper);
|
| for (int32_t i = 0; i < pFontMapper->GetFaceSize(); ++i) {
|
| if (pFontMapper->GetFaceName(i) == bsFaceName)
|
| @@ -1078,31 +1100,31 @@ int32_t CFX_FontMgrImp::MatchFonts(CFX_FontDescriptorInfos& MatchedFonts,
|
| FX_WCHAR wcUnicode) {
|
| MatchedFonts.RemoveAll();
|
| CFX_WideString wsNormalizedFontName = FontName;
|
| - static const int32_t nMax = 0xffff;
|
| - CFX_FontDescriptor* pFont = NULL;
|
| +
|
| + CFX_FontDescriptor* pFont = nullptr;
|
| int32_t nCount = m_InstalledFonts.GetSize();
|
| for (int32_t i = 0; i < nCount; i++) {
|
| pFont = m_InstalledFonts[i];
|
| int32_t nPenalty = CalcPenalty(pFont, wCodePage, dwFontStyles,
|
| wsNormalizedFontName, wcUnicode);
|
| - if (nPenalty >= 0xFFFF) {
|
| + if (nPenalty >= 0xffff)
|
| continue;
|
| - }
|
| +
|
| FX_FontDescriptorInfo FontInfo;
|
| FontInfo.pFont = pFont;
|
| FontInfo.nPenalty = nPenalty;
|
| MatchedFonts.Add(FontInfo);
|
| - if (MatchedFonts.GetSize() == nMax) {
|
| + if (MatchedFonts.GetSize() == 0xffff)
|
| break;
|
| - }
|
| }
|
| - if (MatchedFonts.GetSize() == 0) {
|
| + if (MatchedFonts.GetSize() == 0)
|
| return 0;
|
| - }
|
| +
|
| CFX_SSortTemplate<FX_FontDescriptorInfo> ssort;
|
| ssort.ShellSort(MatchedFonts.GetData(), MatchedFonts.GetSize());
|
| return MatchedFonts.GetSize();
|
| }
|
| +
|
| struct FX_BitCodePage {
|
| uint16_t wBit;
|
| uint16_t wCodePage;
|
| @@ -1279,51 +1301,51 @@ void CFX_FontMgrImp::RemoveFont(IFX_Font* pEFont) {
|
| }
|
| }
|
| }
|
| +
|
| void CFX_FontMgrImp::RegisterFace(FXFT_Face pFace,
|
| CFX_FontDescriptors& Fonts,
|
| const CFX_WideString* pFaceName,
|
| IFX_FileAccess* pFontAccess) {
|
| - if (0 == (pFace->face_flags & FT_FACE_FLAG_SCALABLE)) {
|
| + if ((pFace->face_flags & FT_FACE_FLAG_SCALABLE) == 0)
|
| return;
|
| - }
|
| +
|
| CFX_FontDescriptor* pFont = new CFX_FontDescriptor;
|
| pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0;
|
| pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0;
|
| pFont->m_dwFontStyles |= GetFlags(pFace);
|
| +
|
| CFX_ArrayTemplate<uint16_t> Charsets;
|
| GetCharsets(pFace, Charsets);
|
| GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb);
|
| - unsigned long nLength = 0;
|
| +
|
| FT_ULong dwTag;
|
| - uint8_t* pTable = NULL;
|
| + uint8_t* pTable = nullptr;
|
| FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e');
|
| - unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, NULL, &nLength);
|
| - if (0 == error && 0 != nLength) {
|
| +
|
| + unsigned long nLength = 0;
|
| + unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, nullptr, &nLength);
|
| + if (error == 0 && nLength != 0) {
|
| pTable = FX_Alloc(uint8_t, nLength);
|
| - error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, NULL);
|
| + error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, nullptr);
|
| if (0 != error) {
|
| FX_Free(pTable);
|
| - pTable = NULL;
|
| + pTable = nullptr;
|
| }
|
| }
|
| GetNames(pTable, pFont->m_wsFamilyNames);
|
| - if (NULL != pTable) {
|
| + if (pTable)
|
| FX_Free(pTable);
|
| - }
|
| +
|
| pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode());
|
| - if (pFaceName) {
|
| - pFont->m_wsFaceName = *pFaceName;
|
| - } else {
|
| - pFont->m_wsFaceName =
|
| - CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
|
| - }
|
| + pFont->m_wsFaceName =
|
| + pFaceName ? *pFaceName
|
| + : CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace));
|
| pFont->m_nFaceIndex = pFace->face_index;
|
| - if (pFontAccess)
|
| - pFont->m_pFileAccess = pFontAccess->Retain();
|
| - else
|
| - pFont->m_pFileAccess = nullptr;
|
| + pFont->m_pFileAccess = pFontAccess ? pFontAccess->Retain() : nullptr;
|
| +
|
| Fonts.Add(pFont);
|
| }
|
| +
|
| void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream,
|
| const CFX_WideString* pFaceName) {
|
| int32_t index = 0;
|
| @@ -1333,7 +1355,7 @@ void CFX_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream,
|
| if (!pFace)
|
| continue;
|
| // All faces keep number of faces. It can be retrieved from any one face.
|
| - if (!num_faces)
|
| + if (num_faces == 0)
|
| num_faces = pFace->num_faces;
|
| RegisterFace(pFace, m_InstalledFonts, pFaceName, nullptr);
|
| if (FXFT_Get_Face_External_Stream(pFace))
|
|
|