Skip to content
Snippets Groups Projects
Commit 8202d766 authored by Jonas Wallden's avatar Jonas Wallden
Browse files

Fixed a number of bugs in layer mask code. Now actually looks at default

mask color when padding the mask. Fixed incorrect mask positioning and
relative offset calculations. Previous mask flags code was a no-op due to
missing flag value.

Rev: lib/modules/_Image_PSD.pmod:1.21
parent 3cacccc9
No related branches found
No related tags found
No related merge requests found
...@@ -25,6 +25,7 @@ class Layer ...@@ -25,6 +25,7 @@ class Layer
int mask_flags; int mask_flags;
int mask_xoffset, mask_yoffset; int mask_xoffset, mask_yoffset;
int mask_width, mask_height; int mask_width, mask_height;
int mask_default_color;
} }
...@@ -42,16 +43,18 @@ Layer decode_layer(mapping layer, mapping i) ...@@ -42,16 +43,18 @@ Layer decode_layer(mapping layer, mapping i)
l->mode = layer->mode; l->mode = layer->mode;
l->flags = layer->flags; l->flags = layer->flags;
l->name = layer->name; l->name = layer->name;
l->mask_flags = layer->mask_flags;
l->mask_default_color = layer->mask_default_color;
l->mask_width = layer->mask_right-layer->mask_left; l->mask_width = layer->mask_right-layer->mask_left;
l->mask_height = layer->mask_bottom-layer->mask_top; l->mask_height = layer->mask_bottom-layer->mask_top;
l->mask_xoffset = layer->mask_left; l->mask_xoffset = layer->mask_left;
l->mask_yoffset = layer->mask_top; l->mask_yoffset = layer->mask_top;
if( !(l->mask_flags & 1 ) ) // pos relative to layer if(l->mask_flags & 1) // pos relative to layer
{ {
l->mask_xoffset -= l->xoffset; l->mask_xoffset += l->xoffset;
l->mask_yoffset -= l->yoffset; l->mask_yoffset += l->yoffset;
} }
array colors; array colors;
int inverted; int inverted;
...@@ -131,6 +134,7 @@ Layer decode_layer(mapping layer, mapping i) ...@@ -131,6 +134,7 @@ Layer decode_layer(mapping layer, mapping i)
tmp = ___decode_image_channel(l->width, l->height, c->data); tmp = ___decode_image_channel(l->width, l->height, c->data);
else else
tmp = ___decode_image_channel(l->mask_width,l->mask_height,c->data); tmp = ___decode_image_channel(l->mask_width,l->mask_height,c->data);
switch( c->id ) switch( c->id )
{ {
default: default:
...@@ -154,18 +158,17 @@ Layer decode_layer(mapping layer, mapping i) ...@@ -154,18 +158,17 @@ Layer decode_layer(mapping layer, mapping i)
case -2: /* user mask */ case -2: /* user mask */
if(!(l->mask_flags & 2)) /* layer mask disabled */ if(!(l->mask_flags & 2)) /* layer mask disabled */
{ {
array pad_color = ({ 0, 0, 0 }); array pad_color = ({ l->mask_default_color }) * 3;
if( (l->mask_flags & 4 ) ) { int x0 = l->xoffset - l->mask_xoffset;
/* invert mask */ int y0 = l->yoffset - l->mask_yoffset;
tmp = tmp->copy(x0, y0,
x0 + l->image->xsize() - 1,
y0 + l->image->ysize() - 1,
@pad_color);
if(l->mask_flags & 4) /* invert mask */
tmp = tmp->invert(); tmp = tmp->invert();
pad_color = ({ 255, 255, 255 });
}
tmp = tmp->copy( -l->mask_xoffset, -l->mask_yoffset,
l->image->xsize()-1, l->image->ysize()-1,
@pad_color )
->copy(0,0,l->image->xsize()-1,l->image->ysize()-1,
@pad_color);
if(!l->alpha) if(!l->alpha)
l->alpha = tmp; l->alpha = tmp;
else else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment