Fix multi-leg promotions
[xboard.git] / winboard / wevalgraph.c
index 997bd17..3f1f076 100644 (file)
 /*\r
- * Evaluation graph\r
+ * wevalgraph.c - Evaluation graph front-end part\r
  *\r
  * Author: Alessandro Scotti (Dec 2005)\r
  *\r
+ * Copyright 2005 Alessandro Scotti\r
+ *\r
+ * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015,\r
+ * 2016 Free Software Foundation, Inc.\r
+ *\r
  * ------------------------------------------------------------------------\r
- * This program is free software; you can redistribute it and/or modify\r
+ *\r
+ * GNU XBoard is free software: you can redistribute it and/or modify\r
  * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
+ * the Free Software Foundation, either version 3 of the License, or (at\r
+ * your option) any later version.\r
  *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
+ * GNU XBoard is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * General Public License for more details.\r
  *\r
  * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
- * ------------------------------------------------------------------------\r
- */\r
+ * along with this program. If not, see http://www.gnu.org/licenses/.  *\r
+ *\r
+ *------------------------------------------------------------------------\r
+ ** See the file ChangeLog for a revision history.  */\r
+\r
+// code refactored by HGM to obtain front-end / back-end separation\r
+\r
 #include "config.h"\r
 \r
-#include <windows.h> /* required for all Windows applications */\r
-#include <richedit.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <malloc.h>\r
+#include <windows.h>\r
 #include <commdlg.h>\r
 #include <dlgs.h>\r
+#include <stdio.h>\r
 \r
 #include "common.h"\r
-#include "winboard.h"\r
 #include "frontend.h"\r
 #include "backend.h"\r
-\r
+#include "winboard.h"\r
+#include "evalgraph.h"\r
 #include "wsnap.h"\r
 \r
-VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo );\r
-VOID EvalGraphPopUp();\r
-VOID EvalGraphPopDown();\r
-BOOL EvalGraphIsUp();\r
-\r
 #define WM_REFRESH_GRAPH    (WM_USER + 1)\r
 \r
-/* Imports from backend.c */\r
-char * SavePart(char *str);\r
-\r
-/* Imports from winboard.c */\r
-extern HWND evalGraphDialog;\r
-extern BOOLEAN evalGraphDialogUp;\r
-\r
-extern HINSTANCE hInst;\r
-extern HWND hwndMain;\r
-\r
-extern WindowPlacement wpEvalGraph;\r
-\r
 /* Module globals */\r
-static ChessProgramStats_Move * currPvInfo;\r
-static int currFirst = 0;\r
-static int currLast = 0;\r
-static int currCurrent = -1;\r
+static BOOLEAN evalGraphDialogUp;\r
 \r
 static COLORREF crWhite = RGB( 0xFF, 0xFF, 0xB0 );\r
 static COLORREF crBlack = RGB( 0xAD, 0x5D, 0x3D );\r
 \r
 static HDC hdcPB = NULL;\r
 static HBITMAP hbmPB = NULL;\r
-static int nWidthPB = 0;\r
-static int nHeightPB = 0;\r
-static HPEN hpenDotted = NULL;\r
-static HPEN hpenBlueDotted = NULL;\r
-static HPEN hpenBold[2] = { NULL, NULL };\r
-static HBRUSH hbrHist[2] = { NULL, NULL };\r
-\r
-static int MarginX = 18;\r
-static int MarginW = 4;\r
-static int MarginH = 4;\r
-\r
-#define MIN_HIST_WIDTH  4\r
-#define MAX_HIST_WIDTH  10\r
-\r
-static int GetPvScore( int index )\r
-{\r
-    int score = currPvInfo[ index ].score;\r
-\r
-    if( index & 1 ) score = -score; /* Flip score for black */\r
-\r
-    return score;\r
-}\r
-\r
-static VOID DrawLine( int x1, int y1, int x2, int y2 )\r
-{\r
-    MoveToEx( hdcPB, x1, y1, NULL );\r
-\r
-    LineTo( hdcPB, x2, y2 );\r
-}\r
-\r
-static VOID DrawLineEx( int x1, int y1, int x2, int y2 )\r
-{\r
-    POINT stPT;\r
-\r
-    MoveToEx( hdcPB, x1, y1, &stPT );\r
-\r
-    LineTo( hdcPB, x2, y2 );\r
-\r
-    MoveToEx( hdcPB, stPT.x, stPT.y, NULL );\r
-}\r
-\r
-static HBRUSH CreateBrush( UINT style, COLORREF color )\r
-{\r
-    LOGBRUSH stLB;\r
-\r
-    stLB.lbStyle = style;\r
-    stLB.lbColor = color;\r
-    stLB.lbHatch = 0;\r
+static HPEN pens[PEN_ANY+1]; // [HGM] put all pens in one array\r
+static HBRUSH hbrHist[3] = { NULL, NULL, NULL };\r
 \r
-    return CreateBrushIndirect( &stLB );\r
-}\r
-\r
-/*\r
-    For a centipawn value, this function returns the height of the corresponding\r
-    histogram, centered on the reference axis.\r
-\r
-    Note: height can be negative!\r
-*/\r
-static int GetValueY( int value )\r
+Boolean EvalGraphIsUp()\r
 {\r
-    if( value < -700 ) value = -700;\r
-    if( value > +700 ) value = +700;\r
-\r
-    return (nHeightPB / 2) - (int)(value * (nHeightPB - 2*MarginH) / 1400.0);\r
+    return evalGraphDialogUp;\r
 }\r
 \r
-static VOID DrawAxisSegmentHoriz( int value, BOOL drawValue )\r
+// [HGM] front-end, added as wrapper to avoid use of LineTo and MoveToEx in other routines (so they can be back-end) \r
+void DrawSegment( int x, int y, int *lastX, int *lastY, int penType )\r
 {\r
-    int y = GetValueY( value*100 );\r
-\r
-    SelectObject( hdcPB, GetStockObject(BLACK_PEN) );\r
-    DrawLine( MarginX, y, MarginX + MarginW, y );\r
-    SelectObject( hdcPB, hpenDotted );\r
-    DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y );\r
-\r
-    if( drawValue ) {\r
-        SIZE stSize;\r
-        char buf[8];\r
-        int cbBuf;\r
-\r
-        if( value > 0 ) {\r
-            buf[0] = '+';\r
-            itoa( value, buf+1, 10 );\r
-        }\r
-        else {\r
-            itoa( value, buf, 10 );\r
-        }\r
-\r
-        cbBuf = strlen( buf );\r
-\r
-        GetTextExtentPoint32( hdcPB, buf, cbBuf, &stSize );\r
-\r
-        TextOut( hdcPB, MarginX - stSize.cx - 2, y - stSize.cy / 2, buf, cbBuf );\r
+    POINT stPt;\r
+    if(penType == PEN_NONE) MoveToEx( hdcPB, x, y, &stPt ); else {\r
+       HPEN hp = SelectObject( hdcPB, pens[penType] );\r
+       LineTo( hdcPB, x, y );\r
+       SelectObject( hdcPB, hp );\r
     }\r
+    if(lastX != NULL) { *lastX = stPt.x; *lastY = stPt.y; }\r
 }\r
 \r
-static VOID DrawAxis()\r
-{\r
-    int cy = nHeightPB / 2;\r
-    \r
-    SelectObject( hdcPB, GetStockObject(NULL_BRUSH) );\r
-\r
-    SetBkMode( hdcPB, TRANSPARENT );\r
-\r
-    DrawAxisSegmentHoriz( +5, TRUE );\r
-    DrawAxisSegmentHoriz( +3, FALSE );\r
-    DrawAxisSegmentHoriz( +1, FALSE );\r
-    DrawAxisSegmentHoriz(  0, TRUE );\r
-    DrawAxisSegmentHoriz( -1, FALSE );\r
-    DrawAxisSegmentHoriz( -3, FALSE );\r
-    DrawAxisSegmentHoriz( -5, TRUE );\r
-\r
-    SelectObject( hdcPB, GetStockObject(BLACK_PEN) );\r
-\r
-    DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy );\r
-    DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH );\r
-}\r
-\r
-static VOID DrawHistogram( int x, int y, int width, int value, int side )\r
+// front-end wrapper for drawing functions to do rectangles\r
+void DrawRectangle( int left, int top, int right, int bottom, int side, int style )\r
 {\r
+    HPEN hp = SelectObject( hdcPB, pens[PEN_BLACK] );\r
     RECT rc;\r
 \r
-    if( value > -25 && value < +25 ) return;\r
-\r
-    rc.left = x;\r
-    rc.right = rc.left + width + 1;\r
-\r
-    if( value > 0 ) {\r
-        rc.top = GetValueY( value );\r
-        rc.bottom = y+1;\r
-    }\r
-    else {\r
-        rc.top = y;\r
-        rc.bottom = GetValueY( value ) + 1;\r
-    }\r
-\r
-\r
-    if( width == MIN_HIST_WIDTH ) {\r
-        rc.right--;\r
+    rc.top = top; rc.left = left; rc.bottom = bottom; rc.right = right;\r
+    if(style == FILLED)\r
         FillRect( hdcPB, &rc, hbrHist[side] );\r
-    }\r
     else {\r
         SelectObject( hdcPB, hbrHist[side] );\r
-        Rectangle( hdcPB, rc.left, rc.top, rc.right, rc.bottom );\r
-    }\r
-}\r
-\r
-static VOID DrawSeparator( int index, int x )\r
-{\r
-    if( index > 0 ) {\r
-        if( index == currCurrent ) {\r
-            HPEN hp = SelectObject( hdcPB, hpenBlueDotted );\r
-            DrawLineEx( x, MarginH, x, nHeightPB - MarginH );\r
-            SelectObject( hdcPB, hp );\r
-        }\r
-        else if( (index % 20) == 0 ) {\r
-            HPEN hp = SelectObject( hdcPB, hpenDotted );\r
-            DrawLineEx( x, MarginH, x, nHeightPB - MarginH );\r
-            SelectObject( hdcPB, hp );\r
-        }\r
-    }\r
-}\r
-\r
-/* Actually draw histogram as a diagram, cause there's too much data */\r
-static VOID DrawHistogramAsDiagram( int cy, int paint_width, int hist_count )\r
-{\r
-    double step;\r
-    int i;\r
-\r
-    /* Rescale the graph every few moves (as opposed to every move) */\r
-    hist_count -= hist_count % 8;\r
-    hist_count += 8;\r
-    hist_count /= 2;\r
-\r
-    step = (double) paint_width / (hist_count + 1);\r
-\r
-    for( i=0; i<2; i++ ) {\r
-        int index = currFirst;\r
-        int side = (currCurrent + i + 1) & 1; /* Draw current side last */\r
-        double x = MarginX + MarginW;\r
-\r
-        if( (index & 1) != side ) {\r
-            x += step / 2;\r
-            index++;\r
-        }\r
-\r
-        SelectObject( hdcPB, hpenBold[side] );\r
-\r
-        MoveToEx( hdcPB, (int) x, cy, NULL );\r
-\r
-        index += 2;\r
-\r
-        while( index < currLast ) {\r
-            x += step;\r
-\r
-            DrawSeparator( index, (int) x );\r
-\r
-            /* Extend line up to current point */\r
-            if( currPvInfo[index].depth > 0 ) {\r
-                LineTo( hdcPB, (int) x, GetValueY( GetPvScore(index) ) );\r
-            }\r
-\r
-            index += 2;\r
-        }\r
-    }\r
-}\r
-\r
-static VOID DrawHistogramFull( int cy, int hist_width, int hist_count )\r
-{\r
-    int i;\r
-\r
-    SelectObject( hdcPB, GetStockObject(BLACK_PEN) );\r
-\r
-    for( i=0; i<hist_count; i++ ) {\r
-        int index = currFirst + i;\r
-        int x = MarginX + MarginW + index * hist_width;\r
-\r
-        /* Draw a separator every 10 moves */\r
-        DrawSeparator( index, x );\r
-\r
-        /* Draw histogram */\r
-        if( currPvInfo[i].depth > 0 ) {\r
-            DrawHistogram( x, cy, hist_width, GetPvScore(index), index & 1 );\r
-        }\r
-    }\r
-}\r
-\r
-typedef struct {\r
-    int cy;\r
-    int hist_width;\r
-    int hist_count;\r
-    int paint_width;\r
-} VisualizationData;\r
-\r
-static BOOL InitVisualization( VisualizationData * vd )\r
-{\r
-    BOOL result = FALSE;\r
-\r
-    vd->cy = nHeightPB / 2;\r
-    vd->hist_width = MIN_HIST_WIDTH;\r
-    vd->hist_count = currLast - currFirst;\r
-    vd->paint_width = nWidthPB - MarginX - 2*MarginW;\r
-\r
-    if( vd->hist_count > 0 ) {\r
-        result = TRUE;\r
-\r
-        /* Compute width */\r
-        vd->hist_width = vd->paint_width / vd->hist_count;\r
-\r
-        if( vd->hist_width > MAX_HIST_WIDTH ) vd->hist_width = MAX_HIST_WIDTH;\r
-\r
-        vd->hist_width -= vd->hist_width % 2;\r
-    }\r
-\r
-    return result;\r
-}\r
-\r
-static VOID DrawHistograms()\r
-{\r
-    VisualizationData vd;\r
-\r
-    if( InitVisualization( &vd ) ) {\r
-        if( vd.hist_width < MIN_HIST_WIDTH ) {\r
-            DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count );\r
-        }\r
-        else {\r
-            DrawHistogramFull( vd.cy, vd.hist_width, vd.hist_count );\r
-        }\r
+        Rectangle( hdcPB, left, top, right, bottom );\r
     }\r
+    SelectObject( hdcPB, hp );\r
 }\r
 \r
-static int GetMoveIndexFromPoint( int x, int y )\r
+// front-end wrapper for putting text in graph\r
+void DrawEvalText(char *buf, int cbBuf, int y)\r
 {\r
-    int result = -1;\r
-    int start_x = MarginX + MarginW;\r
-    VisualizationData vd;\r
-\r
-    if( x >= start_x && InitVisualization( &vd ) ) {\r
-        /* Almost an hack here... we duplicate some of the paint logic */\r
-        if( vd.hist_width < MIN_HIST_WIDTH ) {\r
-            double step;\r
-\r
-            vd.hist_count -= vd.hist_count % 8;\r
-            vd.hist_count += 8;\r
-            vd.hist_count /= 2;\r
-\r
-            step = (double) vd.paint_width / (vd.hist_count + 1);\r
-            step /= 2;\r
-\r
-            result = (int) (0.5 + (double) (x - start_x) / step);\r
-        }\r
-        else {\r
-            result = (x - start_x) / vd.hist_width;\r
-        }\r
-    }\r
-\r
-    if( result >= currLast ) {\r
-        result = -1;\r
-    }\r
-\r
-    return result;\r
+        SIZE stSize;\r
+       SetBkMode( hdcPB, TRANSPARENT );\r
+        GetTextExtentPoint32( hdcPB, buf, cbBuf, &stSize );\r
+        TextOut( hdcPB, MarginX - stSize.cx - 2, y - stSize.cy / 2, buf, cbBuf );\r
 }\r
 \r
-static VOID DrawBackground()\r
+// front-end\r
+static HBRUSH CreateBrush( UINT style, COLORREF color )\r
 {\r
-    HBRUSH hbr;\r
-    RECT rc;\r
-\r
-    hbr = CreateBrush( BS_SOLID, GetSysColor( COLOR_3DFACE ) );\r
-\r
-    rc.left = 0;\r
-    rc.top = 0;\r
-    rc.right = nWidthPB;\r
-    rc.bottom = nHeightPB;\r
+    LOGBRUSH stLB;\r
 \r
-    FillRect( hdcPB, &rc, hbr );\r
+    stLB.lbStyle = style;\r
+    stLB.lbColor = color;\r
+    stLB.lbHatch = 0;\r
 \r
-    DeleteObject( hbr );\r
+    return CreateBrushIndirect( &stLB );\r
 }\r
 \r
-static VOID PaintEvalGraph( HWND hWnd, HDC hDC )\r
+// front-end. Create pens, device context and buffer bitmap for global use, copy result to display\r
+// The back-end part n the middle has been taken out and moed to PainEvalGraph()\r
+static VOID DisplayEvalGraph( HWND hWnd, HDC hDC )\r
 {\r
     RECT rcClient;\r
     int width;\r
@@ -400,13 +125,15 @@ static VOID PaintEvalGraph( HWND hWnd, HDC hDC )
 \r
     /* Create or recreate paint box if needed */\r
     if( hbmPB == NULL || width != nWidthPB || height != nHeightPB ) {\r
-        if( hpenDotted == NULL ) {\r
-            hpenDotted = CreatePen( PS_DOT, 0, RGB(0xA0,0xA0,0xA0) );\r
-            hpenBlueDotted = CreatePen( PS_DOT, 0, RGB(0x00,0x00,0xFF) );\r
-            hpenBold[0] = CreatePen( PS_SOLID, 2, crWhite );\r
-            hpenBold[1] = CreatePen( PS_SOLID, 2, crBlack );\r
+        if( pens[PEN_DOTTED] == NULL ) {\r
+           pens[PEN_BLACK]      = GetStockObject(BLACK_PEN);\r
+            pens[PEN_DOTTED]     = CreatePen( PS_DOT, 0, RGB(0xA0,0xA0,0xA0) );\r
+            pens[PEN_BLUEDOTTED] = CreatePen( PS_DOT, 0, RGB(0x00,0x00,0xFF) );\r
+            pens[PEN_BOLDWHITE]  = CreatePen( PS_SOLID, 2, crWhite );\r
+            pens[PEN_BOLDBLACK]  = CreatePen( PS_SOLID, 2, crBlack );\r
             hbrHist[0] = CreateBrush( BS_SOLID, crWhite );\r
             hbrHist[1] = CreateBrush( BS_SOLID, crBlack );\r
+            hbrHist[2] = CreateBrush( BS_SOLID, GetSysColor( COLOR_3DFACE ) ); // background\r
         }\r
 \r
         if( hdcPB != NULL ) {\r
@@ -428,15 +155,17 @@ static VOID PaintEvalGraph( HWND hWnd, HDC hDC )
         SelectObject( hdcPB, hbmPB );\r
     }\r
 \r
-    /* Draw */\r
-    DrawBackground();\r
-    DrawAxis();\r
-    DrawHistograms();\r
+    // back-end painting; calls back front-end primitives for lines, rectangles and text\r
+    PaintEvalGraph();\r
+    SetWindowText(hWnd, MakeEvalTitle(differentialView ? T_("Blunder Graph") : T_("Evaluation Graph")));\r
 \r
     /* Copy bitmap into destination DC */\r
-    BitBlt( hDC, 0, 0, width, height, hdcPB, 0, 0, SRCCOPY );\r
+    BitBlt( hDC, 0, 0, nWidthPB, nHeightPB, hdcPB, 0, 0, SRCCOPY );\r
 }\r
 \r
+// Note: Once the eval graph is opened, this window-proc lives forever; een closing the\r
+// eval-graph window merely hides it. On opening we re-initialize it, though, so it could\r
+// as well hae been destroyed. While it is open it processes the REFRESH_GRAPH commands.\r
 LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )\r
 {\r
     static SnapData sd;\r
@@ -446,6 +175,7 @@ LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM l
 \r
     switch (message) {\r
     case WM_INITDIALOG:\r
+        Translate(hDlg, DLG_EvalGraph);\r
         if( evalGraphDialog == NULL ) {\r
             evalGraphDialog = hDlg;\r
 \r
@@ -475,17 +205,24 @@ LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM l
 \r
     case WM_PAINT:\r
         hDC = BeginPaint( hDlg, &stPS );\r
-        PaintEvalGraph( hDlg, hDC );\r
+        DisplayEvalGraph( hDlg, hDC );\r
         EndPaint( hDlg, &stPS );\r
         break;\r
 \r
+    case WM_MOUSEWHEEL:\r
+        if((short)HIWORD(wParam) < 0) appData.zoom++;\r
+        if((short)HIWORD(wParam) > 0 && appData.zoom > 1)  appData.zoom--;\r
+        goto paint;\r
+    case WM_RBUTTONDOWN:\r
+        differentialView = !differentialView;\r
     case WM_REFRESH_GRAPH:\r
+    paint:\r
         hDC = GetDC( hDlg );\r
-        PaintEvalGraph( hDlg, hDC );\r
+        DisplayEvalGraph( hDlg, hDC );\r
         ReleaseDC( hDlg, hDC );\r
         break;\r
 \r
-    case WM_LBUTTONDBLCLK:\r
+    case WM_LBUTTONDOWN:\r
         if( wParam == 0 || wParam == MK_LBUTTON ) {\r
             int index = GetMoveIndexFromPoint( LOWORD(lParam), HIWORD(lParam) );\r
 \r
@@ -509,38 +246,6 @@ LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM l
         break;\r
 \r
     /* Support for captionless window */\r
-#if 0\r
-    case WM_NCLBUTTONDBLCLK:\r
-        if( wParam == HTCAPTION ) {\r
-            int index;\r
-            POINT mouse_xy;\r
-            POINTS pts = MAKEPOINTS(lParam);\r
-\r
-            mouse_xy.x = pts.x;\r
-            mouse_xy.y = pts.y;\r
-            ScreenToClient( hDlg, &mouse_xy );\r
-\r
-            index = GetMoveIndexFromPoint( mouse_xy.x, mouse_xy.y );\r
-\r
-            if( index >= 0 && index < currLast ) {\r
-                ToNrEvent( index + 1 );\r
-            }\r
-        }\r
-        break;\r
-\r
-    case WM_NCHITTEST:\r
-        {\r
-            LRESULT res = DefWindowProc( hDlg, message, wParam, lParam );\r
-\r
-            if( res == HTCLIENT ) res = HTCAPTION;\r
-\r
-            SetWindowLong( hDlg, DWL_MSGRESULT, res );\r
-\r
-            return TRUE;\r
-        }\r
-        break;\r
-#endif\r
-\r
     case WM_CLOSE:\r
         EvalGraphPopDown();\r
         break;\r
@@ -561,6 +266,7 @@ LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM l
     return FALSE;\r
 }\r
 \r
+// creates the eval graph, or unhides it.\r
 VOID EvalGraphPopUp()\r
 {\r
   FARPROC lpProc;\r
@@ -589,6 +295,7 @@ VOID EvalGraphPopUp()
   evalGraphDialogUp = TRUE;\r
 }\r
 \r
+// Note that this hides the window. It could as well have destroyed it.\r
 VOID EvalGraphPopDown()\r
 {\r
   CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_UNCHECKED);\r
@@ -600,6 +307,9 @@ VOID EvalGraphPopDown()
   evalGraphDialogUp = FALSE;\r
 }\r
 \r
+// This function is the interface to the back-end. It is currently called through the front-end,\r
+// though, where it shares the HistorySet() wrapper with MoveHistorySet(). Once all front-ends\r
+// support the eval graph, it would be more logical to call it directly from the back-end.\r
 VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo )\r
 {\r
     /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */\r
@@ -613,8 +323,3 @@ VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pv
         SendMessage( evalGraphDialog, WM_REFRESH_GRAPH, 0, 0 );\r
     }\r
 }\r
-\r
-BOOL EvalGraphIsUp()\r
-{\r
-    return evalGraphDialogUp;\r
-}\r