Code cleanup: move expose redraw to draw.c
[xboard.git] / draw.c
diff --git a/draw.c b/draw.c
index 7ec217a..ea6e4be 100644 (file)
--- a/draw.c
+++ b/draw.c
@@ -78,10 +78,6 @@ extern char *getenv();
 // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are.
 #include "common.h"
 
-#if HAVE_LIBXPM
-#include "pixmaps/pixmaps.h"
-#endif
-
 #include "frontend.h"
 #include "backend.h"
 #include "xevalgraph.h"
@@ -204,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)
 {
@@ -224,39 +231,6 @@ char *pngPieceNames[] = // must be in same order as internal piece encoding
   "GoldKnight", "GoldLance", "GoldPawn", "GoldSilver", NULL
 };
 
-cairo_surface_t *
-ConvertPixmap (int color, int piece)
-{
-  int i, j, stride, f, colcode[10], w, b;
-  char ch[10];
-  cairo_surface_t *res;
-  XpmPieces *p = builtInXpms + 10;
-  char **pixels = p->xpm[piece % BlackPawn][2*color];
-  int *buf;
-  sscanf(pixels[0], "%*d %*d %d", &f);
-  sscanf(appData.whitePieceColor+1, "%x", &w);
-  sscanf(appData.blackPieceColor+1, "%x", &b);
-  res = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, p->size, p->size);
-  stride = cairo_image_surface_get_stride(res);
-  buf = (int *) cairo_image_surface_get_data(res);
-  for(i=0; i<f; i++) {
-    ch[i] = pixels[i+1][0];
-    colcode[i] = 0;
-    if(strstr(pixels[i+1], "black")) colcode[i] = 0xFF000000; // 0xFF000000 + (color ? b : 0);
-    if(strstr(pixels[i+1], "white")) colcode[i] = 0xFFFFFFCC; // 0xFF000000 + w;
-  }
-  for(i=0; i<p->size; i++) {
-    for(j=0; j<p->size; j++) {
-      char c = pixels[i+f+1][j];
-      int k;
-      for(k=0; ch[k] != c && k < f; k++);
-      buf[i*p->size + j] = colcode[k];
-    }
-  }
-  cairo_surface_mark_dirty(res);
-  return res;
-}
-
 RsvgHandle *
 LoadSVG (char *dir, int color, int piece)
 {
@@ -313,7 +287,7 @@ 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
+    if(!(svgPieces[color][piece] = LoadSVG(SVGDIR, color, piece))) // try to fall back on installed svg
       DisplayError(_("No default pieces installed\nSelect your own -pieceImageDirectory"), 0); // give up
   }
 
@@ -333,7 +307,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;
@@ -348,6 +322,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);
   }