1 // Copyright 2017 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef CORE_FPDFAPI_FONT_CPDF_CMAP_H_ 8 #define CORE_FPDFAPI_FONT_CPDF_CMAP_H_ 9 10 #include <vector> 11 12 #include "core/fpdfapi/font/cpdf_cidfont.h" 13 #include "core/fxcrt/retain_ptr.h" 14 #include "third_party/base/span.h" 15 16 struct FXCMAP_CMap; 17 18 enum CIDCoding : uint8_t { 19 CIDCODING_UNKNOWN = 0, 20 CIDCODING_GB, 21 CIDCODING_BIG5, 22 CIDCODING_JIS, 23 CIDCODING_KOREA, 24 CIDCODING_UCS2, 25 CIDCODING_CID, 26 CIDCODING_UTF16, 27 }; 28 29 class CPDF_CMap final : public Retainable { 30 public: 31 enum CodingScheme : uint8_t { 32 OneByte, 33 TwoBytes, 34 MixedTwoBytes, 35 MixedFourBytes 36 }; 37 38 struct CodeRange { 39 size_t m_CharSize; 40 uint8_t m_Lower[4]; 41 uint8_t m_Upper[4]; 42 }; 43 44 struct CIDRange { 45 uint32_t m_StartCode; 46 uint32_t m_EndCode; 47 uint16_t m_StartCID; 48 }; 49 50 template <typename T, typename... Args> 51 friend RetainPtr<T> pdfium::MakeRetain(Args&&... args); 52 IsLoaded()53 bool IsLoaded() const { return m_bLoaded; } IsVertWriting()54 bool IsVertWriting() const { return m_bVertical; } 55 56 uint16_t CIDFromCharCode(uint32_t charcode) const; 57 58 int GetCharSize(uint32_t charcode) const; 59 uint32_t GetNextChar(ByteStringView pString, size_t* pOffset) const; 60 size_t CountChar(ByteStringView pString) const; 61 int AppendChar(char* str, uint32_t charcode) const; 62 SetVertical(bool vert)63 void SetVertical(bool vert) { m_bVertical = vert; } SetCodingScheme(CodingScheme scheme)64 void SetCodingScheme(CodingScheme scheme) { m_CodingScheme = scheme; } 65 void SetAdditionalMappings(std::vector<CIDRange> mappings); 66 void SetMixedFourByteLeadingRanges(std::vector<CodeRange> ranges); 67 GetCoding()68 int GetCoding() const { return m_Coding; } GetEmbedMap()69 const FXCMAP_CMap* GetEmbedMap() const { return m_pEmbedMap.Get(); } GetCharset()70 CIDSet GetCharset() const { return m_Charset; } SetCharset(CIDSet set)71 void SetCharset(CIDSet set) { m_Charset = set; } 72 SetDirectCharcodeToCIDTable(size_t idx,uint16_t val)73 void SetDirectCharcodeToCIDTable(size_t idx, uint16_t val) { 74 m_DirectCharcodeToCIDTable[idx] = val; 75 } IsDirectCharcodeToCIDTableIsEmpty()76 bool IsDirectCharcodeToCIDTableIsEmpty() const { 77 return m_DirectCharcodeToCIDTable.empty(); 78 } 79 80 private: 81 explicit CPDF_CMap(ByteStringView bsPredefinedName); 82 explicit CPDF_CMap(pdfium::span<const uint8_t> spEmbeddedData); 83 ~CPDF_CMap() override; 84 85 bool m_bLoaded = false; 86 bool m_bVertical = false; 87 CIDSet m_Charset = CIDSET_UNKNOWN; 88 CodingScheme m_CodingScheme = TwoBytes; 89 int m_Coding = CIDCODING_UNKNOWN; 90 std::vector<bool> m_MixedTwoByteLeadingBytes; 91 std::vector<CodeRange> m_MixedFourByteLeadingRanges; 92 std::vector<uint16_t> m_DirectCharcodeToCIDTable; 93 std::vector<CIDRange> m_AdditionalCharcodeToCIDMappings; 94 UnownedPtr<const FXCMAP_CMap> m_pEmbedMap; 95 }; 96 97 #endif // CORE_FPDFAPI_FONT_CPDF_CMAP_H_ 98