Don't let alpha maps recurse in fb. Bug 23581.
Recursive alpha maps (where one picture's alpha map is set to a picture with an external alpha map) would be all fine and dandy, except for the case where the client constructs a loop. Detecting this case when setting the alpha map values would be difficult as any time an alpha map is set, the server would have to check for the looping case. Instead, a far simpler fix is to simply disallow recursive alpha maps in the rendering code, the Render spec is ambiguous in this area and allows us to to ignore the recursive case. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
70a94c5b7a
commit
ff70848e62
24
fb/fbpict.c
24
fb/fbpict.c
|
@ -332,8 +332,11 @@ create_bits_picture (PicturePtr pict,
|
|||
return image;
|
||||
}
|
||||
|
||||
static pixman_image_t *
|
||||
image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map);
|
||||
|
||||
static void
|
||||
set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
||||
set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
|
||||
{
|
||||
pixman_repeat_t repeat;
|
||||
pixman_filter_t filter;
|
||||
|
@ -382,10 +385,13 @@ set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int
|
|||
|
||||
pixman_image_set_repeat (image, repeat);
|
||||
|
||||
if (pict->alphaMap)
|
||||
/* Fetch alpha map unless 'pict' is being used
|
||||
* as the alpha map for this operation
|
||||
*/
|
||||
if (pict->alphaMap && !is_alpha_map)
|
||||
{
|
||||
int alpha_xoff, alpha_yoff;
|
||||
pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, FALSE, &alpha_xoff, &alpha_yoff);
|
||||
pixman_image_t *alpha_map = image_from_pict_internal (pict->alphaMap, FALSE, &alpha_xoff, &alpha_yoff, TRUE);
|
||||
|
||||
pixman_image_set_alpha_map (
|
||||
image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
|
||||
|
@ -417,8 +423,8 @@ set_image_properties (pixman_image_t *image, PicturePtr pict, Bool has_clip, int
|
|||
pixman_image_set_source_clipping (image, TRUE);
|
||||
}
|
||||
|
||||
pixman_image_t *
|
||||
image_from_pict (PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
||||
static pixman_image_t *
|
||||
image_from_pict_internal (PicturePtr pict, Bool has_clip, int *xoff, int *yoff, Bool is_alpha_map)
|
||||
{
|
||||
pixman_image_t *image = NULL;
|
||||
|
||||
|
@ -452,11 +458,17 @@ image_from_pict (PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
|||
}
|
||||
|
||||
if (image)
|
||||
set_image_properties (image, pict, has_clip, xoff, yoff);
|
||||
set_image_properties (image, pict, has_clip, xoff, yoff, is_alpha_map);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
pixman_image_t *
|
||||
image_from_pict (PicturePtr pict, Bool has_clip, int *xoff, int *yoff)
|
||||
{
|
||||
return image_from_pict_internal (pict, has_clip, xoff, yoff, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
free_pixman_pict (PicturePtr pict, pixman_image_t *image)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user