# [cairo] Adding cairo_shear and family

Bill Spitzak spitzak at thefoundry.co.uk
Mon Jan 12 09:39:35 PST 2009

```
Paolo Bonzini wrote:
> Bill Spitzak wrote:
>> It might make more sense to make the call do the composite operation
>> that preserves area:
>>
>> [1+sx*sy sx]
>> [sy 1+sx*sy]
>>
>> Note that if either sx or sy are zero then it is the same as the
>> proposed call.
>
> I like this.  But the composite operation that preserves area is
>
> [sqrt(1+sx*sy)   sx
>  sy              sqrt(1+sx*sy]
>
> whose determinant is 1.  Your matrix has determinant sx^2 sy^2+sx sy+1.
>
> For example, with this matrix
>
>   cairo_shear (cr, sin(a), -sin(a));
>
> would be the same as cairo_rotate (cr, a) for angle between -90 and 90:
>
> [sqrt(1-sin^2 a)  sin a                   [cos a    sin a
>  -sin a           sqrt(1-sin^2 a)]   =     -sin a   cos a]
>
> Paolo

You are right. I just multiplied the x and y shear matrices together,
the idea being that shear(x,y) would be the same as shear(x,0) and
shear(0,y) one after the other. Since each step preserves area I thought
the result would preserve area as well. I then made a mistake in the
multiplication so that I thought the result was symmetric. The actual
result is:

[1+sx*sy sx]
[xy      1 ]

or transposed with 1+sx*sy in the lower-right, depending on the order of
the shear calls. That is not very useful because the xy order matters.

The area-preserving one with sqrt() looks pretty useful to me, however.

> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
```