// Copyright 2014 PDFium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
#ifndef _APPLE_INT_H_ | |
#define _APPLE_INT_H_ | |
#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | |
#if _FX_OS_ == _FX_MACOSX_ | |
#include <Carbon/Carbon.h> | |
#endif | |
typedef enum eFXIOSFONTCHARSET { | |
eFXFontCharsetDEFAULT = 0, | |
eFXFontCharsetANSI = 1, | |
eFXFontCharsetSYMBOL = 1 << 1, | |
eFXFontCharsetSHIFTJIS = 1 << 2, | |
eFXFontCharsetHANGEUL = 1 << 3, | |
eFXFontCharsetGB2312 = 1 << 4, | |
eFXFontCharsetCHINESEBIG5 = 1 << 5, | |
eFXFontCharsetTHAI = 1 << 6, | |
eFXFontCharsetEASTEUROPE = 1 << 7, | |
eFXFontCharsetRUSSIAN = 1 << 8, | |
eFXFontCharsetGREEK = 1 << 9, | |
eFXFontCharsetTURKISH = 1 << 10, | |
eFXFontCharsetHEBREW = 1 << 11, | |
eFXFontCharsetARABIC = 1 << 12, | |
eFXFontCharsetBALTIC = 1 << 13, | |
} FX_IOSCHARSET; | |
FX_IOSCHARSET FX_GetiOSCharset(int charset); | |
typedef enum eFXIOSFONTFLAG { | |
eFXFontFlagBold = 1, | |
eFXFontFlagItalic = 1 << 1, | |
eFXFontFlagFixedPitch = 1 << 2, | |
eFXFontFlagSerif = 1 << 3, | |
eFXFontFlagScript = 1 << 4, | |
} FX_IOSFONTFLAG; | |
typedef struct _IOS_FONTDATA { | |
FX_DWORD nHashCode; | |
const char* psName; | |
FX_DWORD charsets; | |
FX_DWORD styles; | |
} IOS_FONTDATA; | |
class CQuartz2D | |
{ | |
public: | |
void* createGraphics(CFX_DIBitmap* bitmap); | |
void destroyGraphics(void* graphics); | |
void* CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize); | |
void DestroyFont(void* pFont); | |
void setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix); | |
FX_BOOL drawGraphicsString(void* graphics, | |
void* font, | |
FX_FLOAT fontSize, | |
FX_WORD* glyphIndices, | |
CGPoint* glyphPositions, | |
FX_INT32 chars, | |
FX_ARGB argb, | |
CFX_AffineMatrix* matrix = NULL); | |
void saveGraphicsState(void* graphics); | |
void restoreGraphicsState(void* graphics); | |
}; | |
class CApplePlatform : public CFX_Object | |
{ | |
public: | |
CApplePlatform() | |
{ | |
m_pFontMapper = NULL; | |
} | |
~CApplePlatform() | |
{ | |
if (m_pFontMapper) { | |
delete m_pFontMapper; | |
} | |
} | |
CQuartz2D _quartz2d; | |
IFX_FontMapper* m_pFontMapper; | |
}; | |
class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver | |
{ | |
public: | |
CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass); | |
virtual ~CFX_QuartzDeviceDriver(); | |
virtual int GetDeviceCaps(int caps_id); | |
virtual CFX_Matrix GetCTM() const; | |
virtual CFX_DIBitmap* GetBackDrop() | |
{ | |
return NULL; | |
} | |
virtual void* GetPlatformSurface() | |
{ | |
return NULL; | |
} | |
virtual FX_BOOL IsPSPrintDriver() | |
{ | |
return FALSE; | |
} | |
virtual FX_BOOL StartRendering() | |
{ | |
return TRUE; | |
} | |
virtual void EndRendering() {} | |
virtual void SaveState(); | |
virtual void RestoreState(FX_BOOL bKeepSaved); | |
virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData, | |
const CFX_AffineMatrix* pObject2Device, | |
int fill_mode | |
); | |
virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData, | |
const CFX_AffineMatrix* pObject2Device, | |
const CFX_GraphStateData* pGraphState | |
); | |
virtual FX_BOOL DrawPath(const CFX_PathData* pPathData, | |
const CFX_AffineMatrix* pObject2Device, | |
const CFX_GraphStateData* pGraphState, | |
FX_DWORD fill_color, | |
FX_DWORD stroke_color, | |
int fill_mode, | |
int alpha_flag = 0, | |
void* pIccTransform = NULL, | |
int blend_type = FXDIB_BLEND_NORMAL | |
); | |
virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color, | |
int alpha_flag = 0, void* pIccTransform = NULL) | |
{ | |
return FALSE; | |
} | |
virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color, | |
int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL); | |
virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color, | |
int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL); | |
virtual FX_BOOL GetClipBox(FX_RECT* pRect); | |
virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE); | |
virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, | |
int dest_left, int dest_top, int blend_type, | |
int alpha_flag = 0, void* pIccTransform = NULL); | |
virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top, | |
int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags, | |
int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL); | |
virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color, | |
const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle, | |
int alpha_flag = 0, void* pIccTransform = NULL, | |
int blend_type = FXDIB_BLEND_NORMAL) | |
{ | |
return FALSE; | |
} | |
virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause) | |
{ | |
return FALSE; | |
} | |
virtual void CancelDIBits(FX_LPVOID handle) {} | |
virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, | |
CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color, | |
int alpha_flag = 0, void* pIccTransform = NULL); | |
virtual void ClearDriver(); | |
protected: | |
void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth); | |
void setFillInfo(FX_ARGB argb); | |
void setPathToContext(const CFX_PathData * pathData); | |
FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm); | |
FX_BOOL CG_DrawGlypRun(int nChars, | |
const FXTEXT_CHARPOS* pCharPos, | |
CFX_Font* pFont, | |
CFX_FontCache* pCache, | |
const CFX_AffineMatrix* pGlyphMatrix, | |
const CFX_AffineMatrix* pObject2Device, | |
FX_FLOAT font_size, | |
FX_DWORD argb, | |
int alpha_flag, | |
void* pIccTransform); | |
void CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL); | |
protected: | |
CGContextRef _context; | |
CGAffineTransform _foxitDevice2User; | |
CGAffineTransform _user2FoxitDevice; | |
FX_INT32 m_saveCount; | |
FX_INT32 _width; | |
FX_INT32 _height; | |
FX_INT32 _bitsPerPixel; | |
FX_INT32 _deviceClass; | |
FX_INT32 _renderCaps; | |
FX_INT32 _horzSize; | |
FX_INT32 _vertSize; | |
}; | |
class CFX_FontProvider : public IFX_FileRead | |
{ | |
public: | |
virtual void Release() | |
{ | |
delete this; | |
} | |
virtual FX_FILESIZE GetSize() | |
{ | |
return (FX_FILESIZE)_totalSize; | |
} | |
virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); | |
virtual FX_BOOL IsEOF() | |
{ | |
return _offSet == _totalSize; | |
} | |
virtual FX_FILESIZE GetPosition() | |
{ | |
return (FX_FILESIZE)_offSet; | |
} | |
virtual size_t ReadBlock(void* buffer, size_t size); | |
public: | |
CFX_FontProvider(CGFontRef cgFont); | |
~CFX_FontProvider(); | |
void InitTableOffset(); | |
unsigned long Read(unsigned long offset, unsigned char *buffer, unsigned long count); | |
protected: | |
uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable); | |
uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef); | |
private: | |
CGFontRef m_cgFont; | |
UInt32 m_iTableSize; | |
size_t _offSet; | |
typedef struct FontHeader { | |
int32_t fVersion; | |
uint16_t fNumTables; | |
uint16_t fSearchRange; | |
uint16_t fEntrySelector; | |
uint16_t fRangeShift; | |
} FontHeader; | |
typedef struct TableEntry { | |
uint32_t fTag; | |
uint32_t fCheckSum; | |
uint32_t fOffset; | |
uint32_t fLength; | |
} TableEntry; | |
FontHeader _fontHeader; | |
unsigned char * _tableEntries; | |
size_t * _tableOffsets; | |
int _tableCount; | |
int _totalSize; | |
}; | |
FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr); | |
FX_DWORD FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName); | |
FX_UINT32 FX_IOSGetFamilyNamesCount(); | |
FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex); | |
#endif | |
#endif |