Redo seek graph with cairo
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 3 Oct 2012 09:20:12 +0000 (11:20 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 21 Oct 2012 09:28:08 +0000 (11:28 +0200)
New front-end services DrawSeekOpen() and DrawSeekClose() have been
added, and are called from the back-end to enclose any drawing activity.
In WinBoard these had to be defined as dummies.

backend.c
frontend.h
winboard/winboard.c
xboard.c

index 564b95e..c830d4e 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -2510,6 +2510,14 @@ PlotSeekAd (int i)
        DrawSeekDot(xList[i]=x+3*(color&~SQUARE), yList[i]=h-1-y, colorList[i]=color);
 }
 
+void
+PlotSingleSeekAd (int i)
+{
+       DrawSeekOpen();
+       PlotSeekAd(i);
+       DrawSeekClose();
+}
+
 void
 AddAd (char *handle, char *rating, int base, int inc,  char rated, char *type, int nr, Boolean plot)
 {
@@ -2530,7 +2538,7 @@ AddAd (char *handle, char *rating, int base, int inc,  char rated, char *type, i
            seekNrList[nrOfSeekAds] = nr;
            zList[nrOfSeekAds] = 0;
            seekAdList[nrOfSeekAds++] = StrSave(buf);
-           if(plot) PlotSeekAd(nrOfSeekAds-1);
+           if(plot) PlotSingleSeekAd(nrOfSeekAds-1);
        }
 }
 
@@ -2594,6 +2602,7 @@ DrawSeekGraph ()
     h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap;
     w = BOARD_WIDTH  * (squareSize + lineGap) + lineGap;
 
+    DrawSeekOpen();
     DrawSeekBackground(0, 0, w, h);
     DrawSeekAxis(hMargin, h-1-vMargin, w-5, h-1-vMargin);
     DrawSeekAxis(hMargin, h-1-vMargin, hMargin, 5);
@@ -2618,6 +2627,7 @@ DrawSeekGraph ()
        }
     }
     for(i=0; i<nrOfSeekAds; i++) PlotSeekAd(i);
+    DrawSeekClose();
     return TRUE;
 }
 
index 56fed20..2956cf8 100644 (file)
@@ -97,6 +97,8 @@ void DrawSeekAxis P(( int x, int y, int xTo, int yTo ));
 void DrawSeekBackground P(( int left, int top, int right, int bottom ));
 void DrawSeekText P((char *buf, int x, int y));
 void DrawSeekDot P((int x, int y, int color));
+void DrawSeekOpen P((void));
+void DrawSeekClose P((void));
 void PopUpMoveDialog P((char first));
 
 void RingBell P((void));
index f20e671..f133d33 100644 (file)
@@ -3555,6 +3555,14 @@ void DrawSeekDot(int x, int y, int color)
            SelectObject(hdcSeek, oldBrush);\r
 }\r
 \r
+void DrawSeekOpen()\r
+{\r
+}\r
+\r
+void DrawSeekClose()\r
+{\r
+}\r
+\r
 VOID\r
 HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board)\r
 {\r
index 41f772b..92896f4 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -2794,38 +2794,98 @@ EventProc (Widget widget, caddr_t unused, XEvent *event)
        DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other
 }
 
-// [HGM] seekgraph: some low-level drawing routines cloned from xevalgraph
-void
-DrawSeekAxis (int x, int y, int xTo, int yTo)
+// [HGM] seekgraph: some low-level drawing routines (by JC, mostly)
+
+static cairo_surface_t *cs; // to keep out of back-end :-(
+
+void DrawSeekAxis( int x, int y, int xTo, int yTo )
 {
-      XDrawLine(xDisplay, xBoardWindow, lineGC, x, y, xTo, yTo);
+    cairo_t *cr;
+
+    /* get a cairo_t */
+    cr = cairo_create (cs);
+
+    cairo_move_to (cr, x, y);
+    cairo_line_to(cr, xTo, yTo );
+
+    cairo_set_line_width(cr, 2);
+    cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+    cairo_stroke(cr);
+
+    /* free memory */
+    cairo_destroy (cr);
 }
 
-void
-DrawSeekBackground (int left, int top, int right, int bottom)
+void DrawSeekBackground( int left, int top, int right, int bottom )
 {
-    XFillRectangle(xDisplay, xBoardWindow, lightSquareGC, left, top, right-left, bottom-top);
+    cairo_t *cr = cairo_create (cs);
+
+    cairo_rectangle (cr, left, top, right-left, bottom-top);
+
+    cairo_set_source_rgba(cr, 0.8, 0.8, 0.4,1.0);
+    cairo_fill(cr);
+
+    /* free memory */
+    cairo_destroy (cr);
 }
 
-void
-DrawSeekText (char *buf, int x, int y)
+void DrawSeekText(char *buf, int x, int y)
 {
-    XDrawString(xDisplay, xBoardWindow, coordGC, x, y+4, buf, strlen(buf));
+    cairo_t *cr = cairo_create (cs);
+
+    cairo_select_font_face (cr, "Sans",
+                           CAIRO_FONT_SLANT_NORMAL,
+                           CAIRO_FONT_WEIGHT_NORMAL);
+
+    cairo_set_font_size (cr, 12.0);
+
+    cairo_move_to (cr, x, y+4);
+    cairo_show_text( cr, buf);
+
+    cairo_set_source_rgba(cr, 0, 0, 0,1.0);
+    cairo_stroke(cr);
+
+    /* free memory */
+    cairo_destroy (cr);
 }
 
-void
-DrawSeekDot (int x, int y, int colorNr)
+void DrawSeekDot(int x, int y, int colorNr)
 {
+    cairo_t *cr = cairo_create (cs);
     int square = colorNr & 0x80;
-    GC color;
     colorNr &= 0x7F;
-    color = colorNr == 0 ? prelineGC : colorNr == 1 ? darkSquareGC : highlineGC;
+
     if(square)
-       XFillRectangle(xDisplay, xBoardWindow, color,
-               x-squareSize/9, y-squareSize/9, 2*squareSize/9, 2*squareSize/9);
+       cairo_rectangle (cr, x-squareSize/9, y-squareSize/9, 2*squareSize/9, 2*squareSize/9);
     else
-       XFillArc(xDisplay, xBoardWindow, color,
-               x-squareSize/8, y-squareSize/8, squareSize/4, squareSize/4, 0, 64*360);
+       cairo_arc(cr, x, y, squareSize/8, 0.0, 2*M_PI);
+
+    cairo_set_line_width(cr, 2);
+    cairo_set_source_rgba(cr, 0, 0, 0,1.0);
+    cairo_stroke_preserve(cr);
+    switch (colorNr) {
+      case 0: cairo_set_source_rgba(cr, 1.0, 0, 0,1.0);        break;
+      case 1: cairo_set_source_rgba (cr, 0.0, 0.7, 0.2, 1.0); break;
+      default: cairo_set_source_rgba (cr, 1.0, 1.0, 0.0, 1.0); break;
+    }
+    cairo_fill(cr);
+
+    /* free memory */
+    cairo_destroy (cr);
+}
+
+void
+DrawSeekOpen ()
+{
+    int boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
+    int boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+    cs = cairo_xlib_surface_create(xDisplay, xBoardWindow, DefaultVisual(xDisplay, 0), boardWidth, boardHeight);
+}
+
+void
+DrawSeekClose ()
+{
+    cairo_surface_destroy(cs);
 }
 
 void