diff options
Diffstat (limited to 'xfa/fde/fde_iterator.cpp')
-rw-r--r-- | xfa/fde/fde_iterator.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/xfa/fde/fde_iterator.cpp b/xfa/fde/fde_iterator.cpp new file mode 100644 index 0000000000..50018b7942 --- /dev/null +++ b/xfa/fde/fde_iterator.cpp @@ -0,0 +1,98 @@ +// 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(FX_DWORD dwObjects) { + if (m_CanvasStack.GetSize() == 0) { + return FALSE; + } + while (m_CanvasStack.GetSize() > 1) { + m_CanvasStack.Pop(); + } + m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget; + if (dwObjects & FDE_VISUALOBJ_Widget) { + m_dwFilter |= 0xFF00; + } + 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; + } + FX_DWORD dwObj = + (eType == FDE_VISUALOBJ_Widget) + ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj) + : (FX_DWORD)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; +} |