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