[cairo] Operator optimization based on source or dest opacity

Antoine Azar cairo at antoineazar.com
Fri Feb 29 16:40:18 PST 2008

Hi Soeren,

>- I really don't think it's necessary to have a separate 
>pixman_transformed_image_is_opaque(). For destination images, the
>   transform and filter are always going to be NULL, so the 
> additional check is very quick.

I'll trust you on this one, but where is this specified?

>- The if statement in pixman_transformed_image_is_opaque() is 
>difficult to follow for me. It's also broken in at least one case:
>   convolution filters can introduce translucency even when there 
> weren't any to begin with.

How can a convolution filter introduce translucency in an opaque 
image that extends?

>   Also, I'm not confident that the pi/2 rotation transformation 
> check is correct. Doesn't it need the rotation to be around the center of
>   the image?

Any affine transform other than non pi/2-multiple rotations (and 
shears) are allowed, as long as we use a nearest filter. Whether the 
rotation is around the center of the image or not is irrelevant.

>   Can we just add something like this to the end of
>   pixman_image_is_opaque():
>          /* Convolution filters can always introduce translucency */
>          if (convolution filter)
>                     return FALSE;
>          if (repeat_none && (filter || transformation))
>                     return FALSE;
>          return TRUE;
>   then get rid of pixman_transformed_image_is_opaque()?
>   I *think* that would be correct, though I would appreciate an
>   additional review from someone else.

You'd be missing some optimization cases as I explained above.

Thanks for the careful review Soeren!

More information about the cairo mailing list