// 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 CORE_FXGE_APPLE_APPLE_INT_H_ #define CORE_FXGE_APPLE_APPLE_INT_H_ #include "core/fxcrt/include/fx_system.h" #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ #include "core/include/fxge/fx_ge.h" #if _FX_OS_ == _FX_MACOSX_ #include #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(const uint8_t* pFontData, FX_DWORD dwFontSize); void DestroyFont(void* pFont); void setGraphicsTextMatrix(void* graphics, CFX_Matrix* matrix); FX_BOOL drawGraphicsString(void* graphics, void* font, FX_FLOAT fontSize, uint16_t* glyphIndices, CGPoint* glyphPositions, int32_t chars, FX_ARGB argb, CFX_Matrix* matrix = NULL); void saveGraphicsState(void* graphics); void restoreGraphicsState(void* graphics); }; class CApplePlatform { public: CApplePlatform() {} ~CApplePlatform() {} CQuartz2D _quartz2d; }; class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver { public: CFX_QuartzDeviceDriver(CGContextRef context, int32_t deviceClass); ~CFX_QuartzDeviceDriver() override; // IFX_RenderDeviceDriver int GetDeviceCaps(int caps_id) override; CFX_Matrix GetCTM() const override; FX_BOOL IsPSPrintDriver() override { return FALSE; } FX_BOOL StartRendering() override { return TRUE; } void EndRendering() override {} void SaveState() override; void RestoreState(FX_BOOL bKeepSaved) override; FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData, const CFX_Matrix* pObject2Device, int fill_mode) override; FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData, const CFX_Matrix* pObject2Device, const CFX_GraphStateData* pGraphState) override; FX_BOOL DrawPath(const CFX_PathData* pPathData, const CFX_Matrix* 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) override; FX_BOOL SetPixel(int x, int y, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL) override { return FALSE; } FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) override; 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) override; FX_BOOL GetClipBox(FX_RECT* pRect) override; FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE) override; CFX_DIBitmap* GetBackDrop() override { return NULL; } 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) override; 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) override; FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color, const CFX_Matrix* pMatrix, FX_DWORD flags, void*& handle, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) override { return FALSE; } FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause) override { return FALSE; } void CancelDIBits(void* handle) override {} FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, CFX_FontCache* pCache, const CFX_Matrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL) override; void* GetPlatformSurface() const override { return NULL; } void ClearDriver() override; 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_Matrix* pGlyphMatrix, const CFX_Matrix* 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; int32_t m_saveCount; int32_t _width; int32_t _height; int32_t _bitsPerPixel; int32_t _deviceClass; int32_t _renderCaps; int32_t _horzSize; int32_t _vertSize; }; class CFX_FontProvider final : public IFX_FileRead { public: // IFX_FileRead void Release() override { delete this; } FX_FILESIZE GetSize() override { return (FX_FILESIZE)_totalSize; } FX_BOOL IsEOF() override { return _offSet == _totalSize; } FX_FILESIZE GetPosition() override { return (FX_FILESIZE)_offSet; } FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override; size_t ReadBlock(void* buffer, size_t size) override; public: CFX_FontProvider(CGFontRef cgFont); ~CFX_FontProvider() override; 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; }; uint32_t FX_GetHashCode(const FX_CHAR* pStr); FX_DWORD FX_IOSGetMatchFamilyNameHashcode(const FX_CHAR* pFontName); uint32_t FX_IOSGetFamilyNamesCount(); const FX_CHAR* FX_IOSGetFamilyName(uint32_t uIndex); #endif #endif // CORE_FXGE_APPLE_APPLE_INT_H_