14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/font_int.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/cmaps/cmap_int.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/cpdf_modulemgr.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/ttgsubtable.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pagemodule.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_simple_parser.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_ext.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_freetype.h"
215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann#include "third_party/base/logging.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FX_CHAR* const g_CharsetNames[CIDSET_NUM_SETS] = {
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nullptr, "GB1", "CNS1", "Japan1", "Korea1", "UCS"};
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_PredefinedCMap {
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_CHAR* m_pName;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CIDSet m_Charset;
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CIDCoding m_Coding;
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CMap::CodingScheme m_CodingScheme;
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t m_LeadingSegCount;
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t m_LeadingSegs[4];
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst CPDF_PredefinedCMap g_PredefinedCMaps[] = {
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GB-EUC",
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfe}},
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GBpc-EUC",
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfc}},
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GBK-EUC",
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GBKp-EUC",
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GBK2K-EUC",
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"GBK2K",
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_GB1,
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_GB,
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"B5pc",
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_CNS1,
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_BIG5,
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfc}},
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"HKscs-B5",
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_CNS1,
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_BIG5,
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x88, 0xfe}},
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"ETen-B5",
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_CNS1,
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_BIG5,
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfe}},
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"ETenms-B5",
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_CNS1,
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_BIG5,
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfe}},
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"83pv-RKSJ",
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"90ms-RKSJ",
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"90msp-RKSJ",
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"90pv-RKSJ",
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"Add-RKSJ",
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"EUC",
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x8e, 0x8e, 0xa1, 0xfe}},
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}},
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e}},
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"Ext-RKSJ",
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_JIS,
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     2,
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0x9f, 0xe0, 0xfc}},
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniJIS-UCS2-HW",
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_UCS2,
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::TwoBytes,
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     0,
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {}},
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniJIS-UTF16",
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_JAPAN1,
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_UTF16,
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::TwoBytes,
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     0,
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {}},
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"KSC-EUC",
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_KOREA1,
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_KOREA,
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfe}},
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"KSCms-UHC",
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_KOREA1,
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_KOREA,
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"KSCms-UHC-HW",
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_KOREA1,
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_KOREA,
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0x81, 0xfe}},
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"KSCpc-EUC",
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDSET_KOREA1,
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CIDCODING_KOREA,
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     CPDF_CMap::MixedTwoBytes,
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     1,
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann     {0xa1, 0xfd}},
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes, 0, {}},
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    {"UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes, 0, {}},
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCIDSet CIDSetFromSizeT(size_t index) {
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (index >= CIDSET_NUM_SETS) {
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    NOTREACHED();
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CIDSET_UNKNOWN;
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return static_cast<CIDSet>(index);
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteStringC CMap_GetString(const CFX_ByteStringC& word) {
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word.GetLength() <= 2)
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_ByteStringC();
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_ByteStringC(&word[1], word.GetLength() - 2);
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CompareDWORD(const void* data1, const void* data2) {
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (*(uint32_t*)data1) - (*(uint32_t*)data2);
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CompareCID(const void* key, const void* element) {
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((*(uint32_t*)key) < (*(uint32_t*)element)) {
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return -1;
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((*(uint32_t*)key) >
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (*(uint32_t*)element) + ((uint32_t*)element)[1] / 65536) {
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 1;
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CheckCodeRange(uint8_t* codes,
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   int size,
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   CMap_CodeRange* pRanges,
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   int nRanges) {
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int iSeg = nRanges - 1;
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (iSeg >= 0) {
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pRanges[iSeg].m_CharSize < size) {
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      --iSeg;
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int iChar = 0;
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (iChar < size) {
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ++iChar;
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iChar == pRanges[iSeg].m_CharSize)
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 2;
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iChar)
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return (size == pRanges[iSeg].m_CharSize) ? 2 : 1;
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iSeg--;
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint GetCharSizeImpl(uint32_t charcode,
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    CMap_CodeRange* pRanges,
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    int iRangesSize) {
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!iRangesSize)
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 1;
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t codes[4];
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  codes[0] = codes[1] = 0x00;
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  codes[2] = (uint8_t)(charcode >> 8 & 0xFF);
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  codes[3] = (uint8_t)charcode;
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int offset = 0;
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int size = 4;
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < 4; ++i) {
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int iSeg = iRangesSize - 1;
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (iSeg >= 0) {
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pRanges[iSeg].m_CharSize < size) {
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        --iSeg;
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        continue;
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int iChar = 0;
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (iChar < size) {
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ++iChar;
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iChar == pRanges[iSeg].m_CharSize)
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return size;
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      --iSeg;
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    --size;
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ++offset;
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 1;
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMapManager::CPDF_CMapManager() {}
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMapManager::~CPDF_CMapManager() {}
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_MaybeOwned<CPDF_CMap> CPDF_CMapManager::GetPredefinedCMap(
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& name,
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bPromptCJK) {
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_CMaps.find(name);
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_CMaps.end())
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_MaybeOwned<CPDF_CMap>(it->second.get());  // Unowned.
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_CMap> pCMap = LoadPredefinedCMap(name, bPromptCJK);
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (name.IsEmpty())
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CFX_MaybeOwned<CPDF_CMap>(std::move(pCMap));  // Owned.
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CMap* pUnowned = pCMap.get();
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CMaps[name] = std::move(pCMap);
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_MaybeOwned<CPDF_CMap>(pUnowned);  // Unowned.
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_CMap> CPDF_CMapManager::LoadPredefinedCMap(
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFX_ByteString& name,
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bPromptCJK) {
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pCMap = pdfium::MakeUnique<CPDF_CMap>();
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const FX_CHAR* pname = name.c_str();
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (*pname == '/')
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pname++;
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCMap->LoadPredefined(this, pname, bPromptCJK);
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pCMap;
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(CIDSet charset,
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                         bool bPromptCJK) {
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_CID2UnicodeMaps[charset])
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_CID2UnicodeMaps[charset].get();
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_CID2UnicodeMap> CPDF_CMapManager::LoadCID2UnicodeMap(
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CIDSet charset,
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bPromptCJK) {
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pMap = pdfium::MakeUnique<CPDF_CID2UnicodeMap>();
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pMap->Load(this, charset, bPromptCJK);
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pMap;
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMapParser::CPDF_CMapParser()
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pCMap(nullptr), m_Status(0), m_CodeSeq(0) {}
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMapParser::~CPDF_CMapParser() {}
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_CMapParser::Initialize(CPDF_CMap* pCMap) {
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pCMap = pCMap;
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Status = 0;
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CodeSeq = 0;
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_AddMaps.EstimateSize(0, 10240);
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_CMapParser::ParseWord(const CFX_ByteStringC& word) {
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word.IsEmpty()) {
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word == "begincidchar") {
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 1;
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodeSeq = 0;
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "begincidrange") {
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 2;
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodeSeq = 0;
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "endcidrange" || word == "endcidchar") {
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 0;
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "/WMode") {
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 6;
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "/Registry") {
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 3;
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "/Ordering") {
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 4;
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "/Supplement") {
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 5;
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "begincodespacerange") {
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 7;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodeSeq = 0;
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (word == "usecmap") {
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 1 || m_Status == 2) {
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodePoints[m_CodeSeq] = CMap_GetCode(word);
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodeSeq++;
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t StartCode, EndCode;
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint16_t StartCID;
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_Status == 1) {
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (m_CodeSeq < 2) {
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      EndCode = StartCode = m_CodePoints[0];
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      StartCID = (uint16_t)m_CodePoints[1];
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (m_CodeSeq < 3) {
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      StartCode = m_CodePoints[0];
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      EndCode = m_CodePoints[1];
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      StartCID = (uint16_t)m_CodePoints[2];
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (EndCode < 0x10000) {
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (uint32_t code = StartCode; code <= EndCode; code++) {
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pCMap->m_pMapping[code] = (uint16_t)(StartCID + code - StartCode);
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t buf[2];
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      buf[0] = StartCode;
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      buf[1] = ((EndCode - StartCode) << 16) + StartCID;
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_AddMaps.AppendBlock(buf, sizeof buf);
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CodeSeq = 0;
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 3) {
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 0;
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 4) {
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCMap->m_Charset = CharsetFromOrdering(CMap_GetString(word));
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 0;
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 5) {
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 0;
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 6) {
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCMap->m_bVertical = CMap_GetCode(word) != 0;
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Status = 0;
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (m_Status == 7) {
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (word == "endcodespacerange") {
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint32_t nSegs = pdfium::CollectionSize<uint32_t>(m_CodeRanges);
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (nSegs > 1) {
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pCMap->m_nCodeRanges = nSegs;
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FX_Free(m_pCMap->m_pLeadingBytes);
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pCMap->m_pLeadingBytes =
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            FX_Alloc2D(uint8_t, nSegs, sizeof(CMap_CodeRange));
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FXSYS_memcpy(m_pCMap->m_pLeadingBytes, m_CodeRanges.data(),
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     nSegs * sizeof(CMap_CodeRange));
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else if (nSegs == 1) {
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2)
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      ? CPDF_CMap::TwoBytes
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      : CPDF_CMap::OneByte;
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_Status = 0;
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (word.GetLength() == 0 || word.GetAt(0) != '<') {
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (m_CodeSeq % 2) {
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CMap_CodeRange range;
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (CMap_GetCodeRange(range, m_LastWord.AsStringC(), word))
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_CodeRanges.push_back(range);
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_CodeSeq++;
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_LastWord = word;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CPDF_CMapParser::CMap_GetCode(const CFX_ByteStringC& word) {
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pdfium::base::CheckedNumeric<uint32_t> num = 0;
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word.GetAt(0) == '<') {
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int i = 1; i < word.GetLength() && std::isxdigit(word.GetAt(i)); ++i) {
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      num = num * 16 + FXSYS_toHexDigit(word.GetAt(i));
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!num.IsValid())
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 0;
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return num.ValueOrDie();
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int i = 0; i < word.GetLength() && std::isdigit(word.GetAt(i)); ++i) {
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    num = num * 10 + FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(word.GetAt(i)));
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!num.IsValid())
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return num.ValueOrDie();
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Static.
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_CMapParser::CMap_GetCodeRange(CMap_CodeRange& range,
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        const CFX_ByteStringC& first,
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        const CFX_ByteStringC& second) {
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (first.GetLength() == 0 || first.GetAt(0) != '<')
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int i;
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (i = 1; i < first.GetLength(); ++i) {
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (first.GetAt(i) == '>') {
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  range.m_CharSize = (i - 1) / 2;
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (range.m_CharSize > 4)
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (i = 0; i < range.m_CharSize; ++i) {
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint8_t digit1 = first.GetAt(i * 2 + 1);
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint8_t digit2 = first.GetAt(i * 2 + 2);
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    range.m_Lower[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t size = second.GetLength();
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (i = 0; i < range.m_CharSize; ++i) {
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint8_t digit1 = ((uint32_t)i * 2 + 1 < size)
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? second.GetAt((FX_STRSIZE)i * 2 + 1)
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : '0';
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint8_t digit2 = ((uint32_t)i * 2 + 2 < size)
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? second.GetAt((FX_STRSIZE)i * 2 + 2)
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : '0';
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    range.m_Upper[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMap::CPDF_CMap() {
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Charset = CIDSET_UNKNOWN;
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Coding = CIDCODING_UNKNOWN;
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CodingScheme = TwoBytes;
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bVertical = false;
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLoaded = false;
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pMapping = nullptr;
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pLeadingBytes = nullptr;
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pAddMapping = nullptr;
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEmbedMap = nullptr;
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_nCodeRanges = 0;
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CMap::~CPDF_CMap() {
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(m_pMapping);
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(m_pAddMapping);
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_Free(m_pLeadingBytes);
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_CMap::IsLoaded() const {
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bLoaded;
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_CMap::IsVertWriting() const {
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_bVertical;
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr,
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_ByteString& bsName,
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               bool bPromptCJK) {
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PredefinedCMap = bsName;
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_PredefinedCMap == "Identity-H" || m_PredefinedCMap == "Identity-V") {
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Coding = CIDCODING_CID;
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bVertical = bsName[9] == 'V';
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bLoaded = true;
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString cmapid = m_PredefinedCMap;
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bVertical = cmapid.Right(1) == "V";
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (cmapid.GetLength() > 2) {
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    cmapid = cmapid.Left(cmapid.GetLength() - 2);
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const CPDF_PredefinedCMap* map = nullptr;
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t i = 0; i < FX_ArraySize(g_PredefinedCMaps); ++i) {
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[i].m_pName)) {
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      map = &g_PredefinedCMaps[i];
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!map)
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Charset = map->m_Charset;
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Coding = map->m_Coding;
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CodingScheme = map->m_CodingScheme;
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_CodingScheme == MixedTwoBytes) {
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pLeadingBytes = FX_Alloc(uint8_t, 256);
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (uint32_t i = 0; i < map->m_LeadingSegCount; ++i) {
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      const uint8_t* segs = map->m_LeadingSegs;
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (int b = segs[i * 2]; b <= segs[i * 2 + 1]; ++b) {
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pLeadingBytes[b] = 1;
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FPDFAPI_FindEmbeddedCMap(bsName, m_Charset, m_Coding, m_pEmbedMap);
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pEmbedMap)
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLoaded = true;
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_CMap::LoadEmbedded(const uint8_t* pData, uint32_t size) {
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pMapping = FX_Alloc(uint16_t, 65536);
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CMapParser parser;
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  parser.Initialize(this);
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_SimpleParser syntax(pData, size);
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (1) {
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteStringC word = syntax.GetWord();
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (word.IsEmpty()) {
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    parser.ParseWord(word);
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pAddMapping = FX_Alloc(uint8_t, parser.m_AddMaps.GetSize() + 4);
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    *(uint32_t*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FXSYS_memcpy(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(),
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 parser.m_AddMaps.GetSize());
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8,
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                CompareDWORD);
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint16_t CPDF_CMap::CIDFromCharCode(uint32_t charcode) const {
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_Coding == CIDCODING_CID) {
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (uint16_t)charcode;
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEmbedMap) {
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pMapping) {
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (uint16_t)charcode;
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (charcode >> 16) {
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_pAddMapping) {
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4,
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  *(uint32_t*)m_pAddMapping, 8, CompareCID);
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!found)
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 0;
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return (uint16_t)(((uint32_t*)found)[1] % 65536 + charcode -
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        *(uint32_t*)found);
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pMapping[charcode];
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t CPDF_CMap::GetNextChar(const FX_CHAR* pString,
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                int nStrLen,
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                int& offset) const {
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_CodingScheme) {
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case OneByte:
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return ((uint8_t*)pString)[offset++];
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TwoBytes:
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      offset += 2;
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return ((uint8_t*)pString)[offset - 2] * 256 +
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             ((uint8_t*)pString)[offset - 1];
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedTwoBytes: {
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint8_t byte1 = ((uint8_t*)pString)[offset++];
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!m_pLeadingBytes[byte1]) {
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return byte1;
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint8_t byte2 = ((uint8_t*)pString)[offset++];
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return byte1 * 256 + byte2;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedFourBytes: {
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      uint8_t codes[4];
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int char_size = 1;
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      codes[0] = ((uint8_t*)pString)[offset++];
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes;
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (1) {
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        int ret = CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (ret == 0) {
6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return 0;
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (ret == 2) {
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          uint32_t charcode = 0;
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          for (int i = 0; i < char_size; i++) {
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            charcode = (charcode << 8) + codes[i];
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return charcode;
6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (char_size == 4 || offset == nStrLen) {
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          return 0;
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        codes[char_size++] = ((uint8_t*)pString)[offset++];
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_CMap::GetCharSize(uint32_t charcode) const {
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_CodingScheme) {
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case OneByte:
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 1;
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TwoBytes:
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 2;
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedTwoBytes:
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedFourBytes:
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x100) {
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 1;
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x10000) {
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 2;
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x1000000) {
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 3;
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 4;
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 1;
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_CMap::CountChar(const FX_CHAR* pString, int size) const {
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_CodingScheme) {
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case OneByte:
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return size;
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TwoBytes:
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return (size + 1) / 2;
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedTwoBytes: {
6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int count = 0;
6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (int i = 0; i < size; i++) {
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        count++;
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (m_pLeadingBytes[((uint8_t*)pString)[i]]) {
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          i++;
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return count;
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedFourBytes: {
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int count = 0, offset = 0;
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      while (offset < size) {
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        GetNextChar(pString, size, offset);
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        count++;
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return count;
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return size;
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_CMap::AppendChar(FX_CHAR* str, uint32_t charcode) const {
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_CodingScheme) {
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case OneByte:
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[0] = (uint8_t)charcode;
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 1;
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case TwoBytes:
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[0] = (uint8_t)(charcode / 256);
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[1] = (uint8_t)(charcode % 256);
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 2;
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedTwoBytes:
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case MixedFourBytes:
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x100) {
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CMap_CodeRange* pRanges = (CMap_CodeRange*)m_pLeadingBytes;
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        int iSize = GetCharSizeImpl(charcode, pRanges, m_nCodeRanges);
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (iSize == 0) {
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          iSize = 1;
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (iSize > 1) {
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          FXSYS_memset(str, 0, sizeof(uint8_t) * iSize);
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[iSize - 1] = (uint8_t)charcode;
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return iSize;
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x10000) {
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[0] = (uint8_t)(charcode >> 8);
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[1] = (uint8_t)charcode;
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 2;
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (charcode < 0x1000000) {
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[0] = (uint8_t)(charcode >> 16);
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[1] = (uint8_t)(charcode >> 8);
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        str[2] = (uint8_t)charcode;
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return 3;
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[0] = (uint8_t)(charcode >> 24);
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[1] = (uint8_t)(charcode >> 16);
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[2] = (uint8_t)(charcode >> 8);
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      str[3] = (uint8_t)charcode;
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 4;
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap() {
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_EmbeddedCount = 0;
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap() {}
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_CID2UnicodeMap::IsLoaded() {
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_EmbeddedCount != 0;
7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(uint16_t CID) {
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_Charset == CIDSET_UNICODE) {
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return CID;
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CID < m_EmbeddedCount) {
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pEmbeddedMap[CID];
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr,
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               CIDSet charset,
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               bool bPromptCJK) {
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Charset = charset;
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_FontGlobals* pFontGlobals =
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEmbeddedMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_EmbeddedCount = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCIDSet CharsetFromOrdering(const CFX_ByteStringC& ordering) {
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (size_t charset = 1; charset < FX_ArraySize(g_CharsetNames); ++charset) {
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (ordering == g_CharsetNames[charset])
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return CIDSetFromSizeT(charset);
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CIDSET_UNKNOWN;
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
788