<pre style='margin:0'>
Ryan Schmidt (ryandesign) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/206d9afeee6d4dff3fa97bc66aaec7912cacb537">https://github.com/macports/macports-ports/commit/206d9afeee6d4dff3fa97bc66aaec7912cacb537</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 206d9afeee6 cairo(-devel): fix crash on Big Sur
</span>206d9afeee6 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 206d9afeee6d4dff3fa97bc66aaec7912cacb537
</span>Author: Michael Lass <michael.lass@uni-paderborn.de>
AuthorDate: Sat Jan 23 10:43:34 2021 +0100

<span style='display:block; white-space:pre;color:#404040;'>    cairo(-devel): fix crash on Big Sur
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Apply changes from https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/52
</span><span style='display:block; white-space:pre;color:#404040;'>    to fix crashes of several applications (gimp, inkscape, meld, etc.) on
</span><span style='display:block; white-space:pre;color:#404040;'>    macOS Big Sur.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See: https://gitlab.freedesktop.org/cairo/cairo/-/issues/420
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/61586
</span>---
 graphics/cairo-devel/Portfile                      |   7 +-
 .../files/patch-cairo-quartz-surfaces.diff         | 276 +++++++++++++++++++++
 graphics/cairo/Portfile                            |   6 +
 .../cairo/files/patch-cairo-quartz-surfaces.diff   | 276 +++++++++++++++++++++
 4 files changed, 564 insertions(+), 1 deletion(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/graphics/cairo-devel/Portfile b/graphics/cairo-devel/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 06fa693ceb2..8167f720ddc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/graphics/cairo-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/graphics/cairo-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,7 +11,7 @@ name                        cairo-devel
</span> conflicts                   cairo
 set my_name                 cairo
 version                     1.17.4
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision                    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    1
</span> checksums                   rmd160  7a440359be60f8cb971e9d538973ac29613e143e \
                             sha256  74b24c1ed436bbe87499179a3b27c43f4143b8676d8ad237a6fa787401959705 \
                             size    41834076
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -49,6 +49,11 @@ minimum_xcodeversions       {8 2.4.1}
</span> # Prevent cairo from using librsvg, libspectre, poppler.
 patchfiles-append           patch-configure.diff
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Fix crash on macOS Big Sur and newer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://gitlab.freedesktop.org/cairo/cairo/-/issues/420
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/52
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append           patch-cairo-quartz-surfaces.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # https://trac.macports.org/ticket/34137
 compiler.blacklist-append   {clang < 318.0.61}
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/graphics/cairo-devel/files/patch-cairo-quartz-surfaces.diff b/graphics/cairo-devel/files/patch-cairo-quartz-surfaces.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..5d97c045d37
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/graphics/cairo-devel/files/patch-cairo-quartz-surfaces.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,276 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cairo-quartz-image-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cairo-quartz-image-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,10 +50,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define SURFACE_ERROR_INVALID_FORMAT (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_INVALID_FORMAT)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-DataProviderReleaseCallback (void *info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DataProviderReleaseCallback (void *image_info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_t *surface = (cairo_surface_t *) info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_destroy (surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free (image_info);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static cairo_surface_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,9 +87,8 @@ _cairo_quartz_image_surface_finish (void *asurface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* the imageSurface will be destroyed by the data provider's release callback */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRelease (surface->image);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cairo_surface_destroy (surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return CAIRO_STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -147,24 +145,29 @@ _cairo_quartz_image_surface_flush (void *asurface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRef oldImage = surface->image;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRef newImage = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const unsigned int size = surface->imageSurface->height * surface->imageSurface->stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (flags)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return CAIRO_STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* XXX only flush if the image has been modified. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* To be released by the ReleaseCallback */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_reference ((cairo_surface_t*) surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab ( surface->imageSurface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              surface->imageSurface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, surface->imageSurface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      surface->imageSurface->height * surface->imageSurface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     newImage = CairoQuartzCreateCGImage (surface->imageSurface->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                   surface->imageSurface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                   surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->image = newImage;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRelease (oldImage);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -308,7 +311,7 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_image_surface_t *image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int width, height, stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_format_t format;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    unsigned char *data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (surface->status)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +324,6 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     height = image_surface->height;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     stride = image_surface->stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     format = image_surface->format;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    data = image_surface->data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!_cairo_quartz_verify_surface_size(width, height))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return SURFACE_ERROR_INVALID_SIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -338,20 +340,19 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     memset (qisurf, 0, sizeof(cairo_quartz_image_surface_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* In case the create_cgimage fails, this ref will
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * be released via the callback (which will be called in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * case of failure.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_reference (surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab (height, stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, image_surface->data, height * stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     image = CairoQuartzCreateCGImage (format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 width, height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                image_surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!image) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   free (qisurf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cairo-quartz-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cairo-quartz-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -778,20 +778,10 @@ CairoQuartzCreateGradientFunction (const cairo_gradient_pattern_t *gradient,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        &gradient_callbacks);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/* Obtain a CGImageRef from a #cairo_surface_t * */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_t *surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_image_surface_t *image_out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void *image_extra;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-} quartz_source_image_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ DataProviderReleaseCallback (void *info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    quartz_source_image_t *source_img = info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _cairo_surface_release_source_image (source_img->surface, source_img->image_out, source_img->image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free (info);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static cairo_status_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -803,8 +793,9 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      CGImageRef            *image_out)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_status_t status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    quartz_source_image_t *source_img;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_image_surface_t *image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data, *image_extra;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cairo_bool_t acquired = FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (source->backend && source->backend->type == CAIRO_SURFACE_TYPE_QUARTZ_IMAGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) source;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -826,19 +817,12 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    source_img = _cairo_malloc (sizeof (quartz_source_image_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (unlikely (source_img == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    source_img->surface = source;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (source->type == CAIRO_SURFACE_TYPE_RECORDING) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   image_surface = (cairo_image_surface_t *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_image_surface_create (format, extents->width, extents->height);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (unlikely (image_surface->base.status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       status = image_surface->base.status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -848,46 +832,61 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                       NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (unlikely (status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  source_img->image_out = image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  source_img->image_extra = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cairo_matrix_init_identity (matrix);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  status = _cairo_surface_acquire_source_image (source_img->surface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                &source_img->image_out,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                &source_img->image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (unlikely (status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  status = _cairo_surface_acquire_source_image (source, &image_surface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                &image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (unlikely (status))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  acquired = TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (source_img->image_out->width == 0 || source_img->image_out->height == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (image_surface->width == 0 || image_surface->height == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   *image_out = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  DataProviderReleaseCallback (source_img,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               source_img->image_out->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               source_img->image_out->height * source_img->image_out->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  *image_out = CairoQuartzCreateCGImage (source_img->image_out->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  /* TODO: differentiate memory error and unsupported surface type */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (unlikely (*image_out == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      status = CAIRO_INT_STATUS_UNSUPPORTED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab (image_surface->height, image_surface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, image_surface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      image_surface->height * image_surface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *image_out = CairoQuartzCreateCGImage (image_surface->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* TODO: differentiate memory error and unsupported surface type */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (*image_out == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  status = CAIRO_INT_STATUS_UNSUPPORTED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2273,11 +2272,13 @@ _cairo_quartz_surface_create_internal (CGContextRef cgContext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->extents.width = width;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->extents.height = height;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->virtual_extents = surface->extents;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    surface->imageSurfaceEquiv = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (IS_EMPTY (surface)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->cgContext = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->cgContextBaseCTM = CGAffineTransformIdentity;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->base.is_clear = TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2290,9 +2291,6 @@ _cairo_quartz_surface_create_internal (CGContextRef cgContext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->cgContext = cgContext;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->cgContextBaseCTM = CGContextGetCTM (cgContext);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    surface->imageSurfaceEquiv = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/graphics/cairo/Portfile b/graphics/cairo/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index ce06b2bc085..7279e55b9f2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/graphics/cairo/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/graphics/cairo/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,6 +11,7 @@ name                        cairo
</span> conflicts                   cairo-devel
 set my_name                 cairo
 version                     1.16.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    1
</span> checksums                   rmd160  cfd2ef6ec55b267e04600f6b1e36bb07f2566b35 \
                             sha256  5e7b29b3f113ef870d1e3ecf8adf21f923396401604bda16d44be45e66052331 \
                             size    41997432
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,6 +49,11 @@ minimum_xcodeversions       {8 2.4.1}
</span> # Prevent cairo from using librsvg, libspectre, poppler.
 patchfiles-append           patch-configure.diff
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Fix crash on macOS Big Sur and newer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://gitlab.freedesktop.org/cairo/cairo/-/issues/420
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://gitlab.freedesktop.org/cairo/cairo/-/merge_requests/52
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append           patch-cairo-quartz-surfaces.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # https://trac.macports.org/ticket/34137
 compiler.blacklist-append   {clang < 318.0.61}
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/graphics/cairo/files/patch-cairo-quartz-surfaces.diff b/graphics/cairo/files/patch-cairo-quartz-surfaces.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..5d97c045d37
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/graphics/cairo/files/patch-cairo-quartz-surfaces.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,276 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cairo-quartz-image-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cairo-quartz-image-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,10 +50,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define SURFACE_ERROR_INVALID_FORMAT (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_INVALID_FORMAT)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-DataProviderReleaseCallback (void *info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DataProviderReleaseCallback (void *image_info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_t *surface = (cairo_surface_t *) info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_destroy (surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free (image_info);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static cairo_surface_t *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,9 +87,8 @@ _cairo_quartz_image_surface_finish (void *asurface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* the imageSurface will be destroyed by the data provider's release callback */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRelease (surface->image);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cairo_surface_destroy (surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return CAIRO_STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -147,24 +145,29 @@ _cairo_quartz_image_surface_flush (void *asurface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRef oldImage = surface->image;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRef newImage = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const unsigned int size = surface->imageSurface->height * surface->imageSurface->stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (flags)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return CAIRO_STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* XXX only flush if the image has been modified. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* To be released by the ReleaseCallback */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_reference ((cairo_surface_t*) surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab ( surface->imageSurface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              surface->imageSurface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, surface->imageSurface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      surface->imageSurface->height * surface->imageSurface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     newImage = CairoQuartzCreateCGImage (surface->imageSurface->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    surface->imageSurface->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                   surface->imageSurface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                   surface->imageSurface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->image = newImage;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CGImageRelease (oldImage);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -308,7 +311,7 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_image_surface_t *image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int width, height, stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_format_t format;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    unsigned char *data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (surface->status)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +324,6 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     height = image_surface->height;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     stride = image_surface->stride;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     format = image_surface->format;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    data = image_surface->data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!_cairo_quartz_verify_surface_size(width, height))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return SURFACE_ERROR_INVALID_SIZE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -338,20 +340,19 @@ cairo_quartz_image_surface_create (cairo_surface_t *surface)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     memset (qisurf, 0, sizeof(cairo_quartz_image_surface_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* In case the create_cgimage fails, this ref will
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * be released via the callback (which will be called in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * case of failure.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_reference (surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab (height, stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, image_surface->data, height * stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     image = CairoQuartzCreateCGImage (format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 width, height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                image_surface);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!image) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   free (qisurf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cairo-quartz-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cairo-quartz-surface.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -778,20 +778,10 @@ CairoQuartzCreateGradientFunction (const cairo_gradient_pattern_t *gradient,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        &gradient_callbacks);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/* Obtain a CGImageRef from a #cairo_surface_t * */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_surface_t *surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    cairo_image_surface_t *image_out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void *image_extra;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-} quartz_source_image_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ DataProviderReleaseCallback (void *info, const void *data, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    quartz_source_image_t *source_img = info;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _cairo_surface_release_source_image (source_img->surface, source_img->image_out, source_img->image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    free (info);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static cairo_status_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -803,8 +793,9 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      CGImageRef            *image_out)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_status_t status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    quartz_source_image_t *source_img;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     cairo_image_surface_t *image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *image_data, *image_extra;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    cairo_bool_t acquired = FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (source->backend && source->backend->type == CAIRO_SURFACE_TYPE_QUARTZ_IMAGE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) source;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -826,19 +817,12 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    source_img = _cairo_malloc (sizeof (quartz_source_image_t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (unlikely (source_img == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    source_img->surface = source;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (source->type == CAIRO_SURFACE_TYPE_RECORDING) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   image_surface = (cairo_image_surface_t *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_image_surface_create (format, extents->width, extents->height);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (unlikely (image_surface->base.status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       status = image_surface->base.status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -848,46 +832,61 @@ _cairo_surface_to_cgimage (cairo_surface_t       *source,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                       NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (unlikely (status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  source_img->image_out = image_surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  source_img->image_extra = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cairo_matrix_init_identity (matrix);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  status = _cairo_surface_acquire_source_image (source_img->surface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                &source_img->image_out,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                                &source_img->image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (unlikely (status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      free (source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  status = _cairo_surface_acquire_source_image (source, &image_surface,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                &image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (unlikely (status))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  acquired = TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (source_img->image_out->width == 0 || source_img->image_out->height == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (image_surface->width == 0 || image_surface->height == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   *image_out = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  DataProviderReleaseCallback (source_img,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               source_img->image_out->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               source_img->image_out->height * source_img->image_out->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  *image_out = CairoQuartzCreateCGImage (source_img->image_out->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img->image_out->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                         source_img);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  /* TODO: differentiate memory error and unsupported surface type */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (unlikely (*image_out == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      status = CAIRO_INT_STATUS_UNSUPPORTED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    image_data = _cairo_malloc_ab (image_surface->height, image_surface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (!image_data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return _cairo_error (CAIRO_STATUS_NO_MEMORY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    memcpy (image_data, image_surface->data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      image_surface->height * image_surface->stride);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *image_out = CairoQuartzCreateCGImage (image_surface->format,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->width,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->height,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_surface->stride,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     TRUE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     DataProviderReleaseCallback,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                     image_data);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* TODO: differentiate memory error and unsupported surface type */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (unlikely (*image_out == NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  status = CAIRO_INT_STATUS_UNSUPPORTED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (acquired)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  _cairo_surface_release_source_image (source, image_surface, image_extra);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  cairo_surface_destroy (&image_surface->base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2273,11 +2272,13 @@ _cairo_quartz_surface_create_internal (CGContextRef cgContext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->extents.width = width;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->extents.height = height;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->virtual_extents = surface->extents;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    surface->imageSurfaceEquiv = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (IS_EMPTY (surface)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->cgContext = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->cgContextBaseCTM = CGAffineTransformIdentity;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   surface->base.is_clear = TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2290,9 +2291,6 @@ _cairo_quartz_surface_create_internal (CGContextRef cgContext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->cgContext = cgContext;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     surface->cgContextBaseCTM = CGContextGetCTM (cgContext);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    surface->imageData = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    surface->imageSurfaceEquiv = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return surface;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span></pre><pre style='margin:0'>

</pre>