mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-16 05:42:32 +00:00
Add option to reduce opacity of non-active layers
This commit is contained in:
parent
4813936a3a
commit
26b1a2ebb4
@ -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" />
|
||||||
|
@ -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>
|
||||||
|
@ -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());
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user