• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  #include <memory>
12  
13  #include "core/include/fpdfapi/fpdf_resource.h"
14  #include "core/include/fxcrt/fx_basic.h"
15  
16  class CPDF_CID2UnicodeMap;
17  class CPDF_CMap;
18  class CPDF_Font;
19  class CPDF_Stream;
20  
21  typedef void* FXFT_Library;
22  
23  short TT2PDF(int m, FXFT_Face face);
24  FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);
25  
26  class CPDF_CMapManager {
27   public:
28    CPDF_CMapManager();
29    ~CPDF_CMapManager();
30    void* GetPackage(FX_BOOL bPrompt);
31    CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK);
32    CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, FX_BOOL bPromptCJK);
33    void ReloadAll();
34  
35   private:
36    CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK);
37    CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(CIDSet charset, FX_BOOL bPromptCJK);
38  
39    FX_BOOL m_bPrompted;
40    std::map<CFX_ByteString, CPDF_CMap*> m_CMaps;
41    CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6];
42  };
43  
44  class CFX_StockFontArray {
45   public:
46    CFX_StockFontArray();
47    ~CFX_StockFontArray();
48  
49    // Takes ownership of |pFont|.
50    void SetFont(int index, CPDF_Font* pFont);
51    CPDF_Font* GetFont(int index) const;
52  
53   private:
54    std::unique_ptr<CPDF_Font> m_StockFonts[14];
55  };
56  
57  class CPDF_FontGlobals {
58   public:
59    CPDF_FontGlobals();
60    ~CPDF_FontGlobals();
61  
62    void Clear(CPDF_Document* pDoc);
63    CPDF_Font* Find(CPDF_Document* pDoc, int index);
64  
65    // Takes ownership of |pFont|.
66    void Set(CPDF_Document* key, int index, CPDF_Font* pFont);
67  
68    CPDF_CMapManager m_CMapManager;
69    struct {
70      const struct FXCMAP_CMap* m_pMapList;
71      int m_Count;
72    } m_EmbeddedCharsets[CIDSET_NUM_SETS];
73    struct {
74      const FX_WORD* m_pMap;
75      int m_Count;
76    } m_EmbeddedToUnicodes[CIDSET_NUM_SETS];
77  
78   private:
79    std::map<CPDF_Document*, std::unique_ptr<CFX_StockFontArray>> m_StockMap;
80  };
81  
82  struct CMap_CodeRange {
83    int m_CharSize;
84    uint8_t m_Lower[4];
85    uint8_t m_Upper[4];
86  };
87  
88  class CPDF_CMapParser {
89   public:
90    CPDF_CMapParser();
~CPDF_CMapParser()91    ~CPDF_CMapParser() {}
92    FX_BOOL Initialize(CPDF_CMap*);
93    void ParseWord(const CFX_ByteStringC& str);
94    CFX_BinaryBuf m_AddMaps;
95  
96   private:
97    friend class fpdf_font_cid_CMap_GetCode_Test;
98    friend class fpdf_font_cid_CMap_GetCodeRange_Test;
99  
100    static FX_DWORD CMap_GetCode(const CFX_ByteStringC& word);
101    static bool CMap_GetCodeRange(CMap_CodeRange& range,
102                                  const CFX_ByteStringC& first,
103                                  const CFX_ByteStringC& second);
104  
105    CPDF_CMap* m_pCMap;
106    int m_Status;
107    int m_CodeSeq;
108    FX_DWORD m_CodePoints[4];
109    CFX_ArrayTemplate<CMap_CodeRange> m_CodeRanges;
110    CFX_ByteString m_Registry, m_Ordering, m_Supplement;
111    CFX_ByteString m_LastWord;
112  };
113  #define CIDCODING_UNKNOWN 0
114  #define CIDCODING_GB 1
115  #define CIDCODING_BIG5 2
116  #define CIDCODING_JIS 3
117  #define CIDCODING_KOREA 4
118  #define CIDCODING_UCS2 5
119  #define CIDCODING_CID 6
120  #define CIDCODING_UTF16 7
121  class CPDF_CMap {
122   public:
123    CPDF_CMap();
124    FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr,
125                           const FX_CHAR* name,
126                           FX_BOOL bPromptCJK);
127    FX_BOOL LoadEmbedded(const uint8_t* pData, FX_DWORD dwSize);
128    void Release();
IsLoaded()129    FX_BOOL IsLoaded() const { return m_bLoaded; }
IsVertWriting()130    FX_BOOL IsVertWriting() const { return m_bVertical; }
131    FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
132    FX_DWORD CharCodeFromCID(FX_WORD CID) const;
133    int GetCharSize(FX_DWORD charcode) const;
134    FX_DWORD GetNextChar(const FX_CHAR* pString, int nStrLen, int& offset) const;
135    int CountChar(const FX_CHAR* pString, int size) const;
136    int AppendChar(FX_CHAR* str, FX_DWORD charcode) const;
137    typedef enum {
138      OneByte,
139      TwoBytes,
140      MixedTwoBytes,
141      MixedFourBytes
142    } CodingScheme;
143  
144   protected:
145    ~CPDF_CMap();
146    friend class CPDF_CMapParser;
147    friend class CPDF_CMapManager;
148    friend class CPDF_CIDFont;
149  
150   protected:
151    CFX_ByteString m_PredefinedCMap;
152    FX_BOOL m_bVertical;
153    CIDSet m_Charset;
154    int m_Coding;
155    CodingScheme m_CodingScheme;
156    int m_nCodeRanges;
157    uint8_t* m_pLeadingBytes;
158    FX_WORD* m_pMapping;
159    uint8_t* m_pAddMapping;
160    FX_BOOL m_bLoaded;
161    const FXCMAP_CMap* m_pEmbedMap;
162    CPDF_CMap* m_pUseMap;
163  };
164  
165  typedef struct _FileHeader {
166    uint8_t btTag[4];
167    uint8_t btVersion;
168    uint8_t btFormat;
169    uint8_t btReserved1[2];
170    FX_DWORD dwStartIndex;
171    FX_DWORD dwEndIndex;
172    FX_DWORD dwDataSize;
173    FX_DWORD dwDataOffset;
174    FX_DWORD dwRecordSize;
175  } FXMP_FILEHEADER;
176  
177  class CPDF_CID2UnicodeMap {
178   public:
179    CPDF_CID2UnicodeMap();
180    ~CPDF_CID2UnicodeMap();
181    FX_BOOL Initialize();
182    FX_BOOL IsLoaded();
183    void Load(CPDF_CMapManager* pMgr, CIDSet charset, FX_BOOL bPromptCJK);
184    FX_WCHAR UnicodeFromCID(FX_WORD CID);
185  
186   protected:
187    CIDSet m_Charset;
188    const FX_WORD* m_pEmbeddedMap;
189    FX_DWORD m_EmbeddedCount;
190  };
191  
192  class CPDF_ToUnicodeMap {
193   public:
194    void Load(CPDF_Stream* pStream);
195    CFX_WideString Lookup(FX_DWORD charcode);
196    FX_DWORD ReverseLookup(FX_WCHAR unicode);
197  
198   protected:
199    std::map<FX_DWORD, FX_DWORD> m_Map;
200    CPDF_CID2UnicodeMap* m_pBaseMap;
201    CFX_WideTextBuf m_MultiCharBuf;
202  
203   private:
204    friend class fpdf_font_StringToCode_Test;
205    friend class fpdf_font_StringToWideString_Test;
206  
207    static FX_DWORD StringToCode(const CFX_ByteStringC& str);
208    static CFX_WideString StringToWideString(const CFX_ByteStringC& str);
209  };
210  class CPDF_FontCharMap : public CFX_CharMap {
211   public:
212    CPDF_FontCharMap(CPDF_Font* pFont);
213    CPDF_Font* m_pFont;
214  };
215  
216  void FPDFAPI_LoadCID2UnicodeMap(CIDSet charset,
217                                  const FX_WORD*& pMap,
218                                  FX_DWORD& count);
219  
220  #endif  // CORE_SRC_FPDFAPI_FPDF_FONT_FONT_INT_H_
221