d7cbe1b0b59007ef96993cd751ca408dce1a5852
[pdfium.git] / core / src / fpdfapi / fpdf_font / font_int.h
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 #ifndef CORE_SRC_FPDFAPI_FPDF_FONT_FONT_INT_H_
7 #define CORE_SRC_FPDFAPI_FPDF_FONT_FONT_INT_H_
8
9 typedef void* FXFT_Library;
10 class CPDF_CMapManager {
11  public:
12   CPDF_CMapManager();
13   ~CPDF_CMapManager();
14   void* GetPackage(FX_BOOL bPrompt);
15   CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
16   CPDF_CID2UnicodeMap* GetCID2UnicodeMap(int charset, FX_BOOL bPrompt);
17   void ReloadAll();
18
19  private:
20   CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
21   CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);
22   void DropAll(FX_BOOL bReload);
23   FX_BOOL m_bPrompted;
24   CFX_MapByteStringToPtr m_CMaps;
25   CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6];
26 };
27 class CPDF_FontGlobals {
28  public:
29   CPDF_FontGlobals();
30   ~CPDF_FontGlobals();
31   void ClearAll();
32   void Clear(void* key);
33   CPDF_Font* Find(void* key, int index);
34   void Set(void* key, int index, CPDF_Font* pFont);
35   CPDF_CMapManager m_CMapManager;
36   struct {
37     const struct FXCMAP_CMap* m_pMapList;
38     int m_Count;
39   } m_EmbeddedCharsets[NUMBER_OF_CIDSETS];
40   struct {
41     const FX_WORD* m_pMap;
42     int m_Count;
43   } m_EmbeddedToUnicodes[NUMBER_OF_CIDSETS];
44
45  private:
46   CFX_MapPtrToPtr m_pStockMap;
47   uint8_t* m_pContrastRamps;
48 };
49 struct _CMap_CodeRange {
50   int m_CharSize;
51   uint8_t m_Lower[4];
52   uint8_t m_Upper[4];
53 };
54 class CPDF_CMapParser {
55  public:
56   CPDF_CMapParser();
57   ~CPDF_CMapParser() {}
58   FX_BOOL Initialize(CPDF_CMap*);
59   void ParseWord(const CFX_ByteStringC& str);
60   CFX_BinaryBuf m_AddMaps;
61
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 {
80  public:
81   CPDF_CMap();
82   FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr,
83                          const FX_CHAR* name,
84                          FX_BOOL bPromptCJK);
85   FX_BOOL LoadEmbedded(const uint8_t* pData, FX_DWORD dwSize);
86   void Release();
87   FX_BOOL IsLoaded() const { return m_bLoaded; }
88   int GetCharset() { return m_Charset; }
89   FX_BOOL IsVertWriting() const { return m_bVertical; }
90   FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
91   FX_DWORD CharCodeFromCID(FX_WORD CID) const;
92   int GetCharSize(FX_DWORD charcode) const;
93   FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const;
94   int CountChar(const FX_CHAR* pString, int size) const;
95   int AppendChar(FX_CHAR* str, FX_DWORD charcode) const;
96   typedef enum {
97     OneByte,
98     TwoBytes,
99     MixedTwoBytes,
100     MixedFourBytes
101   } CodingScheme;
102
103  protected:
104   ~CPDF_CMap();
105   friend class CPDF_CMapParser;
106   friend class CPDF_CMapManager;
107   friend class CPDF_CIDFont;
108
109  protected:
110   CFX_ByteString m_PredefinedCMap;
111   FX_BOOL m_bVertical;
112   int m_Charset, m_Coding;
113   CodingScheme m_CodingScheme;
114   int m_nCodeRanges;
115   uint8_t* m_pLeadingBytes;
116   FX_WORD* m_pMapping;
117   uint8_t* m_pAddMapping;
118   FX_BOOL m_bLoaded;
119   const FXCMAP_CMap* m_pEmbedMap;
120   CPDF_CMap* m_pUseMap;
121 };
122 class CPDF_PredefinedCMap {
123  public:
124   const FX_CHAR* m_pName;
125   int m_Charset;
126   int m_Coding;
127   CPDF_CMap::CodingScheme m_CodingScheme;
128   FX_DWORD m_LeadingSegCount;
129   uint8_t m_LeadingSegs[4];
130 };
131 typedef struct _FileHeader {
132   uint8_t btTag[4];
133   uint8_t btVersion;
134   uint8_t btFormat;
135   uint8_t btReserved1[2];
136   FX_DWORD dwStartIndex;
137   FX_DWORD dwEndIndex;
138   FX_DWORD dwDataSize;
139   FX_DWORD dwDataOffset;
140   FX_DWORD dwRecordSize;
141 } FXMP_FILEHEADER;
142 class CPDF_CID2UnicodeMap {
143  public:
144   CPDF_CID2UnicodeMap();
145   ~CPDF_CID2UnicodeMap();
146   FX_BOOL Initialize();
147   FX_BOOL IsLoaded();
148   void Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);
149   FX_WCHAR UnicodeFromCID(FX_WORD CID);
150
151  protected:
152   int m_Charset;
153   const FX_WORD* m_pEmbeddedMap;
154   FX_DWORD m_EmbeddedCount;
155 };
156 class CPDF_ToUnicodeMap {
157  public:
158   void Load(CPDF_Stream* pStream);
159   CFX_WideString Lookup(FX_DWORD charcode);
160   FX_DWORD ReverseLookup(FX_WCHAR unicode);
161
162  protected:
163   CFX_CMapDWordToDWord m_Map;
164   CPDF_CID2UnicodeMap* m_pBaseMap;
165   CFX_WideTextBuf m_MultiCharBuf;
166 };
167 class CPDF_FontCharMap : public CFX_CharMap {
168  public:
169   CPDF_FontCharMap(CPDF_Font* pFont);
170   CPDF_Font* m_pFont;
171 };
172
173 #endif  // CORE_SRC_FPDFAPI_FPDF_FONT_FONT_INT_H_