<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>