[aseprite] 108/250: Fix Eraser tool to handle opacity values correctly
Tobias Hansen
thansen at moszumanska.debian.org
Sun Dec 20 15:27:18 UTC 2015
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit 30b257a8f52a01eb0a39c78f2a958722622aa477
Author: David Capello <davidcapello at gmail.com>
Date: Wed Sep 30 08:59:59 2015 -0300
Fix Eraser tool to handle opacity values correctly
---
src/app/tools/ink_processing.h | 68 ++++++++++++++++++++++++++++++++++++++++++
src/app/tools/inks.h | 28 ++++++++++++++---
2 files changed, 92 insertions(+), 4 deletions(-)
diff --git a/src/app/tools/ink_processing.h b/src/app/tools/ink_processing.h
index e575069..7ec1df9 100644
--- a/src/app/tools/ink_processing.h
+++ b/src/app/tools/ink_processing.h
@@ -265,6 +265,72 @@ private:
};
//////////////////////////////////////////////////////////////////////
+// Merge Ink
+//////////////////////////////////////////////////////////////////////
+
+template<typename ImageTraits>
+class MergeInkProcessing : public DoubleInkProcessing<MergeInkProcessing<ImageTraits>, ImageTraits> {
+public:
+ MergeInkProcessing(ToolLoop* loop) {
+ m_color = loop->getPrimaryColor();
+ m_opacity = loop->getOpacity();
+ }
+
+ void processPixel(int x, int y) {
+ // Do nothing
+ }
+
+private:
+ color_t m_color;
+ int m_opacity;
+};
+
+template<>
+void MergeInkProcessing<RgbTraits>::processPixel(int x, int y) {
+ *m_dstAddress = rgba_blender_merge(*m_srcAddress, m_color, m_opacity);
+}
+
+template<>
+void MergeInkProcessing<GrayscaleTraits>::processPixel(int x, int y) {
+ *m_dstAddress = graya_blender_merge(*m_srcAddress, m_color, m_opacity);
+}
+
+template<>
+class MergeInkProcessing<IndexedTraits> : public DoubleInkProcessing<MergeInkProcessing<IndexedTraits>, IndexedTraits> {
+public:
+ MergeInkProcessing(ToolLoop* loop) :
+ m_palette(get_current_palette()),
+ m_rgbmap(loop->getRgbMap()),
+ m_opacity(loop->getOpacity()),
+ m_maskIndex(loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor()),
+ m_color(loop->getPrimaryColor() == m_maskIndex ?
+ (m_palette->getEntry(loop->getPrimaryColor()) & rgba_rgb_mask):
+ (m_palette->getEntry(loop->getPrimaryColor()))) {
+ }
+
+ void processPixel(int x, int y) {
+ color_t c = *m_srcAddress;
+ if (c == m_maskIndex)
+ c = m_palette->getEntry(c) & rgba_rgb_mask; // Alpha = 0
+ else
+ c = m_palette->getEntry(c);
+
+ c = rgba_blender_merge(c, m_color, m_opacity);
+ *m_dstAddress = m_rgbmap->mapColor(rgba_getr(c),
+ rgba_getg(c),
+ rgba_getb(c),
+ rgba_geta(c));
+ }
+
+private:
+ const Palette* m_palette;
+ const RgbMap* m_rgbmap;
+ const int m_opacity;
+ const int m_maskIndex;
+ const color_t m_color;
+};
+
+//////////////////////////////////////////////////////////////////////
// Blur Ink
//////////////////////////////////////////////////////////////////////
@@ -973,6 +1039,7 @@ enum {
INK_COPY,
INK_LOCKALPHA,
INK_TRANSPARENT,
+ INK_MERGE,
INK_BLUR,
INK_REPLACE,
INK_JUMBLE,
@@ -1000,6 +1067,7 @@ AlgoHLine ink_processing[][3] =
DEFINE_INK(CopyInkProcessing),
DEFINE_INK(LockAlphaInkProcessing),
DEFINE_INK(TransparentInkProcessing),
+ DEFINE_INK(MergeInkProcessing),
DEFINE_INK(BlurInkProcessing),
DEFINE_INK(ReplaceInkProcessing),
DEFINE_INK(JumbleInkProcessing),
diff --git a/src/app/tools/inks.h b/src/app/tools/inks.h
index 0ca805c..c0de6d3 100644
--- a/src/app/tools/inks.h
+++ b/src/app/tools/inks.h
@@ -207,13 +207,33 @@ public:
{
switch (m_type) {
- case Eraser:
- m_proc = ink_processing[INK_COPY][MID(0, loop->sprite()->pixelFormat(), 2)];
+ case Eraser: {
+ color_t primary = app_get_color_to_clear_layer(loop->getLayer());
+ color_t secondary = app_get_color_to_clear_layer(loop->getLayer());
+
+ if (loop->getOpacity() == 255) {
+ m_proc = ink_processing[INK_COPY][MID(0, loop->sprite()->pixelFormat(), 2)];
+ }
+ else {
+ // For opaque layers
+ if (loop->getLayer()->isBackground()) {
+ m_proc = ink_processing[INK_TRANSPARENT][MID(0, loop->sprite()->pixelFormat(), 2)];
+ }
+ // For transparent layers
+ else {
+ m_proc = ink_processing[INK_MERGE][MID(0, loop->sprite()->pixelFormat(), 2)];
+
+ if (loop->sprite()->pixelFormat() == IMAGE_INDEXED) {
+ primary = loop->sprite()->transparentColor();
+ }
+ }
+ }
// TODO app_get_color_to_clear_layer should receive the context as parameter
- loop->setPrimaryColor(app_get_color_to_clear_layer(loop->getLayer()));
- loop->setSecondaryColor(app_get_color_to_clear_layer(loop->getLayer()));
+ loop->setPrimaryColor(primary);
+ loop->setSecondaryColor(secondary);
break;
+ }
case ReplaceFgWithBg:
m_proc = ink_processing[INK_REPLACE][MID(0, loop->sprite()->pixelFormat(), 2)];
--
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