diff --git a/common/draw.c b/common/draw.c index 263858cc9..f930ed617 100644 --- a/common/draw.c +++ b/common/draw.c @@ -415,14 +415,14 @@ draw_text(draw_context_t *ctx, font_t *font, /** Setup color-source for cairo (gradient or mono). * \param ctx Draw context. - * \param rect x, y to x + x_offset, y + y_offset. - * \param pcolor Color to use at start (x, y). - * \param pcolor_center Color at 50% of width. - * \param pcolor_end Color at pattern end (x + x_offset, y + y_offset). + * \param gradient_vector x, y to x + x_offset, y + y_offset. + * \param pcolor Color to use at start of gradient_vector. + * \param pcolor_center Color at center of gradient_vector. + * \param pcolor_end Color at end of gradient_vector. * \return pat Pattern or NULL, needs to get cairo_pattern_destroy()'ed. */ static cairo_pattern_t * -draw_setup_cairo_color_source(draw_context_t *ctx, area_t rect, +draw_setup_cairo_color_source(draw_context_t *ctx, vector_t gradient_vector, const xcolor_t *pcolor, const xcolor_t *pcolor_center, const xcolor_t *pcolor_end) { @@ -439,7 +439,10 @@ draw_setup_cairo_color_source(draw_context_t *ctx, area_t rect, pcolor->alpha / 65535.0); else { - pat = cairo_pattern_create_linear(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); + pat = cairo_pattern_create_linear(gradient_vector.x, + gradient_vector.y, + gradient_vector.x + gradient_vector.x_offset, + gradient_vector.y + gradient_vector.y_offset); /* pcolor is always set (so far in awesome) */ cairo_pattern_add_color_stop_rgba(pat, 0.0, @@ -507,18 +510,18 @@ draw_rectangle(draw_context_t *ctx, area_t geometry, } /** Draw rectangle with gradient colors - * \param ctx Draw context - * \param geometry geometry - * \param line_width line width - * \param filled filled rectangle? - * \param pattern_rect pattern geometry - * \param pcolor color to use at start - * \param pcolor_center color at 50% of width - * \param pcolor_end color at pattern_start + pattern_width + * \param ctx Draw context. + * \param geometry Geometry. + * \param line_width Line width. + * \param filled Filled rectangle? + * \param gradient_vector Color-gradient course. + * \param pcolor Color at start of gradient_vector. + * \param pcolor_center Color in the center. + * \param pcolor_end Color at end of gradient_vector. */ void draw_rectangle_gradient(draw_context_t *ctx, area_t geometry, float line_width, bool filled, - area_t pattern_rect, const xcolor_t *pcolor, + vector_t gradient_vector, const xcolor_t *pcolor, const xcolor_t *pcolor_center, const xcolor_t *pcolor_end) { cairo_pattern_t *pat; @@ -528,7 +531,7 @@ draw_rectangle_gradient(draw_context_t *ctx, area_t geometry, float line_width, cairo_set_miter_limit(ctx->cr, 10.0); cairo_set_line_join(ctx->cr, CAIRO_LINE_JOIN_MITER); - pat = draw_setup_cairo_color_source(ctx, pattern_rect, pcolor, pcolor_center, pcolor_end); + pat = draw_setup_cairo_color_source(ctx, gradient_vector, pcolor, pcolor_center, pcolor_end); if(filled) { @@ -566,21 +569,21 @@ draw_graph_setup(draw_context_t *ctx) * \param to Array of end-point offsets to draw a graph lines. * \param cur_index Current position in data-array (cycles around). * \param grow Put new values to the left or to the right. - * \param patt_rect Pattern geometry. - * \param pcolor Color at the left. + * \param gradient_vector Color-Gradient course. + * \param pcolor Color at start of gradient_vector. * \param pcolor_center Color in the center. - * \param pcolor_end Color at the right. + * \param pcolor_end Color at end of gradient_vector. */ void draw_graph(draw_context_t *ctx, area_t rect, int *from, int *to, int cur_index, - position_t grow, area_t patt_rect, const xcolor_t *pcolor, + position_t grow, vector_t gradient_vector, const xcolor_t *pcolor, const xcolor_t *pcolor_center, const xcolor_t *pcolor_end) { int i = -1; float x = rect.x + 0.5; /* middle of a pixel */ cairo_pattern_t *pat; - pat = draw_setup_cairo_color_source(ctx, patt_rect, + pat = draw_setup_cairo_color_source(ctx, gradient_vector, pcolor, pcolor_center, pcolor_end); if(grow == Right) /* draw from right to left */ @@ -619,14 +622,14 @@ draw_graph(draw_context_t *ctx, area_t rect, int *from, int *to, int cur_index, * \param to array of offsets to draw the line through... * \param cur_index current position in data-array (cycles around) * \param grow put new values to the left or to the right - * \param patt_rect Pattern geometry. - * \param pcolor color at the left - * \param pcolor_center color in the center - * \param pcolor_end color at the right + * \param gradient_vector Color-gradient course. + * \param pcolor Color at start of gradient_vector. + * \param pcolor_center Color in the center. + * \param pcolor_end Color at end of gradient_vector. */ void draw_graph_line(draw_context_t *ctx, area_t rect, int *to, int cur_index, - position_t grow, area_t patt_rect, const xcolor_t *pcolor, + position_t grow, vector_t gradient_vector, const xcolor_t *pcolor, const xcolor_t *pcolor_center, const xcolor_t *pcolor_end) { int i, w; @@ -641,7 +644,7 @@ draw_graph_line(draw_context_t *ctx, area_t rect, int *to, int cur_index, /* a nicer, better visible line compared to 1.0 */ cairo_set_line_width(ctx->cr, 1.25); - pat = draw_setup_cairo_color_source(ctx, patt_rect, pcolor, pcolor_center, pcolor_end); + pat = draw_setup_cairo_color_source(ctx, gradient_vector, pcolor, pcolor_center, pcolor_end); /* path through the centers of pixels */ x = rect.x + 0.5; diff --git a/common/draw.h b/common/draw.h index 4f0d2bd13..5729c6393 100644 --- a/common/draw.h +++ b/common/draw.h @@ -50,6 +50,17 @@ typedef enum AlignAuto } alignment_t; +typedef struct vector_t vector_t; +struct vector_t +{ + /** Co-ords of starting point */ + int16_t x; + int16_t y; + /** Offset to starting point */ + int16_t x_offset; + int16_t y_offset; +}; + typedef struct area_t area_t; struct area_t { @@ -185,13 +196,13 @@ void draw_parser_data_wipe(draw_parser_data_t *); void draw_text(draw_context_t *, font_t *, area_t, const char *, draw_parser_data_t *); void draw_rectangle(draw_context_t *, area_t, float, bool, const xcolor_t *); -void draw_rectangle_gradient(draw_context_t *, area_t, float, bool, area_t, +void draw_rectangle_gradient(draw_context_t *, area_t, float, bool, vector_t, const xcolor_t *, const xcolor_t *, const xcolor_t *); void draw_graph_setup(draw_context_t *); -void draw_graph(draw_context_t *, area_t, int *, int *, int, position_t, area_t, +void draw_graph(draw_context_t *, area_t, int *, int *, int, position_t, vector_t, const xcolor_t *, const xcolor_t *, const xcolor_t *); -void draw_graph_line(draw_context_t *, area_t, int *, int, position_t, area_t, +void draw_graph_line(draw_context_t *, area_t, int *, int, position_t, vector_t, const xcolor_t *, const xcolor_t *, const xcolor_t *); void draw_circle(draw_context_t *, int, int, int, bool, const xcolor_t *); draw_image_t *draw_image_new(const char *); diff --git a/widgets/graph.c b/widgets/graph.c index 3dbc97340..154af45ac 100644 --- a/widgets/graph.c +++ b/widgets/graph.c @@ -148,7 +148,8 @@ graph_draw(draw_context_t *ctx, { int margin_top, y; graph_data_t *d = w->widget->data; - area_t rectangle, pattern_area; + area_t rectangle; + vector_t color_gradient; plot_t *plot; if(!d->plots) @@ -180,28 +181,28 @@ graph_draw(draw_context_t *ctx, /* gradient begin either left or on the right of the rectangle */ if(d->grow == Right) - pattern_area.x = rectangle.x + rectangle.width; + color_gradient.x = rectangle.x + rectangle.width; else - pattern_area.x = rectangle.x; + color_gradient.x = rectangle.x; for(plot = d->plots; plot; plot = plot->next) switch(plot->draw_style) { case Top_Style: - pattern_area.y = rectangle.y - rectangle.height; + color_gradient.y = rectangle.y - rectangle.height; if(plot->vertical_gradient) { - pattern_area.width = 0; - pattern_area.height = rectangle.height; + color_gradient.x_offset = 0; + color_gradient.y_offset = rectangle.height; } else { - pattern_area.height = 0; + color_gradient.y_offset = 0; if(d->grow == Right) - pattern_area.width = - rectangle.width; + color_gradient.x_offset = - rectangle.width; else - pattern_area.width = rectangle.width; + color_gradient.x_offset = rectangle.width; } for(y = 0; y < d->size; y++) @@ -210,47 +211,47 @@ graph_draw(draw_context_t *ctx, d->draw_from[y] = d->box_height; /* i.e. no smaller value -> from top of box */ d->draw_to[y] = d->box_height - plot->lines[y]; /* i.e. on full plot -> 0 = bottom */ } - draw_graph(ctx, rectangle , d->draw_from, d->draw_to, plot->index, d->grow, pattern_area, + draw_graph(ctx, rectangle , d->draw_from, d->draw_to, plot->index, d->grow, color_gradient, &plot->color_start, &plot->pcolor_center, &plot->pcolor_end); break; case Bottom_Style: - pattern_area.y = rectangle.y; + color_gradient.y = rectangle.y; if(plot->vertical_gradient) { - pattern_area.width = 0; - pattern_area.height = - rectangle.height; + color_gradient.x_offset = 0; + color_gradient.y_offset = - rectangle.height; } else { - pattern_area.height = 0; + color_gradient.y_offset = 0; if(d->grow == Right) - pattern_area.width = - rectangle.width; + color_gradient.x_offset = - rectangle.width; else - pattern_area.width = rectangle.width; + color_gradient.x_offset = rectangle.width; } p_clear(d->draw_from, d->size); - draw_graph(ctx, rectangle, d->draw_from, plot->lines, plot->index, d->grow, pattern_area, + draw_graph(ctx, rectangle, d->draw_from, plot->lines, plot->index, d->grow, color_gradient, &plot->color_start, &plot->pcolor_center, &plot->pcolor_end); break; case Line_Style: - pattern_area.y = rectangle.y; + color_gradient.y = rectangle.y; if(plot->vertical_gradient) { - pattern_area.width = 0; - pattern_area.height = -rectangle.height; + color_gradient.x_offset = 0; + color_gradient.y_offset = -rectangle.height; } else { - pattern_area.height = 0; + color_gradient.y_offset = 0; if(d->grow == Right) - pattern_area.width = - rectangle.width; + color_gradient.x_offset = - rectangle.width; else - pattern_area.width = rectangle.width; + color_gradient.x_offset = rectangle.width; } - draw_graph_line(ctx, rectangle, plot->lines, plot->index, d->grow, pattern_area, + draw_graph_line(ctx, rectangle, plot->lines, plot->index, d->grow, color_gradient, &plot->color_start, &plot->pcolor_center, &plot->pcolor_end); break; } diff --git a/widgets/progressbar.c b/widgets/progressbar.c index 6a0718c96..6293efa4c 100644 --- a/widgets/progressbar.c +++ b/widgets/progressbar.c @@ -133,7 +133,8 @@ progressbar_draw(draw_context_t *ctx, /* pb_.. values points to the widget inside a potential border */ int values_ticks, pb_x, pb_y, pb_height, pb_width, pb_progress, pb_offset; int unit = 0, nbbars = 0; /* tick + gap */ - area_t rectangle, pattern_rect; + area_t rectangle; + vector_t color_gradient; progressbar_data_t *d = w->widget->data; bar_t *bar; @@ -230,22 +231,22 @@ progressbar_draw(draw_context_t *ctx, draw_rectangle(ctx, rectangle, d->border_width, false, &bar->border_color); } - pattern_rect.x = pb_x; - pattern_rect.width = 0; - pattern_rect.y = pb_y; + color_gradient.x = pb_x; + color_gradient.x_offset = 0; + color_gradient.y = pb_y; /* new value/progress in px + pattern setup */ if(bar->reverse) { /* invert: top with bottom part */ pb_progress = pb_height - pb_progress; - pattern_rect.height = pb_height; + color_gradient.y_offset = pb_height; } else { /* bottom to top */ - pattern_rect.y += pb_height; - pattern_rect.height = - pb_height; + color_gradient.y += pb_height; + color_gradient.y_offset = - pb_height; } /* bottom part */ @@ -260,7 +261,7 @@ progressbar_draw(draw_context_t *ctx, if(bar->reverse) draw_rectangle(ctx, rectangle, 1.0, true, &bar->fg_off); else - draw_rectangle_gradient(ctx, rectangle, 1.0, true, pattern_rect, + draw_rectangle_gradient(ctx, rectangle, 1.0, true, color_gradient, &bar->fg, &bar->fg_center, &bar->fg_end); } @@ -274,7 +275,7 @@ progressbar_draw(draw_context_t *ctx, /* bg color */ if(bar->reverse) - draw_rectangle_gradient(ctx, rectangle, 1.0, true, pattern_rect, + draw_rectangle_gradient(ctx, rectangle, 1.0, true, color_gradient, &bar->fg, &bar->fg_center, &bar->fg_end); else draw_rectangle(ctx, rectangle, 1.0, true, &bar->fg_off); @@ -330,21 +331,21 @@ progressbar_draw(draw_context_t *ctx, draw_rectangle(ctx, rectangle, d->border_width, false, &bar->border_color); } - pattern_rect.y = pb_y; - pattern_rect.height = 0; - pattern_rect.x = pb_x; + color_gradient.y = pb_y; + color_gradient.y_offset = 0; + color_gradient.x = pb_x; /* new value/progress in px + pattern setup */ if(bar->reverse) { /* reverse: right to left */ pb_progress = pb_width - pb_progress; - pattern_rect.x += pb_width; - pattern_rect.width = - pb_width; + color_gradient.x += pb_width; + color_gradient.x_offset = - pb_width; } else /* left to right */ - pattern_rect.width = pb_width; + color_gradient.x_offset = pb_width; /* left part */ if(pb_progress > 0) @@ -358,7 +359,7 @@ progressbar_draw(draw_context_t *ctx, if(bar->reverse) draw_rectangle(ctx, rectangle, 1.0, true, &bar->fg_off); else - draw_rectangle_gradient(ctx, rectangle, 1.0, true, pattern_rect, + draw_rectangle_gradient(ctx, rectangle, 1.0, true, color_gradient, &bar->fg, &bar->fg_center, &bar->fg_end); } @@ -372,7 +373,7 @@ progressbar_draw(draw_context_t *ctx, /* bg color */ if(bar->reverse) - draw_rectangle_gradient(ctx, rectangle, 1.0, true, pattern_rect, + draw_rectangle_gradient(ctx, rectangle, 1.0, true, color_gradient, &bar->fg, &bar->fg_center, &bar->fg_end); else draw_rectangle(ctx, rectangle, 1.0, true, &bar->fg_off);