| 1 | // Aseprite
|
| 2 | // Copyright (C) 2019 Igara Studio S.A.
|
| 3 | // Copyright (C) 2001-2018 David Capello
|
| 4 | //
|
| 5 | // This program is distributed under the terms of
|
| 6 | // the End-User License Agreement for Aseprite.
|
| 7 |
|
| 8 | #ifdef HAVE_CONFIG_H
|
| 9 | #include "config.h"
|
| 10 | #endif
|
| 11 |
|
| 12 | #include "doc/cel.h"
|
| 13 | #include "doc/frame.h"
|
| 14 | #include "doc/image.h"
|
| 15 | #include "doc/layer.h"
|
| 16 | #include "doc/sprite.h"
|
| 17 | #include "gfx/rect.h"
|
| 18 | #include "render/render.h"
|
| 19 |
|
| 20 | #include <memory>
|
| 21 |
|
| 22 | namespace app {
|
| 23 |
|
| 24 | using namespace doc;
|
| 25 |
|
| 26 | static bool has_cels(const Layer* layer, frame_t frame);
|
| 27 |
|
| 28 | LayerImage* create_flatten_layer_copy(Sprite* dstSprite, const Layer* srcLayer,
|
| 29 | const gfx::Rect& bounds,
|
| 30 | frame_t frmin, frame_t frmax,
|
| 31 | const bool newBlend)
|
| 32 | {
|
| 33 | std::unique_ptr<LayerImage> flatLayer(new LayerImage(dstSprite));
|
| 34 | render::Render render;
|
| 35 | render.setNewBlend(newBlend);
|
| 36 |
|
| 37 | for (frame_t frame=frmin; frame<=frmax; ++frame) {
|
| 38 | // Does this frame have cels to render?
|
| 39 | if (has_cels(srcLayer, frame)) {
|
| 40 | // Create a new image to render each frame.
|
| 41 | ImageRef image(Image::create(flatLayer->sprite()->pixelFormat(), bounds.w, bounds.h));
|
| 42 |
|
| 43 | // Create the new cel for the output layer.
|
| 44 | std::unique_ptr<Cel> cel(new Cel(frame, image));
|
| 45 | cel->setPosition(bounds.x, bounds.y);
|
| 46 |
|
| 47 | // Render this frame.
|
| 48 | render.renderLayer(image.get(), srcLayer, frame,
|
| 49 | gfx::Clip(0, 0, bounds));
|
| 50 |
|
| 51 | // Add the cel (and release the std::unique_ptr).
|
| 52 | flatLayer->addCel(cel.get());
|
| 53 | cel.release();
|
| 54 | }
|
| 55 | }
|
| 56 |
|
| 57 | return flatLayer.release();
|
| 58 | }
|
| 59 |
|
| 60 | // Returns true if the "layer" or its children have any cel to render
|
| 61 | // in the given "frame".
|
| 62 | static bool has_cels(const Layer* layer, frame_t frame)
|
| 63 | {
|
| 64 | if (!layer->isVisible())
|
| 65 | return false;
|
| 66 |
|
| 67 | switch (layer->type()) {
|
| 68 |
|
| 69 | case ObjectType::LayerImage:
|
| 70 | return (layer->cel(frame) ? true: false);
|
| 71 |
|
| 72 | case ObjectType::LayerGroup: {
|
| 73 | for (const Layer* child : static_cast<const LayerGroup*>(layer)->layers()) {
|
| 74 | if (has_cels(child, frame))
|
| 75 | return true;
|
| 76 | }
|
| 77 | break;
|
| 78 | }
|
| 79 |
|
| 80 | }
|
| 81 |
|
| 82 | return false;
|
| 83 | }
|
| 84 |
|
| 85 | } // namespace app
|
| 86 | |