summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-source.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-01-06 11:29:27 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2013-01-06 11:30:02 +0000
commita73e7ff0186176bc82cd3ae1432c054c1fd3aebd (patch)
treeb02de97cf872a70b8ee2feff27407bf4d01a7334 /src/cairo-xlib-source.c
parent4f142f3a7bf24b659c5caccab3a1aedd6b680909 (diff)
downloadcairo-a73e7ff0186176bc82cd3ae1432c054c1fd3aebd.tar.gz
xlib: Simplify source creation by use of map-to-image
We were open-coding the functionality of map-to-image inside the source creation routines. so refactor to actually use map-to-image instead. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-xlib-source.c')
-rw-r--r--src/cairo-xlib-source.c92
1 files changed, 33 insertions, 59 deletions
diff --git a/src/cairo-xlib-source.c b/src/cairo-xlib-source.c
index e312222a8..d08052a4f 100644
--- a/src/cairo-xlib-source.c
+++ b/src/cairo-xlib-source.c
@@ -898,9 +898,6 @@ surface_source (cairo_xlib_surface_t *dst,
cairo_surface_pattern_t local_pattern;
cairo_status_t status;
cairo_rectangle_int_t upload, limit;
- cairo_matrix_t m;
- pixman_format_code_t format;
- int draw_x, draw_y;
src = pattern->surface;
if (src->type == CAIRO_SURFACE_TYPE_IMAGE &&
@@ -910,7 +907,6 @@ surface_source (cairo_xlib_surface_t *dst,
cairo_surface_reference (src);
-prepare_shm_image:
proxy = malloc (sizeof(*proxy));
if (unlikely (proxy == NULL)) {
cairo_surface_destroy (src);
@@ -954,46 +950,47 @@ prepare_shm_image:
}
}
- if (_cairo_surface_is_image (src))
- format = ((cairo_image_surface_t *)src)->pixman_format;
- else
- format = _cairo_format_to_pixman_format_code (_cairo_format_from_content (src->content));
- src = _cairo_xlib_surface_create_shm (dst, format,
- upload.width, upload.height);
- if (src == NULL) {
- if (_cairo_surface_is_image (pattern->surface)) {
- draw_x = upload.x;
- draw_y = upload.y;
- src = cairo_surface_reference (pattern->surface);
- goto skip_paint;
- }
-
- src = _cairo_image_surface_create_with_pixman_format (NULL,
- format,
- upload.width,
- upload.height,
- 0);
+ xsrc = (cairo_xlib_surface_t *)
+ _cairo_surface_create_similar_scratch (&dst->base,
+ src->content,
+ upload.width,
+ upload.height);
+ if (xsrc->base.type != CAIRO_SURFACE_TYPE_XLIB) {
+ cairo_surface_destroy (src);
+ cairo_surface_destroy (&xsrc->base);
+ return None;
}
- _cairo_pattern_init_for_surface (&local_pattern, pattern->surface);
- cairo_matrix_init_translate (&local_pattern.base.matrix,
- upload.x, upload.y);
+ if (_cairo_surface_is_image (src)) {
+ status = _cairo_xlib_surface_draw_image (xsrc, (cairo_image_surface_t *)src,
+ upload.x, upload.y,
+ upload.width, upload.height,
+ 0, 0);
+ } else {
+ cairo_image_surface_t *image;
- status = _cairo_surface_paint (src,
- CAIRO_OPERATOR_SOURCE,
- &local_pattern.base,
- NULL);
- _cairo_pattern_fini (&local_pattern.base);
+ image = _cairo_surface_map_to_image (&xsrc->base, NULL);
- if (unlikely (status)) {
- cairo_surface_destroy (src);
- return _cairo_surface_create_in_error (status);
+ _cairo_pattern_init_for_surface (&local_pattern, pattern->surface);
+ cairo_matrix_init_translate (&local_pattern.base.matrix,
+ upload.x, upload.y);
+
+ status = _cairo_surface_paint (&image->base,
+ CAIRO_OPERATOR_SOURCE,
+ &local_pattern.base,
+ NULL);
+ _cairo_pattern_fini (&local_pattern.base);
+
+ status = _cairo_surface_unmap_image (&xsrc->base, image);
+ if (unlikely (status)) {
+ cairo_surface_destroy (src);
+ return _cairo_surface_create_in_error (status);
+ }
}
- draw_x = draw_y = 0;
-skip_paint:
_cairo_pattern_init_static_copy (&local_pattern.base, &pattern->base);
if (upload.x | upload.y) {
+ cairo_matrix_t m;
cairo_matrix_init_translate (&m, -upload.x, -upload.y);
cairo_matrix_multiply (&local_pattern.base.matrix,
&local_pattern.base.matrix,
@@ -1001,29 +998,6 @@ skip_paint:
}
*src_x = *src_y = 0;
- if (src->device == dst->base.device &&
- _cairo_xlib_shm_surface_get_pixmap (src)) {
- pattern = &local_pattern;
- goto prepare_shm_image;
- }
-
- xsrc = (cairo_xlib_surface_t *)
- _cairo_surface_create_similar_scratch (&dst->base,
- src->content,
- upload.width,
- upload.height);
- if (xsrc->base.type != CAIRO_SURFACE_TYPE_XLIB) {
- cairo_surface_destroy (src);
- cairo_surface_destroy (&xsrc->base);
- return None;
- }
-
- status = _cairo_xlib_surface_draw_image (xsrc, (cairo_image_surface_t *)src,
- draw_x, draw_y,
- upload.width, upload.height,
- 0, 0);
- cairo_surface_destroy (src);
-
_cairo_xlib_surface_ensure_picture (xsrc);
if (! picture_set_properties (xsrc->display,
xsrc->picture,