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