OLD | NEW |
1 // Copyright 2015 PDFium Authors. All rights reserved. | 1 // Copyright 2015 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fgas/font/fgas_stdfontmgr.h" | 7 #include "xfa/fgas/font/fgas_stdfontmgr.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_stream.h" | 9 #include "core/fxcrt/include/fx_stream.h" |
10 #include "core/fxge/include/fx_ge.h" | 10 #include "core/fxge/include/fx_ge.h" |
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 } | 1156 } |
1157 } | 1157 } |
1158 } | 1158 } |
1159 | 1159 |
1160 void CFGAS_FontMgrImp::RegisterFace(FXFT_Face pFace, | 1160 void CFGAS_FontMgrImp::RegisterFace(FXFT_Face pFace, |
1161 CFX_FontDescriptors& Fonts, | 1161 CFX_FontDescriptors& Fonts, |
1162 const CFX_WideString* pFaceName) { | 1162 const CFX_WideString* pFaceName) { |
1163 if ((pFace->face_flags & FT_FACE_FLAG_SCALABLE) == 0) | 1163 if ((pFace->face_flags & FT_FACE_FLAG_SCALABLE) == 0) |
1164 return; | 1164 return; |
1165 | 1165 |
1166 CFX_FontDescriptor* pFont = new CFX_FontDescriptor; | 1166 std::unique_ptr<CFX_FontDescriptor> pFont(new CFX_FontDescriptor); |
1167 pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0; | 1167 pFont->m_dwFontStyles |= FXFT_Is_Face_Bold(pFace) ? FX_FONTSTYLE_Bold : 0; |
1168 pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0; | 1168 pFont->m_dwFontStyles |= FXFT_Is_Face_Italic(pFace) ? FX_FONTSTYLE_Italic : 0; |
1169 pFont->m_dwFontStyles |= GetFlags(pFace); | 1169 pFont->m_dwFontStyles |= GetFlags(pFace); |
1170 | 1170 |
1171 CFX_ArrayTemplate<uint16_t> Charsets; | 1171 std::vector<uint16_t> charsets = GetCharsets(pFace); |
1172 GetCharsets(pFace, Charsets); | |
1173 GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb); | 1172 GetUSBCSB(pFace, pFont->m_dwUsb, pFont->m_dwCsb); |
1174 | 1173 |
1175 FT_ULong dwTag; | 1174 FT_ULong dwTag; |
1176 uint8_t* pTable = nullptr; | |
1177 FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e'); | 1175 FT_ENC_TAG(dwTag, 'n', 'a', 'm', 'e'); |
1178 | 1176 |
| 1177 std::vector<uint8_t> table; |
1179 unsigned long nLength = 0; | 1178 unsigned long nLength = 0; |
1180 unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, nullptr, &nLength); | 1179 unsigned int error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, nullptr, &nLength); |
1181 if (error == 0 && nLength != 0) { | 1180 if (error == 0 && nLength != 0) { |
1182 pTable = FX_Alloc(uint8_t, nLength); | 1181 table.resize(nLength); |
1183 error = FXFT_Load_Sfnt_Table(pFace, dwTag, 0, pTable, nullptr); | 1182 if (FXFT_Load_Sfnt_Table(pFace, dwTag, 0, table.data(), nullptr)) |
1184 if (0 != error) { | 1183 table.clear(); |
1185 FX_Free(pTable); | |
1186 pTable = nullptr; | |
1187 } | |
1188 } | 1184 } |
1189 GetNames(pTable, pFont->m_wsFamilyNames); | 1185 GetNames(table.empty() ? nullptr : table.data(), pFont->m_wsFamilyNames); |
1190 if (pTable) | |
1191 FX_Free(pTable); | |
1192 | 1186 |
1193 pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode()); | 1187 pFont->m_wsFamilyNames.Add(CFX_ByteString(pFace->family_name).UTF8Decode()); |
1194 pFont->m_wsFaceName = | 1188 pFont->m_wsFaceName = |
1195 pFaceName ? *pFaceName | 1189 pFaceName ? *pFaceName |
1196 : CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace)); | 1190 : CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(pFace)); |
1197 pFont->m_nFaceIndex = pFace->face_index; | 1191 pFont->m_nFaceIndex = pFace->face_index; |
1198 | 1192 |
1199 Fonts.Add(pFont); | 1193 Fonts.Add(pFont.release()); |
1200 } | 1194 } |
1201 | 1195 |
1202 void CFGAS_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream, | 1196 void CFGAS_FontMgrImp::RegisterFaces(IFX_FileRead* pFontStream, |
1203 const CFX_WideString* pFaceName) { | 1197 const CFX_WideString* pFaceName) { |
1204 int32_t index = 0; | 1198 int32_t index = 0; |
1205 int32_t num_faces = 0; | 1199 int32_t num_faces = 0; |
1206 do { | 1200 do { |
1207 FXFT_Face pFace = LoadFace(pFontStream, index++); | 1201 FXFT_Face pFace = LoadFace(pFontStream, index++); |
1208 if (!pFace) | 1202 if (!pFace) |
1209 continue; | 1203 continue; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 {1 << 0, FX_CHARSET_Default}, {1 << 1, FX_CHARSET_Default}, | 1333 {1 << 0, FX_CHARSET_Default}, {1 << 1, FX_CHARSET_Default}, |
1340 {1 << 2, FX_CHARSET_Default}, {1 << 3, FX_CHARSET_Default}, | 1334 {1 << 2, FX_CHARSET_Default}, {1 << 3, FX_CHARSET_Default}, |
1341 {1 << 4, FX_CHARSET_Default}, {1 << 5, FX_CHARSET_Default}, | 1335 {1 << 4, FX_CHARSET_Default}, {1 << 5, FX_CHARSET_Default}, |
1342 {1 << 6, FX_CHARSET_Default}, {1 << 7, FX_CHARSET_Default}, | 1336 {1 << 6, FX_CHARSET_Default}, {1 << 7, FX_CHARSET_Default}, |
1343 {1 << 8, FX_CHARSET_Default}, {1 << 9, FX_CHARSET_Default}, | 1337 {1 << 8, FX_CHARSET_Default}, {1 << 9, FX_CHARSET_Default}, |
1344 {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default}, | 1338 {1 << 10, FX_CHARSET_Default}, {1 << 11, FX_CHARSET_Default}, |
1345 {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default}, | 1339 {1 << 12, FX_CHARSET_Default}, {1 << 13, FX_CHARSET_Default}, |
1346 {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_US}, | 1340 {1 << 14, FX_CHARSET_Default}, {1 << 15, FX_CHARSET_US}, |
1347 }; | 1341 }; |
1348 | 1342 |
1349 #define CODEPAGERANGE_IMPLEMENT(n) \ | 1343 #define CODEPAGERANGE_IMPLEMENT(n) \ |
1350 for (int32_t i = 0; i < 16; i++) { \ | 1344 for (int32_t i = 0; i < 16; i++) { \ |
1351 if ((a##n & g_FX_Bit2Charset##n[i].wBit) != 0) { \ | 1345 if ((a##n & g_FX_Bit2Charset##n[i].wBit) != 0) \ |
1352 Charsets.Add(g_FX_Bit2Charset##n[i].wCharset); \ | 1346 charsets.push_back(g_FX_Bit2Charset##n[i].wCharset); \ |
1353 } \ | |
1354 } | 1347 } |
1355 | 1348 |
1356 void CFGAS_FontMgrImp::GetCharsets(FXFT_Face pFace, | 1349 std::vector<uint16_t> CFGAS_FontMgrImp::GetCharsets(FXFT_Face pFace) const { |
1357 CFX_ArrayTemplate<uint16_t>& Charsets) { | 1350 std::vector<uint16_t> charsets; |
1358 Charsets.RemoveAll(); | |
1359 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); | 1351 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); |
1360 if (NULL != pOS2) { | 1352 if (pOS2) { |
1361 uint16_t a1, a2, a3, a4; | 1353 uint16_t a1 = pOS2->ulCodePageRange1 & 0xffff; |
1362 a1 = pOS2->ulCodePageRange1 & 0x0000ffff; | |
1363 CODEPAGERANGE_IMPLEMENT(1); | 1354 CODEPAGERANGE_IMPLEMENT(1); |
1364 a2 = (pOS2->ulCodePageRange1 >> 16) & 0x0000ffff; | 1355 uint16_t a2 = (pOS2->ulCodePageRange1 >> 16) & 0xffff; |
1365 CODEPAGERANGE_IMPLEMENT(2); | 1356 CODEPAGERANGE_IMPLEMENT(2); |
1366 a3 = pOS2->ulCodePageRange2 & 0x0000ffff; | 1357 uint16_t a3 = pOS2->ulCodePageRange2 & 0xffff; |
1367 CODEPAGERANGE_IMPLEMENT(3); | 1358 CODEPAGERANGE_IMPLEMENT(3); |
1368 a4 = (pOS2->ulCodePageRange2 >> 16) & 0x0000ffff; | 1359 uint16_t a4 = (pOS2->ulCodePageRange2 >> 16) & 0xffff; |
1369 CODEPAGERANGE_IMPLEMENT(4); | 1360 CODEPAGERANGE_IMPLEMENT(4); |
1370 } else { | 1361 } else { |
1371 Charsets.Add(FX_CHARSET_Default); | 1362 charsets.push_back(FX_CHARSET_Default); |
1372 } | 1363 } |
| 1364 return charsets; |
1373 } | 1365 } |
1374 | 1366 |
1375 #undef CODEPAGERANGE_IMPLEMENT | 1367 #undef CODEPAGERANGE_IMPLEMENT |
1376 void CFGAS_FontMgrImp::GetUSBCSB(FXFT_Face pFace, | 1368 void CFGAS_FontMgrImp::GetUSBCSB(FXFT_Face pFace, |
1377 uint32_t* USB, | 1369 uint32_t* USB, |
1378 uint32_t* CSB) { | 1370 uint32_t* CSB) { |
1379 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); | 1371 TT_OS2* pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(pFace, ft_sfnt_os2); |
1380 if (NULL != pOS2) { | 1372 if (NULL != pOS2) { |
1381 USB[0] = pOS2->ulUnicodeRange1; | 1373 USB[0] = pOS2->ulUnicodeRange1; |
1382 USB[1] = pOS2->ulUnicodeRange2; | 1374 USB[1] = pOS2->ulUnicodeRange2; |
(...skipping 13 matching lines...) Expand all Loading... |
1396 | 1388 |
1397 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1, | 1389 int32_t CFGAS_FontMgrImp::IsPartName(const CFX_WideString& Name1, |
1398 const CFX_WideString& Name2) { | 1390 const CFX_WideString& Name2) { |
1399 if (Name1.Find(Name2.c_str()) != -1) { | 1391 if (Name1.Find(Name2.c_str()) != -1) { |
1400 return 1; | 1392 return 1; |
1401 } | 1393 } |
1402 return 0; | 1394 return 0; |
1403 } | 1395 } |
1404 | 1396 |
1405 #endif | 1397 #endif |
OLD | NEW |