| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 "font_int.h" | 7 #include "font_int.h" |
| 8 | 8 |
| 9 #include "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
| 10 #include "core/include/fpdfapi/fpdf_page.h" | 10 #include "core/include/fpdfapi/fpdf_page.h" |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1146 #else | 1146 #else |
| 1147 if (m_pCMap->m_pEmbedMap) { | 1147 if (m_pCMap->m_pEmbedMap) { |
| 1148 return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, | 1148 return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, |
| 1149 unicode); | 1149 unicode); |
| 1150 } | 1150 } |
| 1151 #endif | 1151 #endif |
| 1152 return 0; | 1152 return 0; |
| 1153 } | 1153 } |
| 1154 | 1154 |
| 1155 FX_BOOL CPDF_CIDFont::_Load() { | 1155 FX_BOOL CPDF_CIDFont::_Load() { |
| 1156 if (m_pFontDict->GetString("Subtype") == "TrueType") { | 1156 if (m_pFontDict->GetStringBy("Subtype") == "TrueType") { |
| 1157 return LoadGB2312(); | 1157 return LoadGB2312(); |
| 1158 } | 1158 } |
| 1159 CPDF_Array* pFonts = m_pFontDict->GetArray("DescendantFonts"); | 1159 CPDF_Array* pFonts = m_pFontDict->GetArrayBy("DescendantFonts"); |
| 1160 if (!pFonts) { | 1160 if (!pFonts) { |
| 1161 return FALSE; | 1161 return FALSE; |
| 1162 } | 1162 } |
| 1163 if (pFonts->GetCount() != 1) { | 1163 if (pFonts->GetCount() != 1) { |
| 1164 return FALSE; | 1164 return FALSE; |
| 1165 } | 1165 } |
| 1166 CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0); | 1166 CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); |
| 1167 if (!pCIDFontDict) { | 1167 if (!pCIDFontDict) { |
| 1168 return FALSE; | 1168 return FALSE; |
| 1169 } | 1169 } |
| 1170 m_BaseFont = pCIDFontDict->GetString("BaseFont"); | 1170 m_BaseFont = pCIDFontDict->GetStringBy("BaseFont"); |
| 1171 if ((m_BaseFont.Compare("CourierStd") == 0 || | 1171 if ((m_BaseFont.Compare("CourierStd") == 0 || |
| 1172 m_BaseFont.Compare("CourierStd-Bold") == 0 || | 1172 m_BaseFont.Compare("CourierStd-Bold") == 0 || |
| 1173 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || | 1173 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || |
| 1174 m_BaseFont.Compare("CourierStd-Oblique") == 0) && | 1174 m_BaseFont.Compare("CourierStd-Oblique") == 0) && |
| 1175 !IsEmbedded()) { | 1175 !IsEmbedded()) { |
| 1176 m_bAdobeCourierStd = TRUE; | 1176 m_bAdobeCourierStd = TRUE; |
| 1177 } | 1177 } |
| 1178 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict("FontDescriptor"); | 1178 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictBy("FontDescriptor"); |
| 1179 if (pFontDesc) { | 1179 if (pFontDesc) { |
| 1180 LoadFontDescriptor(pFontDesc); | 1180 LoadFontDescriptor(pFontDesc); |
| 1181 } | 1181 } |
| 1182 CPDF_Object* pEncoding = m_pFontDict->GetElementValue("Encoding"); | 1182 CPDF_Object* pEncoding = m_pFontDict->GetElementValue("Encoding"); |
| 1183 if (!pEncoding) { | 1183 if (!pEncoding) { |
| 1184 return FALSE; | 1184 return FALSE; |
| 1185 } | 1185 } |
| 1186 CFX_ByteString subtype = pCIDFontDict->GetString("Subtype"); | 1186 CFX_ByteString subtype = pCIDFontDict->GetStringBy("Subtype"); |
| 1187 m_bType1 = (subtype == "CIDFontType0"); | 1187 m_bType1 = (subtype == "CIDFontType0"); |
| 1188 | 1188 |
| 1189 if (pEncoding->IsName()) { | 1189 if (pEncoding->IsName()) { |
| 1190 CFX_ByteString cmap = pEncoding->GetString(); | 1190 CFX_ByteString cmap = pEncoding->GetString(); |
| 1191 m_pCMap = | 1191 m_pCMap = |
| 1192 CPDF_ModuleMgr::Get() | 1192 CPDF_ModuleMgr::Get() |
| 1193 ->GetPageModule() | 1193 ->GetPageModule() |
| 1194 ->GetFontGlobals() | 1194 ->GetFontGlobals() |
| 1195 ->m_CMapManager.GetPredefinedCMap(cmap, m_pFontFile && m_bType1); | 1195 ->m_CMapManager.GetPredefinedCMap(cmap, m_pFontFile && m_bType1); |
| 1196 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { | 1196 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { |
| 1197 m_pAllocatedCMap = m_pCMap = new CPDF_CMap; | 1197 m_pAllocatedCMap = m_pCMap = new CPDF_CMap; |
| 1198 CPDF_StreamAcc acc; | 1198 CPDF_StreamAcc acc; |
| 1199 acc.LoadAllData(pStream, FALSE); | 1199 acc.LoadAllData(pStream, FALSE); |
| 1200 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); | 1200 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); |
| 1201 } else { | 1201 } else { |
| 1202 return FALSE; | 1202 return FALSE; |
| 1203 } | 1203 } |
| 1204 if (!m_pCMap) { | 1204 if (!m_pCMap) { |
| 1205 return FALSE; | 1205 return FALSE; |
| 1206 } | 1206 } |
| 1207 m_Charset = m_pCMap->m_Charset; | 1207 m_Charset = m_pCMap->m_Charset; |
| 1208 if (m_Charset == CIDSET_UNKNOWN) { | 1208 if (m_Charset == CIDSET_UNKNOWN) { |
| 1209 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict("CIDSystemInfo"); | 1209 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictBy("CIDSystemInfo"); |
| 1210 if (pCIDInfo) { | 1210 if (pCIDInfo) { |
| 1211 m_Charset = CharsetFromOrdering(pCIDInfo->GetString("Ordering")); | 1211 m_Charset = CharsetFromOrdering(pCIDInfo->GetStringBy("Ordering")); |
| 1212 } | 1212 } |
| 1213 } | 1213 } |
| 1214 if (m_Charset != CIDSET_UNKNOWN) | 1214 if (m_Charset != CIDSET_UNKNOWN) |
| 1215 m_pCID2UnicodeMap = | 1215 m_pCID2UnicodeMap = |
| 1216 CPDF_ModuleMgr::Get() | 1216 CPDF_ModuleMgr::Get() |
| 1217 ->GetPageModule() | 1217 ->GetPageModule() |
| 1218 ->GetFontGlobals() | 1218 ->GetFontGlobals() |
| 1219 ->m_CMapManager.GetCID2UnicodeMap( | 1219 ->m_CMapManager.GetCID2UnicodeMap( |
| 1220 m_Charset, | 1220 m_Charset, |
| 1221 !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || | 1221 !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || |
| 1222 pCIDFontDict->KeyExist("W"))); | 1222 pCIDFontDict->KeyExist("W"))); |
| 1223 if (m_Font.GetFace()) { | 1223 if (m_Font.GetFace()) { |
| 1224 if (m_bType1) { | 1224 if (m_bType1) { |
| 1225 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); | 1225 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); |
| 1226 } else { | 1226 } else { |
| 1227 FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); | 1227 FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); |
| 1228 } | 1228 } |
| 1229 } | 1229 } |
| 1230 m_DefaultWidth = pCIDFontDict->GetInteger("DW", 1000); | 1230 m_DefaultWidth = pCIDFontDict->GetIntegerBy("DW", 1000); |
| 1231 CPDF_Array* pWidthArray = pCIDFontDict->GetArray("W"); | 1231 CPDF_Array* pWidthArray = pCIDFontDict->GetArrayBy("W"); |
| 1232 if (pWidthArray) { | 1232 if (pWidthArray) { |
| 1233 LoadMetricsArray(pWidthArray, m_WidthList, 1); | 1233 LoadMetricsArray(pWidthArray, m_WidthList, 1); |
| 1234 } | 1234 } |
| 1235 if (!IsEmbedded()) { | 1235 if (!IsEmbedded()) { |
| 1236 LoadSubstFont(); | 1236 LoadSubstFont(); |
| 1237 } | 1237 } |
| 1238 if (1) { | 1238 if (1) { |
| 1239 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { | 1239 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { |
| 1240 CPDF_Object* pmap = pCIDFontDict->GetElementValue("CIDToGIDMap"); | 1240 CPDF_Object* pmap = pCIDFontDict->GetElementValue("CIDToGIDMap"); |
| 1241 if (pmap) { | 1241 if (pmap) { |
| 1242 if (CPDF_Stream* pStream = pmap->AsStream()) { | 1242 if (CPDF_Stream* pStream = pmap->AsStream()) { |
| 1243 m_pCIDToGIDMap = new CPDF_StreamAcc; | 1243 m_pCIDToGIDMap = new CPDF_StreamAcc; |
| 1244 m_pCIDToGIDMap->LoadAllData(pStream, FALSE); | 1244 m_pCIDToGIDMap->LoadAllData(pStream, FALSE); |
| 1245 } else if (pmap->GetString() == "Identity") { | 1245 } else if (pmap->GetString() == "Identity") { |
| 1246 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 1246 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
| 1247 if (m_pFontFile) { | 1247 if (m_pFontFile) { |
| 1248 m_bCIDIsGID = TRUE; | 1248 m_bCIDIsGID = TRUE; |
| 1249 } | 1249 } |
| 1250 #else | 1250 #else |
| 1251 m_bCIDIsGID = TRUE; | 1251 m_bCIDIsGID = TRUE; |
| 1252 #endif | 1252 #endif |
| 1253 } | 1253 } |
| 1254 } | 1254 } |
| 1255 } | 1255 } |
| 1256 } | 1256 } |
| 1257 CheckFontMetrics(); | 1257 CheckFontMetrics(); |
| 1258 if (IsVertWriting()) { | 1258 if (IsVertWriting()) { |
| 1259 pWidthArray = pCIDFontDict->GetArray("W2"); | 1259 pWidthArray = pCIDFontDict->GetArrayBy("W2"); |
| 1260 if (pWidthArray) { | 1260 if (pWidthArray) { |
| 1261 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); | 1261 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); |
| 1262 } | 1262 } |
| 1263 CPDF_Array* pDefaultArray = pCIDFontDict->GetArray("DW2"); | 1263 CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayBy("DW2"); |
| 1264 if (pDefaultArray) { | 1264 if (pDefaultArray) { |
| 1265 m_DefaultVY = pDefaultArray->GetInteger(0); | 1265 m_DefaultVY = pDefaultArray->GetIntegerAt(0); |
| 1266 m_DefaultW1 = pDefaultArray->GetInteger(1); | 1266 m_DefaultW1 = pDefaultArray->GetIntegerAt(1); |
| 1267 } else { | 1267 } else { |
| 1268 m_DefaultVY = 880; | 1268 m_DefaultVY = 880; |
| 1269 m_DefaultW1 = -1000; | 1269 m_DefaultW1 = -1000; |
| 1270 } | 1270 } |
| 1271 } | 1271 } |
| 1272 return TRUE; | 1272 return TRUE; |
| 1273 } | 1273 } |
| 1274 | 1274 |
| 1275 void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { | 1275 void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { |
| 1276 if (charcode < 256 && m_CharBBox[charcode].Right != -1) { | 1276 if (charcode < 256 && m_CharBBox[charcode].Right != -1) { |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 | 1643 |
| 1644 if (CPDF_Array* pArray = pObj->AsArray()) { | 1644 if (CPDF_Array* pArray = pObj->AsArray()) { |
| 1645 if (width_status != 1) | 1645 if (width_status != 1) |
| 1646 return; | 1646 return; |
| 1647 | 1647 |
| 1648 FX_DWORD count = pArray->GetCount(); | 1648 FX_DWORD count = pArray->GetCount(); |
| 1649 for (FX_DWORD j = 0; j < count; j += nElements) { | 1649 for (FX_DWORD j = 0; j < count; j += nElements) { |
| 1650 result.Add(first_code); | 1650 result.Add(first_code); |
| 1651 result.Add(first_code); | 1651 result.Add(first_code); |
| 1652 for (int k = 0; k < nElements; k++) { | 1652 for (int k = 0; k < nElements; k++) { |
| 1653 result.Add(pArray->GetInteger(j + k)); | 1653 result.Add(pArray->GetIntegerAt(j + k)); |
| 1654 } | 1654 } |
| 1655 first_code++; | 1655 first_code++; |
| 1656 } | 1656 } |
| 1657 width_status = 0; | 1657 width_status = 0; |
| 1658 } else { | 1658 } else { |
| 1659 if (width_status == 0) { | 1659 if (width_status == 0) { |
| 1660 first_code = pObj->GetInteger(); | 1660 first_code = pObj->GetInteger(); |
| 1661 width_status = 1; | 1661 width_status = 1; |
| 1662 } else if (width_status == 1) { | 1662 } else if (width_status == 1) { |
| 1663 last_code = pObj->GetInteger(); | 1663 last_code = pObj->GetInteger(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1680 | 1680 |
| 1681 // static | 1681 // static |
| 1682 FX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) { | 1682 FX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) { |
| 1683 if (ch < 128) { | 1683 if (ch < 128) { |
| 1684 return ch * 1.0f / 127; | 1684 return ch * 1.0f / 127; |
| 1685 } | 1685 } |
| 1686 return (-255 + ch) * 1.0f / 127; | 1686 return (-255 + ch) * 1.0f / 127; |
| 1687 } | 1687 } |
| 1688 | 1688 |
| 1689 FX_BOOL CPDF_CIDFont::LoadGB2312() { | 1689 FX_BOOL CPDF_CIDFont::LoadGB2312() { |
| 1690 m_BaseFont = m_pFontDict->GetString("BaseFont"); | 1690 m_BaseFont = m_pFontDict->GetStringBy("BaseFont"); |
| 1691 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict("FontDescriptor"); | 1691 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); |
| 1692 if (pFontDesc) { | 1692 if (pFontDesc) { |
| 1693 LoadFontDescriptor(pFontDesc); | 1693 LoadFontDescriptor(pFontDesc); |
| 1694 } | 1694 } |
| 1695 m_Charset = CIDSET_GB1; | 1695 m_Charset = CIDSET_GB1; |
| 1696 m_bType1 = FALSE; | 1696 m_bType1 = FALSE; |
| 1697 m_pCMap = CPDF_ModuleMgr::Get() | 1697 m_pCMap = CPDF_ModuleMgr::Get() |
| 1698 ->GetPageModule() | 1698 ->GetPageModule() |
| 1699 ->GetFontGlobals() | 1699 ->GetFontGlobals() |
| 1700 ->m_CMapManager.GetPredefinedCMap("GBK-EUC-H", FALSE); | 1700 ->m_CMapManager.GetPredefinedCMap("GBK-EUC-H", FALSE); |
| 1701 m_pCID2UnicodeMap = CPDF_ModuleMgr::Get() | 1701 m_pCID2UnicodeMap = CPDF_ModuleMgr::Get() |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1716 | 1716 |
| 1717 const uint8_t* CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const { | 1717 const uint8_t* CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const { |
| 1718 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) | 1718 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) |
| 1719 return nullptr; | 1719 return nullptr; |
| 1720 | 1720 |
| 1721 const struct CIDTransform* found = (const struct CIDTransform*)FXSYS_bsearch( | 1721 const struct CIDTransform* found = (const struct CIDTransform*)FXSYS_bsearch( |
| 1722 &CID, g_Japan1_VertCIDs, FX_ArraySize(g_Japan1_VertCIDs), | 1722 &CID, g_Japan1_VertCIDs, FX_ArraySize(g_Japan1_VertCIDs), |
| 1723 sizeof(g_Japan1_VertCIDs[0]), CompareCIDTransform); | 1723 sizeof(g_Japan1_VertCIDs[0]), CompareCIDTransform); |
| 1724 return found ? &found->a : nullptr; | 1724 return found ? &found->a : nullptr; |
| 1725 } | 1725 } |
| OLD | NEW |