X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=da0c4d2ca69bfe74190812cc39164c856523449d;hb=ac9d48038a86a672579abbcbbc53b17e2515ba13;hp=45a332c626ec3403390ec3535222e1bcfb88810d;hpb=4ca3b41e1ccb5ebfade606202c2084f8e9328978;p=xboard.git diff --git a/draw.c b/draw.c index 45a332c..da0c4d2 100644 --- a/draw.c +++ b/draw.c @@ -55,6 +55,8 @@ #include #include #include +#include +#include #if STDC_HEADERS # include @@ -110,7 +112,8 @@ 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 @@ -131,25 +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 () -{ -return; - // 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 @@ -176,7 +163,6 @@ InitDrawingSizes (BoardSize boardSize, int flags) oldWidth = boardWidth; oldHeight = boardHeight; CreateGrid(); - NewSurfaces(); /* * Inhibit shell resizing. @@ -277,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]); @@ -288,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); @@ -300,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); @@ -388,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 ) @@ -401,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) @@ -419,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) @@ -443,17 +462,13 @@ 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 -DrawSeekOpen () -{ - csBoardWindow = (cairo_surface_t *) mainOptions[W_BOARD].choice; -} - -void -DrawSeekClose () +InitDrawingHandle (Option *opt) { + csBoardWindow = DRAWABLE(opt); } void @@ -489,7 +504,6 @@ DrawGrid() int i; cairo_t *cr; - DrawSeekOpen(); /* get a cairo_t */ cr = cairo_create (csBoardWindow); @@ -514,7 +528,6 @@ void DrawBorder (int x, int y, int type) { cairo_t *cr; - DrawSeekOpen(); char *col; switch(type) { @@ -528,7 +541,7 @@ DrawBorder (int x, int y, int type) SetPen(cr, lineGap, col, 0); cairo_stroke(cr); cairo_destroy(cr); - DrawExpose(NULL, x, y, squareSize+2*lineGap, squareSize+2*lineGap); + GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap, squareSize+2*lineGap); } static int @@ -550,24 +563,23 @@ CutOutSquare (int x, int y, int *x0, int *y0, int kind) } void -DrawLogo (void *handle, void *logo) +DrawLogo (Option *opt, void *logo) { - cairo_surface_t *img, *cs; + cairo_surface_t *img; cairo_t *cr; int w, h; - if(!logo || !handle) return; - cs = GetOutputSurface(handle, appData.logoSize, appData.logoSize/2); + if(!logo || !opt) return; img = cairo_image_surface_create_from_png (logo); w = cairo_image_surface_get_width (img); h = cairo_image_surface_get_height (img); - cr = cairo_create(cs); + cr = cairo_create(DRAWABLE(opt)); cairo_scale(cr, (float)appData.logoSize/w, appData.logoSize/(2.*h)); cairo_set_source_surface (cr, img, 0, 0); cairo_paint (cr); cairo_destroy (cr); cairo_surface_destroy (img); - cairo_surface_destroy (cs); + GraphExpose(opt, 0, 0, appData.logoSize, appData.logoSize/2); } static void @@ -640,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); } @@ -650,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 { @@ -708,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; @@ -755,7 +763,7 @@ void CopyRectangle (AnimNr anr, int srcBuf, int destBuf, cairo_fill (cr); cairo_destroy (cr); if(c_animBufs[anr+destBuf] == csBoardWindow) - DrawExpose(NULL, destX, destY, squareSize, squareSize); + GraphExpose(currBoard, destX, destY, squareSize, squareSize); } void