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 7 typedef void* FXFT_Library; 8 class CPDF_CMapManager : public CFX_Object 9 { 10 public: 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(); 17 private: 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 }; 28 class CPDF_FontGlobals : public CFX_Object 29 { 30 public: 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 }; 49 struct _CMap_CodeRange { 50 int m_CharSize; 51 FX_BYTE m_Lower[4]; 52 FX_BYTE m_Upper[4]; 53 }; 54 class CPDF_CMapParser : public CFX_Object 55 { 56 public: 57 CPDF_CMapParser(); 58 ~CPDF_CMapParser() {} 59 FX_BOOL Initialize(CPDF_CMap*); 60 void ParseWord(FX_BSTR str); 61 CFX_BinaryBuf m_AddMaps; 62 private: 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 79 class CPDF_CMap : public CFX_Object 80 { 81 public: 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; 105 protected: 106 ~CPDF_CMap(); 107 friend class CPDF_CMapParser; 108 friend class CPDF_CMapManager; 109 friend class CPDF_CIDFont; 110 protected: 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 }; 123 class CPDF_PredefinedCMap 124 { 125 public: 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 }; 133 typedef 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; 144 class CPDF_FXMP : public CFX_Object 145 { 146 public: 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); 164 private: 165 FXMP_FILEHEADER* m_pHeader; 166 FX_LPBYTE m_pTable; 167 }; 168 class CPDF_CID2UnicodeMap : public CFX_Object 169 { 170 public: 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); 177 protected: 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 }; 185 class CPDF_ToUnicodeMap : public CFX_Object 186 { 187 public: 188 void Load(CPDF_Stream* pStream); 189 CFX_WideString Lookup(FX_DWORD charcode); 190 FX_DWORD ReverseLookup(FX_WCHAR unicode); 191 protected: 192 CFX_CMapDWordToDWord m_Map; 193 CPDF_CID2UnicodeMap* m_pBaseMap; 194 CFX_WideTextBuf m_MultiCharBuf; 195 }; 196 class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object 197 { 198 public: 199 CPDF_FontCharMap(CPDF_Font* pFont); 200 CPDF_Font* m_pFont; 201 }; 202