mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-06 14:59:50 +00:00
afdb6b511f
We have to iterate all layers on commands that modify the whole sprite. It doesn't matter if the layer is "browsable" (e.g. it's expanded or collapsed).
103 lines
2.4 KiB
C++
103 lines
2.4 KiB
C++
// Aseprite Document Library
|
|
// Copyright (c) 2001-2016 David Capello
|
|
//
|
|
// This file is released under the terms of the MIT license.
|
|
// Read LICENSE.txt for more information.
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "doc/cels_range.h"
|
|
|
|
#include "doc/cel.h"
|
|
#include "doc/layer.h"
|
|
#include "doc/sprite.h"
|
|
|
|
namespace doc {
|
|
|
|
CelsRange::CelsRange(const Sprite* sprite,
|
|
const SelectedFrames& selFrames,
|
|
const Flags flags)
|
|
: m_selFrames(selFrames)
|
|
, m_begin(sprite, m_selFrames, flags)
|
|
, m_end(m_selFrames)
|
|
{
|
|
}
|
|
|
|
CelsRange::iterator::iterator(const SelectedFrames& selFrames)
|
|
: m_cel(nullptr)
|
|
, m_selFrames(selFrames)
|
|
, m_frameIterator(selFrames.begin())
|
|
{
|
|
}
|
|
|
|
CelsRange::iterator::iterator(const Sprite* sprite,
|
|
const SelectedFrames& selFrames,
|
|
const CelsRange::Flags flags)
|
|
: m_cel(nullptr)
|
|
, m_selFrames(selFrames)
|
|
, m_frameIterator(selFrames.begin())
|
|
, m_flags(flags)
|
|
{
|
|
// Get first cel
|
|
Layer* layer = sprite->root()->firstLayerInWholeHierarchy();
|
|
while (layer && !m_cel) {
|
|
if (layer->isImage()) {
|
|
m_frameIterator = m_selFrames.begin();
|
|
auto endFrame = m_selFrames.end();
|
|
for (; m_frameIterator!=endFrame; ++m_frameIterator) {
|
|
m_cel = layer->cel(*m_frameIterator);
|
|
if (m_cel)
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!m_cel)
|
|
layer = layer->getNextInWholeHierarchy();
|
|
}
|
|
|
|
if (m_cel && flags == CelsRange::UNIQUE)
|
|
m_visited.insert(m_cel->data()->id());
|
|
}
|
|
|
|
CelsRange::iterator& CelsRange::iterator::operator++()
|
|
{
|
|
if (!m_cel)
|
|
return *this;
|
|
|
|
auto endFrame = m_selFrames.end();
|
|
if (m_frameIterator != endFrame)
|
|
++m_frameIterator;
|
|
|
|
Layer* layer = m_cel->layer();
|
|
m_cel = nullptr;
|
|
while (layer && !m_cel) {
|
|
if (layer->isImage()) {
|
|
for (; m_frameIterator!=endFrame; ++m_frameIterator) {
|
|
m_cel = layer->cel(*m_frameIterator);
|
|
if (m_cel) {
|
|
if (m_flags == CelsRange::UNIQUE) {
|
|
if (m_visited.find(m_cel->data()->id()) == m_visited.end()) {
|
|
m_visited.insert(m_cel->data()->id());
|
|
break;
|
|
}
|
|
else
|
|
m_cel = nullptr;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!m_cel) {
|
|
layer = layer->getNextInWholeHierarchy();
|
|
m_frameIterator = m_selFrames.begin();
|
|
}
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
} // namespace doc
|