7#include "core/fpdfapi/font/cpdf_cmapparser.h"
14#include "core/fpdfapi/cmaps/fpdf_cmaps.h"
15#include "core/fpdfapi/parser/cpdf_array.h"
16#include "core/fpdfapi/parser/cpdf_dictionary.h"
17#include "core/fpdfapi/parser/cpdf_simple_parser.h"
18#include "core/fxcrt/check.h"
19#include "core/fxcrt/fx_extension.h"
20#include "core/fxcrt/fx_safe_types.h"
25 if (word.GetLength() <= 2)
26 return ByteStringView();
27 return word.Last(word.GetLength() - 2);
35 m_pCMap->SetAdditionalMappings(std::move(m_AdditionalCharcodeToCIDMappings));
36 m_pCMap->SetMixedFourByteLeadingRanges(std::move(m_Ranges));
42 if (word ==
"begincidchar") {
43 m_Status = kProcessingCidChar;
45 }
else if (word ==
"begincidrange") {
46 m_Status = kProcessingCidRange;
48 }
else if (word ==
"endcidrange" || word ==
"endcidchar") {
50 }
else if (word ==
"/WMode") {
51 m_Status = kProcessingWMode;
52 }
else if (word ==
"/Registry") {
53 m_Status = kProcessingRegistry;
54 }
else if (word ==
"/Ordering") {
55 m_Status = kProcessingOrdering;
56 }
else if (word ==
"/Supplement") {
57 m_Status = kProcessingSupplement;
58 }
else if (word ==
"begincodespacerange") {
59 m_Status = kProcessingCodeSpaceRange;
61 }
else if (word ==
"usecmap") {
62 }
else if (m_Status == kProcessingCidChar) {
64 }
else if (m_Status == kProcessingCidRange) {
66 }
else if (m_Status == kProcessingRegistry) {
68 }
else if (m_Status == kProcessingOrdering) {
69 m_pCMap->SetCharset(CharsetFromOrdering(CMap_GetString(word)));
71 }
else if (m_Status == kProcessingSupplement) {
73 }
else if (m_Status == kProcessingWMode) {
74 m_pCMap->SetVertical(GetCode(word) != 0);
76 }
else if (m_Status == kProcessingCodeSpaceRange) {
77 HandleCodeSpaceRange(word);
83 DCHECK(m_Status == kProcessingCidChar || m_Status == kProcessingCidRange);
84 bool bChar = m_Status == kProcessingCidChar;
86 m_CodePoints[m_CodeSeq] = GetCode(word);
88 int nRequiredCodePoints = bChar ? 2 : 3;
89 if (m_CodeSeq < nRequiredCodePoints)
92 uint32_t StartCode = m_CodePoints[0];
97 StartCID =
static_cast<uint16_t>(m_CodePoints[1]);
99 EndCode = m_CodePoints[1];
100 StartCID =
static_cast<uint16_t>(m_CodePoints[2]);
102 if (EndCode < CPDF_CMap::kDirectMapTableSize) {
103 m_pCMap->SetDirectCharcodeToCIDTableRange(StartCode, EndCode, StartCID);
105 m_AdditionalCharcodeToCIDMappings.push_back({StartCode, EndCode, StartCID});
111 if (word !=
"endcodespacerange") {
112 if (word.IsEmpty() || word[0] !=
'<')
117 GetCodeRange(m_LastWord.AsStringView(), word);
118 if (range.has_value())
119 m_PendingRanges.push_back(range.value());
125 size_t nSegs = m_Ranges.size() + m_PendingRanges.size();
127 const auto& first_range =
128 !m_Ranges.empty() ? m_Ranges[0] : m_PendingRanges[0];
129 m_pCMap->SetCodingScheme(first_range.m_CharSize == 2 ? CPDF_CMap::TwoBytes
130 : CPDF_CMap::OneByte);
131 }
else if (nSegs > 1) {
132 m_pCMap->SetCodingScheme(CPDF_CMap::MixedFourBytes);
133 m_Ranges.reserve(nSegs);
134 std::move(m_PendingRanges.begin(), m_PendingRanges.end(),
135 std::back_inserter(m_Ranges));
136 m_PendingRanges.clear();
147 if (word[0] ==
'<') {
148 for (size_t i = 1; i < word.GetLength() && isxdigit(word[i]); ++i) {
149 num = num * 16 + FXSYS_HexCharToInt(word[i]);
153 return num.ValueOrDie();
156 for (size_t i = 0; i < word.GetLength() && isdigit(word[i]); ++i) {
161 return num.ValueOrDie();
168 if (first.IsEmpty() || first[0] !=
'<')
172 for (i = 1; i < first.GetLength(); ++i) {
176 size_t char_size = (i - 1) / 2;
181 range.m_CharSize = char_size;
182 for (i = 0; i < range.m_CharSize; ++i) {
183 uint8_t digit1 = first[i * 2 + 1];
184 uint8_t digit2 = first[i * 2 + 2];
189 size_t size = second.GetLength();
190 for (i = 0; i < range.m_CharSize; ++i) {
191 size_t i1 = i * 2 + 1;
193 uint8_t digit1 = i1 < size ? second[i1] :
'0';
194 uint8_t digit2 = i2 < size ? second[i2] :
'0';
204 {
nullptr,
"GB1",
"CNS1",
"Japan1",
"Korea1",
"UCS"}};
206 for (size_t charset = 1; charset <
std::size(kCharsetNames); ++charset) {
207 if (ordering == kCharsetNames[charset])
208 return static_cast<
CIDSet>(charset);
static CIDSet CharsetFromOrdering(ByteStringView ordering)
CPDF_CMapParser(CPDF_CMap *pCMap)
void ParseWord(ByteStringView word)
int FXSYS_DecimalCharToInt(wchar_t c)
int FXSYS_HexCharToInt(char c)
pdfium::CheckedNumeric< uint32_t > FX_SAFE_UINT32
fxcrt::ByteStringView ByteStringView