diff libui/ui/align.c @ 150:9733d379be89

ui: add a standalone align() function
author David Demelier <markand@malikania.fr>
date Thu, 15 Oct 2020 13:13:38 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libui/ui/align.c	Thu Oct 15 13:13:38 2020 +0200
@@ -0,0 +1,75 @@
+/*
+ * align.h -- user interface alignment
+ *
+ * Copyright (c) 2020 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "align.h"
+
+#define SET(p, v) if (p) *p = v
+#define CENTER(p, c, rs, es) if (p) (*p) = c + (rs / 2) - (es / 2)
+
+void
+align(enum align align,
+      int *x,
+      int *y,
+      unsigned int w,
+      unsigned int h,
+      int px,
+      int py,
+      unsigned int pw,
+      unsigned int ph)
+{
+	switch (align) {
+	case ALIGN_CENTER:
+		CENTER(x, px, pw, w);
+		CENTER(y, py, ph, h);
+		break;
+	case ALIGN_TOP_LEFT:
+		SET(x, px);
+		SET(y, py);
+		break;
+	case ALIGN_TOP:
+		CENTER(x, px, pw, w);
+		SET(y, py);
+		break;
+	case ALIGN_TOP_RIGHT:
+		SET(x, px + pw - w);
+		SET(y, py);
+		break;
+	case ALIGN_RIGHT:
+		SET(x, px + pw - w);
+		CENTER(y, py, ph, h);
+		break;
+	case ALIGN_BOTTOM_RIGHT:
+		SET(x, px + pw - w);
+		SET(y, py + ph - h);
+		break;
+	case ALIGN_BOTTOM:
+		CENTER(x, px, pw, w);
+		SET(y, py + ph - h);
+		break;
+	case ALIGN_BOTTOM_LEFT:
+		SET(x, px);
+		SET(y, py + ph - h);
+		break;
+	case ALIGN_LEFT:
+		CENTER(y, py, ph, h);
+		SET(x, px);
+		break;
+	default:
+		break;
+	}
+}