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"> <section id="experimental" text="Experimental">
<option id="use_native_file_dialog" type="bool" default="false" /> <option id="use_native_file_dialog" type="bool" default="false" />
<option id="flash_layer" type="bool" default="false" migrate="Options.FlashLayer" /> <option id="flash_layer" type="bool" default="false" migrate="Options.FlashLayer" />
<option id="nonactive_layers_opacity" type="int" default="255" />
</section> </section>
<section id="news"> <section id="news">
<option id="cache_file" type="std::string" /> <option id="cache_file" type="std::string" />

View File

@ -202,6 +202,10 @@
<separator text="User Interface" horizontal="true" /> <separator text="User Interface" horizontal="true" />
<check id="native_file_dialog" text="Use native file dialog" /> <check id="native_file_dialog" text="Use native file dialog" />
<check id="flash_layer" text="Flash layer when it is selected" /> <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> </vbox>
</panel> </panel>

View File

@ -156,6 +156,8 @@ public:
if (m_pref.experimental.flashLayer()) if (m_pref.experimental.flashLayer())
flashLayer()->setSelected(true); flashLayer()->setSelected(true);
nonactiveLayersOpacity()->setValue(m_pref.experimental.nonactiveLayersOpacity());
if (m_pref.editor.showScrollbars()) if (m_pref.editor.showScrollbars())
showScrollbars()->setSelected(true); showScrollbars()->setSelected(true);
@ -302,6 +304,7 @@ public:
// Experimental features // Experimental features
m_pref.experimental.useNativeFileDialog(nativeFileDialog()->isSelected()); m_pref.experimental.useNativeFileDialog(nativeFileDialog()->isSelected());
m_pref.experimental.flashLayer(flashLayer()->isSelected()); m_pref.experimental.flashLayer(flashLayer()->isSelected());
m_pref.experimental.nonactiveLayersOpacity(nonactiveLayersOpacity()->getValue());
ui::set_use_native_cursors(m_pref.cursor.useNativeCursor()); ui::set_use_native_cursors(m_pref.cursor.useNativeCursor());
ui::set_mouse_cursor_scale(m_pref.cursor.cursorScale()); 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 if (// If the onion skinning depends on the active layer
m_docPref.onionskin.currentLayer() || m_docPref.onionskin.currentLayer() ||
// If the user want to see the active layer edges... // 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 // We've to redraw the whole editor
invalidate(); 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)); rendered.reset(Image::create(IMAGE_RGB, rc.w, rc.h, m_renderBuffer));
m_renderEngine.setRefLayersVisiblity(true); m_renderEngine.setRefLayersVisiblity(true);
m_renderEngine.setSelectedLayer(m_layer);
m_renderEngine.setNonactiveLayersOpacity(Preferences::instance().experimental.nonactiveLayersOpacity());
m_renderEngine.setProjection(m_proj); m_renderEngine.setProjection(m_proj);
m_renderEngine.setupBackground(m_document, rendered->pixelFormat()); m_renderEngine.setupBackground(m_document, rendered->pixelFormat());
m_renderEngine.disableOnionskin(); m_renderEngine.disableOnionskin();

View File

@ -480,6 +480,7 @@ bool has_visible_reference_layers(const LayerGroup* group)
Render::Render() Render::Render()
: m_flags(0) : m_flags(0)
, m_nonactiveLayersOpacity(255)
, m_sprite(nullptr) , m_sprite(nullptr)
, m_currentLayer(NULL) , m_currentLayer(NULL)
, m_currentFrame(0) , m_currentFrame(0)
@ -505,6 +506,11 @@ void Render::setRefLayersVisiblity(const bool visible)
m_flags &= ~Flags::ShowRefLayers; m_flags &= ~Flags::ShowRefLayers;
} }
void Render::setNonactiveLayersOpacity(const int opacity)
{
m_nonactiveLayersOpacity = opacity;
}
void Render::setProjection(const Projection& projection) void Render::setProjection(const Projection& projection)
{ {
m_proj = projection; m_proj = projection;
@ -535,6 +541,11 @@ void Render::setBgCheckedSize(const gfx::Size& size)
m_bgCheckedSize = size; m_bgCheckedSize = size;
} }
void Render::setSelectedLayer(const Layer* layer)
{
m_selectedLayer = layer;
}
void Render::setPreviewImage(const Layer* layer, void Render::setPreviewImage(const Layer* layer,
const frame_t frame, const frame_t frame,
const Image* image, const Image* image,
@ -622,7 +633,7 @@ void Render::renderLayer(
renderLayer( renderLayer(
layer, dstImage, area, layer, dstImage, area,
frame, compositeImage, frame, compositeImage,
true, true, blendMode); true, true, blendMode, false);
} }
void Render::renderSprite( void Render::renderSprite(
@ -685,7 +696,8 @@ void Render::renderSprite(
area, frame, compositeImage, area, frame, compositeImage,
true, true,
false, false,
BlendMode::UNSPECIFIED); BlendMode::UNSPECIFIED,
false);
// Draw onion skin behind the sprite. // Draw onion skin behind the sprite.
if (m_onionskin.position() == OnionskinPosition::BEHIND) if (m_onionskin.position() == OnionskinPosition::BEHIND)
@ -698,7 +710,7 @@ void Render::renderSprite(
area, frame, compositeImage, area, frame, compositeImage,
false, false,
true, true,
BlendMode::UNSPECIFIED); BlendMode::UNSPECIFIED, false);
// Draw onion skin in front of the sprite. // Draw onion skin in front of the sprite.
if (m_onionskin.position() == OnionskinPosition::INFRONT) if (m_onionskin.position() == OnionskinPosition::INFRONT)
@ -778,8 +790,7 @@ void Render::renderOnionskin(
// when opacity is < 255 // when opacity is < 255
(m_globalOpacity < 255 && (m_globalOpacity < 255 &&
m_onionskin.position() == OnionskinPosition::INFRONT), m_onionskin.position() == OnionskinPosition::INFRONT),
true, true, blendMode, false);
blendMode);
} }
} }
} }
@ -862,12 +873,16 @@ void Render::renderLayer(
const CompositeImageFunc compositeImage, const CompositeImageFunc compositeImage,
const bool render_background, const bool render_background,
const bool render_transparent, const bool render_transparent,
const BlendMode blendMode) const BlendMode blendMode,
bool isSelected)
{ {
// we can't read from this layer // we can't read from this layer
if (!layer->isVisible()) if (!layer->isVisible())
return; return;
if (m_selectedLayer == layer)
isSelected = true;
gfx::Rect extraArea; gfx::Rect extraArea;
bool drawExtra = (m_extraCel && bool drawExtra = (m_extraCel &&
m_extraCel->frame() == frame && m_extraCel->frame() == frame &&
@ -940,11 +955,13 @@ void Render::renderLayer(
ASSERT(imgLayer->opacity() >= 0); ASSERT(imgLayer->opacity() >= 0);
ASSERT(imgLayer->opacity() <= 255); ASSERT(imgLayer->opacity() <= 255);
// Multiple three opacities: cel*layer*global // Multiple three opacities: cel*layer*global (*nonactive-layer-opacity)
int t; int t;
int opacity = cel->opacity(); int opacity = cel->opacity();
opacity = MUL_UN8(opacity, imgLayer->opacity(), t); opacity = MUL_UN8(opacity, imgLayer->opacity(), t);
opacity = MUL_UN8(opacity, m_globalOpacity, 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()); ASSERT(celImage->maskColor() == m_sprite->transparentColor());
@ -982,7 +999,8 @@ void Render::renderLayer(
compositeImage, compositeImage,
render_background, render_background,
render_transparent, render_transparent,
blendMode); blendMode,
isSelected);
} }
break; break;
} }

View File

@ -105,6 +105,7 @@ namespace render {
Render(); Render();
void setRefLayersVisiblity(const bool visible); void setRefLayersVisiblity(const bool visible);
void setNonactiveLayersOpacity(const int opacity);
// Viewport configuration // Viewport configuration
void setProjection(const Projection& projection); void setProjection(const Projection& projection);
@ -116,6 +117,8 @@ namespace render {
void setBgColor2(color_t color); void setBgColor2(color_t color);
void setBgCheckedSize(const gfx::Size& size); void setBgCheckedSize(const gfx::Size& size);
void setSelectedLayer(const Layer* layer);
// Sets the preview image. This preview image is an alternative // Sets the preview image. This preview image is an alternative
// image to be used for the given layer/frame. // image to be used for the given layer/frame.
void setPreviewImage(const Layer* layer, void setPreviewImage(const Layer* layer,
@ -192,7 +195,8 @@ namespace render {
const CompositeImageFunc compositeImage, const CompositeImageFunc compositeImage,
const bool render_background, const bool render_background,
const bool render_transparent, const bool render_transparent,
const BlendMode blendMode); const BlendMode blendMode,
bool isSelected);
void renderCel( void renderCel(
Image* dst_image, Image* dst_image,
@ -220,6 +224,7 @@ namespace render {
const Layer* layer); const Layer* layer);
int m_flags; int m_flags;
int m_nonactiveLayersOpacity;
const Sprite* m_sprite; const Sprite* m_sprite;
const Layer* m_currentLayer; const Layer* m_currentLayer;
frame_t m_currentFrame; frame_t m_currentFrame;