#include "hp2graph.h"
#include "output.h"
#include "format.h"
typedef enum {MEGA, KILO, UNIT} mkb;
/*
* Find a "nice round" value to use on the axis.
*/
static double Round(double y)
{
int i;
for (i = 0; y > (double)10.0e-3; y /= 10, i++)
;
if (y > 4.0e-3) {
y = (double)5.0e-3;
} else if (y > 1.0e-3) {
y = (double)2.0e-3;
} else {
y = (double)1.0e-3;
}
for ( ; i > 0; y = y * 10, i--)
;
return y;
}
static void XAxisMark(double x, double num, mkb unit)
{
char info[100];
/* calibration mark */
outputLine(xpage(x), ypage(0.0), 0.0, -4.0);
switch (unit) {
case MEGA :
sprintf(info, "%dM", (int) (num / 1e6));
break;
case KILO :
sprintf(info, "%dk", (int) (num / 1e3));
break;
case UNIT :
if (timebyallocation)
sprintf(info, "%d", (int)num);
else sprintf(info, "%.1f", num);
break;
}
output->Text(JustifyCenter,xpage(x),borderspace,SCALE_FONT,info);
}
#define N_X_MARKS 7
#define XFUDGE 15
static void XAxis(void)
{
double increment, i;
double t, x;
double legendlen;
mkb unit;
/* draw the x axis line */
outputLine(xpage(0.0), ypage(0.0), graphwidth,0);
/* draw x axis legend */
output->Text(JustifyLeft,xpage(0.0) + graphwidth, borderspace,SCALE_FONT
,(timebyallocation?"sample":"second"));
/* draw x axis scaling */
increment = Round(xrange / (double) N_X_MARKS);
if (increment >= 1e6) {
unit = MEGA;
} else if (increment >= 1e3) {
unit = KILO;
} else {
unit = UNIT;
}
if (increment < 0.01) increment = 0.01;
t = graphwidth / xrange;
legendlen = stringSize("seconds") + (double) XFUDGE;
for (i = 0; i < sampledata[ samplesize - 1]; i += increment) {
x = i * t;
if (x < (graphwidth - legendlen)) {
XAxisMark(x,i,unit);
}
}
}
static void YAxisMark(double y, double num, mkb unit)
{
char info[100];
/* calibration mark */
outputLine(xpage(0.0), ypage(y), -4.0, 0.0);
/* number */
switch (unit) {
case MEGA :
sprintf(info, "%dM", (int) (num / 1e6));
break;
case KILO :
sprintf(info, "%dk", (int) (num / 1e3));
break;
case UNIT :
sprintf(info, "%d", (int) (num));
break;
}
output->Text(JustifyRight,graphx0 - borderspace,ypage(y),SCALE_FONT,info);
}
#define N_Y_MARKS 7
#define YFUDGE 15
static void YAxis(void)
{
double increment, i;
double t, y;
double legendlen;
mkb unit;
/* draw the y axis line */
outputLine(xpage(0.0), ypage(0.0), 0.0, graphheight);
/* draw y axis legend */
output->Text(JustifyVertical,xpage(0.0) - borderspace,ypage(0.0)+graphheight,SCALE_FONT,"byte");
/* draw y axis scaling */
increment = Round(yrange / (double) N_Y_MARKS);
if (increment < (double)1.0) increment = (double)1.0;
if (increment >= 1e6) {
unit = MEGA;
} else if (increment >= 1e3) {
unit = KILO;
} else {
unit = UNIT;
}
t = graphheight / yrange;
legendlen = stringSize("bytes") + (double) YFUDGE;
for (i = 0; i <= yrange; i += increment) {
y = i * t;
if (y < (graphheight - legendlen)) {
YAxisMark(y, i, unit);
}
}
}
void axes(void)
{
XAxis();
YAxis();
}
|