X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=da0c4d2ca69bfe74190812cc39164c856523449d;hb=ac9d48038a86a672579abbcbbc53b17e2515ba13;hp=668e4a568104411b67ea1d7b6dbe57a875090b46;hpb=caa23c86bfabccac8edc448f6521e475b1f65d36;p=xboard.git diff --git a/draw.c b/draw.c index 668e4a5..da0c4d2 100644 --- a/draw.c +++ b/draw.c @@ -55,6 +55,8 @@ #include #include #include +#include +#include #if STDC_HEADERS # include @@ -261,9 +263,35 @@ ScaleOnePiece (char *name, int color, int piece) { float w, h; char buf[MSG_SIZ]; + RsvgHandle *svg=NULL; + RsvgDimensionData svg_dimensions; + GError **svgerror=NULL; cairo_surface_t *img, *cs; cairo_t *cr; + g_type_init (); + + 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]); + + 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); + + 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); + + 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]); @@ -272,10 +300,13 @@ ScaleOnePiece (char *name, int color, int piece) } } pngPieceImages[color][piece] = img; + + // create new bitmap to hold scaled piece image (and remove any old) if(pngPieceBitmaps2[color][piece]) cairo_surface_destroy (pngPieceBitmaps2[color][piece]); pngPieceBitmaps2[color][piece] = cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize); if(piece <= WhiteKing) pngPieceBitmaps[color][piece] = cs; + // scaled copying of the raw png image cr = cairo_create(cs); w = cairo_image_surface_get_width (img); @@ -284,6 +315,7 @@ ScaleOnePiece (char *name, int color, int piece) cairo_set_source_surface (cr, img, 0, 0); cairo_paint (cr); cairo_destroy (cr); + { // 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); @@ -372,6 +404,7 @@ void DrawSeekAxis( int x, int y, int xTo, int yTo ) /* free memory */ cairo_destroy (cr); + GraphExpose(currBoard, x-1, yTo-1, xTo-x+2, y-yTo+2); } void DrawSeekBackground( int left, int top, int right, int bottom ) @@ -385,6 +418,7 @@ void DrawSeekBackground( int left, int top, int right, int bottom ) /* free memory */ cairo_destroy (cr); + GraphExpose(currBoard, left, top, right-left, bottom-top); } void DrawSeekText(char *buf, int x, int y) @@ -403,6 +437,7 @@ void DrawSeekText(char *buf, int x, int y) /* free memory */ cairo_destroy (cr); + GraphExpose(currBoard, x-5, y-10, 60, 15); } void DrawSeekDot(int x, int y, int colorNr) @@ -427,6 +462,7 @@ void DrawSeekDot(int x, int y, int colorNr) /* free memory */ cairo_destroy (cr); + GraphExpose(currBoard, x-squareSize/8, y-squareSize/8, 2*(squareSize/8), 2*(squareSize/8)); } void @@ -436,16 +472,6 @@ InitDrawingHandle (Option *opt) } void -DrawSeekOpen () -{ -} - -void -DrawSeekClose () -{ -} - -void CreateGrid () { int i, j; @@ -478,7 +504,6 @@ DrawGrid() int i; cairo_t *cr; - DrawSeekOpen(); /* get a cairo_t */ cr = cairo_create (csBoardWindow); @@ -503,7 +528,6 @@ void DrawBorder (int x, int y, int type) { cairo_t *cr; - DrawSeekOpen(); char *col; switch(type) { @@ -628,7 +652,6 @@ DoDrawDot (cairo_surface_t *cs, int marker, int x, int y, int r) void DrawDot (int marker, int x, int y, int r) { // used for atomic captures; no need to draw on backup - DrawSeekOpen(); DoDrawDot(csBoardWindow, marker, x, y, r); } @@ -638,8 +661,6 @@ DrawOneSquare (int x, int y, ChessSquare piece, int square_color, int marker, ch // piece, background, coordinate/count, marker dot cairo_t *cr; - DrawSeekOpen(); - if (piece == EmptySquare) { BlankSquare(csBoardWindow, x, y, square_color, piece, 1); } else { @@ -696,7 +717,6 @@ static cairo_surface_t *c_animBufs[3*NrOfAnims]; // newBuf, saveBuf static void InitAnimState (AnimNr anr) { - DrawSeekOpen(); // set cs to board widget if(c_animBufs[anr]) cairo_surface_destroy (c_animBufs[anr]); if(c_animBufs[anr+2]) cairo_surface_destroy (c_animBufs[anr+2]); c_animBufs[anr+4] = csBoardWindow;