| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 7 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
| 8 | 8 |
| 9 #include <memory> |
| 10 |
| 9 #include "core/fpdfapi/fpdf_font/cpdf_truetypefont.h" | 11 #include "core/fpdfapi/fpdf_font/cpdf_truetypefont.h" |
| 10 #include "core/fpdfapi/fpdf_font/cpdf_type1font.h" | 12 #include "core/fpdfapi/fpdf_font/cpdf_type1font.h" |
| 11 #include "core/fpdfapi/fpdf_font/cpdf_type3font.h" | 13 #include "core/fpdfapi/fpdf_font/cpdf_type3font.h" |
| 12 #include "core/fpdfapi/fpdf_font/font_int.h" | 14 #include "core/fpdfapi/fpdf_font/font_int.h" |
| 13 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" | 15 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" |
| 14 #include "core/fpdfapi/fpdf_page/cpdf_pagemodule.h" | 16 #include "core/fpdfapi/fpdf_page/cpdf_pagemodule.h" |
| 15 #include "core/fpdfapi/fpdf_page/pageint.h" | 17 #include "core/fpdfapi/fpdf_page/pageint.h" |
| 16 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" | 18 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" |
| 17 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 19 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
| 18 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 20 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 19 #include "core/fpdfapi/fpdf_parser/include/cpdf_name.h" | 21 #include "core/fpdfapi/fpdf_parser/include/cpdf_name.h" |
| 20 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" | 22 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream_acc.h" |
| 21 #include "core/fpdfapi/include/cpdf_modulemgr.h" | 23 #include "core/fpdfapi/include/cpdf_modulemgr.h" |
| 22 #include "core/fxge/include/fx_freetype.h" | 24 #include "core/fxge/include/fx_freetype.h" |
| 23 | 25 |
| 24 namespace { | 26 namespace { |
| 25 | 27 |
| 26 const uint8_t ChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00}, | 28 const uint8_t kChineseFontNames[][5] = {{0xCB, 0xCE, 0xCC, 0xE5, 0x00}, |
| 27 {0xBF, 0xAC, 0xCC, 0xE5, 0x00}, | 29 {0xBF, 0xAC, 0xCC, 0xE5, 0x00}, |
| 28 {0xBA, 0xDA, 0xCC, 0xE5, 0x00}, | 30 {0xBA, 0xDA, 0xCC, 0xE5, 0x00}, |
| 29 {0xB7, 0xC2, 0xCB, 0xCE, 0x00}, | 31 {0xB7, 0xC2, 0xCB, 0xCE, 0x00}, |
| 30 {0xD0, 0xC2, 0xCB, 0xCE, 0x00}}; | 32 {0xD0, 0xC2, 0xCB, 0xCE, 0x00}}; |
| 31 | 33 |
| 32 FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value) { | 34 void GetPredefinedEncoding(int& basemap, const CFX_ByteString& value) { |
| 33 if (value == "WinAnsiEncoding") | 35 if (value == "WinAnsiEncoding") |
| 34 basemap = PDFFONT_ENCODING_WINANSI; | 36 basemap = PDFFONT_ENCODING_WINANSI; |
| 35 else if (value == "MacRomanEncoding") | 37 else if (value == "MacRomanEncoding") |
| 36 basemap = PDFFONT_ENCODING_MACROMAN; | 38 basemap = PDFFONT_ENCODING_MACROMAN; |
| 37 else if (value == "MacExpertEncoding") | 39 else if (value == "MacExpertEncoding") |
| 38 basemap = PDFFONT_ENCODING_MACEXPERT; | 40 basemap = PDFFONT_ENCODING_MACEXPERT; |
| 39 else if (value == "PDFDocEncoding") | 41 else if (value == "PDFDocEncoding") |
| 40 basemap = PDFFONT_ENCODING_PDFDOC; | 42 basemap = PDFFONT_ENCODING_PDFDOC; |
| 41 else | |
| 42 return FALSE; | |
| 43 return TRUE; | |
| 44 } | 43 } |
| 45 | 44 |
| 46 } // namespace | 45 } // namespace |
| 47 | 46 |
| 48 CPDF_Font::CPDF_Font() | 47 CPDF_Font::CPDF_Font() |
| 49 : m_pFontFile(nullptr), | 48 : m_pFontFile(nullptr), |
| 50 m_pFontDict(nullptr), | 49 m_pFontDict(nullptr), |
| 51 m_bToUnicodeLoaded(FALSE), | 50 m_bToUnicodeLoaded(FALSE), |
| 52 m_Flags(0), | 51 m_Flags(0), |
| 53 m_StemV(0), | 52 m_StemV(0), |
| 54 m_Ascent(0), | 53 m_Ascent(0), |
| 55 m_Descent(0), | 54 m_Descent(0), |
| 56 m_ItalicAngle(0) {} | 55 m_ItalicAngle(0) {} |
| 57 | 56 |
| 58 CPDF_Font::~CPDF_Font() { | 57 CPDF_Font::~CPDF_Font() { |
| 59 if (m_pFontFile) { | 58 if (m_pFontFile) { |
| 60 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( | 59 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( |
| 61 const_cast<CPDF_Stream*>(m_pFontFile->GetStream()->AsStream())); | 60 m_pFontFile->GetStream()->AsStream()); |
| 62 } | 61 } |
| 63 } | 62 } |
| 64 | 63 |
| 65 bool CPDF_Font::IsType1Font() const { | 64 bool CPDF_Font::IsType1Font() const { |
| 66 return false; | 65 return false; |
| 67 } | 66 } |
| 68 | 67 |
| 69 bool CPDF_Font::IsTrueTypeFont() const { | 68 bool CPDF_Font::IsTrueTypeFont() const { |
| 70 return false; | 69 return false; |
| 71 } | 70 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 return; | 214 return; |
| 216 | 215 |
| 217 m_pFontFile = m_pDocument->LoadFontFile(pFontFile); | 216 m_pFontFile = m_pDocument->LoadFontFile(pFontFile); |
| 218 if (!m_pFontFile) | 217 if (!m_pFontFile) |
| 219 return; | 218 return; |
| 220 | 219 |
| 221 const uint8_t* pFontData = m_pFontFile->GetData(); | 220 const uint8_t* pFontData = m_pFontFile->GetData(); |
| 222 uint32_t dwFontSize = m_pFontFile->GetSize(); | 221 uint32_t dwFontSize = m_pFontFile->GetSize(); |
| 223 if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) { | 222 if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) { |
| 224 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( | 223 m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( |
| 225 const_cast<CPDF_Stream*>(m_pFontFile->GetStream()->AsStream())); | 224 m_pFontFile->GetStream()->AsStream()); |
| 226 m_pFontFile = nullptr; | 225 m_pFontFile = nullptr; |
| 227 } | 226 } |
| 228 } | 227 } |
| 229 | 228 |
| 230 void CPDF_Font::CheckFontMetrics() { | 229 void CPDF_Font::CheckFontMetrics() { |
| 231 if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && | 230 if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && |
| 232 m_FontBBox.right == 0) { | 231 m_FontBBox.right == 0) { |
| 233 FXFT_Face face = m_Font.GetFace(); | 232 FXFT_Face face = m_Font.GetFace(); |
| 234 if (face) { | 233 if (face) { |
| 235 m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face); | 234 m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(face), face); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 pFontGlobals->Set(pDoc, font_id, pFont); | 314 pFontGlobals->Set(pDoc, font_id, pFont); |
| 316 return pFont; | 315 return pFont; |
| 317 } | 316 } |
| 318 | 317 |
| 319 CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, | 318 CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, |
| 320 CPDF_Dictionary* pFontDict) { | 319 CPDF_Dictionary* pFontDict) { |
| 321 CFX_ByteString type = pFontDict->GetStringBy("Subtype"); | 320 CFX_ByteString type = pFontDict->GetStringBy("Subtype"); |
| 322 std::unique_ptr<CPDF_Font> pFont; | 321 std::unique_ptr<CPDF_Font> pFont; |
| 323 if (type == "TrueType") { | 322 if (type == "TrueType") { |
| 324 CFX_ByteString tag = pFontDict->GetStringBy("BaseFont").Left(4); | 323 CFX_ByteString tag = pFontDict->GetStringBy("BaseFont").Left(4); |
| 325 for (size_t i = 0; i < FX_ArraySize(ChineseFontNames); ++i) { | 324 for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) { |
| 326 if (tag == CFX_ByteString(ChineseFontNames[i], 4)) { | 325 if (tag == CFX_ByteString(kChineseFontNames[i], 4)) { |
| 327 CPDF_Dictionary* pFontDesc = pFontDict->GetDictBy("FontDescriptor"); | 326 CPDF_Dictionary* pFontDesc = pFontDict->GetDictBy("FontDescriptor"); |
| 328 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) | 327 if (!pFontDesc || !pFontDesc->KeyExist("FontFile2")) |
| 329 pFont.reset(new CPDF_CIDFont); | 328 pFont.reset(new CPDF_CIDFont); |
| 330 break; | 329 break; |
| 331 } | 330 } |
| 332 } | 331 } |
| 333 if (!pFont) | 332 if (!pFont) |
| 334 pFont.reset(new CPDF_TrueTypeFont); | 333 pFont.reset(new CPDF_TrueTypeFont); |
| 335 } else if (type == "Type3") { | 334 } else if (type == "Type3") { |
| 336 pFont.reset(new CPDF_Type3Font); | 335 pFont.reset(new CPDF_Type3Font); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 } | 442 } |
| 444 | 443 |
| 445 if (pCharNames && !pCharNames[charcode].IsEmpty()) | 444 if (pCharNames && !pCharNames[charcode].IsEmpty()) |
| 446 return pCharNames[charcode].c_str(); | 445 return pCharNames[charcode].c_str(); |
| 447 | 446 |
| 448 const FX_CHAR* name = nullptr; | 447 const FX_CHAR* name = nullptr; |
| 449 if (iBaseEncoding) | 448 if (iBaseEncoding) |
| 450 name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode); | 449 name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode); |
| 451 return name && name[0] ? name : nullptr; | 450 return name && name[0] ? name : nullptr; |
| 452 } | 451 } |
| OLD | NEW |