X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=draw.c;h=757185099605e114a3953d1cd295cab5df83a3ed;hb=67b3a0d7c465522feb67841c7374bf863df19357;hp=3bd646552e80df25d7e42d9e9af002d76eb86bc6;hpb=54fc63f1e8ea41966f47d2b60b616db0a9c5010d;p=xboard.git diff --git a/draw.c b/draw.c index 3bd6465..7571850 100644 --- a/draw.c +++ b/draw.c @@ -110,7 +110,8 @@ extern char *getenv(); #define SOLID 0 #define OUTLINE 1 Boolean cairoAnimate; -static cairo_surface_t *csBoardWindow, *csBoardBackup, *csDualBoard; +Option *currBoard; +static 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,24 +132,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 @@ -175,7 +161,6 @@ InitDrawingSizes (BoardSize boardSize, int flags) oldWidth = boardWidth; oldHeight = boardHeight; CreateGrid(); - NewSurfaces(); /* * Inhibit shell resizing. @@ -447,12 +432,8 @@ void DrawSeekDot(int x, int y, int colorNr) void DrawSeekOpen () { - int boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); - int boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); - if(!csBoardWindow) { - csBoardWindow = GetOutputSurface(&mainOptions[W_BOARD], 0, 0); - csBoardBackup = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, boardWidth, boardHeight); - } + csBoardWindow = (cairo_surface_t *) mainOptions[W_BOARD].choice; + currBoard = &mainOptions[W_BOARD]; } void @@ -487,7 +468,7 @@ CreateGrid () } void -DoDrawGrid(cairo_surface_t *cs) +DrawGrid() { /* draws a grid starting around Nx, Ny squares starting at x,y */ int i; @@ -495,7 +476,7 @@ DoDrawGrid(cairo_surface_t *cs) DrawSeekOpen(); /* get a cairo_t */ - cr = cairo_create (cs); + cr = cairo_create (csBoardWindow); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); SetPen(cr, lineGap, "#000000", 0); @@ -515,14 +496,7 @@ DoDrawGrid(cairo_surface_t *cs) } void -DrawGrid() -{ - DoDrawGrid(csBoardWindow); - if(!dual) DoDrawGrid(csBoardBackup); -} - -void -DoDrawBorder (cairo_surface_t *cs, int x, int y, int type) +DrawBorder (int x, int y, int type) { cairo_t *cr; DrawSeekOpen(); @@ -533,18 +507,13 @@ DoDrawBorder (cairo_surface_t *cs, int x, int y, int type) case 1: col = appData.highlightSquareColor; break; case 2: col = appData.premoveHighlightColor; break; } - cr = cairo_create(cs); + cr = cairo_create(csBoardWindow); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_rectangle(cr, x, y, squareSize+lineGap, squareSize+lineGap); SetPen(cr, lineGap, col, 0); cairo_stroke(cr); -} - -void -DrawBorder (int x, int y, int type) -{ - DoDrawBorder(csBoardWindow, x, y, type); - if(!dual) DoDrawBorder(csBoardBackup, x, y, type); + cairo_destroy(cr); + GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap, squareSize+2*lineGap); } static int @@ -566,24 +535,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 @@ -660,23 +628,25 @@ DrawDot (int marker, int x, int y, int r) DoDrawDot(csBoardWindow, marker, x, y, r); } -static void -DoDrawOneSquare (cairo_surface_t *dest, int x, int y, ChessSquare piece, int square_color, int marker, char *string, int align) +void +DrawOneSquare (int x, int y, ChessSquare piece, int square_color, int marker, char *string, int align) { // basic front-end board-draw function: takes care of everything that can be in square: // piece, background, coordinate/count, marker dot cairo_t *cr; + DrawSeekOpen(); + if (piece == EmptySquare) { - BlankSquare(dest, x, y, square_color, piece, 1); + BlankSquare(csBoardWindow, x, y, square_color, piece, 1); } else { - pngDrawPiece(dest, piece, square_color, x, y); + pngDrawPiece(csBoardWindow, piece, square_color, x, y); } if(align) { // square carries inscription (coord or piece count) int xx = x, yy = y; cairo_text_extents_t te; - cr = cairo_create (dest); + cr = cairo_create (csBoardWindow); cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); @@ -705,19 +675,10 @@ DoDrawOneSquare (cairo_surface_t *dest, int x, int y, ChessSquare piece, int squ } if(marker) { // print fat marker dot, if requested - DoDrawDot(dest, marker, x + squareSize/4, y+squareSize/4, squareSize/2); + DoDrawDot(csBoardWindow, marker, x + squareSize/4, y+squareSize/4, squareSize/2); } } -void -DrawOneSquare (int x, int y, ChessSquare piece, int square_color, int marker, char *string, int align) -{ - DrawSeekOpen(); - DoDrawOneSquare (csBoardWindow, x, y, piece, square_color, marker, string, align); - if(!dual) - DoDrawOneSquare (csBoardBackup, x, y, piece, square_color, marker, string, align); -} - /**** Animation code by Hugh Fisher, DCS, ANU. ****/ /* Masks for XPM pieces. Black and white pieces can have @@ -772,22 +733,13 @@ DrawBlank (AnimNr anr, int x, int y, int startColor) void CopyRectangle (AnimNr anr, int srcBuf, int destBuf, int srcX, int srcY, int width, int height, int destX, int destY) { - cairo_t *cr;// = cairo_create (c_animBufs[anr+destBuf]); - cr = cairo_create (c_animBufs[anr+destBuf]); - if(c_animBufs[anr+srcBuf] == csBoardWindow) - cairo_set_source_surface (cr, csBoardBackup, destX - srcX, destY - srcY); - else - cairo_set_source_surface (cr, c_animBufs[anr+srcBuf], destX - srcX, destY - srcY); - cairo_rectangle (cr, destX, destY, width, height); - cairo_fill (cr); - cairo_destroy (cr); - if(c_animBufs[anr+destBuf] == csBoardWindow) { - cr = cairo_create (csBoardBackup); // also draw to backup + cairo_t *cr = cairo_create (c_animBufs[anr+destBuf]); cairo_set_source_surface (cr, c_animBufs[anr+srcBuf], destX - srcX, destY - srcY); cairo_rectangle (cr, destX, destY, width, height); cairo_fill (cr); cairo_destroy (cr); - } + if(c_animBufs[anr+destBuf] == csBoardWindow) + GraphExpose(currBoard, destX, destY, squareSize, squareSize); } void @@ -823,7 +775,7 @@ void DrawPolygon (Pnt arrow[], int nr) { DoDrawPolygon(csBoardWindow, arrow, nr); - if(!dual) DoDrawPolygon(csBoardBackup, arrow, nr); +// if(!dual) DoDrawPolygon(csBoardBackup, arrow, nr); }