direct calculating of the line length to draw

the graph_tell() does not modify directly the line-lenght to draw, rather
then calculating the value in percent and in the graph_draw, calculating
the line length ouf of that the percent.

(while trying to fix something little, a whole new scale thing resulted;
also I didn't really understand the old system, my fault that is)
This commit is contained in:
marco candrian 2008-01-09 09:59:42 +01:00 committed by Julien Danjou
parent bbc94b97f8
commit 4f05f954d0
1 changed files with 48 additions and 59 deletions

View File

@ -37,13 +37,14 @@ typedef struct
XColor fg; /* Foreground color */ XColor fg; /* Foreground color */
XColor bg; /* Background color */ XColor bg; /* Background color */
XColor bordercolor; /* Border color */ XColor bordercolor; /* Border color */
int box_height; /* Height of the innerbox */
int *lines; /* keeps the calculated values (line-length); */ int *lines; /* keeps the calculated values (line-length); */
int lines_index; /* pointer to current val */ int lines_index; /* pointer to current val */
int lines_size; /* size of lines-array */ int lines_size; /* size of lines-array */
float *line_values; /* actual values */ float *line_values; /* actual values */
int line_max_index; /* index of the current maximum value */ int line_max_index; /* index of the current maximum value */
int line_max; /* maximum value */ int line_max; /* maximum value */
int current_max; /* curent maximum value */
} Data; } Data;
@ -52,12 +53,9 @@ static int
graph_draw(Widget *widget, DrawCtx *ctx, int offset, graph_draw(Widget *widget, DrawCtx *ctx, int offset,
int used __attribute__ ((unused))) int used __attribute__ ((unused)))
{ {
int width, height; /* width/height (pixel) to draw the outer box */
int margin_top, left_offset; int margin_top, left_offset;
Data *d = widget->data; Data *d = widget->data;
width = d->lines_size + 2;
if(!widget->user_supplied_x) if(!widget->user_supplied_x)
widget->area.x = widget_calculate_offset(widget->statusbar->width, widget->area.x = widget_calculate_offset(widget->statusbar->width,
d->width, d->width,
@ -67,27 +65,27 @@ graph_draw(Widget *widget, DrawCtx *ctx, int offset,
widget->area.y = 0; widget->area.y = 0;
margin_top = (int) (widget->statusbar->height * (1 - d->height)) / 2 + 0.5 + widget->area.y; margin_top = (int) (widget->statusbar->height * (1 - d->height)) / 2 + 0.5 + widget->area.y;
height = (int) (widget->statusbar->height * d->height + 0.5);
left_offset = widget->area.x + d->padding_left; left_offset = widget->area.x + d->padding_left;
if(!(d->box_height))
d->box_height = (int) (widget->statusbar->height * d->height + 0.5) - 2;
draw_rectangle(ctx, draw_rectangle(ctx,
left_offset, margin_top, left_offset, margin_top,
width, height, d->lines_size + 2, d->box_height + 2,
False, d->bordercolor); False, d->bordercolor);
draw_rectangle(ctx, draw_rectangle(ctx,
left_offset + 1, margin_top + 1, left_offset + 1, margin_top + 1,
width - 2, height - 2, d->lines_size, d->box_height,
True, d->bg); True, d->bg);
/* computes line-length to draw and store into lines[] */
d->lines[d->lines_index] = (int) (d->percent) * (height - 2 ) / 100 + 0.5;
if(d->lines[d->lines_index] < 0) if(d->lines[d->lines_index] < 0)
d->lines[d->lines_index] = 0; d->lines[d->lines_index] = 0;
draw_graph(ctx, draw_graph(ctx,
left_offset + 2, margin_top + height - 1, left_offset + 2, margin_top + d->box_height + 1,
d->lines_size, d->lines, d->lines_index, d->lines_size, d->lines, d->lines_index,
d->fg); d->fg);
@ -100,9 +98,7 @@ static void
graph_tell(Widget *widget, char *command) graph_tell(Widget *widget, char *command)
{ {
Data *d = widget->data; Data *d = widget->data;
int percent, i, height, omax, nmax; int value, i;
height = (int) (widget->statusbar->height * d->height + 0.5);
if(!command || d->width < 1) if(!command || d->width < 1)
return; return;
@ -110,50 +106,44 @@ graph_tell(Widget *widget, char *command)
if(++d->lines_index >= d->lines_size) /* cycle inside the array */ if(++d->lines_index >= d->lines_size) /* cycle inside the array */
d->lines_index = 0; d->lines_index = 0;
if (d->line_values && d->line_max_index == d->lines_index && value = MAX(atoi(command), 0); /*TODO atofloat */
d->line_values[d->line_max_index]) {
omax = d->line_values[d->line_max_index];
d->line_values[d->line_max_index] = 0;
for (i = 0; i < d->lines_size; i++)
if (d->line_values[i] > d->line_values[d->line_max_index]) {
d->line_max_index = i;
}
nmax = MAX(d->line_values[d->line_max_index], d->line_max);
if (d->line_values[d->line_max_index]) {
for (i = 0; i < d->lines_size; i++) {
d->lines[i] = (int) (100*d->line_values[i] / nmax) * (height -
2) / 100 + 0.5;
}
}
}
percent = atoi(command); if(d->line_values) /* scale option = true */
if (percent < 0)
{ {
if (d->line_values) d->line_values[d->lines_index] = value;
d->line_values[d->lines_index] = 0;
d->percent = 0; if(value > d->current_max) /* a new maximum value found */
}
else if (d->line_values)
{ {
d->line_values[d->lines_index] = percent;
nmax = MAX(d->line_max, d->line_values[d->line_max_index]);
if (d->line_values[d->line_max_index] < percent) {
// Increase the current max
d->line_max_index = d->lines_index; d->line_max_index = d->lines_index;
if (d->line_max < d->line_values[d->line_max_index]) { d->current_max = MAX(value, 1);
for (i = 0; i < d->lines_size; i++) {
d->lines[i] = (int) /* recalculate: value * (height-2pixel) / max */
(100*d->line_values[i]/d->line_values[d->line_max_index]) for (i = 0; i < d->lines_size; i++)
* (height - 2) / 100 + 0.5; d->lines[i] = (int) ((float)(d->line_values[i]) * (d->box_height) / d->current_max + 0.5);
} }
else if(d->line_max_index == d->lines_index) /* old max_index reached, re-check/generate */
{
/* find the new max */
for (i = 0; i < d->lines_size; i++)
if (d->line_values[i] > d->line_values[d->line_max_index])
d->line_max_index = i;
d->current_max = MAX(d->line_values[d->line_max_index], d->line_max);
/* recalculate */
for (i = 0; i < d->lines_size; i++)
d->lines[i] = (int) ((float)(d->line_values[i]) * d->box_height / d->current_max + 0.5);
} }
else
d->lines[d->lines_index] = (int) ((float)(value) * d->box_height / d->current_max + 0.5);
} }
d->percent = (int) (100.0 * d->line_values[d->lines_index] / nmax); else /* scale option = false */
} {
else { if (value < d->current_max)
d->percent = (percent > d->line_max ? 100 : d->lines[d->lines_index] = (int) ((float)(value) * d->box_height / d->current_max + 0.5);
(int) (100 * ((float)percent) / d->line_max)); else
d->lines[d->lines_index] = d->box_height;
} }
} }
@ -172,12 +162,10 @@ graph_new(Statusbar *statusbar, cfg_t *config)
w->tell = graph_tell; w->tell = graph_tell;
d = w->data = p_new(Data, 1); d = w->data = p_new(Data, 1);
d->height = cfg_getfloat(config, "height");
d->width = cfg_getint(config, "width"); d->width = cfg_getint(config, "width");
d->height = cfg_getfloat(config, "height");
d->padding_left = cfg_getint(config, "padding_left"); d->padding_left = cfg_getint(config, "padding_left");
d->lines_size = d->width - d->padding_left - 2; d->lines_size = d->width - d->padding_left - 2;
d->lines_index = -1; /* graph_tell will increment it to 0 (to begin with...) */
if(d->lines_size < 1) if(d->lines_size < 1)
{ {
@ -186,10 +174,11 @@ graph_new(Statusbar *statusbar, cfg_t *config)
} }
d->lines = p_new(int, d->lines_size); d->lines = p_new(int, d->lines_size);
if (cfg_getbool(config, "scale")) if (cfg_getbool(config, "scale"))
d->line_values = p_new(float, d->lines_size); d->line_values = p_new(float, d->lines_size);
d->line_max = cfg_getfloat(config, "max"); d->line_max = MAX(cfg_getfloat(config, "max"), 0.001); /* prevent div / 0 */
d->current_max = d->line_max;
if((color = cfg_getstr(config, "fg"))) if((color = cfg_getstr(config, "fg")))
d->fg = initxcolor(phys_screen, color); d->fg = initxcolor(phys_screen, color);
else else