blob: 5c42f1b1fb85b3439de1fe7612f7585ba5350f61 [file] [log] [blame]
// 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