// 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

#include "../../../include/fpdfapi/fpdf_page.h"
#include "../../../include/fpdfapi/fpdf_pageobj.h"
#include "../../../include/fpdfapi/fpdf_module.h"
#include "pageint.h"
void CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)
{
    const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;
    m_Path = pSrcObj->m_Path;
    m_FillType = pSrcObj->m_FillType;
    m_bStroke = pSrcObj->m_bStroke;
    m_Matrix = pSrcObj->m_Matrix;
}
void CPDF_PathObject::Transform(const CPDF_Matrix& matrix)
{
    m_Matrix.Concat(matrix);
    CalcBoundingBox();
}
void CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)
{
    m_GraphState = GraphState;
    CalcBoundingBox();
}
void CPDF_PathObject::CalcBoundingBox()
{
    if (m_Path.IsNull()) {
        return;
    }
    CFX_FloatRect rect;
    FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;
    if (m_bStroke && width != 0) {
        rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);
    } else {
        rect = m_Path.GetBoundingBox();
    }
    rect.Transform(&m_Matrix);
    if (width == 0 && m_bStroke) {
        rect.left += -0.5f;
        rect.right += 0.5f;
        rect.bottom += -0.5f;
        rect.top += 0.5f;
    }
    m_Left = rect.left;
    m_Right = rect.right;
    m_Top = rect.top;
    m_Bottom = rect.bottom;
}
