Add option to reduce opacity of non-active layers

This commit is contained in:
David Capello 2016-12-01 15:20:35 -03:00
parent 4813936a3a
commit 26b1a2ebb4
6 changed files with 45 additions and 10 deletions

View File

@ -136,6 +136,7 @@
<section id="experimental" text="Experimental">
<option id="use_native_file_dialog" type="bool" default="false" />
<option id="flash_layer" type="bool" default="false" migrate="Options.FlashLayer" />
<option id="nonactive_layers_opacity" type="int" default="255" />
</section>
<section id="news">
<option id="cache_file" type="std::string" />

View File

@ -202,6 +202,10 @@
<separator text="User Interface" horizontal="true" />
<check id="native_file_dialog" text="Use native file dialog" />
<check id="flash_layer" text="Flash layer when it is selected" />
<hbox>
<label text="Opacity for non-active layers:" />
<slider id="nonactive_layers_opacity" min="0" max="255" width="128" />
</hbox>
</vbox>
</panel>

View File

@ -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());

View File

@ -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();

View File

@ -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;
}

View File

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