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