diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2022-05-15 14:05:05 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2022-05-28 16:03:50 +0930 |
commit | 47a21c6e30eef91db503a5a183d5c8cf558aaa56 (patch) | |
tree | 83a6c0ab4beb5aa7d08d42082ef95f6a9c1d2517 /src/cairo-fixed-private.h | |
parent | 5dafd7411660f153219abceab64d5cc3be1c59a6 (diff) | |
download | cairo-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.h | 16 |
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 |