diff --git a/src/components/options-panel/layer-filters/layer-filters.vue b/src/components/options-panel/layer-filters/layer-filters.vue
index d9a719f..7be3309 100644
--- a/src/components/options-panel/layer-filters/layer-filters.vue
+++ b/src/components/options-panel/layer-filters/layer-filters.vue
@@ -31,6 +31,15 @@
name="enabled"
/>
+
+
+
+
{
export const isEqual = ( filters, filtersToCompareTo = {} ) => {
return filters.enabled === filtersToCompareTo.enabled &&
+ filters.opacity === filtersToCompareTo.opacity &&
filters.gamma === filtersToCompareTo.gamma &&
filters.brightness === filtersToCompareTo.brightness &&
filters.contrast === filtersToCompareTo.contrast &&
diff --git a/src/rendering/canvas-elements/layer-sprite.js b/src/rendering/canvas-elements/layer-sprite.js
index 07a8dbf..1878e61 100644
--- a/src/rendering/canvas-elements/layer-sprite.js
+++ b/src/rendering/canvas-elements/layer-sprite.js
@@ -519,6 +519,11 @@ class LayerSprite extends ZoomableSprite {
orgBounds = this._bounds;
this._bounds = scaleRectangle( orgBounds, scale );
}
+ const { enabled, opacity } = this.layer.filters;
+ const altOpacity = enabled && opacity !== 1;
+ if ( altOpacity ) {
+ documentContext.globalAlpha = opacity;
+ }
// invoke base class behaviour to render bitmap
super.draw( documentContext, viewport );
@@ -535,7 +540,10 @@ class LayerSprite extends ZoomableSprite {
renderTempCanvas( this.canvas, documentContext );
documentContext.restore();
}
-
+ if ( altOpacity ) {
+ documentContext.globalAlpha = 1; // restore document opacity
+ }
+
if ( !omitOutlines ) {
const { zoomFactor } = this.canvas;
diff --git a/tests/unit/factories/filters-factory.spec.js b/tests/unit/factories/filters-factory.spec.js
index bdb27ff..e347294 100644
--- a/tests/unit/factories/filters-factory.spec.js
+++ b/tests/unit/factories/filters-factory.spec.js
@@ -6,6 +6,7 @@ describe( "Filters factory", () => {
const filters = FiltersFactory.create();
expect( filters ).toEqual({
enabled: true,
+ opacity: 1,
gamma: .5,
brightness: .5,
contrast: 0,
@@ -17,6 +18,7 @@ describe( "Filters factory", () => {
it( "should be able to create a filters list from given arguments", () => {
const filters = FiltersFactory.create({
enabled: false,
+ opacity: .3,
gamma: .7,
brightness: .6,
contrast: .3,
@@ -25,6 +27,7 @@ describe( "Filters factory", () => {
});
expect( filters ).toEqual({
enabled: false,
+ opacity: .3,
gamma: .7,
brightness: .6,
contrast: .3,
@@ -38,6 +41,7 @@ describe( "Filters factory", () => {
it( "should do so without data loss", async () => {
const filters = FiltersFactory.create({
enabled: false,
+ opacity: .4,
gamma: .7,
brightness: .6,
contrast: .3,
@@ -58,7 +62,10 @@ describe( "Filters factory", () => {
});
it( "should consider a configuration where one of the properties deviates from the default as active", () => {
- let filter = FiltersFactory.create({ gamma: .7 });
+ let filter = FiltersFactory.create({ opacity: .5 });
+ expect( hasFilters( filter )).toBe( true );
+
+ filter = FiltersFactory.create({ gamma: .7 });
expect( hasFilters( filter )).toBe( true );
filter = FiltersFactory.create({ brightness: .3 });
@@ -77,8 +84,8 @@ describe( "Filters factory", () => {
it( "should know when two filters instances are equal", () => {
const defaultFilter = FiltersFactory.create();
- [ "enabled", "gamma", "brightness", "contrast", "vibrance", "desaturate" ].forEach( property => {
- const filters = FiltersFactory.create({ [ property ]: 1 });
+ [ "enabled", "opacity", "gamma", "brightness", "contrast", "vibrance", "desaturate" ].forEach( property => {
+ const filters = FiltersFactory.create({ [ property ]: .88 });
expect( isEqual( filters, defaultFilter )).toBe( false );
});
expect( isEqual( defaultFilter, FiltersFactory.create() )).toBe( true );