[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