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