[cairo] keeping paths as doubles through high-level backend interface

Vladimir Vukicevic vladimir at pobox.com
Mon Nov 5 09:13:46 PST 2007


On Nov 2, 2007, at 4:44 PM, Behdad Esfahbod wrote:

> On Fri, 2007-11-02 at 18:58 -0400, Vladimir Vukicevic wrote:
>> Before I start coding this up, I wanted to get opinions on whether
>> this was a good idea, and any problems that might come up.  (I  
>> think I
>> wrote about this a while back, but it may have been in part of a
>> different thread -- I can't find the post at the moment.
>
> Thanks for bringing this up.  I hit this issue again last week, and  
> it's
> really bad.  Just have a surface with a deivce_offset.x of > 32000 and
> you simply can't draw anything to it.  Including text using gdk!
> Because even cairo_get_current_point() is broken...

Ouch!  That's pretty bad, I wasn't even thinking of that particular  
interaction.

>> Right now, cairo users specify path coordinates and operations using
>> doubles; these doubles are then transformed by the CTM (using fp
>> math), and then they are converted to fixed point for storage.
>> However, many backends would prefer to have the full precision
>> floating point number available -- PS, PDF, SVG, Quartz are the
>> initial ones that come to mind.  I propose changing the normal path
>> storage and the backend API interface such that the doubles are  
>> stored
>> directly, and a conversion function to a fixed point path is provided
>> when a fixed path is currently needed (or maybe not -- maybe we  
>> should
>> just use the double-to-fixed routines wherever necessary). That is,
>> fallback_stroke,fill,etc. would do the conversion from double->fixed
>> before continuing.  This shouldn't affect any current users,
>> especially on platforms with a FPU, as the conversion would still  
>> take
>> place, just at a different time.  However, even those platforms would
>> end up benefitting from higher fidelity PS/PDF output.
>
> Please go ahead.  That should fix most of our 16.16 issue.  As much  
> that
> we may be able to get away with it and postpone 24.8 switch for later.
>
>> We could even take this a step further and define a  
>> cairo_path_coord_t
>> and a handful of helper macros; if that type was used instead of
>> doubles, it then becomes much easier to create a version of cairo  
>> that
>> uses fixed point arithmetic for all operations -- which may be
>> interesting to platforms that lack a FPU.
>
> Sounds like a good plan.
>
>> Does this sound like a good plan?
>
> Really good one.  Looking forward to reviewing it.

Ok, I'll get started.

>
>>     - Vlad
>
> PS.  What needs to be done in the 24.8 branch?  Can we get that moving
> too?

It's already been merged (a while ago) -- the only thing needed to do  
the switch is to change the #define in cairo-fixed-private.h, and to  
double check what happens on linux.  We've already done the switch in  
mozilla's cairo version and haven't seen any ill effects yet.

     - Vlad



More information about the cairo mailing list