Render transformation matrix
Damien Ciabrini
Damien.Ciabrini at sophia.inria.fr
Thu Jan 27 01:31:56 PST 2005
Keith,
Thanks for your kind help (both for Xrender and for the forgotten math
background :P)
Keith Packard wrote:
> Around 14 o'clock on Jan 26, Damien Ciabrini wrote:
>
>
>>and this is my transformation matrix:
>> XTransform xform = {{
>> { 1.0f, 0.0f, 0.0f },
>> { 0.0f, 1.0f, 0.0f },
>> { 0.0f, 0.0f, 2.0f }
>> }};
>>I assume it would give the same result with the following matrix:
>> XTransform xform = {{
>> { 2.0f, 0.0f, 0.0f },
>> { 0.0f, 2.0f, 0.0f },
>> { 0.0f, 0.0f, 1.0f }
>> }};
>
>
> (First an explanation of homogenous transforms, then a fix for the
> representation)
>
> Not quite. It's a homogeneous transform from dest to source (the
> transformation are defined by mapping a destination pixel back to the
> relevant source pixels).
>
> So, the X server constructs a 3 vector from the destination pixel as
>
> [ x y 1 ]
>
> and multiplies it by the transformation (I have no idea if this is
> backwards or not):
>
> [ x y 1 ] | a b c | = [ (ax + dy + g) (bx + ey + h) (cx + fy + i) ]
> | d e f |
> | g h i |
>
> To normalize this new vector back to the screen space, we divide the
> coordinates in the vector by the third:
>
> (ax + dy + g) (bx + ey + h)
> [ ------------- ------------- 1 ]
> (cx + fy + i) (cx + fy + i)
>
> So, in your sample, the second transform would be:
>
> { 0.5f, 0.0f, 0.0f },
> { 0.0f, 0.5f, 0.0f },
> { 0.0f, 0.0f, 1.0f }
>
> Two homogenous transforms which differ by a constant factor are equivalent.
>
>
>>Now here comes my problem. When doing the composite in software (Kdrive
>>Xvesa server), the scaling does not occur if I use floating point values
>>such as:
>> XTransform xform = {{
>> { 1.0f, 0.0f, 0.0f },
>> { 0.0f, 1.0f, 0.0f },
>> { 0.0f, 0.0f, 2.3f } <-- 2.3
>> }};
>
>
> That's because the transform is represented in 16.16 fixed point. I
> selected fixed point for the wire representation as it eliminates
> questions about floating point representation and computation. It's
> probably just a reaction to the horror known as PEX which provided
> multiple wire representation for floating point values.
>
> Just convert these floating point values with DoubleToFixed and you should
> be all set.
>
> -keith
>
>
More information about the xorg
mailing list