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_FXGE_APPLE_APPLE_INT_H_
8 #define CORE_SRC_FXGE_APPLE_APPLE_INT_H_
9 
10 #if _FXM_PLATFORM_  == _FXM_PLATFORM_APPLE_
11 #if _FX_OS_ == _FX_MACOSX_
12 #include <Carbon/Carbon.h>
13 #endif
14 typedef enum eFXIOSFONTCHARSET {
15     eFXFontCharsetDEFAULT       =   0,
16     eFXFontCharsetANSI          =   1,
17     eFXFontCharsetSYMBOL        =   1 << 1,
18     eFXFontCharsetSHIFTJIS      =   1 << 2,
19     eFXFontCharsetHANGEUL       =   1 << 3,
20     eFXFontCharsetGB2312        =   1 << 4,
21     eFXFontCharsetCHINESEBIG5   =   1 << 5,
22     eFXFontCharsetTHAI          =   1 << 6,
23     eFXFontCharsetEASTEUROPE    =   1 << 7,
24     eFXFontCharsetRUSSIAN       =   1 << 8,
25     eFXFontCharsetGREEK         =   1 << 9,
26     eFXFontCharsetTURKISH       =   1 << 10,
27     eFXFontCharsetHEBREW        =   1 << 11,
28     eFXFontCharsetARABIC        =   1 << 12,
29     eFXFontCharsetBALTIC        =   1 << 13,
30 } FX_IOSCHARSET;
31 FX_IOSCHARSET FX_GetiOSCharset(int charset);
32 typedef enum eFXIOSFONTFLAG {
33     eFXFontFlagBold         =  1,
34     eFXFontFlagItalic       =  1 << 1,
35     eFXFontFlagFixedPitch   =  1 << 2,
36     eFXFontFlagSerif        =  1 << 3,
37     eFXFontFlagScript       =  1 << 4,
38 } FX_IOSFONTFLAG;
39 typedef struct _IOS_FONTDATA {
40     FX_DWORD        nHashCode;
41     const char*       psName;
42     FX_DWORD        charsets;
43     FX_DWORD        styles;
44 } IOS_FONTDATA;
45 class CQuartz2D
46 {
47 public:
48     void*	createGraphics(CFX_DIBitmap* bitmap);
49     void	destroyGraphics(void* graphics);
50 
51     void*	CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);
52     void	DestroyFont(void* pFont);
53     void	setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);
54     FX_BOOL	drawGraphicsString(void*                graphics,
55                                void*                font,
56                                FX_FLOAT             fontSize,
57                                FX_WORD*             glyphIndices,
58                                CGPoint*          glyphPositions,
59                                FX_INT32             chars,
60                                FX_ARGB              argb,
61                                CFX_AffineMatrix*    matrix = NULL);
62     void saveGraphicsState(void* graphics);
63     void restoreGraphicsState(void* graphics);
64 };
65 class CApplePlatform
66 {
67 public:
CApplePlatform()68     CApplePlatform()
69     {
70         m_pFontMapper = NULL;
71     }
~CApplePlatform()72     ~CApplePlatform()
73     {
74         if (m_pFontMapper) {
75             delete m_pFontMapper;
76         }
77     }
78     CQuartz2D	_quartz2d;
79     IFX_FontMapper* m_pFontMapper;
80 };
81 class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver
82 {
83 public:
84     CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);
85     virtual ~CFX_QuartzDeviceDriver();
86 
87     virtual int		GetDeviceCaps(int caps_id);
88     virtual CFX_Matrix	GetCTM() const;
GetBackDrop()89     virtual CFX_DIBitmap*   GetBackDrop()
90     {
91         return NULL;
92     }
GetPlatformSurface()93     virtual void*	GetPlatformSurface()
94     {
95         return NULL;
96     }
IsPSPrintDriver()97     virtual FX_BOOL IsPSPrintDriver()
98     {
99         return FALSE;
100     }
StartRendering()101     virtual FX_BOOL	StartRendering()
102     {
103         return TRUE;
104     }
EndRendering()105     virtual void	EndRendering() {}
106     virtual void	SaveState();
107     virtual void	RestoreState(FX_BOOL bKeepSaved);
108     virtual FX_BOOL	SetClip_PathFill(const CFX_PathData* pPathData,
109                                      const CFX_AffineMatrix* pObject2Device,
110                                      int fill_mode
111                                     );
112     virtual FX_BOOL	SetClip_PathStroke(const CFX_PathData* pPathData,
113                                        const CFX_AffineMatrix* pObject2Device,
114                                        const CFX_GraphStateData* pGraphState
115                                       );
116     virtual FX_BOOL	DrawPath(const CFX_PathData* pPathData,
117                              const CFX_AffineMatrix* pObject2Device,
118                              const CFX_GraphStateData* pGraphState,
119                              FX_DWORD fill_color,
120                              FX_DWORD stroke_color,
121                              int fill_mode,
122                              int alpha_flag = 0,
123                              void* pIccTransform = NULL,
124                              int blend_type = FXDIB_BLEND_NORMAL
125                             );
126     virtual FX_BOOL	SetPixel(int x, int y, FX_DWORD color,
127                              int alpha_flag = 0, void* pIccTransform = NULL)
128     {
129         return FALSE;
130     }
131     virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
132                              int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
133     virtual FX_BOOL	DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
134                                      int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
135     virtual FX_BOOL GetClipBox(FX_RECT* pRect);
136     virtual FX_BOOL	GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
137     virtual FX_BOOL	SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
138                               int dest_left, int dest_top, int blend_type,
139                               int alpha_flag = 0, void* pIccTransform = NULL);
140     virtual FX_BOOL	StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
141                                   int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
142                                   int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
143     virtual FX_BOOL	StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
144                                 const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
145                                 int alpha_flag = 0, void* pIccTransform = NULL,
146                                 int blend_type = FXDIB_BLEND_NORMAL)
147     {
148         return FALSE;
149     }
ContinueDIBits(FX_LPVOID handle,IFX_Pause * pPause)150     virtual FX_BOOL	ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
151     {
152         return FALSE;
153     }
CancelDIBits(FX_LPVOID handle)154     virtual void	CancelDIBits(FX_LPVOID handle) {}
155     virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
156                                    CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
157                                    int alpha_flag = 0, void* pIccTransform = NULL);
158     virtual void    ClearDriver();
159 protected:
160     void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);
161     void setFillInfo(FX_ARGB argb);
162     void setPathToContext(const CFX_PathData * pathData);
163     FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);
164     FX_BOOL CG_DrawGlypRun(int                        nChars,
165                            const FXTEXT_CHARPOS*      pCharPos,
166                            CFX_Font*                  pFont,
167                            CFX_FontCache*             pCache,
168                            const CFX_AffineMatrix*    pGlyphMatrix,
169                            const CFX_AffineMatrix*    pObject2Device,
170                            FX_FLOAT                   font_size,
171                            FX_DWORD                   argb,
172                            int                        alpha_flag,
173                            void*                      pIccTransform);
174     void    CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);
175 protected:
176     CGContextRef	_context;
177     CGAffineTransform _foxitDevice2User;
178     CGAffineTransform _user2FoxitDevice;
179     FX_INT32        m_saveCount;
180 
181     FX_INT32		_width;
182     FX_INT32		_height;
183     FX_INT32		_bitsPerPixel;
184     FX_INT32		_deviceClass;
185     FX_INT32		_renderCaps;
186     FX_INT32	_horzSize;
187     FX_INT32	_vertSize;
188 };
189 class CFX_FontProvider FX_FINAL : public IFX_FileRead
190 {
191 public:
Release()192     virtual void			Release() FX_OVERRIDE
193     {
194         delete this;
195     }
GetSize()196     virtual FX_FILESIZE		GetSize() FX_OVERRIDE
197     {
198         return (FX_FILESIZE)_totalSize;
199     }
200     virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) FX_OVERRIDE;
201 
IsEOF()202     virtual FX_BOOL			IsEOF() FX_OVERRIDE
203     {
204         return _offSet == _totalSize;
205     }
GetPosition()206     virtual FX_FILESIZE		GetPosition() FX_OVERRIDE
207     {
208         return (FX_FILESIZE)_offSet;
209     }
210     virtual size_t			ReadBlock(void* buffer, size_t size) FX_OVERRIDE;
211 public:
212     CFX_FontProvider(CGFontRef cgFont);
213     ~CFX_FontProvider();
214     void            InitTableOffset();
215     unsigned long   Read(unsigned long offset, unsigned char *buffer, unsigned long count);
216 protected:
217     uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);
218     uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);
219 private:
220     CGFontRef   m_cgFont;
221     UInt32      m_iTableSize;
222     size_t      _offSet;
223     typedef struct FontHeader {
224         int32_t fVersion;
225         uint16_t fNumTables;
226         uint16_t fSearchRange;
227         uint16_t fEntrySelector;
228         uint16_t fRangeShift;
229     } FontHeader;
230     typedef struct TableEntry {
231         uint32_t fTag;
232         uint32_t fCheckSum;
233         uint32_t fOffset;
234         uint32_t fLength;
235     } TableEntry;
236     FontHeader _fontHeader;
237     unsigned char * _tableEntries;
238     size_t * _tableOffsets;
239     int _tableCount;
240     int _totalSize;
241 };
242 FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);
243 FX_DWORD  FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);
244 FX_UINT32 FX_IOSGetFamilyNamesCount();
245 FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);
246 #endif
247 
248 #endif  // CORE_SRC_FXGE_APPLE_APPLE_INT_H_
249