Fix expose requests seek graph
[xboard.git] / draw.c
diff --git a/draw.c b/draw.c
index 45a332c..3807516 100644 (file)
--- 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;
+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 +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 ()
-{
-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 +161,6 @@ InitDrawingSizes (BoardSize boardSize, int flags)
 
     oldWidth = boardWidth; oldHeight = boardHeight;
     CreateGrid();
-    NewSurfaces();
 
     /*
      * Inhibit shell resizing.
@@ -388,6 +372,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 +386,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 +405,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 +430,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 +472,6 @@ DrawGrid()
   int i;
   cairo_t *cr;
 
-  DrawSeekOpen();
   /* get a cairo_t */
   cr = cairo_create (csBoardWindow);
 
@@ -514,7 +496,6 @@ void
 DrawBorder (int x, int y, int type)
 {
     cairo_t *cr;
-    DrawSeekOpen();
     char *col;
 
     switch(type) {
@@ -528,7 +509,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 +531,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 +620,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 +629,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 +685,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 +731,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