+
+Vec rect_center(Rect rect)
+{
+ return vec(rect.x + rect.w * 0.5f,
+ rect.y + rect.h * 0.5f);
+}
+
+static float signf(float x)
+{
+ return (float)((0.0f < x) - (x < 0.0f));
+}
+
+Rect rect_snap(Rect pivot, Rect r)
+{
+ const Vec pivot_c = rect_center(pivot);
+ const Vec r_c = rect_center(r);
+
+ const float x = pivot_c.x + signf(r_c.x - pivot_c.x) * (pivot.w + r.w) * 0.5f - r.w * 0.5f;
+ const float y = pivot_c.y + signf(r_c.y - pivot_c.y) * (pivot.h + r.h) * 0.5f - r.h * 0.5f;
+
+ if (fabsf(x - r_c.x) < fabsf(y - r_c.y)) {
+ return rect(x, r.y, r.w, r.h);
+ } else {
+ return rect(r.x, y, r.w, r.h);
+ }
+}