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