summaryrefslogtreecommitdiff
path: root/core/fxge/include
diff options
context:
space:
mode:
authordsinclair <dsinclair@chromium.org>2016-04-06 10:00:40 -0700
committerCommit bot <commit-bot@chromium.org>2016-04-06 10:00:40 -0700
commit48baa5f230a886b0579a9626711e7d71376b085e (patch)
tree62212bf5d496228e50df09cf4e437a1308f821a7 /core/fxge/include
parent392f1022a3c525a053a7d143d2b23a76526a1aea (diff)
downloadpdfium-48baa5f230a886b0579a9626711e7d71376b085e.tar.xz
Move core/include/fxge to core/fxge/include.
This CL is a straight move of the fxge includes into core/fxge/include. Review URL: https://codereview.chromium.org/1868533002
Diffstat (limited to 'core/fxge/include')
-rw-r--r--core/fxge/include/fpf.h70
-rw-r--r--core/fxge/include/fx_dib.h669
-rw-r--r--core/fxge/include/fx_font.h566
-rw-r--r--core/fxge/include/fx_freetype.h180
-rw-r--r--core/fxge/include/fx_ge.h733
-rw-r--r--core/fxge/include/fx_ge_apple.h27
-rw-r--r--core/fxge/include/fx_ge_win32.h98
7 files changed, 2343 insertions, 0 deletions
diff --git a/core/fxge/include/fpf.h b/core/fxge/include/fpf.h
new file mode 100644
index 0000000000..2d43e8da6f
--- /dev/null
+++ b/core/fxge/include/fpf.h
@@ -0,0 +1,70 @@
+// 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_INCLUDE_FPF_H_
+#define CORE_FXGE_INCLUDE_FPF_H_
+
+#include "core/fxcrt/include/fx_coordinates.h"
+
+class IFPF_FontMgr;
+
+class IFPF_DeviceModule {
+ public:
+ virtual ~IFPF_DeviceModule() {}
+ virtual void Destroy() = 0;
+ virtual IFPF_FontMgr* GetFontMgr() = 0;
+};
+
+IFPF_DeviceModule* FPF_GetDeviceModule();
+
+#define FPF_MATCHFONT_REPLACEANSI 1
+
+typedef struct FPF_HFONT_ { void* pData; } * FPF_HFONT;
+
+class IFPF_Font {
+ public:
+ virtual void Release() = 0;
+ virtual IFPF_Font* Retain() = 0;
+ virtual FPF_HFONT GetHandle() = 0;
+ virtual CFX_ByteString GetFamilyName() = 0;
+ virtual CFX_WideString GetPsName() = 0;
+ virtual uint32_t GetFontStyle() const = 0;
+ virtual uint8_t GetCharset() const = 0;
+
+ virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode) = 0;
+ virtual int32_t GetGlyphWidth(int32_t iGlyphIndex) = 0;
+
+ virtual int32_t GetAscent() const = 0;
+ virtual int32_t GetDescent() const = 0;
+
+ virtual FX_BOOL GetGlyphBBox(int32_t iGlyphIndex, FX_RECT& rtBBox) = 0;
+ virtual FX_BOOL GetBBox(FX_RECT& rtBBox) = 0;
+
+ virtual int32_t GetHeight() const = 0;
+ virtual int32_t GetItalicAngle() const = 0;
+ virtual uint32_t GetFontData(uint32_t dwTable,
+ uint8_t* pBuffer,
+ uint32_t dwSize) = 0;
+
+ protected:
+ virtual ~IFPF_Font() {}
+};
+
+class IFPF_FontMgr {
+ public:
+ virtual ~IFPF_FontMgr() {}
+ virtual void LoadSystemFonts() = 0;
+ virtual void LoadPrivateFont(IFX_FileRead* pFontFile) = 0;
+ virtual void LoadPrivateFont(const CFX_ByteStringC& bsFileName) = 0;
+ virtual void LoadPrivateFont(void* pBuffer, size_t szBuffer) = 0;
+
+ virtual IFPF_Font* CreateFont(const CFX_ByteStringC& bsFamilyname,
+ uint8_t charset,
+ uint32_t dwStyle,
+ uint32_t dwMatch = 0) = 0;
+};
+
+#endif // CORE_FXGE_INCLUDE_FPF_H_
diff --git a/core/fxge/include/fx_dib.h b/core/fxge/include/fx_dib.h
new file mode 100644
index 0000000000..4a9b29533a
--- /dev/null
+++ b/core/fxge/include/fx_dib.h
@@ -0,0 +1,669 @@
+// 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_INCLUDE_FX_DIB_H_
+#define CORE_FXGE_INCLUDE_FX_DIB_H_
+
+#include "core/fxcrt/include/fx_basic.h"
+#include "core/fxcrt/include/fx_coordinates.h"
+
+enum FXDIB_Format {
+ FXDIB_Invalid = 0,
+ FXDIB_1bppMask = 0x101,
+ FXDIB_1bppRgb = 0x001,
+ FXDIB_1bppCmyk = 0x401,
+ FXDIB_8bppMask = 0x108,
+ FXDIB_8bppRgb = 0x008,
+ FXDIB_8bppRgba = 0x208,
+ FXDIB_8bppCmyk = 0x408,
+ FXDIB_8bppCmyka = 0x608,
+ FXDIB_Rgb = 0x018,
+ FXDIB_Rgba = 0x218,
+ FXDIB_Rgb32 = 0x020,
+ FXDIB_Argb = 0x220,
+ FXDIB_Cmyk = 0x420,
+ FXDIB_Cmyka = 0x620,
+};
+enum FXDIB_Channel {
+ FXDIB_Red = 1,
+ FXDIB_Green,
+ FXDIB_Blue,
+ FXDIB_Cyan,
+ FXDIB_Magenta,
+ FXDIB_Yellow,
+ FXDIB_Black,
+ FXDIB_Alpha
+};
+#define FXDIB_DOWNSAMPLE 0x04
+#define FXDIB_INTERPOL 0x20
+#define FXDIB_BICUBIC_INTERPOL 0x80
+#define FXDIB_NOSMOOTH 0x100
+#define FXDIB_BLEND_NORMAL 0
+#define FXDIB_BLEND_MULTIPLY 1
+#define FXDIB_BLEND_SCREEN 2
+#define FXDIB_BLEND_OVERLAY 3
+#define FXDIB_BLEND_DARKEN 4
+#define FXDIB_BLEND_LIGHTEN 5
+
+#define FXDIB_BLEND_COLORDODGE 6
+#define FXDIB_BLEND_COLORBURN 7
+#define FXDIB_BLEND_HARDLIGHT 8
+#define FXDIB_BLEND_SOFTLIGHT 9
+#define FXDIB_BLEND_DIFFERENCE 10
+#define FXDIB_BLEND_EXCLUSION 11
+#define FXDIB_BLEND_NONSEPARABLE 21
+#define FXDIB_BLEND_HUE 21
+#define FXDIB_BLEND_SATURATION 22
+#define FXDIB_BLEND_COLOR 23
+#define FXDIB_BLEND_LUMINOSITY 24
+#define FXDIB_BLEND_UNSUPPORTED -1
+typedef uint32_t FX_ARGB;
+typedef uint32_t FX_COLORREF;
+typedef uint32_t FX_CMYK;
+class CFX_ClipRgn;
+class CFX_DIBSource;
+class CFX_DIBitmap;
+class CStretchEngine;
+
+#define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
+#define FXSYS_GetRValue(rgb) ((rgb)&0xff)
+#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
+#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
+#define FX_CCOLOR(val) (255 - (val))
+#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))
+#define FXSYS_GetCValue(cmyk) ((uint8_t)((cmyk) >> 24) & 0xff)
+#define FXSYS_GetMValue(cmyk) ((uint8_t)((cmyk) >> 16) & 0xff)
+#define FXSYS_GetYValue(cmyk) ((uint8_t)((cmyk) >> 8) & 0xff)
+#define FXSYS_GetKValue(cmyk) ((uint8_t)(cmyk)&0xff)
+void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);
+inline FX_CMYK CmykEncode(int c, int m, int y, int k) {
+ return (c << 24) | (m << 16) | (y << 8) | k;
+}
+void ArgbDecode(FX_ARGB argb, int& a, int& r, int& g, int& b);
+void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);
+inline FX_ARGB ArgbEncode(int a, int r, int g, int b) {
+ return (a << 24) | (r << 16) | (g << 8) | b;
+}
+FX_ARGB ArgbEncode(int a, FX_COLORREF rgb);
+#define FXARGB_A(argb) ((uint8_t)((argb) >> 24))
+#define FXARGB_R(argb) ((uint8_t)((argb) >> 16))
+#define FXARGB_G(argb) ((uint8_t)((argb) >> 8))
+#define FXARGB_B(argb) ((uint8_t)(argb))
+#define FXARGB_MAKE(a, r, g, b) \
+ (((uint32_t)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
+#define FXARGB_MUL_ALPHA(argb, alpha) \
+ (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb)&0xffffff))
+#define FXRGB2GRAY(r, g, b) (((b)*11 + (g)*59 + (r)*30) / 100)
+#define FXCMYK2GRAY(c, m, y, k) \
+ (((255 - (c)) * (255 - (k)) * 30 + (255 - (m)) * (255 - (k)) * 59 + \
+ (255 - (y)) * (255 - (k)) * 11) / \
+ 25500)
+#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) \
+ (((backdrop) * (255 - (source_alpha)) + (source) * (source_alpha)) / 255)
+#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest) * (src) / 255)
+#define FXCMYK_GETDIB(p) \
+ ((((uint8_t*)(p))[0] << 24 | (((uint8_t*)(p))[1] << 16) | \
+ (((uint8_t*)(p))[2] << 8) | ((uint8_t*)(p))[3]))
+#define FXCMYK_SETDIB(p, cmyk) ((uint8_t*)(p))[0] = (uint8_t)((cmyk) >> 24), \
+ ((uint8_t*)(p))[1] = (uint8_t)((cmyk) >> 16), \
+ ((uint8_t*)(p))[2] = (uint8_t)((cmyk) >> 8), \
+ ((uint8_t*)(p))[3] = (uint8_t)(cmyk))
+#define FXARGB_GETDIB(p) \
+ ((((uint8_t*)(p))[0]) | (((uint8_t*)(p))[1] << 8) | \
+ (((uint8_t*)(p))[2] << 16) | (((uint8_t*)(p))[3] << 24))
+#define FXARGB_SETDIB(p, argb) \
+ ((uint8_t*)(p))[0] = (uint8_t)(argb), \
+ ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \
+ ((uint8_t*)(p))[2] = (uint8_t)((argb) >> 16), \
+ ((uint8_t*)(p))[3] = (uint8_t)((argb) >> 24)
+#define FXARGB_COPY(dest, src) \
+ *(uint8_t*)(dest) = *(uint8_t*)(src), \
+ *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
+ *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \
+ *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3)
+#define FXCMYK_COPY(dest, src) \
+ *(uint8_t*)(dest) = *(uint8_t*)(src), \
+ *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
+ *((uint8_t*)(dest) + 2) = *((uint8_t*)(src) + 2), \
+ *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3)
+#define FXARGB_SETRGBORDERDIB(p, argb) \
+ ((uint8_t*)(p))[3] = (uint8_t)(argb >> 24), \
+ ((uint8_t*)(p))[0] = (uint8_t)((argb) >> 16), \
+ ((uint8_t*)(p))[1] = (uint8_t)((argb) >> 8), \
+ ((uint8_t*)(p))[2] = (uint8_t)(argb)
+#define FXARGB_GETRGBORDERDIB(p) \
+ (((uint8_t*)(p))[2]) | (((uint8_t*)(p))[1] << 8) | \
+ (((uint8_t*)(p))[0] << 16) | (((uint8_t*)(p))[3] << 24)
+#define FXARGB_RGBORDERCOPY(dest, src) \
+ *((uint8_t*)(dest) + 3) = *((uint8_t*)(src) + 3), \
+ *(uint8_t*)(dest) = *((uint8_t*)(src) + 2), \
+ *((uint8_t*)(dest) + 1) = *((uint8_t*)(src) + 1), \
+ *((uint8_t*)(dest) + 2) = *((uint8_t*)(src))
+#define FXARGB_TODIB(argb) (argb)
+#define FXCMYK_TODIB(cmyk) \
+ ((uint8_t)((cmyk) >> 24) | ((uint8_t)((cmyk) >> 16)) << 8 | \
+ ((uint8_t)((cmyk) >> 8)) << 16 | ((uint8_t)(cmyk) << 24))
+#define FXARGB_TOBGRORDERDIB(argb) \
+ ((uint8_t)(argb >> 16) | ((uint8_t)(argb >> 8)) << 8 | \
+ ((uint8_t)(argb)) << 16 | ((uint8_t)(argb >> 24) << 24))
+#define FXGETFLAG_COLORTYPE(flag) (uint8_t)((flag) >> 8)
+#define FXGETFLAG_ALPHA_FILL(flag) (uint8_t)(flag)
+#define FXGETFLAG_ALPHA_STROKE(flag) (uint8_t)((flag) >> 16)
+#define FXSETFLAG_COLORTYPE(flag, val) \
+ flag = (((val) << 8) | (flag & 0xffff00ff))
+#define FXSETFLAG_ALPHA_FILL(flag, val) flag = ((val) | (flag & 0xffffff00))
+#define FXSETFLAG_ALPHA_STROKE(flag, val) \
+ flag = (((val) << 16) | (flag & 0xff00ffff))
+
+class CFX_DIBSource {
+ public:
+ virtual ~CFX_DIBSource();
+
+ int GetWidth() const { return m_Width; }
+ int GetHeight() const { return m_Height; }
+
+ FXDIB_Format GetFormat() const {
+ return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);
+ }
+ uint32_t GetPitch() const { return m_Pitch; }
+ uint32_t* GetPalette() const { return m_pPalette; }
+
+ virtual uint8_t* GetBuffer() const;
+ virtual const uint8_t* GetScanline(int line) const = 0;
+ virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const;
+ virtual void DownSampleScanline(int line,
+ uint8_t* dest_scan,
+ int dest_bpp,
+ int dest_width,
+ FX_BOOL bFlipX,
+ int clip_left,
+ int clip_width) const = 0;
+
+ int GetBPP() const { return m_bpp; }
+
+ // TODO(thestig): Investigate this. Given the possible values of FXDIB_Format,
+ // it feels as though this should be implemented as !!(m_AlphaFlag & 1) and
+ // IsOpaqueImage() below should never be able to return TRUE.
+ bool IsAlphaMask() const { return m_AlphaFlag == 1; }
+ bool HasAlpha() const { return !!(m_AlphaFlag & 2); }
+ bool IsOpaqueImage() const { return !(m_AlphaFlag & 3); }
+ bool IsCmykImage() const { return !!(m_AlphaFlag & 4); }
+
+ int GetPaletteSize() const {
+ return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));
+ }
+
+ uint32_t GetPaletteEntry(int index) const;
+
+ void SetPaletteEntry(int index, uint32_t color);
+ uint32_t GetPaletteArgb(int index) const { return GetPaletteEntry(index); }
+ void SetPaletteArgb(int index, uint32_t color) {
+ SetPaletteEntry(index, color);
+ }
+
+ void CopyPalette(const uint32_t* pSrcPal, uint32_t size = 256);
+
+ CFX_DIBitmap* Clone(const FX_RECT* pClip = NULL) const;
+ CFX_DIBitmap* CloneConvert(FXDIB_Format format,
+ const FX_RECT* pClip = NULL,
+ void* pIccTransform = NULL) const;
+
+ CFX_DIBitmap* StretchTo(int dest_width,
+ int dest_height,
+ uint32_t flags = 0,
+ const FX_RECT* pClip = NULL) const;
+ CFX_DIBitmap* TransformTo(const CFX_Matrix* pMatrix,
+ int& left,
+ int& top,
+ uint32_t flags = 0,
+ const FX_RECT* pClip = NULL) const;
+
+ CFX_DIBitmap* GetAlphaMask(const FX_RECT* pClip = NULL) const;
+ FX_BOOL CopyAlphaMask(const CFX_DIBSource* pAlphaMask,
+ const FX_RECT* pClip = NULL);
+
+ CFX_DIBitmap* SwapXY(FX_BOOL bXFlip,
+ FX_BOOL bYFlip,
+ const FX_RECT* pClip = NULL) const;
+
+ CFX_DIBitmap* FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;
+
+ void GetOverlapRect(int& dest_left,
+ int& dest_top,
+ int& width,
+ int& height,
+ int src_width,
+ int src_height,
+ int& src_left,
+ int& src_top,
+ const CFX_ClipRgn* pClipRgn);
+
+ CFX_DIBitmap* m_pAlphaMask;
+
+ protected:
+ CFX_DIBSource();
+
+ int m_Width;
+ int m_Height;
+ int m_bpp;
+ uint32_t m_AlphaFlag;
+ uint32_t m_Pitch;
+ uint32_t* m_pPalette;
+
+ void BuildPalette();
+ FX_BOOL BuildAlphaMask();
+ int FindPalette(uint32_t color) const;
+ void GetPalette(uint32_t* pal, int alpha) const;
+};
+class CFX_DIBitmap : public CFX_DIBSource {
+ public:
+ CFX_DIBitmap();
+ explicit CFX_DIBitmap(const CFX_DIBitmap& src);
+ ~CFX_DIBitmap() override;
+
+ FX_BOOL Create(int width,
+ int height,
+ FXDIB_Format format,
+ uint8_t* pBuffer = NULL,
+ int pitch = 0);
+
+ FX_BOOL Copy(const CFX_DIBSource* pSrc);
+
+ // CFX_DIBSource
+ uint8_t* GetBuffer() const override;
+ const uint8_t* GetScanline(int line) const override;
+ void DownSampleScanline(int line,
+ uint8_t* dest_scan,
+ int dest_bpp,
+ int dest_width,
+ FX_BOOL bFlipX,
+ int clip_left,
+ int clip_width) const override;
+
+ void TakeOver(CFX_DIBitmap* pSrcBitmap);
+
+ FX_BOOL ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);
+
+ void Clear(uint32_t color);
+
+ uint32_t GetPixel(int x, int y) const;
+
+ void SetPixel(int x, int y, uint32_t color);
+
+ FX_BOOL LoadChannel(FXDIB_Channel destChannel,
+ const CFX_DIBSource* pSrcBitmap,
+ FXDIB_Channel srcChannel);
+
+ FX_BOOL LoadChannel(FXDIB_Channel destChannel, int value);
+
+ FX_BOOL MultiplyAlpha(int alpha);
+
+ FX_BOOL MultiplyAlpha(const CFX_DIBSource* pAlphaMask);
+
+ FX_BOOL TransferBitmap(int dest_left,
+ int dest_top,
+ int width,
+ int height,
+ const CFX_DIBSource* pSrcBitmap,
+ int src_left,
+ int src_top,
+ void* pIccTransform = NULL);
+
+ FX_BOOL CompositeBitmap(int dest_left,
+ int dest_top,
+ int width,
+ int height,
+ const CFX_DIBSource* pSrcBitmap,
+ int src_left,
+ int src_top,
+ int blend_type = FXDIB_BLEND_NORMAL,
+ const CFX_ClipRgn* pClipRgn = NULL,
+ FX_BOOL bRgbByteOrder = FALSE,
+ void* pIccTransform = NULL);
+
+ FX_BOOL TransferMask(int dest_left,
+ int dest_top,
+ int width,
+ int height,
+ const CFX_DIBSource* pMask,
+ uint32_t color,
+ int src_left,
+ int src_top,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL CompositeMask(int dest_left,
+ int dest_top,
+ int width,
+ int height,
+ const CFX_DIBSource* pMask,
+ uint32_t color,
+ int src_left,
+ int src_top,
+ int blend_type = FXDIB_BLEND_NORMAL,
+ const CFX_ClipRgn* pClipRgn = NULL,
+ FX_BOOL bRgbByteOrder = FALSE,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL CompositeRect(int dest_left,
+ int dest_top,
+ int width,
+ int height,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL ConvertColorScale(uint32_t forecolor, uint32_t backcolor);
+
+ FX_BOOL DitherFS(const uint32_t* pPalette,
+ int pal_size,
+ const FX_RECT* pRect = NULL);
+
+ protected:
+ uint8_t* m_pBuffer;
+
+ FX_BOOL m_bExtBuf;
+
+ FX_BOOL GetGrayData(void* pIccTransform = NULL);
+};
+class CFX_DIBExtractor {
+ public:
+ CFX_DIBExtractor(const CFX_DIBSource* pSrc);
+
+ ~CFX_DIBExtractor();
+
+ operator CFX_DIBitmap*() { return m_pBitmap; }
+
+ private:
+ CFX_DIBitmap* m_pBitmap;
+};
+
+typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;
+class CFX_FilteredDIB : public CFX_DIBSource {
+ public:
+ CFX_FilteredDIB();
+ ~CFX_FilteredDIB() override;
+
+ void LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);
+
+ virtual FXDIB_Format GetDestFormat() = 0;
+
+ virtual uint32_t* GetDestPalette() = 0;
+
+ virtual void TranslateScanline(uint8_t* dest_buf,
+ const uint8_t* src_buf) const = 0;
+
+ virtual void TranslateDownSamples(uint8_t* dest_buf,
+ const uint8_t* src_buf,
+ int pixels,
+ int Bpp) const = 0;
+
+ protected:
+ // CFX_DIBSource
+ const uint8_t* GetScanline(int line) const override;
+ void DownSampleScanline(int line,
+ uint8_t* dest_scan,
+ int dest_bpp,
+ int dest_width,
+ FX_BOOL bFlipX,
+ int clip_left,
+ int clip_width) const override;
+
+ const CFX_DIBSource* m_pSrc;
+
+ FX_BOOL m_bAutoDropSrc;
+
+ uint8_t* m_pScanline;
+};
+
+class IFX_ScanlineComposer {
+ public:
+ virtual ~IFX_ScanlineComposer() {}
+
+ virtual void ComposeScanline(int line,
+ const uint8_t* scanline,
+ const uint8_t* scan_extra_alpha = NULL) = 0;
+
+ virtual FX_BOOL SetInfo(int width,
+ int height,
+ FXDIB_Format src_format,
+ uint32_t* pSrcPalette) = 0;
+};
+class CFX_ScanlineCompositor {
+ public:
+ CFX_ScanlineCompositor();
+
+ ~CFX_ScanlineCompositor();
+
+ FX_BOOL Init(FXDIB_Format dest_format,
+ FXDIB_Format src_format,
+ int32_t width,
+ uint32_t* pSrcPalette,
+ uint32_t mask_color,
+ int blend_type,
+ FX_BOOL bClip,
+ FX_BOOL bRgbByteOrder = FALSE,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ void CompositeRgbBitmapLine(uint8_t* dest_scan,
+ const uint8_t* src_scan,
+ int width,
+ const uint8_t* clip_scan,
+ const uint8_t* src_extra_alpha = NULL,
+ uint8_t* dst_extra_alpha = NULL);
+
+ void CompositePalBitmapLine(uint8_t* dest_scan,
+ const uint8_t* src_scan,
+ int src_left,
+ int width,
+ const uint8_t* clip_scan,
+ const uint8_t* src_extra_alpha = NULL,
+ uint8_t* dst_extra_alpha = NULL);
+
+ void CompositeByteMaskLine(uint8_t* dest_scan,
+ const uint8_t* src_scan,
+ int width,
+ const uint8_t* clip_scan,
+ uint8_t* dst_extra_alpha = NULL);
+
+ void CompositeBitMaskLine(uint8_t* dest_scan,
+ const uint8_t* src_scan,
+ int src_left,
+ int width,
+ const uint8_t* clip_scan,
+ uint8_t* dst_extra_alpha = NULL);
+
+ protected:
+ int m_Transparency;
+ FXDIB_Format m_SrcFormat, m_DestFormat;
+ uint32_t* m_pSrcPalette;
+
+ int m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack;
+ int m_BlendType;
+ void* m_pIccTransform;
+ uint8_t* m_pCacheScanline;
+ int m_CacheSize;
+ FX_BOOL m_bRgbByteOrder;
+};
+
+class CFX_BitmapComposer : public IFX_ScanlineComposer {
+ public:
+ CFX_BitmapComposer();
+ ~CFX_BitmapComposer() override;
+
+ void Compose(CFX_DIBitmap* pDest,
+ const CFX_ClipRgn* pClipRgn,
+ int bitmap_alpha,
+ uint32_t mask_color,
+ FX_RECT& dest_rect,
+ FX_BOOL bVertical,
+ FX_BOOL bFlipX,
+ FX_BOOL bFlipY,
+ FX_BOOL bRgbByteOrder = FALSE,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ // IFX_ScanlineComposer
+ FX_BOOL SetInfo(int width,
+ int height,
+ FXDIB_Format src_format,
+ uint32_t* pSrcPalette) override;
+
+ void ComposeScanline(int line,
+ const uint8_t* scanline,
+ const uint8_t* scan_extra_alpha) override;
+
+ protected:
+ void DoCompose(uint8_t* dest_scan,
+ const uint8_t* src_scan,
+ int dest_width,
+ const uint8_t* clip_scan,
+ const uint8_t* src_extra_alpha = NULL,
+ uint8_t* dst_extra_alpha = NULL);
+ CFX_DIBitmap* m_pBitmap;
+ const CFX_ClipRgn* m_pClipRgn;
+ FXDIB_Format m_SrcFormat;
+ int m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;
+ uint32_t m_MaskColor;
+ const CFX_DIBitmap* m_pClipMask;
+ CFX_ScanlineCompositor m_Compositor;
+ FX_BOOL m_bVertical, m_bFlipX, m_bFlipY;
+ int m_AlphaFlag;
+ void* m_pIccTransform;
+ FX_BOOL m_bRgbByteOrder;
+ int m_BlendType;
+ void ComposeScanlineV(int line,
+ const uint8_t* scanline,
+ const uint8_t* scan_extra_alpha = NULL);
+ uint8_t* m_pScanlineV;
+ uint8_t* m_pClipScanV;
+ uint8_t* m_pAddClipScan;
+ uint8_t* m_pScanlineAlphaV;
+};
+
+class CFX_BitmapStorer : public IFX_ScanlineComposer {
+ public:
+ CFX_BitmapStorer();
+ ~CFX_BitmapStorer() override;
+
+ // IFX_ScanlineComposer
+ void ComposeScanline(int line,
+ const uint8_t* scanline,
+ const uint8_t* scan_extra_alpha) override;
+
+ FX_BOOL SetInfo(int width,
+ int height,
+ FXDIB_Format src_format,
+ uint32_t* pSrcPalette) override;
+
+ CFX_DIBitmap* GetBitmap() { return m_pBitmap; }
+
+ CFX_DIBitmap* Detach();
+
+ void Replace(CFX_DIBitmap* pBitmap);
+
+ private:
+ CFX_DIBitmap* m_pBitmap;
+};
+
+class CFX_ImageStretcher {
+ public:
+ CFX_ImageStretcher();
+ ~CFX_ImageStretcher();
+
+ FX_BOOL Start(IFX_ScanlineComposer* pDest,
+ const CFX_DIBSource* pBitmap,
+ int dest_width,
+ int dest_height,
+ const FX_RECT& bitmap_rect,
+ uint32_t flags);
+
+ FX_BOOL Continue(IFX_Pause* pPause);
+ FX_BOOL StartQuickStretch();
+ FX_BOOL StartStretch();
+ FX_BOOL ContinueQuickStretch(IFX_Pause* pPause);
+ FX_BOOL ContinueStretch(IFX_Pause* pPause);
+
+ IFX_ScanlineComposer* m_pDest;
+ const CFX_DIBSource* m_pSource;
+ CStretchEngine* m_pStretchEngine;
+ uint32_t m_Flags;
+ FX_BOOL m_bFlipX;
+ FX_BOOL m_bFlipY;
+ int m_DestWidth;
+ int m_DestHeight;
+ FX_RECT m_ClipRect;
+ int m_LineIndex;
+ int m_DestBPP;
+ uint8_t* m_pScanline;
+ uint8_t* m_pMaskScanline;
+ FXDIB_Format m_DestFormat;
+};
+class CFX_ImageTransformer {
+ public:
+ CFX_ImageTransformer();
+ ~CFX_ImageTransformer();
+
+ FX_BOOL Start(const CFX_DIBSource* pSrc,
+ const CFX_Matrix* pMatrix,
+ int flags,
+ const FX_RECT* pClip);
+
+ FX_BOOL Continue(IFX_Pause* pPause);
+
+ CFX_Matrix* m_pMatrix;
+ FX_RECT m_StretchClip;
+ int m_ResultLeft;
+ int m_ResultTop;
+ int m_ResultWidth;
+ int m_ResultHeight;
+ CFX_Matrix m_dest2stretch;
+ CFX_ImageStretcher m_Stretcher;
+ CFX_BitmapStorer m_Storer;
+ uint32_t m_Flags;
+ int m_Status;
+};
+class CFX_ImageRenderer {
+ public:
+ CFX_ImageRenderer();
+ ~CFX_ImageRenderer();
+
+ FX_BOOL Start(CFX_DIBitmap* pDevice,
+ const CFX_ClipRgn* pClipRgn,
+ const CFX_DIBSource* pSource,
+ int bitmap_alpha,
+ uint32_t mask_color,
+ const CFX_Matrix* pMatrix,
+ uint32_t dib_flags,
+ FX_BOOL bRgbByteOrder = FALSE,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL Continue(IFX_Pause* pPause);
+
+ protected:
+ CFX_DIBitmap* m_pDevice;
+ const CFX_ClipRgn* m_pClipRgn;
+ int m_BitmapAlpha;
+ uint32_t m_MaskColor;
+ CFX_Matrix m_Matrix;
+ CFX_ImageTransformer* m_pTransformer;
+ CFX_ImageStretcher m_Stretcher;
+ CFX_BitmapComposer m_Composer;
+ int m_Status;
+ FX_RECT m_ClipBox;
+ uint32_t m_Flags;
+ int m_AlphaFlag;
+ void* m_pIccTransform;
+ FX_BOOL m_bRgbByteOrder;
+ int m_BlendType;
+};
+
+#endif // CORE_FXGE_INCLUDE_FX_DIB_H_
diff --git a/core/fxge/include/fx_font.h b/core/fxge/include/fx_font.h
new file mode 100644
index 0000000000..aa59e0a5d4
--- /dev/null
+++ b/core/fxge/include/fx_font.h
@@ -0,0 +1,566 @@
+// 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_INCLUDE_FX_FONT_H_
+#define CORE_FXGE_INCLUDE_FX_FONT_H_
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "core/fxcrt/include/fx_system.h"
+#include "core/fxge/include/fx_dib.h"
+#include "core/fxge/include/fx_freetype.h"
+
+typedef struct FT_FaceRec_* FXFT_Face;
+typedef void* FXFT_Library;
+
+class CFX_FaceCache;
+class CFX_FontFaceInfo;
+class CFX_FontMapper;
+class CFX_PathData;
+class CFX_SizeGlyphCache;
+class CFX_SubstFont;
+class CTTFontDesc;
+class IFX_SystemFontInfo;
+
+#ifdef _SKIA_SUPPORT_
+class SkTypeface;
+
+using CFX_TypeFace = SkTypeface;
+#endif
+
+#define FXFONT_FIXED_PITCH 0x01
+#define FXFONT_SERIF 0x02
+#define FXFONT_SYMBOLIC 0x04
+#define FXFONT_SCRIPT 0x08
+#define FXFONT_ITALIC 0x40
+#define FXFONT_BOLD 0x40000
+#define FXFONT_USEEXTERNATTR 0x80000
+#define FXFONT_CIDFONT 0x100000
+#ifdef PDF_ENABLE_XFA
+#define FXFONT_EXACTMATCH 0x80000000
+#endif // PDF_ENABLE_XFA
+#define FXFONT_ANSI_CHARSET 0
+#define FXFONT_DEFAULT_CHARSET 1
+#define FXFONT_SYMBOL_CHARSET 2
+#define FXFONT_SHIFTJIS_CHARSET 128
+#define FXFONT_HANGEUL_CHARSET 129
+#define FXFONT_GB2312_CHARSET 134
+#define FXFONT_CHINESEBIG5_CHARSET 136
+#define FXFONT_THAI_CHARSET 222
+#define FXFONT_EASTEUROPE_CHARSET 238
+#define FXFONT_RUSSIAN_CHARSET 204
+#define FXFONT_GREEK_CHARSET 161
+#define FXFONT_TURKISH_CHARSET 162
+#define FXFONT_HEBREW_CHARSET 177
+#define FXFONT_ARABIC_CHARSET 178
+#define FXFONT_BALTIC_CHARSET 186
+#define FXFONT_FF_FIXEDPITCH 1
+#define FXFONT_FF_ROMAN (1 << 4)
+#define FXFONT_FF_SCRIPT (4 << 4)
+#define FXFONT_FW_NORMAL 400
+#define FXFONT_FW_BOLD 700
+
+class CFX_Font {
+ public:
+ CFX_Font();
+ ~CFX_Font();
+
+ void LoadSubst(const CFX_ByteString& face_name,
+ FX_BOOL bTrueType,
+ uint32_t flags,
+ int weight,
+ int italic_angle,
+ int CharsetCP,
+ FX_BOOL bVertical = FALSE);
+ FX_BOOL LoadEmbedded(const uint8_t* data, uint32_t size);
+ FXFT_Face GetFace() const { return m_Face; }
+
+#ifdef PDF_ENABLE_XFA
+ FX_BOOL LoadFile(IFX_FileRead* pFile,
+ int nFaceIndex = 0,
+ int* pFaceCount = NULL);
+
+ FX_BOOL LoadClone(const CFX_Font* pFont);
+ CFX_SubstFont* GetSubstFont() const { return m_pSubstFont; }
+ void SetFace(FXFT_Face face) { m_Face = face; }
+ void SetSubstFont(CFX_SubstFont* subst) { m_pSubstFont = subst; }
+#else // PDF_ENABLE_XFA
+ const CFX_SubstFont* GetSubstFont() const { return m_pSubstFont; }
+#endif // PDF_ENABLE_XFA
+
+ CFX_PathData* LoadGlyphPath(uint32_t glyph_index, int dest_width = 0);
+ int GetGlyphWidth(uint32_t glyph_index);
+ int GetAscent() const;
+ int GetDescent() const;
+ FX_BOOL GetGlyphBBox(uint32_t glyph_index, FX_RECT& bbox);
+ FX_BOOL IsItalic() const;
+ FX_BOOL IsBold() const;
+ FX_BOOL IsFixedWidth() const;
+ FX_BOOL IsVertical() const { return m_bVertical; }
+ CFX_WideString GetPsName() const;
+ CFX_ByteString GetFamilyName() const;
+ CFX_ByteString GetFaceName() const;
+ FX_BOOL IsTTFont() const;
+ FX_BOOL GetBBox(FX_RECT& bbox);
+ int GetHeight() const;
+ int GetULPos() const;
+ int GetULthickness() const;
+ int GetMaxAdvanceWidth() const;
+ FX_BOOL IsEmbedded() const { return m_bEmbedded; }
+ uint8_t* GetSubData() const { return m_pGsubData; }
+ void SetSubData(uint8_t* data) { m_pGsubData = data; }
+ void* GetPlatformFont() const { return m_pPlatformFont; }
+ void SetPlatformFont(void* font) { m_pPlatformFont = font; }
+ uint8_t* GetFontData() const { return m_pFontData; }
+ uint32_t GetSize() const { return m_dwSize; }
+ void AdjustMMParams(int glyph_index, int width, int weight);
+
+ private:
+ void ReleasePlatformResource();
+ void DeleteFace();
+
+ FXFT_Face m_Face;
+ CFX_SubstFont* m_pSubstFont;
+ uint8_t* m_pFontDataAllocation;
+ uint8_t* m_pFontData;
+ uint8_t* m_pGsubData;
+ uint32_t m_dwSize;
+ CFX_BinaryBuf m_OtfFontData;
+ void* m_hHandle;
+ void* m_pPlatformFont;
+ void* m_pPlatformFontCollection;
+ void* m_pDwFont;
+ FX_BOOL m_bDwLoaded;
+ FX_BOOL m_bEmbedded;
+ FX_BOOL m_bVertical;
+
+#ifdef PDF_ENABLE_XFA
+
+ protected:
+ FX_BOOL m_bLogic;
+ void* m_pOwnedStream;
+
+#endif // PDF_ENABLE_XFA
+};
+
+#define ENCODING_INTERNAL 0
+#define ENCODING_UNICODE 1
+
+#ifdef PDF_ENABLE_XFA
+#define FXFM_ENC_TAG(a, b, c, d) \
+ (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | \
+ (uint32_t)(d))
+#define FXFM_ENCODING_NONE FXFM_ENC_TAG(0, 0, 0, 0)
+#define FXFM_ENCODING_MS_SYMBOL FXFM_ENC_TAG('s', 'y', 'm', 'b')
+#define FXFM_ENCODING_UNICODE FXFM_ENC_TAG('u', 'n', 'i', 'c')
+#define FXFM_ENCODING_MS_SJIS FXFM_ENC_TAG('s', 'j', 'i', 's')
+#define FXFM_ENCODING_MS_GB2312 FXFM_ENC_TAG('g', 'b', ' ', ' ')
+#define FXFM_ENCODING_MS_BIG5 FXFM_ENC_TAG('b', 'i', 'g', '5')
+#define FXFM_ENCODING_MS_WANSUNG FXFM_ENC_TAG('w', 'a', 'n', 's')
+#define FXFM_ENCODING_MS_JOHAB FXFM_ENC_TAG('j', 'o', 'h', 'a')
+#define FXFM_ENCODING_ADOBE_STANDARD FXFM_ENC_TAG('A', 'D', 'O', 'B')
+#define FXFM_ENCODING_ADOBE_EXPERT FXFM_ENC_TAG('A', 'D', 'B', 'E')
+#define FXFM_ENCODING_ADOBE_CUSTOM FXFM_ENC_TAG('A', 'D', 'B', 'C')
+#define FXFM_ENCODING_ADOBE_LATIN_1 FXFM_ENC_TAG('l', 'a', 't', '1')
+#define FXFM_ENCODING_OLD_LATIN_2 FXFM_ENC_TAG('l', 'a', 't', '2')
+#define FXFM_ENCODING_APPLE_ROMAN FXFM_ENC_TAG('a', 'r', 'm', 'n')
+#endif // PDF_ENABLE_XFA
+
+class CFX_UnicodeEncoding {
+ public:
+ explicit CFX_UnicodeEncoding(CFX_Font* pFont);
+ virtual ~CFX_UnicodeEncoding();
+
+ virtual uint32_t GlyphFromCharCode(uint32_t charcode);
+
+ protected:
+ // Unowned, not nullptr.
+ CFX_Font* m_pFont;
+};
+
+#ifdef PDF_ENABLE_XFA
+class CFX_UnicodeEncodingEx : public CFX_UnicodeEncoding {
+ public:
+ CFX_UnicodeEncodingEx(CFX_Font* pFont, uint32_t EncodingID);
+ ~CFX_UnicodeEncodingEx() override;
+
+ // CFX_UnicodeEncoding:
+ uint32_t GlyphFromCharCode(uint32_t charcode) override;
+
+ uint32_t CharCodeFromUnicode(FX_WCHAR Unicode) const;
+
+ private:
+ uint32_t m_nEncodingID;
+};
+CFX_UnicodeEncodingEx* FX_CreateFontEncodingEx(
+ CFX_Font* pFont,
+ uint32_t nEncodingID = FXFM_ENCODING_NONE);
+#endif // PDF_ENABLE_XFA
+
+#define FXFONT_SUBST_MM 0x01
+#define FXFONT_SUBST_GLYPHPATH 0x04
+#define FXFONT_SUBST_CLEARTYPE 0x08
+#define FXFONT_SUBST_TRANSFORM 0x10
+#define FXFONT_SUBST_NONSYMBOL 0x20
+#define FXFONT_SUBST_EXACT 0x40
+#define FXFONT_SUBST_STANDARD 0x80
+
+class CFX_SubstFont {
+ public:
+ CFX_SubstFont();
+
+ void* m_ExtHandle;
+
+ CFX_ByteString m_Family;
+
+ int m_Charset;
+
+ uint32_t m_SubstFlags;
+
+ int m_Weight;
+
+ int m_ItalicAngle;
+
+ FX_BOOL m_bSubstOfCJK;
+
+ int m_WeightCJK;
+
+ FX_BOOL m_bItlicCJK;
+};
+#define FX_FONT_FLAG_SERIF 0x01
+#define FX_FONT_FLAG_FIXEDPITCH 0x02
+#define FX_FONT_FLAG_ITALIC 0x04
+#define FX_FONT_FLAG_BOLD 0x08
+#define FX_FONT_FLAG_SYMBOLIC_SYMBOL 0x10
+#define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20
+#define FX_FONT_FLAG_MULTIPLEMASTER 0x40
+
+class CFX_FontMgr {
+ public:
+ CFX_FontMgr();
+ ~CFX_FontMgr();
+
+ void InitFTLibrary();
+
+ FXFT_Face GetCachedFace(const CFX_ByteString& face_name,
+ int weight,
+ FX_BOOL bItalic,
+ uint8_t*& pFontData);
+ FXFT_Face AddCachedFace(const CFX_ByteString& face_name,
+ int weight,
+ FX_BOOL bItalic,
+ uint8_t* pData,
+ uint32_t size,
+ int face_index);
+ FXFT_Face GetCachedTTCFace(int ttc_size,
+ uint32_t checksum,
+ int font_offset,
+ uint8_t*& pFontData);
+ FXFT_Face AddCachedTTCFace(int ttc_size,
+ uint32_t checksum,
+ uint8_t* pData,
+ uint32_t size,
+ int font_offset);
+ FXFT_Face GetFileFace(const FX_CHAR* filename, int face_index);
+ FXFT_Face GetFixedFace(const uint8_t* pData, uint32_t size, int face_index);
+ void ReleaseFace(FXFT_Face face);
+ void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+ FXFT_Face FindSubstFont(const CFX_ByteString& face_name,
+ FX_BOOL bTrueType,
+ uint32_t flags,
+ int weight,
+ int italic_angle,
+ int CharsetCP,
+ CFX_SubstFont* pSubstFont);
+ bool GetBuiltinFont(size_t index, const uint8_t** pFontData, uint32_t* size);
+ CFX_FontMapper* GetBuiltinMapper() const { return m_pBuiltinMapper.get(); }
+ FXFT_Library GetFTLibrary() const { return m_FTLibrary; }
+
+ private:
+ std::unique_ptr<CFX_FontMapper> m_pBuiltinMapper;
+ std::map<CFX_ByteString, CTTFontDesc*> m_FaceMap;
+ FXFT_Library m_FTLibrary;
+};
+
+class IFX_FontEnumerator {
+ public:
+ virtual void HitFont() = 0;
+
+ virtual void Finish() = 0;
+
+ protected:
+ virtual ~IFX_FontEnumerator() {}
+};
+
+class IFX_AdditionalFontEnum {
+ public:
+ virtual int CountFiles() = 0;
+ virtual IFX_FileStream* GetFontFile(int index) = 0;
+
+ protected:
+ virtual ~IFX_AdditionalFontEnum() {}
+};
+
+class CFX_FontMapper {
+ public:
+ explicit CFX_FontMapper(CFX_FontMgr* mgr);
+ ~CFX_FontMapper();
+
+ void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+ IFX_SystemFontInfo* GetSystemFontInfo() { return m_pFontInfo; }
+ void AddInstalledFont(const CFX_ByteString& name, int charset);
+ void LoadInstalledFonts();
+ std::vector<CFX_ByteString> m_InstalledTTFonts;
+ void SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator) {
+ m_pFontEnumerator = pFontEnumerator;
+ }
+ IFX_FontEnumerator* GetFontEnumerator() const { return m_pFontEnumerator; }
+ FXFT_Face FindSubstFont(const CFX_ByteString& face_name,
+ FX_BOOL bTrueType,
+ uint32_t flags,
+ int weight,
+ int italic_angle,
+ int CharsetCP,
+ CFX_SubstFont* pSubstFont);
+#ifdef PDF_ENABLE_XFA
+ FXFT_Face FindSubstFontByUnicode(uint32_t dwUnicode,
+ uint32_t flags,
+ int weight,
+ int italic_angle);
+#endif // PDF_ENABLE_XFA
+ FX_BOOL IsBuiltinFace(const FXFT_Face face) const;
+ int GetFaceSize() const;
+ CFX_ByteString GetFaceName(int index) const { return m_FaceArray[index]; }
+
+ private:
+ static const size_t MM_FACE_COUNT = 2;
+ static const size_t FOXIT_FACE_COUNT = 14;
+
+ CFX_ByteString GetPSNameFromTT(void* hFont);
+ CFX_ByteString MatchInstalledFonts(const CFX_ByteString& norm_name);
+ FXFT_Face UseInternalSubst(CFX_SubstFont* pSubstFont,
+ int iBaseFont,
+ int italic_angle,
+ int weight,
+ int picthfamily);
+
+ FX_BOOL m_bListLoaded;
+ FXFT_Face m_MMFaces[MM_FACE_COUNT];
+ CFX_ByteString m_LastFamily;
+ CFX_ArrayTemplate<uint32_t> m_CharsetArray;
+ std::vector<CFX_ByteString> m_FaceArray;
+ IFX_SystemFontInfo* m_pFontInfo;
+ FXFT_Face m_FoxitFaces[FOXIT_FACE_COUNT];
+ IFX_FontEnumerator* m_pFontEnumerator;
+ CFX_FontMgr* const m_pFontMgr;
+};
+
+class IFX_SystemFontInfo {
+ public:
+ static IFX_SystemFontInfo* CreateDefault(const char** pUserPaths);
+ virtual void Release() = 0;
+
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) = 0;
+ virtual void* MapFont(int weight,
+ FX_BOOL bItalic,
+ int charset,
+ int pitch_family,
+ const FX_CHAR* face,
+ int& iExact) = 0;
+
+#ifdef PDF_ENABLE_XFA
+ virtual void* MapFontByUnicode(uint32_t dwUnicode,
+ int weight,
+ FX_BOOL bItalic,
+ int pitch_family);
+#endif // PDF_ENABLE_XFA
+
+ virtual void* GetFont(const FX_CHAR* face) = 0;
+ virtual uint32_t GetFontData(void* hFont,
+ uint32_t table,
+ uint8_t* buffer,
+ uint32_t size) = 0;
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) = 0;
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset) = 0;
+ virtual int GetFaceIndex(void* hFont);
+ virtual void DeleteFont(void* hFont) = 0;
+ virtual void* RetainFont(void* hFont);
+
+ protected:
+ virtual ~IFX_SystemFontInfo() {}
+};
+
+class CFX_FolderFontInfo : public IFX_SystemFontInfo {
+ public:
+ CFX_FolderFontInfo();
+ ~CFX_FolderFontInfo() override;
+ void AddPath(const CFX_ByteStringC& path);
+
+ // IFX_SytemFontInfo:
+ void Release() override;
+ FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override;
+ void* MapFont(int weight,
+ FX_BOOL bItalic,
+ int charset,
+ int pitch_family,
+ const FX_CHAR* face,
+ int& bExact) override;
+#ifdef PDF_ENABLE_XFA
+ void* MapFontByUnicode(uint32_t dwUnicode,
+ int weight,
+ FX_BOOL bItalic,
+ int pitch_family) override;
+#endif // PDF_ENABLE_XFA
+ void* GetFont(const FX_CHAR* face) override;
+ uint32_t GetFontData(void* hFont,
+ uint32_t table,
+ uint8_t* buffer,
+ uint32_t size) override;
+ void DeleteFont(void* hFont) override;
+ FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override;
+ FX_BOOL GetFontCharset(void* hFont, int& charset) override;
+
+ protected:
+ void ScanPath(const CFX_ByteString& path);
+ void ScanFile(const CFX_ByteString& path);
+ void ReportFace(const CFX_ByteString& path,
+ FXSYS_FILE* pFile,
+ uint32_t filesize,
+ uint32_t offset);
+ void* GetSubstFont(const CFX_ByteString& face);
+ void* FindFont(int weight,
+ FX_BOOL bItalic,
+ int charset,
+ int pitch_family,
+ const FX_CHAR* family,
+ FX_BOOL bMatchName);
+
+ std::map<CFX_ByteString, CFX_FontFaceInfo*> m_FontList;
+ std::vector<CFX_ByteString> m_PathList;
+ CFX_FontMapper* m_pMapper;
+};
+
+class CFX_CountedFaceCache {
+ public:
+ CFX_FaceCache* m_Obj;
+ uint32_t m_nCount;
+};
+
+class CFX_FontCache {
+ public:
+ CFX_FontCache();
+ ~CFX_FontCache();
+ CFX_FaceCache* GetCachedFace(CFX_Font* pFont);
+ void ReleaseCachedFace(CFX_Font* pFont);
+ void FreeCache(FX_BOOL bRelease = FALSE);
+#ifdef _SKIA_SUPPORT_
+ CFX_TypeFace* GetDeviceCache(CFX_Font* pFont);
+#endif
+
+ private:
+ using CFX_FTCacheMap = std::map<FXFT_Face, CFX_CountedFaceCache*>;
+ CFX_FTCacheMap m_FTFaceMap;
+ CFX_FTCacheMap m_ExtFaceMap;
+};
+
+class CFX_AutoFontCache {
+ public:
+ CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)
+ : m_pFontCache(pFontCache), m_pFont(pFont) {}
+ ~CFX_AutoFontCache() { m_pFontCache->ReleaseCachedFace(m_pFont); }
+ CFX_FontCache* m_pFontCache;
+ CFX_Font* m_pFont;
+};
+#define FX_FONTCACHE_DEFINE(pFontCache, pFont) \
+ CFX_AutoFontCache autoFontCache((pFontCache), (pFont))
+class CFX_GlyphBitmap {
+ public:
+ int m_Top;
+ int m_Left;
+ CFX_DIBitmap m_Bitmap;
+};
+class CFX_FaceCache {
+ public:
+ explicit CFX_FaceCache(FXFT_Face face);
+ ~CFX_FaceCache();
+ const CFX_GlyphBitmap* LoadGlyphBitmap(CFX_Font* pFont,
+ uint32_t glyph_index,
+ FX_BOOL bFontStyle,
+ const CFX_Matrix* pMatrix,
+ int dest_width,
+ int anti_alias,
+ int& text_flags);
+ const CFX_PathData* LoadGlyphPath(CFX_Font* pFont,
+ uint32_t glyph_index,
+ int dest_width);
+
+#ifdef _SKIA_SUPPORT_
+ CFX_TypeFace* GetDeviceCache(CFX_Font* pFont);
+#endif
+
+ private:
+ CFX_GlyphBitmap* RenderGlyph(CFX_Font* pFont,
+ uint32_t glyph_index,
+ FX_BOOL bFontStyle,
+ const CFX_Matrix* pMatrix,
+ int dest_width,
+ int anti_alias);
+ CFX_GlyphBitmap* RenderGlyph_Nativetext(CFX_Font* pFont,
+ uint32_t glyph_index,
+ const CFX_Matrix* pMatrix,
+ int dest_width,
+ int anti_alias);
+ CFX_GlyphBitmap* LookUpGlyphBitmap(CFX_Font* pFont,
+ const CFX_Matrix* pMatrix,
+ CFX_ByteStringC& FaceGlyphsKey,
+ uint32_t glyph_index,
+ FX_BOOL bFontStyle,
+ int dest_width,
+ int anti_alias);
+ void InitPlatform();
+ void DestroyPlatform();
+
+ FXFT_Face const m_Face;
+ std::map<CFX_ByteString, CFX_SizeGlyphCache*> m_SizeMap;
+ std::map<uint32_t, CFX_PathData*> m_PathMap;
+ CFX_DIBitmap* m_pBitmap;
+#ifdef _SKIA_SUPPORT_
+ CFX_TypeFace* m_pTypeface;
+#endif
+};
+
+struct FXTEXT_GLYPHPOS {
+ const CFX_GlyphBitmap* m_pGlyph;
+ int m_OriginX;
+ int m_OriginY;
+ FX_FLOAT m_fOriginX;
+ FX_FLOAT m_fOriginY;
+};
+
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos,
+ int nChars,
+ int anti_alias,
+ FX_FLOAT retinaScaleX = 1.0f,
+ FX_FLOAT retinaScaleY = 1.0f);
+
+class IFX_GSUBTable {
+ public:
+ static IFX_GSUBTable* Create(CFX_Font* pFont);
+ virtual FX_BOOL GetVerticalGlyph(uint32_t glyphnum, uint32_t* vglyphnum) = 0;
+
+ protected:
+ virtual ~IFX_GSUBTable() {}
+};
+
+CFX_ByteString GetNameFromTT(const uint8_t* name_table,
+ uint32_t name_table_size,
+ uint32_t name);
+
+int PDF_GetStandardFontName(CFX_ByteString* name);
+
+#endif // CORE_FXGE_INCLUDE_FX_FONT_H_
diff --git a/core/fxge/include/fx_freetype.h b/core/fxge/include/fx_freetype.h
new file mode 100644
index 0000000000..533974dc2e
--- /dev/null
+++ b/core/fxge/include/fx_freetype.h
@@ -0,0 +1,180 @@
+// 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_INCLUDE_FX_FREETYPE_H_
+#define CORE_FXGE_INCLUDE_FX_FREETYPE_H_
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+#include FT_LCD_FILTER_H
+#include FT_MULTIPLE_MASTERS_H
+#include FT_OUTLINE_H
+#include FT_TRUETYPE_TABLES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FXFT_ENCODING_UNICODE FT_ENCODING_UNICODE
+#define FXFT_ENCODING_ADOBE_STANDARD FT_ENCODING_ADOBE_STANDARD
+#define FXFT_ENCODING_ADOBE_EXPERT FT_ENCODING_ADOBE_EXPERT
+#define FXFT_ENCODING_ADOBE_LATIN_1 FT_ENCODING_ADOBE_LATIN_1
+#define FXFT_ENCODING_APPLE_ROMAN FT_ENCODING_APPLE_ROMAN
+#define FXFT_ENCODING_ADOBE_CUSTOM FT_ENCODING_ADOBE_CUSTOM
+#define FXFT_ENCODING_MS_SYMBOL FT_ENCODING_MS_SYMBOL
+#define FXFT_ENCODING_GB2312 FT_ENCODING_GB2312
+#define FXFT_ENCODING_BIG5 FT_ENCODING_BIG5
+#define FXFT_ENCODING_SJIS FT_ENCODING_SJIS
+#define FXFT_ENCODING_JOHAB FT_ENCODING_JOHAB
+#define FXFT_ENCODING_WANSUNG FT_ENCODING_WANSUNG
+#define FXFT_LOAD_NO_SCALE FT_LOAD_NO_SCALE
+#define FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH \
+ FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
+#define FXFT_RENDER_MODE_LCD FT_RENDER_MODE_LCD
+#define FXFT_RENDER_MODE_MONO FT_RENDER_MODE_MONO
+#define FXFT_RENDER_MODE_NORMAL FT_RENDER_MODE_NORMAL
+#define FXFT_LOAD_IGNORE_TRANSFORM FT_LOAD_IGNORE_TRANSFORM
+#define FXFT_LOAD_NO_BITMAP FT_LOAD_NO_BITMAP
+#define FXFT_LOAD_NO_HINTING FT_LOAD_NO_HINTING
+#define FXFT_PIXEL_MODE_MONO FT_PIXEL_MODE_MONO
+#define FXFT_STYLE_FLAG_ITALIC FT_STYLE_FLAG_ITALIC
+#define FXFT_STYLE_FLAG_BOLD FT_STYLE_FLAG_BOLD
+#define FXFT_FACE_FLAG_SFNT FT_FACE_FLAG_SFNT
+#define FXFT_FACE_FLAG_TRICKY (1L << 13)
+typedef FT_MM_Var* FXFT_MM_Var;
+typedef FT_Bitmap* FXFT_Bitmap;
+#define FXFT_Matrix FT_Matrix
+#define FXFT_Vector FT_Vector
+#define FXFT_Outline_Funcs FT_Outline_Funcs
+typedef FT_Open_Args FXFT_Open_Args;
+typedef FT_StreamRec FXFT_StreamRec;
+typedef FT_StreamRec* FXFT_Stream;
+typedef FT_BBox FXFT_BBox;
+typedef FT_Glyph FXFT_Glyph;
+typedef FT_CharMap FXFT_CharMap;
+#define FXFT_GLYPH_BBOX_PIXELS FT_GLYPH_BBOX_PIXELS
+#define FXFT_Open_Face(library, args, index, face) \
+ FT_Open_Face((FT_Library)(library), args, index, (FT_Face*)(face))
+#define FXFT_Done_Face(face) FT_Done_Face((FT_Face)(face))
+#define FXFT_Done_FreeType(library) FT_Done_FreeType((FT_Library)(library))
+#define FXFT_Init_FreeType(library) FT_Init_FreeType((FT_Library*)(library))
+#define FXFT_New_Memory_Face(library, base, size, index, face) \
+ FT_New_Memory_Face((FT_Library)(library), base, size, index, (FT_Face*)(face))
+#define FXFT_New_Face(library, filename, index, face) \
+ FT_New_Face((FT_Library)(library), filename, index, (FT_Face*)(face))
+#define FXFT_Get_Face_FreeType(face) ((FT_Face)face)->driver->root.library
+#define FXFT_Select_Charmap(face, encoding) \
+ FT_Select_Charmap((FT_Face)face, (FT_Encoding)encoding)
+#define FXFT_Set_Charmap(face, charmap) \
+ FT_Set_Charmap((FT_Face)face, (FT_CharMap)charmap)
+#define FXFT_Load_Glyph(face, glyph_index, flags) \
+ FT_Load_Glyph((FT_Face)face, glyph_index, flags)
+#define FXFT_Get_Char_Index(face, code) FT_Get_Char_Index((FT_Face)face, code)
+#define FXFT_Get_Glyph_Name(face, index, buffer, size) \
+ FT_Get_Glyph_Name((FT_Face)face, index, buffer, size)
+#define FXFT_Get_Name_Index(face, name) FT_Get_Name_Index((FT_Face)face, name)
+#define FXFT_Has_Glyph_Names(face) \
+ (((FT_Face)face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES)
+#define FXFT_Get_Postscript_Name(face) FT_Get_Postscript_Name((FT_Face)face)
+#define FXFT_Load_Sfnt_Table(face, tag, offset, buffer, length) \
+ FT_Load_Sfnt_Table((FT_Face)face, tag, offset, buffer, length)
+#define FXFT_Get_First_Char(face, glyph_index) \
+ FT_Get_First_Char((FT_Face)face, glyph_index)
+#define FXFT_Get_Next_Char(face, code, glyph_index) \
+ FT_Get_Next_Char((FT_Face)face, code, glyph_index)
+#define FXFT_Clear_Face_External_Stream(face) \
+ (((FT_Face)face)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM)
+#define FXFT_Get_Face_External_Stream(face) \
+ (((FT_Face)face)->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM)
+#define FXFT_Is_Face_TT_OT(face) \
+ (((FT_Face)face)->face_flags & FT_FACE_FLAG_SFNT)
+#define FXFT_Is_Face_Tricky(face) \
+ (((FT_Face)face)->face_flags & FXFT_FACE_FLAG_TRICKY)
+#define FXFT_Is_Face_fixedwidth(face) \
+ (((FT_Face)face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH)
+#define FXFT_Get_Face_Stream_Base(face) ((FT_Face)face)->stream->base
+#define FXFT_Get_Face_Stream_Size(face) ((FT_Face)face)->stream->size
+#define FXFT_Get_Face_Family_Name(face) ((FT_Face)face)->family_name
+#define FXFT_Get_Face_Style_Name(face) ((FT_Face)face)->style_name
+#define FXFT_Get_Face_Numfaces(face) ((FT_Face)face)->num_faces
+#define FXFT_Get_Face_Faceindex(face) ((FT_Face)face)->face_index
+#define FXFT_Is_Face_Italic(face) \
+ (((FT_Face)face)->style_flags & FT_STYLE_FLAG_ITALIC)
+#define FXFT_Is_Face_Bold(face) \
+ (((FT_Face)face)->style_flags & FT_STYLE_FLAG_BOLD)
+#define FXFT_Get_Face_Charmaps(face) ((FT_Face)face)->charmaps
+#define FXFT_Get_Glyph_HoriBearingX(face) \
+ ((FT_Face)face)->glyph->metrics.horiBearingX
+#define FXFT_Get_Glyph_HoriBearingY(face) \
+ ((FT_Face)face)->glyph->metrics.horiBearingY
+#define FXFT_Get_Glyph_Width(face) ((FT_Face)face)->glyph->metrics.width
+#define FXFT_Get_Glyph_Height(face) ((FT_Face)face)->glyph->metrics.height
+#define FXFT_Get_Face_CharmapCount(face) ((FT_Face)face)->num_charmaps
+#define FXFT_Get_Charmap_Encoding(charmap) ((FT_CharMap)charmap)->encoding
+#define FXFT_Get_Face_Charmap(face) ((FT_Face)face)->charmap
+#define FXFT_Get_Charmap_PlatformID(charmap) ((FT_CharMap)charmap)->platform_id
+#define FXFT_Get_Charmap_EncodingID(charmap) ((FT_CharMap)charmap)->encoding_id
+#define FXFT_Get_Face_UnitsPerEM(face) ((FT_Face)face)->units_per_EM
+#define FXFT_Get_Face_xMin(face) ((FT_Face)face)->bbox.xMin
+#define FXFT_Get_Face_xMax(face) ((FT_Face)face)->bbox.xMax
+#define FXFT_Get_Face_yMin(face) ((FT_Face)face)->bbox.yMin
+#define FXFT_Get_Face_yMax(face) ((FT_Face)face)->bbox.yMax
+#define FXFT_Get_Face_Height(face) ((FT_Face)face)->height
+#define FXFT_Get_Face_UnderLineThickness(face) \
+ ((FT_Face)face)->underline_thickness
+#define FXFT_Get_Face_UnderLinePosition(face) \
+ ((FT_Face)face)->underline_position
+#define FXFT_Get_Face_MaxAdvanceWidth(face) ((FT_Face)face)->max_advance_width
+#define FXFT_Get_Face_Ascender(face) ((FT_Face)face)->ascender
+#define FXFT_Get_Face_Descender(face) ((FT_Face)face)->descender
+#define FXFT_Get_Glyph_HoriAdvance(face) \
+ ((FT_Face)face)->glyph->metrics.horiAdvance
+#define FXFT_Get_MM_Axis(var, index) &static_cast<FT_MM_Var*>(var)->axis[index]
+#define FXFT_Get_MM_Axis_Min(axis) ((FT_Var_Axis*)axis)->minimum
+#define FXFT_Get_MM_Axis_Max(axis) ((FT_Var_Axis*)axis)->maximum
+#define FXFT_Get_MM_Axis_Def(axis) ((FT_Var_Axis*)axis)->def
+#define FXFT_Alloc(library, size) \
+ ((FT_Library)library)->memory->alloc(((FT_Library)library)->memory, size)
+#define FXFT_Free(face, p) \
+ ((FT_Face)face)->memory->free(((FT_Face)face)->memory, p)
+#define FXFT_Get_Glyph_Outline(face) &static_cast<FT_Face>(face)->glyph->outline
+#define FXFT_Get_Outline_Bbox(outline, cbox) FT_Outline_Get_CBox(outline, cbox)
+#define FXFT_Render_Glyph(face, mode) \
+ FT_Render_Glyph(((FT_Face)face)->glyph, (enum FT_Render_Mode_)mode)
+#define FXFT_Get_MM_Var(face, p) FT_Get_MM_Var((FT_Face)face, p)
+#define FXFT_Set_MM_Design_Coordinates(face, n, p) \
+ FT_Set_MM_Design_Coordinates((FT_Face)face, n, p)
+#define FXFT_Set_Pixel_Sizes(face, w, h) FT_Set_Pixel_Sizes((FT_Face)face, w, h)
+#define FXFT_Set_Transform(face, m, d) FT_Set_Transform((FT_Face)face, m, d)
+#define FXFT_Outline_Embolden(outline, s) FT_Outline_Embolden(outline, s)
+#define FXFT_Get_Glyph_Bitmap(face) &static_cast<FT_Face>(face)->glyph->bitmap
+#define FXFT_Get_Bitmap_Width(bitmap) ((FT_Bitmap*)bitmap)->width
+#define FXFT_Get_Bitmap_Rows(bitmap) ((FT_Bitmap*)bitmap)->rows
+#define FXFT_Get_Bitmap_PixelMode(bitmap) ((FT_Bitmap*)bitmap)->pixel_mode
+#define FXFT_Get_Bitmap_Pitch(bitmap) ((FT_Bitmap*)bitmap)->pitch
+#define FXFT_Get_Bitmap_Buffer(bitmap) ((FT_Bitmap*)bitmap)->buffer
+#define FXFT_Get_Glyph_BitmapLeft(face) ((FT_Face)face)->glyph->bitmap_left
+#define FXFT_Get_Glyph_BitmapTop(face) ((FT_Face)face)->glyph->bitmap_top
+#define FXFT_Outline_Decompose(outline, funcs, params) \
+ FT_Outline_Decompose(outline, funcs, params)
+#define FXFT_Set_Char_Size(face, char_width, char_height, horz_resolution, \
+ vert_resolution) \
+ FT_Set_Char_Size(face, char_width, char_height, horz_resolution, \
+ vert_resolution)
+#define FXFT_Get_Glyph(slot, aglyph) FT_Get_Glyph(slot, aglyph)
+#define FXFT_Glyph_Get_CBox(glyph, bbox_mode, acbox) \
+ FT_Glyph_Get_CBox(glyph, bbox_mode, acbox)
+#define FXFT_Done_Glyph(glyph) FT_Done_Glyph(glyph)
+#define FXFT_Library_SetLcdFilter(library, filter) \
+ FT_Library_SetLcdFilter((FT_Library)(library), filter)
+int FXFT_unicode_from_adobe_name(const char* glyph_name);
+void FXFT_adobe_name_from_unicode(char* name, wchar_t unicode);
+#ifdef __cplusplus
+};
+#endif
+
+#endif // CORE_FXGE_INCLUDE_FX_FREETYPE_H_
diff --git a/core/fxge/include/fx_ge.h b/core/fxge/include/fx_ge.h
new file mode 100644
index 0000000000..4530677119
--- /dev/null
+++ b/core/fxge/include/fx_ge.h
@@ -0,0 +1,733 @@
+// 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_INCLUDE_FX_GE_H_
+#define CORE_FXGE_INCLUDE_FX_GE_H_
+
+#include "core/fxge/include/fx_dib.h"
+#include "core/fxge/include/fx_font.h"
+
+class CFX_Font;
+class CFX_FontMgr;
+class CFX_FontCache;
+class CFX_FaceCache;
+class CPDF_ShadingPattern;
+class IFX_RenderDeviceDriver;
+class CCodec_ModuleMgr;
+class SkPictureRecorder;
+
+class CFX_GEModule {
+ public:
+ static void Create(const char** pUserFontPaths);
+
+ static void Use(CFX_GEModule* pMgr);
+
+ static CFX_GEModule* Get();
+
+ static void Destroy();
+
+ public:
+ CFX_FontCache* GetFontCache();
+ CFX_FontMgr* GetFontMgr() { return m_pFontMgr; }
+ void SetTextGamma(FX_FLOAT gammaValue);
+ const uint8_t* GetTextGammaTable();
+
+ void SetCodecModule(CCodec_ModuleMgr* pCodecModule) {
+ m_pCodecModule = pCodecModule;
+ }
+ CCodec_ModuleMgr* GetCodecModule() { return m_pCodecModule; }
+ FXFT_Library m_FTLibrary;
+ void* GetPlatformData() { return m_pPlatformData; }
+
+ protected:
+ explicit CFX_GEModule(const char** pUserFontPaths);
+
+ ~CFX_GEModule();
+ void InitPlatform();
+ void DestroyPlatform();
+
+ private:
+ uint8_t m_GammaValue[256];
+ CFX_FontCache* m_pFontCache;
+ CFX_FontMgr* m_pFontMgr;
+ CCodec_ModuleMgr* m_pCodecModule;
+ void* m_pPlatformData;
+ const char** m_pUserFontPaths;
+};
+typedef struct {
+ FX_FLOAT m_PointX;
+
+ FX_FLOAT m_PointY;
+
+ int m_Flag;
+} FX_PATHPOINT;
+#define FXPT_CLOSEFIGURE 0x01
+#define FXPT_LINETO 0x02
+#define FXPT_BEZIERTO 0x04
+#define FXPT_MOVETO 0x06
+#define FXPT_TYPE 0x06
+#define FXFILL_ALTERNATE 1
+#define FXFILL_WINDING 2
+class CFX_ClipRgn {
+ public:
+ CFX_ClipRgn(int device_width, int device_height);
+
+ CFX_ClipRgn(const FX_RECT& rect);
+
+ CFX_ClipRgn(const CFX_ClipRgn& src);
+
+ ~CFX_ClipRgn();
+
+ typedef enum { RectI, MaskF } ClipType;
+
+ void Reset(const FX_RECT& rect);
+
+ ClipType GetType() const { return m_Type; }
+
+ const FX_RECT& GetBox() const { return m_Box; }
+
+ CFX_DIBitmapRef GetMask() const { return m_Mask; }
+
+ void IntersectRect(const FX_RECT& rect);
+
+ void IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);
+
+ protected:
+ ClipType m_Type;
+
+ FX_RECT m_Box;
+
+ CFX_DIBitmapRef m_Mask;
+
+ void IntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask);
+};
+#define FX_GAMMA(value) (value)
+#define FX_GAMMA_INVERSE(value) (value)
+inline FX_ARGB ArgbGamma(FX_ARGB argb) {
+ return argb;
+}
+inline FX_ARGB ArgbGammaInverse(FX_ARGB argb) {
+ return argb;
+}
+class CFX_PathData {
+ public:
+ CFX_PathData();
+
+ CFX_PathData(const CFX_PathData& src);
+
+ ~CFX_PathData();
+
+ int GetPointCount() const { return m_PointCount; }
+
+ int GetFlag(int index) const { return m_pPoints[index].m_Flag; }
+
+ FX_FLOAT GetPointX(int index) const { return m_pPoints[index].m_PointX; }
+
+ FX_FLOAT GetPointY(int index) const { return m_pPoints[index].m_PointY; }
+
+ FX_PATHPOINT* GetPoints() const { return m_pPoints; }
+
+ void SetPointCount(int nPoints);
+ void AllocPointCount(int nPoints);
+ void AddPointCount(int addPoints);
+
+ CFX_FloatRect GetBoundingBox() const;
+
+ CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;
+
+ void Transform(const CFX_Matrix* pMatrix);
+
+ FX_BOOL IsRect() const;
+
+ FX_BOOL GetZeroAreaPath(CFX_PathData& NewPath,
+ CFX_Matrix* pMatrix,
+ FX_BOOL& bThin,
+ FX_BOOL bAdjust) const;
+
+ FX_BOOL IsRect(const CFX_Matrix* pMatrix, CFX_FloatRect* rect) const;
+
+ void Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix);
+ void AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);
+
+ void SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag);
+
+ void TrimPoints(int nPoints);
+
+ void Copy(const CFX_PathData& src);
+
+ protected:
+ friend class CPDF_Path;
+
+ int m_PointCount;
+
+ FX_PATHPOINT* m_pPoints;
+
+ int m_AllocCount;
+};
+class CFX_GraphStateData {
+ public:
+ CFX_GraphStateData();
+
+ CFX_GraphStateData(const CFX_GraphStateData& src);
+
+ ~CFX_GraphStateData();
+
+ void Copy(const CFX_GraphStateData& src);
+
+ void SetDashCount(int count);
+
+ typedef enum { LineCapButt = 0, LineCapRound = 1, LineCapSquare = 2 } LineCap;
+ LineCap m_LineCap;
+ int m_DashCount;
+ FX_FLOAT* m_DashArray;
+ FX_FLOAT m_DashPhase;
+
+ typedef enum {
+ LineJoinMiter = 0,
+ LineJoinRound = 1,
+ LineJoinBevel = 2,
+ } LineJoin;
+ LineJoin m_LineJoin;
+ FX_FLOAT m_MiterLimit;
+ FX_FLOAT m_LineWidth;
+};
+#define FXDC_DEVICE_CLASS 1
+#define FXDC_PIXEL_WIDTH 2
+#define FXDC_PIXEL_HEIGHT 3
+#define FXDC_BITS_PIXEL 4
+#define FXDC_HORZ_SIZE 5
+#define FXDC_VERT_SIZE 6
+#define FXDC_RENDER_CAPS 7
+#define FXDC_DITHER_BITS 8
+#define FXDC_DISPLAY 1
+#define FXDC_PRINTER 2
+#define FXRC_GET_BITS 0x01
+#define FXRC_BIT_MASK 0x02
+#define FXRC_ALPHA_MASK 0x04
+#define FXRC_ALPHA_PATH 0x10
+#define FXRC_ALPHA_IMAGE 0x20
+#define FXRC_ALPHA_OUTPUT 0x40
+#define FXRC_BLEND_MODE 0x80
+#define FXRC_SOFT_CLIP 0x100
+#define FXRC_CMYK_OUTPUT 0x200
+#define FXRC_BITMASK_OUTPUT 0x400
+#define FXRC_BYTEMASK_OUTPUT 0x800
+#define FXRENDER_IMAGE_LOSSY 0x1000
+#define FXRC_FILLSTROKE_PATH 0x2000
+#define FXRC_SHADING 0x4000
+#define FXFILL_ALTERNATE 1
+#define FXFILL_WINDING 2
+#define FXFILL_FULLCOVER 4
+#define FXFILL_RECT_AA 8
+#define FX_FILL_STROKE 16
+#define FX_STROKE_ADJUST 32
+#define FX_STROKE_TEXT_MODE 64
+#define FX_FILL_TEXT_MODE 128
+#define FX_ZEROAREA_FILL 256
+#define FXFILL_NOPATHSMOOTH 512
+#define FXTEXT_CLEARTYPE 0x01
+#define FXTEXT_BGR_STRIPE 0x02
+#define FXTEXT_PRINTGRAPHICTEXT 0x04
+#define FXTEXT_NO_NATIVETEXT 0x08
+#define FXTEXT_PRINTIMAGETEXT 0x10
+#define FXTEXT_NOSMOOTH 0x20
+typedef struct {
+ uint32_t m_GlyphIndex;
+ FX_FLOAT m_OriginX, m_OriginY;
+ int m_FontCharWidth;
+ FX_BOOL m_bGlyphAdjust;
+ FX_FLOAT m_AdjustMatrix[4];
+ uint32_t m_ExtGID;
+ FX_BOOL m_bFontStyle;
+} FXTEXT_CHARPOS;
+
+class CFX_RenderDevice {
+ public:
+ CFX_RenderDevice();
+ virtual ~CFX_RenderDevice();
+
+ void SetDeviceDriver(IFX_RenderDeviceDriver* pDriver);
+ IFX_RenderDeviceDriver* GetDeviceDriver() const { return m_pDeviceDriver; }
+
+ FX_BOOL StartRendering();
+ void EndRendering();
+ void SaveState();
+ void RestoreState(FX_BOOL bKeepSaved = FALSE);
+
+ int GetWidth() const { return m_Width; }
+ int GetHeight() const { return m_Height; }
+ int GetDeviceClass() const { return m_DeviceClass; }
+ int GetBPP() const { return m_bpp; }
+ int GetRenderCaps() const { return m_RenderCaps; }
+ int GetDeviceCaps(int id) const;
+ CFX_Matrix GetCTM() const;
+
+ CFX_DIBitmap* GetBitmap() const { return m_pBitmap; }
+ void SetBitmap(CFX_DIBitmap* pBitmap) { m_pBitmap = pBitmap; }
+
+ FX_BOOL CreateCompatibleBitmap(CFX_DIBitmap* pDIB,
+ int width,
+ int height) const;
+
+ const FX_RECT& GetClipBox() const { return m_ClipBox; }
+
+ FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ int fill_mode);
+
+ FX_BOOL SetClip_Rect(const FX_RECT& pRect);
+ FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState);
+
+ FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ uint32_t fill_color,
+ uint32_t stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL SetPixel(int x,
+ int y,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL FillRect(const FX_RECT* pRect,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL DrawCosmeticLine(FX_FLOAT x1,
+ FX_FLOAT y1,
+ FX_FLOAT x2,
+ FX_FLOAT y2,
+ uint32_t color,
+ int fill_mode = 0,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap,
+ int left,
+ int top,
+ void* pIccTransform = NULL);
+
+ CFX_DIBitmap* GetBackDrop();
+
+ FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
+ int left,
+ int top,
+ int blend_type = FXDIB_BLEND_NORMAL,
+ void* pIccTransform = NULL);
+
+ FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap,
+ int left,
+ int top,
+ int dest_width,
+ int dest_height,
+ uint32_t flags = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL SetBitMask(const CFX_DIBSource* pBitmap,
+ int left,
+ int top,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL StretchBitMask(const CFX_DIBSource* pBitmap,
+ int left,
+ int top,
+ int dest_width,
+ int dest_height,
+ uint32_t color,
+ uint32_t flags = 0,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap,
+ int bitmap_alpha,
+ uint32_t color,
+ const CFX_Matrix* pMatrix,
+ uint32_t flags,
+ void*& handle,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause);
+
+ void CancelDIBits(void* handle);
+
+ FX_BOOL DrawNormalText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ FX_FLOAT font_size,
+ const CFX_Matrix* pText2Device,
+ uint32_t fill_color,
+ uint32_t text_flags,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL DrawTextPath(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ FX_FLOAT font_size,
+ const CFX_Matrix* pText2User,
+ const CFX_Matrix* pUser2Device,
+ const CFX_GraphStateData* pGraphState,
+ uint32_t fill_color,
+ uint32_t stroke_color,
+ CFX_PathData* pClippingPath,
+ int nFlag = 0,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+ virtual void Begin() {}
+ virtual void End() {}
+
+ private:
+ void InitDeviceInfo();
+ void UpdateClipBox();
+ FX_BOOL DrawFillStrokePath(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ uint32_t fill_color,
+ uint32_t stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type);
+
+ CFX_DIBitmap* m_pBitmap;
+ int m_Width;
+ int m_Height;
+ int m_bpp;
+ int m_RenderCaps;
+ int m_DeviceClass;
+ FX_RECT m_ClipBox;
+ IFX_RenderDeviceDriver* m_pDeviceDriver;
+};
+
+class CFX_FxgeDevice : public CFX_RenderDevice {
+ public:
+ CFX_FxgeDevice();
+ ~CFX_FxgeDevice() override;
+
+ bool Attach(CFX_DIBitmap* pBitmap,
+ int dither_bits = 0,
+ bool bRgbByteOrder = false,
+ CFX_DIBitmap* pOriDevice = NULL,
+ bool bGroupKnockout = false);
+
+ bool Create(int width,
+ int height,
+ FXDIB_Format format,
+ int dither_bits = 0,
+ CFX_DIBitmap* pOriDevice = NULL);
+
+ protected:
+ bool m_bOwnedBitmap;
+};
+
+class CFX_SkiaDevice : public CFX_RenderDevice {
+ public:
+ CFX_SkiaDevice();
+ ~CFX_SkiaDevice() override;
+
+ FX_BOOL Attach(CFX_DIBitmap* pBitmap,
+ int dither_bits = 0,
+ FX_BOOL bRgbByteOrder = FALSE,
+ CFX_DIBitmap* pOriDevice = NULL,
+ FX_BOOL bGroupKnockout = FALSE);
+
+ FX_BOOL AttachRecorder(SkPictureRecorder* recorder);
+
+ FX_BOOL Create(int width,
+ int height,
+ FXDIB_Format format,
+ int dither_bits = 0,
+ CFX_DIBitmap* pOriDevice = NULL);
+
+ SkPictureRecorder* CreateRecorder(int size_x, int size_y);
+
+ protected:
+ FX_BOOL m_bOwnedBitmap;
+};
+
+class IFX_RenderDeviceDriver {
+ public:
+ static IFX_RenderDeviceDriver* CreateFxgeDriver(
+ CFX_DIBitmap* pBitmap,
+ FX_BOOL bRgbByteOrder = FALSE,
+ CFX_DIBitmap* pOriDevice = NULL,
+ FX_BOOL bGroupKnockout = FALSE);
+
+ virtual ~IFX_RenderDeviceDriver() {}
+ virtual void Begin() {}
+ virtual void End() {}
+
+ virtual int GetDeviceCaps(int caps_id) = 0;
+
+ virtual CFX_Matrix GetCTM() const { return CFX_Matrix(); }
+
+ virtual FX_BOOL IsPSPrintDriver() { return FALSE; }
+
+ virtual FX_BOOL StartRendering() { return TRUE; }
+
+ virtual void EndRendering() {}
+
+ virtual void SaveState() = 0;
+
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE) = 0;
+
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ int fill_mode) = 0;
+
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState) {
+ return FALSE;
+ }
+
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ uint32_t fill_color,
+ uint32_t stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL) = 0;
+
+ virtual FX_BOOL SetPixel(int x,
+ int y,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL) {
+ return FALSE;
+ }
+
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ uint32_t fill_color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1,
+ FX_FLOAT y1,
+ FX_FLOAT x2,
+ FX_FLOAT y2,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;
+
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap,
+ int left,
+ int top,
+ void* pIccTransform = NULL,
+ FX_BOOL bDEdge = FALSE) {
+ return FALSE;
+ }
+ virtual CFX_DIBitmap* GetBackDrop() { return NULL; }
+
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
+ uint32_t color,
+ const FX_RECT* pSrcRect,
+ int dest_left,
+ int dest_top,
+ int blend_type,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL) = 0;
+
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap,
+ uint32_t color,
+ int dest_left,
+ int dest_top,
+ int dest_width,
+ int dest_height,
+ const FX_RECT* pClipRect,
+ uint32_t flags,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL) = 0;
+
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap,
+ int bitmap_alpha,
+ uint32_t color,
+ const CFX_Matrix* pMatrix,
+ uint32_t flags,
+ void*& handle,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL) = 0;
+
+ virtual FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause) {
+ return FALSE;
+ }
+
+ virtual void CancelDIBits(void* handle) {}
+
+ virtual FX_BOOL DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_Matrix* pObject2Device,
+ FX_FLOAT font_size,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL) {
+ return FALSE;
+ }
+
+ virtual void* GetPlatformSurface() const { return NULL; }
+ virtual int GetDriverType() const { return 0; }
+ virtual void ClearDriver() {}
+
+ virtual FX_BOOL DrawShading(CPDF_ShadingPattern* pPattern,
+ CFX_Matrix* pMatrix,
+ int alpha,
+ FX_BOOL bAlphaMode) {
+ return false;
+ }
+};
+
+class IFX_PSOutput {
+ public:
+ virtual void Release() = 0;
+ virtual void OutputPS(const FX_CHAR* str, int len) = 0;
+
+ protected:
+ virtual ~IFX_PSOutput() {}
+};
+
+class CPSFont;
+class CFX_PSRenderer {
+ public:
+ CFX_PSRenderer();
+
+ ~CFX_PSRenderer();
+
+ void Init(IFX_PSOutput* pOutput,
+ int ps_level,
+ int width,
+ int height,
+ FX_BOOL bCmykOutput);
+ FX_BOOL StartRendering();
+ void EndRendering();
+
+ void SaveState();
+
+ void RestoreState(FX_BOOL bKeepSaved = FALSE);
+
+ void SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ int fill_mode);
+
+ void SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState);
+
+ FX_RECT GetClipBox() { return m_ClipBox; }
+
+ FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ uint32_t fill_color,
+ uint32_t stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
+ uint32_t color,
+ int dest_left,
+ int dest_top,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap,
+ uint32_t color,
+ int dest_left,
+ int dest_top,
+ int dest_width,
+ int dest_height,
+ uint32_t flags,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL DrawDIBits(const CFX_DIBSource* pBitmap,
+ uint32_t color,
+ const CFX_Matrix* pMatrix,
+ uint32_t flags,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ FX_BOOL DrawText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_Matrix* pObject2Device,
+ FX_FLOAT font_size,
+ uint32_t color,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL);
+
+ private:
+ IFX_PSOutput* m_pOutput;
+
+ int m_PSLevel;
+
+ CFX_GraphStateData m_CurGraphState;
+
+ FX_BOOL m_bGraphStateSet;
+
+ FX_BOOL m_bCmykOutput;
+
+ FX_BOOL m_bColorSet;
+
+ uint32_t m_LastColor;
+
+ FX_RECT m_ClipBox;
+
+ CFX_ArrayTemplate<CPSFont*> m_PSFontList;
+
+ CFX_ArrayTemplate<FX_RECT> m_ClipBoxStack;
+ FX_BOOL m_bInited;
+
+ void OutputPath(const CFX_PathData* pPathData,
+ const CFX_Matrix* pObject2Device);
+
+ void SetGraphState(const CFX_GraphStateData* pGraphState);
+
+ void SetColor(uint32_t color, int alpha_flag, void* pIccTransform);
+
+ void FindPSFontGlyph(CFX_FaceCache* pFaceCache,
+ CFX_Font* pFont,
+ const FXTEXT_CHARPOS& charpos,
+ int& ps_fontnum,
+ int& ps_glyphindex);
+
+ void WritePSBinary(const uint8_t* data, int len);
+};
+
+#endif // CORE_FXGE_INCLUDE_FX_GE_H_
diff --git a/core/fxge/include/fx_ge_apple.h b/core/fxge/include/fx_ge_apple.h
new file mode 100644
index 0000000000..57acef653c
--- /dev/null
+++ b/core/fxge/include/fx_ge_apple.h
@@ -0,0 +1,27 @@
+// 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_INCLUDE_FX_GE_APPLE_H_
+#define CORE_FXGE_INCLUDE_FX_GE_APPLE_H_
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+class CFX_QuartzDevice : public CFX_RenderDevice {
+ public:
+ CFX_QuartzDevice();
+ ~CFX_QuartzDevice();
+ FX_BOOL Attach(CGContextRef context, int32_t nDeviceClass = FXDC_DISPLAY);
+ FX_BOOL Attach(CFX_DIBitmap* pBitmap);
+ FX_BOOL Create(int32_t width, int32_t height, FXDIB_Format format);
+
+ CGContextRef GetContext();
+
+ protected:
+ CGContextRef m_pContext;
+ FX_BOOL m_bOwnedBitmap;
+};
+#endif
+
+#endif // CORE_FXGE_INCLUDE_FX_GE_APPLE_H_
diff --git a/core/fxge/include/fx_ge_win32.h b/core/fxge/include/fx_ge_win32.h
new file mode 100644
index 0000000000..b4337c117c
--- /dev/null
+++ b/core/fxge/include/fx_ge_win32.h
@@ -0,0 +1,98 @@
+// 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_INCLUDE_FX_GE_WIN32_H_
+#define CORE_FXGE_INCLUDE_FX_GE_WIN32_H_
+
+#ifdef _WIN32
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+#define WINDIB_OPEN_MEMORY 0x1
+#define WINDIB_OPEN_PATHNAME 0x2
+typedef struct WINDIB_Open_Args_ {
+ int flags;
+
+ const uint8_t* memory_base;
+
+ size_t memory_size;
+
+ const FX_WCHAR* path_name;
+} WINDIB_Open_Args_;
+class CFX_WindowsDIB : public CFX_DIBitmap {
+ public:
+ static CFX_ByteString GetBitmapInfo(const CFX_DIBitmap* pBitmap);
+
+ static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);
+
+ static HBITMAP GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);
+
+ static CFX_DIBitmap* LoadFromDDB(HDC hDC,
+ HBITMAP hBitmap,
+ uint32_t* pPalette = NULL,
+ uint32_t size = 256);
+
+ static CFX_DIBitmap* LoadFromFile(const FX_WCHAR* filename);
+
+ static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename) {
+ return LoadFromFile(CFX_WideString::FromLocal(filename).c_str());
+ }
+
+ static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
+
+ CFX_WindowsDIB(HDC hDC, int width, int height);
+
+ ~CFX_WindowsDIB();
+
+ HDC GetDC() const { return m_hMemDC; }
+
+ HBITMAP GetWindowsBitmap() const { return m_hBitmap; }
+
+ void LoadFromDevice(HDC hDC, int left, int top);
+
+ void SetToDevice(HDC hDC, int left, int top);
+
+ protected:
+ HDC m_hMemDC;
+
+ HBITMAP m_hBitmap;
+
+ HBITMAP m_hOldBitmap;
+};
+class CFX_WindowsDevice : public CFX_RenderDevice {
+ public:
+ static IFX_RenderDeviceDriver* CreateDriver(HDC hDC,
+ FX_BOOL bCmykOutput = FALSE);
+
+ CFX_WindowsDevice(HDC hDC,
+ FX_BOOL bCmykOutput = FALSE,
+ FX_BOOL bForcePSOutput = FALSE,
+ int psLevel = 2);
+
+ HDC GetDC() const;
+
+ FX_BOOL m_bForcePSOutput;
+
+ static int m_psLevel;
+};
+class CFX_WinBitmapDevice : public CFX_RenderDevice {
+ public:
+ CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);
+
+ ~CFX_WinBitmapDevice();
+
+ HDC GetDC() { return m_hDC; }
+
+ protected:
+ HBITMAP m_hBitmap;
+
+ HBITMAP m_hOldBitmap;
+
+ HDC m_hDC;
+};
+#endif
+
+#endif // CORE_FXGE_INCLUDE_FX_GE_WIN32_H_