// 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 XFA_INCLUDE_FXGRAPHICS_FX_GRAPHICS_H_
#define XFA_INCLUDE_FXGRAPHICS_FX_GRAPHICS_H_

#include "core/include/fpdfapi/fpdf_pageobj.h"

typedef int FX_ERR;
#define FX_ERR_Succeeded 0
#define FX_ERR_Indefinite -1
#define FX_ERR_Parameter_Invalid -100
#define FX_ERR_Property_Invalid -200
#define FX_ERR_Intermediate_Value_Invalid -300
#define FX_ERR_Method_Not_Supported -400
#define FX_ERR_Out_Of_Memory -500
#define _FX_RETURN_IF_FAIL(arg) \
  {                             \
    if (!(arg))                 \
      return;                   \
  }
#define _FX_RETURN_VALUE_IF_FAIL(arg, val) \
  {                                        \
    if (!(arg))                            \
      return val;                          \
  }
#define _FX_GOTO_POSITION_IF_FAIL(arg, pos) \
  {                                         \
    if (!(arg))                             \
      goto pos;                             \
  }
#define _FX_ERR_CHECK_RETURN_IF_FAIL(arg) \
  {                                       \
    if ((arg) != FX_ERR_Succeeded)        \
      return;                             \
  }
#define _FX_ERR_CHECK_RETURN_VALUE_IF_FAIL(arg, val) \
  {                                                  \
    if ((arg) != FX_ERR_Succeeded)                   \
      return val;                                    \
  }
#define _FX_ERR_CHECK_GOTO_POSITION_IF_FAIL(arg, pos) \
  {                                                   \
    if ((arg) != FX_ERR_Succeeded)                    \
      goto pos;                                       \
  }

#define FX_SHADING_Steps 256
typedef int32_t FX_DashStyle;
enum {
  FX_DASHSTYLE_Solid = 0,
  FX_DASHSTYLE_Dash = 1,
  FX_DASHSTYLE_Dot = 2,
  FX_DASHSTYLE_DashDot = 3,
  FX_DASHSTYLE_DashDotDot = 4
};
typedef int32_t FX_StrokeAlignment;
enum {
  FX_STROKEALIGNMENT_Center = 0,
  FX_STROKEALIGNMENT_Inset = 1,
  FX_STROKEALIGNMENT_Outset = 2,
  FX_STROKEALIGNMENT_Left = 3,
  FX_STROKEALIGNMENT_Right = 4
};
typedef int32_t FX_HatchStyle;
enum {
  FX_HATCHSTYLE_Horizontal = 0,
  FX_HATCHSTYLE_Vertical = 1,
  FX_HATCHSTYLE_ForwardDiagonal = 2,
  FX_HATCHSTYLE_BackwardDiagonal = 3,
  FX_HATCHSTYLE_Cross = 4,
  FX_HATCHSTYLE_DiagonalCross = 5,
  FX_HATCHSTYLE_05Percent = 6,
  FX_HATCHSTYLE_10Percent = 7,
  FX_HATCHSTYLE_20Percent = 8,
  FX_HATCHSTYLE_25Percent = 9,
  FX_HATCHSTYLE_30Percent = 10,
  FX_HATCHSTYLE_40Percent = 11,
  FX_HATCHSTYLE_50Percent = 12,
  FX_HATCHSTYLE_60Percent = 13,
  FX_HATCHSTYLE_70Percent = 14,
  FX_HATCHSTYLE_75Percent = 15,
  FX_HATCHSTYLE_80Percent = 16,
  FX_HATCHSTYLE_90Percent = 17,
  FX_HATCHSTYLE_LightDownwardDiagonal = 18,
  FX_HATCHSTYLE_LightUpwardDiagonal = 19,
  FX_HATCHSTYLE_DarkDownwardDiagonal = 20,
  FX_HATCHSTYLE_DarkUpwardDiagonal = 21,
  FX_HATCHSTYLE_WideDownwardDiagonal = 22,
  FX_HATCHSTYLE_WideUpwardDiagonal = 23,
  FX_HATCHSTYLE_LightVertical = 24,
  FX_HATCHSTYLE_LightHorizontal = 25,
  FX_HATCHSTYLE_NarrowVertical = 26,
  FX_HATCHSTYLE_NarrowHorizontal = 27,
  FX_HATCHSTYLE_DarkVertical = 28,
  FX_HATCHSTYLE_DarkHorizontal = 29,
  FX_HATCHSTYLE_DashedDownwardDiagonal = 30,
  FX_HATCHSTYLE_DashedUpwardDiagonal = 31,
  FX_HATCHSTYLE_DashedHorizontal = 32,
  FX_HATCHSTYLE_DashedVertical = 33,
  FX_HATCHSTYLE_SmallConfetti = 34,
  FX_HATCHSTYLE_LargeConfetti = 35,
  FX_HATCHSTYLE_ZigZag = 36,
  FX_HATCHSTYLE_Wave = 37,
  FX_HATCHSTYLE_DiagonalBrick = 38,
  FX_HATCHSTYLE_HorizontalBrick = 39,
  FX_HATCHSTYLE_Weave = 40,
  FX_HATCHSTYLE_Plaid = 41,
  FX_HATCHSTYLE_Divot = 42,
  FX_HATCHSTYLE_DottedGrid = 43,
  FX_HATCHSTYLE_DottedDiamond = 44,
  FX_HATCHSTYLE_Shingle = 45,
  FX_HATCHSTYLE_Trellis = 46,
  FX_HATCHSTYLE_Sphere = 47,
  FX_HATCHSTYLE_SmallGrid = 48,
  FX_HATCHSTYLE_SmallCheckerBoard = 49,
  FX_HATCHSTYLE_LargeCheckerBoard = 50,
  FX_HATCHSTYLE_OutlinedDiamond = 51,
  FX_HATCHSTYLE_SolidDiamond = 52
};
typedef int32_t FX_DeviceCap;
typedef int32_t FX_FillMode;
class CFX_RenderDevice;
class CFX_GraphStateData;
class CFX_Matrix;
class CFX_DIBSource;
class CFX_DIBitmap;
class CFX_Font;
class CFX_WideString;
class IFX_FileRead;
class CFX_PathGenerator;
class CAGG_Graphics;
class CFX_Graphics;
class CFX_Color;
class CFX_Path;
class CFX_Pattern;
class CFX_Shading;
class CFX_Graphics {
 public:
  CFX_Graphics();

  FX_ERR Create(CFX_RenderDevice* renderDevice, FX_BOOL isAntialiasing = TRUE);

  FX_ERR Create(int32_t width,
                int32_t height,
                FXDIB_Format format,
                FX_BOOL isNative = TRUE,
                FX_BOOL isAntialiasing = TRUE);

  virtual ~CFX_Graphics();

  FX_ERR GetDeviceCap(const int32_t capID, FX_DeviceCap& capVal);
  FX_ERR IsPrinterDevice(FX_BOOL& isPrinter);
  FX_ERR EnableAntialiasing(FX_BOOL isAntialiasing);

  FX_ERR SaveGraphState();

  FX_ERR RestoreGraphState();

  FX_ERR GetLineCap(CFX_GraphStateData::LineCap& lineCap);

  FX_ERR SetLineCap(CFX_GraphStateData::LineCap lineCap);

  FX_ERR GetDashCount(int32_t& dashCount);

  FX_ERR GetLineDash(FX_FLOAT& dashPhase, FX_FLOAT* dashArray);

  FX_ERR SetLineDash(FX_FLOAT dashPhase,
                     FX_FLOAT* dashArray,
                     int32_t dashCount);

  FX_ERR SetLineDash(FX_DashStyle dashStyle);

  FX_ERR GetLineJoin(CFX_GraphStateData::LineJoin& lineJoin);

  FX_ERR SetLineJoin(CFX_GraphStateData::LineJoin lineJoin);

  FX_ERR GetMiterLimit(FX_FLOAT& miterLimit);

  FX_ERR SetMiterLimit(FX_FLOAT miterLimit);

  FX_ERR GetLineWidth(FX_FLOAT& lineWidth);

  FX_ERR SetLineWidth(FX_FLOAT lineWidth, FX_BOOL isActOnDash = FALSE);

  FX_ERR GetStrokeAlignment(FX_StrokeAlignment& strokeAlignment);

  FX_ERR SetStrokeAlignment(FX_StrokeAlignment strokeAlignment);

  FX_ERR SetStrokeColor(CFX_Color* color);

  FX_ERR SetFillColor(CFX_Color* color);

  FX_ERR StrokePath(CFX_Path* path, CFX_Matrix* matrix = NULL);

  FX_ERR FillPath(CFX_Path* path,
                  FX_FillMode fillMode = FXFILL_WINDING,
                  CFX_Matrix* matrix = NULL);

  FX_ERR ClipPath(CFX_Path* path,
                  FX_FillMode fillMode = FXFILL_WINDING,
                  CFX_Matrix* matrix = NULL);

  FX_ERR DrawImage(CFX_DIBSource* source,
                   const CFX_PointF& point,
                   CFX_Matrix* matrix = NULL);

  FX_ERR StretchImage(CFX_DIBSource* source,
                      const CFX_RectF& rect,
                      CFX_Matrix* matrix = NULL);

  FX_ERR ConcatMatrix(const CFX_Matrix* matrix);

  CFX_Matrix* GetMatrix();

  FX_ERR GetClipRect(CFX_RectF& rect);

  FX_ERR SetClipRect(const CFX_RectF& rect);

  FX_ERR ClearClip();

  FX_ERR SetFont(CFX_Font* font);

  FX_ERR SetFontSize(const FX_FLOAT size);

  FX_ERR SetFontHScale(const FX_FLOAT scale);

  FX_ERR SetCharSpacing(const FX_FLOAT spacing);

  FX_ERR SetTextDrawingMode(const int32_t mode);

  FX_ERR ShowText(const CFX_PointF& point,
                  const CFX_WideString& text,
                  CFX_Matrix* matrix = NULL);

  FX_ERR CalcTextRect(CFX_RectF& rect,
                      const CFX_WideString& text,
                      FX_BOOL isMultiline = FALSE,
                      CFX_Matrix* matrix = NULL);

  FX_ERR Transfer(CFX_Graphics* graphics, const CFX_Matrix* matrix);
  FX_ERR Transfer(CFX_Graphics* graphics,
                  FX_FLOAT srcLeft,
                  FX_FLOAT srcTop,
                  const CFX_RectF& dstRect,
                  const CFX_Matrix* matrix);

  CFX_RenderDevice* GetRenderDevice();

  FX_ERR InverseRect(const CFX_RectF& rect);
  FX_ERR XorDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect);
  FX_ERR EqvDIBitmap(const CFX_DIBitmap* srcBitmap, const CFX_RectF& rect);

 private:
  FX_ERR RenderDeviceSetLineDash(FX_DashStyle dashStyle);

  FX_ERR RenderDeviceStrokePath(CFX_Path* path, CFX_Matrix* matrix);

  FX_ERR RenderDeviceFillPath(CFX_Path* path,
                              FX_FillMode fillMode,
                              CFX_Matrix* matrix);

  FX_ERR RenderDeviceDrawImage(CFX_DIBSource* source,
                               const CFX_PointF& point,
                               CFX_Matrix* matrix);

  FX_ERR RenderDeviceStretchImage(CFX_DIBSource* source,
                                  const CFX_RectF& rect,
                                  CFX_Matrix* matrix);

  FX_ERR RenderDeviceShowText(const CFX_PointF& point,
                              const CFX_WideString& text,
                              CFX_Matrix* matrix);

  FX_ERR StrokePathWithPattern(CFX_Path* path, CFX_Matrix* matrix);

  FX_ERR StrokePathWithShading(CFX_Path* path, CFX_Matrix* matrix);

  FX_ERR FillPathWithPattern(CFX_Path* path,
                             FX_FillMode fillMode,
                             CFX_Matrix* matrix);

  FX_ERR FillPathWithShading(CFX_Path* path,
                             FX_FillMode fillMode,
                             CFX_Matrix* matrix);
  FX_ERR SetDIBitsWithMatrix(CFX_DIBSource* source, CFX_Matrix* matrix);
  FX_ERR CalcTextInfo(const CFX_WideString& text,
                      FX_DWORD* charCodes,
                      FXTEXT_CHARPOS* charPos,
                      CFX_RectF& rect);

 protected:
  int32_t _type;

 private:
  struct TInfo {
    CFX_GraphStateData _graphState;
    FX_BOOL _isAntialiasing;
    FX_StrokeAlignment _strokeAlignment;
    CFX_Matrix _CTM;
    FX_BOOL _isActOnDash;
    CFX_Color* _strokeColor;
    CFX_Color* _fillColor;
    CFX_Font* _font;
    FX_FLOAT _fontSize;
    FX_FLOAT _fontHScale;
    FX_FLOAT _fontSpacing;
  } _info;
  CFX_RenderDevice* _renderDevice;
  CFX_PtrArray _infoStack;
  CAGG_Graphics* _aggGraphics;
  friend class CAGG_Graphics;
};
class CFX_Path {
 public:
  CFX_Path();

  FX_ERR Create();

  virtual ~CFX_Path();

  FX_ERR MoveTo(FX_FLOAT x, FX_FLOAT y);

  FX_ERR LineTo(FX_FLOAT x, FX_FLOAT y);

  FX_ERR BezierTo(FX_FLOAT ctrlX1,
                  FX_FLOAT ctrlY1,
                  FX_FLOAT ctrlX2,
                  FX_FLOAT ctrlY2,
                  FX_FLOAT toX,
                  FX_FLOAT toY);

  FX_ERR ArcTo(FX_FLOAT left,
               FX_FLOAT top,
               FX_FLOAT width,
               FX_FLOAT height,
               FX_FLOAT startAngle,
               FX_FLOAT sweepAngle);

  FX_ERR Close();

  FX_ERR AddLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);

  FX_ERR AddBezier(FX_FLOAT startX,
                   FX_FLOAT startY,
                   FX_FLOAT ctrlX1,
                   FX_FLOAT ctrlY1,
                   FX_FLOAT ctrlX2,
                   FX_FLOAT ctrlY2,
                   FX_FLOAT endX,
                   FX_FLOAT endY);

  FX_ERR AddRectangle(FX_FLOAT left,
                      FX_FLOAT top,
                      FX_FLOAT width,
                      FX_FLOAT height);

  FX_ERR AddEllipse(FX_FLOAT left,
                    FX_FLOAT top,
                    FX_FLOAT width,
                    FX_FLOAT height);

  FX_ERR AddEllipse(const CFX_RectF& rect);

  FX_ERR AddArc(FX_FLOAT left,
                FX_FLOAT top,
                FX_FLOAT width,
                FX_FLOAT height,
                FX_FLOAT startAngle,
                FX_FLOAT sweepAngle);

  FX_ERR AddPie(FX_FLOAT left,
                FX_FLOAT top,
                FX_FLOAT width,
                FX_FLOAT height,
                FX_FLOAT startAngle,
                FX_FLOAT sweepAngle);

  FX_ERR AddSubpath(CFX_Path* path);

  FX_ERR Clear();

  FX_BOOL IsEmpty();

  CFX_PathData* GetPathData();

 private:
  CFX_PathGenerator* _generator;
};
class CFX_Color {
 public:
  CFX_Color();

  CFX_Color(const FX_ARGB argb);

  CFX_Color(CFX_Pattern* pattern, const FX_ARGB argb = 0x0);

  CFX_Color(CFX_Shading* shading);

  virtual ~CFX_Color();

  FX_ERR Set(const FX_ARGB argb);

  FX_ERR Set(CFX_Pattern* pattern, const FX_ARGB argb = 0x0);

  FX_ERR Set(CFX_Shading* shading);

 private:
  int32_t _type;
  union {
    struct {
      FX_ARGB _argb;
      CFX_Pattern* _pattern;
    };
    CFX_Shading* _shading;
  };

  friend class CFX_Graphics;
};
class CFX_Pattern {
 public:
  CFX_Pattern();

  FX_ERR Create(CFX_DIBitmap* bitmap,
                const FX_FLOAT xStep,
                const FX_FLOAT yStep,
                CFX_Matrix* matrix = NULL);

  FX_ERR Create(FX_HatchStyle hatchStyle,
                const FX_ARGB foreArgb,
                const FX_ARGB backArgb,
                CFX_Matrix* matrix = NULL);

  virtual ~CFX_Pattern();

 private:
  int32_t _type;
  CFX_Matrix _matrix;
  union {
    struct {
      CFX_RectF _rect;
      FX_FLOAT _xStep;
      FX_FLOAT _yStep;
      FX_BOOL _isColored;
    };
    struct {
      CFX_DIBitmap* _bitmap;
      FX_FLOAT _x1Step;
      FX_FLOAT _y1Step;
    };
    struct {
      FX_HatchStyle _hatchStyle;
      FX_ARGB _foreArgb;
      FX_ARGB _backArgb;
    };
  };
  friend class CFX_Graphics;
};
class CFX_Shading {
 public:
  CFX_Shading();

  FX_ERR CreateAxial(const CFX_PointF& beginPoint,
                     const CFX_PointF& endPoint,
                     FX_BOOL isExtendedBegin,
                     FX_BOOL isExtendedEnd,
                     const FX_ARGB beginArgb,
                     const FX_ARGB endArgb);

  FX_ERR CreateRadial(const CFX_PointF& beginPoint,
                      const CFX_PointF& endPoint,
                      const FX_FLOAT beginRadius,
                      const FX_FLOAT endRadius,
                      FX_BOOL isExtendedBegin,
                      FX_BOOL isExtendedEnd,
                      const FX_ARGB beginArgb,
                      const FX_ARGB endArgb);

  virtual ~CFX_Shading();

 private:
  FX_ERR InitArgbArray();

 private:
  int32_t _type;
  CFX_PointF _beginPoint;
  CFX_PointF _endPoint;
  FX_FLOAT _beginRadius;
  FX_FLOAT _endRadius;
  FX_BOOL _isExtendedBegin;
  FX_BOOL _isExtendedEnd;
  FX_ARGB _beginArgb;
  FX_ARGB _endArgb;
  FX_ARGB _argbArray[FX_SHADING_Steps];
  friend class CFX_Graphics;
};

#endif  // XFA_INCLUDE_FXGRAPHICS_FX_GRAPHICS_H_
