aboutsummaryrefslogtreecommitdiffstats
path: root/common.h
diff options
context:
space:
mode:
Diffstat (limited to 'common.h')
-rw-r--r--common.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/common.h b/common.h
new file mode 100644
index 0000000..ae9a1d7
--- /dev/null
+++ b/common.h
@@ -0,0 +1,147 @@
+/* See LICENSE file for copyright and license details. */
+#include "librifunktionsteckensnittsglyfrasteriseringsprogrambiblioteket.h"
+#include <errno.h>
+#include <math.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants"
+# pragma GCC diagnostic ignored "-Wempty-body"
+# pragma GCC diagnostic ignored "-Wfloat-equal"
+# define PURE_FUNCTION __attribute__((__pure__))
+# define CONST_FUNCTION __attribute__((__const__))
+#elif defined(__clang__)
+# pragma clang diagnostic ignored "-Wcomma"
+# pragma clang diagnostic ignored "-Wfloat-equal"
+# pragma clang diagnostic ignored "-Wfloat-conversion"
+# define PURE_FUNCTION
+# define CONST_FUNCTION
+#else
+# define PURE_FUNCTION
+# define CONST_FUNCTION
+#endif
+
+
+#define SIGNUM(X) (((X) > 0) - ((X) < 0))
+
+#define draw_vertical_line_opposite_only(...)
+
+
+typedef struct rtgrpblib_cell {
+ /**
+ * The sum all contribution lines make to
+ * the cell's ink level
+ *
+ * For each line, this is calculated by
+ * the signed area of the right triangle,
+ * whose catheti are parallel to the edges
+ * and whose hypotenuse is the line's segment
+ * in the cell, plus the area of the rectangle
+ * whose left edge is the opposite cathetus
+ * of the right triangle, and whose right edge
+ * intersects with the right cell edge
+ */
+ double cell_coverage; /* ink here */
+
+ /**
+ * The sum all contribution lines make to
+ * the shadow on the cell's right edge:
+ * the ink level on the next cell
+ *
+ * For each line, this is calculated by the
+ * signed size of the opposite (right-side)
+ * cathetus of the right triangle, whose
+ * catheti are parallel to the edges and
+ * whose hypotenuse is the line's segment
+ * in the cell
+ */
+ double opposite_coverage; /* ink there */
+} CELL;
+
+typedef struct rtgrpblib_raster {
+ size_t height;
+ size_t width;
+ double draftness; /* TODO support 0 */
+ CELL cells[];
+} RASTER;
+
+
+
+#define TOLERANCE 0.000001
+
+CONST_FUNCTION
+static inline int
+iszeroish(double x)
+{
+ return x <= TOLERANCE && x >= -TOLERANCE;
+}
+
+
+
+/* equations.c */
+#define solve_cubic rtgrpblib_solve_cubic__
+#define solve_quadratic rtgrpblib_solve_quadratic__
+#define solve_linear rtgrpblib_solve_linear__
+size_t solve_cubic(double *ts, double a, double b, double c, double d);
+size_t solve_quadratic(double *ts, double a, double b, double c);
+size_t solve_linear(double *ts, double a, double b);
+
+
+/* lines.c */
+#ifndef draw_vertical_line_opposite_only
+# define draw_vertical_line_opposite_only rtgrpblib_draw_vertical_line_opposite_only__
+void draw_vertical_line_opposite_only(RASTER *restrict raster, size_t x, double y1, double y2, int ydir);
+#else
+# define ROWWISE_RESET_INKLEVEL
+#endif
+#define draw_vertical_line rtgrpblib_draw_vertical_line__
+#define draw_diagonal_line rtgrpblib_draw_diagonal_line__
+#define draw_bounded_line rtgrpblib_draw_bounded_line__
+void draw_vertical_line(RASTER *restrict raster, double x1, double y1, double y2, int ydir);
+void draw_diagonal_line(RASTER *restrict raster, double x1, double y1, double x2, double y2,
+ double dx, double dy, int xdir, int ydir);
+void draw_bounded_line(RASTER *restrict raster, double x1, double y1, double x2, double y2);
+
+
+/* sorting.c */
+#define doublepcmp rtgrpblib_doublepcmp__
+PURE_FUNCTION int doublepcmp(const void *avp, const void *bvp);
+
+
+
+#ifdef TEST
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants"
+# pragma GCC diagnostic ignored "-Wfloat-equal"
+# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
+#elif defined(__clang__)
+# pragma clang diagnostic ignored "-Wfloat-equal"
+#endif
+
+static inline int
+eq(double a, double b)
+{
+ return iszeroish(a - b);
+}
+
+static inline int
+tolerant_eq(double a, double b)
+{
+ return iszeroish((a - b) / 100.0);
+}
+
+# define ASSERT(ASSERTION)\
+ do {\
+ if (!(ASSERTION)) {\
+ fprintf(stderr, "Failed assertion at line %i: %s\n", __LINE__, #ASSERTION);\
+ exit(1);\
+ }\
+ } while (0)
+
+#endif