[cairo] Best strategy for complex screen drawing

Timothée Lecomte timothee.lecomte at ens.fr
Sat Nov 26 05:52:32 PST 2005


Alexander Larsson wrote:

>On Fri, 2005-11-25 at 18:07 +0100, Timothée Lecomte wrote:
>
>  
>
>>    cairo_set_line_width(cr, 1);
>>    cairo_stroke(cr);
>>    
>>
>
>Why are you stroking each polygon? That is a pretty complicated
>operation and doesn't seem necessary for producing the kind of image you
>show in your screenshot.
>
>Maybe this is an issue with "seams" between the polygons? 
>
Yes, exactly.

>If so, you
>need to render all the polygons comprising the larger 3d surface using
>CAIRO_OPERATOR_ADD to a temporary cairo surface and then composite that
>to the real cairo surface (using CAIRO_OPERATOR_OVER, or whatever mode
>you currently use).
>

I have just tried this solution : I prepare an intermediate surface via :

    cairo_surface_t *polygon_surface = cairo_surface_create_similar
(cairo_get_target(cr),
                      CAIRO_CONTENT_COLOR_ALPHA,
                      current_xmax, current_ymax);

    polygon_cr = cairo_create (polygon_surface);
    cairo_set_operator (polygon_cr, CAIRO_OPERATOR_ADD);

Then, I draw to it without stroking, and finally copy to the real
surface via :

    cairo_destroy (polygon_cr);

    cairo_set_source_surface (cr, polygon_surface, 0, 0);
    cairo_paint (cr);

    cairo_surface_destroy (polygon_surface);

It gives no seam, and it is much quicker (400 ms to draw the 10000
polygons on a generic image surface, instead of 1500 ms).
Unfortunately, there are some unwanted side effects, because I have to
draw polygons over already existing polygons, and with
CAIRO_OPERATOR_ADD this leads to some transparency effects. Here is a
screenshot :

http://tipote.free.fr/wxt16.png

(to compare with desired output : http://tipote.free.fr/wxt15.png )

Any idea to workaround it ?

Thanks for your help !

Timothée Lecomte


More information about the cairo mailing list