From 147a2308c6b08719b2d199cc4fc41802cc8f508e Mon Sep 17 00:00:00 2001 From: David Capello Date: Fri, 26 Sep 2025 16:34:31 -0300 Subject: [PATCH] Add LayerFill type --- data/strings/en.ini | 1 + src/app/commands/cmd_new_layer.cpp | 15 ++++++++++++++- src/app/crash/read_document.cpp | 3 +++ src/app/crash/write_document.cpp | 1 + src/app/doc_api.cpp | 2 ++ src/doc/CMakeLists.txt | 1 + src/doc/layer_fill.cpp | 23 +++++++++++++++++++++++ src/doc/layer_fill.h | 27 +++++++++++++++++++++++++++ src/doc/layer_io.cpp | 5 +++++ src/doc/object_type.h | 14 ++++++++------ 10 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 src/doc/layer_fill.cpp create mode 100644 src/doc/layer_fill.h diff --git a/data/strings/en.ini b/data/strings/en.ini index 0c27a17c4..db3e2624e 100644 --- a/data/strings/en.ini +++ b/data/strings/en.ini @@ -365,6 +365,7 @@ NewLayer_Layer = Layer NewLayer_Group = Group NewLayer_ReferenceLayer = Reference Layer NewLayer_TilemapLayer = Tilemap +NewLayer_FillLayer = Fill NewLayer_MaskLayer = Mask NewLayer_FxLayer = Fx NewLayer_TextLayer = Text diff --git a/src/app/commands/cmd_new_layer.cpp b/src/app/commands/cmd_new_layer.cpp index 234614c67..ab37ff1e3 100644 --- a/src/app/commands/cmd_new_layer.cpp +++ b/src/app/commands/cmd_new_layer.cpp @@ -34,6 +34,7 @@ #include "app/util/new_image_from_mask.h" #include "doc/layer.h" #include "doc/layer_audio.h" +#include "doc/layer_fill.h" #include "doc/layer_fx.h" #include "doc/layer_hitbox.h" #include "doc/layer_mask.h" @@ -88,6 +89,7 @@ public: Group, ReferenceLayer, TilemapLayer, + FillLayer, MaskLayer, FxLayer, TextLayer, @@ -133,6 +135,8 @@ void NewLayerCommand::onLoadParams(const Params& commandParams) else if (params().tilemap() || params().type() == "tilemap") m_type = Type::TilemapLayer; #ifdef ENABLE_DEVMODE // TODO not yet production-ready + else if (params().type() == "fill") + m_type = Type::FillLayer; else if (params().type() == "mask") m_type = Type::MaskLayer; else if (params().type() == "fx") @@ -331,6 +335,14 @@ void NewLayerCommand::onExecute(Context* context) break; } + case Type::FillLayer: { + layer = new LayerFill(parent->sprite()); + layer->setName(name); + + api.addLayer(parent, layer, parent->lastLayer()); + break; + } + case Type::MaskLayer: { layer = new LayerMask(parent->sprite()); layer->setName(name); @@ -627,8 +639,9 @@ std::string NewLayerCommand::layerPrefix() const case Type::Group: return Strings::commands_NewLayer_Group(); case Type::ReferenceLayer: return Strings::commands_NewLayer_ReferenceLayer(); case Type::TilemapLayer: return Strings::commands_NewLayer_TilemapLayer(); - case Type::FxLayer: return Strings::commands_NewLayer_FxLayer(); + case Type::FillLayer: return Strings::commands_NewLayer_FillLayer(); case Type::MaskLayer: return Strings::commands_NewLayer_MaskLayer(); + case Type::FxLayer: return Strings::commands_NewLayer_FxLayer(); case Type::TextLayer: return Strings::commands_NewLayer_TextLayer(); case Type::VectorLayer: return Strings::commands_NewLayer_VectorLayer(); case Type::AudioLayer: return Strings::commands_NewLayer_AudioLayer(); diff --git a/src/app/crash/read_document.cpp b/src/app/crash/read_document.cpp index 873b67dab..427eec12c 100644 --- a/src/app/crash/read_document.cpp +++ b/src/app/crash/read_document.cpp @@ -29,6 +29,7 @@ #include "doc/image_io.h" #include "doc/layer.h" #include "doc/layer_audio.h" +#include "doc/layer_fill.h" #include "doc/layer_fx.h" #include "doc/layer_hitbox.h" #include "doc/layer_mask.h" @@ -477,6 +478,8 @@ private: case ObjectType::LayerGroup: lay = std::make_unique(m_sprite); break; + case ObjectType::LayerFill: lay = std::make_unique(m_sprite); break; + case ObjectType::LayerMask: lay = std::make_unique(m_sprite); break; case ObjectType::LayerFx: lay = std::make_unique(m_sprite); break; diff --git a/src/app/crash/write_document.cpp b/src/app/crash/write_document.cpp index 5f1ec558d..9f21407b6 100644 --- a/src/app/crash/write_document.cpp +++ b/src/app/crash/write_document.cpp @@ -265,6 +265,7 @@ private: // writeSprite/writeAllLayersID() functions) break; + case ObjectType::LayerFill: case ObjectType::LayerMask: case ObjectType::LayerFx: case ObjectType::LayerText: diff --git a/src/app/doc_api.cpp b/src/app/doc_api.cpp index 7e75cff3b..9fd04aec2 100644 --- a/src/app/doc_api.cpp +++ b/src/app/doc_api.cpp @@ -54,6 +54,7 @@ #include "doc/algorithm/shrink_bounds.h" #include "doc/cel.h" #include "doc/layer_audio.h" +#include "doc/layer_fill.h" #include "doc/layer_fx.h" #include "doc/layer_hitbox.h" #include "doc/layer_mask.h" @@ -724,6 +725,7 @@ Layer* DocApi::copyLayerWithSprite(doc::Layer* layer, doc::Sprite* sprite) break; } + case ObjectType::LayerFill: clone = std::make_unique(sprite); break; case ObjectType::LayerMask: clone = std::make_unique(sprite); break; case ObjectType::LayerFx: clone = std::make_unique(sprite); break; case ObjectType::LayerText: clone = std::make_unique(sprite); break; diff --git a/src/doc/CMakeLists.txt b/src/doc/CMakeLists.txt index 1aabade33..d368a4b05 100644 --- a/src/doc/CMakeLists.txt +++ b/src/doc/CMakeLists.txt @@ -48,6 +48,7 @@ add_library(doc-lib image_iterators2.cpp layer.cpp layer_audio.cpp + layer_fill.cpp layer_fx.cpp layer_hitbox.cpp layer_io.cpp diff --git a/src/doc/layer_fill.cpp b/src/doc/layer_fill.cpp new file mode 100644 index 000000000..d1bbe1757 --- /dev/null +++ b/src/doc/layer_fill.cpp @@ -0,0 +1,23 @@ +// Aseprite Document Library +// Copyright (c) 2025 Igara Studio S.A. +// +// 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/layer_fill.h" + +namespace doc { + +LayerFill::LayerFill(Sprite* sprite) : Layer(ObjectType::LayerFill, sprite) +{ +} + +LayerFill::~LayerFill() +{ +} + +} // namespace doc diff --git a/src/doc/layer_fill.h b/src/doc/layer_fill.h new file mode 100644 index 000000000..e49c59a8b --- /dev/null +++ b/src/doc/layer_fill.h @@ -0,0 +1,27 @@ +// Aseprite Document Library +// Copyright (C) 2025 Igara Studio S.A. +// +// This file is released under the terms of the MIT license. +// Read LICENSE.txt for more information. + +#ifndef DOC_LAYER_FILL_H_INCLUDED +#define DOC_LAYER_FILL_H_INCLUDED +#pragma once + +#include "doc/layer.h" + +namespace doc { + +// Fills the whole canvas with a solid color or a gradient. +// TODO to implement +class LayerFill final : public Layer { +public: + LayerFill(Sprite* sprite); + virtual ~LayerFill(); + + // TODO associated fill data per frame/keyframe +}; + +} // namespace doc + +#endif diff --git a/src/doc/layer_io.cpp b/src/doc/layer_io.cpp index bc9f75f7b..af3a81074 100644 --- a/src/doc/layer_io.cpp +++ b/src/doc/layer_io.cpp @@ -19,6 +19,7 @@ #include "doc/image_io.h" #include "doc/layer.h" #include "doc/layer_audio.h" +#include "doc/layer_fill.h" #include "doc/layer_fx.h" #include "doc/layer_hitbox.h" #include "doc/layer_io.h" @@ -132,6 +133,7 @@ Layer* read_layer(std::istream& is, SubObjectsFromSprite* subObjects, const Seri switch (static_cast(layer_type)) { case ObjectType::LayerImage: case ObjectType::LayerTilemap: + case ObjectType::LayerFill: case ObjectType::LayerMask: case ObjectType::LayerFx: case ObjectType::LayerText: @@ -147,6 +149,9 @@ Layer* read_layer(std::istream& is, SubObjectsFromSprite* subObjects, const Seri case ObjectType::LayerTilemap: layer = std::make_unique(subObjects->sprite(), 0); break; + case ObjectType::LayerFill: + layer = std::make_unique(subObjects->sprite()); + break; case ObjectType::LayerMask: layer = std::make_unique(subObjects->sprite()); break; diff --git a/src/doc/object_type.h b/src/doc/object_type.h index 725261aac..60076b08b 100644 --- a/src/doc/object_type.h +++ b/src/doc/object_type.h @@ -38,13 +38,15 @@ enum class ObjectType : uint16_t { Tileset = 15, Tilesets = 16, - LayerMask = 17, - LayerFx = 18, - LayerText = 19, - LayerVector = 20, - LayerAudio = 21, - LayerSubsprite = 22, + LayerFill = 17, + LayerMask = 18, + LayerFx = 19, + LayerText = 20, + LayerVector = 21, + LayerAudio = 22, LayerHitbox = 23, + + LayerSubsprite = 24, }; } // namespace doc