aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/common/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/common/matrix.c')
-rw-r--r--src/libui_sdl/libui/common/matrix.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/common/matrix.c b/src/libui_sdl/libui/common/matrix.c
new file mode 100644
index 0000000..676885d
--- /dev/null
+++ b/src/libui_sdl/libui/common/matrix.c
@@ -0,0 +1,50 @@
+// 11 october 2015
+#include <math.h>
+#include "../ui.h"
+#include "uipriv.h"
+
+void uiDrawMatrixSetIdentity(uiDrawMatrix *m)
+{
+ m->M11 = 1;
+ m->M12 = 0;
+ m->M21 = 0;
+ m->M22 = 1;
+ m->M31 = 0;
+ m->M32 = 0;
+}
+
+// The rest of this file provides basic utilities in case the platform doesn't provide any of its own for these tasks.
+// Keep these as minimal as possible. They should generally not call other fallbacks.
+
+// see https://msdn.microsoft.com/en-us/library/windows/desktop/ff684171%28v=vs.85%29.aspx#skew_transform
+// TODO see if there's a way we can avoid the multiplication
+void fallbackSkew(uiDrawMatrix *m, double x, double y, double xamount, double yamount)
+{
+ uiDrawMatrix n;
+
+ uiDrawMatrixSetIdentity(&n);
+ // TODO explain this
+ n.M12 = tan(yamount);
+ n.M21 = tan(xamount);
+ n.M31 = -y * tan(xamount);
+ n.M32 = -x * tan(yamount);
+ uiDrawMatrixMultiply(m, &n);
+}
+
+void scaleCenter(double xCenter, double yCenter, double *x, double *y)
+{
+ *x = xCenter - (*x * xCenter);
+ *y = yCenter - (*y * yCenter);
+}
+
+// the basic algorithm is from cairo
+// but it's the same algorithm as the transform point, just without M31 and M32 taken into account, so let's just do that instead
+void fallbackTransformSize(uiDrawMatrix *m, double *x, double *y)
+{
+ uiDrawMatrix m2;
+
+ m2 = *m;
+ m2.M31 = 0;
+ m2.M32 = 0;
+ uiDrawMatrixTransformPoint(&m2, x, y);
+}