// 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

#include "core/fpdfapi/fpdf_page/include/cpdf_path.h"

CPDF_Path::CPDF_Path() {}

CPDF_Path::CPDF_Path(const CPDF_Path& that) : m_Ref(that.m_Ref) {}

CPDF_Path::~CPDF_Path() {}

int CPDF_Path::GetPointCount() const {
  return m_Ref.GetObject()->GetPointCount();
}

void CPDF_Path::SetPointCount(int count) {
  m_Ref.GetPrivateCopy()->SetPointCount(count);
}

const FX_PATHPOINT* CPDF_Path::GetPoints() const {
  return m_Ref.GetObject()->GetPoints();
}

FX_PATHPOINT* CPDF_Path::GetMutablePoints() {
  return m_Ref.GetPrivateCopy()->GetPoints();
}

int CPDF_Path::GetFlag(int index) const {
  return m_Ref.GetObject()->GetFlag(index);
}

FX_FLOAT CPDF_Path::GetPointX(int index) const {
  return m_Ref.GetObject()->GetPointX(index);
}

FX_FLOAT CPDF_Path::GetPointY(int index) const {
  return m_Ref.GetObject()->GetPointY(index);
}

CFX_FloatRect CPDF_Path::GetBoundingBox() const {
  return m_Ref.GetObject()->GetBoundingBox();
}

CFX_FloatRect CPDF_Path::GetBoundingBox(FX_FLOAT line_width,
                                        FX_FLOAT miter_limit) const {
  return m_Ref.GetObject()->GetBoundingBox(line_width, miter_limit);
}

FX_BOOL CPDF_Path::IsRect() const {
  return m_Ref.GetObject()->IsRect();
}

void CPDF_Path::Transform(const CFX_Matrix* pMatrix) {
  m_Ref.GetPrivateCopy()->Transform(pMatrix);
}

void CPDF_Path::Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) {
  m_Ref.GetPrivateCopy()->Append(other.GetObject(), pMatrix);
}

void CPDF_Path::Append(const CFX_PathData* pData, const CFX_Matrix* pMatrix) {
  m_Ref.GetPrivateCopy()->Append(pData, pMatrix);
}

void CPDF_Path::AppendRect(FX_FLOAT left,
                           FX_FLOAT bottom,
                           FX_FLOAT right,
                           FX_FLOAT top) {
  m_Ref.GetPrivateCopy()->AppendRect(left, bottom, right, top);
}
