static ObjectChange* bezierline_move_handle(Bezierline *bezierline, Handle *handle, Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys modifiers) { assert(bezierline!=NULL); assert(handle!=NULL); assert(to!=NULL); if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) { /* During creation, change the control points */ BezierConn *bez = &bezierline->bez; Point dist = bez->bezier.points[0].p1; point_sub(&dist, to); dist.y = 0; point_scale(&dist, 0.332); bezierconn_move_handle(bez, handle, to, cp, reason, modifiers); bez->bezier.points[1].p1 = bez->bezier.points[0].p1; point_sub(&bez->bezier.points[1].p1, &dist); bez->bezier.points[1].p2 = *to; point_add(&bez->bezier.points[1].p2, &dist); } else { bezierconn_move_handle(&bezierline->bez, handle, to, cp, reason, modifiers); } bezierline_update_data(bezierline); return NULL; }
static void bezierline_move_handle(Bezierline *bezierline, Handle *handle, Point *to, HandleMoveReason reason, ModifierKeys modifiers) { assert(bezierline!=NULL); assert(handle!=NULL); assert(to!=NULL); bezierconn_move_handle(&bezierline->bez, handle, to, reason); if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) { BezierConn *bez = &bezierline->bez; Point delta = bez->points[1].p3; point_sub(&delta, &bez->points[0].p1); point_scale(&delta, 1.0/3); bez->points[1].p1 = bez->points[0].p1; point_add(&bez->points[1].p1, &delta); bez->points[1].p2 = bez->points[1].p1; point_add(&bez->points[1].p2, &delta); } bezierline_update_data(bezierline); }