summaryrefslogtreecommitdiff
path: root/src/cairo-fixed-private.h
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2022-05-15 14:05:05 +0930
committerAdrian Johnson <ajohnson@redneon.com>2022-05-28 16:03:50 +0930
commit47a21c6e30eef91db503a5a183d5c8cf558aaa56 (patch)
tree83a6c0ab4beb5aa7d08d42082ef95f6a9c1d2517 /src/cairo-fixed-private.h
parent5dafd7411660f153219abceab64d5cc3be1c59a6 (diff)
downloadcairo-47a21c6e30eef91db503a5a183d5c8cf558aaa56.tar.gz
Clamp path coordinates
Fixes https://gitlab.freedesktop.org/poppler/poppler/-/issues/1250
Diffstat (limited to 'src/cairo-fixed-private.h')
-rw-r--r--src/cairo-fixed-private.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/cairo-fixed-private.h b/src/cairo-fixed-private.h
index 5f9ce684c..2259f113b 100644
--- a/src/cairo-fixed-private.h
+++ b/src/cairo-fixed-private.h
@@ -53,6 +53,11 @@
#define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS))
#define CAIRO_FIXED_EPSILON ((cairo_fixed_t)(1))
+#define CAIRO_FIXED_MAX INT32_MAX /* Maximum fixed point value */
+#define CAIRO_FIXED_MIN INT32_MIN /* Minimum fixed point value */
+#define CAIRO_FIXED_MAX_DOUBLE (((double) CAIRO_FIXED_MAX) / CAIRO_FIXED_ONE_DOUBLE)
+#define CAIRO_FIXED_MIN_DOUBLE (((double) CAIRO_FIXED_MIN) / CAIRO_FIXED_ONE_DOUBLE)
+
#define CAIRO_FIXED_ERROR_DOUBLE (1. / (2 * CAIRO_FIXED_ONE_DOUBLE))
#define CAIRO_FIXED_FRAC_MASK ((cairo_fixed_t)(((cairo_fixed_unsigned_t)(-1)) >> (CAIRO_FIXED_BITS - CAIRO_FIXED_FRAC_BITS)))
@@ -129,6 +134,17 @@ _cairo_fixed_from_double (double d)
#endif
static inline cairo_fixed_t
+_cairo_fixed_from_double_clamped (double d, double tolerance)
+{
+ if (d > CAIRO_FIXED_MAX_DOUBLE - tolerance)
+ d = CAIRO_FIXED_MAX_DOUBLE - tolerance;
+ else if (d < CAIRO_FIXED_MIN_DOUBLE + tolerance)
+ d = CAIRO_FIXED_MIN_DOUBLE + tolerance;
+
+ return _cairo_fixed_from_double (d);
+}
+
+static inline cairo_fixed_t
_cairo_fixed_from_26_6 (uint32_t i)
{
#if CAIRO_FIXED_FRAC_BITS > 6