--- /dev/null
+/*
+ * evalgraph.c - Evaluation graph back-end part
+ *
+ * Author: Alessandro Scotti (Dec 2005)
+ *
+ * Copyright 2005 Alessandro Scotti
+ *
+ * ------------------------------------------------------------------------
+ *
+ * GNU XBoard is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU XBoard is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/. *
+ *
+ *------------------------------------------------------------------------
+ ** See the file ChangeLog for a revision history. */
+
+// code refactored by HGM to obtain front-end / back-end separation
+
+#include "config.h"
+
+#include <stdio.h>
+
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else /* not STDC_HEADERS */
+# if HAVE_STRING_H
+# include <string.h>
+# else /* not HAVE_STRING_H */
+# include <strings.h>
+# endif /* not HAVE_STRING_H */
+#endif /* not STDC_HEADERS */
+
+#include "common.h"
+#include "frontend.h"
+#include "backend.h"
+#include "evalgraph.h"
+
+/* Module globals */
+ChessProgramStats_Move * currPvInfo;
+int currFirst = 0;
+int currLast = 0;
+int currCurrent = -1;
+
+int nWidthPB = 0;
+int nHeightPB = 0;
+
+int MarginX = 18;
+int MarginW = 4;
+int MarginH = 4;
+
+// back-end
+static void DrawLine( int x1, int y1, int x2, int y2, int penType )
+{
+ DrawSegment( x1, y1, NULL, NULL, PEN_NONE );
+ DrawSegment( x2, y2, NULL, NULL, penType );
+}
+
+// back-end
+static void DrawLineEx( int x1, int y1, int x2, int y2, int penType )
+{
+ int savX, savY;
+ DrawSegment( x1, y1, &savX, &savY, PEN_NONE );
+ DrawSegment( x2, y2, NULL, NULL, penType );
+ DrawSegment( savX, savY, NULL, NULL, PEN_NONE );
+}
+
+// back-end
+static int GetPvScore( int index )
+{
+ int score = currPvInfo[ index ].score;
+
+ if( index & 1 ) score = -score; /* Flip score for black */
+
+ return score;
+}
+
+// back-end
+/*
+ For a centipawn value, this function returns the height of the corresponding
+ histogram, centered on the reference axis.
+
+ Note: height can be negative!
+*/
+static int GetValueY( int value )
+{
+ if( value < -700 ) value = -700;
+ if( value > +700 ) value = +700;
+
+ return (nHeightPB / 2) - (int)(value * (nHeightPB - 2*MarginH) / 1400.0);
+}
+
+// the brush selection is made part of the DrawLine, by passing a style argument
+// the wrapper for doing the text output makes this back-end
+static void DrawAxisSegmentHoriz( int value, Boolean drawValue )
+{
+ int y = GetValueY( value*100 );
+
+ if( drawValue ) {
+ char buf[MSG_SIZ], *b = buf;
+
+ if( value > 0 ) *b++ = '+';
+ sprintf(b, "%d", value);
+
+ DrawEvalText(buf, strlen(buf), y);
+ }
+ // [HGM] counts on DrawEvalText to have select transparent background for dotted line!
+ DrawLine( MarginX, y, MarginX + MarginW, y, PEN_BLACK ); // Y-axis tick marks
+ DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y, PEN_DOTTED ); // hor grid
+}
+
+// The DrawLines again must select their own brush.
+// the initial brush selection is useless? BkMode needed for dotted line and text
+static void DrawAxis()
+{
+ int cy = nHeightPB / 2;
+
+// SelectObject( hdcPB, GetStockObject(NULL_BRUSH) );
+
+// SetBkMode( hdcPB, TRANSPARENT );
+
+ DrawAxisSegmentHoriz( +5, TRUE );
+ DrawAxisSegmentHoriz( +3, FALSE );
+ DrawAxisSegmentHoriz( +1, FALSE );
+ DrawAxisSegmentHoriz( 0, TRUE );
+ DrawAxisSegmentHoriz( -1, FALSE );
+ DrawAxisSegmentHoriz( -3, FALSE );
+ DrawAxisSegmentHoriz( -5, TRUE );
+
+ DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy, PEN_BLACK ); // x-axis
+ DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH, PEN_BLACK ); // y-axis
+}
+
+// back-end
+static void DrawHistogram( int x, int y, int width, int value, int side )
+{
+ int left, top, right, bottom;
+
+ if( value > -25 && value < +25 ) return;
+
+ left = x;
+ right = left + width + 1;
+
+ if( value > 0 ) {
+ top = GetValueY( value );
+ bottom = y+1;
+ }
+ else {
+ top = y;
+ bottom = GetValueY( value ) + 1;
+ }
+
+
+ if( width == MIN_HIST_WIDTH ) {
+ right--;
+ DrawRectangle( left, top, right, bottom, side, FILLED );
+ }
+ else {
+ DrawRectangle( left, top, right, bottom, side, OPEN );
+ }
+}
+
+// back-end
+static void DrawSeparator( int index, int x )
+{
+ if( index > 0 ) {
+ if( index == currCurrent ) {
+ DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_BLUEDOTTED );
+ }
+ else if( (index % 20) == 0 ) {
+ DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_DOTTED );
+ }
+ }
+}
+
+// made back-end by replacing MoveToEx and LineTo by DrawSegment
+/* Actually draw histogram as a diagram, cause there's too much data */
+static void DrawHistogramAsDiagram( int cy, int paint_width, int hist_count )
+{
+ double step;
+ int i;
+
+ /* Rescale the graph every few moves (as opposed to every move) */
+ hist_count -= hist_count % 8;
+ hist_count += 8;
+ hist_count /= 2;
+
+ step = (double) paint_width / (hist_count + 1);
+
+ for( i=0; i<2; i++ ) {
+ int index = currFirst;
+ int side = (currCurrent + i + 1) & 1; /* Draw current side last */
+ double x = MarginX + MarginW;
+
+ if( (index & 1) != side ) {
+ x += step / 2;
+ index++;
+ }
+
+ DrawSegment( (int) x, cy, NULL, NULL, PEN_NONE );
+
+ index += 2;
+
+ while( index < currLast ) {
+ x += step;
+
+ DrawSeparator( index, (int) x );
+
+ /* Extend line up to current point */
+ if( currPvInfo[index].depth > 0 ) {
+ DrawSegment((int) x, GetValueY( GetPvScore(index) ), NULL, NULL, PEN_BOLD + side );
+ }
+
+ index += 2;
+ }
+ }
+}
+
+// back-end, delete pen selection
+static void DrawHistogramFull( int cy, int hist_width, int hist_count )
+{
+ int i;
+
+// SelectObject( hdcPB, GetStockObject(BLACK_PEN) );
+
+ for( i=0; i<hist_count; i++ ) {
+ int index = currFirst + i;
+ int x = MarginX + MarginW + index * hist_width;
+
+ /* Draw a separator every 10 moves */
+ DrawSeparator( index, x );
+
+ /* Draw histogram */
+ if( currPvInfo[i].depth > 0 ) {
+ DrawHistogram( x, cy, hist_width, GetPvScore(index), index & 1 );
+ }
+ }
+}
+
+typedef struct {
+ int cy;
+ int hist_width;
+ int hist_count;
+ int paint_width;
+} VisualizationData;
+
+// back-end
+static Boolean InitVisualization( VisualizationData * vd )
+{
+ Boolean result = FALSE;
+
+ vd->cy = nHeightPB / 2;
+ vd->hist_width = MIN_HIST_WIDTH;
+ vd->hist_count = currLast - currFirst;
+ vd->paint_width = nWidthPB - MarginX - 2*MarginW;
+
+ if( vd->hist_count > 0 ) {
+ result = TRUE;
+
+ /* Compute width */
+ vd->hist_width = vd->paint_width / vd->hist_count;
+
+ if( vd->hist_width > MAX_HIST_WIDTH ) vd->hist_width = MAX_HIST_WIDTH;
+
+ vd->hist_width -= vd->hist_width % 2;
+ }
+
+ return result;
+}
+
+// back-end
+static void DrawHistograms()
+{
+ VisualizationData vd;
+
+ if( InitVisualization( &vd ) ) {
+ if( vd.hist_width < MIN_HIST_WIDTH ) {
+ DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count );
+ }
+ else {
+ DrawHistogramFull( vd.cy, vd.hist_width, vd.hist_count );
+ }
+ }
+}
+
+// back-end
+int GetMoveIndexFromPoint( int x, int y )
+{
+ int result = -1;
+ int start_x = MarginX + MarginW;
+ VisualizationData vd;
+
+ if( x >= start_x && InitVisualization( &vd ) ) {
+ /* Almost an hack here... we duplicate some of the paint logic */
+ if( vd.hist_width < MIN_HIST_WIDTH ) {
+ double step;
+
+ vd.hist_count -= vd.hist_count % 8;
+ vd.hist_count += 8;
+ vd.hist_count /= 2;
+
+ step = (double) vd.paint_width / (vd.hist_count + 1);
+ step /= 2;
+
+ result = (int) (0.5 + (double) (x - start_x) / step);
+ }
+ else {
+ result = (x - start_x) / vd.hist_width;
+ }
+ }
+
+ if( result >= currLast ) {
+ result = -1;
+ }
+
+ return result;
+}
+
+// init and display part split of so they can be moved to front end
+void PaintEvalGraph( void )
+{
+ /* Draw */
+ DrawRectangle(0, 0, nWidthPB, nHeightPB, 2, FILLED);
+ DrawAxis();
+ DrawHistograms();
+}
+
--- /dev/null
+/*
+ * evalgraph.h -- Evaluation Graph window
+ *
+ * Copyright 2000,2009 Free Software Foundation, Inc.
+ *
+ * Enhancements Copyright 2005 Alessandro Scotti
+ *
+ * ------------------------------------------------------------------------
+ *
+ * GNU XBoard is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU XBoard is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see http://www.gnu.org/licenses/. *
+ *
+ *------------------------------------------------------------------------
+ ** See the file ChangeLog for a revision history.
+ */
+
+#define MIN_HIST_WIDTH 4
+#define MAX_HIST_WIDTH 10
+
+#define PEN_NONE 0
+#define PEN_BLACK 1
+#define PEN_DOTTED 2
+#define PEN_BLUEDOTTED 3
+#define PEN_BOLD 4 /* or 5 for black */
+
+#define FILLED 1
+#define OPEN 0
+
+/* Module globals */
+ChessProgramStats_Move * currPvInfo;
+extern int currFirst;
+extern int currLast;
+extern int currCurrent;
+
+extern int nWidthPB;
+extern int nHeightPB;
+
+extern int MarginX;
+extern int MarginW;
+extern int MarginH;
+
+// calls from back-end part into front-end part
+void DrawSegment( int x, int y, int *lastX, int *lastY, int penType );
+void DrawRectangle( int left, int top, int right, int bottom, int side, int style );
+void DrawEvalText(char *buf, int cbBuf, int y);
+
+// calls of front-end part into back-end part
+extern int GetMoveIndexFromPoint( int x, int y );
+extern void PaintEvalGraph( void );
+
OBJS=backend.o book.o gamelist.o lists.o moves.o pgntags.o uci.o zippy.o\\r
parser.o wbres.o wclipbrd.o wedittags.o wengineoutput.o wevalgraph.o\\r
wgamelist.o whistory.o winboard.o wlayout.o woptions.o wsnap.o\\r
- wsockerr.o help.o wsettings.o wchat.o engineoutput.o \r
+ wsockerr.o help.o wsettings.o wchat.o engineoutput.o evalgraph.o\r
\r
\r
# make compiling less spammy\r
../lists.h winboard.h resource.h wsnap.h\r
$(call compile, $<)\r
\r
-wevalgraph.o: wevalgraph.c config.h ../common.h ../frontend.h ../backend.h \\r
- ../lists.h winboard.h resource.h wsnap.h\r
+wevalgraph.o: wevalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \\r
+ ../backend.h ../lists.h winboard.h resource.h wsnap.h\r
+ $(call compile, $<)\r
+\r
+evalgraph.o: ../evalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \\r
+ ../backend.h ../lists.h\r
$(call compile, $<)\r
\r
wlayout.o: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h\r
OBJS=backend.obj book.obj gamelist.obj lists.obj moves.obj pgntags.obj uci.obj\\r
zippy.obj parser.obj wclipbrd.obj wedittags.obj wengineoutput.obj wevalgraph.obj\\r
wgamelist.obj whistory.obj winboard.obj wlayout.obj woptions.obj wsnap.obj\\r
- wsockerr.obj help.obj wsettings.obj wchat.obj engineoutput.obj\r
+ wsockerr.obj help.obj wsettings.obj wchat.obj engineoutput.obj evalgraph.obj\r
\r
\r
# Debugging?\r
../lists.h winboard.h resource.h wsnap.h\r
$(CC) $(CFLAGS) wevalgraph.c\r
\r
+evalgraph.obj: ../evalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \\r
+ ../backend.h ../lists.h\r
+ $(CC) $(CFLAGS) ../evalgraph.c\r
+\r
wlayout.obj: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h\r
$(CC) $(CFLAGS) wlayout.c\r
\r
/*\r
- * Evaluation graph\r
+ * wevalgraph.c - Evaluation graph front-end part\r
*\r
* Author: Alessandro Scotti (Dec 2005)\r
*\r
\r
#include "config.h"\r
\r
-#include <windows.h> /* required for all Windows applications */\r
-//include <richedit.h>\r
+#include <windows.h>\r
+#include <commdlg.h>\r
+#include <dlgs.h>\r
#include <stdio.h>\r
-//include <stdlib.h>\r
-//include <malloc.h>\r
\r
#include "common.h"\r
#include "frontend.h"\r
#include "backend.h"\r
-\r
-/* Module globals */ // used to communicate between back-end and front-end part\r
-static ChessProgramStats_Move * currPvInfo;\r
-static int currFirst = 0;\r
-static int currLast = 0;\r
-static int currCurrent = -1;\r
-\r
-static int nWidthPB = 0;\r
-static int nHeightPB = 0;\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
-#define PEN_NONE 0\r
-#define PEN_BLACK 1\r
-#define PEN_DOTTED 2\r
-#define PEN_BLUEDOTTED 3\r
-#define PEN_BOLD 4 /* or 5 for black */\r
-\r
-#define FILLED 1\r
-#define OPEN 0\r
-\r
-// calls from back-end part into front-end\r
-static void DrawSegment( int x, int y, int *lastX, int *lastY, int penType );\r
-void DrawRectangle( int left, int top, int right, int bottom, int side, int style );\r
-void DrawEvalText(char *buf, int cbBuf, int y);\r
-\r
-\r
-// back-end\r
-static void DrawLine( int x1, int y1, int x2, int y2, int penType )\r
-{\r
- DrawSegment( x1, y1, NULL, NULL, PEN_NONE );\r
- DrawSegment( x2, y2, NULL, NULL, penType );\r
-}\r
-\r
-// back-end\r
-static void DrawLineEx( int x1, int y1, int x2, int y2, int penType )\r
-{\r
- int savX, savY;\r
- DrawSegment( x1, y1, &savX, &savY, PEN_NONE );\r
- DrawSegment( x2, y2, NULL, NULL, penType );\r
- DrawSegment( savX, savY, NULL, NULL, PEN_NONE );\r
-}\r
-\r
-// back-end\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
-// back-end\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
-{\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
-}\r
-\r
-// the brush selection is made part of the DrawLine, by passing a style argument\r
-// the wrapper for doing the text output makes this back-end\r
-static void DrawAxisSegmentHoriz( int value, BOOL drawValue )\r
-{\r
- int y = GetValueY( value*100 );\r
-\r
- if( drawValue ) {\r
- char buf[MSG_SIZ], *b = buf;\r
-\r
- if( value > 0 ) *b++ = '+';\r
- sprintf(b, "%d", value);\r
-\r
- DrawEvalText(buf, strlen(buf), y);\r
- }\r
- // [HGM] counts on DrawEvalText to have select transparent background for dotted line!\r
- DrawLine( MarginX, y, MarginX + MarginW, y, PEN_BLACK ); // Y-axis tick marks\r
- DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y, PEN_DOTTED ); // hor grid\r
-}\r
-\r
-// The DrawLines again must select their own brush.\r
-// the initial brush selection is useless? BkMode needed for dotted line and text\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
- DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy, PEN_BLACK ); // x-axis\r
- DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH, PEN_BLACK ); // y-axis\r
-}\r
-\r
-// back-end\r
-static void DrawHistogram( int x, int y, int width, int value, int side )\r
-{\r
- int left, top, right, bottom;\r
-\r
- if( value > -25 && value < +25 ) return;\r
-\r
- left = x;\r
- right = left + width + 1;\r
-\r
- if( value > 0 ) {\r
- top = GetValueY( value );\r
- bottom = y+1;\r
- }\r
- else {\r
- top = y;\r
- bottom = GetValueY( value ) + 1;\r
- }\r
-\r
-\r
- if( width == MIN_HIST_WIDTH ) {\r
- right--;\r
- DrawRectangle( left, top, right, bottom, side, FILLED );\r
- }\r
- else {\r
- DrawRectangle( left, top, right, bottom, side, OPEN );\r
- }\r
-}\r
-\r
-// back-end\r
-static void DrawSeparator( int index, int x )\r
-{\r
- if( index > 0 ) {\r
- if( index == currCurrent ) {\r
- DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_BLUEDOTTED );\r
- }\r
- else if( (index % 20) == 0 ) {\r
- DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_DOTTED );\r
- }\r
- }\r
-}\r
-\r
-// made back-end by replacing MoveToEx and LineTo by DrawSegment\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
- DrawSegment( (int) x, cy, NULL, NULL, PEN_NONE );\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
- DrawSegment((int) x, GetValueY( GetPvScore(index) ), NULL, NULL, PEN_BOLD + side );\r
- }\r
-\r
- index += 2;\r
- }\r
- }\r
-}\r
-\r
-// back-end, delete pen selection\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
-// back-end\r
-static Boolean 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
-// back-end\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
- }\r
-}\r
-\r
-// back-end\r
-int GetMoveIndexFromPoint( int x, 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
-}\r
-\r
-// init and display part split of so they can be moved to front end\r
-void PaintEvalGraph( void )\r
-{\r
- /* Draw */\r
- DrawRectangle(0, 0, nWidthPB, nHeightPB, 2, FILLED);\r
- DrawAxis();\r
- DrawHistograms();\r
-}\r
-\r
-// ------------------------------------------ front-end starts here ----------------------------------------------\r
-\r
-#include <commdlg.h>\r
-#include <dlgs.h>\r
-\r
#include "winboard.h"\r
+#include "evalgraph.h"\r
#include "wsnap.h"\r
\r
#define WM_REFRESH_GRAPH (WM_USER + 1)\r
\r
-// calls of front-end part into back-end part\r
-extern int GetMoveIndexFromPoint( int x, int y );\r
-extern void PaintEvalGraph( void );\r
-\r
-/* Imports from winboard.c */\r
-static BOOLEAN evalGraphDialogUp; // should be back-end, really\r
-\r
-extern HINSTANCE hInst;\r
-extern HWND hwndMain;\r
-\r
-extern WindowPlacement wpEvalGraph;\r
+/* Module globals */\r
+static BOOLEAN evalGraphDialogUp;\r
\r
static COLORREF crWhite = RGB( 0xFF, 0xFF, 0xB0 );\r
static COLORREF crBlack = RGB( 0xAD, 0x5D, 0x3D );\r
}\r
\r
// [HGM] front-end, added as wrapper to avoid use of LineTo and MoveToEx in other routines (so they can be back-end) \r
-static void DrawSegment( int x, int y, int *lastX, int *lastY, int penType )\r
+void DrawSegment( int x, int y, int *lastX, int *lastY, int penType )\r
{\r
POINT stPt;\r
if(penType == PEN_NONE) MoveToEx( hdcPB, x, y, &stPt ); else {\r
SendMessage( evalGraphDialog, WM_REFRESH_GRAPH, 0, 0 );\r
}\r
}\r
-\r