1 /****************************************************************************
2 * RRDtool 1.3rc5 Copyright by Tobi Oetiker, 1997-2008
3 ****************************************************************************
4 * rrd_gfx.c graphics wrapper for rrdtool
5 **************************************************************************/
9 /* stupid MSVC doesnt support variadic macros = no debug for now! */
14 # define RRDPRINTF(...) fprintf(stderr, __VA_ARGS__);
16 # define RRDPRINTF(...)
21 #include "rrd_graph.h"
24 /* create a new line */
34 gfx_dashed_line(im, X0, Y0, X1, Y1, width, color, 0, 0);
49 double dashes[] = { dash_on, dash_off };
55 cairo_set_line_width(cr, width);
56 gfx_line_fit(im, &x, &y);
57 gfx_line_fit(im, &X0, &Y0);
58 cairo_move_to(cr, X0, Y0);
59 gfx_line_fit(im, &X1, &Y1);
60 cairo_line_to(cr, X1, Y1);
61 if (dash_on > 0 || dash_off > 0)
62 cairo_set_dash(cr, dashes, 2, x);
63 cairo_set_source_rgba(cr, color.red, color.green, color.blue,
69 /* create a new area */
83 gfx_area_fit(im, &X0, &Y0);
84 cairo_move_to(cr, X0, Y0);
85 gfx_area_fit(im, &X1, &Y1);
86 cairo_line_to(cr, X1, Y1);
87 gfx_area_fit(im, &X2, &Y2);
88 cairo_line_to(cr, X2, Y2);
89 cairo_set_source_rgba(cr, color.red, color.green, color.blue,
93 /* add a point to a line or to an area */
101 gfx_area_fit(im, &x, &y);
102 cairo_line_to(cr, x, y);
108 cairo_t *cr = im->cr;
110 cairo_close_path(cr);
114 /* create a text node */
115 static PangoLayout *gfx_prep_text(
125 PangoFontDescription *font_desc;
126 cairo_t *cr = im->cr;
128 /* for performance reasons we might
129 want todo that only once ... tabs will always
132 long tab_count = strlen(text);
133 long tab_shift = fmod(x, tabwidth);
134 int border = im->text_prop[TEXT_PROP_LEGEND].size * 2.0;
136 PangoTabArray *tab_array;
137 PangoContext *pango_context;
139 tab_array = pango_tab_array_new(tab_count, (gboolean) (1));
140 for (i = 1; i <= tab_count; i++) {
141 pango_tab_array_set_tab(tab_array,
142 i, PANGO_TAB_LEFT, tabwidth * i - tab_shift+border);
145 cairo_set_source_rgba(cr, color.red, color.green, color.blue,
147 layout = pango_cairo_create_layout(cr);
148 pango_context = pango_layout_get_context(layout);
149 pango_cairo_context_set_font_options(pango_context, im->font_options);
150 pango_cairo_context_set_resolution(pango_context, 100);
152 /* pango_cairo_update_context(cr, pango_context); */
154 pango_layout_set_tabs(layout, tab_array);
155 font_desc = pango_font_description_from_string(font);
156 pango_font_description_set_size(font_desc, size * PANGO_SCALE);
157 pango_layout_set_font_description(layout, font_desc);
158 pango_layout_set_markup(layout, text, -1);
163 double gfx_get_text_width(
172 PangoRectangle log_rect;
173 gfx_color_t color = { 0, 0, 0, 0 };
174 layout = gfx_prep_text(im, start, color, font, size, tabwidth, text);
175 pango_layout_get_pixel_extents(layout, NULL, &log_rect);
176 pango_tab_array_free(pango_layout_get_tabs(layout));
177 g_object_unref(layout);
178 return log_rect.width;
190 enum gfx_h_align_en h_align,
191 enum gfx_v_align_en v_align,
195 PangoRectangle log_rect;
196 PangoRectangle ink_rect;
197 cairo_t *cr = im->cr;
202 cairo_translate(cr, x, y);
203 /* gfx_line(cr,-2,0,2,0,1,color);
204 gfx_line(cr,0,-2,0,2,1,color); */
205 layout = gfx_prep_text(im, x, color, font, size, tabwidth, text);
206 pango_layout_get_pixel_extents(layout, &ink_rect, &log_rect);
207 cairo_rotate(cr, -angle * G_PI / 180.0);
211 sx -= log_rect.width;
214 sx -= log_rect.width / 2;
226 sy -= log_rect.height / 2;
229 sy -= log_rect.height;
234 pango_cairo_update_layout(cr, layout);
235 cairo_move_to(cr, sx, sy);
236 pango_cairo_show_layout(cr, layout);
237 pango_tab_array_free(pango_layout_get_tabs(layout));
238 g_object_unref(layout);
244 struct gfx_color_t gfx_hex_to_col(
245 long unsigned int color)
247 struct gfx_color_t gfx_color;
249 gfx_color.red = 1.0 / 255.0 * ((color & 0xff000000) >> (3 * 8));
250 gfx_color.green = 1.0 / 255.0 * ((color & 0x00ff0000) >> (2 * 8));
251 gfx_color.blue = 1.0 / 255.0 * ((color & 0x0000ff00) >> (1 * 8));
252 gfx_color.alpha = 1.0 / 255.0 * (color & 0x000000ff);
263 cairo_t *cr = im->cr;
269 cairo_user_to_device(cr, x, y);
270 line_width = cairo_get_line_width(cr);
271 line_height = line_width;
272 cairo_user_to_device_distance(cr, &line_width, &line_height);
273 line_width = line_width / 2.0 - (long) (line_width / 2.0);
274 line_height = line_height / 2.0 - (long) (line_height / 2.0);
275 *x = (double) ((long) (*x + 0.5)) - line_width;
276 *y = (double) ((long) (*y + 0.5)) + line_height;
277 cairo_device_to_user(cr, x, y);
287 cairo_t *cr = im->cr;
291 cairo_user_to_device(cr, x, y);
292 *x = (double) ((long) (*x + 0.5));
293 *y = (double) ((long) (*y + 0.5));
294 cairo_device_to_user(cr, x, y);