summaryrefslogtreecommitdiffstats
path: root/packaging/macos/modulesets/patches/cairo-pixman_dithering.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--packaging/macos/modulesets/patches/cairo-pixman_dithering.patch659
1 files changed, 659 insertions, 0 deletions
diff --git a/packaging/macos/modulesets/patches/cairo-pixman_dithering.patch b/packaging/macos/modulesets/patches/cairo-pixman_dithering.patch
new file mode 100644
index 0000000..dc92e26
--- /dev/null
+++ b/packaging/macos/modulesets/patches/cairo-pixman_dithering.patch
@@ -0,0 +1,659 @@
+From e0d713b9bbd6d4a1e27e18c15141fa7f568001c7 Mon Sep 17 00:00:00 2001
+From: Marc Jeanmougin <marc@jeanmougin.fr>
+Date: Wed, 29 May 2019 09:44:09 +0200
+Subject: [PATCH 1/3] Enable access to the pixman dithering path Code to choose
+ between dithering quality is modeled on the filter rendering choice
+
+---
+ src/cairo-gl-gradient.c | 4 +++-
+ src/cairo-image-source.c | 48 +++++++++++++++++++++++++++++++++++++
+ src/cairo-pattern-private.h | 1 +
+ src/cairo-pattern.c | 45 ++++++++++++++++++++++++++++++++++
+ src/cairo.h | 14 +++++++++++
+ 5 files changed, 111 insertions(+), 1 deletion(-)
+
+diff --git a/src/cairo-gl-gradient.c b/src/cairo-gl-gradient.c
+index 293d4e30e..a22cca729 100644
+--- a/src/cairo-gl-gradient.c
++++ b/src/cairo-gl-gradient.c
+@@ -160,7 +160,9 @@ _cairo_gl_gradient_render (const cairo_gl_context_t *ctx,
+
+ pixman_image_set_filter (gradient, PIXMAN_FILTER_BILINEAR, NULL, 0);
+ pixman_image_set_repeat (gradient, PIXMAN_REPEAT_PAD);
+-
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++ pixman_image_set_dither (gradient, PIXMAN_DITHER_BEST);
++#endif
+ image = pixman_image_create_bits (gradient_pixman_format, width, 1,
+ bytes, sizeof(uint32_t)*width);
+ if (unlikely (image == NULL)) {
+diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
+index c56845ab2..274f43df7 100644
+--- a/src/cairo-image-source.c
++++ b/src/cairo-image-source.c
+@@ -383,6 +383,30 @@ _pixman_image_for_gradient (const cairo_gradient_pattern_t *pattern,
+
+ pixman_image_set_repeat (pixman_image, pixman_repeat);
+ }
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++ {
++ pixman_dither_t pixman_dither;
++
++ switch (pattern->base.dither) {
++ default:
++ case CAIRO_DITHER_NONE:
++ case CAIRO_DITHER_DEFAULT:
++ pixman_dither = PIXMAN_DITHER_NONE;
++ break;
++ case CAIRO_DITHER_FAST:
++ pixman_dither = PIXMAN_DITHER_FAST;
++ break;
++ case CAIRO_DITHER_GOOD:
++ pixman_dither = PIXMAN_DITHER_GOOD;
++ break;
++ case CAIRO_DITHER_BEST:
++ pixman_dither = PIXMAN_DITHER_BEST;
++ break;
++ }
++
++ pixman_image_set_dither (pixman_image, pixman_dither);
++ }
++#endif
+
+ return pixman_image;
+ }
+@@ -1047,6 +1071,30 @@ _pixman_image_set_properties (pixman_image_t *pixman_image,
+
+ pixman_image_set_repeat (pixman_image, pixman_repeat);
+ }
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++ {
++ pixman_dither_t pixman_dither;
++
++ switch (pattern->dither) {
++ default:
++ case CAIRO_DITHER_NONE:
++ case CAIRO_DITHER_DEFAULT:
++ pixman_dither = PIXMAN_DITHER_NONE;
++ break;
++ case CAIRO_DITHER_FAST:
++ pixman_dither = PIXMAN_DITHER_FAST;
++ break;
++ case CAIRO_DITHER_GOOD:
++ pixman_dither = PIXMAN_DITHER_GOOD;
++ break;
++ case CAIRO_DITHER_BEST:
++ pixman_dither = PIXMAN_DITHER_BEST;
++ break;
++ }
++
++ pixman_image_set_dither (pixman_image, pixman_dither);
++ }
++#endif
+
+ if (pattern->has_component_alpha)
+ pixman_image_set_component_alpha (pixman_image, TRUE);
+diff --git a/src/cairo-pattern-private.h b/src/cairo-pattern-private.h
+index f6138fb70..96ae4f615 100644
+--- a/src/cairo-pattern-private.h
++++ b/src/cairo-pattern-private.h
+@@ -70,6 +70,7 @@ struct _cairo_pattern {
+ cairo_pattern_type_t type;
+
+ cairo_filter_t filter;
++ cairo_dither_t dither;
+ cairo_extend_t extend;
+ cairo_bool_t has_component_alpha;
+ cairo_bool_t is_userfont_foreground;
+diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
+index 6bd3edfd8..6cf907f36 100644
+--- a/src/cairo-pattern.c
++++ b/src/cairo-pattern.c
+@@ -74,6 +74,7 @@ static const cairo_solid_pattern_t _cairo_pattern_nil = {
+
+ CAIRO_PATTERN_TYPE_SOLID, /* type */
+ CAIRO_FILTER_DEFAULT, /* filter */
++ CAIRO_DITHER_DEFAULT, /* dither */
+ CAIRO_EXTEND_GRADIENT_DEFAULT, /* extend */
+ FALSE, /* has component alpha */
+ FALSE, /* is_userfont_foreground */
+@@ -91,6 +92,7 @@ static const cairo_solid_pattern_t _cairo_pattern_nil_null_pointer = {
+
+ CAIRO_PATTERN_TYPE_SOLID, /* type */
+ CAIRO_FILTER_DEFAULT, /* filter */
++ CAIRO_DITHER_DEFAULT, /* dither */
+ CAIRO_EXTEND_GRADIENT_DEFAULT, /* extend */
+ FALSE, /* has component alpha */
+ FALSE, /* is_userfont_foreground */
+@@ -108,6 +110,7 @@ const cairo_solid_pattern_t _cairo_pattern_black = {
+
+ CAIRO_PATTERN_TYPE_SOLID, /* type */
+ CAIRO_FILTER_NEAREST, /* filter */
++ CAIRO_DITHER_DEFAULT, /* dither */
+ CAIRO_EXTEND_REPEAT, /* extend */
+ FALSE, /* has component alpha */
+ FALSE, /* is_userfont_foreground */
+@@ -126,6 +129,7 @@ const cairo_solid_pattern_t _cairo_pattern_clear = {
+
+ CAIRO_PATTERN_TYPE_SOLID, /* type */
+ CAIRO_FILTER_NEAREST, /* filter */
++ CAIRO_DITHER_DEFAULT, /* dither */
+ CAIRO_EXTEND_REPEAT, /* extend */
+ FALSE, /* has component alpha */
+ FALSE, /* is_userfont_foreground */
+@@ -144,6 +148,7 @@ const cairo_solid_pattern_t _cairo_pattern_white = {
+
+ CAIRO_PATTERN_TYPE_SOLID, /* type */
+ CAIRO_FILTER_NEAREST, /* filter */
++ CAIRO_DITHER_DEFAULT, /* dither */
+ CAIRO_EXTEND_REPEAT, /* extend */
+ FALSE, /* has component alpha */
+ FALSE, /* is_userfont_foreground */
+@@ -235,6 +240,7 @@ _cairo_pattern_init (cairo_pattern_t *pattern, cairo_pattern_type_t type)
+ pattern->extend = CAIRO_EXTEND_GRADIENT_DEFAULT;
+
+ pattern->filter = CAIRO_FILTER_DEFAULT;
++ pattern->dither = CAIRO_DITHER_DEFAULT;
+ pattern->opacity = 1.0;
+
+ pattern->has_component_alpha = FALSE;
+@@ -2074,6 +2080,28 @@ cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter)
+ _cairo_pattern_notify_observers (pattern, CAIRO_PATTERN_NOTIFY_FILTER);
+ }
+
++/**
++ * cairo_pattern_set_dither:
++ * @pattern: a #cairo_pattern_t
++ * @filter: a #cairo_dither_t describing the dithering to use
++ *
++ * See #cairo_dither_t for details on each algorithm.
++ *
++ * Since: TODO
++ **/
++void
++cairo_pattern_set_dither (cairo_pattern_t *pattern, cairo_dither_t dither)
++{
++ if (pattern->status)
++ return;
++
++ pattern->dither = dither;
++ _cairo_pattern_notify_observers (pattern, CAIRO_PATTERN_NOTIFY_FILTER);
++ /* We probably can notify the same observers as when we notify filter
++ * changes (?) TODO CHECK THAT */
++}
++
++
+ /**
+ * cairo_pattern_get_filter:
+ * @pattern: a #cairo_pattern_t
+@@ -2091,6 +2119,23 @@ cairo_pattern_get_filter (cairo_pattern_t *pattern)
+ return pattern->filter;
+ }
+
++/**
++ * cairo_pattern_get_dither:
++ * @pattern: a #cairo_pattern_t
++ *
++ * Gets the current dithering for a pattern. See #cairo_dither_t
++ * for details.
++ *
++ * Return value: the current dithering algorithm of the pattern
++ *
++ * Since: TODO
++ **/
++cairo_dither_t
++cairo_pattern_get_dither (cairo_pattern_t *pattern)
++{
++ return pattern->dither;
++}
++
+ /**
+ * cairo_pattern_set_extend:
+ * @pattern: a #cairo_pattern_t
+diff --git a/src/cairo.h b/src/cairo.h
+index fb1da4146..1c911d09d 100644
+--- a/src/cairo.h
++++ b/src/cairo.h
+@@ -3003,12 +3003,26 @@ typedef enum _cairo_filter {
+ CAIRO_FILTER_GAUSSIAN
+ } cairo_filter_t;
+
++typedef enum _cairo_dither {
++ CAIRO_DITHER_NONE,
++ CAIRO_DITHER_DEFAULT,
++ CAIRO_DITHER_FAST,
++ CAIRO_DITHER_GOOD,
++ CAIRO_DITHER_BEST
++} cairo_dither_t;
++
+ cairo_public void
+ cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter);
+
+ cairo_public cairo_filter_t
+ cairo_pattern_get_filter (cairo_pattern_t *pattern);
+
++cairo_public void
++cairo_pattern_set_dither (cairo_pattern_t *pattern, cairo_dither_t dither);
++
++cairo_public cairo_dither_t
++cairo_pattern_get_dither (cairo_pattern_t *pattern);
++
+ cairo_public cairo_status_t
+ cairo_pattern_get_rgba (cairo_pattern_t *pattern,
+ double *red, double *green,
+--
+2.25.1
+
+
+From 659173b4bb01e2de438d894dca9ed01838eaf028 Mon Sep 17 00:00:00 2001
+From: Marc Jeanmougin <marc@jeanmougin.fr>
+Date: Sat, 27 Mar 2021 23:53:28 +0100
+Subject: [PATCH 2/3] Expose dithering property at the image surface level.
+
+Copies the property on push_group
+---
+ src/cairo-default-context.c | 6 ++-
+ src/cairo-image-source.c | 40 ++----------------
+ src/cairo-image-surface-private.h | 1 +
+ src/cairo-image-surface.c | 67 +++++++++++++++++++++++++++++++
+ src/cairo.h | 22 ++++++----
+ src/cairoint.h | 5 +++
+ 6 files changed, 96 insertions(+), 45 deletions(-)
+
+diff --git a/src/cairo-default-context.c b/src/cairo-default-context.c
+index 567c5d4d5..24af125da 100644
+--- a/src/cairo-default-context.c
++++ b/src/cairo-default-context.c
+@@ -180,7 +180,11 @@ _cairo_default_context_push_group (void *abstract_cr, cairo_content_t content)
+ if (unlikely (status))
+ goto bail;
+
+- /* Set device offsets on the new surface so that logically it appears at
++ /* copies over the dither property */
++ cairo_image_surface_set_dither(group_surface,
++ cairo_image_surface_get_dither(parent_surface));
++
++ /* Set device offsets on the new surface so that logically it appears at
+ * the same location on the parent surface -- when we pop_group this,
+ * the source pattern will get fixed up for the appropriate target surface
+ * device offsets, so we want to set our own surface offsets from /that/,
+diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
+index 274f43df7..93daff3c0 100644
+--- a/src/cairo-image-source.c
++++ b/src/cairo-image-source.c
+@@ -385,24 +385,8 @@ _pixman_image_for_gradient (const cairo_gradient_pattern_t *pattern,
+ }
+ #if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
+ {
+- pixman_dither_t pixman_dither;
+-
+- switch (pattern->base.dither) {
+- default:
+- case CAIRO_DITHER_NONE:
+- case CAIRO_DITHER_DEFAULT:
+- pixman_dither = PIXMAN_DITHER_NONE;
+- break;
+- case CAIRO_DITHER_FAST:
+- pixman_dither = PIXMAN_DITHER_FAST;
+- break;
+- case CAIRO_DITHER_GOOD:
+- pixman_dither = PIXMAN_DITHER_GOOD;
+- break;
+- case CAIRO_DITHER_BEST:
+- pixman_dither = PIXMAN_DITHER_BEST;
+- break;
+- }
++ pixman_dither_t pixman_dither =
++ _pixman_dither_from_cairo_dither(pattern->base.dither);
+
+ pixman_image_set_dither (pixman_image, pixman_dither);
+ }
+@@ -1073,24 +1057,8 @@ _pixman_image_set_properties (pixman_image_t *pixman_image,
+ }
+ #if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
+ {
+- pixman_dither_t pixman_dither;
+-
+- switch (pattern->dither) {
+- default:
+- case CAIRO_DITHER_NONE:
+- case CAIRO_DITHER_DEFAULT:
+- pixman_dither = PIXMAN_DITHER_NONE;
+- break;
+- case CAIRO_DITHER_FAST:
+- pixman_dither = PIXMAN_DITHER_FAST;
+- break;
+- case CAIRO_DITHER_GOOD:
+- pixman_dither = PIXMAN_DITHER_GOOD;
+- break;
+- case CAIRO_DITHER_BEST:
+- pixman_dither = PIXMAN_DITHER_BEST;
+- break;
+- }
++ pixman_dither_t pixman_dither =
++ _pixman_dither_from_cairo_dither (pattern->dither);
+
+ pixman_image_set_dither (pixman_image, pixman_dither);
+ }
+diff --git a/src/cairo-image-surface-private.h b/src/cairo-image-surface-private.h
+index 2b7921133..c06b9737b 100644
+--- a/src/cairo-image-surface-private.h
++++ b/src/cairo-image-surface-private.h
+@@ -78,6 +78,7 @@ struct _cairo_image_surface {
+ unsigned owns_data : 1;
+ unsigned transparency : 2;
+ unsigned color : 2;
++ cairo_dither_t dither : 3;
+ };
+ #define to_image_surface(S) ((cairo_image_surface_t *)(S))
+
+diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
+index 3b11eb981..977bb48e6 100644
+--- a/src/cairo-image-surface.c
++++ b/src/cairo-image-surface.c
+@@ -169,6 +169,7 @@ _cairo_image_surface_init (cairo_image_surface_t *surface,
+ surface->owns_data = FALSE;
+ surface->transparency = CAIRO_IMAGE_UNKNOWN;
+ surface->color = CAIRO_IMAGE_UNKNOWN_COLOR;
++ surface->dither = CAIRO_DITHER_DEFAULT;
+
+ surface->width = pixman_image_get_width (pixman_image);
+ surface->height = pixman_image_get_height (pixman_image);
+@@ -248,6 +249,25 @@ _pixman_format_from_masks (cairo_format_masks_t *masks,
+ return TRUE;
+ }
+
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++/* Convenience function to convert cairo_dither_t into pixman_dither_t */
++pixman_dither_t _pixman_dither_from_cairo_dither(cairo_dither_t dither)
++{
++ switch(dither) {
++ default:
++ case CAIRO_DITHER_NONE:
++ case CAIRO_DITHER_DEFAULT:
++ return PIXMAN_DITHER_NONE;
++ case CAIRO_DITHER_FAST:
++ return PIXMAN_DITHER_FAST;
++ case CAIRO_DITHER_GOOD:
++ return PIXMAN_DITHER_GOOD;
++ case CAIRO_DITHER_BEST:
++ return PIXMAN_DITHER_BEST;
++ }
++}
++#endif
++
+ /* A mask consisting of N bits set to 1. */
+ #define MASK(N) ((1UL << (N))-1)
+
+@@ -631,6 +651,30 @@ cairo_image_surface_get_width (cairo_surface_t *surface)
+ }
+ slim_hidden_def (cairo_image_surface_get_width);
+
++/**
++ * cairo_image_surface_get_dither:
++ * @surface: a #cairo_image_surface_t
++ *
++ * Get the current dithering method
++ *
++ * Return value: the current dithering method.
++ *
++ * Since: TODO
++ **/
++cairo_dither_t
++cairo_image_surface_get_dither (cairo_surface_t *surface)
++{
++ cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;
++
++ if (! _cairo_surface_is_image (surface)) {
++ _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);
++ return CAIRO_DITHER_DEFAULT;
++ }
++
++ return image_surface->dither;
++}
++//slim_hidden_def (cairo_image_surface_get_dither);
++
+ /**
+ * cairo_image_surface_get_height:
+ * @surface: a #cairo_image_surface_t
+@@ -792,6 +836,7 @@ _cairo_image_surface_snapshot (void *abstract_surface)
+
+ clone->transparency = image->transparency;
+ clone->color = image->color;
++ clone->dither = image->dither;
+
+ clone->owns_data = TRUE;
+ return &clone->base;
+@@ -1361,3 +1406,25 @@ error:
+ cairo_surface_destroy (image);
+ return to_image_surface (_cairo_surface_create_in_error (status));
+ }
++
++cairo_public int
++cairo_image_surface_set_dither (cairo_surface_t *surface, cairo_dither_t dither)
++{
++ cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface;
++
++ if (! _cairo_surface_is_image (surface)) {
++ _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH);
++ return 0;
++ }
++
++ image_surface->dither = dither;
++ if (image_surface->pixman_image) {
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++ pixman_image_set_dither(image_surface->pixman_image,
++ _pixman_dither_from_cairo_dither(dither));
++#endif
++ }
++
++}
++//slim_hidden_def (cairo_image_surface_set_dither);
++
+diff --git a/src/cairo.h b/src/cairo.h
+index 1c911d09d..76db87d2e 100644
+--- a/src/cairo.h
++++ b/src/cairo.h
+@@ -427,6 +427,14 @@ typedef enum _cairo_format {
+ CAIRO_FORMAT_RGBA128F = 7
+ } cairo_format_t;
+
++typedef enum _cairo_dither {
++ CAIRO_DITHER_NONE,
++ CAIRO_DITHER_DEFAULT,
++ CAIRO_DITHER_FAST,
++ CAIRO_DITHER_GOOD,
++ CAIRO_DITHER_BEST
++} cairo_dither_t;
++
+
+ /**
+ * cairo_write_func_t:
+@@ -2607,6 +2615,12 @@ cairo_image_surface_create_for_data (unsigned char *data,
+ cairo_public unsigned char *
+ cairo_image_surface_get_data (cairo_surface_t *surface);
+
++cairo_public cairo_dither_t
++cairo_image_surface_get_dither (cairo_surface_t *surface);
++
++cairo_public int
++cairo_image_surface_set_dither (cairo_surface_t *surface, cairo_dither_t dither);
++
+ cairo_public cairo_format_t
+ cairo_image_surface_get_format (cairo_surface_t *surface);
+
+@@ -3003,14 +3017,6 @@ typedef enum _cairo_filter {
+ CAIRO_FILTER_GAUSSIAN
+ } cairo_filter_t;
+
+-typedef enum _cairo_dither {
+- CAIRO_DITHER_NONE,
+- CAIRO_DITHER_DEFAULT,
+- CAIRO_DITHER_FAST,
+- CAIRO_DITHER_GOOD,
+- CAIRO_DITHER_BEST
+-} cairo_dither_t;
+-
+ cairo_public void
+ cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter);
+
+diff --git a/src/cairoint.h b/src/cairoint.h
+index 80b695feb..a8442b5fe 100644
+--- a/src/cairoint.h
++++ b/src/cairoint.h
+@@ -1592,6 +1592,11 @@ cairo_private cairo_bool_t
+ _pixman_format_to_masks (pixman_format_code_t pixman_format,
+ cairo_format_masks_t *masks);
+
++#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
++cairo_private pixman_dither_t
++_pixman_dither_from_cairo_dither(cairo_dither_t dither);
++#endif
++
+ cairo_private void
+ _cairo_image_scaled_glyph_fini (cairo_scaled_font_t *scaled_font,
+ cairo_scaled_glyph_t *scaled_glyph);
+--
+2.25.1
+
+
+From edf60824e871d2393136303761135bb49986fa33 Mon Sep 17 00:00:00 2001
+From: Marc Jeanmougin <marc@jeanmougin.fr>
+Date: Mon, 29 Mar 2021 12:18:56 +0200
+Subject: [PATCH 3/3] make lint tests pass
+
+---
+ src/cairo-image-surface.c | 20 +++++++++++++++-----
+ src/cairo-pattern.c | 4 ++--
+ src/cairoint.h | 4 +++-
+ 3 files changed, 20 insertions(+), 8 deletions(-)
+
+diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
+index 977bb48e6..d2f544a68 100644
+--- a/src/cairo-image-surface.c
++++ b/src/cairo-image-surface.c
+@@ -250,8 +250,9 @@ _pixman_format_from_masks (cairo_format_masks_t *masks,
+ }
+
+ #if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
+-/* Convenience function to convert cairo_dither_t into pixman_dither_t */
+-pixman_dither_t _pixman_dither_from_cairo_dither(cairo_dither_t dither)
++/* Convenience function to convert #cairo_dither_t into #pixman_dither_t */
++pixman_dither_t
++_pixman_dither_from_cairo_dither (cairo_dither_t dither)
+ {
+ switch(dither) {
+ default:
+@@ -659,7 +660,7 @@ slim_hidden_def (cairo_image_surface_get_width);
+ *
+ * Return value: the current dithering method.
+ *
+- * Since: TODO
++ * Since: 1.18
+ **/
+ cairo_dither_t
+ cairo_image_surface_get_dither (cairo_surface_t *surface)
+@@ -673,7 +674,7 @@ cairo_image_surface_get_dither (cairo_surface_t *surface)
+
+ return image_surface->dither;
+ }
+-//slim_hidden_def (cairo_image_surface_get_dither);
++slim_hidden_def (cairo_image_surface_get_dither);
+
+ /**
+ * cairo_image_surface_get_height:
+@@ -1407,6 +1408,15 @@ error:
+ return to_image_surface (_cairo_surface_create_in_error (status));
+ }
+
++/**
++ * cairo_image_surface_set_dither:
++ * @surface: a #cairo_image_surface_t
++ * @dither: a #cairo_dither_t
++ *
++ * Sets the current dithering method
++ *
++ * Since: 1.18
++ **/
+ cairo_public int
+ cairo_image_surface_set_dither (cairo_surface_t *surface, cairo_dither_t dither)
+ {
+@@ -1426,5 +1436,5 @@ cairo_image_surface_set_dither (cairo_surface_t *surface, cairo_dither_t dither)
+ }
+
+ }
+-//slim_hidden_def (cairo_image_surface_set_dither);
++slim_hidden_def (cairo_image_surface_set_dither);
+
+diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
+index 6cf907f36..7d05b06a1 100644
+--- a/src/cairo-pattern.c
++++ b/src/cairo-pattern.c
+@@ -2087,7 +2087,7 @@ cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter)
+ *
+ * See #cairo_dither_t for details on each algorithm.
+ *
+- * Since: TODO
++ * Since: 1.18
+ **/
+ void
+ cairo_pattern_set_dither (cairo_pattern_t *pattern, cairo_dither_t dither)
+@@ -2128,7 +2128,7 @@ cairo_pattern_get_filter (cairo_pattern_t *pattern)
+ *
+ * Return value: the current dithering algorithm of the pattern
+ *
+- * Since: TODO
++ * Since: 1.18
+ **/
+ cairo_dither_t
+ cairo_pattern_get_dither (cairo_pattern_t *pattern)
+diff --git a/src/cairoint.h b/src/cairoint.h
+index a8442b5fe..274d43556 100644
+--- a/src/cairoint.h
++++ b/src/cairoint.h
+@@ -1594,7 +1594,7 @@ _pixman_format_to_masks (pixman_format_code_t pixman_format,
+
+ #if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0,39,0)
+ cairo_private pixman_dither_t
+-_pixman_dither_from_cairo_dither(cairo_dither_t dither);
++_pixman_dither_from_cairo_dither (cairo_dither_t dither);
+ #endif
+
+ cairo_private void
+@@ -1982,6 +1982,8 @@ slim_hidden_proto (cairo_image_surface_get_format);
+ slim_hidden_proto (cairo_image_surface_get_height);
+ slim_hidden_proto (cairo_image_surface_get_stride);
+ slim_hidden_proto (cairo_image_surface_get_width);
++slim_hidden_proto (cairo_image_surface_get_dither);
++slim_hidden_proto (cairo_image_surface_set_dither);
+ slim_hidden_proto (cairo_line_to);
+ slim_hidden_proto (cairo_mask);
+ slim_hidden_proto (cairo_matrix_init);
+--
+2.25.1
+
+
+From b2e0f1d6f69ad3013dfb8d677f7b3ee9fac0fceb Mon Sep 17 00:00:00 2001
+From: Marc Jeanmougin <marc@jeanmougin.fr>
+Date: Mon, 24 Jan 2022 21:28:44 +0100
+Subject: [PATCH] add define to detect patched cairo
+
+---
+ src/cairo.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/cairo.h b/src/cairo.h
+index 76db87d2e..934bf65d0 100644
+--- a/src/cairo.h
++++ b/src/cairo.h
+@@ -2615,6 +2615,7 @@ cairo_image_surface_create_for_data (unsigned char *data,
+ cairo_public unsigned char *
+ cairo_image_surface_get_data (cairo_surface_t *surface);
+
++#define CAIRO_HAS_DITHER
+ cairo_public cairo_dither_t
+ cairo_image_surface_get_dither (cairo_surface_t *surface);
+
+--
+2.25.1
+