[lasem] lsm_str: return the number of doubles found in lsm_str_parse_double_list.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] lsm_str: return the number of doubles found in lsm_str_parse_double_list.
- Date: Thu, 19 Aug 2010 21:50:09 +0000 (UTC)
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]