diff --git a/data/pref.xml b/data/pref.xml
index cad993b7e..2b5f3fb76 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -136,6 +136,7 @@
diff --git a/data/widgets/options.xml b/data/widgets/options.xml
index 850fac377..b15c131c1 100644
--- a/data/widgets/options.xml
+++ b/data/widgets/options.xml
@@ -202,6 +202,10 @@
+
+
+
+
diff --git a/src/app/commands/cmd_options.cpp b/src/app/commands/cmd_options.cpp
index a3ee62212..fac0fa046 100644
--- a/src/app/commands/cmd_options.cpp
+++ b/src/app/commands/cmd_options.cpp
@@ -156,6 +156,8 @@ public:
if (m_pref.experimental.flashLayer())
flashLayer()->setSelected(true);
+ nonactiveLayersOpacity()->setValue(m_pref.experimental.nonactiveLayersOpacity());
+
if (m_pref.editor.showScrollbars())
showScrollbars()->setSelected(true);
@@ -302,6 +304,7 @@ public:
// Experimental features
m_pref.experimental.useNativeFileDialog(nativeFileDialog()->isSelected());
m_pref.experimental.flashLayer(flashLayer()->isSelected());
+ m_pref.experimental.nonactiveLayersOpacity(nonactiveLayersOpacity()->getValue());
ui::set_use_native_cursors(m_pref.cursor.useNativeCursor());
ui::set_mouse_cursor_scale(m_pref.cursor.cursorScale());
diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp
index 32cb905b6..91d9ab845 100644
--- a/src/app/ui/editor/editor.cpp
+++ b/src/app/ui/editor/editor.cpp
@@ -326,7 +326,9 @@ void Editor::setLayer(const Layer* layer)
if (// If the onion skinning depends on the active layer
m_docPref.onionskin.currentLayer() ||
// If the user want to see the active layer edges...
- m_docPref.show.layerEdges()) {
+ m_docPref.show.layerEdges() ||
+ // If there is a different opacity for nonactive-layers
+ Preferences::instance().experimental.nonactiveLayersOpacity() < 255) {
// We've to redraw the whole editor
invalidate();
}
@@ -546,6 +548,8 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& sprite
rendered.reset(Image::create(IMAGE_RGB, rc.w, rc.h, m_renderBuffer));
m_renderEngine.setRefLayersVisiblity(true);
+ m_renderEngine.setSelectedLayer(m_layer);
+ m_renderEngine.setNonactiveLayersOpacity(Preferences::instance().experimental.nonactiveLayersOpacity());
m_renderEngine.setProjection(m_proj);
m_renderEngine.setupBackground(m_document, rendered->pixelFormat());
m_renderEngine.disableOnionskin();
diff --git a/src/render/render.cpp b/src/render/render.cpp
index 7855f641a..47fd547ff 100644
--- a/src/render/render.cpp
+++ b/src/render/render.cpp
@@ -480,6 +480,7 @@ bool has_visible_reference_layers(const LayerGroup* group)
Render::Render()
: m_flags(0)
+ , m_nonactiveLayersOpacity(255)
, m_sprite(nullptr)
, m_currentLayer(NULL)
, m_currentFrame(0)
@@ -505,6 +506,11 @@ void Render::setRefLayersVisiblity(const bool visible)
m_flags &= ~Flags::ShowRefLayers;
}
+void Render::setNonactiveLayersOpacity(const int opacity)
+{
+ m_nonactiveLayersOpacity = opacity;
+}
+
void Render::setProjection(const Projection& projection)
{
m_proj = projection;
@@ -535,6 +541,11 @@ void Render::setBgCheckedSize(const gfx::Size& size)
m_bgCheckedSize = size;
}
+void Render::setSelectedLayer(const Layer* layer)
+{
+ m_selectedLayer = layer;
+}
+
void Render::setPreviewImage(const Layer* layer,
const frame_t frame,
const Image* image,
@@ -622,7 +633,7 @@ void Render::renderLayer(
renderLayer(
layer, dstImage, area,
frame, compositeImage,
- true, true, blendMode);
+ true, true, blendMode, false);
}
void Render::renderSprite(
@@ -685,7 +696,8 @@ void Render::renderSprite(
area, frame, compositeImage,
true,
false,
- BlendMode::UNSPECIFIED);
+ BlendMode::UNSPECIFIED,
+ false);
// Draw onion skin behind the sprite.
if (m_onionskin.position() == OnionskinPosition::BEHIND)
@@ -698,7 +710,7 @@ void Render::renderSprite(
area, frame, compositeImage,
false,
true,
- BlendMode::UNSPECIFIED);
+ BlendMode::UNSPECIFIED, false);
// Draw onion skin in front of the sprite.
if (m_onionskin.position() == OnionskinPosition::INFRONT)
@@ -778,8 +790,7 @@ void Render::renderOnionskin(
// when opacity is < 255
(m_globalOpacity < 255 &&
m_onionskin.position() == OnionskinPosition::INFRONT),
- true,
- blendMode);
+ true, blendMode, false);
}
}
}
@@ -862,12 +873,16 @@ void Render::renderLayer(
const CompositeImageFunc compositeImage,
const bool render_background,
const bool render_transparent,
- const BlendMode blendMode)
+ const BlendMode blendMode,
+ bool isSelected)
{
// we can't read from this layer
if (!layer->isVisible())
return;
+ if (m_selectedLayer == layer)
+ isSelected = true;
+
gfx::Rect extraArea;
bool drawExtra = (m_extraCel &&
m_extraCel->frame() == frame &&
@@ -940,11 +955,13 @@ void Render::renderLayer(
ASSERT(imgLayer->opacity() >= 0);
ASSERT(imgLayer->opacity() <= 255);
- // Multiple three opacities: cel*layer*global
+ // Multiple three opacities: cel*layer*global (*nonactive-layer-opacity)
int t;
int opacity = cel->opacity();
opacity = MUL_UN8(opacity, imgLayer->opacity(), t);
opacity = MUL_UN8(opacity, m_globalOpacity, t);
+ if (!isSelected && m_nonactiveLayersOpacity != 255)
+ opacity = MUL_UN8(opacity, m_nonactiveLayersOpacity, t);
ASSERT(celImage->maskColor() == m_sprite->transparentColor());
@@ -982,7 +999,8 @@ void Render::renderLayer(
compositeImage,
render_background,
render_transparent,
- blendMode);
+ blendMode,
+ isSelected);
}
break;
}
diff --git a/src/render/render.h b/src/render/render.h
index 4f4780281..c1301b6e8 100644
--- a/src/render/render.h
+++ b/src/render/render.h
@@ -105,6 +105,7 @@ namespace render {
Render();
void setRefLayersVisiblity(const bool visible);
+ void setNonactiveLayersOpacity(const int opacity);
// Viewport configuration
void setProjection(const Projection& projection);
@@ -116,6 +117,8 @@ namespace render {
void setBgColor2(color_t color);
void setBgCheckedSize(const gfx::Size& size);
+ void setSelectedLayer(const Layer* layer);
+
// Sets the preview image. This preview image is an alternative
// image to be used for the given layer/frame.
void setPreviewImage(const Layer* layer,
@@ -192,7 +195,8 @@ namespace render {
const CompositeImageFunc compositeImage,
const bool render_background,
const bool render_transparent,
- const BlendMode blendMode);
+ const BlendMode blendMode,
+ bool isSelected);
void renderCel(
Image* dst_image,
@@ -220,6 +224,7 @@ namespace render {
const Layer* layer);
int m_flags;
+ int m_nonactiveLayersOpacity;
const Sprite* m_sprite;
const Layer* m_currentLayer;
frame_t m_currentFrame;