[cairo] Re: 1.4.2 release planned for today, 1.4.4 in a few weeks

Vladimir Vukicevic vladimir at pobox.com
Tue Mar 27 10:12:39 PDT 2007


Ah, that crash.  So what's happening here is that cairo doesn't 
gracefully deal with a backend's acquire_*_image returning 
CAIRO_INT_STATUS_UNSUPPORTED -- it ends up propagating that error all 
the way up to the user level, at which point the generic "make sure it's 
a public error" assert in cairo_error triggers.

The reason why you're seeing CAIRO_INT_STATUS_UNSUPPORTED is because 
Cairo (that is, the Quartz surface) didn't create the CG context itself; 
when it does, it creates it as an image context and can then do fallback 
rendering as necessary.  Assuming we don't manage to implement 
everything natively using Quartz (I think there are a few operators that 
simply have no equivalents in Quartz, as well as some operations), an 
easy way to get around this is to wrap your rendering in between 
cairo_push_group() and cairo_pop_group_to_source()/cairo_paint(); this 
will give you a temporary Quartz surface that was created by the Quartz 
backend, so fallback rendering would be possible.

     - Vlad

Hugo Vincent wrote:
> Hi Baz,
> 
> The code below seems to replicate the crash; that is to say, even the 
> simplest use of a radial gradient on Quartz crashes.
> 
> verbatim error: cairo.c:91: failed assertion `status > 
> CAIRO_STATUS_SUCCESS && status <= CAIRO_STATUS_LAST_STATUS'
> 
> System Info:
> Mac OS X 10.4.9 (on Intel Core 2 Duo), Xcode 2.4.1, Cairo 1.4.2 [release]
> 
> Note, this code isn't exactly what I've been testing with, but I am 100% 
> confident the other stuff I have in my code, but not in the included 
> code here, is not what is causing this crash. Like I said before, Rsvg 
> renders correctly, assuming the SVG file has no radial gradients. Also, 
> because both Rsvg (which uses the Cairo C api) and this code, which is 
> using Cairomm, both crash in the same way, we can assume the problem 
> isn't with Cairomm. Finally, if you render this code into a PNG file it 
> works fine.
> 
> Cheers,
> Hugo
> 
> -----------------------------------------------------------
> testview.h:
> -----------------------------------------------------------
> 
> #import <Cocoa/Cocoa.h>
> 
> @interface TestView : NSView
> {
>     // nothing needed here
> }
> @end
> 
> -----------------------------------------------------------
> testview.m
> -----------------------------------------------------------
> 
> #include <cairomm/cairomm.h>
> #include <cairomm/quartz_surface.h>
> 
> #ifndef CAIRO_HAS_QUARTZ_SURFACE
> #error Need to build Cairo and Cairomm with Quartz support (version 
> 1.4.0 or higher)
> #endif
> 
> @implementation TestView
> 
> - (id)initWithFrame:(NSRect)frameRect
> {
>     if ((self = [super initWithFrame:frameRect]) != nil)
>     {
>         // nothing needed here
>     }
>     return self;
> }
> 
> - (void)drawRect:(NSRect)rect
> {
>     // Get the size of this NSView
>     NSRect bounds = [self bounds];
>     int width = bounds.size.width;
>     int height = bounds.size.height;
>     
>     // Get CoreGraphcis context reference
>     CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] 
> graphicsPort];
>     
>     // Make the CGContext coordinate system sane, as expected by Cairo
>     CGContextTranslateCTM (ctx, 0.0, height);
>     CGContextScaleCTM (ctx, 1.0, -1.0);
> 
>     // Create the Cairo surface and context
>     Cairo::RefPtr<Cairo::QuartzSurface> surface = 
> Cairo::QuartzSurface::create(ctx, width, height);
>     Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(surface);
> 
>     // Draw a radial gradient (copied and pasted, more or less, from 
> http://cairographics.org/samples/gradient.html)
>     cr->scale(width,height);
>     Cairo::RefPtr<Cairo::RadialGradient> grad2 = 
> Cairo::RadialGradient::create(0.45, 0.4, 0.1, 0.4, 0.4, 0.5);
>     grad2->add_color_stop_rgba(0, 1,0,0, 1);
>     grad2->add_color_stop_rgba(1, 0,1,0, 1);
>     cr->set_source(grad2);
>     cairo_arc (cr, 0.5, 0.5, 0.3, 0, 2 * M_PI);
>     cr->fill(); //  CRASHES!
> }
> 
> @end
> 
> 
> On 27/03/2007, at 10:22 AM, Baz wrote:
> 
>> On 17/03/07, Hugo Vincent <hugo.vincent at gmail.com> wrote:
>>> Can the patch for bug 10036 (Cairo-Quartz Line-width-scaling problem)
>>> be accepted for into 1.4.2 (or even 1.4.4)? Please!?
>>> https://bugs.freedesktop.org/show_bug.cgi?id=10036
>>>
>>> Also, I have been playing round with Rsvg on Mac OS X, rendering into
>>> a Cairo-Quartz context. It mostly works (except for the above
>>> mentioned bug), however in certain cases it crashes rather
>>> ungracefully when trying to do fallback operations for things that
>>> aren't supported natively by Cairo-Quartz (certain radial gradients
>>> seem to be the culprit). I'll prepare a proper test case and submit a
>>> bug soon after I've tried it with 1.4.2.
>>>
>>> Cheers,
>>> Hugo Vincent
>>
>> Hugo, did you ever track down that crasher?
>>
>> Cheers,
>> Baz
> 
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://cairographics.org/cgi-bin/mailman/listinfo/cairo
> 



More information about the cairo mailing list