// 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/fde/fde_iterator.h"

#include "xfa/fgas/crt/fgas_utils.h"

IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create() {
  return new CFDE_VisualSetIterator;
}
CFDE_VisualSetIterator::CFDE_VisualSetIterator() : m_dwFilter(0) {}
CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {
  m_CanvasStack.RemoveAll();
}
FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet* pCanvas) {
  FXSYS_assert(pCanvas != NULL);
  m_CanvasStack.RemoveAll();
  FDE_CANVASITEM canvas;
  canvas.hCanvas = NULL;
  canvas.pCanvas = pCanvas;
  canvas.hPos = pCanvas->GetFirstPosition(NULL);
  if (canvas.hPos == NULL) {
    return FALSE;
  }
  return m_CanvasStack.Push(canvas) == 0;
}
FX_BOOL CFDE_VisualSetIterator::FilterObjects(uint32_t dwObjects) {
  if (m_CanvasStack.GetSize() == 0)
    return FALSE;

  while (m_CanvasStack.GetSize() > 1)
    m_CanvasStack.Pop();

  m_dwFilter = dwObjects;

  FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
  FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);
  return pCanvas->hPos != NULL;
}
void CFDE_VisualSetIterator::Reset() {
  FilterObjects(m_dwFilter);
}
FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet*& pVisualSet,
                                               FDE_HVISUALOBJ* phCanvasObj,
                                               IFDE_CanvasSet** ppCanvasSet) {
  while (m_CanvasStack.GetSize() > 0) {
    FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
    FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
    if (pCanvas->hPos == NULL) {
      if (m_CanvasStack.GetSize() == 1) {
        break;
      }
      m_CanvasStack.Pop();
      continue;
    }
    do {
      FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(
          pCanvas->hCanvas, pCanvas->hPos, pVisualSet);
      FXSYS_assert(hObj != NULL);
      FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
      if (eType == FDE_VISUALOBJ_Canvas) {
        FDE_CANVASITEM canvas;
        canvas.hCanvas = hObj;
        canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;
        canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj);
        m_CanvasStack.Push(canvas);
        break;
      }
      uint32_t dwObj = (uint32_t)eType;
      if ((m_dwFilter & dwObj) != 0) {
        if (ppCanvasSet) {
          *ppCanvasSet = pCanvas->pCanvas;
        }
        if (phCanvasObj) {
          *phCanvasObj = pCanvas->hCanvas;
        }
        return hObj;
      }
    } while (pCanvas->hPos != NULL);
  }
  if (ppCanvasSet) {
    *ppCanvasSet = NULL;
  }
  if (phCanvasObj) {
    *phCanvasObj = NULL;
  }
  pVisualSet = NULL;
  return NULL;
}
