[cairo] 'cairo_restore()' doesn't restore context in error case

Vladimir Vukicevic vladimir at pobox.com
Tue Feb 19 14:51:09 PST 2008

On Feb 19, 2008, at 2:02 PM, Carl Worth wrote:

> On Tue, 19 Feb 2008 23:00:15 +0200, "Iosif Haidu" wrote:
>> On Tue, Feb 19, 2008 at 3:32 AM, Behdad Esfahbod  
>> <behdad at behdad.org> wrote:
>>> On Sat, 2008-02-16 at 00:50 +0200, Iosif Haidu wrote:
>>>>> it. For an unknown reason sometime some windows gdi functions
>>>>> (CreateCompatibleDC(), BitBlt() and other) fail to execute with  
>>>>> error
>>>>> code 6 and 8. In this situation the cairo function responsible  
>>>>> with
>>>>> that windows gdi function call will set the error status to
>>>>> CAIRO_STATUS_NO_MEMORY and the 'cairo_restore()' will not  
>>>>> restore the
>>>>> cairo context. I have noticed that cairo context actually has  
>>>>> not been
>>>>> damaged by the failure of the windows gdi function, yet the  
>>>>> context is
>>>>> not restored.
>>>> As I said on the bug, the this is a bug that should be fixed.  If  
>>>> the
>>>> failing gdi functions are not fatal, this should be handled in
>>>> cairo.
> Definitely. If there are non-fatal things happening in the underlying
> system, then cairo is broken by considering it an error. Even if the
> errors are fatal, cairo is broken by calling them NO_MEMORY if that's
> not the case, (maybe we need CAIRO_STATUS_GDI_MYSTIC_PROBLEM or
> something?).

Maybe, though I've never seen the original errors.  I'm not a fan of  
NO_MEMORY, though; but there just isn't a good way of returning  
backend-specific error codes.  A while back I think I made a proposal  
to turn the error code bits into a system where backends can return  
per-backend error codes... either via something like  
CAIRO_BACKEND_ERROR_BASE+n where that specific error would then be  
only valid for the specific surface backend in use, or to turn all  
error codes into just returning static pointer values, like we do for  
user data keys now.  Both would require a bit of machinery to implement.

      - Vlad

More information about the cairo mailing list