1// Copyright 2014 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 7typedef void* FXFT_Library; 8class CPDF_CMapManager : public CFX_Object 9{ 10public: 11 CPDF_CMapManager(); 12 ~CPDF_CMapManager(); 13 FX_LPVOID GetPackage(FX_BOOL bPrompt); 14 CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt); 15 CPDF_CID2UnicodeMap* GetCID2UnicodeMap(int charset, FX_BOOL bPrompt); 16 void ReloadAll(); 17private: 18 CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt); 19 CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt); 20 void DropAll(FX_BOOL bReload); 21#ifndef _FPDFAPI_MINI_ 22 FX_BOOL m_bPrompted; 23 FX_LPVOID m_pPackage; 24#endif 25 CFX_MapByteStringToPtr m_CMaps; 26 CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6]; 27}; 28class CPDF_FontGlobals : public CFX_Object 29{ 30public: 31 CPDF_FontGlobals(); 32 ~CPDF_FontGlobals(); 33 void ClearAll(); 34 void Clear(void* key); 35 CPDF_Font* Find(void* key, int index); 36 void Set(void* key, int index, CPDF_Font* pFont); 37 CFX_MapPtrToPtr m_pStockMap; 38 CPDF_CMapManager m_CMapManager; 39 struct { 40 const struct FXCMAP_CMap* m_pMapList; 41 int m_Count; 42 } m_EmbeddedCharsets[5]; 43 struct { 44 const FX_WORD* m_pMap; 45 int m_Count; 46 } m_EmbeddedToUnicodes[5]; 47 FX_LPBYTE m_pContrastRamps; 48}; 49struct _CMap_CodeRange { 50 int m_CharSize; 51 FX_BYTE m_Lower[4]; 52 FX_BYTE m_Upper[4]; 53}; 54class CPDF_CMapParser : public CFX_Object 55{ 56public: 57 CPDF_CMapParser(); 58 ~CPDF_CMapParser() {} 59 FX_BOOL Initialize(CPDF_CMap*); 60 void ParseWord(FX_BSTR str); 61 CFX_BinaryBuf m_AddMaps; 62private: 63 CPDF_CMap* m_pCMap; 64 int m_Status; 65 int m_CodeSeq; 66 FX_DWORD m_CodePoints[4]; 67 CFX_ArrayTemplate<_CMap_CodeRange> m_CodeRanges; 68 CFX_ByteString m_Registry, m_Ordering, m_Supplement; 69 CFX_ByteString m_LastWord; 70}; 71#define CIDCODING_UNKNOWN 0 72#define CIDCODING_GB 1 73#define CIDCODING_BIG5 2 74#define CIDCODING_JIS 3 75#define CIDCODING_KOREA 4 76#define CIDCODING_UCS2 5 77#define CIDCODING_CID 6 78#define CIDCODING_UTF16 7 79class CPDF_CMap : public CFX_Object 80{ 81public: 82 CPDF_CMap(); 83 FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK); 84 FX_BOOL LoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize); 85 void Release(); 86 FX_BOOL IsLoaded() const 87 { 88 return m_bLoaded; 89 } 90 int GetCharset() 91 { 92 return m_Charset; 93 } 94 FX_BOOL IsVertWriting() const 95 { 96 return m_bVertical; 97 } 98 FX_WORD CIDFromCharCode(FX_DWORD charcode) const; 99 FX_DWORD CharCodeFromCID(FX_WORD CID) const; 100 int GetCharSize(FX_DWORD charcode) const; 101 FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const; 102 int CountChar(const FX_CHAR* pString, int size) const; 103 int AppendChar(FX_LPSTR str, FX_DWORD charcode) const; 104 typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme; 105protected: 106 ~CPDF_CMap(); 107 friend class CPDF_CMapParser; 108 friend class CPDF_CMapManager; 109 friend class CPDF_CIDFont; 110protected: 111 CFX_ByteString m_PredefinedCMap; 112 FX_BOOL m_bVertical; 113 int m_Charset, m_Coding; 114 CodingScheme m_CodingScheme; 115 int m_nCodeRanges; 116 FX_BYTE* m_pLeadingBytes; 117 FX_WORD* m_pMapping; 118 FX_LPBYTE m_pAddMapping; 119 FX_BOOL m_bLoaded; 120 const FXCMAP_CMap* m_pEmbedMap; 121 CPDF_CMap* m_pUseMap; 122}; 123class CPDF_PredefinedCMap 124{ 125public: 126 FX_LPCSTR m_pName; 127 int m_Charset; 128 int m_Coding; 129 CPDF_CMap::CodingScheme m_CodingScheme; 130 FX_DWORD m_LeadingSegCount; 131 FX_BYTE m_LeadingSegs[4]; 132}; 133typedef struct _FileHeader { 134 FX_BYTE btTag[4]; 135 FX_BYTE btVersion; 136 FX_BYTE btFormat; 137 FX_BYTE btReserved1[2]; 138 FX_DWORD dwStartIndex; 139 FX_DWORD dwEndIndex; 140 FX_DWORD dwDataSize; 141 FX_DWORD dwDataOffset; 142 FX_DWORD dwRecordSize; 143} FXMP_FILEHEADER; 144class CPDF_FXMP : public CFX_Object 145{ 146public: 147 CPDF_FXMP() 148 { 149 m_pHeader = NULL; 150 m_pTable = NULL; 151 } 152 ~CPDF_FXMP() 153 { 154 if (m_pHeader) { 155 FX_Free(m_pHeader); 156 } 157 } 158 FX_BOOL IsLoaded() 159 { 160 return m_pTable != NULL; 161 } 162 FX_BOOL LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid); 163 FX_LPBYTE GetRecord(FX_DWORD index); 164private: 165 FXMP_FILEHEADER* m_pHeader; 166 FX_LPBYTE m_pTable; 167}; 168class CPDF_CID2UnicodeMap : public CFX_Object 169{ 170public: 171 CPDF_CID2UnicodeMap(); 172 ~CPDF_CID2UnicodeMap(); 173 FX_BOOL Initialize(); 174 FX_BOOL IsLoaded(); 175 void Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK); 176 FX_WCHAR UnicodeFromCID(FX_WORD CID); 177protected: 178 int m_Charset; 179 const FX_WORD* m_pEmbeddedMap; 180 FX_DWORD m_EmbeddedCount; 181#ifndef _FPDFAPI_MINI_ 182 CPDF_FXMP* m_pExternalMap; 183#endif 184}; 185class CPDF_ToUnicodeMap : public CFX_Object 186{ 187public: 188 void Load(CPDF_Stream* pStream); 189 CFX_WideString Lookup(FX_DWORD charcode); 190 FX_DWORD ReverseLookup(FX_WCHAR unicode); 191protected: 192 CFX_CMapDWordToDWord m_Map; 193 CPDF_CID2UnicodeMap* m_pBaseMap; 194 CFX_WideTextBuf m_MultiCharBuf; 195}; 196class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object 197{ 198public: 199 CPDF_FontCharMap(CPDF_Font* pFont); 200 CPDF_Font* m_pFont; 201}; 202