Index: core/fpdfapi/fpdf_font/fpdf_font.cpp |
diff --git a/core/fpdfapi/fpdf_font/fpdf_font.cpp b/core/fpdfapi/fpdf_font/fpdf_font.cpp |
deleted file mode 100644 |
index cff5223a008ba749de4f3a1a07ec768c7e2822d3..0000000000000000000000000000000000000000 |
--- a/core/fpdfapi/fpdf_font/fpdf_font.cpp |
+++ /dev/null |
@@ -1,307 +0,0 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
- |
-#include "core/fpdfapi/fpdf_font/font_int.h" |
- |
-#include "core/fpdfapi/cpdf_modulemgr.h" |
-#include "core/fpdfapi/fpdf_page/cpdf_form.h" |
-#include "core/fpdfapi/fpdf_page/cpdf_pagemodule.h" |
-#include "core/fpdfapi/fpdf_page/pageint.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_array.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_dictionary.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_document.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_name.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_number.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_simple_parser.h" |
-#include "core/fpdfapi/fpdf_parser/cpdf_stream_acc.h" |
-#include "core/fxcrt/fx_ext.h" |
-#include "core/fxge/fx_freetype.h" |
-#include "third_party/base/numerics/safe_conversions.h" |
-#include "third_party/base/stl_util.h" |
- |
-int TT2PDF(int m, FXFT_Face face) { |
- int upm = FXFT_Get_Face_UnitsPerEM(face); |
- if (upm == 0) |
- return m; |
- return pdfium::base::checked_cast<int>( |
- (static_cast<double>(m) * 1000 + upm / 2) / upm); |
-} |
- |
-bool FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) { |
- auto* pCharMap = FXFT_Get_Face_Charmaps(face); |
- for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { |
- if (FXFT_Get_Charmap_PlatformID(pCharMap[i]) == platform_id && |
- FXFT_Get_Charmap_EncodingID(pCharMap[i]) == encoding_id) { |
- FXFT_Set_Charmap(face, pCharMap[i]); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-CFX_StockFontArray::CFX_StockFontArray() {} |
- |
-CFX_StockFontArray::~CFX_StockFontArray() { |
- for (size_t i = 0; i < FX_ArraySize(m_StockFonts); ++i) { |
- if (!m_StockFonts[i]) |
- continue; |
- CPDF_Dictionary* pFontDict = m_StockFonts[i]->GetFontDict(); |
- if (pFontDict) |
- pFontDict->Release(); |
- } |
-} |
- |
-CPDF_Font* CFX_StockFontArray::GetFont(uint32_t index) const { |
- if (index >= FX_ArraySize(m_StockFonts)) |
- return nullptr; |
- return m_StockFonts[index].get(); |
-} |
- |
-CPDF_Font* CFX_StockFontArray::SetFont(uint32_t index, |
- std::unique_ptr<CPDF_Font> pFont) { |
- CPDF_Font* result = pFont.get(); |
- if (index < FX_ArraySize(m_StockFonts)) |
- m_StockFonts[index] = std::move(pFont); |
- return result; |
-} |
- |
-CPDF_FontGlobals::CPDF_FontGlobals() { |
- FXSYS_memset(m_EmbeddedCharsets, 0, sizeof(m_EmbeddedCharsets)); |
- FXSYS_memset(m_EmbeddedToUnicodes, 0, sizeof(m_EmbeddedToUnicodes)); |
-} |
- |
-CPDF_FontGlobals::~CPDF_FontGlobals() {} |
- |
-CPDF_Font* CPDF_FontGlobals::Find(CPDF_Document* pDoc, uint32_t index) { |
- auto it = m_StockMap.find(pDoc); |
- if (it == m_StockMap.end()) |
- return nullptr; |
- return it->second ? it->second->GetFont(index) : nullptr; |
-} |
- |
-CPDF_Font* CPDF_FontGlobals::Set(CPDF_Document* pDoc, |
- uint32_t index, |
- std::unique_ptr<CPDF_Font> pFont) { |
- if (!pdfium::ContainsKey(m_StockMap, pDoc)) |
- m_StockMap[pDoc].reset(new CFX_StockFontArray); |
- return m_StockMap[pDoc]->SetFont(index, std::move(pFont)); |
-} |
- |
-void CPDF_FontGlobals::Clear(CPDF_Document* pDoc) { |
- m_StockMap.erase(pDoc); |
-} |
- |
-CFX_WideString CPDF_ToUnicodeMap::Lookup(uint32_t charcode) const { |
- auto it = m_Map.find(charcode); |
- if (it != m_Map.end()) { |
- uint32_t value = it->second; |
- FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff); |
- if (unicode != 0xffff) { |
- return unicode; |
- } |
- const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer(); |
- uint32_t buf_len = m_MultiCharBuf.GetLength(); |
- if (!buf || buf_len == 0) { |
- return CFX_WideString(); |
- } |
- uint32_t index = value >> 16; |
- if (index >= buf_len) { |
- return CFX_WideString(); |
- } |
- uint32_t len = buf[index]; |
- if (index + len < index || index + len >= buf_len) { |
- return CFX_WideString(); |
- } |
- return CFX_WideString(buf + index + 1, len); |
- } |
- if (m_pBaseMap) { |
- return m_pBaseMap->UnicodeFromCID((uint16_t)charcode); |
- } |
- return CFX_WideString(); |
-} |
- |
-uint32_t CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) const { |
- for (const auto& pair : m_Map) { |
- if (pair.second == static_cast<uint32_t>(unicode)) |
- return pair.first; |
- } |
- return 0; |
-} |
- |
-// Static. |
-uint32_t CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) { |
- int len = str.GetLength(); |
- if (len == 0) |
- return 0; |
- |
- uint32_t result = 0; |
- if (str[0] == '<') { |
- for (int i = 1; i < len && std::isxdigit(str[i]); ++i) |
- result = result * 16 + FXSYS_toHexDigit(str.CharAt(i)); |
- return result; |
- } |
- |
- for (int i = 0; i < len && std::isdigit(str[i]); ++i) |
- result = result * 10 + FXSYS_toDecimalDigit(str.CharAt(i)); |
- |
- return result; |
-} |
- |
-static CFX_WideString StringDataAdd(CFX_WideString str) { |
- CFX_WideString ret; |
- int len = str.GetLength(); |
- FX_WCHAR value = 1; |
- for (int i = len - 1; i >= 0; --i) { |
- FX_WCHAR ch = str[i] + value; |
- if (ch < str[i]) { |
- ret.Insert(0, 0); |
- } else { |
- ret.Insert(0, ch); |
- value = 0; |
- } |
- } |
- if (value) { |
- ret.Insert(0, value); |
- } |
- return ret; |
-} |
- |
-// Static. |
-CFX_WideString CPDF_ToUnicodeMap::StringToWideString( |
- const CFX_ByteStringC& str) { |
- int len = str.GetLength(); |
- if (len == 0) |
- return CFX_WideString(); |
- |
- CFX_WideString result; |
- if (str[0] == '<') { |
- int byte_pos = 0; |
- FX_WCHAR ch = 0; |
- for (int i = 1; i < len && std::isxdigit(str[i]); ++i) { |
- ch = ch * 16 + FXSYS_toHexDigit(str[i]); |
- byte_pos++; |
- if (byte_pos == 4) { |
- result += ch; |
- byte_pos = 0; |
- ch = 0; |
- } |
- } |
- return result; |
- } |
- return result; |
-} |
- |
-CPDF_ToUnicodeMap::CPDF_ToUnicodeMap() : m_pBaseMap(nullptr) {} |
- |
-CPDF_ToUnicodeMap::~CPDF_ToUnicodeMap() {} |
- |
-void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { |
- CIDSet cid_set = CIDSET_UNKNOWN; |
- CPDF_StreamAcc stream; |
- stream.LoadAllData(pStream, FALSE); |
- CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); |
- while (1) { |
- CFX_ByteStringC word = parser.GetWord(); |
- if (word.IsEmpty()) { |
- break; |
- } |
- if (word == "beginbfchar") { |
- while (1) { |
- word = parser.GetWord(); |
- if (word.IsEmpty() || word == "endbfchar") { |
- break; |
- } |
- uint32_t srccode = StringToCode(word); |
- word = parser.GetWord(); |
- CFX_WideString destcode = StringToWideString(word); |
- int len = destcode.GetLength(); |
- if (len == 0) { |
- continue; |
- } |
- if (len == 1) { |
- m_Map[srccode] = destcode.GetAt(0); |
- } else { |
- m_Map[srccode] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
- m_MultiCharBuf.AppendChar(destcode.GetLength()); |
- m_MultiCharBuf << destcode; |
- } |
- } |
- } else if (word == "beginbfrange") { |
- while (1) { |
- CFX_ByteString low, high; |
- low = parser.GetWord(); |
- if (low.IsEmpty() || low == "endbfrange") { |
- break; |
- } |
- high = parser.GetWord(); |
- uint32_t lowcode = StringToCode(low.AsStringC()); |
- uint32_t highcode = |
- (lowcode & 0xffffff00) | (StringToCode(high.AsStringC()) & 0xff); |
- if (highcode == (uint32_t)-1) { |
- break; |
- } |
- CFX_ByteString start(parser.GetWord()); |
- if (start == "[") { |
- for (uint32_t code = lowcode; code <= highcode; code++) { |
- CFX_ByteString dest(parser.GetWord()); |
- CFX_WideString destcode = StringToWideString(dest.AsStringC()); |
- int len = destcode.GetLength(); |
- if (len == 0) { |
- continue; |
- } |
- if (len == 1) { |
- m_Map[code] = destcode.GetAt(0); |
- } else { |
- m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
- m_MultiCharBuf.AppendChar(destcode.GetLength()); |
- m_MultiCharBuf << destcode; |
- } |
- } |
- parser.GetWord(); |
- } else { |
- CFX_WideString destcode = StringToWideString(start.AsStringC()); |
- int len = destcode.GetLength(); |
- uint32_t value = 0; |
- if (len == 1) { |
- value = StringToCode(start.AsStringC()); |
- for (uint32_t code = lowcode; code <= highcode; code++) { |
- m_Map[code] = value++; |
- } |
- } else { |
- for (uint32_t code = lowcode; code <= highcode; code++) { |
- CFX_WideString retcode; |
- if (code == lowcode) { |
- retcode = destcode; |
- } else { |
- retcode = StringDataAdd(destcode); |
- } |
- m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
- m_MultiCharBuf.AppendChar(retcode.GetLength()); |
- m_MultiCharBuf << retcode; |
- destcode = retcode; |
- } |
- } |
- } |
- } |
- } else if (word == "/Adobe-Korea1-UCS2") { |
- cid_set = CIDSET_KOREA1; |
- } else if (word == "/Adobe-Japan1-UCS2") { |
- cid_set = CIDSET_JAPAN1; |
- } else if (word == "/Adobe-CNS1-UCS2") { |
- cid_set = CIDSET_CNS1; |
- } else if (word == "/Adobe-GB1-UCS2") { |
- cid_set = CIDSET_GB1; |
- } |
- } |
- if (cid_set) { |
- m_pBaseMap = CPDF_ModuleMgr::Get() |
- ->GetPageModule() |
- ->GetFontGlobals() |
- ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); |
- } else { |
- m_pBaseMap = nullptr; |
- } |
-} |