// 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 "xfa/fxfa/cxfa_rendercontext.h"

#include "xfa/fxfa/cxfa_ffpageview.h"
#include "xfa/fxfa/cxfa_ffwidget.h"
#include "xfa/fxgraphics/cfx_graphics.h"

namespace {

const int32_t kMaxCount = 30;

}  // namsepace

CXFA_RenderContext::CXFA_RenderContext()
    : m_pWidget(nullptr), m_pPageView(nullptr), m_pGS(nullptr), m_dwStatus(0) {
  m_matrix.SetIdentity();
  m_rtClipRect.Reset();
}

CXFA_RenderContext::~CXFA_RenderContext() {}

int32_t CXFA_RenderContext::StartRender(CXFA_FFPageView* pPageView,
                                        CFX_Graphics* pGS,
                                        const CFX_Matrix& matrix,
                                        const CXFA_RenderOptions& options) {
  m_pPageView = pPageView;
  m_pGS = pGS;
  m_matrix = matrix;
  m_options = options;

  CFX_Matrix mtRes;
  mtRes.SetReverse(matrix);
  m_rtClipRect = pGS->GetClipRect();
  mtRes.TransformRect(m_rtClipRect);
  m_dwStatus = m_options.m_bHighlight ? XFA_WidgetStatus_Highlight : 0;
  uint32_t dwFilterType = XFA_WidgetStatus_Visible |
                          (m_options.m_bPrint ? XFA_WidgetStatus_Printable
                                              : XFA_WidgetStatus_Viewable);
  m_pWidgetIterator =
      m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType);
  m_pWidget = m_pWidgetIterator->MoveToNext();
  return XFA_RENDERSTATUS_Ready;
}

int32_t CXFA_RenderContext::DoRender(IFX_Pause* pPause) {
  int32_t iCount = 0;
  while (m_pWidget) {
    CXFA_FFWidget* pWidget = m_pWidget;
    CFX_RectF rtWidgetBox = pWidget->GetBBox(XFA_WidgetStatus_Visible);
    rtWidgetBox.width += 1;
    rtWidgetBox.height += 1;
    if (rtWidgetBox.IntersectWith(m_rtClipRect))
      pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);

    m_pWidget = m_pWidgetIterator->MoveToNext();
    iCount++;
    if (iCount > kMaxCount && pPause && pPause->NeedToPauseNow())
      return XFA_RENDERSTATUS_ToBeContinued;
  }
  return XFA_RENDERSTATUS_Done;
}

void CXFA_RenderContext::StopRender() {
  m_pWidgetIterator.reset();
}
