// 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_FDE_FDE_PEN_H_
#define XFA_FDE_FDE_PEN_H_

class IFDE_Pen;

#define FDE_PENTYPE_SolidColor FDE_BRUSHTYPE_Solid

#define FDE_DASHSTYLE_Solid 0
#define FDE_DASHSTYLE_Dash 1
#define FDE_DASHSTYLE_Dot 2
#define FDE_DASHSTYLE_DashDot 3
#define FDE_DASHSTYLE_DashDotDot 4
#define FDE_DASHSTYLE_Customized 5

#define FDE_LINEJOIN_Miter 0
#define FDE_LINEJOIN_Round 1
#define FDE_LINEJOIN_Bevel 2

#define FDE_LINECAP_Flat 0
#define FDE_LINECAP_Round 1
#define FDE_LINECAP_Square 2

struct FDE_COMPOUNDPATTERN {
  FX_FLOAT pos;
  FX_FLOAT width;
};
typedef CFX_ArrayTemplate<FDE_COMPOUNDPATTERN> CFDE_CompoundPatterns;

class IFDE_Pen {
 public:
  virtual ~IFDE_Pen() {}

  virtual void Release() = 0;
  virtual int32_t GetType() const = 0;
  virtual FX_ARGB GetColor() const = 0;
  virtual void SetColor(FX_ARGB color) = 0;
  virtual IFDE_Brush* GetBrush() const = 0;
  virtual void SetBrush(IFDE_Brush* pBrush, FX_BOOL bAutoRelease) = 0;
  virtual int32_t GetLineCap() const = 0;
  virtual void SetLineCap(int32_t iLineCap) = 0;
  virtual int32_t GetDashStyle() const = 0;
  virtual void SetDashStyle(int32_t iDashStyle) = 0;
  virtual FX_FLOAT GetDashPhase() const = 0;
  virtual void SetDashPhase(FX_FLOAT fPhase) = 0;
  virtual int32_t CountDashArray() const = 0;
  virtual int32_t GetDashArray(CFX_FloatArray& dashArray) const = 0;
  virtual void SetDashArray(const CFX_FloatArray& dashArray) = 0;
  virtual int32_t GetLineJoin() const = 0;
  virtual void SetLineJoin(int32_t iLineJoin) = 0;
  virtual FX_FLOAT GetMiterLimit() const = 0;
  virtual void SetMiterLimit(FX_FLOAT fMiterLimit) = 0;
  virtual int32_t CountCompoundPatterns() const = 0;
  virtual FX_BOOL GetCompoundPatterns(
      CFDE_CompoundPatterns& compoundPatterns) const = 0;
  virtual FX_BOOL SetCompoundPatterns(
      const CFDE_CompoundPatterns& compoundPatterns) = 0;
};

#endif  // XFA_FDE_FDE_PEN_H_
