[cairo] Flickering on some scaling-values
Bill Spitzak
spitzak at gmail.com
Thu Aug 21 15:39:50 PDT 2014
The actual code clears the surface and then draws the shapes atop it,
which will blink because you see the blank surface before the shapes draw.
However if the edges of the filled rectangle are not on pixel
boundaries, I think this triggers the image fallback. This is slower but
also acts like double buffering, so it removes the flickering.
The rectangle edges will be on pixel boundaries if the scale is even.
This is because the 0.5,0.5 translate is multiplied by the scale to get
an integer, and the other size is rect.width/height (since it was
divided and then remultiplied by the scale).
I am not sure what the best way to fix this is. You probably want to
turn on double buffering, but I don't know if gdk can be made to do
this. Also if the image fallback is triggered, you will have triple
buffering and are wasting memory. Maybe there is a way to force the
image fallback all the time.
On 08/21/2014 02:44 AM, Andreas Wittmann wrote:
> Hi Mailinglist!
>
> I'm new to cairo so this is maybe a simple question but i haven't found
> any answers using the internet. I'm using Linux/Debian and the newest
> cairo-release 1.12.16 (But my/this problem will also occur on previous
> releases!)
>
> wxWidgets is also used, i'm using a simple render-function which looks
> like this and which is called from the wxWidgets-framework:
>
> void BasicDrawPane::render(wxDC& dc2)
> {
> cairo_t* cairo_image = gdk_cairo_create((GdkWindow*)dc.GetHandle());
> cairo_t *cr = cairo_image;
>
> cairo_scale(cr, global_scale_x, global_scale_y);
> cairo_translate(cr, 0.5, 0.5);
>
> cairo_rectangle(cr, 0.0, 0.0, rect.width / global_scale_x,
> rect.height / global_scale_y);
> cairo_set_source_rgb(cr, 255, 255, 255);
> cairo_fill(cr);
>
> // drawing some shapes ...
>
> cairo_destroy(cairo_image);
> }
>
> The shapes will be drawn (eg. from a mouse-event) without any flickering
> if the global-scales (global_scale_x, global_scale_y) are NOT 2.0, 4.0,
> 6.0, 8.0, 10.0, ... and so on. A value of eg. 2.1 would work without any
> flickering.
>
> Could anybody please give me some direction on how to solve this problem
> or why it happens?
>
> The translation is used for drawing thin lines.
>
> Thanks!
> regards
> Andreas
More information about the cairo
mailing list