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 <[email protected]> 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 _______________________________________________ Pkg-games-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

