#ifndef _RRD_GRAPH_H
#define _RRD_GRAPH_H
+#define y0 cairo_y0
+#define y1 cairo_y1
+#define index cairo_index
+
+#include <cairo.h>
+#include <cairo-pdf.h>
+#include <cairo-svg.h>
+#include <cairo-ps.h>
+#include <pango/pangocairo.h>
+
#include "rrd_tool.h"
#include "rrd_rpncalc.h"
-#include "rrd_gfx.h"
-#define MAX_VNAME_LEN 255
-#define DEF_NAM_FMT "%255[-_A-Za-z0-9]"
#define ALTYGRID 0x01 /* use alternative y grid algorithm */
#define ALTAUTOSCALE 0x02 /* use alternative algorithm to find lower and upper bounds */
#define FORCE_UNITS 0x100 /* mask for all FORCE_UNITS_* flags */
#define FORCE_UNITS_SI 0x100 /* force use of SI units in Y axis (no effect in linear graph, SI instead of E in log graph) */
+#define FULL_SIZE_MODE 0x200 /* -width and -height indicate the total size of the image */
+
enum tmt_en { TMT_SECOND = 0, TMT_MINUTE, TMT_HOUR, TMT_DAY,
TMT_WEEK, TMT_MONTH, TMT_YEAR
};
#define GRIDWIDTH 0.4
enum gf_en { GF_PRINT = 0, GF_GPRINT, GF_COMMENT, GF_HRULE, GF_VRULE, GF_LINE,
- GF_AREA, GF_STACK, GF_TICK,
+ GF_AREA, GF_STACK, GF_TICK, GF_TEXTALIGN,
GF_DEF, GF_CDEF, GF_VDEF, GF_SHIFT,
-#ifdef WITH_PIECHART
- GF_PART,
-#endif
GF_XPORT
};
+enum txa_en { TXA_LEFT = 0, TXA_RIGHT, TXA_CENTER, TXA_JUSTIFIED };
+
enum vdef_op_en {
VDEF_MAXIMUM = 0 /* like the MAX in (G)PRINT */
, VDEF_MINIMUM /* like the MIN in (G)PRINT */
, VDEF_AVERAGE /* like the AVERAGE in (G)PRINT */
+ , VDEF_STDEV /* the standard deviation */
, VDEF_PERCENT /* Nth percentile */
, VDEF_TOTAL /* average multiplied by time */
, VDEF_FIRST /* first non-unknown value and time */
TEXT_PROP_LAST
};
+
+enum gfx_if_en { IF_PNG = 0, IF_SVG, IF_EPS, IF_PDF };
+enum gfx_en { GFX_LINE = 0, GFX_AREA, GFX_TEXT };
+enum gfx_h_align_en { GFX_H_NULL = 0, GFX_H_LEFT, GFX_H_RIGHT, GFX_H_CENTER };
+enum gfx_v_align_en { GFX_V_NULL = 0, GFX_V_TOP, GFX_V_BOTTOM, GFX_V_CENTER };
+
+/* cairo color components */
+typedef struct gfx_color_t {
+ double red;
+ double green;
+ double blue;
+ double alpha;
+} gfx_color_t;
+
+
typedef struct text_prop_t {
double size;
char font[1024];
int lfac[4]; /* associated label spacing */
} ylab_t;
-
/* this structure describes the elements which can make up a graph.
because they are quite diverse, not all elements will use all the
possible parts of the structure. */
long ds; /* data source number */
enum cf_en cf; /* consolidation function */
enum cf_en cf_reduce; /* consolidation function for reduce_data() */
- gfx_color_t col; /* graph color */
+ struct gfx_color_t col; /* graph color */
char format[FMT_LEG_LEN + 5]; /* format for PRINT AND GPRINT */
char legend[FMT_LEG_LEN + 5]; /* legend */
int strftm; /* should the VDEF legend be formated with strftime */
rrd_value_t *data; /* the raw data drawn from the rrd */
rrd_value_t *p_data; /* processed data, xsize elments */
double linewidth; /* linewideth */
+
+ /* dashed line stuff */
+ int dash; /* boolean, draw dashed line? */
+ double *p_dashes; /* pointer do dash array which keeps the lengths of dashes */
+ int ndash; /* number of dash segments */
+ double offset; /* dash offset along the line */
+
+ enum txa_en txtalign; /* change default alignment strategy for text */
} graph_desc_t;
typedef struct image_desc_t {
/* configuration of graph */
char graphfile[MAXPATH]; /* filename for graphic */
- FILE *graphhandle; /* FILE to use if filename is "-" */
long xsize, ysize; /* graph area size in pixels */
-#ifdef WITH_PIECHART
- long piesize; /* size of the piechart */
-#endif
- gfx_color_t graph_col[__GRC_END__]; /* real colors for the graph */
+ struct gfx_color_t graph_col[__GRC_END__]; /* real colors for the graph */
text_prop_t text_prop[TEXT_PROP_LAST]; /* text properties */
char ylegend[210]; /* legend along the yaxis */
char title[210]; /* title for graph */
grindlines falls in integer pixel values */
char *imginfo; /* construct an <IMG ... tag and return
as first retval */
+ enum gfx_if_en imgformat; /* image format */
int lazy; /* only update the image if there is
reasonable probablility that the
existing one is out of date */
int slopemode; /* connect the dots of the curve directly, not using a stair */
int logarithmic; /* scale the yaxis logarithmic */
+ double force_scale_min; /* Force a scale--min */
+ double force_scale_max; /* Force a scale--max */
/* status information */
long xorigin, yorigin; /* where is (0,0) of the graph */
-#ifdef WITH_PIECHART
- long pie_x, pie_y; /* where is the centerpoint */
-#endif
long ximg, yimg; /* total size of the image */
+ size_t rendered_image_size;
+ double zoom;
double magfact; /* numerical magnitude */
long base; /* 1000 or 1024 depending on what we graph */
char symbol; /* magnitude symbol for y-axis */
int extra_flags; /* flags for boolean options */
/* data elements */
+ unsigned char *rendered_image;
long prt_c; /* number of print elements */
long gdes_c; /* number of graphics elements */
graph_desc_t *gdes; /* points to an array of graph elements */
- gfx_canvas_t *canvas; /* graphics library */
+ cairo_surface_t *surface; /* graphics library */
+ cairo_t *cr; /* drawin context */
+ cairo_font_options_t *font_options; /* cairo font options */
+ cairo_antialias_t graph_antialias; /* antialiasing for the graph */
+
+ info_t *grinfo; /* root pointer to extra graph info */
+ info_t *grinfo_current; /* pointing to current entry */
} image_desc_t;
/* Prototypes */
enum tmt_en,
long);
int print_calc(
- image_desc_t *,
- char ***);
-int leg_place(
image_desc_t *);
+int leg_place(
+ image_desc_t *,
+ int *);
int calc_horizontal_grid(
image_desc_t *);
int draw_horizontal_grid(
int lazy_check(
image_desc_t *);
int graph_paint(
- image_desc_t *,
- char ***);
+ image_desc_t *);
-#ifdef WITH_PIECHART
-void pie_part(
- image_desc_t *,
- gfx_color_t,
- double,
- double,
- double,
- double,
- double);
-#endif
int gdes_alloc(
image_desc_t *);
int scan_for_col(
const char *const,
int,
char *const);
-int rrd_graph(
- int,
- char **,
- char ***,
- int *,
- int *,
- FILE *,
- double *,
- double *);
void rrd_graph_init(
image_desc_t *);
void rrd_graph_options(
const void *);
int graph_size_location(
image_desc_t *,
- int
-#ifdef WITH_PIECHART
- ,
- int
-#endif
- );
+ int);
+
+
+/* create a new line */
+void gfx_line(
+ image_desc_t *im,
+ double X0,
+ double Y0,
+ double X1,
+ double Y1,
+ double width,
+ gfx_color_t color);
+
+void gfx_dashed_line(
+ image_desc_t *im,
+ double X0,
+ double Y0,
+ double X1,
+ double Y1,
+ double width,
+ gfx_color_t color,
+ double dash_on,
+ double dash_off);
+
+/* create a new area */
+void gfx_new_area(
+ image_desc_t *im,
+ double X0,
+ double Y0,
+ double X1,
+ double Y1,
+ double X2,
+ double Y2,
+ gfx_color_t color);
+
+/* add a point to a line or to an area */
+void gfx_add_point(
+ image_desc_t *im,
+ double x,
+ double y);
+
+/* close current path so it ends at the same point as it started */
+void gfx_close_path(
+ image_desc_t *im);
+
+
+/* create a text node */
+void gfx_text(
+ image_desc_t *im,
+ double x,
+ double y,
+ gfx_color_t color,
+ char *font,
+ double size,
+ double tabwidth,
+ double angle,
+ enum gfx_h_align_en h_align,
+ enum gfx_v_align_en v_align,
+ const char *text);
+
+/* measure width of a text string */
+double gfx_get_text_width(
+ image_desc_t *im,
+ double start,
+ char *font,
+ double size,
+ double tabwidth,
+ char *text);
+
+
+/* convert color */
+gfx_color_t gfx_hex_to_col(
+ long unsigned int);
+
+void gfx_line_fit(
+ image_desc_t *im,
+ double *x,
+ double *y);
+
+void gfx_area_fit(
+ image_desc_t *im,
+ double *x,
+ double *y);
#endif
+
+void grinfo_push(
+ image_desc_t *im,
+ char *key,
+ enum info_type type,
+ infoval value);