[cairo] [pixman] fix pixel offsets in rotated image sources
Bill Spitzak
spitzak at d2.com
Thu Sep 15 18:06:23 PDT 2005
I'm not sure if it is relevant, but this is how I fixed the XRender
backend of our code to handle the fact that it thinks 0,0 is at the
center of the pixel and not at the corner. It turned out the adjustment
is much simpler than expected.
After calculating the XRender transformation matrix as though integers
were where I wanted (at the pixel corners), the following code fixes it
before using it to transform an image. This is the same as concatenating
the transform to move the image by .5,.5, the original transform, and
another transform by -.5,-.5:
xtransform.matrix[0][2] +=
(xtransform.matrix[0][0]+xtransform.matrix[0][1]-0x10000)>>1;
xtransform.matrix[1][2] +=
(xtransform.matrix[1][0]+xtransform.matrix[1][1]-0x10000)>>1;
I was rather suprised that this could be done with just this code, but
that actually is how it works out if you figure it out algebraically.
Note that 0x10000 is 1.0 in XRender matrix integers and >>1 is a
divide-by-2.
Bertram Felgenhauer wrote:
> 1st issue. The rendering code uses (0, 0) as a reference point for the
> pixel (0,0). This leads to rounding errors for transformations that are
> close to the unit transformation - consider the identity transform and
> a translation by (-epsilon, -epsilon) - and a bias to the upper left
> of the pixel when rendering. A better choice seems to be to sample at
> the center of the pixel, which has coordinates (1/2, 1/2).
More information about the cairo
mailing list