Replace the ad-hoc surface unwrappers with a function pointer

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-02-09 13:01:17 +00:00
parent 7c34997a3b
commit 2061cd81f2
44 changed files with 232 additions and 67 deletions

View file

@ -702,6 +702,7 @@ static const cairo_surface_backend_t cairo_analysis_surface_backend = {
NULL, /* map_to_image */
NULL, /* unmap */
NULL, /* source */
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */
@ -895,6 +896,7 @@ static const cairo_surface_backend_t cairo_null_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image*/
NULL, /* source */
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -2463,6 +2463,7 @@ const cairo_surface_backend_t _cairo_cogl_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
_cairo_cogl_surface_acquire_source_image,
_cairo_cogl_surface_release_source_image,
NULL, /* snapshot */

View file

@ -1835,6 +1835,7 @@ _cairo_directfb_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
_cairo_directfb_surface_acquire_source_image,/*acquire_source_image*/
_cairo_directfb_surface_release_source_image,/*release_source_image*/
_cairo_directfb_surface_acquire_dest_image,/*acquire_dest_image*/

View file

@ -1078,6 +1078,19 @@ _cairo_gl_surface_map_to_image (void *abstract_surface,
return &image->base;
}
static cairo_surface_t *
_cairo_gl_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_gl_surface_t *surface = abstract_surface;
extents->x = extents->y = 0;
extents->width = surface->width;
extents->height = surface->height;
return &surface->base;
}
static cairo_status_t
_cairo_gl_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -1249,6 +1262,7 @@ static const cairo_surface_backend_t _cairo_gl_surface_backend = {
_cairo_gl_surface_map_to_image,
_cairo_gl_surface_unmap_image,
_cairo_gl_surface_source,
_cairo_gl_surface_acquire_source_image,
_cairo_gl_surface_release_source_image,
NULL, /* snapshot */

View file

@ -609,15 +609,9 @@ _pixman_image_for_recording (cairo_image_surface_t *dst,
*ix = *iy = 0;
source = pattern->surface;
if (_cairo_surface_is_subsurface (source))
source = _cairo_surface_subsurface_get_target_with_offset (source, &tx, &ty);
if (_cairo_surface_is_snapshot (source))
source = _cairo_surface_snapshot_get_target (source);
if (_cairo_surface_is_observer (source))
source = _cairo_surface_observer_get_target (source);
if (_cairo_surface_is_paginated (source))
source = _cairo_paginated_surface_get_target (source);
source = _cairo_pattern_get_source (pattern, &limit);
tx = limit.x;
ty = limit.y;
extend = pattern->base.extend;
if (_cairo_surface_get_extents (source, &limit)) {

View file

@ -97,6 +97,11 @@ _cairo_image_surface_map_to_image (void *abstract_other,
cairo_private cairo_int_status_t
_cairo_image_surface_unmap_image (void *abstract_surface,
cairo_image_surface_t *image);
cairo_private cairo_surface_t *
_cairo_image_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents);
cairo_private cairo_status_t
_cairo_image_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,

View file

@ -819,6 +819,19 @@ _cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface)
surface->owns_data = TRUE;
}
cairo_surface_t *
_cairo_image_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_image_surface_t *surface = abstract_surface;
extents->x = extents->y = 0;
extents->width = surface->width;
extents->height = surface->height;
return &surface->base;
}
cairo_status_t
_cairo_image_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -948,6 +961,7 @@ const cairo_surface_backend_t _cairo_image_surface_backend = {
_cairo_image_surface_map_to_image,
_cairo_image_surface_unmap_image,
_cairo_image_surface_source,
_cairo_image_surface_acquire_source_image,
_cairo_image_surface_release_source_image,
_cairo_image_surface_snapshot,

View file

@ -778,39 +778,30 @@ upload_boxes (const cairo_mask_compositor_t *compositor,
{
cairo_surface_t *dst = extents->surface;
const cairo_pattern_t *source = &extents->source_pattern.base;
const cairo_surface_pattern_t *pattern;
cairo_surface_t *src;
cairo_rectangle_int_t limit;
cairo_int_status_t status;
int tx, ty;
pattern = (const cairo_surface_pattern_t *) source;
src = pattern->surface;
src = _cairo_pattern_get_source ((cairo_surface_pattern_t *)source, &limit);
if (!(src->type == CAIRO_SURFACE_TYPE_IMAGE || src->type == dst->type))
return CAIRO_INT_STATUS_UNSUPPORTED;
if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty))
return CAIRO_INT_STATUS_UNSUPPORTED;
if (_cairo_surface_is_snapshot (src))
src = _cairo_surface_snapshot_get_target (src);
if (_cairo_surface_is_observer (src))
src = _cairo_surface_observer_get_target (src);
if (_cairo_surface_is_subsurface (src)) {
_cairo_surface_subsurface_offset (src, &tx, &ty);
src = _cairo_surface_subsurface_get_target (src);
}
/* Check that the data is entirely within the image */
if (extents->bounded.x + tx < 0 || extents->bounded.y + ty < 0)
if (extents->bounded.x + tx < limit.x || extents->bounded.y + ty < limit.y)
return CAIRO_INT_STATUS_UNSUPPORTED;
_cairo_surface_get_extents (pattern->surface, &limit);
if (extents->bounded.x + extents->bounded.width + tx > limit.width ||
extents->bounded.y + extents->bounded.height + ty > limit.height)
if (extents->bounded.x + extents->bounded.width + tx > limit.x + limit.width ||
extents->bounded.y + extents->bounded.height + ty > limit.y + limit.height)
return CAIRO_INT_STATUS_UNSUPPORTED;
if (pattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE)
tx += limit.x;
ty += limit.y;
if (src->type == CAIRO_SURFACE_TYPE_IMAGE)
status = compositor->draw_image_boxes (dst,
(cairo_image_surface_t *)src,
boxes, tx, ty);

View file

@ -1394,6 +1394,7 @@ static const cairo_surface_backend_t cairo_os2_surface_backend = {
_cairo_os2_surface_map_to_image,
_cairo_os2_surface_unmap_image,
_cairo_surface_default_source,
_cairo_os2_surface_acquire_source_image,
_cairo_os2_surface_release_source_image,
NULL, /* snapshot */

View file

@ -242,6 +242,14 @@ _cairo_paginated_surface_create_image_surface (void *abstract_surface,
return image;
}
static cairo_surface_t *
_cairo_paginated_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_paginated_surface_t *surface = abstract_surface;
return _cairo_surface_get_source (surface->target, extents);
}
static cairo_status_t
_cairo_paginated_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -682,6 +690,7 @@ static const cairo_surface_backend_t cairo_paginated_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_paginated_surface_source,
_cairo_paginated_surface_acquire_source_image,
_cairo_paginated_surface_release_source_image,
_cairo_paginated_surface_snapshot,

View file

@ -39,6 +39,7 @@
#include "cairo-error-private.h"
#include "cairo-types-private.h"
#include "cairo-list-private.h"
#include "cairo-surface-private.h"
#include <stdio.h> /* FILE* */
@ -370,6 +371,13 @@ _cairo_raster_source_pattern_finish (cairo_pattern_t *abstract_pattern);
cairo_private void
_cairo_debug_print_pattern (FILE *file, const cairo_pattern_t *pattern);
static inline cairo_surface_t *
_cairo_pattern_get_source (const cairo_surface_pattern_t *pattern,
cairo_rectangle_int_t *extents)
{
return _cairo_surface_get_source (pattern->surface, extents);
}
CAIRO_END_DECLS
#endif /* CAIRO_PATTERN_PRIVATE */

View file

@ -7274,6 +7274,7 @@ static const cairo_surface_backend_t cairo_pdf_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -4538,6 +4538,7 @@ static const cairo_surface_backend_t cairo_ps_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -1561,6 +1561,7 @@ static const cairo_surface_backend_t cairo_qt_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
_cairo_qt_surface_acquire_source_image,
_cairo_qt_surface_release_source_image,
_cairo_qt_surface_acquire_dest_image,

View file

@ -260,6 +260,7 @@ static const cairo_surface_backend_t cairo_quartz_image_surface_backend = {
_cairo_quartz_image_surface_map_to_image,
_cairo_quartz_image_surface_unmap_image,
_cairo_surface_default_source,
_cairo_quartz_image_surface_acquire_source_image,
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -535,6 +535,7 @@ static const cairo_surface_backend_t proxy_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
proxy_acquire_source_image,
proxy_release_source_image,
};
@ -1135,6 +1136,7 @@ static const cairo_surface_backend_t cairo_recording_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
_cairo_recording_surface_acquire_source_image,
_cairo_recording_surface_release_source_image,
_cairo_recording_surface_snapshot,

View file

@ -2090,6 +2090,19 @@ _device_destroy (void *abstract_device)
free (ctx);
}
static cairo_surface_t *
_cairo_script_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_script_surface_t *surface = abstract_surface;
extents->x = extents->y = 0;
extents->width = surface->width;
extents->height = surface->height;
return &surface->base;
}
static cairo_status_t
_cairo_script_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -3557,6 +3570,7 @@ _cairo_script_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_script_surface_source,
_cairo_script_surface_acquire_source_image,
_cairo_script_surface_release_source_image,
_cairo_script_surface_snapshot,

View file

@ -379,18 +379,12 @@ error:
}
static cairo_surface_t *
unwrap_surface (const cairo_pattern_t *pattern)
unwrap_source (const cairo_pattern_t *pattern)
{
cairo_surface_t *surface;
cairo_rectangle_int_t limit;
surface = ((const cairo_surface_pattern_t *) pattern)->surface;
if (_cairo_surface_is_paginated (surface))
surface = _cairo_paginated_surface_get_recording (surface);
if (_cairo_surface_is_snapshot (surface))
surface = _cairo_surface_snapshot_get_target (surface);
if (_cairo_surface_is_observer (surface))
surface = _cairo_surface_observer_get_target (surface);
return surface;
return _cairo_pattern_get_source ((cairo_surface_pattern_t *)pattern,
&limit);
}
static cairo_bool_t
@ -417,7 +411,7 @@ recording_pattern_contains_sample (const cairo_pattern_t *pattern,
if (pattern->extend == CAIRO_EXTEND_NONE)
return TRUE;
surface = (cairo_recording_surface_t *) unwrap_surface (pattern);
surface = (cairo_recording_surface_t *) unwrap_source (pattern);
if (surface->unbounded)
return TRUE;
@ -482,7 +476,7 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor,
boxes);
recording_clip = _cairo_clip_from_boxes (boxes);
status = _cairo_recording_surface_replay_with_clip (unwrap_surface (source),
status = _cairo_recording_surface_replay_with_clip (unwrap_source (source),
&source->matrix,
dst, recording_clip);
_cairo_clip_destroy (recording_clip);

View file

@ -70,6 +70,10 @@ struct _cairo_surface_backend {
(*unmap_image) (void *surface,
cairo_image_surface_t *image);
cairo_surface_t *
(*source) (void *abstract_surface,
cairo_rectangle_int_t *extents);
cairo_warn cairo_status_t
(*acquire_source_image) (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -197,6 +201,10 @@ struct _cairo_surface_backend {
(*get_supported_mime_types) (void *surface);
};
cairo_private cairo_surface_t *
_cairo_surface_default_source (void *surface,
cairo_rectangle_int_t *extents);
CAIRO_END_DECLS
#endif /* CAIRO_SURFACE_BACKEND_PRIVATE_H */

View file

@ -1276,6 +1276,14 @@ _cairo_surface_observer_get_font_options (void *abstract_surface,
surface->target->backend->get_font_options (surface->target, options);
}
static cairo_surface_t *
_cairo_surface_observer_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_surface_observer_t *surface = abstract_surface;
return _cairo_surface_get_source (surface->target, extents);
}
static cairo_status_t
_cairo_surface_observer_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -1339,6 +1347,7 @@ static const cairo_surface_backend_t _cairo_surface_observer_backend = {
_cairo_surface_observer_map_to_image,
_cairo_surface_observer_unmap_image,
_cairo_surface_observer_source,
_cairo_surface_observer_acquire_source_image,
_cairo_surface_observer_release_source_image,
_cairo_surface_observer_snapshot,

View file

@ -105,4 +105,8 @@ struct _cairo_surface {
cairo_private cairo_surface_t *
_cairo_int_surface_create_in_error (cairo_int_status_t status);
cairo_private cairo_surface_t *
_cairo_surface_get_source (cairo_surface_t *surface,
cairo_rectangle_int_t *extents);
#endif /* CAIRO_SURFACE_PRIVATE_H */

View file

@ -68,6 +68,14 @@ _cairo_surface_snapshot_flush (void *abstract_surface)
return surface->target->status;
}
static cairo_surface_t *
_cairo_surface_snapshot_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_surface_snapshot_t *surface = abstract_surface;
return _cairo_surface_get_source (surface->target, extents);
}
static cairo_status_t
_cairo_surface_snapshot_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -107,6 +115,7 @@ static const cairo_surface_backend_t _cairo_surface_snapshot_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_snapshot_source,
_cairo_surface_snapshot_acquire_source_image,
_cairo_surface_snapshot_release_source_image,
NULL, /* snapshot */

View file

@ -293,6 +293,19 @@ _cairo_surface_subsurface_get_font_options (void *abstract_surface,
surface->target->backend->get_font_options (surface->target, options);
}
static cairo_surface_t *
_cairo_surface_subsurface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_surface_subsurface_t *surface = abstract_surface;
cairo_surface_t *source;
source = _cairo_surface_get_source (surface->target, extents);
*extents = surface->extents;
return source;
}
static cairo_status_t
_cairo_surface_subsurface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -386,6 +399,7 @@ static const cairo_surface_backend_t _cairo_surface_subsurface_backend = {
_cairo_surface_subsurface_map_to_image,
_cairo_surface_subsurface_unmap_image,
_cairo_surface_subsurface_source,
_cairo_surface_subsurface_acquire_source_image,
_cairo_surface_subsurface_release_source_image,
_cairo_surface_subsurface_snapshot,

View file

@ -1714,6 +1714,22 @@ _cairo_surface_release_source_image (cairo_surface_t *surface,
surface->backend->release_source_image (surface, image, image_extra);
}
cairo_surface_t *
_cairo_surface_get_source (cairo_surface_t *surface,
cairo_rectangle_int_t *extents)
{
assert (surface->backend->source);
return surface->backend->source (surface, extents);
}
cairo_surface_t *
_cairo_surface_default_source (void *surface,
cairo_rectangle_int_t *extents)
{
_cairo_surface_get_extents(surface, extents);
return surface;
}
static cairo_status_t
_pattern_has_error (const cairo_pattern_t *pattern)
{

View file

@ -2603,6 +2603,7 @@ static const cairo_surface_backend_t cairo_svg_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -119,6 +119,14 @@ _cairo_tee_surface_finish (void *abstract_surface)
return CAIRO_STATUS_SUCCESS;
}
static cairo_surface_t *
_cairo_tee_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_tee_surface_t *surface = abstract_surface;
return _cairo_surface_get_source (surface->master.target, extents);
}
static cairo_status_t
_cairo_tee_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -389,6 +397,7 @@ static const cairo_surface_backend_t cairo_tee_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_tee_surface_source,
_cairo_tee_surface_acquire_source_image,
_cairo_tee_surface_release_source_image,
_cairo_tee_surface_snapshot,

View file

@ -1102,39 +1102,31 @@ upload_boxes (const cairo_traps_compositor_t *compositor,
{
cairo_surface_t *dst = extents->surface;
const cairo_pattern_t *source = &extents->source_pattern.base;
const cairo_surface_pattern_t *pattern;
cairo_surface_t *src;
cairo_rectangle_int_t limit;
cairo_int_status_t status;
int tx, ty;
pattern = (const cairo_surface_pattern_t *) source;
src = pattern->surface;
src = _cairo_pattern_get_source((cairo_surface_pattern_t *)source,
&limit);
if (!(src->type == CAIRO_SURFACE_TYPE_IMAGE || src->type == dst->type))
return CAIRO_INT_STATUS_UNSUPPORTED;
if (! _cairo_matrix_is_integer_translation (&source->matrix, &tx, &ty))
return CAIRO_INT_STATUS_UNSUPPORTED;
if (_cairo_surface_is_snapshot (src))
src = _cairo_surface_snapshot_get_target (src);
if (_cairo_surface_is_observer (src))
src = _cairo_surface_observer_get_target (src);
if (_cairo_surface_is_subsurface (src)) {
_cairo_surface_subsurface_offset (src, &tx, &ty);
src = _cairo_surface_subsurface_get_target (src);
}
/* Check that the data is entirely within the image */
if (extents->bounded.x + tx < 0 || extents->bounded.y + ty < 0)
if (extents->bounded.x + tx < limit.x || extents->bounded.y + ty < limit.y)
return CAIRO_INT_STATUS_UNSUPPORTED;
_cairo_surface_get_extents (pattern->surface, &limit);
if (extents->bounded.x + extents->bounded.width + tx > limit.width ||
extents->bounded.y + extents->bounded.height + ty > limit.height)
if (extents->bounded.x + extents->bounded.width + tx > limit.x + limit.width ||
extents->bounded.y + extents->bounded.height + ty > limit.y + limit.height)
return CAIRO_INT_STATUS_UNSUPPORTED;
if (pattern->surface->type == CAIRO_SURFACE_TYPE_IMAGE)
tx += limit.x;
ty += limit.y;
if (src->type == CAIRO_SURFACE_TYPE_IMAGE)
status = compositor->draw_image_boxes (dst,
(cairo_image_surface_t *)src,
boxes, tx, ty);

View file

@ -331,6 +331,7 @@ static const cairo_surface_backend_t cairo_type3_glyph_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
NULL, /* source */
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -1487,6 +1487,7 @@ static const cairo_surface_backend_t cairo_vg_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
_vg_surface_acquire_source_image,
_vg_surface_release_source_image,
NULL, /* snapshot */

View file

@ -1881,6 +1881,7 @@ static const cairo_surface_backend_t cairo_win32_printing_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */

View file

@ -1937,6 +1937,7 @@ static const cairo_surface_backend_t cairo_win32_surface_backend = {
_cairo_win32_surface_map_to_image,
_cairo_win32_surface_unmap_image,
_cairo_surface_default_source,
_cairo_win32_surface_acquire_source_image,
_cairo_win32_surface_release_source_image,
NULL, /* snapshot */

View file

@ -457,6 +457,19 @@ FAIL:
return _cairo_surface_create_in_error (status);
}
static cairo_surface_t *
_cairo_xcb_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_xcb_surface_t *surface = abstract_surface;
extents->x = extents->y = 0;
extents->width = surface->width;
extents->height = surface->height;
return &surface->base;
}
static cairo_status_t
_cairo_xcb_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -1052,6 +1065,7 @@ const cairo_surface_backend_t _cairo_xcb_surface_backend = {
_cairo_xcb_surface_map_to_image,
_cairo_xcb_surface_unmap,
_cairo_xcb_surface_source,
_cairo_xcb_surface_acquire_source_image,
_cairo_xcb_surface_release_source_image,
NULL, /* snapshot */

View file

@ -59,17 +59,10 @@
#define PIXMAN_MAX_INT ((pixman_fixed_1 >> 1) - pixman_fixed_e) /* need to ensure deltas also fit */
static cairo_xlib_surface_t *
unwrap_surface (cairo_surface_t *surface)
unwrap_source (const cairo_surface_pattern_t *pattern)
{
if (_cairo_surface_is_paginated (surface))
surface = _cairo_paginated_surface_get_recording (surface);
if (_cairo_surface_is_snapshot (surface))
surface = _cairo_surface_snapshot_get_target (surface);
if (_cairo_surface_is_subsurface (surface))
surface = _cairo_surface_subsurface_get_target (surface);
if (_cairo_surface_is_observer (surface))
surface = _cairo_surface_observer_get_target (surface);
return (cairo_xlib_surface_t *)surface;
cairo_rectangle_int_t limits;
return (cairo_xlib_surface_t *)_cairo_pattern_get_source (pattern, &limits);
}
static cairo_status_t
@ -760,7 +753,7 @@ native_source (cairo_xlib_surface_t *dst,
extents, sample,
src_x, src_y);
src = unwrap_surface (pattern->surface);
src = unwrap_source (pattern);
if (pattern->base.filter == CAIRO_FILTER_NEAREST &&
sample->x >= 0 && sample->y >= 0 &&
@ -1037,7 +1030,7 @@ _cairo_xlib_source_create_for_pattern (cairo_surface_t *_dst,
cairo_surface_pattern_t *spattern = (cairo_surface_pattern_t *)pattern;
if (spattern->surface->type == CAIRO_SURFACE_TYPE_XLIB &&
_cairo_xlib_surface_same_screen (dst,
unwrap_surface (spattern->surface)))
unwrap_source (spattern)))
return native_source (dst, spattern, is_mask,
extents, sample,
src_x, src_y);

View file

@ -1224,6 +1224,19 @@ _cairo_xlib_surface_draw_image (cairo_xlib_surface_t *surface,
return CAIRO_STATUS_SUCCESS;
}
static cairo_surface_t *
_cairo_xlib_surface_source(void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_xlib_surface_t *surface = abstract_surface;
extents->x = extents->y = 0;
extents->width = surface->width;
extents->height = surface->height;
return &surface->base;
}
static cairo_status_t
_cairo_xlib_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -1400,6 +1413,7 @@ static const cairo_surface_backend_t cairo_xlib_surface_backend = {
_cairo_xlib_surface_map_to_image,
_cairo_xlib_surface_unmap_image,
_cairo_xlib_surface_source,
_cairo_xlib_surface_acquire_source_image,
_cairo_xlib_surface_release_source_image,
_cairo_xlib_surface_snapshot,

View file

@ -137,6 +137,14 @@ _cairo_xlib_xcb_surface_unmap (void *abstract_surface,
return cairo_surface_status (&surface->xcb->base);
}
static cairo_surface_t *
_cairo_xlib_xcb_surface_source (void *abstract_surface,
cairo_rectangle_int_t *extents)
{
cairo_xlib_xcb_surface_t *surface = abstract_surface;
return _cairo_surface_get_source (&surface->cb->base, extents);
}
static cairo_status_t
_cairo_xlib_xcb_surface_acquire_source_image (void *abstract_surface,
cairo_image_surface_t **image_out,
@ -275,6 +283,7 @@ static const cairo_surface_backend_t _cairo_xlib_xcb_surface_backend = {
_cairo_xlib_xcb_surface_map_to_image,
_cairo_xlib_xcb_surface_unmap,
_cairo_xlib_xcb_surface_source,
_cairo_xlib_xcb_surface_acquire_source_image,
_cairo_xlib_xcb_surface_release_source_image,
NULL, /* snapshot */

View file

@ -1002,6 +1002,7 @@ _cairo_xml_surface_backend = {
NULL, /* map_to_image */
NULL, /* unmap_image */
_cairo_surface_default_source,
NULL, /* acquire source image */
NULL, /* release source image */
NULL, /* snapshot */

View file

@ -468,6 +468,7 @@ static const cairo_surface_backend_t gallium_surface_backend = {
gallium_surface_create_similar,
gallium_surface_finish,
NULL,
gallium_surface_acquire_source_image,
gallium_surface_release_source_image,

View file

@ -2343,6 +2343,8 @@ static const cairo_surface_backend_t i915_surface_backend = {
i915_surface_create_similar,
i915_surface_finish,
NULL,
intel_surface_acquire_source_image,
intel_surface_release_source_image,

View file

@ -1495,6 +1495,8 @@ static const cairo_surface_backend_t i965_surface_backend = {
i965_surface_create_similar,
i965_surface_finish,
NULL,
intel_surface_acquire_source_image,
intel_surface_release_source_image,

View file

@ -253,8 +253,11 @@ static const cairo_surface_backend_t intel_surface_backend = {
intel_surface_create_similar,
intel_surface_finish,
NULL,
intel_surface_acquire_source_image,
intel_surface_release_source_image,
NULL, NULL, NULL,
NULL, /* composite */
NULL, /* fill */

View file

@ -257,8 +257,11 @@ static const cairo_surface_backend_t radeon_surface_backend = {
radeon_surface_create_similar,
radeon_surface_finish,
NULL,
radeon_surface_acquire_source_image,
radeon_surface_release_source_image,
NULL, NULL, NULL,
NULL, /* composite */
NULL, /* fill */

View file

@ -195,6 +195,7 @@ static const cairo_surface_backend_t test_compositor_surface_backend = {
_cairo_image_surface_map_to_image,
_cairo_image_surface_unmap_image,
_cairo_image_surface_source,
_cairo_image_surface_acquire_source_image,
_cairo_image_surface_release_source_image,
_cairo_image_surface_snapshot,

View file

@ -198,6 +198,7 @@ static const cairo_surface_backend_t test_compositor_surface_backend = {
_cairo_image_surface_map_to_image,
_cairo_image_surface_unmap_image,
_cairo_image_surface_source,
_cairo_image_surface_acquire_source_image,
_cairo_image_surface_release_source_image,
NULL, /* snapshot */

View file

@ -253,6 +253,7 @@ static const cairo_surface_backend_t test_paginated_surface_backend = {
NULL, /* map to image */
NULL, /* unmap image */
_cairo_surface_default_source,
NULL, /* acquire_source_image */
NULL, /* release_source_image */
NULL, /* snapshot */