[cairo] win32 surface create/destroy

Vladimir Vukicevic vladimir at pobox.com
Sun Apr 19 12:18:10 PDT 2009


On 4/18/09 1:07 AM, Theo Veenker wrote:
>>
>> Also CS_OWNDC is bad - see
>> http://blogs.msdn.com/oldnewthing/archive/2006/06/01/612970.aspx
>
> Good to know. I'll just drop CS_OWNDC, as it just makes things worse.

For the CS_OWNDC case, the system is modifying that DC behind cairo's 
back -- while a cairo surface is attached to the DC, it's generally bad 
to use GDI on that same DC unless you return things back to the same 
state that they were in before making a cairo call.  In particular, the 
bounds on the DC are inferred by examining the clip region attached to 
the DC at surface creation time; I believe this clip region will change 
in BeginPaint as the system clips to the dirty areas, but cairo won't 
know that and will still use the clip that was set when the surface was 
created.

This is also why you should create a new surface each time when 
interacting with a platform-native drawing system -- unless you have 
permanent control over something like a DC, you need to take care to not 
have cairo and native drawing clash with eachother.

If your rendering is complex enough, you may get a performance boost by 
using an image surface that you keep around, resizing the surface when 
the window size changes only; and then using StretchDIBits to draw that 
to the window in WM_PAINT.

     - Vlad


More information about the cairo mailing list