forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			52 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| # HG changeset patch
 | |
| # User Jeff Muizelaar <jmuizelaar@mozilla.com>
 | |
| # Date 1299543337 18000
 | |
| # Node ID 57f411f16517fa3abc31b6b081dd31420c4d9b45
 | |
| # Parent  e56ecd8b3a68c158025207c5fd081d043e28f5ce
 | |
| Bug 637828. Reset the transform on the dest image. r=joe
 | |
| 
 | |
| We can get into a situation where the destination image has a transform
 | |
| because we use it as source. The transform set when the image is a source
 | |
| sticks around and when we use it as a destination pixman gets confused.
 | |
| 
 | |
| It seems like the code at fault here is really pixman. I think that pixman
 | |
| should probably not be using a transformed fetch on the destination image under
 | |
| any circumstances.
 | |
| 
 | |
| For example, in this case we're fetching destination pixels from a different
 | |
| part of the image than we're storing them to. I can't see any reason for
 | |
| wanting this behaviour.
 | |
| 
 | |
| However, reseting the transform seemed like the easiest solution.
 | |
| 
 | |
| diff --git a/gfx/cairo/cairo/src/cairo-image-surface.c b/gfx/cairo/cairo/src/cairo-image-surface.c
 | |
| --- a/gfx/cairo/cairo/src/cairo-image-surface.c
 | |
| +++ b/gfx/cairo/cairo/src/cairo-image-surface.c
 | |
| @@ -1138,16 +1138,27 @@ _cairo_image_surface_composite (cairo_op
 | |
|  	return status;
 | |
|  
 | |
|      status = _cairo_image_surface_set_attributes (src, &src_attr,
 | |
|  						  dst_x + width / 2.,
 | |
|  						  dst_y + height / 2.);
 | |
|      if (unlikely (status))
 | |
|  	goto CLEANUP_SURFACES;
 | |
|  
 | |
| +    /* we sometimes get destinations with transforms.
 | |
| +     * we're not equiped to deal with this */
 | |
| +    {
 | |
| +        static const pixman_transform_t id = {
 | |
| +           {{ pixman_fixed_1, 0, 0 },
 | |
| +            { 0, pixman_fixed_1, 0 },
 | |
| +            { 0, 0, pixman_fixed_1 }}
 | |
| +        };
 | |
| +        pixman_image_set_transform (dst->pixman_image, &id);
 | |
| +    }
 | |
| +
 | |
|      if (mask) {
 | |
|  	status = _cairo_image_surface_set_attributes (mask, &mask_attr,
 | |
|  						      dst_x + width / 2.,
 | |
|  						      dst_y + height / 2.);
 | |
|  	if (unlikely (status))
 | |
|  	    goto CLEANUP_SURFACES;
 | |
|  
 | |
|  	pixman_image_composite (_pixman_operator (op),
 | 
