[aseprite] 230/250: Fix shading mode on RGB mode when index 0 is involved (fix #794)

Tobias Hansen thansen at moszumanska.debian.org
Sun Dec 20 15:27:34 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 78daffba739b9d037830095c561a8e4759e3edeb
Author: David Capello <davidcapello at gmail.com>
Date:   Wed Nov 4 10:33:23 2015 -0300

    Fix shading mode on RGB mode when index 0 is involved (fix #794)
    
    As now the RgbMap is generated correctly depending on the current layer
    (if it’s opaque or transparent), we’ve fixed
    LockAlpha/Transparent/Merge/Blur/Replace/JumbleInkProcessing for
    Indexed images with a background layer, when a transparent layer is the
    active one, and when a non-mask index has same RGB values than the mask
    index.
---
 src/app/ui/editor/tool_loop_impl.cpp | 14 +++++++++++++-
 src/doc/rgbmap.h                     |  2 ++
 src/doc/sprite.cpp                   | 16 ++++++++++++----
 src/doc/sprite.h                     |  5 +++++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp
index b4b3a42..5eb3f34 100644
--- a/src/app/ui/editor/tool_loop_impl.cpp
+++ b/src/app/ui/editor/tool_loop_impl.cpp
@@ -65,6 +65,7 @@ protected:
   Sprite* m_sprite;
   Layer* m_layer;
   frame_t m_frame;
+  RgbMap* m_rgbMap;
   DocumentPreferences& m_docPref;
   ToolPreferences& m_toolPref;
   int m_opacity;
@@ -101,6 +102,7 @@ public:
     , m_sprite(editor->sprite())
     , m_layer(editor->layer())
     , m_frame(editor->frame())
+    , m_rgbMap(nullptr)
     , m_docPref(Preferences::instance().document(m_document))
     , m_toolPref(Preferences::instance().tool(m_tool))
     , m_opacity(m_toolPref.opacity())
@@ -179,7 +181,17 @@ public:
   Sprite* sprite() override { return m_sprite; }
   Layer* getLayer() override { return m_layer; }
   frame_t getFrame() override { return m_frame; }
-  RgbMap* getRgbMap() override { return m_sprite->rgbMap(m_frame); }
+  RgbMap* getRgbMap() override {
+    if (!m_rgbMap) {
+      Sprite::RgbMapFor forLayer =
+        ((m_layer->isBackground() ||
+          m_sprite->pixelFormat() == IMAGE_RGB) ?
+         Sprite::RgbMapFor::OpaqueLayer:
+         Sprite::RgbMapFor::TransparentLayer);
+      m_rgbMap = m_sprite->rgbMap(m_frame, forLayer);
+    }
+    return m_rgbMap;
+  }
   const render::Zoom& zoom() override { return m_editor->zoom(); }
   ToolLoop::Button getMouseButton() override { return m_button; }
   doc::color_t getFgColor() override { return m_fgColor; }
diff --git a/src/doc/rgbmap.h b/src/doc/rgbmap.h
index eac885a..6fd5327 100644
--- a/src/doc/rgbmap.h
+++ b/src/doc/rgbmap.h
@@ -39,6 +39,8 @@ namespace doc {
       return (v & INVALID) ? generateEntry(i, r, g, b, a): v;
     }
 
+    int maskIndex() const { return m_maskIndex; }
+
   private:
     int generateEntry(int i, int r, int g, int b, int a) const;
 
diff --git a/src/doc/sprite.cpp b/src/doc/sprite.cpp
index 5850606..7c32202 100644
--- a/src/doc/sprite.cpp
+++ b/src/doc/sprite.cpp
@@ -346,14 +346,22 @@ void Sprite::deletePalette(frame_t frame)
 
 RgbMap* Sprite::rgbMap(frame_t frame) const
 {
-  int mask_color = (backgroundLayer() ? -1: transparentColor());
+  return rgbMap(frame, backgroundLayer() ? RgbMapFor::OpaqueLayer:
+                                           RgbMapFor::TransparentLayer);
+}
+
+RgbMap* Sprite::rgbMap(frame_t frame, RgbMapFor forLayer) const
+{
+  int maskIndex = (forLayer == RgbMapFor::OpaqueLayer ?
+                   -1: transparentColor());
 
   if (m_rgbMap == NULL) {
     m_rgbMap = new RgbMap();
-    m_rgbMap->regenerate(palette(frame), mask_color);
+    m_rgbMap->regenerate(palette(frame), maskIndex);
   }
-  else if (!m_rgbMap->match(palette(frame))) {
-    m_rgbMap->regenerate(palette(frame), mask_color);
+  else if (!m_rgbMap->match(palette(frame)) ||
+           m_rgbMap->maskIndex() != maskIndex) {
+    m_rgbMap->regenerate(palette(frame), maskIndex);
   }
 
   return m_rgbMap;
diff --git a/src/doc/sprite.h b/src/doc/sprite.h
index e25328e..c61139d 100644
--- a/src/doc/sprite.h
+++ b/src/doc/sprite.h
@@ -41,6 +41,10 @@ namespace doc {
   // The main structure used in the whole program to handle a sprite.
   class Sprite : public Object {
   public:
+    enum class RgbMapFor {
+      OpaqueLayer,
+      TransparentLayer
+    };
 
     ////////////////////////////////////////
     // Constructors/Destructor
@@ -105,6 +109,7 @@ namespace doc {
     void deletePalette(frame_t frame);
 
     RgbMap* rgbMap(frame_t frame) const;
+    RgbMap* rgbMap(frame_t frame, RgbMapFor forLayer) const;
 
     ////////////////////////////////////////
     // Frames

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