X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Frrd_graph.c;h=2db9eea32970cd42e4bae824eedeaec4ee16b588;hb=d0e9fa482901e766983e937b1e85ee94e38e8a7c;hp=0d25f99b01f601193288eb7f3acc9fff94f329d0;hpb=af4d621649f50224431548ba01027d54c3edf4d7;p=rrdtool.git diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 0d25f99..2db9eea 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -1,5 +1,5 @@ -/**************************************************************************** - * RRDtool 1.3.7 Copyright by Tobi Oetiker, 1997-2009 +/****************************************************************************s + * RRDtool 1.3.9 Copyright by Tobi Oetiker, 1997-2009 **************************************************************************** * rrd__graph.c produce graphs from data in rrdfiles ****************************************************************************/ @@ -325,6 +325,12 @@ int im_free( free(im->gdes[i].rpnp); } free(im->gdes); + + for (i = 0; i < DIM(text_prop);i++){ + pango_font_description_free(im->text_prop[i].font_desc); + im->text_prop[i].font_desc = NULL; + } + if (im->font_options) cairo_font_options_destroy(im->font_options); @@ -332,6 +338,8 @@ int im_free( status = cairo_status(im->cr); cairo_destroy(im->cr); } + + if (im->rendered_image) { free(im->rendered_image); } @@ -847,6 +855,10 @@ int data_fetch( } im->gdes[i].data_first = 1; + /* must reduce to at least im->step + otherwhise we end up with more data than we can handle in the + chart and visibility of data will be random */ + im->gdes[i].step = max(im->gdes[i].step,im->step); if (ft_step < im->gdes[i].step) { reduce_data(im->gdes[i].cf_reduce, ft_step, @@ -1211,7 +1223,7 @@ int data_proc( } else if (((long int) gr_time >= (long int) im->gdes[vidx].start) - && ((long int) gr_time <= + && ((long int) gr_time < (long int) im->gdes[vidx].end)) { value = im->gdes[vidx].data[(unsigned long) floor((double) @@ -1512,7 +1524,7 @@ int print_calc( } } /* prepare printval */ - if ((percent_s = strstr(im->gdes[i].format, "%S")) != NULL) { + if (!im->gdes[i].strftm && (percent_s = strstr(im->gdes[i].format, "%S")) != NULL) { /* Magfact is set to -1 upon entry to print_calc. If it * is still less than 0, then we need to run auto_scale. * Otherwise, put the value into the correct units. If @@ -1526,7 +1538,7 @@ int print_calc( printval /= magfact; } *(++percent_s) = 's'; - } else if (strstr(im->gdes[i].format, "%s") != NULL) { + } else if (!im->gdes[i].strftm && strstr(im->gdes[i].format, "%s") != NULL) { auto_scale(im, &printval, &si_symb, &magfact); } @@ -1633,7 +1645,7 @@ int leg_place( int *legspace; char *tab; - if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) { + if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) { if ((legspace = (int*)(malloc(im->gdes_c * sizeof(int)))) == NULL) { rrd_set_error("malloc for legspace"); return -1; @@ -1997,7 +2009,7 @@ int draw_horizontal_grid( } } else { - sprintf(graph_label_right,im->second_axis_format,sval); + sprintf(graph_label_right,im->second_axis_format,sval,""); } gfx_text ( im, X1+7, Y0, @@ -2647,7 +2659,7 @@ void grid_paint( } /* graph labels */ - if (!(im->extra_flags & NOLEGEND) & !(im->extra_flags & ONLY_GRAPH)) { + if (!(im->extra_flags & NOLEGEND) && !(im->extra_flags & ONLY_GRAPH)) { for (i = 0; i < im->gdes_c; i++) { if (im->gdes[i].legend[0] == '\0') continue; @@ -3698,15 +3710,19 @@ rrd_info_t *rrd_graph_v( rrd_info_t *grinfo; rrd_graph_init(&im); /* a dummy surface so that we can measure text sizes for placements */ + old_locale = setlocale(LC_NUMERIC, NULL); + setlocale(LC_NUMERIC, "C"); rrd_graph_options(argc, argv, &im); if (rrd_test_error()) { + setlocale(LC_NUMERIC, old_locale); /* reenable locale */ rrd_info_free(im.grinfo); im_free(&im); return NULL; } if (optind >= argc) { + setlocale(LC_NUMERIC, old_locale); /* reenable locale */ rrd_info_free(im.grinfo); im_free(&im); rrd_set_error("missing filename"); @@ -3714,6 +3730,7 @@ rrd_info_t *rrd_graph_v( } if (strlen(argv[optind]) >= MAXPATH) { + setlocale(LC_NUMERIC, old_locale); /* reenable locale */ rrd_set_error("filename (including path) too long"); rrd_info_free(im.grinfo); im_free(&im); @@ -3728,6 +3745,7 @@ rrd_info_t *rrd_graph_v( } rrd_graph_script(argc, argv, &im, 1); + setlocale(LC_NUMERIC, old_locale); /* reenable locale */ if (rrd_test_error()) { rrd_info_free(im.grinfo); im_free(&im); @@ -3781,6 +3799,8 @@ rrd_set_font_desc ( if (font){ strncpy(im->text_prop[prop].font, font, sizeof(text_prop[prop].font) - 1); im->text_prop[prop].font[sizeof(text_prop[prop].font) - 1] = '\0'; + /* if we already got one, drop it first */ + pango_font_description_free(im->text_prop[prop].font_desc); im->text_prop[prop].font_desc = pango_font_description_from_string( font ); }; if (size > 0){ @@ -3830,6 +3850,7 @@ void rrd_graph_init( im->maxval = DNAN; im->minval = 0; im->minval = DNAN; + im->magfact = 1; im->prt_c = 0; im->rigid = 0; im->rendered_image_size = 0; @@ -3864,6 +3885,7 @@ void rrd_graph_init( for (i = 0; i < DIM(text_prop); i++) { im->text_prop[i].size = -1; + im->text_prop[i].font_desc = NULL; rrd_set_font_desc(im,i, deffont ? deffont : text_prop[i].font,text_prop[i].size); } @@ -3878,6 +3900,7 @@ void rrd_graph_init( pango_cairo_update_context(im->cr,context); im->layout = pango_layout_new(context); + g_object_unref (context); // im->layout = pango_cairo_create_layout(im->cr); @@ -3978,7 +4001,7 @@ void rrd_graph_options( int col_start, col_end; opt = getopt_long(argc, argv, - "s:e:x:y:v:w:h:D:iu:l:rb:oc:n:m:t:f:a:I:zgjFYAMEX:L:S:T:NR:B:W:kP", + "s:e:x:y:v:w:h:Diu:l:rb:oc:n:m:t:f:a:I:zgG:jFYAMEX:L:S:T:NR:B:W:kP", long_options, &option_index); if (opt == EOF) break; @@ -4624,7 +4647,7 @@ int vdef_calc( array[step] = data[step * src->ds_cnt]; } qsort(array, step, sizeof(double), vdef_percent_compar); - field = (steps - 1) * dst->vf.param / 100; + field = round((dst->vf.param * (double)(steps - 1)) / 100.0); dst->vf.val = array[field]; dst->vf.when = 0; /* no time component */ free(array); @@ -4633,7 +4656,7 @@ int vdef_calc( printf("DEBUG: %3li:%10.2f %c\n", step, array[step], step == field ? '*' : ' '); #endif - } + } break; case VDEF_MAXIMUM: step = 0;