[goffice] Fix cubic splines with invalid data. [#611163]
- From: Jean Bréfort <jbrefort src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] Fix cubic splines with invalid data. [#611163]
- Date: Fri, 26 Feb 2010 11:01:37 +0000 (UTC)
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]