[cairo] Problem with directly drawing to a GDI context

Maarten Bosmans mkbosmans at gmail.com
Thu Aug 25 08:46:58 PDT 2011


2011/8/25 Andrej Mitrovic <andrej.mitrovich at gmail.com>:
> Here's a simple example of drawing with either GDI, cairo directly to
> a device context, and cairo to a memory buffer:
>
> http://codepad.org/BVJ6hOjU
>
> If I use the FillGDI() function and try to move another window on top
> of the app, the app's client area that becomes visible is filled with
> blue and there's no issues.
>
> However If I use FillCairo(), I have this issue: http://i.imgur.com/87BUf.png
>
> This problem goes away if I use cairo to draw into a memory buffer and
> then blit to the device context, in this case I use BufferFillCairo().
>
> Is this some kind of a bug or do I always have to use a memory buffer
> when drawing with cairo?

I don't have any direct answers to your questions, but I do have some pointers.

In general I find that drawing to an image surface with cairo and
blitting to the screen is much faster than using cairo's win32 backend
directly to draw on screen. It's simply that pixman does such a good
job compared to the ancient GDI subsystem.

Make sure you're not affected by this bug:
https://bugs.freedesktop.org/show_bug.cgi?id=28541

Also (even when your example code seems to create a new surface every
time, so not really applicable, but anyway) remember that when
combining cairo drawing with calls to the underling native system (GDI
in this case) need to be protected by cairo_surface_flush and
cairo_surface_mark_dirty.

Maarten

> If I disable redrawing of the entire background (by returning 1 in the
> WM_ERASEBKGND message), the effect is similar:
> http://i.imgur.com/ns1xB.png
> And again in that case the FillGDI and BufferFillCairo functions work
> fine, but FillCairo() has these issues.
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
>


More information about the cairo mailing list