[aseprite] 264/308: Change custom brush color when we change fg/bg colors

Tobias Hansen thansen at moszumanska.debian.org
Tue Mar 8 02:45:18 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 5c61e9219379c7596d69d1482909685e1a9b7314
Author: David Capello <davidcapello at gmail.com>
Date:   Thu Feb 25 18:48:59 2016 -0300

    Change custom brush color when we change fg/bg colors
---
 src/app/ui/context_bar.cpp |  29 ++++++++++--
 src/app/ui/context_bar.h   |   3 +-
 src/doc/brush.cpp          | 110 ++++++++++++++++++++++++++++++++++++++++++++-
 src/doc/brush.h            |   6 ++-
 4 files changed, 142 insertions(+), 6 deletions(-)

diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp
index 7367157..751a680 100644
--- a/src/app/ui/context_bar.cpp
+++ b/src/app/ui/context_bar.cpp
@@ -1344,11 +1344,15 @@ ContextBar::ContextBar()
   m_freehandAlgo->setupTooltips(tooltipManager);
   m_symmetry->setupTooltips(tooltipManager);
 
-  Preferences::instance().toolBox.activeTool.AfterChange.connect(
+  auto& pref = Preferences::instance();
+  pref.toolBox.activeTool.AfterChange.connect(
     base::Bind<void>(&ContextBar::onCurrentToolChange, this));
-
-  Preferences::instance().symmetryMode.enabled.AfterChange.connect(
+  pref.symmetryMode.enabled.AfterChange.connect(
     base::Bind<void>(&ContextBar::onSymmetryModeChange, this));
+  pref.colorBar.fgColor.AfterChange.connect(
+    base::Bind<void>(&ContextBar::onFgOrBgColorChange, this, doc::Brush::ImageColor::MainColor));
+  pref.colorBar.bgColor.AfterChange.connect(
+    base::Bind<void>(&ContextBar::onFgOrBgColorChange, this, doc::Brush::ImageColor::BackgroundColor));
 
   m_dropPixels->DropPixels.connect(&ContextBar::onDropPixels, this);
 
@@ -1405,6 +1409,25 @@ void ContextBar::onSymmetryModeChange()
   updateForCurrentTool();
 }
 
+void ContextBar::onFgOrBgColorChange(doc::Brush::ImageColor imageColor)
+{
+  if (!m_activeBrush)
+    return;
+
+  if (m_activeBrush->type() == kImageBrushType) {
+    ASSERT(m_activeBrush->image());
+
+    auto& pref = Preferences::instance();
+    m_activeBrush->setImageColor(
+      imageColor,
+      color_utils::color_for_image(
+        (imageColor == doc::Brush::ImageColor::MainColor ?
+         pref.colorBar.fgColor():
+         pref.colorBar.bgColor()),
+        m_activeBrush->image()->pixelFormat()));
+  }
+}
+
 void ContextBar::onDropPixels(ContextBarObserver::DropAction action)
 {
   notifyObservers(&ContextBarObserver::onDropPixels, action);
diff --git a/src/app/ui/context_bar.h b/src/app/ui/context_bar.h
index d027045..6424a2c 100644
--- a/src/app/ui/context_bar.h
+++ b/src/app/ui/context_bar.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
@@ -79,6 +79,7 @@ namespace app {
     void onBrushAngleChange();
     void onCurrentToolChange();
     void onSymmetryModeChange();
+    void onFgOrBgColorChange(doc::Brush::ImageColor imageColor);
     void onDropPixels(ContextBarObserver::DropAction action);
 
     class BrushTypeField;
diff --git a/src/doc/brush.cpp b/src/doc/brush.cpp
index a5e234b..3dd984d 100644
--- a/src/doc/brush.cpp
+++ b/src/doc/brush.cpp
@@ -1,5 +1,5 @@
 // Aseprite Document Library
-// Copyright (c) 2001-2015 David Capello
+// Copyright (c) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -14,6 +14,7 @@
 #include "doc/algo.h"
 #include "doc/algorithm/polygon.h"
 #include "doc/image.h"
+#include "doc/image_impl.h"
 #include "doc/primitives.h"
 
 #include <cmath>
@@ -92,6 +93,113 @@ void Brush::setImage(const Image* image)
     m_image.get()->width(), m_image.get()->height());
 }
 
+template<class ImageTraits,
+         color_t color_mask,
+         color_t alpha_mask>
+static void replace_image_colors(Image* image,
+                                 Brush::ImageColor imageColor,
+                                 color_t color)
+{
+  typename LockImageBits<ImageTraits> bits(image, Image::ReadWriteLock);
+  bool hasAlpha = false; // True if "image" has a pixel with alpha < 255
+  color_t mainColor, bgColor;
+  color_t maskColor = image->maskColor();
+
+  mainColor = bgColor = 0;
+
+  for (const auto& pixel : bits) {
+    if ((pixel & alpha_mask) != alpha_mask) {  // If alpha != 255
+      hasAlpha = true;
+    }
+    else if (bgColor == 0) {
+      mainColor = bgColor = pixel;
+    }
+    else if (pixel != bgColor && mainColor == bgColor) {
+      mainColor = pixel;
+    }
+  }
+
+  color &= color_mask;
+
+  if (hasAlpha) {
+    for (auto& pixel : bits)
+      pixel = (pixel & alpha_mask) | color;
+  }
+  else {
+    for (auto& pixel : bits) {
+      if ((mainColor == bgColor) ||
+          (pixel != bgColor && imageColor == Brush::ImageColor::MainColor) ||
+          (pixel == bgColor && imageColor == Brush::ImageColor::BackgroundColor)) {
+        pixel = (pixel & alpha_mask) | color;
+      }
+    }
+  }
+}
+
+static void replace_image_colors_indexed(Image* image,
+                                         Brush::ImageColor imageColor,
+                                         color_t color)
+{
+  LockImageBits<IndexedTraits> bits(image, Image::ReadWriteLock);
+  bool hasAlpha = false; // True if "image" has a pixel with the mask color
+  color_t mainColor, bgColor;
+  color_t maskColor = image->maskColor();
+
+  mainColor = bgColor = maskColor;
+
+  for (const auto& pixel : bits) {
+    if (pixel == maskColor) {
+      hasAlpha = true;
+    }
+    else if (bgColor == maskColor) {
+      mainColor = bgColor = pixel;
+    }
+    else if (pixel != bgColor && mainColor == bgColor) {
+      mainColor = pixel;
+    }
+  }
+
+  if (hasAlpha) {
+    for (auto& pixel : bits)
+      if (pixel != maskColor)
+        pixel = color;
+  }
+  else {
+    for (auto& pixel : bits) {
+      if ((mainColor == bgColor) ||
+          (pixel != bgColor && imageColor == Brush::ImageColor::MainColor) ||
+          (pixel == bgColor && imageColor == Brush::ImageColor::BackgroundColor)) {
+        pixel = color;
+      }
+    }
+  }
+}
+
+void Brush::setImageColor(ImageColor imageColor, color_t color)
+{
+  ASSERT(m_image);
+  if (!m_image)
+    return;
+
+  switch (m_image->pixelFormat()) {
+
+    case IMAGE_RGB:
+      replace_image_colors<RgbTraits, rgba_rgb_mask, rgba_a_mask>(
+        m_image.get(), imageColor, color);
+      break;
+
+    case IMAGE_GRAYSCALE:
+      replace_image_colors<GrayscaleTraits, graya_v_mask, graya_a_mask>(
+        m_image.get(), imageColor, color);
+      break;
+
+    case IMAGE_INDEXED:
+      replace_image_colors_indexed(
+        m_image.get(), imageColor, color);
+      break;
+  }
+}
+
 // Cleans the brush's data (image and region).
 void Brush::clean()
 {
diff --git a/src/doc/brush.h b/src/doc/brush.h
index 543b0fc..17c0db3 100644
--- a/src/doc/brush.h
+++ b/src/doc/brush.h
@@ -1,5 +1,5 @@
 // Aseprite Document Library
-// Copyright (c) 2001-2015 David Capello
+// Copyright (c) 2001-2016 David Capello
 //
 // This file is released under the terms of the MIT license.
 // Read LICENSE.txt for more information.
@@ -10,6 +10,7 @@
 
 #include "doc/brush_pattern.h"
 #include "doc/brush_type.h"
+#include "doc/color.h"
 #include "doc/image_ref.h"
 #include "gfx/point.h"
 #include "gfx/rect.h"
@@ -23,6 +24,8 @@ namespace doc {
     static const int kMinBrushSize = 1;
     static const int kMaxBrushSize = 64;
 
+    enum class ImageColor { MainColor, BackgroundColor };
+
     Brush();
     Brush(BrushType type, int size, int angle);
     Brush(const Brush& brush);
@@ -43,6 +46,7 @@ namespace doc {
     void setSize(int size);
     void setAngle(int angle);
     void setImage(const Image* image);
+    void setImageColor(ImageColor imageColor, color_t color);
     void setPattern(BrushPattern pattern) {
       m_pattern = pattern;
     }

-- 
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