X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=5af491826f7f260d313ede4b2036ce600d414bdb;hb=5234409d87b0b67a528acb623af316d8462899de;hp=200d05a886269bc09dedcf34bcde5f1b2027d872;hpb=54202b835f32f432e2a12daf8124f7d238c0dde5;p=xboard.git diff --git a/draw.c b/draw.c index 200d05a..5af4918 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; @@ -314,7 +316,7 @@ ScaleOnePiece (char *name, int color, int piece) cairo_paint (cr); cairo_destroy (cr); - { // operate on bitmap to color it (king-size hack...) + if(!appData.trueColors || !*appData.pngDirectory && !appData.svgDirectory) { // operate on bitmap to color it (king-size hack...) int stride = cairo_image_surface_get_stride(cs)/4; int *buf = (int *) cairo_image_surface_get_data(cs); int i, j, p; @@ -500,6 +502,7 @@ DrawGrid() { /* draws a grid starting around Nx, Ny squares starting at x,y */ int i; + float odd = (lineGap & 1)/2.; cairo_t *cr; /* get a cairo_t */ @@ -511,8 +514,8 @@ DrawGrid() /* lines in X */ for (i = 0; i < BOARD_WIDTH + BOARD_HEIGHT + 2; i++) { - cairo_move_to (cr, gridSegments[i].x1, gridSegments[i].y1); - cairo_line_to (cr, gridSegments[i].x2, gridSegments[i].y2); + cairo_move_to (cr, gridSegments[i].x1 + odd, gridSegments[i].y1 + odd); + cairo_line_to (cr, gridSegments[i].x2 + odd, gridSegments[i].y2 + odd); cairo_stroke (cr); } @@ -523,7 +526,7 @@ DrawGrid() } void -DrawBorder (int x, int y, int type) +DrawBorder (int x, int y, int type, int odd) { cairo_t *cr; char *col; @@ -535,11 +538,11 @@ DrawBorder (int x, int y, int type) } cr = cairo_create(csBoardWindow); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); - cairo_rectangle(cr, x, y, squareSize+lineGap, squareSize+lineGap); + cairo_rectangle(cr, x+odd/2., y+odd/2., squareSize+lineGap, squareSize+lineGap); SetPen(cr, lineGap, col, 0); cairo_stroke(cr); cairo_destroy(cr); - GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap, squareSize+2*lineGap); + GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap+odd, squareSize+2*lineGap+odd); } static int @@ -602,7 +605,8 @@ BlankSquare (cairo_surface_t *dest, int x, int y, int color, ChessSquare piece, case 2: col = "#000000"; break; } SetPen(cr, 2.0, col, 0); - cairo_rectangle (cr, x, y, squareSize, squareSize); + cairo_rectangle (cr, fac*x, fac*y, squareSize, squareSize); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_fill (cr); cairo_destroy (cr); } @@ -651,6 +655,7 @@ void DrawDot (int marker, int x, int y, int r) { // used for atomic captures; no need to draw on backup DoDrawDot(csBoardWindow, marker, x, y, r); + GraphExpose(currBoard, x-r, y-r, 2*r, 2*r); } void