? depcomp ? ylwrap Index: src/cut-n-paste-code/goffice/ChangeLog =================================================================== RCS file: /cvs/gnome/gnumeric/src/cut-n-paste-code/goffice/ChangeLog,v retrieving revision 1.149 diff -u -r1.149 ChangeLog --- src/cut-n-paste-code/goffice/ChangeLog 3 Nov 2003 07:37:57 -0000 1.149 +++ src/cut-n-paste-code/goffice/ChangeLog 5 Nov 2003 10:11:04 -0000 @@ -1,3 +1,12 @@ +2003-11-05 Emmanuel Pacaud + + http://bugzilla.gnome.org/show_bug.cgi?id=125045 + * graph/gog-axis.c (gog_axis_num_markers) : add an offset argument, + used for correct placing of tick marks. + (gog_axis_get_marker) : when axis is not discrete, returns labels + relative to automatic min bound instead of user min. + (gog_axis_view_render) : use offset argument of gog_axis_num_markers. + 2003-11-03 Jody Goldberg http://bugzilla.gnome.org/show_bug.cgi?id=126056 Index: src/cut-n-paste-code/goffice/graph/gog-axis.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/cut-n-paste-code/goffice/graph/gog-axis.c,v retrieving revision 1.49 diff -u -r1.49 gog-axis.c --- src/cut-n-paste-code/goffice/graph/gog-axis.c 3 Nov 2003 07:37:58 -0000 1.49 +++ src/cut-n-paste-code/goffice/graph/gog-axis.c 5 Nov 2003 10:11:05 -0000 @@ -885,7 +885,7 @@ } static unsigned -gog_axis_num_markers (GogAxis *axis, double *step) +gog_axis_num_markers (GogAxis *axis, double *step, double *offset) { double minima, maxima; @@ -899,6 +899,8 @@ n = 1; if (step != NULL) *step = 1. / n; + if (offset != NULL) + *offset = 0; return n; } else { double major_tick = axis_get_entry (axis, AXIS_ELEM_MAJOR_TICK, NULL); @@ -906,10 +908,15 @@ !gog_axis_get_bounds (axis, &minima, &maxima)) { if (step != NULL) *step = 1.; + if (offset != NULL) + *offset = 0.; return 0; } if (step != NULL) *step = major_tick / fabs (maxima - minima); + if (offset != NULL) + *offset = fmod (axis->auto_bound[AXIS_ELEM_MIN] - minima, major_tick) + / fabs (maxima - minima); return 1.5 + fabs (maxima - minima) / major_tick; } } @@ -923,8 +930,10 @@ return g_strdup_printf ("%d", i+1); } else { double major_tick = axis_get_entry (axis, AXIS_ELEM_MAJOR_TICK, NULL); - double val = axis_get_entry (axis, AXIS_ELEM_MIN, NULL) + - (((double)i) * major_tick); + double auto_min = axis->auto_bound[AXIS_ELEM_MIN]; + double offset = floor ((axis_get_entry (axis, AXIS_ELEM_MIN, NULL) - auto_min) / + major_tick); + double val = auto_min + (((double)i + offset) * major_tick); /* force display to 0 if it is within less than a step */ if (fabs (val) < major_tick / 10.0) @@ -961,7 +970,7 @@ * things are too big */ if (axis->major_tick_labeled) { gog_renderer_push_style (v->renderer, axis->base.style); - for (i = gog_axis_num_markers (axis, NULL) ; i-- > 0 ; ) { + for (i = gog_axis_num_markers (axis, NULL, NULL) ; i-- > 0 ; ) { label = gog_axis_get_marker (axis, i); gog_renderer_measure_text (v->renderer, label, &tmp); g_free (label); @@ -1019,7 +1028,8 @@ char *label; gboolean draw_major, draw_minor; double pre, post, bound, tick_len, label_pad, dir, center, start; - double step, line_width = gog_renderer_line_size ( + double step, offset, delta; + double line_width = gog_renderer_line_size ( v->renderer, axis->base.style->line.width) / 2; (aview_parent_klass->render) (v, bbox); @@ -1033,9 +1043,7 @@ draw_major = axis->major.tick_out || axis->major.tick_in; draw_minor = axis->minor.tick_out || axis->minor.tick_in; - n = gog_axis_num_markers (axis, &step); - if (axis->is_discrete) - n++; + n = gog_axis_num_markers (axis, &step, &offset); switch (axis->type) { case GOG_AXIS_X: gog_chart_view_get_indents (v->parent, &pre, &post); @@ -1054,6 +1062,7 @@ default : break; } step *= (area->w - pre - post); + offset *= area->w; axis_path[0].y = axis_path[1].y = center; axis_path[0].x = start = area->x + pre; @@ -1079,15 +1088,17 @@ label_pos.w = -1; } - for (bound = -1, i = 0 ; i < n ; i++) { - if (i*step > (area->w - pre - post)) /* clip */ + for (bound = -1, i = 0 ; i <= n ; i++) { + delta = offset + i*step; + if ((gnumeric_sub_epsilon (delta) > area->w) || + (delta < 0)) /* clip */ continue; if (draw_major) { - major_path[1].x = major_path[0].x = axis_path[0].x + i * step; + major_path[1].x = major_path[0].x = axis_path[0].x + delta; gog_renderer_draw_path (v->renderer, major_path, NULL); } if (axis->major_tick_labeled) { - label_pos.x = axis_path[0].x + i * step; + label_pos.x = axis_path[0].x + delta; if (label_pos.x < bound) continue; if (axis->is_discrete) { @@ -1120,6 +1131,7 @@ default : break; } step *= area->h; + offset *= area->h; axis_path[0].x = axis_path[1].x = center; axis_path[0].y = start = area->y + area->h; @@ -1145,15 +1157,17 @@ label_pos.h = -1; } - for (bound = DBL_MAX, i = 0 ; i < n ; i++) { - if (i*step > area->h) /* clip */ + for (bound = DBL_MAX, i = 0 ; i <= n ; i++) { + delta = offset + i*step; + if ((gnumeric_sub_epsilon (delta) > area->h) || + (delta < 0)) /* clip */ continue; if (draw_major) { - major_path[1].y = major_path[0].y = axis_path[0].y - i * step; + major_path[1].y = major_path[0].y = axis_path[0].y - delta; gog_renderer_draw_path (v->renderer, major_path, NULL); } if (axis->major_tick_labeled) { - label_pos.y = axis_path[0].y - i * step; + label_pos.y = axis_path[0].y - delta; if (label_pos.y > bound) continue; if (axis->is_discrete) {