1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/wrap-source_image.patch Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,105 @@ 1.4 +Author: Jeff Muizelaar <jmuizelaar@mozilla.com> 1.5 +diff --git a/src/cairo-surface.c b/src/cairo-surface.c 1.6 +index 8278694..12f6242 100644 1.7 +--- a/src/cairo-surface.c 1.8 ++++ b/src/cairo-surface.c 1.9 +@@ -1530,6 +1530,70 @@ _cairo_recording_surface_clone_similar (cairo_surface_t *surface, 1.10 + return CAIRO_STATUS_SUCCESS; 1.11 + } 1.12 + 1.13 ++struct acquire_source_image_data 1.14 ++{ 1.15 ++ cairo_surface_t *src; 1.16 ++ cairo_image_surface_t *image; 1.17 ++ void *image_extra; 1.18 ++}; 1.19 ++ 1.20 ++static void 1.21 ++_wrap_release_source_image (void *data) 1.22 ++{ 1.23 ++ struct acquire_source_image_data *acquire_data = data; 1.24 ++ _cairo_surface_release_source_image (acquire_data->src, 1.25 ++ acquire_data->image, 1.26 ++ acquire_data->image_extra); 1.27 ++ free(data); 1.28 ++} 1.29 ++ 1.30 ++static cairo_status_t 1.31 ++_wrap_image (cairo_surface_t *src, 1.32 ++ cairo_image_surface_t *image, 1.33 ++ void *image_extra, 1.34 ++ cairo_image_surface_t **out) 1.35 ++{ 1.36 ++ static cairo_user_data_key_t wrap_image_key; 1.37 ++ cairo_image_surface_t *surface; 1.38 ++ cairo_status_t status; 1.39 ++ 1.40 ++ struct acquire_source_image_data *data = malloc (sizeof (*data)); 1.41 ++ if (unlikely (data == NULL)) 1.42 ++ return _cairo_error (CAIRO_STATUS_NO_MEMORY); 1.43 ++ data->src = src; 1.44 ++ data->image = image; 1.45 ++ data->image_extra = image_extra; 1.46 ++ 1.47 ++ surface = (cairo_image_surface_t *) 1.48 ++ _cairo_image_surface_create_with_pixman_format (image->data, 1.49 ++ image->pixman_format, 1.50 ++ image->width, 1.51 ++ image->height, 1.52 ++ image->stride); 1.53 ++ status = surface->base.status; 1.54 ++ if (status) { 1.55 ++ free (data); 1.56 ++ return status; 1.57 ++ } 1.58 ++ 1.59 ++ status = _cairo_user_data_array_set_data (&surface->base.user_data, 1.60 ++ &wrap_image_key, 1.61 ++ data, 1.62 ++ _wrap_release_source_image); 1.63 ++ if (status) { 1.64 ++ cairo_surface_destroy (&surface->base); 1.65 ++ free (data); 1.66 ++ return status; 1.67 ++ } 1.68 ++ 1.69 ++ pixman_image_set_component_alpha ( 1.70 ++ surface->pixman_image, 1.71 ++ pixman_image_get_component_alpha (surface->pixman_image)); 1.72 ++ 1.73 ++ *out = surface; 1.74 ++ return CAIRO_STATUS_SUCCESS; 1.75 ++} 1.76 ++ 1.77 + /** 1.78 + * _cairo_surface_clone_similar: 1.79 + * @surface: a #cairo_surface_t 1.80 +@@ -1606,15 +1670,19 @@ _cairo_surface_clone_similar (cairo_surface_t *surface, 1.81 + /* If we failed, try again with an image surface */ 1.82 + status = _cairo_surface_acquire_source_image (src, &image, &image_extra); 1.83 + if (status == CAIRO_STATUS_SUCCESS) { 1.84 +- status = 1.85 +- surface->backend->clone_similar (surface, &image->base, 1.86 +- src_x, src_y, 1.87 +- width, height, 1.88 +- clone_offset_x, 1.89 +- clone_offset_y, 1.90 +- clone_out); 1.91 +- 1.92 +- _cairo_surface_release_source_image (src, image, image_extra); 1.93 ++ status = _wrap_image(src, image, image_extra, &image); 1.94 ++ if (status != CAIRO_STATUS_SUCCESS) { 1.95 ++ _cairo_surface_release_source_image (src, image, image_extra); 1.96 ++ } else { 1.97 ++ status = 1.98 ++ surface->backend->clone_similar (surface, &image->base, 1.99 ++ src_x, src_y, 1.100 ++ width, height, 1.101 ++ clone_offset_x, 1.102 ++ clone_offset_y, 1.103 ++ clone_out); 1.104 ++ cairo_surface_destroy(&image->base); 1.105 ++ } 1.106 + } 1.107 + } 1.108 + }