diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h --- a/gfx/cairo/cairo/src/cairo-analysis-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-analysis-surface-private.h @@ -65,14 +65,11 @@ _cairo_analysis_surface_has_unsupported cairo_private void _cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface, cairo_box_t *bbox); cairo_private cairo_int_status_t _cairo_analysis_surface_merge_status (cairo_int_status_t status_a, cairo_int_status_t status_b); -cairo_private cairo_surface_t * -_cairo_null_surface_create (cairo_content_t content); - CAIRO_END_DECLS #endif /* CAIRO_ANALYSIS_SURFACE_H */ diff --git a/gfx/cairo/cairo/src/cairo-analysis-surface.c b/gfx/cairo/cairo/src/cairo-analysis-surface.c --- a/gfx/cairo/cairo/src/cairo-analysis-surface.c +++ b/gfx/cairo/cairo/src/cairo-analysis-surface.c @@ -902,17 +902,17 @@ static const cairo_surface_backend_t cai NULL, /* fill_stroke */ NULL, /* create_solid_pattern_surface */ NULL, /* can_repaint_solid_pattern_surface */ NULL, /* has_show_text_glyphs */ NULL /* show_text_glyphs */ }; cairo_surface_t * -_cairo_null_surface_create (cairo_content_t content) +cairo_null_surface_create (cairo_content_t content) { cairo_surface_t *surface; surface = malloc (sizeof (cairo_surface_t)); if (unlikely (surface == NULL)) { return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } diff --git a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp --- a/gfx/cairo/cairo/src/cairo-d2d-surface.cpp +++ b/gfx/cairo/cairo/src/cairo-d2d-surface.cpp @@ -1951,24 +1951,24 @@ _cairo_d2d_create_brush_for_pattern(cair rect = D2D1::RectU(1, 1, srcSurf->width + 1, srcSurf->height + 1); } else { rect = D2D1::RectU(0, 0, srcSurf->width, srcSurf->height); } sourceBitmap->CopyFromMemory(&rect, srcSurf->data, srcSurf->stride); cairo_surface_t *nullSurf = - _cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); + cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); cachebitmap->refs++; cachebitmap->dirty = false; cairo_surface_set_user_data(nullSurf, &bitmap_key_snapshot, cachebitmap, NULL); - _cairo_surface_attach_snapshot(surfacePattern->surface, + cairo_surface_attach_snapshot(surfacePattern->surface, nullSurf, _d2d_snapshot_detached); } } else { if (pattern->extend != CAIRO_EXTEND_NONE) { d2dsurf->rt->CreateBitmap(D2D1::SizeU(width, height), data + yoffset * stride + xoffset * Bpp, stride, @@ -2015,22 +2015,22 @@ _cairo_d2d_create_brush_for_pattern(cair * and one more in the user data structure. */ cachebitmap->refs = 2; cairo_surface_set_user_data(surfacePattern->surface, key, cachebitmap, _d2d_release_bitmap); cairo_surface_t *nullSurf = - _cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); + cairo_null_surface_create(CAIRO_CONTENT_COLOR_ALPHA); cairo_surface_set_user_data(nullSurf, &bitmap_key_snapshot, cachebitmap, NULL); - _cairo_surface_attach_snapshot(surfacePattern->surface, + cairo_surface_attach_snapshot(surfacePattern->surface, nullSurf, _d2d_snapshot_detached); cache_usage += _d2d_compute_bitmap_mem_size(sourceBitmap); } if (pix_image) { pixman_image_unref(pix_image); } } diff --git a/gfx/cairo/cairo/src/cairo-recording-surface.c b/gfx/cairo/cairo/src/cairo-recording-surface.c --- a/gfx/cairo/cairo/src/cairo-recording-surface.c +++ b/gfx/cairo/cairo/src/cairo-recording-surface.c @@ -276,17 +276,17 @@ _cairo_recording_surface_acquire_source_ -surface->extents.y); status = _cairo_recording_surface_replay (&surface->base, image); if (unlikely (status)) { cairo_surface_destroy (image); return status; } - _cairo_surface_attach_snapshot (&surface->base, image, NULL); + cairo_surface_attach_snapshot (&surface->base, image, NULL); *image_out = (cairo_image_surface_t *) image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_recording_surface_release_source_image (void *abstract_surface, @@ -1046,17 +1046,17 @@ static cairo_status_t _recording_surface_get_ink_bbox (cairo_recording_surface_t *surface, cairo_box_t *bbox, const cairo_matrix_t *transform) { cairo_surface_t *null_surface; cairo_surface_t *analysis_surface; cairo_status_t status; - null_surface = _cairo_null_surface_create (surface->content); + null_surface = cairo_null_surface_create (surface->content); analysis_surface = _cairo_analysis_surface_create (null_surface); cairo_surface_destroy (null_surface); status = analysis_surface->status; if (unlikely (status)) return status; if (transform != NULL) diff --git a/gfx/cairo/cairo/src/cairo-surface-private.h b/gfx/cairo/cairo/src/cairo-surface-private.h --- a/gfx/cairo/cairo/src/cairo-surface-private.h +++ b/gfx/cairo/cairo/src/cairo-surface-private.h @@ -40,18 +40,16 @@ #include "cairo.h" #include "cairo-types-private.h" #include "cairo-list-private.h" #include "cairo-reference-count-private.h" #include "cairo-clip-private.h" -typedef void (*cairo_surface_func_t) (cairo_surface_t *); - struct _cairo_surface { const cairo_surface_backend_t *backend; cairo_device_t *device; /* We allow surfaces to override the backend->type by shoving something * else into surface->type. This is for "wrapper" surfaces that want to * hide their internal type from the user-level API. */ cairo_surface_type_t type; diff --git a/gfx/cairo/cairo/src/cairo-surface-snapshot.c b/gfx/cairo/cairo/src/cairo-surface-snapshot.c --- a/gfx/cairo/cairo/src/cairo-surface-snapshot.c +++ b/gfx/cairo/cairo/src/cairo-surface-snapshot.c @@ -209,17 +209,17 @@ _cairo_surface_snapshot (cairo_surface_t if (unlikely (status)) { cairo_surface_destroy (snap); return _cairo_surface_create_in_error (status); } snap->device_transform = surface->device_transform; snap->device_transform_inverse = surface->device_transform_inverse; - _cairo_surface_attach_snapshot (surface, snap, NULL); + cairo_surface_attach_snapshot (surface, snap, NULL); return snap; } } snapshot = (cairo_surface_snapshot_t *) _cairo_surface_has_snapshot (surface, &_cairo_surface_snapshot_backend); if (snapshot != NULL) @@ -242,14 +242,14 @@ _cairo_surface_snapshot (cairo_surface_t if (unlikely (status)) { cairo_surface_destroy (&snapshot->base); return _cairo_surface_create_in_error (status); } snapshot->base.device_transform = surface->device_transform; snapshot->base.device_transform_inverse = surface->device_transform_inverse; - _cairo_surface_attach_snapshot (surface, + cairo_surface_attach_snapshot (surface, &snapshot->base, _cairo_surface_snapshot_copy_on_write); return &snapshot->base; } diff --git a/gfx/cairo/cairo/src/cairo-surface-subsurface.c b/gfx/cairo/cairo/src/cairo-surface-subsurface.c --- a/gfx/cairo/cairo/src/cairo-surface-subsurface.c +++ b/gfx/cairo/cairo/src/cairo-surface-subsurface.c @@ -326,17 +326,17 @@ _cairo_surface_subsurface_acquire_source _cairo_image_surface_create_with_content (meta->content, surface->extents.width, surface->extents.height); if (unlikely (image->base.status)) return image->base.status; cairo_surface_paint_to_target (&image->base, surface); - _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); + cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); *image_out = image; *extra_out = NULL; return CAIRO_STATUS_SUCCESS; } } extra = malloc (sizeof (struct extra)); diff --git a/gfx/cairo/cairo/src/cairo-surface.c b/gfx/cairo/cairo/src/cairo-surface.c --- a/gfx/cairo/cairo/src/cairo-surface.c +++ b/gfx/cairo/cairo/src/cairo-surface.c @@ -305,51 +305,51 @@ _cairo_surface_detach_mime_data (cairo_s if (! _cairo_surface_has_mime_data (surface)) return; _cairo_user_data_array_fini (&surface->mime_data); _cairo_user_data_array_init (&surface->mime_data); } static void -_cairo_surface_detach_snapshots (cairo_surface_t *surface) +cairo_surface_detach_snapshots (cairo_surface_t *surface) { while (_cairo_surface_has_snapshots (surface)) { - _cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots, + cairo_surface_detach_snapshot (cairo_list_first_entry (&surface->snapshots, cairo_surface_t, snapshot)); } } void -_cairo_surface_detach_snapshot (cairo_surface_t *snapshot) +cairo_surface_detach_snapshot (cairo_surface_t *snapshot) { assert (snapshot->snapshot_of != NULL); snapshot->snapshot_of = NULL; cairo_list_del (&snapshot->snapshot); if (snapshot->snapshot_detach != NULL) snapshot->snapshot_detach (snapshot); cairo_surface_destroy (snapshot); } void -_cairo_surface_attach_snapshot (cairo_surface_t *surface, +cairo_surface_attach_snapshot (cairo_surface_t *surface, cairo_surface_t *snapshot, cairo_surface_func_t detach_func) { assert (surface != snapshot); assert (snapshot->snapshot_of != surface); cairo_surface_reference (snapshot); if (snapshot->snapshot_of != NULL) - _cairo_surface_detach_snapshot (snapshot); + cairo_surface_detach_snapshot (snapshot); snapshot->snapshot_of = surface; snapshot->snapshot_detach = detach_func; cairo_list_add (&snapshot->snapshot, &surface->snapshots); assert (_cairo_surface_has_snapshot (surface, snapshot->backend) == snapshot); } @@ -382,17 +382,17 @@ _cairo_surface_is_writable (cairo_surfac static void _cairo_surface_begin_modification (cairo_surface_t *surface) { assert (surface->status == CAIRO_STATUS_SUCCESS); assert (! surface->finished); assert (surface->snapshot_of == NULL); - _cairo_surface_detach_snapshots (surface); + cairo_surface_detach_snapshots (surface); _cairo_surface_detach_mime_data (surface); } void _cairo_surface_init (cairo_surface_t *surface, const cairo_surface_backend_t *backend, cairo_device_t *device, cairo_content_t content) @@ -711,19 +711,19 @@ cairo_surface_finish (cairo_surface_t *s if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return; if (surface->finished) return; /* update the snapshots *before* we declare the surface as finished */ - _cairo_surface_detach_snapshots (surface); + cairo_surface_detach_snapshots (surface); if (surface->snapshot_of != NULL) - _cairo_surface_detach_snapshot (surface); + cairo_surface_detach_snapshot (surface); cairo_surface_flush (surface); surface->finished = TRUE; /* call finish even if in error mode */ if (surface->backend->finish) { status = surface->backend->finish (surface); if (unlikely (status)) @@ -1106,17 +1106,17 @@ cairo_surface_flush (cairo_surface_t *su if (surface->status) return; if (surface->finished) return; /* update the current snapshots *before* the user updates the surface */ - _cairo_surface_detach_snapshots (surface); + cairo_surface_detach_snapshots (surface); if (surface->backend->flush) { status = surface->backend->flush (surface); if (unlikely (status)) status = _cairo_surface_set_error (surface, status); } } slim_hidden_def (cairo_surface_flush); @@ -1628,17 +1628,17 @@ _cairo_recording_surface_clone_similar ( return similar->status; status = _cairo_recording_surface_replay (src, similar); if (unlikely (status)) { cairo_surface_destroy (similar); return status; } - _cairo_surface_attach_snapshot (src, similar, NULL); + cairo_surface_attach_snapshot (src, similar, NULL); src_x = src_y = 0; } *clone_out = similar; *clone_offset_x = src_x; *clone_offset_y = src_y; return CAIRO_STATUS_SUCCESS; diff --git a/gfx/cairo/cairo/src/cairo-vg-surface.c b/gfx/cairo/cairo/src/cairo-vg-surface.c --- a/gfx/cairo/cairo/src/cairo-vg-surface.c +++ b/gfx/cairo/cairo/src/cairo-vg-surface.c @@ -977,17 +977,17 @@ _vg_setup_surface_source (cairo_vg_conte status = _cairo_cache_insert (&context->snapshot_cache, &clone->snapshot_cache_entry); if (unlikely (status)) { clone->snapshot_cache_entry.hash = 0; cairo_surface_destroy (&clone->base); return status; } - _cairo_surface_attach_snapshot (spat->surface, &clone->base, + cairo_surface_attach_snapshot (spat->surface, &clone->base, _vg_surface_remove_from_cache); DONE: cairo_surface_destroy (&context->source->base); context->source = clone; vgSetParameteri (context->paint, VG_PAINT_TYPE, VG_PAINT_TYPE_PATTERN); diff --git a/gfx/cairo/cairo/src/cairo-xcb-surface.c b/gfx/cairo/cairo/src/cairo-xcb-surface.c --- a/gfx/cairo/cairo/src/cairo-xcb-surface.c +++ b/gfx/cairo/cairo/src/cairo-xcb-surface.c @@ -560,17 +560,17 @@ _cairo_xcb_surface_acquire_source_image image = (cairo_image_surface_t *) cairo_surface_reference (&image->base); goto DONE; } status = _get_image (surface, FALSE, &image); if (unlikely (status)) return status; - _cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); + cairo_surface_attach_snapshot (&surface->base, &image->base, NULL); DONE: *image_out = image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void @@ -713,17 +713,17 @@ _cairo_xcb_surface_flush (void *abstract status = cairo_surface_status (surface->fallback); if (status == CAIRO_STATUS_SUCCESS) { status = _put_image (surface, (cairo_image_surface_t *) surface->fallback); } if (status == CAIRO_STATUS_SUCCESS) { - _cairo_surface_attach_snapshot (&surface->base, + cairo_surface_attach_snapshot (&surface->base, surface->fallback, cairo_surface_finish); } } cairo_surface_destroy (surface->fallback); surface->fallback = NULL; diff --git a/gfx/cairo/cairo/src/cairo.h b/gfx/cairo/cairo/src/cairo.h --- a/gfx/cairo/cairo/src/cairo.h +++ b/gfx/cairo/cairo/src/cairo.h @@ -214,16 +214,25 @@ typedef struct _cairo_pattern cairo_patt * * #cairo_destroy_func_t the type of function which is called when a * data element is destroyed. It is passed the pointer to the data * element and should free any memory and resources allocated for it. **/ typedef void (*cairo_destroy_func_t) (void *data); /** + * cairo_surface_func_t: + * @surface: The surface being referred to. + * + * #cairo_surface_func_t the type of function which is used for callback + * when a surface needs to be apssed as a parameter. + */ +typedef void (*cairo_surface_func_t) (cairo_surface_t *surface); + +/** * cairo_user_data_key_t: * @unused: not used; ignore. * * #cairo_user_data_key_t is used for attaching user data to cairo * data structures. The actual contents of the struct is never used, * and there is no need to initialize the object; only the unique * address of a #cairo_data_key_t object is used. Typically, you * would just use the address of a static #cairo_data_key_t object. @@ -2150,16 +2159,24 @@ cairo_surface_get_user_data (cairo_surfa const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_surface_set_user_data (cairo_surface_t *surface, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); +cairo_public void +cairo_surface_attach_snapshot (cairo_surface_t *surface, + cairo_surface_t *snapshot, + cairo_surface_func_t detach_func); + +cairo_public void +cairo_surface_detach_snapshot (cairo_surface_t *snapshot); + #define CAIRO_MIME_TYPE_JPEG "image/jpeg" #define CAIRO_MIME_TYPE_PNG "image/png" #define CAIRO_MIME_TYPE_JP2 "image/jp2" #define CAIRO_MIME_TYPE_URI "text/x-uri" cairo_public void cairo_surface_get_mime_data (cairo_surface_t *surface, const char *mime_type, @@ -2328,16 +2345,21 @@ cairo_recording_surface_create (cairo_co cairo_public void cairo_recording_surface_ink_extents (cairo_surface_t *surface, double *x0, double *y0, double *width, double *height); +/* Null-surface functions */ + +cairo_public cairo_surface_t * +cairo_null_surface_create (cairo_content_t content); + /* Pattern creation functions */ cairo_public cairo_pattern_t * cairo_pattern_create_rgb (double red, double green, double blue); cairo_public cairo_pattern_t * cairo_pattern_create_rgba (double red, double green, double blue, double alpha); diff --git a/gfx/cairo/cairo/src/cairoint.h b/gfx/cairo/cairo/src/cairoint.h --- a/gfx/cairo/cairo/src/cairoint.h +++ b/gfx/cairo/cairo/src/cairoint.h @@ -1770,27 +1770,19 @@ _cairo_surface_clone_similar (cairo_surf int height, int *clone_offset_x, int *clone_offset_y, cairo_surface_t **clone_out); cairo_private cairo_surface_t * _cairo_surface_snapshot (cairo_surface_t *surface); -cairo_private void -_cairo_surface_attach_snapshot (cairo_surface_t *surface, - cairo_surface_t *snapshot, - cairo_surface_func_t detach_func); - cairo_private cairo_surface_t * _cairo_surface_has_snapshot (cairo_surface_t *surface, - const cairo_surface_backend_t *backend); - -cairo_private void -_cairo_surface_detach_snapshot (cairo_surface_t *snapshot); + const cairo_surface_backend_t *backend); cairo_private cairo_bool_t _cairo_surface_is_similar (cairo_surface_t *surface_a, cairo_surface_t *surface_b); cairo_private cairo_bool_t _cairo_surface_get_extents (cairo_surface_t *surface, cairo_rectangle_int_t *extents);