1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "font_int.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_module.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_page.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_resource.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_ext.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxge/fx_freetype.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxge/fx_ge.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_cmaps/cmap_int.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace {
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst FX_CHAR* const g_CharsetNames[CIDSET_NUM_SETS] =
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {nullptr, "GB1", "CNS1", "Japan1", "Korea1", "UCS"};
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst int g_CharsetCPs[CIDSET_NUM_SETS] = {0, 936, 950, 932, 949, 1200};
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CPDF_PredefinedCMap {
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public:
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_CHAR* m_pName;
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CIDSet m_Charset;
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int m_Coding;
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_CMap::CodingScheme m_CodingScheme;
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD m_LeadingSegCount;
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t m_LeadingSegs[4];
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_PredefinedCMap g_PredefinedCMaps[] = {
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GB-EUC",
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfe}},
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GBpc-EUC",
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfc}},
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GBK-EUC",
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GBKp-EUC",
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GBK2K-EUC",
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"GBK2K",
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_GB1,
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_GB,
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes},
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes},
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"B5pc",
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_CNS1,
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_BIG5,
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfc}},
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"HKscs-B5",
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_CNS1,
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_BIG5,
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x88, 0xfe}},
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"ETen-B5",
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_CNS1,
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_BIG5,
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfe}},
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"ETenms-B5",
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_CNS1,
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_BIG5,
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfe}},
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes},
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes},
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"83pv-RKSJ",
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"90ms-RKSJ",
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"90msp-RKSJ",
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"90pv-RKSJ",
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"Add-RKSJ",
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"EUC",
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x8e, 0x8e, 0xa1, 0xfe}},
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}},
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}},
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"Ext-RKSJ",
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_JAPAN1,
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_JIS,
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     2,
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes},
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniJIS-UCS2-HW", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes},
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniJIS-UTF16", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes},
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"KSC-EUC",
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_KOREA1,
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_KOREA,
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfe}},
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"KSCms-UHC",
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_KOREA1,
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_KOREA,
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"KSCms-UHC-HW",
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_KOREA1,
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_KOREA,
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0x81, 0xfe}},
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"KSCpc-EUC",
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDSET_KOREA1,
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CIDCODING_KOREA,
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     1,
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann     {0xa1, 0xfd}},
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes},
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    {"UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes},
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCIDSet CIDSetFromSizeT(size_t index) {
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index >= CIDSET_NUM_SETS) {
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    NOTREACHED();
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CIDSET_UNKNOWN;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return static_cast<CIDSet>(index);
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCIDSet CharsetFromOrdering(const CFX_ByteString& ordering) {
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ordering == CFX_ByteStringC(g_CharsetNames[charset]))
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return CIDSetFromSizeT(charset);
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CIDSET_UNKNOWN;
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CMap_GetString(const CFX_ByteStringC& word) {
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return word.Mid(1, word.GetLength() - 2);
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CompareDWORD(const void* data1, const void* data2) {
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CompareCID(const void* key, const void* element) {
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((*(FX_DWORD*)key) >
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 1;
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CheckCodeRange(uint8_t* codes,
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   int size,
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   CMap_CodeRange* pRanges,
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   int nRanges) {
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iSeg = nRanges - 1;
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iSeg >= 0) {
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pRanges[iSeg].m_CharSize < size) {
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      --iSeg;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iChar = 0;
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (iChar < size) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ++iChar;
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iChar == pRanges[iSeg].m_CharSize)
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 2;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iChar)
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (size == pRanges[iSeg].m_CharSize) ? 2 : 1;
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iSeg--;
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint GetCharSizeImpl(FX_DWORD charcode,
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    CMap_CodeRange* pRanges,
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    int iRangesSize) {
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!iRangesSize)
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 1;
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t codes[4];
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  codes[0] = codes[1] = 0x00;
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  codes[2] = (uint8_t)(charcode >> 8 & 0xFF);
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  codes[3] = (uint8_t)charcode;
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int offset = 0;
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int size = 4;
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < 4; ++i) {
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iSeg = iRangesSize - 1;
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (iSeg >= 0) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pRanges[iSeg].m_CharSize < size) {
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        --iSeg;
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iChar = 0;
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (iChar < size) {
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ++iChar;
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iChar == pRanges[iSeg].m_CharSize)
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return size;
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      --iSeg;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    --size;
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ++offset;
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 1;
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool IsValidEmbeddedCharcodeFromUnicodeCharset(CIDSet charset) {
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (charset) {
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDSET_GB1:
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDSET_CNS1:
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDSET_JAPAN1:
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDSET_KOREA1:
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return true;
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return false;
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap,
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     CIDSet charset,
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_WCHAR unicode) {
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsValidEmbeddedCharcodeFromUnicodeCharset(charset))
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_FontGlobals* pFontGlobals =
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCodes)
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < nCodes; ++i) {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pCodes[i] == unicode) {
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (CharCode != 0) {
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return CharCode;
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WCHAR EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap,
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     CIDSet charset,
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD charcode) {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsValidEmbeddedCharcodeFromUnicodeCharset(charset))
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (cid == 0)
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_FontGlobals* pFontGlobals =
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCodes)
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count)
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pCodes[cid];
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid FT_UseCIDCharmap(FXFT_Face face, int coding) {
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int encoding;
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (coding) {
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_GB:
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoding = FXFT_ENCODING_GB2312;
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_BIG5:
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoding = FXFT_ENCODING_BIG5;
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_JIS:
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoding = FXFT_ENCODING_SJIS;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_KOREA:
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoding = FXFT_ENCODING_JOHAB;
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoding = FXFT_ENCODING_UNICODE;
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int err = FXFT_Select_Charmap(face, encoding);
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (err) {
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (err && FXFT_Get_Face_Charmaps(face)) {
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst struct CIDTransform {
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD CID;
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t a, b, c, d, e, f;
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} g_Japan1_VertCIDs[] = {
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {97, 129, 0, 0, 127, 55, 0},
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7887, 127, 0, 0, 127, 76, 89},
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7888, 127, 0, 0, 127, 79, 94},
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7889, 0, 129, 127, 0, 17, 127},
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7890, 0, 129, 127, 0, 17, 127},
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7891, 0, 129, 127, 0, 17, 127},
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7892, 0, 129, 127, 0, 17, 127},
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7893, 0, 129, 127, 0, 17, 127},
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7894, 0, 129, 127, 0, 17, 127},
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7895, 0, 129, 127, 0, 17, 127},
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7896, 0, 129, 127, 0, 17, 127},
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7897, 0, 129, 127, 0, 17, 127},
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7898, 0, 129, 127, 0, 17, 127},
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7899, 0, 129, 127, 0, 17, 104},
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7900, 0, 129, 127, 0, 17, 127},
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7901, 0, 129, 127, 0, 17, 104},
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7902, 0, 129, 127, 0, 17, 127},
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7903, 0, 129, 127, 0, 17, 127},
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7904, 0, 129, 127, 0, 17, 127},
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7905, 0, 129, 127, 0, 17, 114},
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7906, 0, 129, 127, 0, 17, 127},
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7907, 0, 129, 127, 0, 17, 127},
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7908, 0, 129, 127, 0, 17, 127},
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7909, 0, 129, 127, 0, 17, 127},
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7910, 0, 129, 127, 0, 17, 127},
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7911, 0, 129, 127, 0, 17, 127},
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7912, 0, 129, 127, 0, 17, 127},
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7913, 0, 129, 127, 0, 17, 127},
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7914, 0, 129, 127, 0, 17, 127},
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7915, 0, 129, 127, 0, 17, 114},
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7916, 0, 129, 127, 0, 17, 127},
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7917, 0, 129, 127, 0, 17, 127},
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7918, 127, 0, 0, 127, 18, 25},
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7919, 127, 0, 0, 127, 18, 25},
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7920, 127, 0, 0, 127, 18, 25},
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7921, 127, 0, 0, 127, 18, 25},
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7922, 127, 0, 0, 127, 18, 25},
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7923, 127, 0, 0, 127, 18, 25},
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7924, 127, 0, 0, 127, 18, 25},
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7925, 127, 0, 0, 127, 18, 25},
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7926, 127, 0, 0, 127, 18, 25},
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7927, 127, 0, 0, 127, 18, 25},
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7928, 127, 0, 0, 127, 18, 25},
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7929, 127, 0, 0, 127, 18, 25},
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7930, 127, 0, 0, 127, 18, 25},
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7931, 127, 0, 0, 127, 18, 25},
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7932, 127, 0, 0, 127, 18, 25},
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7933, 127, 0, 0, 127, 18, 25},
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7934, 127, 0, 0, 127, 18, 25},
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7935, 127, 0, 0, 127, 18, 25},
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7936, 127, 0, 0, 127, 18, 25},
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7937, 127, 0, 0, 127, 18, 25},
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7938, 127, 0, 0, 127, 18, 25},
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {7939, 127, 0, 0, 127, 18, 25},
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8720, 0, 129, 127, 0, 19, 102},
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8721, 0, 129, 127, 0, 13, 127},
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8722, 0, 129, 127, 0, 19, 108},
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8723, 0, 129, 127, 0, 19, 102},
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8724, 0, 129, 127, 0, 19, 102},
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8725, 0, 129, 127, 0, 19, 102},
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8726, 0, 129, 127, 0, 19, 102},
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8727, 0, 129, 127, 0, 19, 102},
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8728, 0, 129, 127, 0, 19, 114},
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8729, 0, 129, 127, 0, 19, 114},
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8730, 0, 129, 127, 0, 38, 108},
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8731, 0, 129, 127, 0, 13, 108},
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8732, 0, 129, 127, 0, 19, 108},
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8733, 0, 129, 127, 0, 19, 108},
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8734, 0, 129, 127, 0, 19, 108},
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8735, 0, 129, 127, 0, 19, 108},
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8736, 0, 129, 127, 0, 19, 102},
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8737, 0, 129, 127, 0, 19, 102},
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8738, 0, 129, 127, 0, 19, 102},
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8739, 0, 129, 127, 0, 19, 102},
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8740, 0, 129, 127, 0, 19, 102},
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8741, 0, 129, 127, 0, 19, 102},
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8742, 0, 129, 127, 0, 19, 102},
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8743, 0, 129, 127, 0, 19, 102},
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8744, 0, 129, 127, 0, 19, 102},
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8745, 0, 129, 127, 0, 19, 102},
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8746, 0, 129, 127, 0, 19, 114},
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8747, 0, 129, 127, 0, 19, 114},
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8748, 0, 129, 127, 0, 19, 102},
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8749, 0, 129, 127, 0, 19, 102},
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8750, 0, 129, 127, 0, 19, 102},
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8751, 0, 129, 127, 0, 19, 102},
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8752, 0, 129, 127, 0, 19, 102},
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8753, 0, 129, 127, 0, 19, 102},
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8754, 0, 129, 127, 0, 19, 102},
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8755, 0, 129, 127, 0, 19, 102},
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8756, 0, 129, 127, 0, 19, 102},
456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8757, 0, 129, 127, 0, 19, 102},
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8758, 0, 129, 127, 0, 19, 102},
458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8759, 0, 129, 127, 0, 19, 102},
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8760, 0, 129, 127, 0, 19, 102},
460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8761, 0, 129, 127, 0, 19, 102},
461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8762, 0, 129, 127, 0, 19, 102},
462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8763, 0, 129, 127, 0, 19, 102},
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8764, 0, 129, 127, 0, 19, 102},
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8765, 0, 129, 127, 0, 19, 102},
465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8766, 0, 129, 127, 0, 19, 102},
466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8767, 0, 129, 127, 0, 19, 102},
467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8768, 0, 129, 127, 0, 19, 102},
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8769, 0, 129, 127, 0, 19, 102},
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8770, 0, 129, 127, 0, 19, 102},
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8771, 0, 129, 127, 0, 19, 102},
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8772, 0, 129, 127, 0, 19, 102},
472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8773, 0, 129, 127, 0, 19, 102},
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8774, 0, 129, 127, 0, 19, 102},
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8775, 0, 129, 127, 0, 19, 102},
475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8776, 0, 129, 127, 0, 19, 102},
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8777, 0, 129, 127, 0, 19, 102},
477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8778, 0, 129, 127, 0, 19, 102},
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8779, 0, 129, 127, 0, 19, 114},
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8780, 0, 129, 127, 0, 19, 108},
480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8781, 0, 129, 127, 0, 19, 114},
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8782, 0, 129, 127, 0, 13, 114},
482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8783, 0, 129, 127, 0, 19, 108},
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8784, 0, 129, 127, 0, 13, 114},
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8785, 0, 129, 127, 0, 19, 108},
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8786, 0, 129, 127, 0, 19, 108},
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8787, 0, 129, 127, 0, 19, 108},
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8788, 0, 129, 127, 0, 19, 108},
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8789, 0, 129, 127, 0, 19, 108},
489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8790, 0, 129, 127, 0, 19, 108},
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8791, 0, 129, 127, 0, 19, 108},
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8792, 0, 129, 127, 0, 19, 108},
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8793, 0, 129, 127, 0, 19, 108},
493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8794, 0, 129, 127, 0, 19, 108},
494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8795, 0, 129, 127, 0, 19, 108},
495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8796, 0, 129, 127, 0, 19, 108},
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8797, 0, 129, 127, 0, 19, 108},
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8798, 0, 129, 127, 0, 19, 108},
498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8799, 0, 129, 127, 0, 19, 108},
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8800, 0, 129, 127, 0, 19, 108},
500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8801, 0, 129, 127, 0, 19, 108},
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8802, 0, 129, 127, 0, 19, 108},
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8803, 0, 129, 127, 0, 19, 108},
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8804, 0, 129, 127, 0, 19, 108},
504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8805, 0, 129, 127, 0, 19, 108},
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8806, 0, 129, 127, 0, 19, 108},
506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8807, 0, 129, 127, 0, 19, 108},
507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8808, 0, 129, 127, 0, 19, 108},
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8809, 0, 129, 127, 0, 19, 108},
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8810, 0, 129, 127, 0, 19, 108},
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8811, 0, 129, 127, 0, 19, 114},
511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8812, 0, 129, 127, 0, 19, 102},
512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8813, 0, 129, 127, 0, 19, 114},
513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8814, 0, 129, 127, 0, 76, 102},
514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8815, 0, 129, 127, 0, 13, 121},
515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8816, 0, 129, 127, 0, 19, 114},
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8817, 0, 129, 127, 0, 19, 127},
517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8818, 0, 129, 127, 0, 19, 114},
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    {8819, 0, 129, 127, 0, 218, 108},
519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CompareCIDTransform(const void* key, const void* element) {
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD CID = *static_cast<const FX_WORD*>(key);
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CID - static_cast<const struct CIDTransform*>(element)->CID;
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}  // namespace
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMapManager::CPDF_CMapManager() {
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bPrompted = FALSE;
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMapManager::~CPDF_CMapManager() {
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& pair : m_CMaps) {
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pair.second;
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CMaps.clear();
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(m_CID2UnicodeMaps); ++i) {
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_CID2UnicodeMaps[i];
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name,
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_BOOL bPromptCJK) {
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_CMaps.find(name);
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != m_CMaps.end()) {
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return it->second;
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_CMap* pCMap = LoadPredefinedCMap(name, bPromptCJK);
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!name.IsEmpty()) {
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CMaps[name] = pCMap;
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pCMap;
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name,
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_BOOL bPromptCJK) {
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_CMap* pCMap = new CPDF_CMap;
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_CHAR* pname = name;
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (*pname == '/') {
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pname++;
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCMap->LoadPredefined(this, pname, bPromptCJK);
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pCMap;
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CMapManager::ReloadAll() {
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& pair : m_CMaps) {
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_CMap* pCMap = pair.second;
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCMap->LoadPredefined(this, pair.first, FALSE);
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(m_CID2UnicodeMaps); ++i) {
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i]) {
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pMap->Load(this, CIDSetFromSizeT(i), FALSE);
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(CIDSet charset,
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                         FX_BOOL bPromptCJK) {
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_CID2UnicodeMaps[charset])
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_CID2UnicodeMaps[charset];
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(CIDSet charset,
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                          FX_BOOL bPromptCJK) {
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_CID2UnicodeMap* pMap = new CPDF_CID2UnicodeMap();
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pMap->Initialize()) {
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pMap;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pMap->Load(this, charset, bPromptCJK);
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pMap;
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMapParser::CPDF_CMapParser() {
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCMap = NULL;
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Status = 0;
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CodeSeq = 0;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CMapParser::Initialize(CPDF_CMap* pCMap) {
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCMap = pCMap;
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Status = 0;
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CodeSeq = 0;
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_AddMaps.EstimateSize(0, 10240);
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CMapParser::ParseWord(const CFX_ByteStringC& word) {
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (word.IsEmpty()) {
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (word == "begincidchar") {
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 1;
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodeSeq = 0;
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "begincidrange") {
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 2;
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodeSeq = 0;
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "endcidrange" || word == "endcidchar") {
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 0;
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "/WMode") {
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 6;
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "/Registry") {
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 3;
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "/Ordering") {
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 4;
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "/Supplement") {
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 5;
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "begincodespacerange") {
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 7;
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodeSeq = 0;
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (word == "usecmap") {
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 1 || m_Status == 2) {
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodePoints[m_CodeSeq] = CMap_GetCode(word);
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodeSeq++;
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD StartCode, EndCode;
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_WORD StartCID;
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_Status == 1) {
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_CodeSeq < 2) {
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      EndCode = StartCode = m_CodePoints[0];
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      StartCID = (FX_WORD)m_CodePoints[1];
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_CodeSeq < 3) {
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      StartCode = m_CodePoints[0];
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      EndCode = m_CodePoints[1];
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      StartCID = (FX_WORD)m_CodePoints[2];
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (EndCode < 0x10000) {
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (FX_DWORD code = StartCode; code <= EndCode; code++) {
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD buf[2];
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      buf[0] = StartCode;
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      buf[1] = ((EndCode - StartCode) << 16) + StartCID;
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_AddMaps.AppendBlock(buf, sizeof buf);
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CodeSeq = 0;
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 3) {
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CMap_GetString(word);
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 0;
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 4) {
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCMap->m_Charset = CharsetFromOrdering(CMap_GetString(word));
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 0;
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 5) {
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CMap_GetCode(word);
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 0;
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 6) {
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCMap->m_bVertical = CMap_GetCode(word);
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Status = 0;
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_Status == 7) {
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (word == "endcodespacerange") {
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int nSegs = m_CodeRanges.GetSize();
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nSegs > 1) {
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCMap->m_nCodeRanges = nSegs;
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCMap->m_pLeadingBytes =
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_Alloc2D(uint8_t, nSegs, sizeof(CMap_CodeRange));
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXSYS_memcpy(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(),
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     nSegs * sizeof(CMap_CodeRange));
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (nSegs == 1) {
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2)
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      ? CPDF_CMap::TwoBytes
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      : CPDF_CMap::OneByte;
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Status = 0;
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (word.GetLength() == 0 || word.GetAt(0) != '<') {
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_CodeSeq % 2) {
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CMap_CodeRange range;
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (CMap_GetCodeRange(range, m_LastWord, word)) {
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_CodeRanges.Add(range);
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_CodeSeq++;
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_LastWord = word;
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Static.
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_CMapParser::CMap_GetCode(const CFX_ByteStringC& word) {
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int num = 0;
705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (word.GetAt(0) == '<') {
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int i = 1; i < word.GetLength() && std::isxdigit(word.GetAt(i)); ++i)
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      num = num * 16 + FXSYS_toHexDigit(word.GetAt(i));
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return num;
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < word.GetLength() && std::isdigit(word.GetAt(i)); ++i)
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    num = num * 10 + FXSYS_toDecimalDigit(word.GetAt(i));
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return num;
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Static.
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannbool CPDF_CMapParser::CMap_GetCodeRange(CMap_CodeRange& range,
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        const CFX_ByteStringC& first,
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        const CFX_ByteStringC& second) {
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (first.GetLength() == 0 || first.GetAt(0) != '<')
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return false;
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int i;
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 1; i < first.GetLength(); ++i) {
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (first.GetAt(i) == '>') {
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  range.m_CharSize = (i - 1) / 2;
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (range.m_CharSize > 4)
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return false;
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < range.m_CharSize; ++i) {
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t digit1 = first.GetAt(i * 2 + 1);
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t digit2 = first.GetAt(i * 2 + 2);
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    range.m_Lower[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD size = second.GetLength();
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < range.m_CharSize; ++i) {
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t digit1 = ((FX_DWORD)i * 2 + 1 < size)
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         ? second.GetAt((FX_STRSIZE)i * 2 + 1)
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         : '0';
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t digit2 = ((FX_DWORD)i * 2 + 2 < size)
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         ? second.GetAt((FX_STRSIZE)i * 2 + 2)
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         : '0';
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    range.m_Upper[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return true;
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMap::CPDF_CMap() {
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Charset = CIDSET_UNKNOWN;
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Coding = CIDCODING_UNKNOWN;
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CodingScheme = TwoBytes;
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bVertical = 0;
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bLoaded = FALSE;
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pMapping = NULL;
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pLeadingBytes = NULL;
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pAddMapping = NULL;
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEmbedMap = NULL;
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pUseMap = NULL;
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCodeRanges = 0;
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CMap::~CPDF_CMap() {
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(m_pMapping);
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(m_pAddMapping);
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(m_pLeadingBytes);
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pUseMap;
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CMap::Release() {
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PredefinedCMap.IsEmpty()) {
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete this;
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr,
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  const FX_CHAR* pName,
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_BOOL bPromptCJK) {
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PredefinedCMap = pName;
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PredefinedCMap == "Identity-H" || m_PredefinedCMap == "Identity-V") {
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Coding = CIDCODING_CID;
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bVertical = pName[9] == 'V';
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bLoaded = TRUE;
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString cmapid = m_PredefinedCMap;
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bVertical = cmapid.Right(1) == "V";
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (cmapid.GetLength() > 2) {
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    cmapid = cmapid.Left(cmapid.GetLength() - 2);
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const CPDF_PredefinedCMap* map = nullptr;
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(g_PredefinedCMaps); ++i) {
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[i].m_pName)) {
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      map = &g_PredefinedCMaps[i];
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!map)
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Charset = map->m_Charset;
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Coding = map->m_Coding;
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_CodingScheme = map->m_CodingScheme;
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_CodingScheme == MixedTwoBytes) {
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pLeadingBytes = FX_Alloc(uint8_t, 256);
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (FX_DWORD i = 0; i < map->m_LeadingSegCount; ++i) {
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const uint8_t* segs = map->m_LeadingSegs;
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (int b = segs[i * 2]; b <= segs[i * 2 + 1]; ++b) {
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pLeadingBytes[b] = 1;
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pEmbedMap) {
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bLoaded = TRUE;
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CMap::LoadEmbedded(const uint8_t* pData, FX_DWORD size) {
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pMapping = FX_Alloc(FX_WORD, 65536);
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_CMapParser parser;
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  parser.Initialize(this);
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_SimpleParser syntax(pData, size);
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (1) {
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteStringC word = syntax.GetWord();
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (word.IsEmpty()) {
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    parser.ParseWord(word);
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pAddMapping = FX_Alloc(uint8_t, parser.m_AddMaps.GetSize() + 4);
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(),
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                 parser.m_AddMaps.GetSize());
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8,
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                CompareDWORD);
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const {
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Coding == CIDCODING_CID) {
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (FX_WORD)charcode;
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pEmbedMap) {
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pMapping) {
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (FX_WORD)charcode;
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (charcode >> 16) {
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pAddMapping) {
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4,
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  *(FX_DWORD*)m_pAddMapping, 8, CompareCID);
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!found) {
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_pUseMap) {
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return m_pUseMap->CIDFromCharCode(charcode);
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 0;
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode -
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       *(FX_DWORD*)found);
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pUseMap)
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return m_pUseMap->CIDFromCharCode(charcode);
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD CID = m_pMapping[charcode];
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!CID && m_pUseMap)
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pUseMap->CIDFromCharCode(charcode);
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (FX_WORD)CID;
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_CMap::GetNextChar(const FX_CHAR* pString,
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int nStrLen,
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                int& offset) const {
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_CodingScheme) {
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case OneByte:
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return ((uint8_t*)pString)[offset++];
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case TwoBytes:
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      offset += 2;
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return ((uint8_t*)pString)[offset - 2] * 256 +
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             ((uint8_t*)pString)[offset - 1];
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedTwoBytes: {
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      uint8_t byte1 = ((uint8_t*)pString)[offset++];
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_pLeadingBytes[byte1]) {
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return byte1;
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      uint8_t byte2 = ((uint8_t*)pString)[offset++];
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return byte1 * 256 + byte2;
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedFourBytes: {
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      uint8_t codes[4];
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int char_size = 1;
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      codes[0] = ((uint8_t*)pString)[offset++];
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes;
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (1) {
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int ret = CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ret == 0) {
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return 0;
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ret == 2) {
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_DWORD charcode = 0;
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (int i = 0; i < char_size; i++) {
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            charcode = (charcode << 8) + codes[i];
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return charcode;
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (char_size == 4 || offset == nStrLen) {
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return 0;
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        codes[char_size++] = ((uint8_t*)pString)[offset++];
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CMap::GetCharSize(FX_DWORD charcode) const {
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_CodingScheme) {
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case OneByte:
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 1;
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case TwoBytes:
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 2;
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedTwoBytes:
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedFourBytes:
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x100) {
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 1;
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x10000) {
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 2;
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x1000000) {
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 3;
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 4;
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 1;
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CMap::CountChar(const FX_CHAR* pString, int size) const {
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_CodingScheme) {
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case OneByte:
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return size;
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case TwoBytes:
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (size + 1) / 2;
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedTwoBytes: {
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int count = 0;
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (int i = 0; i < size; i++) {
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        count++;
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_pLeadingBytes[((uint8_t*)pString)[i]]) {
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          i++;
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return count;
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedFourBytes: {
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int count = 0, offset = 0;
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (offset < size) {
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        GetNextChar(pString, size, offset);
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        count++;
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return count;
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return size;
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CMap::AppendChar(FX_CHAR* str, FX_DWORD charcode) const {
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_CodingScheme) {
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case OneByte:
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[0] = (uint8_t)charcode;
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 1;
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case TwoBytes:
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[0] = (uint8_t)(charcode / 256);
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[1] = (uint8_t)(charcode % 256);
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 2;
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedTwoBytes:
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case MixedFourBytes:
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x100) {
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes;
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iSize = GetCharSizeImpl(charcode, pRanges, m_nCodeRanges);
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iSize == 0) {
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iSize = 1;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iSize > 1) {
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXSYS_memset(str, 0, sizeof(uint8_t) * iSize);
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[iSize - 1] = (uint8_t)charcode;
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return iSize;
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x10000) {
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[0] = (uint8_t)(charcode >> 8);
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[1] = (uint8_t)charcode;
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 2;
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (charcode < 0x1000000) {
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[0] = (uint8_t)(charcode >> 16);
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[1] = (uint8_t)(charcode >> 8);
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        str[2] = (uint8_t)charcode;
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 3;
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[0] = (uint8_t)(charcode >> 24);
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[1] = (uint8_t)(charcode >> 16);
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[2] = (uint8_t)(charcode >> 8);
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      str[3] = (uint8_t)charcode;
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 4;
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap() {
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_EmbeddedCount = 0;
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap() {}
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CID2UnicodeMap::Initialize() {
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CID2UnicodeMap::IsLoaded() {
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_EmbeddedCount != 0;
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID) {
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Charset == CIDSET_UNICODE) {
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CID;
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CID < m_EmbeddedCount) {
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pEmbeddedMap[CID];
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr,
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               CIDSet charset,
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               FX_BOOL bPromptCJK) {
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Charset = charset;
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "ttgsubtable.h"
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CIDFont::CPDF_CIDFont() : CPDF_Font(PDFFONT_CIDFONT) {
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCMap = NULL;
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pAllocatedCMap = NULL;
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCID2UnicodeMap = NULL;
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pAnsiWidths = NULL;
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCIDToGIDMap = NULL;
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bCIDIsGID = FALSE;
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bAdobeCourierStd = FALSE;
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pTTGSUBTable = NULL;
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_CIDFont::~CPDF_CIDFont() {
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pAnsiWidths) {
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pAnsiWidths);
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pAllocatedCMap;
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pCIDToGIDMap;
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pTTGSUBTable;
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const {
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pCMap) {
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (FX_WORD)charcode;
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap->CIDFromCharCode(charcode);
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CIDFont::IsVertWriting() const {
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const {
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_pCMap->m_Coding) {
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_UCS2:
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_UTF16:
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (FX_WCHAR)charcode;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_CID:
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded()) {
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 0;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pCMap->IsLoaded() || !m_pCID2UnicodeMap ||
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      !m_pCID2UnicodeMap->IsLoaded()) {
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_WCHAR unicode;
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int charsize = 1;
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (charcode > 255) {
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      charcode = (charcode % 256) * 256 + (charcode / 256);
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      charsize = 2;
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0,
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        (const FX_CHAR*)&charcode, charsize,
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        &unicode, 1);
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (ret != 1) {
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return unicode;
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pCMap->m_pEmbedMap) {
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap,
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         m_pCMap->m_Charset, charcode);
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const {
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_pCMap->m_Coding) {
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_UNKNOWN:
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_UCS2:
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_UTF16:
1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return unicode;
1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CIDCODING_CID: {
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_pCID2UnicodeMap || !m_pCID2UnicodeMap->IsLoaded()) {
1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return 0;
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD CID = 0;
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      while (CID < 65536) {
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);
1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (this_unicode == unicode) {
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return CID;
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CID++;
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (unicode < 0x80) {
1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return static_cast<FX_DWORD>(unicode);
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCMap->m_Coding == CIDCODING_CID) {
1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t buffer[32];
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ret =
1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1,
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                (char*)buffer, 4, NULL, NULL);
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 1) {
1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return buffer[0];
1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 2) {
1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return buffer[0] * 256 + buffer[1];
1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCMap->m_pEmbedMap) {
1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset,
1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       unicode);
1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CIDFont::_Load() {
1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFontDict->GetString("Subtype") == "TrueType") {
1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return LoadGB2312();
1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pFonts = m_pFontDict->GetArray("DescendantFonts");
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pFonts) {
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFonts->GetCount() != 1) {
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);
1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pCIDFontDict) {
1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_BaseFont = pCIDFontDict->GetString("BaseFont");
1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_BaseFont.Compare("CourierStd") == 0 ||
1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann       m_BaseFont.Compare("CourierStd-Bold") == 0 ||
1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann       m_BaseFont.Compare("CourierStd-BoldOblique") == 0 ||
1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann       m_BaseFont.Compare("CourierStd-Oblique") == 0) &&
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      !IsEmbedded()) {
1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_bAdobeCourierStd = TRUE;
1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict("FontDescriptor");
1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFontDesc) {
1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadFontDescriptor(pFontDesc);
1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pEncoding = m_pFontDict->GetElementValue("Encoding");
1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pEncoding) {
1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString subtype = pCIDFontDict->GetString("Subtype");
1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bType1 = (subtype == "CIDFontType0");
1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pEncoding->IsName()) {
1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString cmap = pEncoding->GetString();
1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCMap =
1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_ModuleMgr::Get()
1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->GetPageModule()
1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->GetFontGlobals()
1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->m_CMapManager.GetPredefinedCMap(cmap, m_pFontFile && m_bType1);
1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (CPDF_Stream* pStream = pEncoding->AsStream()) {
1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pAllocatedCMap = m_pCMap = new CPDF_CMap;
1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamAcc acc;
1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    acc.LoadAllData(pStream, FALSE);
1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());
1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pCMap) {
1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Charset = m_pCMap->m_Charset;
1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Charset == CIDSET_UNKNOWN) {
1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict("CIDSystemInfo");
1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pCIDInfo) {
1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Charset = CharsetFromOrdering(pCIDInfo->GetString("Ordering"));
1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Charset != CIDSET_UNKNOWN)
1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCID2UnicodeMap =
1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_ModuleMgr::Get()
1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->GetPageModule()
1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->GetFontGlobals()
1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ->m_CMapManager.GetCID2UnicodeMap(
1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                m_Charset,
1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID ||
1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 pCIDFontDict->KeyExist("W")));
1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Font.GetFace()) {
1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_bType1) {
1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);
1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_DefaultWidth = pCIDFontDict->GetInteger("DW", 1000);
1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pWidthArray = pCIDFontDict->GetArray("W");
1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pWidthArray) {
1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadMetricsArray(pWidthArray, m_WidthList, 1);
1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsEmbedded()) {
1236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadSubstFont();
1237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (1) {
1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {
1240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pmap = pCIDFontDict->GetElementValue("CIDToGIDMap");
1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pmap) {
1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (CPDF_Stream* pStream = pmap->AsStream()) {
1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCIDToGIDMap = new CPDF_StreamAcc;
1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCIDToGIDMap->LoadAllData(pStream, FALSE);
1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (pmap->GetString() == "Identity") {
1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (m_pFontFile) {
1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_bCIDIsGID = TRUE;
1249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_bCIDIsGID = TRUE;
1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CheckFontMetrics();
1258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsVertWriting()) {
1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pWidthArray = pCIDFontDict->GetArray("W2");
1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pWidthArray) {
1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      LoadMetricsArray(pWidthArray, m_VertMetrics, 3);
1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pDefaultArray = pCIDFontDict->GetArray("DW2");
1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pDefaultArray) {
1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_DefaultVY = pDefaultArray->GetInteger(0);
1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_DefaultW1 = pDefaultArray->GetInteger(1);
1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_DefaultVY = 880;
1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_DefaultW1 = -1000;
1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) {
1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (charcode < 256 && m_CharBBox[charcode].Right != -1) {
1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.bottom = m_CharBBox[charcode].Bottom;
1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.left = m_CharBBox[charcode].Left;
1279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.right = m_CharBBox[charcode].Right;
1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.top = m_CharBBox[charcode].Top;
1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVert = FALSE;
1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int glyph_index = GlyphFromCharCode(charcode, &bVert);
1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXFT_Face face = m_Font.GetFace();
1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (face) {
1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect.left = rect.bottom = rect.right = rect.top = 0;
1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (FXFT_Is_Face_Tricky(face)) {
1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int err = FXFT_Load_Glyph(face, glyph_index,
1290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!err) {
1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXFT_BBox cbox;
1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXFT_Glyph glyph;
1294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);
1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!err) {
1296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;
1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;
1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (pixel_size_x == 0 || pixel_size_y == 0) {
1300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.left = cbox.xMin;
1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.right = cbox.xMax;
1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.top = cbox.yMax;
1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.bottom = cbox.yMin;
1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.left = cbox.xMin * 1000 / pixel_size_x;
1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.right = cbox.xMax * 1000 / pixel_size_x;
1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.top = cbox.yMax * 1000 / pixel_size_y;
1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.bottom = cbox.yMin * 1000 / pixel_size_y;
1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rect.top > FXFT_Get_Face_Ascender(face)) {
1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.top = FXFT_Get_Face_Ascender(face);
1312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rect.bottom < FXFT_Get_Face_Descender(face)) {
1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            rect.bottom = FXFT_Get_Face_Descender(face);
1315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
1316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXFT_Done_Glyph(glyph);
1317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);
1321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (err == 0) {
1322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);
1323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.right = TT2PDF(
1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face),
1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            face);
1326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);
1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.top += rect.top / 64;
1328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rect.bottom = TT2PDF(
1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face),
1330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            face);
1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect = FX_RECT(0, 0, 0, 0);
1335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pFontFile && m_Charset == CIDSET_JAPAN1) {
1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_WORD CID = CIDFromCharCode(charcode);
1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const uint8_t* pTransform = GetCIDTransform(CID);
1339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pTransform && !bVert) {
1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_Matrix matrix(CIDTransformToFloat(pTransform[0]),
1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        CIDTransformToFloat(pTransform[1]),
1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        CIDTransformToFloat(pTransform[2]),
1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        CIDTransformToFloat(pTransform[3]),
1344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        CIDTransformToFloat(pTransform[4]) * 1000,
1345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        CIDTransformToFloat(pTransform[5]) * 1000);
1346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_FloatRect rect_f(rect);
1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect_f.Transform(&matrix);
1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect = rect_f.GetOutterRect();
1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (charcode < 256) {
1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CharBBox[charcode].Bottom = (short)rect.bottom;
1353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CharBBox[charcode].Left = (short)rect.left;
1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CharBBox[charcode].Right = (short)rect.right;
1355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_CharBBox[charcode].Top = (short)rect.top;
1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level) {
1359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pAnsiWidths && charcode < 0x80) {
1360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pAnsiWidths[charcode];
1361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD cid = CIDFromCharCode(charcode);
1363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int size = m_WidthList.GetSize();
1364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD* list = m_WidthList.GetData();
1365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < size; i += 3) {
1366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (cid >= list[i] && cid <= list[i + 1]) {
1367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (int)list[i + 2];
1368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_DefaultWidth;
1371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannshort CPDF_CIDFont::GetVertWidth(FX_WORD CID) const {
1373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
1374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (vertsize == 0) {
1375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_DefaultW1;
1376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_DWORD* pTable = m_VertMetrics.GetData();
1378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (FX_DWORD i = 0; i < vertsize; i++)
1379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
1380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return (short)(int)pTable[i * 5 + 2];
1381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_DefaultW1;
1383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short& vy) const {
1385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
1386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (vertsize) {
1387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const FX_DWORD* pTable = m_VertMetrics.GetData();
1388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (FX_DWORD i = 0; i < vertsize; i++)
1389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
1390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        vx = (short)(int)pTable[i * 5 + 3];
1391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        vy = (short)(int)pTable[i * 5 + 4];
1392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
1393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwWidth = m_DefaultWidth;
1396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int size = m_WidthList.GetSize();
1397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_DWORD* list = m_WidthList.GetData();
1398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < size; i += 3) {
1399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (CID >= list[i] && CID <= list[i + 1]) {
1400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwWidth = (FX_WORD)list[i + 2];
1401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  vx = (short)dwWidth / 2;
1405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  vy = (short)m_DefaultVY;
1406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL* pVertGlyph) {
1408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pVertGlyph) {
1409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *pVertGlyph = FALSE;
1410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXFT_Face face = m_Font.GetFace();
1412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int index = FXFT_Get_Char_Index(face, unicode);
1413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (unicode == 0x2502) {
1414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return index;
1415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index && IsVertWriting()) {
1417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pTTGSUBTable) {
1418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      uint32_t vindex = 0;
1419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
1420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (vindex) {
1421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        index = vindex;
1422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pVertGlyph) {
1423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          *pVertGlyph = TRUE;
1424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return index;
1427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_Font.GetSubData()) {
1429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      unsigned long length = 0;
1430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
1431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       NULL, &length);
1432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!error) {
1433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Font.SetSubData(FX_Alloc(uint8_t, length));
1434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0,
1437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     m_Font.GetSubData(), NULL);
1438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!error && m_Font.GetSubData()) {
1439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTTGSUBTable = new CFX_CTTGSUBTable;
1440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData());
1441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      uint32_t vindex = 0;
1442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
1443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (vindex) {
1444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        index = vindex;
1445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pVertGlyph) {
1446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          *pVertGlyph = TRUE;
1447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return index;
1451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pVertGlyph) {
1453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *pVertGlyph = FALSE;
1454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return index;
1456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL* pVertGlyph) {
1458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pVertGlyph) {
1459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *pVertGlyph = FALSE;
1460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pFontFile && !m_pCIDToGIDMap) {
1462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_WORD cid = CIDFromCharCode(charcode);
1463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_WCHAR unicode = 0;
1464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_bCIDIsGID) {
1465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
1466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return cid;
1467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
1468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_Flags & PDFFONT_SYMBOLIC) {
1469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return cid;
1470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString uni_str = UnicodeFromCharCode(charcode);
1472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (uni_str.IsEmpty()) {
1473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return cid;
1474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      unicode = uni_str.GetAt(0);
1476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {
1479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);
1480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (unicode == 0) {
1482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = _UnicodeFromCharCode(charcode);
1483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {
1485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = UnicodeFromCharCode(charcode).GetAt(0);
1486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXFT_Face face = m_Font.GetFace();
1489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (unicode == 0) {
1490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!m_bAdobeCourierStd) {
1491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return charcode == 0 ? -1 : (int)charcode;
1492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      charcode += 31;
1494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int index = 0, iBaseEncoding;
1495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_BOOL bMSUnicode = FT_UseTTCharmap(face, 3, 1);
1496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_BOOL bMacRoman = FALSE;
1497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!bMSUnicode) {
1498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bMacRoman = FT_UseTTCharmap(face, 1, 0);
1499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iBaseEncoding = PDFFONT_ENCODING_STANDARD;
1501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bMSUnicode) {
1502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iBaseEncoding = PDFFONT_ENCODING_WINANSI;
1503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (bMacRoman) {
1504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iBaseEncoding = PDFFONT_ENCODING_MACROMAN;
1505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const FX_CHAR* name = GetAdobeCharName(iBaseEncoding, NULL, charcode);
1507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!name) {
1508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return charcode == 0 ? -1 : (int)charcode;
1509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_WORD unicode = PDF_UnicodeFromAdobeName(name);
1511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (unicode) {
1512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bMSUnicode) {
1513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          index = FXFT_Get_Char_Index(face, unicode);
1514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (bMacRoman) {
1515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_DWORD maccode =
1516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);
1517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          index = !maccode ? FXFT_Get_Name_Index(face, (char*)name)
1518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                           : FXFT_Get_Char_Index(face, maccode);
1519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
1520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FXFT_Get_Char_Index(face, unicode);
1521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return charcode == 0 ? -1 : (int)charcode;
1524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (index == 0 || index == 0xffff) {
1526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return charcode == 0 ? -1 : (int)charcode;
1527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return index;
1529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_Charset == CIDSET_JAPAN1) {
1531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (unicode == '\\') {
1532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = '/';
1533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
1535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      else if (unicode == 0xa5) {
1536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = 0x5c;
1537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
1540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!face)
1541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return unicode;
1542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
1544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (err != 0) {
1545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int i;
1546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) {
1547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_DWORD ret = FT_CharCodeFromUnicode(
1548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]),
1549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            (FX_WCHAR)charcode);
1550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (ret == 0) {
1551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          continue;
1552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
1554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = (FX_WCHAR)ret;
1555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
1556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (i == FXFT_Get_Face_CharmapCount(face) && i) {
1558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
1559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        unicode = (FX_WCHAR)charcode;
1560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (FXFT_Get_Face_Charmap(face)) {
1563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int index = GetGlyphIndex(unicode, pVertGlyph);
1564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (index == 0)
1565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return -1;
1566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return index;
1567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return unicode;
1569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_Font.GetFace())
1571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD cid = CIDFromCharCode(charcode);
1574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bType1) {
1575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pCIDToGIDMap) {
1576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return cid;
1577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pCIDToGIDMap) {
1580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_pFontFile && !m_pCMap->m_pMapping)
1581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return cid;
1582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_pCMap->m_Coding == CIDCODING_UNKNOWN ||
1583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          !FXFT_Get_Face_Charmap(m_Font.GetFace())) {
1584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return cid;
1585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.GetFace())) ==
1587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FXFT_ENCODING_UNICODE) {
1588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString unicode_str = UnicodeFromCharCode(charcode);
1589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (unicode_str.IsEmpty()) {
1590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return -1;
1591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        charcode = unicode_str.GetAt(0);
1593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return GetGlyphIndex(charcode, pVertGlyph);
1595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD byte_pos = cid * 2;
1598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (byte_pos + 2 > m_pCIDToGIDMap->GetSize())
1599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos;
1602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pdata[0] * 256 + pdata[1];
1603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_CIDFont::GetNextChar(const FX_CHAR* pString,
1605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int nStrLen,
1606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int& offset) const {
1607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap->GetNextChar(pString, nStrLen, offset);
1608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const {
1610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap->GetCharSize(charcode);
1611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::CountChar(const FX_CHAR* pString, int size) const {
1613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap->CountChar(pString, size);
1614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_CIDFont::AppendChar(FX_CHAR* str, FX_DWORD charcode) const {
1616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pCMap->AppendChar(str, charcode);
1617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const {
1619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pCMap->IsLoaded() || !m_pCID2UnicodeMap ||
1620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      !m_pCID2UnicodeMap->IsLoaded()) {
1621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pCMap->m_Coding != CIDCODING_UNKNOWN;
1622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const {
1626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CIDFont::LoadSubstFont() {
1629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle,
1630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   g_CharsetCPs[m_Charset], IsVertWriting());
1631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray,
1633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    CFX_DWordArray& result,
1634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    int nElements) {
1635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int width_status = 0;
1636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCurElement = 0;
1637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int first_code = 0, last_code;
1638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD count = pArray->GetCount();
1639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (FX_DWORD i = 0; i < count; i++) {
1640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pObj = pArray->GetElementValue(i);
1641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pObj)
1642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
1643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (CPDF_Array* pArray = pObj->AsArray()) {
1645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (width_status != 1)
1646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
1647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD count = pArray->GetCount();
1649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (FX_DWORD j = 0; j < count; j += nElements) {
1650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        result.Add(first_code);
1651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        result.Add(first_code);
1652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for (int k = 0; k < nElements; k++) {
1653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          result.Add(pArray->GetInteger(j + k));
1654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        first_code++;
1656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      width_status = 0;
1658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
1659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (width_status == 0) {
1660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        first_code = pObj->GetInteger();
1661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        width_status = 1;
1662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (width_status == 1) {
1663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        last_code = pObj->GetInteger();
1664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        width_status = 2;
1665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCurElement = 0;
1666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
1667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!iCurElement) {
1668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          result.Add(first_code);
1669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          result.Add(last_code);
1670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        result.Add(pObj->GetInteger());
1672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iCurElement++;
1673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iCurElement == nElements) {
1674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          width_status = 0;
1675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// static
1682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) {
1683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ch < 128) {
1684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return ch * 1.0f / 127;
1685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (-255 + ch) * 1.0f / 127;
1687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_CIDFont::LoadGB2312() {
1690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_BaseFont = m_pFontDict->GetString("BaseFont");
1691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict("FontDescriptor");
1692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFontDesc) {
1693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadFontDescriptor(pFontDesc);
1694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Charset = CIDSET_GB1;
1696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bType1 = FALSE;
1697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCMap = CPDF_ModuleMgr::Get()
1698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                ->GetPageModule()
1699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                ->GetFontGlobals()
1700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                ->m_CMapManager.GetPredefinedCMap("GBK-EUC-H", FALSE);
1701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()
1702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          ->GetPageModule()
1703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          ->GetFontGlobals()
1704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          ->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);
1705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsEmbedded()) {
1706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadSubstFont();
1707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CheckFontMetrics();
1709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_DefaultWidth = 1000;
1710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pAnsiWidths = FX_Alloc(FX_WORD, 128);
1711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 32; i < 127; i++) {
1712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pAnsiWidths[i] = 500;
1713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst uint8_t* CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const {
1718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Charset != CIDSET_JAPAN1 || m_pFontFile)
1719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
1720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const struct CIDTransform* found = (const struct CIDTransform*)FXSYS_bsearch(
1722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      &CID, g_Japan1_VertCIDs, FX_ArraySize(g_Japan1_VertCIDs),
1723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      sizeof(g_Japan1_VertCIDs[0]), CompareCIDTransform);
1724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return found ? &found->a : nullptr;
1725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1726