/***************************************************************************\ * lgraph.h * * Microsoft Confidential * Copyright (c) 1991 Microsoft Corporation * * Structure definitions for line graph display, and some #defines * * History: * Written by Hadi Partovi (t-hadip) summer 1991 * * Re-written and adapted for NT by Fran Borda (v-franb) Nov.1991 * for Newman Consulting * Took out all WIN-specific and bargraph code. Added 3 new * linegraphs (Mem/Paging, Process/Threads/Handles, IO), and * tailored info to that available under NT. \***************************************************************************/ /* * A line graph is a regular graph with two axes, with variable calibrations. * The bottom axis is going to be a measure of TIME. That is, the * graph will be used to display various values as a function of time. It * can handle more than one line drawn within the same set of axes. Since * The graph must be able to redraw itself in case of window resizing, * etc, it must remember all the points (or at least Y values) on the * display. To make things nicer, it will also remember a limited number * of values off screen, to allow the user to scroll back and forth to * see values that have been entered but have scrolled by with time. * this display can be used to measure various system global values as * functions of time. The axis calibration, etc, are all user settable. * the data will be stored as ints, and then converted to X and Y * coordinates depending on the axis calibration and the sampling interval, * and so on. What follows is the structure definition for a line graph * The general database will be a linked list of linegraphs (with only one * displayed on screen at a time). Each line graph has its own linked list * of lines to display on that set of axes. * ********* * NOTE: THERE IS A CLEAR DISTINCTION BETWEEN "y"s and "Value"s: * A "y" IS THE ACTUAL COORDINATE DRAWN ON THE DISPLAY. A "value" IS THE * GIVEN DATA TO BE DRAWN AND IS CONVERTED TO A "y" USING THE CALIBRATION * NUMBERS. ALL "value"s ARE SAVED. "y"s ARE DISPLAYED ONLY. * FOR CLARITY, "value"s WILL BE GIVEN THE HUNGARIAN PREFIX "val" * A new type VALUE will be defined, and set to DWORD, just ofr clarity ********* * NOTE: * The rcGraph field of the PLGRAPH structure is very misleading and should * eventually be changed (throughout the lgraph module) to act nicer. * currently, rcGraph.left-1, rcGraph.top, rcGraph.right, and rcGraph.bottom * are coordinates on which graph axes are drawn * However, rcGraph.bottom also includes some actual graph points drawn * onto it (for values == valBottom). * This should be modified so that rcGraph.top-1 is actually where the axis is * drawn. Also, values should not be drawn on rcGraph.bottom, but just up to * it. That way, rcGraph will completely enclose the drawn points, and can be * used as a clipping rectangle, or a scroll rectangle, etc. */ // general type for values to be graphed typedef DWORD VALUE; // structure for values data for one line in a line graph, // include brush to draw with, as well as array of points // (array will be circular, to allow scrolling after it is filled) typedef struct _GraphData { int iColor; // index into color palette - line color VALUE far *pValues; // pointer to data (array of size = nMaxValues) VALUE (*valNext)(void); // function to return next data value LPSTR lpszDescription; // description of this line struct _GraphData far *plgdNext;// pointer to data for next line } LGDATA, far *PLGDATA; // Structure for general line graph typedef struct _LineGraphInfo { LPSTR lpszTitle; // graph title RECT rcGraph; // graph region (changes with window size) RECT rcLegend; // legend region RECT rcCalibration; // calibration region int cxGraph; // width of graph, maintained as right-left int cxPerValue; // x width between values VALUE valBottom; // calibration values (value at bottom) VALUE dvalAxisHeight; // (height of axis, as displayed value) VALUE dvalCalibration; // distance between calibration marks int nMaxValues; // maximum values to remember in history int nDisplayValues; // # of values displayed // (< Pixel width, > nMaxValues) int nLines; // # of separate lines on same axes int iLeftValue; // index of value at left of display int iNewLeftValue; // index of new left value for drawing int iFirstValue; // index of First value in graph history int iKnownValue; // index of last value known int iDrawnValue; // index of last value drawn PLGDATA plgd; // pointer to graph data struct _LineGraphInfo far *plgNext; // pointer to the next linegraph } LGRAPH, far *PLGRAPH; // DEFINITIONS FOR LINEGRAPH GRAPHICS #define NO_VALUES_YET -1 // initial value for index to known and drawn values #define MIN_NMAXVALUES 10 // minimum number of values that a graph needs to be displayed ( >1 ) #define DY_AXIS_NUMBER (g.cyChar/2) // y distance between the calibration marks and the numbers // calibration label is centered vertically around horiz. lines #define DX_CALIBRATION_LEFT 1 // space between calibration value and left window edge #define DX_LEGEND_RIGHT 1 // space between right window edge and legend #define DX_LEGEND_INDENT (g.cxChar) // indent within legend box #define DX_AXIS_LEFT (g.cxChar/2) // space between vertical axis and calibration value #define DX_AXIS_RIGHT (g.cxChar/2) // space to allow to right of graph #define DY_AXIS_TOP 2 // space to allow at top of graph #define DY_AXIS_BOTTOM 2 // space to allow at bottom of graph #define LG_TO_CALIBRATION_RATIO 5 // width of calibration values * this number can't exceed screen width #define LG_TO_LEGEND_RATIO 2 // width of legend * this number can't exceed screen width