[lasem] lsm_str: return the number of doubles found in lsm_str_parse_double_list.



commit de142c5a81fa9040b0ae5635add5319641f3cc18
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Thu Aug 19 23:48:51 2010 +0200

    lsm_str: return the number of doubles found in lsm_str_parse_double_list.
    
    It helps to validate the content of point lists.
    Fix rendering of svg1.2/shapes/shapes-polygon-02-t.svg.

 src/lsmstr.c     |    6 +++---
 src/lsmstr.h     |    8 ++++----
 src/lsmsvgview.c |   36 +++++++++++++++++++++++-------------
 3 files changed, 30 insertions(+), 20 deletions(-)
---
diff --git a/src/lsmstr.c b/src/lsmstr.c
index 45cf98e..0784161 100644
--- a/src/lsmstr.c
+++ b/src/lsmstr.c
@@ -171,7 +171,7 @@ lsm_str_parse_double (char **str, double *x)
 	return TRUE;
 }
 
-gboolean
+unsigned int
 lsm_str_parse_double_list (char **str, unsigned int n_values, double *values)
 {
 	char *ptr = *str;
@@ -182,11 +182,11 @@ lsm_str_parse_double_list (char **str, unsigned int n_values, double *values)
 	for (i = 0; i < n_values; i++) {
 		if (!lsm_str_parse_double (str, &values[i])) {
 			*str = ptr;
-			return FALSE;
+			return i;
 		}
 		lsm_str_skip_comma_and_spaces (str);
 	}
 
-	return TRUE;
+	return i;
 }
 
diff --git a/src/lsmstr.h b/src/lsmstr.h
index 3f3525f..92fb120 100644
--- a/src/lsmstr.h
+++ b/src/lsmstr.h
@@ -28,11 +28,11 @@
 
 G_BEGIN_DECLS
 
-gboolean lsm_str_is_uri 		(const char *str);
-char *   lsm_str_to_uri 		(const char *str);
+gboolean 	lsm_str_is_uri 		(const char *str);
+char *   	lsm_str_to_uri 		(const char *str);
 
-gboolean lsm_str_parse_double 		(char **str, double *x);
-gboolean lsm_str_parse_double_list 	(char **str, unsigned int n_values, double *values);
+gboolean 	lsm_str_parse_double 		(char **str, double *x);
+unsigned int 	lsm_str_parse_double_list 	(char **str, unsigned int n_values, double *values);
 
 static inline void
 lsm_str_skip_spaces (char **str)
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 729013f..61691dd 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -534,7 +534,7 @@ static void
 _emit_function_1 (LsmSvgPathContext *ctxt,
 		  void (*cairo_func) (cairo_t *, double))
 {
-	while (lsm_str_parse_double_list (&ctxt->ptr, 1, ctxt->values))
+	while (lsm_str_parse_double_list (&ctxt->ptr, 1, ctxt->values) == 1)
 		cairo_func (ctxt->cr, ctxt->values[0]);
 }
 
@@ -544,12 +544,12 @@ _emit_function_2 (LsmSvgPathContext *ctxt,
 		  void (*cairo_func_b) (cairo_t *, double, double))
 {
 
-	if (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values)) {
+	if (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2) {
 		cairo_func_a (ctxt->cr, ctxt->values[0], ctxt->values[1]);
 
 		/* Why oh why does the specification say Line is implied here ? */
 
-		while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values))
+		while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2)
 			cairo_func_b (ctxt->cr, ctxt->values[0], ctxt->values[1]);
 	}
 }
@@ -558,7 +558,7 @@ static void
 _emit_function_4 (LsmSvgPathContext *ctxt,
 		  void (*cairo_func) (cairo_t *, double, double, double, double))
 {
-	while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values))
+	while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values) == 4)
 		cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2], ctxt->values[3]);
 }
 
@@ -590,7 +590,7 @@ _emit_smooth_curve (LsmSvgPathContext *ctxt, gboolean relative)
 		default: x = x0; y = y0; break;
 	}
 
-	while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values)) {
+	while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values) == 4) {
 		if (relative) {
 			cairo_get_current_point (ctxt->cr, &x0, &y0);
 			cairo_curve_to (ctxt->cr,
@@ -631,7 +631,7 @@ _emit_smooth_quadratic_curve (LsmSvgPathContext *ctxt, gboolean relative)
 		default: ctxt->last_cp_x = x0; ctxt->last_cp_y = y0; break;
 	}
 
-	while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values)) {
+	while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2) {
 		x = 2 * x0 - ctxt->last_cp_x;
 		y = 2 * y0 - ctxt->last_cp_y;
 		if (relative) {
@@ -650,7 +650,7 @@ static void
 _emit_function_6 (LsmSvgPathContext *ctxt,
 		  void (*cairo_func) (cairo_t *, double, double, double ,double, double, double))
 {
-	while (lsm_str_parse_double_list (&ctxt->ptr, 6, ctxt->values))
+	while (lsm_str_parse_double_list (&ctxt->ptr, 6, ctxt->values) == 6)
 		cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2],
 			              ctxt->values[3], ctxt->values[4], ctxt->values[5]);
 }
@@ -659,7 +659,7 @@ static void
 _emit_function_7 (LsmSvgPathContext *ctxt,
 		  void (*cairo_func) (cairo_t *, double, double, double ,gboolean, gboolean, double, double))
 {
-	while (lsm_str_parse_double_list (&ctxt->ptr, 7, ctxt->values))
+	while (lsm_str_parse_double_list (&ctxt->ptr, 7, ctxt->values) == 7)
 		cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2],
 			              ctxt->values[3], ctxt->values[4], ctxt->values[5],
 				      ctxt->values[6]);
@@ -1288,6 +1288,8 @@ _show_points (LsmSvgView *view, const char *points, gboolean close_path)
 	LsmSvgViewPathInfos path_infos = default_path_infos;
 	char *str;
 	double values[2];
+	unsigned int n_values;
+	unsigned int count = 0;
 
 	if (points == NULL)
 		return;
@@ -1296,11 +1298,19 @@ _show_points (LsmSvgView *view, const char *points, gboolean close_path)
 
 	str = (char *) points;
 
-	if (lsm_str_parse_double_list (&str, 2, values)) {
-		cairo_move_to (view->dom_view.cairo, values[0], values[1]);
-		while (lsm_str_parse_double_list (&str, 2, values))
-			cairo_line_to (view->dom_view.cairo, values[0], values[1]);
-	}
+	do {
+		n_values = lsm_str_parse_double_list (&str, 2, values);
+		if (n_values == 2) {
+			if (count == 0)
+				cairo_move_to (view->dom_view.cairo, values[0], values[1]);
+			else
+				cairo_line_to (view->dom_view.cairo, values[0], values[1]);
+		} else if (n_values != 0) {
+			cairo_new_path (view->dom_view.cairo);
+			return;
+		}
+		count++;
+	} while (n_values == 2);
 
 	if (close_path)
 		cairo_close_path (view->dom_view.cairo);



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