[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [XBoard-devel] new developer release with cairo integration

From: h.g. muller
Subject: Re: [XBoard-devel] new developer release with cairo integration
Date: Mon, 22 Oct 2012 10:02:45 +0200

At 22:58 21-10-2012 -0700, Adrian Petrescu wrote:
Okay, a bit of a deeper problem.

I've successfully built it on OS X. If I run it with my old .xboardrc, it displays a blank board and complains that the old -pixmapDirectory and -bitmapDirectory arguments are no longer recognized. Fair enough, it's SVG now. So I provide "-pieceImageDirectory ./svg" (from the build root), and it crashes on startup with the error:

Assertion failed: (_cairo_status_is_error (status)), function _cairo_error, file cairo-error.c, line 68.

It if helps, my version of cairo is 1.12.4.

This seems to be an OSX-specific problem. A similar behavior was reported by another Mac user:


In that forum thread I suggested to put in a few printf statements to figure out what was going on,
but I could find no obvious error. (I.e. there were no NULL pointers for any of the cairo objects,
and all pointers had reasonable values.) It seems the cairo surfaces get somehow corrupted,
and that the corruption propagates as one is painted over the other. So that finally, in the
expose routine that should copy the image to the display window, cairo crashes.

Perhaps we should debug this by consistently checking the status of all cairo surfaces
during the process. But with PNG pieces everything seems to work. So it looks like the
problem must occur in an early stage of converting SVG to a bitmap.

The routine in draw.c that does this is:

RsvgHandle *
LoadSVG (char *dir, int color, int piece)
 char buf[MSG_SIZ];
 RsvgHandle *svg=svgPieces[color][piece];
 RsvgDimensionData svg_dimensions;
 GError *svgerror=NULL;
 cairo_surface_t *img;
 cairo_t *cr;

 snprintf(buf, MSG_SIZ, "%s/%s%s.svg", dir, color ? "Black" : "White", pngPieceNames[piece]);
 if(svg || *dir && (svg = rsvg_handle_new_from_file(buf, &svgerror))) {
  rsvg_handle_get_dimensions(svg, &svg_dimensions);
   img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, squareSize, squareSize);
   cr = cairo_create(img);
   cairo_scale(cr, squareSize/(double) svg_dimensions.width, squareSize/(double) svg_dimensions.height);
   rsvg_handle_render_cairo(svg, cr);
   if(cairo_surface_status(img) == CAIRO_STATUS_SUCCESS) {
     if(pngPieceImages[color][piece]) cairo_surface_destroy(pngPieceImages[color][piece]);
     pngPieceImages[color][piece] = img;
   return svg;
 if(svgerror) g_error_free(svgerror);
 return NULL;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]