// back-end static void DrawHistograms () { VisualizationData vd; int i; double step = 1; if( InitVisualization( &vd ) ) { if( vd.hist_width < MIN_HIST_WIDTH ) { DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count ); step = 0.5*vd.paint_width / (((vd.hist_count | 7) + 1)/2 + 1.); } else { DrawHistogramFull( vd.cy, step = vd.hist_width, vd.hist_count ); } } if(!differentialView) return; differentialView = 0; DrawSegment( MarginX + MarginW, vd.cy, NULL, NULL, PEN_NONE ); for( i=0; i<vd.hist_count; i++ ) { int index = currFirst + i; int x = MarginX + MarginW + index * step + step/2; DrawSegment((int) x, GetValueY( GetPvScore(index) ), NULL, NULL, PEN_ANY ); } differentialView = 1; }
// 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 ); } } }
/* 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, (side==0 ? PEN_BOLDWHITE: PEN_BOLDBLACK) ); } index += 2; } } }