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
7typedef void* FXFT_Library;
8class CPDF_CMapManager : public CFX_Object
9{
10public:
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();
17private:
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};
28class CPDF_FontGlobals : public CFX_Object
29{
30public:
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};
49struct _CMap_CodeRange {
50    int			m_CharSize;
51    FX_BYTE		m_Lower[4];
52    FX_BYTE		m_Upper[4];
53};
54class CPDF_CMapParser : public CFX_Object
55{
56public:
57    CPDF_CMapParser();
58    ~CPDF_CMapParser() {}
59    FX_BOOL	Initialize(CPDF_CMap*);
60    void	ParseWord(FX_BSTR str);
61    CFX_BinaryBuf	m_AddMaps;
62private:
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
79class CPDF_CMap : public CFX_Object
80{
81public:
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;
105protected:
106    ~CPDF_CMap();
107    friend class			CPDF_CMapParser;
108    friend class			CPDF_CMapManager;
109    friend class			CPDF_CIDFont;
110protected:
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};
123class CPDF_PredefinedCMap
124{
125public:
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};
133typedef 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;
144class CPDF_FXMP : public CFX_Object
145{
146public:
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);
164private:
165    FXMP_FILEHEADER*	m_pHeader;
166    FX_LPBYTE	m_pTable;
167};
168class CPDF_CID2UnicodeMap : public CFX_Object
169{
170public:
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);
177protected:
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};
185class CPDF_ToUnicodeMap : public CFX_Object
186{
187public:
188    void					Load(CPDF_Stream* pStream);
189    CFX_WideString			Lookup(FX_DWORD charcode);
190    FX_DWORD				ReverseLookup(FX_WCHAR unicode);
191protected:
192    CFX_CMapDWordToDWord	m_Map;
193    CPDF_CID2UnicodeMap*	m_pBaseMap;
194    CFX_WideTextBuf			m_MultiCharBuf;
195};
196class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object
197{
198public:
199    CPDF_FontCharMap(CPDF_Font* pFont);
200    CPDF_Font*		m_pFont;
201};
202