b151d78b51a8db9dd8e8a1ec0af1af7b419128a7
[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 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 };