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