// Copyright 2016 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_FXFA_PARSER_CXFA_STROKE_H_
#define XFA_FXFA_PARSER_CXFA_STROKE_H_

#include "core/fxge/dib/fx_dib.h"
#include "xfa/fxfa/fxfa_basic.h"
#include "xfa/fxfa/parser/cxfa_node.h"

enum StrokeSameStyle {
  XFA_STROKE_SAMESTYLE_NoPresence = 1,
  XFA_STROKE_SAMESTYLE_Corner = 2
};

class CFGAS_GEGraphics;
class CFGAS_GEPath;
class CXFA_Node;

void XFA_StrokeTypeSetLineDash(CFGAS_GEGraphics* pGraphics,
                               XFA_AttributeValue iStrokeType,
                               XFA_AttributeValue iCapType);

class CXFA_Stroke : public CXFA_Node {
 public:
  CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
  ~CXFA_Stroke() override;

  bool IsCorner() const { return GetElementType() == XFA_Element::Corner; }
  bool IsVisible();
  bool IsInverted();

  XFA_AttributeValue GetCapType();
  XFA_AttributeValue GetStrokeType();
  XFA_AttributeValue GetJoinType();
  float GetRadius() const;
  float GetThickness() const;

  CXFA_Measurement GetMSThickness() const;
  void SetMSThickness(CXFA_Measurement msThinkness);

  FX_ARGB GetColor();
  void SetColor(FX_ARGB argb);

  bool SameStyles(CXFA_Stroke* stroke, uint32_t dwFlags);

  void Stroke(CFGAS_GEPath* pPath,
              CFGAS_GEGraphics* pGS,
              const CFX_Matrix& matrix);

 protected:
  CXFA_Stroke(CXFA_Document* pDoc,
              XFA_PacketType ePacket,
              uint32_t validPackets,
              XFA_ObjectType oType,
              XFA_Element eType,
              pdfium::span<const PropertyData> properties,
              pdfium::span<const AttributeData> attributes,
              CJX_Object* js_node);
};

#endif  // XFA_FXFA_PARSER_CXFA_STROKE_H_
