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); }
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 cpl_add_connectionpoint_at(ConnPointLine *cpl, int pos,ConnectionPoint *cp) { if (pos == 0) { /* special case handling so that the order of CPL groups in the parent's CP list is preserved. */ int fpos,i; ConnectionPoint *fcp; g_assert(cpl->connections); fpos = -1; fcp = (ConnectionPoint *)(cpl->connections->data); g_assert(fcp); for (i=0; i<cpl->parent->num_connections; i++) { if (cpl->parent->connections[i] == fcp) { fpos = i; break; } } g_assert(fpos >= 0); object_add_connectionpoint_at(cpl->parent,cp,fpos); }else { /* XXX : make this a little better ; try to insert at the correct position right away to eliminate cpl_reorder_connection */ object_add_connectionpoint(cpl->parent,cp); } if (pos < 0) { cpl->connections = g_slist_append(cpl->connections,(gpointer)cp); } else { cpl->connections = g_slist_insert(cpl->connections,(gpointer)cp,pos); } cpl->num_connections++; /* we should call cpl_reorder_connections(cpl); before we leave the object !! However, this is delayed, for the case several CP's are added at once (initialisation). */ }