Prevent odd-width line shift in length direction
[xboard.git] / draw.c
diff --git a/draw.c b/draw.c
index 2da2dd7..82c5582 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -200,6 +200,17 @@ InitDrawingSizes (BoardSize boardSize, int flags)
   oldMono = appData.monoMode;
 }
 
+void
+ExposeRedraw (Option *graph, int x, int y, int w, int h)
+{   // copy a selected part of the buffer bitmap to the display
+    cairo_t *cr = cairo_create((cairo_surface_t *) graph->textValue);
+    cairo_set_source_surface(cr, (cairo_surface_t *) graph->choice, 0, 0);
+    cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+    cairo_rectangle(cr, x, y, w, h);
+    cairo_fill(cr);
+    cairo_destroy(cr);
+}
+
 static void
 CreatePNGBoard (char *s, int kind)
 {
@@ -276,8 +287,13 @@ ScaleOnePiece (int color, int piece)
   }
 
   if(!pngPieceImages[color][piece]) { // we still did not manage to acquire a piece bitmap
-    if(!(svgPieces[color][piece] = LoadSVG(appData.svgDirectory, color, piece))) // try to fall back on installed svg
-      DisplayError(_("No default pieces installed\nSelect your own -pieceImageDirectory"), 0); // give up
+    static int warned = 0;
+    if(!(svgPieces[color][piece] = LoadSVG(SVGDIR, color, piece)) && !warned) { // try to fall back on installed svg
+      char *msg = _("No default pieces installed\nSelect your own -pieceImageDirectory");
+      printf("%s\n", msg); // give up
+      DisplayError(msg, 0);
+      warned = 1; // prevent error message being repeated for each piece type
+    }
   }
 
   img = pngPieceImages[color][piece];
@@ -287,6 +303,8 @@ ScaleOnePiece (int color, int piece)
   pngPieceBitmaps2[color][piece] = cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize);
   if(piece <= WhiteKing) pngPieceBitmaps[color][piece] = cs;
 
+  if(!img) return;
+
   // scaled copying of the raw png image
   cr = cairo_create(cs);
   w = cairo_image_surface_get_width (img);
@@ -296,7 +314,7 @@ ScaleOnePiece (int color, int piece)
   cairo_paint (cr);
   cairo_destroy (cr);
 
-  if(!appData.trueColors || !*appData.pieceDirectory && !appData.svgDirectory) { // operate on bitmap to color it (king-size hack...)
+  if(!appData.trueColors || !*appData.pieceDirectory) { // 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;
@@ -311,6 +329,11 @@ ScaleOnePiece (int color, int piece)
        buf[i*stride + j] = c & 0xFF000000; // alpha channel is kept at same opacity
        buf[i*stride + j] += ((int)(f*(p&0xFF0000)) & 0xFF0000) + ((int)(f*(p&0xFF00)) & 0xFF00) + (int)(f*(p&0xFF)); // add desired fraction of new color
        if(color) buf[i*stride + j] += r | r << 8 | r << 16; // details on black pieces get their weight added in pure white
+       if(appData.monoMode) {
+           if(a < 64) buf[i*stride + j] = 0; // if not opaque enough, totally transparent
+           else if(2*r < a) buf[i*stride + j] = 0xFF000000; // if not light enough, totally black
+            else buf[i*stride + j] = 0xFFFFFFFF; // otherwise white
+       }
     }
     cairo_surface_mark_dirty(cs);
   }
@@ -339,7 +362,6 @@ void
 InitDrawingParams (int reloadPieces)
 {
     int i, p;
-    MakeColors();
     if(reloadPieces)
     for(i=0; i<2; i++) for(p=0; p<BlackPawn+4; p++) {
        if(pngPieceImages[i][p]) cairo_surface_destroy(pngPieceImages[i][p]);
@@ -496,8 +518,9 @@ DrawGrid()
   /* lines in X */
   for (i = 0; i < BOARD_WIDTH + BOARD_HEIGHT + 2; i++)
     {
-      cairo_move_to (cr, gridSegments[i].x1 + odd, gridSegments[i].y1 + odd);
-      cairo_line_to (cr, gridSegments[i].x2 + odd, gridSegments[i].y2 + odd);
+      int h = (gridSegments[i].y1 == gridSegments[i].y2); // horizontal
+      cairo_move_to (cr, gridSegments[i].x1 + !h*odd, gridSegments[i].y1 + h*odd);
+      cairo_line_to (cr, gridSegments[i].x2 + !h*odd, gridSegments[i].y2 + h*odd);
       cairo_stroke (cr);
     }