[goffice] Fix cubic splines with invalid data. [#611163]



commit 059d85699815a708f8d6ec9704a717d4e81a38fb
Author: Jean Brefort <jean brefort normalesup org>
Date:   Fri Feb 26 12:03:34 2010 +0100

    Fix cubic splines with invalid data. [#611163]

 ChangeLog                     |    7 +++++++
 NEWS                          |    1 +
 goffice/graph/gog-chart-map.c |    6 ++++--
 goffice/utils/go-bezier.c     |   21 +++++++++++++++++++++
 goffice/utils/go-bezier.h     |    1 +
 5 files changed, 34 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index dc844cd..b561a3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-26  Jean Brefort  <jean brefort normalesup org>
+
+	* goffice/graph/gog-chart-map.c (make_path_cspline): correctly manage
+	invalid data. [#611163]
+	* goffice/utils/go-bezier.c (go_bezier_spline_to_cairo): new utility.
+	* goffice/utils/go-bezier.h: ditto.
+
 2010-02-21  Jean Brefort  <jean brefort normalesup org>
 
 	* goffice/gtk/goffice-gtk.c (go_gtk_builder_new): fixed a memory leak.
diff --git a/NEWS b/NEWS
index b02de10..3d8da3f 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ Jean:
 	* Use gtk_buildable_get_name instead of gtk_widget_get_name where
 	appropriate. [#610434]
 	* Fix crash in GogGuru. [#610435]
+	* Fix cubic splines with invalid data. [#611163]
 
 --------------------------------------------------------------------------
 goffice 0.8.0:
diff --git a/goffice/graph/gog-chart-map.c b/goffice/graph/gog-chart-map.c
index 92cdcd8..65517fa 100644
--- a/goffice/graph/gog-chart-map.c
+++ b/goffice/graph/gog-chart-map.c
@@ -363,9 +363,10 @@ make_path_cspline (GogChartMap *map,
 		} else {
 			if (skip_invalid || type == GO_CSPLINE_CLAMPED)
 				continue;
-			if (n_valid_points == 2)
+			if (n_valid_points == 2) {
+				go_path_move_to (path, uu[0], vv[0]);
 				go_path_line_to (path, uu[1], vv[1]);
-			else if (n_valid_points > 2) {
+			} else if (n_valid_points > 2) {
 				/* evaluate the spline */
 				spline = go_cspline_init (uu, vv, n_valid_points, type, p0, p1);
 				if (spline) {
@@ -388,6 +389,7 @@ make_path_cspline (GogChartMap *map,
 					go_cspline_destroy (spline);
 				}
 			}
+			n_valid_points = 0;
 		}
 	}
 	if (n_valid_points == 2) {
diff --git a/goffice/utils/go-bezier.c b/goffice/utils/go-bezier.c
index 235cdcf..b02d1a3 100644
--- a/goffice/utils/go-bezier.c
+++ b/goffice/utils/go-bezier.c
@@ -335,3 +335,24 @@ go_bezier_spline_to_path (GOBezierSpline *sp)
 	}
 	return path;
 }
+
+/**
+ * go_bezier_spline_to_path:
+ * @sp: a struct GOBezierSpline instance returned by go_bezier_spline_init
+ * @cr: a cairo context
+ *
+ * Renders the spline in \a cr
+ **/
+void
+go_bezier_spline_to_cairo (GOBezierSpline *sp, cairo_t *cr)
+{
+	int i, j;
+	cairo_new_path (cr);
+	cairo_move_to (cr, sp->x[0], sp->y[0]);
+	for (i = j = 1; i < sp->n; i++, j += 3)
+		cairo_curve_to (cr, sp->x[j], sp->y[j], sp->x[j+1], sp->y[j+1], sp->x[j+2], sp->y[j+2]);
+	if (sp->closed) {
+		cairo_curve_to (cr, sp->x[j], sp->y[j], sp->x[j+1], sp->y[j+1], sp->x[0], sp->y[0]);
+		cairo_close_path (cr);
+	}
+}
diff --git a/goffice/utils/go-bezier.h b/goffice/utils/go-bezier.h
index d2ae01f..1e55cda 100644
--- a/goffice/utils/go-bezier.h
+++ b/goffice/utils/go-bezier.h
@@ -38,6 +38,7 @@ GOBezierSpline *go_bezier_spline_init (double const *x, double const *y, int n,
 void go_bezier_spline_destroy (GOBezierSpline *sp);
 
 GOPath *go_bezier_spline_to_path (GOBezierSpline *sp);
+void go_bezier_spline_to_cairo (GOBezierSpline *sp, cairo_t *cr);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]