]> gitweb.michael.orlitzky.com - libsvgtiny.git/blobdiff - src/svgtiny_gradient.c
Suppress most gradient debug.
[libsvgtiny.git] / src / svgtiny_gradient.c
index 19f7f1f5cd0e048404cd409789fe722b69b2d191..5361532e593b12f07ab461b8690cdb4d6eeb00b2 100644 (file)
@@ -34,7 +34,9 @@ void svgtiny_find_gradient(const char *id, struct svgtiny_parse_state *state)
        dom_string *id_str;
        dom_exception exc;
 
+       #ifdef GRADIENT_DEBUG
        fprintf(stderr, "svgtiny_find_gradient: id \"%s\"\n", id);
+       #endif
 
        state->linear_gradient_stop_count = 0;
        if (state->gradient_x1 != NULL)
@@ -69,7 +71,9 @@ void svgtiny_find_gradient(const char *id, struct svgtiny_parse_state *state)
                return;
 
        if (gradient == NULL) {
+               #ifdef GRADIENT_DEBUG
                fprintf(stderr, "gradient \"%s\" not found\n", id);
+               #endif
                return;
        }
        
@@ -105,7 +109,7 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
        if (exc == DOM_NO_ERR && attr != NULL) {
                if (dom_string_data(attr)[0] == (uint8_t) '#') {
                        char *s = strndup(dom_string_data(attr) + 1,
-                                         dom_string_length(attr) - 1);
+                                         dom_string_byte_length(attr) - 1);
                        svgtiny_find_gradient(s, state);
                        free(s);
                }
@@ -155,15 +159,17 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
        if (exc == DOM_NO_ERR && attr != NULL) {
                float a = 1, b = 0, c = 0, d = 1, e = 0, f = 0;
                char *s = strndup(dom_string_data(attr),
-                                 dom_string_length(attr));
+                                 dom_string_byte_length(attr));
                if (s == NULL) {
                        dom_string_unref(attr);
                        return svgtiny_OUT_OF_MEMORY;
                }
                svgtiny_parse_transform(s, &a, &b, &c, &d, &e, &f);
                free(s);
+               #ifdef GRADIENT_DEBUG
                fprintf(stderr, "transform %g %g %g %g %g %g\n",
                        a, b, c, d, e, f);
+               #endif
                state->gradient_transform.a = a;
                state->gradient_transform.b = b;
                state->gradient_transform.c = c;
@@ -188,7 +194,8 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
                        dom_element *stop;
                        float offset = -1;
                        svgtiny_colour color = svgtiny_TRANSPARENT;
-                       exc = dom_nodelist_item(stops, stopnr, &stop);
+                       exc = dom_nodelist_item(stops, stopnr,
+                                               (dom_node **) (void *) &stop);
                        if (exc != DOM_NO_ERR)
                                continue;
                        exc = dom_element_get_attribute(stop,
@@ -196,7 +203,7 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
                                                        &attr);
                        if (exc == DOM_NO_ERR && attr != NULL) {
                                char *s = strndup(dom_string_data(attr),
-                                                 dom_string_length(attr));
+                                                 dom_string_byte_length(attr));
                                offset = svgtiny_parse_gradient_offset(s);
                                free(s);
                                dom_string_unref(attr);
@@ -213,7 +220,7 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
                                                        &attr);
                        if (exc == DOM_NO_ERR && attr != NULL) {
                                char *content = strndup(dom_string_data(attr),
-                                                       dom_string_length(attr));
+                                                       dom_string_byte_length(attr));
                                const char *s;
                                dom_string *value;
                                if ((s = strstr(content, "stop-color:"))) {
@@ -236,7 +243,9 @@ svgtiny_code svgtiny_parse_linear_gradient(dom_element *linear,
                                dom_string_unref(attr);
                        }
                        if (offset != -1 && color != svgtiny_TRANSPARENT) {
+                               #ifdef GRADIENT_DEBUG
                                fprintf(stderr, "stop %g %x\n", offset, color);
+                               #endif
                                state->gradient_stop[i].offset = offset;
                                state->gradient_stop[i].color = color;
                                i++;
@@ -315,17 +324,6 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
                        object_x0, object_y0, object_x1, object_y1);
        #endif
 
-       /* compute gradient vector */
-       fprintf(stderr, "x1 %*s, y1 %*s, x2 %*s, y2 %*s\n",
-               dom_string_length(state->gradient_x1),
-               dom_string_data(state->gradient_x1),
-               dom_string_length(state->gradient_y1),
-               dom_string_data(state->gradient_y1),
-               dom_string_length(state->gradient_x2),
-               dom_string_data(state->gradient_x2),
-               dom_string_length(state->gradient_y2),
-               dom_string_data(state->gradient_y2));
-
        if (!state->gradient_user_space_on_use) {
                gradient_x0 = object_x0 +
                                svgtiny_parse_length(state->gradient_x1,
@@ -400,9 +398,11 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
 
        /* invert gradient transform for applying to vertices */
        svgtiny_invert_matrix(&state->gradient_transform.a, trans);
+       #ifdef GRADIENT_DEBUG
        fprintf(stderr, "inverse transform %g %g %g %g %g %g\n",
                        trans[0], trans[1], trans[2], trans[3],
                        trans[4], trans[5]);
+       #endif
 
        /* compute points on the path for triangle vertices */
        /* r, r0, r1 are distance along gradient vector */
@@ -472,11 +472,19 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
                                gradient_norm_squared;
 
                /* determine steps from change in r */
-               steps = ceilf(fabsf(r1 - r0) / 0.05);
+
+               if(isnan(r0) || isnan(r1)) {
+                       steps = 1;
+               } else {
+                       steps = ceilf(fabsf(r1 - r0) / 0.05);
+               }
+
                if (steps == 0)
                        steps = 1;
+               #ifdef GRADIENT_DEBUG
                fprintf(stderr, "r0 %g, r1 %g, steps %i\n",
                                r0, r1, steps);
+               #endif
 
                /* loop through intermediate points */
                for (z = 1; z != steps; z++) {
@@ -501,7 +509,9 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
                        r = ((x_trans - gradient_x0) * gradient_dx +
                                        (y_trans - gradient_y0) * gradient_dy) /
                                        gradient_norm_squared;
+                       #ifdef GRADIENT_DEBUG
                        fprintf(stderr, "(%g %g [%g]) ", x, y, r);
+                       #endif
                        point = svgtiny_list_push(pts);
                        if (!point) {
                                svgtiny_list_free(pts);
@@ -515,14 +525,18 @@ svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
                                min_pt = svgtiny_list_size(pts) - 1;
                        }
                }
+               #ifdef GRADIENT_DEBUG
                fprintf(stderr, "\n");
+               #endif
 
                /* next segment start point is this segment end point */
                x0 = x1;
                y0 = y1;
        }
+       #ifdef GRADIENT_DEBUG
        fprintf(stderr, "pts size %i, min_pt %i, min_r %.3f\n",
                        svgtiny_list_size(pts), min_pt, min_r);
+       #endif
 
        /* render triangles */
        stop_count = state->linear_gradient_stop_count;