Cleanup CairoOverlayPiece
[xboard.git] / xboard.c
index 8ffd5ce..3d05f69 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -1055,9 +1055,22 @@ InitDrawingSizes (BoardSize boardSize, int flags)
     }
     for(i=0; i<2; i++) {
        int p;
-printf("Copy pieces\n");
        for(p=0; p<=(int)WhiteKing; p++)
           pngPieceBitmaps[i][p] = pngPieceBitmaps2[i][p]; // defaults
+       if(gameInfo.variant == VariantShogi) {
+          pngPieceBitmaps[i][(int)WhiteCannon] = pngPieceBitmaps2[i][(int)WhiteKing+1];
+          pngPieceBitmaps[i][(int)WhiteNightrider] = pngPieceBitmaps2[i][(int)WhiteKing+2];
+          pngPieceBitmaps[i][(int)WhiteSilver] = pngPieceBitmaps2[i][(int)WhiteKing+3];
+          pngPieceBitmaps[i][(int)WhiteGrasshopper] = pngPieceBitmaps2[i][(int)WhiteKing+4];
+          pngPieceBitmaps[i][(int)WhiteQueen] = pngPieceBitmaps2[i][(int)WhiteLance];
+       }
+       if(gameInfo.variant == VariantGothic) {
+          pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteSilver];
+       }
+       if(gameInfo.variant == VariantSChess) {
+          pngPieceBitmaps[i][(int)WhiteAngel]    = pngPieceBitmaps2[i][(int)WhiteFalcon];
+          pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteAlfil];
+       }
     }
     oldMono = -10; // kludge to force recreation of animation masks
     oldVariant = gameInfo.variant;
@@ -2521,11 +2534,17 @@ DoDrawBorder (cairo_surface_t *cs, int x, int y, int type)
 {
     cairo_t *cr;
     DrawSeekOpen();
+    char *col;
 
+    switch(type) {
+       case 0: col = "#000000"; break;
+       case 1: col = appData.highlightSquareColor; break;
+       case 2: col = appData.premoveHighlightColor; break;
+    }
     cr = cairo_create(cs);
     cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
     cairo_rectangle(cr, x, y, squareSize+lineGap, squareSize+lineGap);
-    SetPen(cr, lineGap, type == 1 ? appData.highlightSquareColor : appData.premoveHighlightColor, 0);
+    SetPen(cr, lineGap, col, 0);
     cairo_stroke(cr);
 }
 
@@ -2888,8 +2907,18 @@ DrawOneSquare (int x, int y, ChessSquare piece, int square_color, int marker, ch
                if(align < 3) cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
                else          cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
                cairo_show_text (cr, string);
+               cairo_destroy (cr);
+               cr = cairo_create (csBoardBackup);
+               cairo_select_font_face (cr, "Sans",
+                           CAIRO_FONT_SLANT_NORMAL,
+                           CAIRO_FONT_WEIGHT_BOLD);
+
+               cairo_set_font_size (cr, squareSize/4);
 
-               /* free memory */
+               cairo_move_to (cr, xx-1, yy);
+               if(align < 3) cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+               else          cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+               cairo_show_text (cr, string);
                cairo_destroy (cr);
            } else
            XDrawString(xDisplay, xBoardWindow, hGC, xx, yy, string, 1);
@@ -4119,18 +4148,12 @@ OverlayPiece (ChessSquare piece, GC clip, GC outline,  Drawable dest)
 static void
 CairoOverlayPiece (ChessSquare piece, cairo_surface_t *dest)
 {
-  static ChessSquare oldPiece = -1;
-  static int oldSize;
   static cairo_t *pieceSource;
-  extern int doubleClick; // in backend.c
-  if(piece != oldPiece || squareSize != oldSize) { // try make it faster by only changing cr if we need other piece
-    if(pieceSource) cairo_destroy (pieceSource);
-    pieceSource = cairo_create (dest);
-    cairo_set_source_surface (pieceSource, pngPieceBitmaps[!White(piece)][piece % BlackPawn], 0, 0);
-    oldPiece = piece; oldSize = squareSize;
-  }
+  pieceSource = cairo_create (dest);
+  cairo_set_source_surface (pieceSource, pngPieceBitmaps[!White(piece)][piece % BlackPawn], 0, 0);
   if(doubleClick) cairo_paint_with_alpha (pieceSource, 0.6);
   else cairo_paint(pieceSource);
+  cairo_destroy (pieceSource);
 }
 
 void
@@ -4188,15 +4211,12 @@ SetDragPiece (AnimNr anr, ChessSquare piece)
 
 /* [AS] Arrow highlighting support */
 
-void DrawPolygon(Pnt arrow[], int nr)
-{   // for now on own surface; eventually this should become a global that is only destroyed on resize
-    cairo_surface_t *boardSurface;
+void
+DoDrawPolygon (cairo_surface_t *cs, Pnt arrow[], int nr)
+{
     cairo_t *cr;
     int i;
-    int w = lineGap + BOARD_WIDTH * (squareSize + lineGap);
-    int h = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
-    boardSurface = cairo_xlib_surface_create(xDisplay, xBoardWindow, DefaultVisual(xDisplay, 0), w, h);
-    cr = cairo_create (boardSurface);
+    cr = cairo_create (cs);
     cairo_move_to (cr, arrow[nr-1].x, arrow[nr-1].y);
     for (i=0;i<nr;i++) {
         cairo_line_to(cr, arrow[i].x, arrow[i].y);
@@ -4211,7 +4231,13 @@ void DrawPolygon(Pnt arrow[], int nr)
 
     /* free memory */
     cairo_destroy (cr);
-    cairo_surface_destroy (boardSurface);
+}
+
+void
+DrawPolygon (Pnt arrow[], int nr)
+{
+    DoDrawPolygon(csBoardWindow, arrow, nr);
+    DoDrawPolygon(csBoardBackup, arrow, nr);
 }
 
 static void