static void sp_line_set_shape (SPShape *shape) { SPLine *line = SP_LINE (shape); SPCurve *c = new SPCurve (); c->moveto(line->x1.computed, line->y1.computed); c->lineto(line->x2.computed, line->y2.computed); sp_shape_set_curve_insync (shape, c, TRUE); // *_insync does not call update, avoiding infinite recursion when set_shape is called by update c->unref(); }
static void sp_spiral_set_shape (SPShape *shape) { SPSpiral *spiral; NRPointF darray[SAMPLE_SIZE + 1]; NRPointF hat1, hat2; int i; double tstep, t; double dstep, d; SPCurve *c; spiral = SP_SPIRAL(shape); sp_object_request_modified (SP_OBJECT (spiral), SP_OBJECT_MODIFIED_FLAG); #if 0 if (spiral->rad < SP_EPSILON) return; #endif c = sp_curve_new (); #ifdef SPIRAL_VERBOSE g_print ("ex=%g, revo=%g, rad=%g, arg=%g, t0=%g\n", spiral->cx, spiral->cy, spiral->exp, spiral->revo, spiral->rad, spiral->arg, spiral->t0); #endif tstep = SAMPLE_STEP/spiral->revo; dstep = tstep/(SAMPLE_SIZE - 1.0); if (spiral->t0 - dstep >= 0.0) { for (d = spiral->t0 - dstep, i = 0; i <= 2; d += dstep, i++) sp_spiral_get_xy (spiral, d, &darray[i]); sp_darray_center_tangent (darray, 1, &hat1); hat1.x = - hat1.x; hat1.y = - hat1.y; } else { for (d = spiral->t0, i = 1; i <= 2; d += dstep, i++) sp_spiral_get_xy (spiral, d, &darray[i]); sp_darray_left_tangent (darray, 1, 2, &hat1); } sp_curve_moveto (c, darray[1].x, darray[1].y); for (t = spiral->t0; t < (1.0-tstep); t += tstep) { sp_spiral_fit_and_draw (spiral, c, dstep, darray, &hat1, &hat2, t); hat1.x = - hat2.x; hat1.y = - hat2.y; } if ((1.0 - t) > SP_EPSILON) sp_spiral_fit_and_draw (spiral, c, (1.0 - t)/(SAMPLE_SIZE - 1.0), darray, &hat1, &hat2, t); sp_shape_set_curve_insync ((SPShape *) spiral, c, TRUE); sp_curve_unref (c); }
static void sp_genericellipse_set_shape (SPShape *shape) { SPGenericEllipse *ellipse; SPCurve *c; ArtBpath bpath[16], * abp; double cx, cy, rx, ry, s, e; double x0, y0, x1, y1, x2, y2, x3, y3; double len; double affine[6]; gint slice = FALSE; gint i; ellipse = (SPGenericEllipse *) shape; if ((ellipse->rx.computed < 1e-18) || (ellipse->ry.computed < 1e-18)) return; if (fabs (ellipse->end - ellipse->start) < 1e-9) return; sp_genericellipse_normalize (ellipse); cx = 0.0; cy = 0.0; rx = ellipse->rx.computed; ry = ellipse->ry.computed; len = fmod (ellipse->end - ellipse->start, SP_2PI); if (len < 0.0) len += SP_2PI; if (fabs (len) < 1e-9) { slice = FALSE; } else { slice = TRUE; } nr_matrix_d_set_scale (NR_MATRIX_D_FROM_DOUBLE (affine), rx, ry); affine[4] = ellipse->cx.computed; affine[5] = ellipse->cy.computed; i = 0; if (ellipse->closed) { bpath[i].code = ART_MOVETO; } else { bpath[i].code = ART_MOVETO_OPEN; } bpath[i].x3 = cos (ellipse->start); bpath[i].y3 = sin (ellipse->start); i++; for (s = ellipse->start; s < ellipse->end; s += M_PI_2) { e = s + M_PI_2; if (e > ellipse->end) e = ellipse->end; len = C1 * (e - s) / M_PI_2; x0 = cos (s); y0 = sin (s); x1 = x0 + len * cos (s + M_PI_2); y1 = y0 + len * sin (s + M_PI_2); x3 = cos (e); y3 = sin (e); x2 = x3 + len * cos (e - M_PI_2); y2 = y3 + len * sin (e - M_PI_2); #ifdef ELLIPSE_VERBOSE g_print ("step %d s %f e %f coords %f %f %f %f %f %f\n", i, s, e, x1, y1, x2, y2, x3, y3); #endif bpath[i].code = ART_CURVETO; bpath[i].x1 = x1; bpath[i].y1 = y1; bpath[i].x2 = x2; bpath[i].y2 = y2; bpath[i].x3 = x3; bpath[i].y3 = y3; i++; } if (slice && ellipse->closed) { bpath[i].code = ART_LINETO; bpath[i].x3 = 0.0; bpath[i].y3 = 0.0; i++; bpath[i].code = ART_LINETO; bpath[i].x3 = bpath[0].x3; bpath[i].y3 = bpath[0].y3; i++; } else if (ellipse->closed) { bpath[i-1].x3 = bpath[0].x3; bpath[i-1].y3 = bpath[0].y3; } bpath[i].code = ART_END; abp = art_bpath_affine_transform (bpath, affine); c = sp_curve_new_from_bpath (abp); sp_shape_set_curve_insync ((SPShape *) ellipse, c, TRUE); sp_curve_unref (c); }