[aseprite] 96/128: New option for paint bucket using all layers as reference/stop fill (fix #969)
Tobias Hansen
thansen at moszumanska.debian.org
Mon May 9 21:24:27 UTC 2016
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit 6dc9bb984daaa08c6a32161206fe280f8e8b27cc
Author: David Capello <davidcapello at gmail.com>
Date: Tue May 3 15:31:27 2016 -0300
New option for paint bucket using all layers as reference/stop fill (fix #969)
---
data/pref.xml | 5 +++
src/app/tools/point_shapes.h | 6 ++--
src/app/tools/tool_loop.h | 3 ++
src/app/ui/context_bar.cpp | 63 +++++++++++++++++++++++++-----------
src/app/ui/context_bar.h | 4 +--
src/app/ui/editor/tool_loop_impl.cpp | 30 +++++++++++++++++
src/app/util/expand_cel_canvas.cpp | 1 -
7 files changed, 88 insertions(+), 24 deletions(-)
diff --git a/data/pref.xml b/data/pref.xml
index 9b6daa1..a298666 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -36,6 +36,10 @@
<value id="IF_VISIBLE" value="1" />
<value id="ALWAYS" value="2" />
</enum>
+ <enum id="FillReferTo">
+ <value id="ACTIVE_LAYER" value="0" />
+ <value id="ALL_LAYERS" value="1" />
+ </enum>
<enum id="EyedropperChannel">
<value id="COLOR_ALPHA" value="0" />
<value id="COLOR" value="1" />
@@ -210,6 +214,7 @@
</section>
<section id="floodfill">
<option id="stop_at_grid" type="StopAtGrid" default="StopAtGrid::IF_VISIBLE" />
+ <option id="refer_to" type="FillReferTo" default="FillReferTo::ACTIVE_LAYER" />
</section>
</tool>
diff --git a/src/app/tools/point_shapes.h b/src/app/tools/point_shapes.h
index 292f3a1..61bf874 100644
--- a/src/app/tools/point_shapes.h
+++ b/src/app/tools/point_shapes.h
@@ -1,5 +1,5 @@
// Aseprite
-// Copyright (C) 2001-2015 David Capello
+// Copyright (C) 2001-2016 David Capello
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
@@ -83,7 +83,7 @@ public:
void transformPoint(ToolLoop* loop, int x, int y) override {
doc::algorithm::floodfill(
- loop->getSrcImage(),
+ loop->getFloodFillSrcImage(),
(loop->useMask() ? loop->getMask(): nullptr),
x, y,
floodfillBounds(loop, x, y),
@@ -104,7 +104,7 @@ private:
loop->sprite()->height());
bounds = bounds.createIntersection(
- loop->getSrcImage()->bounds());
+ loop->getFloodFillSrcImage()->bounds());
// Limit the flood-fill to the current tile if the grid is visible.
if (loop->getStopAtGrid()) {
diff --git a/src/app/tools/tool_loop.h b/src/app/tools/tool_loop.h
index ae7ab88..12e7443 100644
--- a/src/app/tools/tool_loop.h
+++ b/src/app/tools/tool_loop.h
@@ -83,6 +83,9 @@ namespace app {
// Should return an image where we can read pixels (readonly image)
virtual const Image* getSrcImage() = 0;
+ // The image used to get get pixels in floodfill algorithm.
+ virtual const Image* getFloodFillSrcImage() = 0;
+
// Should return an image where we can write pixels
virtual Image* getDstImage() = 0;
diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp
index 7665745..d746df8 100644
--- a/src/app/ui/context_bar.cpp
+++ b/src/app/ui/context_bar.cpp
@@ -279,28 +279,57 @@ protected:
}
};
-class ContextBar::StopAtGridField : public CheckBox
-{
+class ContextBar::PaintBucketSettingsField : public ButtonSet {
public:
- StopAtGridField() : CheckBox("Stop at Grid") {
- setup_mini_font(this);
- }
-
- void setStopAtGrid(bool state) {
- setSelected(state);
+ PaintBucketSettingsField() : ButtonSet(1) {
+ SkinTheme* theme = SkinTheme::instance();
+ addItem(theme->parts.timelineGear());
}
protected:
- void onClick(Event& ev) override {
- CheckBox::onClick(ev);
+ void onItemChange(Item* item) override {
+ ButtonSet::onItemChange(item);
+ const gfx::Rect bounds = this->bounds();
Tool* tool = App::instance()->activeTool();
- Preferences::instance().tool(tool).floodfill.stopAtGrid(
- (isSelected() ? app::gen::StopAtGrid::IF_VISIBLE:
- app::gen::StopAtGrid::NEVER));
+ auto& toolPref = Preferences::instance().tool(tool);
- releaseFocus();
+ Menu menu;
+ MenuItem
+ stopAtGrid("Stop at Grid"),
+ activeLayer("Refer only active layer"),
+ allLayers("Refer visible layers");
+ menu.addChild(&stopAtGrid);
+ menu.addChild(new MenuSeparator());
+ menu.addChild(&activeLayer);
+ menu.addChild(&allLayers);
+
+ stopAtGrid.setSelected(
+ toolPref.floodfill.stopAtGrid() == app::gen::StopAtGrid::IF_VISIBLE);
+ activeLayer.setSelected(
+ toolPref.floodfill.referTo() == app::gen::FillReferTo::ACTIVE_LAYER);
+ allLayers.setSelected(
+ toolPref.floodfill.referTo() == app::gen::FillReferTo::ALL_LAYERS);
+
+ stopAtGrid.Click.connect(
+ [&]{
+ toolPref.floodfill.stopAtGrid(
+ toolPref.floodfill.stopAtGrid() == app::gen::StopAtGrid::IF_VISIBLE ?
+ app::gen::StopAtGrid::NEVER: app::gen::StopAtGrid::IF_VISIBLE);
+ });
+ activeLayer.Click.connect(
+ [&]{
+ toolPref.floodfill.referTo(app::gen::FillReferTo::ACTIVE_LAYER);
+ });
+ allLayers.Click.connect(
+ [&]{
+ toolPref.floodfill.referTo(app::gen::FillReferTo::ALL_LAYERS);
+ });
+
+ menu.showPopup(gfx::Point(bounds.x, bounds.y+bounds.h));
+ deselectItems();
}
+
};
class ContextBar::InkTypeField : public ButtonSet {
@@ -1286,7 +1315,7 @@ ContextBar::ContextBar()
addChild(m_toleranceLabel = new Label("Tolerance:"));
addChild(m_tolerance = new ToleranceField());
addChild(m_contiguous = new ContiguousField());
- addChild(m_stopAtGrid = new StopAtGridField());
+ addChild(m_paintBucketSettings = new PaintBucketSettingsField());
addChild(m_inkType = new InkTypeField(this));
addChild(m_inkOpacityLabel = new Label("Opacity:"));
@@ -1506,8 +1535,6 @@ void ContextBar::updateForTool(tools::Tool* tool)
if (toolPref) {
m_tolerance->setTextf("%d", toolPref->tolerance());
m_contiguous->setSelected(toolPref->contiguous());
- m_stopAtGrid->setSelected(
- toolPref->floodfill.stopAtGrid() == app::gen::StopAtGrid::IF_VISIBLE ? true: false);
m_inkType->setInkTypeIcon(toolPref->ink());
m_inkOpacity->setTextf("%d", toolPref->opacity());
@@ -1590,7 +1617,7 @@ void ContextBar::updateForTool(tools::Tool* tool)
m_toleranceLabel->setVisible(hasTolerance);
m_tolerance->setVisible(hasTolerance);
m_contiguous->setVisible(hasTolerance);
- m_stopAtGrid->setVisible(hasTolerance);
+ m_paintBucketSettings->setVisible(hasTolerance);
m_sprayBox->setVisible(hasSprayOptions);
m_selectionOptionsBox->setVisible(hasSelectOptions);
m_selectionMode->setVisible(true);
diff --git a/src/app/ui/context_bar.h b/src/app/ui/context_bar.h
index 0f3075f..7a4a724 100644
--- a/src/app/ui/context_bar.h
+++ b/src/app/ui/context_bar.h
@@ -92,7 +92,7 @@ namespace app {
class BrushSizeField;
class ToleranceField;
class ContiguousField;
- class StopAtGridField;
+ class PaintBucketSettingsField;
class InkTypeField;
class InkOpacityField;
class InkShadesField;
@@ -115,7 +115,7 @@ namespace app {
ui::Label* m_toleranceLabel;
ToleranceField* m_tolerance;
ContiguousField* m_contiguous;
- StopAtGridField* m_stopAtGrid;
+ PaintBucketSettingsField* m_paintBucketSettings;
InkTypeField* m_inkType;
ui::Label* m_inkOpacityLabel;
InkOpacityField* m_inkOpacity;
diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp
index c787455..9ebd43f 100644
--- a/src/app/ui/editor/tool_loop_impl.cpp
+++ b/src/app/ui/editor/tool_loop_impl.cpp
@@ -46,6 +46,7 @@
#include "doc/palette_picks.h"
#include "doc/remap.h"
#include "doc/sprite.h"
+#include "render/render.h"
#include "ui/ui.h"
namespace app {
@@ -269,6 +270,7 @@ class ToolLoopImpl : public ToolLoopBase {
bool m_canceled;
Transaction m_transaction;
ExpandCelCanvas m_expandCelCanvas;
+ Image* m_floodfillSrcImage;
public:
ToolLoopImpl(Editor* editor,
@@ -344,6 +346,32 @@ public:
m_maskOrigin = (!m_mask->isEmpty() ? gfx::Point(m_mask->bounds().x-m_celOrigin.x,
m_mask->bounds().y-m_celOrigin.y):
gfx::Point(0, 0));
+
+ // Prepare a special image for floodfill when it's configured to
+ // stop using all visible layers.
+ if (m_pointShape->isFloodFill() &&
+ m_toolPref.floodfill.referTo() == gen::FillReferTo::ALL_LAYERS) {
+ m_floodfillSrcImage = Image::create(m_sprite->pixelFormat(),
+ m_sprite->width(),
+ m_sprite->height());
+
+ m_floodfillSrcImage->clear(m_sprite->transparentColor());
+
+ render::Render().renderSprite(
+ m_floodfillSrcImage,
+ m_sprite,
+ m_frame,
+ gfx::Clip(m_sprite->bounds()),
+ render::Zoom(1, 1));
+ }
+ else {
+ m_floodfillSrcImage = const_cast<Image*>(getSrcImage());
+ }
+ }
+
+ ~ToolLoopImpl() {
+ if (m_floodfillSrcImage != getSrcImage())
+ delete m_floodfillSrcImage;
}
// IToolLoop interface
@@ -394,6 +422,7 @@ public:
}
const Image* getSrcImage() override { return m_expandCelCanvas.getSourceCanvas(); }
+ const Image* getFloodFillSrcImage() override { return m_floodfillSrcImage; }
Image* getDstImage() override { return m_expandCelCanvas.getDestCanvas(); }
void validateSrcImage(const gfx::Region& rgn) override {
m_expandCelCanvas.validateSourceCanvas(rgn);
@@ -541,6 +570,7 @@ public:
// IToolLoop interface
void dispose() override { }
const Image* getSrcImage() override { return m_image; }
+ const Image* getFloodFillSrcImage() override { return m_image; }
Image* getDstImage() override { return m_image; }
void validateSrcImage(const gfx::Region& rgn) override { }
void validateDstImage(const gfx::Region& rgn) override { }
diff --git a/src/app/util/expand_cel_canvas.cpp b/src/app/util/expand_cel_canvas.cpp
index 3cc41c2..dc2b3a3 100644
--- a/src/app/util/expand_cel_canvas.cpp
+++ b/src/app/util/expand_cel_canvas.cpp
@@ -27,7 +27,6 @@
#include "doc/primitives.h"
#include "doc/site.h"
#include "doc/sprite.h"
-#include "render/render.h"
namespace {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git
More information about the Pkg-games-commits
mailing list