+static
+void snap_inter_position(LabelLayer *label_layer, float snap_threshold)
+{
+ trace_assert(label_layer);
+ trace_assert(label_layer->selection >= 0);
+ trace_assert(label_layer->state == LABEL_LAYER_MOVE);
+
+ const size_t n = label_layer->positions.count;
+ Vec2f *positions = (Vec2f*)label_layer->positions.data;
+
+ Rect a = boundary_of_element(
+ label_layer,
+ (size_t) label_layer->selection,
+ label_layer->inter_position);
+
+ for (size_t i = 0; i < n; ++i) {
+ if (i == (size_t) label_layer->selection) continue;
+
+ const Rect b = boundary_of_element(label_layer, i, positions[i]);
+
+ if (segment_overlap(vec(a.x, a.x + a.w), vec(b.x, b.x + b.w))) {
+ snap_seg2seg(&label_layer->inter_position.y,
+ b.y, a.h, b.h, snap_threshold);
+ }
+
+ if (segment_overlap(vec(a.y, a.y + a.h), vec(b.y, b.y + b.h))) {
+ snap_seg2seg(&label_layer->inter_position.x,
+ b.x, a.w, b.w, snap_threshold);
+ }
+ }
+}
+