X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=ab9b693cf4feb6e38288c02122a2708e30c19740;hb=15eab3074ed1dc476c19b48da66e82dea27399b5;hp=20553e258bd8ba3521ac0ae6b16a8066a4919f7f;hpb=8c8feabe34a974805b243ca3c9268e3ec296d6cb;p=xboard.git diff --git a/draw.c b/draw.c index 20553e2..ab9b693 100644 --- a/draw.c +++ b/draw.c @@ -55,6 +55,8 @@ #include #include #include +#include +#include #if STDC_HEADERS # include @@ -110,7 +112,9 @@ extern char *getenv(); #define SOLID 0 #define OUTLINE 1 Boolean cairoAnimate; -static cairo_surface_t *csBoardWindow, *csBoardBackup, *csDualBoard; +Option *currBoard; +cairo_surface_t *csBoardWindow; +static cairo_surface_t *pngPieceImages[2][(int)BlackPawn+4]; // png 256 x 256 images static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn]; // scaled pieces as used static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn+4]; // scaled pieces in store static cairo_surface_t *pngBoardBitmap[2]; @@ -130,24 +134,9 @@ static int dual = 0; void SwitchWindow () { - cairo_surface_t *cstmp = csBoardWindow; - csBoardWindow = csDualBoard; dual = !dual; - if(!csDualBoard) { - csBoardWindow = GetOutputSurface(&dualOptions[3], 0, 0); - dual = 1; - } - csDualBoard = cstmp; -} - -void -NewSurfaces () -{ - // delete surfaces after size becomes invalid, so they will be recreated - if(csBoardWindow) cairo_surface_destroy(csBoardWindow); - if(csBoardBackup) cairo_surface_destroy(csBoardBackup); - if(csDualBoard) cairo_surface_destroy(csDualBoard); - csBoardWindow = csBoardBackup = csDualBoard = NULL; + currBoard = (dual ? &mainOptions[W_BOARD] : &dualOptions[3]); + csBoardWindow = DRAWABLE(currBoard); } #define BoardSize int @@ -174,7 +163,6 @@ InitDrawingSizes (BoardSize boardSize, int flags) oldWidth = boardWidth; oldHeight = boardHeight; CreateGrid(); - NewSurfaces(); /* * Inhibit shell resizing. @@ -275,9 +263,34 @@ 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; - static cairo_surface_t *pngPieceImages[2][(int)BlackPawn+4]; // png 256 x 256 images + + 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 { @@ -287,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); @@ -299,7 +315,8 @@ 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...) + + 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; @@ -339,9 +356,15 @@ CreateAnyPieces () } void -InitDrawingParams () +InitDrawingParams (int reloadPieces) { + int i, p; MakeColors(); + if(reloadPieces) + for(i=0; i<2; i++) for(p=0; p