psdump icon indicating copy to clipboard operation
psdump copied to clipboard

fix/psd_parser_layer_mask_and_adjustment

Open irov opened this issue 8 years ago • 0 comments

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;
                }
            }
        }

irov avatar Aug 01 '16 09:08 irov