X-Git-Url: https://git.octo.it/?p=rrdtool.git;a=blobdiff_plain;f=src%2Frrd_graph.h;h=8e28f63fec38544333b0e92e5b5596ab0d3116bb;hp=f78278890f76a72eb53033dcdc4cbbeb80cba9f9;hb=c502ca0c6ed02387134193d215f6af0b3e29afe1;hpb=c2add7c35c88043958aebc64851b7b953adf305f diff --git a/src/rrd_graph.h b/src/rrd_graph.h index f782788..8e28f63 100644 --- a/src/rrd_graph.h +++ b/src/rrd_graph.h @@ -1,138 +1,145 @@ +#ifndef _RRD_GRAPH_H +#define _RRD_GRAPH_H + +#define y0 cairo_y0 +#define y1 cairo_y1 +#define index cairo_index + +/* this may configure __EXTENSIONS__ without which pango will fail to compile + so load this early */ +#include "../rrd_config.h" + +#include +#include +#include +#include + +#include + + #include "rrd_tool.h" #include "rrd_rpncalc.h" -#define MAX_VNAME_LEN 29 -#define DEF_NAM_FMT "%29[_A-Za-z0-9]" +#ifdef WIN32 +# include +# define MAXPATH MAX_PATH +#endif + +#define ALTYGRID 0x01 /* use alternative y grid algorithm */ +#define ALTAUTOSCALE 0x02 /* use alternative algorithm to find lower and upper bounds */ +#define ALTAUTOSCALE_MIN 0x04 /* use alternative algorithm to find lower bounds */ +#define ALTAUTOSCALE_MAX 0x08 /* use alternative algorithm to find upper bounds */ +#define NOLEGEND 0x10 /* use no legend */ +#define NOMINOR 0x20 /* Turn off minor gridlines */ +#define ONLY_GRAPH 0x40 /* use only graph */ +#define FORCE_RULES_LEGEND 0x80 /* force printing of HRULE and VRULE legend */ -#define ALTYGRID 0x01 /* use alternative y grid algorithm */ -#define ALTAUTOSCALE 0x02 /* use alternative algorithm to find lower and upper bounds */ -#define ALTAUTOSCALE_MAX 0x04 /* use alternative algorithm to find upper bounds */ -#define NOLEGEND 0x08 /* use no legend */ +#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 */ +#define NO_RRDTOOL_TAG 0x400 /* disable the rrdtool tag */ -enum tmt_en {TMT_SECOND=0,TMT_MINUTE,TMT_HOUR,TMT_DAY, - TMT_WEEK,TMT_MONTH,TMT_YEAR}; +enum tmt_en { TMT_SECOND = 0, TMT_MINUTE, TMT_HOUR, TMT_DAY, + TMT_WEEK, TMT_MONTH, TMT_YEAR +}; -enum grc_en {GRC_CANVAS=0,GRC_BACK,GRC_SHADEA,GRC_SHADEB, - GRC_GRID,GRC_MGRID,GRC_FONT,GRC_FRAME,GRC_ARROW,__GRC_END__}; +enum grc_en { GRC_CANVAS = 0, GRC_BACK, GRC_SHADEA, GRC_SHADEB, + GRC_GRID, GRC_MGRID, GRC_FONT, GRC_ARROW, GRC_AXIS, GRC_FRAME, __GRC_END__ +}; +#define MGRIDWIDTH 0.6 +#define GRIDWIDTH 0.4 -enum gf_en {GF_PRINT=0,GF_GPRINT,GF_COMMENT,GF_HRULE,GF_VRULE,GF_LINE1, - GF_LINE2,GF_LINE3,GF_AREA,GF_STACK,GF_TICK, - GF_DEF, GF_CDEF, GF_VDEF}; +enum gf_en { GF_PRINT = 0, GF_GPRINT, GF_COMMENT, GF_HRULE, GF_VRULE, GF_LINE, + GF_AREA, GF_STACK, GF_TICK, GF_TEXTALIGN, + GF_DEF, GF_CDEF, GF_VDEF, GF_SHIFT, + GF_XPORT +}; -enum if_en {IF_GIF=0,IF_PNG=1}; +enum txa_en { TXA_LEFT = 0, TXA_RIGHT, TXA_CENTER, TXA_JUSTIFIED }; enum vdef_op_en { - VDEF_MAXIMUM /* like the MAX in (G)PRINT */ - ,VDEF_MINIMUM /* like the MIN in (G)PRINT */ - ,VDEF_AVERAGE /* like the AVERAGE in (G)PRINT */ - ,VDEF_PERCENT /* Nth percentile */ - ,VDEF_TOTAL /* average multiplied by time */ - ,VDEF_FIRST /* first non-unknown value and time */ - ,VDEF_LAST /* last non-unknown value and time */ - }; -typedef struct vdef_t { - enum vdef_op_en op; - double param; /* parameter for function, if applicable */ - double val; /* resulting value */ - time_t when; /* timestamp, if applicable */ -} vdef_t; + 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 */ + , VDEF_LAST /* last non-unknown value and time */ + , VDEF_LSLSLOPE /* least squares line slope */ + , VDEF_LSLINT /* least squares line y_intercept */ + , VDEF_LSLCORREL /* least squares line correlation coefficient */ + , VDEF_PERCENTNAN /* Nth percentile ignoring NAN*/ +}; +enum text_prop_en { + TEXT_PROP_DEFAULT = 0, /* default settings */ + TEXT_PROP_TITLE, /* properties for the title */ + TEXT_PROP_AXIS, /* for the numbers next to the axis */ + TEXT_PROP_UNIT, /* for the vertical unit description */ + TEXT_PROP_LEGEND, /* for the legend below the graph */ + TEXT_PROP_WATERMARK, /* for the little text to the side of the graph */ + TEXT_PROP_LAST +}; -typedef struct col_trip_t { - int red; /* red = -1 is no color */ - int green; - int blue; - int i; /* color index assigned in gif image i=-1 is unasigned*/ -} col_trip_t; +enum legend_pos{ NORTH = 0, WEST, SOUTH, EAST }; +enum legend_direction { TOP_DOWN = 0, BOTTOM_UP }; +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 }; -typedef struct xlab_t { - long minsec; /* minimum sec per pix */ - enum tmt_en gridtm; /* grid interval in what ?*/ - long gridst; /* how many whats per grid*/ - enum tmt_en mgridtm; /* label interval in what ?*/ - long mgridst; /* how many whats per label*/ - enum tmt_en labtm; /* label interval in what ?*/ - long labst; /* how many whats per label*/ - long precis; /* label precision -> label placement*/ - char *stst; /* strftime string*/ -} xlab_t; +/* cairo color components */ +typedef struct gfx_color_t { + double red; + double green; + double blue; + double alpha; +} gfx_color_t; -#if 0 -xlab_t xlab[] = { - {0, TMT_SECOND,30, TMT_MINUTE,5, TMT_MINUTE,5, 0,"%H:%M"}, - {2, TMT_MINUTE,1, TMT_MINUTE,5, TMT_MINUTE,5, 0,"%H:%M"}, - {5, TMT_MINUTE,2, TMT_MINUTE,10, TMT_MINUTE,10, 0,"%H:%M"}, - {10, TMT_MINUTE,5, TMT_MINUTE,20, TMT_MINUTE,20, 0,"%H:%M"}, - {30, TMT_MINUTE,10, TMT_HOUR,1, TMT_HOUR,1, 0,"%H:%M"}, - {60, TMT_MINUTE,30, TMT_HOUR,2, TMT_HOUR,2, 0,"%H:%M"}, - {180, TMT_HOUR,1, TMT_HOUR,6, TMT_HOUR,6, 0,"%H:%M"}, - /*{300, TMT_HOUR,3, TMT_HOUR,12, TMT_HOUR,12, 12*3600,"%a %p"}, this looks silly*/ - {600, TMT_HOUR,6, TMT_DAY,1, TMT_DAY,1, 24*3600,"%a"}, - {1800, TMT_HOUR,12, TMT_DAY,1, TMT_DAY,2, 24*3600,"%a"}, - {3600, TMT_DAY,1, TMT_WEEK,1, TMT_WEEK,1, 7*24*3600,"Week %W"}, - {3*3600, TMT_WEEK,1, TMT_MONTH,1, TMT_WEEK,2, 7*24*3600,"Week %W"}, - {6*3600, TMT_MONTH,1, TMT_MONTH,1, TMT_MONTH,1, 30*24*3600,"%b"}, - {48*3600, TMT_MONTH,1, TMT_MONTH,3, TMT_MONTH,3, 30*24*3600,"%b"}, - {10*24*3600, TMT_YEAR,1, TMT_YEAR,1, TMT_YEAR,1, 365*24*3600,"%y"}, - {-1,TMT_MONTH,0,TMT_MONTH,0,TMT_MONTH,0,0,""} -}; -/* sensible logarithmic y label intervals ... - the first element of each row defines the possible starting points on the - y axis ... the other specify the */ +typedef struct text_prop_t { + double size; + char font[1024]; + PangoFontDescription *font_desc; +} text_prop_t; -double yloglab[][12]= {{ 1e9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 1e3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 1e1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - /* { 1e1, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, */ - { 1e1, 1, 2.5, 5, 7.5, 0, 0, 0, 0, 0, 0, 0 }, - { 1e1, 1, 2, 4, 6, 8, 0, 0, 0, 0, 0, 0 }, - { 1e1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}; -#endif +typedef struct vdef_t { + enum vdef_op_en op; + double param; /* parameter for function, if applicable */ + double val; /* resulting value */ + time_t when; /* timestamp, if applicable */ +} vdef_t; + +typedef struct xlab_t { + long minsec; /* minimum sec per pix */ + long length; /* number of secs on the image */ + enum tmt_en gridtm; /* grid interval in what ? */ + long gridst; /* how many whats per grid */ + enum tmt_en mgridtm; /* label interval in what ? */ + long mgridst; /* how many whats per label */ + enum tmt_en labtm; /* label interval in what ? */ + long labst; /* how many whats per label */ + long precis; /* label precision -> label placement */ + char *stst; /* strftime string */ +} xlab_t; + +typedef struct ygrid_scale_t { /* y axis grid scaling info */ + double gridstep; + int labfact; + char labfmt[64]; +} ygrid_scale_t; /* sensible y label intervals ...*/ typedef struct ylab_t { - double grid; /* grid spacing */ - int lfac[4]; /* associated label spacing*/ + double grid; /* grid spacing */ + int lfac[4]; /* associated label spacing */ } ylab_t; -#if 0 -ylab_t ylab[]= { - {0.1, {1,2, 5,10}}, - {0.2, {1,5,10,20}}, - {0.5, {1,2, 4,10}}, - {1.0, {1,2, 5,10}}, - {2.0, {1,5,10,20}}, - {5.0, {1,2, 4,10}}, - {10.0, {1,2, 5,10}}, - {20.0, {1,5,10,20}}, - {50.0, {1,2, 4,10}}, - {100.0, {1,2, 5,10}}, - {200.0, {1,5,10,20}}, - {500.0, {1,2, 4,10}}, - {0.0, {0,0,0,0}}}; - - - -col_trip_t graph_col[] = { /* default colors */ - {255,255,255,-1}, /* canvas */ - {245,245,245,-1}, /* background */ - {200,200,200,-1}, /* shade A */ - {150,150,150,-1}, /* shade B */ - {140,140,140,-1}, /* grid */ - {130,30,30,-1}, /* major grid */ - {0,0,0,-1}, /* font */ - {0,0,0,-1}, /* frame */ - {255,0,0,-1} /*arrow*/ -}; - -#endif - /* 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. */ @@ -142,121 +149,339 @@ col_trip_t graph_col[] = { /* default colors */ #define FMT_LEG_LEN 2000 #endif -typedef struct graph_desc_t { - enum gf_en gf; /* graphing function */ - char vname[MAX_VNAME_LEN+1]; /* name of the variable */ - long vidx; /* gdes reference */ - char rrd[255]; /* name of the rrd_file containing data */ - char ds_nam[DS_NAM_SIZE]; /* data source name */ - long ds; /* data source number */ - enum cf_en cf; /* consolidation function */ - col_trip_t col; /* graph color */ - char format[FMT_LEG_LEN+5]; /* format for PRINT AND GPRINT */ - char legend[FMT_LEG_LEN+5]; /* legend*/ - gdPoint legloc; /* location of legend */ - double yrule; /* value for y rule line and for VDEF */ - time_t xrule; /* time for x rule line and for VDEF */ - vdef_t vf; /* instruction for VDEF function */ - rpnp_t *rpnp; /* instructions for CDEF function */ +typedef struct graph_desc_t { + enum gf_en gf; /* graphing function */ + int stack; /* boolean */ + int debug; /* boolean */ + char vname[MAX_VNAME_LEN + 1]; /* name of the variable */ + long vidx; /* gdes reference */ + char rrd[1024]; /* name of the rrd_file containing data */ + char ds_nam[DS_NAM_SIZE]; /* data source name */ + long ds; /* data source number */ + enum cf_en cf; /* consolidation function */ + enum cf_en cf_reduce; /* consolidation function for reduce_data() */ + 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 */ + double leg_x, leg_y; /* location of legend */ + double yrule; /* value for y rule line and for VDEF */ + time_t xrule; /* time for x rule line and for VDEF */ + vdef_t vf; /* instruction for VDEF function */ + rpnp_t *rpnp; /* instructions for CDEF function */ + + /* SHIFT implementation */ + int shidx; /* gdes reference for offset (-1 --> constant) */ + time_t shval; /* offset if shidx is -1 */ + time_t shift; /* current shift applied */ /* description of data fetched for the graph element */ - time_t start,end; /* timestaps for first and last data element */ - unsigned long step; /* time between samples */ - unsigned long ds_cnt; /* how many data sources are there in the fetch */ - long data_first; /* first pointer to this data */ - char **ds_namv; /* name of datasources in the fetch. */ - rrd_value_t *data; /* the raw data drawn from the rrd */ - rrd_value_t *p_data; /* processed data, xsize elments */ - + time_t start, end; /* timestaps for first and last data element */ + time_t start_orig, end_orig; /* timestaps for first and last data element */ + unsigned long step; /* time between samples */ + unsigned long step_orig; /* time between samples */ + unsigned long ds_cnt; /* how many data sources are there in the fetch */ + long data_first; /* first pointer to this data */ + char **ds_namv; /* name of datasources in the fetch. */ + 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 */ - long xsize,ysize; /* graph area size in pixels */ - col_trip_t graph_col[__GRC_END__]; /* real colors for the graph */ - char ylegend[200]; /* legend along the yaxis */ - char title[200]; /* title for graph */ - int draw_x_grid; /* no x-grid at all */ - int draw_y_grid; /* no x-grid at all */ - xlab_t xlab_user; /* user defined labeling for xaxis */ - char xlab_form[200]; /* format for the label on the xaxis */ - - double ygridstep; /* user defined step for y grid */ - int ylabfact; /* every how many y grid shall a label be written ? */ - - time_t start,end; /* what time does the graph cover */ - unsigned long step; /* any preference for the default step ? */ - rrd_value_t minval,maxval; /* extreme values in the data */ - int rigid; /* do not expand range even with - values outside */ - char* imginfo; /* construct an