X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=da0c4d2ca69bfe74190812cc39164c856523449d;hb=ac9d48038a86a672579abbcbbc53b17e2515ba13;hp=200d05a886269bc09dedcf34bcde5f1b2027d872;hpb=baafcd6d8002793a71c272634dc676850930a61e;p=xboard.git diff --git a/draw.c b/draw.c index 200d05a..da0c4d2 100644 --- a/draw.c +++ b/draw.c @@ -268,33 +268,35 @@ ScaleOnePiece (char *name, int color, int piece) GError **svgerror=NULL; cairo_surface_t *img, *cs; cairo_t *cr; - int stride = squareSize * 4; - double scale; g_type_init (); - if((img = pngPieceImages[color][piece]) == NULL) { // if PNG file for this piece was not yet read, read it now and store it - if(!*appData.pngDirectory) img = ConvertPixmap(color, piece); else { - snprintf(buf, MSG_SIZ, "%s/%s%s.svg", appData.pngDirectory, color ? "Black" : "White", pngPieceNames[piece]); + if(*appData.svgDirectory) { // try to freshly render svg pieces first, always from file, to supply the source bitmap + snprintf(buf, MSG_SIZ, "%s/%s%s.svg", appData.svgDirectory, color ? "Black" : "White", pngPieceNames[piece]); - svg = rsvg_handle_new (); - svg = rsvg_handle_new_from_file(buf,svgerror); + if(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); - unsigned char* cairo_data =(unsigned char *) calloc(stride * squareSize, 1); - img = cairo_image_surface_create_for_data(cairo_data, CAIRO_FORMAT_ARGB32, squareSize, squareSize, stride); - - cairo_t *cr_svg = cairo_create(img); + 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; + } + cairo_destroy(cr); - scale = (double) squareSize/(double) svg_dimensions.height; - cairo_scale(cr_svg, scale,scale); - cairo_set_antialias (cr_svg, CAIRO_ANTIALIAS_NONE); - rsvg_handle_render_cairo(svg, cr_svg); + rsvg_handle_close (svg,NULL); + } + } + if((img = pngPieceImages[color][piece]) == NULL) { // if PNG file for this piece was not yet read, read it now and store it + if(!*appData.pngDirectory) img = ConvertPixmap(color, piece); else { + snprintf(buf, MSG_SIZ, "%s/%s%s.png", appData.pngDirectory, color ? "Black" : "White", pngPieceNames[piece]); + img = cairo_image_surface_create_from_png (buf); if(cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) img = ConvertPixmap(color, piece); - - rsvg_handle_close (svg,NULL); } } pngPieceImages[color][piece] = img;