/** Add a trio of handles to a bezier. * @param bezier The bezierconn having handles added. * @param pos Where in the list of segments to add the handle * @param point The bezier point to add. This should already be initialized * with sensible positions. * @param corner_type What kind of corner this bezpoint should be. * @param handle1 The handle that will be put on the bezier line. * @param handle2 The handle that will be put before handle1 * @param handle3 The handle that will be put after handle1 */ static void add_handles (BezierConn *bezier, int pos, BezPoint *point, BezCornerType corner_type, Handle *handle1, Handle *handle2, Handle *handle3) { int i, next; DiaObject *obj = &bezier->object; g_assert(pos > 0); bezier->bezier.num_points++; next = pos + 1; bezier->bezier.points = g_realloc(bezier->bezier.points, bezier->bezier.num_points*sizeof(BezPoint)); bezier->bezier.corner_types = g_realloc(bezier->bezier.corner_types, bezier->bezier.num_points * sizeof(BezCornerType)); for (i = bezier->bezier.num_points - 1; i > pos; i--) { bezier->bezier.points[i] = bezier->bezier.points[i-1]; bezier->bezier.corner_types[i] = bezier->bezier.corner_types[i-1]; } bezier->bezier.points[pos] = *point; bezier->bezier.points[pos].p1 = bezier->bezier.points[next].p1; bezier->bezier.points[next].p1 = point->p1; bezier->bezier.corner_types[pos] = corner_type; object_add_handle_at(obj, handle1, 3*pos-2); object_add_handle_at(obj, handle2, 3*pos-1); object_add_handle_at(obj, handle3, 3*pos); if (pos==bezier->bezier.num_points-1) { obj->handles[obj->num_handles-4]->type = HANDLE_MINOR_CONTROL; obj->handles[obj->num_handles-4]->id = HANDLE_BEZMAJOR; } }
static void add_handle(PolyConn *poly, int pos, Point *point, Handle *handle) { int i; DiaObject *obj; poly->numpoints++; poly->points = g_realloc(poly->points, poly->numpoints*sizeof(Point)); for (i=poly->numpoints-1; i > pos; i--) { poly->points[i] = poly->points[i-1]; } poly->points[pos] = *point; object_add_handle_at((DiaObject*)poly, handle, pos); obj = (DiaObject *)poly; if (pos==0) { obj->handles[1]->type = HANDLE_MINOR_CONTROL; obj->handles[1]->id = HANDLE_CORNER; } if (pos==obj->num_handles-1) { obj->handles[obj->num_handles-2]->type = HANDLE_MINOR_CONTROL; obj->handles[obj->num_handles-2]->id = HANDLE_CORNER; } }
static void add_handles(BezierShape *bezier, int pos, BezPoint *point, BezCornerType corner_type, Handle *handle1, Handle *handle2, Handle *handle3, ConnectionPoint *cp1, ConnectionPoint *cp2) { int i, next; DiaObject *obj; g_assert(pos >= 1); g_assert(pos <= bezier->numpoints); obj = (DiaObject *)bezier; bezier->numpoints++; next = pos + 1; if (pos == bezier->numpoints - 1) next = 1; bezier->points = g_realloc(bezier->points, bezier->numpoints * sizeof(BezPoint)); bezier->corner_types = g_realloc(bezier->corner_types, bezier->numpoints * sizeof(BezCornerType)); for (i = bezier->numpoints - 1; i > pos; i--) { bezier->points[i] = bezier->points[i-1]; bezier->corner_types[i] =bezier->corner_types[i-1]; } bezier->points[pos] = *point; bezier->points[pos].p1 = bezier->points[next].p1; bezier->points[next].p1 = point->p1; if (pos == bezier->numpoints - 1) bezier->points[0].p1 = bezier->points[0].p3 = bezier->points[pos].p3; bezier->corner_types[pos] = corner_type; object_add_handle_at((DiaObject*)bezier, handle1, 3*pos-3); object_add_handle_at((DiaObject*)bezier, handle2, 3*pos-2); object_add_handle_at((DiaObject*)bezier, handle3, 3*pos-1); object_add_connectionpoint_at((DiaObject *)bezier, cp1, 2*pos-2); object_add_connectionpoint_at((DiaObject *)bezier, cp2, 2*pos-1); }
static void add_handle(PolyShape *poly, int pos, Point *point, Handle *handle, ConnectionPoint *cp1, ConnectionPoint *cp2) { int i; DiaObject *obj = &poly->object; poly->numpoints++; poly->points = g_realloc(poly->points, poly->numpoints*sizeof(Point)); for (i=poly->numpoints-1; i > pos; i--) { poly->points[i] = poly->points[i-1]; } poly->points[pos] = *point; object_add_handle_at(obj, handle, pos); object_add_connectionpoint_at(obj, cp1, 2*pos); object_add_connectionpoint_at(obj, cp2, 2*pos+1); }