[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