psdump
psdump copied to clipboard
fix/psd_parser_layer_mask_and_adjustment
layer_mask.c line:659
// LAYER MASK / ADJUSTMENT LAYER DATA
// Size of the data: 36, 20, or 0. If zero, the following fields are not present
size = psd_stream_get_int(context);
//psd_assert(size == 36 || size == 20 || size == 0);
if(size > 0)
{
// Rectangle enclosing layer mask: Top, left, bottom, right
layer->layer_mask_info.top = psd_stream_get_int(context);
layer->layer_mask_info.left = psd_stream_get_int(context);
layer->layer_mask_info.bottom = psd_stream_get_int(context);
layer->layer_mask_info.right = psd_stream_get_int(context);
layer->layer_mask_info.width = layer->layer_mask_info.right - layer->layer_mask_info.left;
layer->layer_mask_info.height = layer->layer_mask_info.bottom - layer->layer_mask_info.top;
// Default color. 0 or 255
layer->layer_mask_info.default_color = psd_stream_get_char(context);
psd_assert(layer->layer_mask_info.default_color == 0 ||
layer->layer_mask_info.default_color == 255);
// Flags
flags = psd_stream_get_char(context);
// bit 0 = position relative to layer
layer->layer_mask_info.relative = flags & 0x01;
// bit 1 = layer mask disabled
layer->layer_mask_info.disabled = (flags & (0x01 << 1)) > 0;
// bit 2 = invert layer mask when blending
layer->layer_mask_info.invert = (flags & (0x01 << 2)) > 0;
psd_bool some3 = (flags & (0x01 << 3)) > 0;
psd_bool some4 = (flags & (0x01 << 4)) > 0;
if(size == 20)
{
// Padding. Only present if size = 20. Otherwise the following is present
psd_stream_get_short(context);
}
else
{
if( some4 == 1 )
{
psd_uchar mask_parameter = psd_stream_get_char( context );
if( (mask_parameter & (0x01 << 0)) > 0 )
{
psd_stream_get_char( context );
}
if( (mask_parameter & (0x01 << 1)) > 0 )
{
psd_stream_get_double( context );
}
if( (mask_parameter & (0x01 << 2)) > 0 )
{
psd_stream_get_char( context );
}
if( (mask_parameter & (0x01 << 3)) > 0 )
{
psd_stream_get_double( context );
}
}
else
{
// Real Flags. Same as Flags information above.
flags = psd_stream_get_char( context );
// bit 0 = position relative to layer
layer->layer_mask_info.relative = flags & 0x01;
// bit 1 = layer mask disabled
layer->layer_mask_info.disabled = (flags & (0x01 << 1)) > 0;
// bit 2 = invert layer mask when blending
layer->layer_mask_info.invert = (flags & (0x01 << 2)) > 0;
// Real user mask background. 0 or 255. Same as Flags information above.
layer->layer_mask_info.default_color = psd_stream_get_char( context );
psd_assert( layer->layer_mask_info.default_color == 0 ||
layer->layer_mask_info.default_color == 255 );
// Rectangle enclosing layer mask: Top, left, bottom, right.
layer->layer_mask_info.top = psd_stream_get_int( context );
layer->layer_mask_info.left = psd_stream_get_int( context );
layer->layer_mask_info.bottom = psd_stream_get_int( context );
layer->layer_mask_info.right = psd_stream_get_int( context );
layer->layer_mask_info.width = layer->layer_mask_info.right - layer->layer_mask_info.left;
layer->layer_mask_info.height = layer->layer_mask_info.bottom - layer->layer_mask_info.top;
}
}
}