summaryrefslogtreecommitdiff
path: root/include/libcss/fpmath.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/libcss/fpmath.h')
-rw-r--r--include/libcss/fpmath.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/include/libcss/fpmath.h b/include/libcss/fpmath.h
new file mode 100644
index 0000000..0e314cb
--- /dev/null
+++ b/include/libcss/fpmath.h
@@ -0,0 +1,61 @@
+/*
+ * This file is part of LibCSS.
+ * Licensed under the MIT License,
+ * http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
+ */
+
+#ifndef libcss_fpmath_h_
+#define libcss_fpmath_h_
+
+#include <stdint.h>
+
+/* 22:10 fixed point math */
+typedef int32_t css_fixed;
+
+/* Add two fixed point values */
+#define FADD(a, b) ((a) + (b))
+/* Subtract two fixed point values */
+#define FSUB(a, b) ((a) - (b))
+/* Multiply two fixed point values */
+#define FMUL(a, b) (((a) * (b)) >> 10)
+/* Divide two fixed point values */
+#define FDIV(a, b) (((a) << 10) / (b))
+
+/* Add an integer to a fixed point value */
+#define FADDI(a, b) ((a) + ((b) << 10))
+/* Subtract an integer from a fixed point value */
+#define FSUBI(a, b) ((a) - ((b) << 10))
+/* Multiply a fixed point value by an integer */
+#define FMULI(a, b) ((a) * (b))
+/* Divide a fixed point value by an integer */
+#define FDIVI(a, b) ((a) / (b))
+
+/* Convert a floating point value to fixed point */
+#define FLTTOFIX(a) ((fixed) ((a) * (float) (1 << 10)))
+/* Convert a fixed point value to floating point */
+#define FIXTOFLT(a) ((float) (a) / (float) (1 << 10))
+
+/* Convert an integer to a fixed point value */
+#define INTTOFIX(a) ((a) << 10)
+/* Convert a fixed point value to an integer */
+#define FIXTOINT(a) ((a) >> 10)
+
+/* Useful values */
+#define F_PI_2 0x00000648 /* 1.5708 (PI/2) */
+#define F_PI 0x00000c91 /* 3.1415 (PI) */
+#define F_3PI_2 0x000012d9 /* 4.7124 (3PI/2) */
+#define F_2PI 0x00001922 /* 6.2831 (2 PI) */
+
+#define F_90 0x00016800 /* 90 */
+#define F_180 0x0002d000 /* 180 */
+#define F_270 0x00043800 /* 270 */
+#define F_360 0x0005a000 /* 360 */
+
+#define F_100 0x00019000 /* 100 */
+#define F_200 0x00032000 /* 200 */
+#define F_300 0x0004b000 /* 300 */
+#define F_400 0x00064000 /* 400 */
+
+#endif
+