- break;
- case svgtiny_PATH_LINE:
- case svgtiny_PATH_CLOSE:
- if (((int) p[j]) == svgtiny_PATH_LINE) {
- x1 = p[j + 1];
- y1 = p[j + 2];
- j += 3;
- } else {
- x1 = p[1];
- y1 = p[2];
- j++;
- }
- fprintf(stderr, "line: ");
- for (unsigned int z = 0; z != steps; z++) {
- float f, x, y, r;
- f = (float) z / (float) steps;
- x = x0 + f * (x1 - x0);
- y = y0 + f * (y1 - y0);
- r = ((x - gradient_x0) * gradient_dx +
- (y - gradient_y0) * gradient_dy) /
- gradient_norm_squared;
- fprintf(stderr, "(%g %g [%g]) ", x, y, r);
- pts[pts_count].x = x;
- pts[pts_count].y = y;
- pts[pts_count].r = r;
- if (r < min_r) {
- min_r = r;
- min_pt = pts_count;
- }
- pts_count++;
- }
- fprintf(stderr, "\n");
- x0 = x1;
- y0 = y1;
- break;
- case svgtiny_PATH_BEZIER:
- fprintf(stderr, "bezier: ");
- for (unsigned int z = 0; z != steps; z++) {
- float t, x, y, r;
- t = (float) z / (float) steps;
+ continue;
+ }
+
+ assert(segment_type == svgtiny_PATH_CLOSE ||
+ segment_type == svgtiny_PATH_LINE ||
+ segment_type == svgtiny_PATH_BEZIER);
+
+ /* start point (x0, y0) */
+ x0_trans = trans[0]*x0 + trans[2]*y0 + trans[4];
+ y0_trans = trans[1]*x0 + trans[3]*y0 + trans[5];
+ r0 = ((x0_trans - gradient_x0) * gradient_dx +
+ (y0_trans - gradient_y0) * gradient_dy) /
+ gradient_norm_squared;
+ pts[pts_count].x = x0;
+ pts[pts_count].y = y0;
+ pts[pts_count].r = r0;
+ if (r0 < min_r) {
+ min_r = r0;
+ min_pt = pts_count;
+ }
+ pts_count++;
+
+ /* end point (x1, y1) */
+ if (segment_type == svgtiny_PATH_LINE) {
+ x1 = p[j + 1];
+ y1 = p[j + 2];
+ j += 3;
+ } else if (segment_type == svgtiny_PATH_CLOSE) {
+ x1 = p[1];
+ y1 = p[2];
+ j++;
+ } else /* svgtiny_PATH_BEZIER */ {
+ c0x = p[j + 1];
+ c0y = p[j + 2];
+ c1x = p[j + 3];
+ c1y = p[j + 4];
+ x1 = p[j + 5];
+ y1 = p[j + 6];
+ j += 7;
+ }
+ x1_trans = trans[0]*x1 + trans[2]*y1 + trans[4];
+ y1_trans = trans[1]*x1 + trans[3]*y1 + trans[5];
+ r1 = ((x1_trans - gradient_x0) * gradient_dx +
+ (y1_trans - gradient_y0) * gradient_dy) /
+ gradient_norm_squared;
+
+ /* determine steps from change in r */
+ steps = ceilf(fabsf(r1 - r0) / 0.05);
+ if (steps == 0)
+ steps = 1;
+ fprintf(stderr, "r0 %g, r1 %g, steps %i\n",
+ r0, r1, steps);
+
+ /* loop through intermediate points */
+ for (unsigned int z = 1; z != steps; z++) {
+ float t, x, y, x_trans, y_trans, r;
+ t = (float) z / (float) steps;
+ if (segment_type == svgtiny_PATH_BEZIER) {