summaryrefslogtreecommitdiff
path: root/src/cairo-xcb-surface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-xcb-surface.c')
-rw-r--r--src/cairo-xcb-surface.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
index 1b0e2aaee..b743cf4d8 100644
--- a/src/cairo-xcb-surface.c
+++ b/src/cairo-xcb-surface.c
@@ -256,6 +256,10 @@ _cairo_xcb_surface_create_similar (void *abstract_src,
cairo_xcb_surface_create_with_xrender_format (dpy, d,
&xrender_format,
width, height);
+ if (surface->base.status) {
+ _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ return (cairo_surface_t*) &_cairo_surface_nil;
+ }
surface->owns_pixmap = TRUE;
@@ -477,10 +481,10 @@ _get_image_surface (cairo_xcb_surface_t *surface,
masks.blue_mask = surface->visual->blue_mask;
} else if (surface->has_format) {
masks.bpp = bpp;
- masks.red_mask = surface->format.direct.red_mask << surface->format.direct.red_shift;
- masks.green_mask = surface->format.direct.green_mask << surface->format.direct.green_shift;
- masks.blue_mask = surface->format.direct.blue_mask << surface->format.direct.blue_shift;
- masks.alpha_mask = surface->format.direct.alpha_mask << surface->format.direct.alpha_shift;
+ masks.red_mask = (unsigned long)surface->format.direct.red_mask << surface->format.direct.red_shift;
+ masks.green_mask = (unsigned long)surface->format.direct.green_mask << surface->format.direct.green_shift;
+ masks.blue_mask = (unsigned long)surface->format.direct.blue_mask << surface->format.direct.blue_shift;
+ masks.alpha_mask = (unsigned long)surface->format.direct.alpha_mask << surface->format.direct.alpha_shift;
} else {
masks.bpp = bpp;
masks.red_mask = 0;
@@ -503,6 +507,8 @@ _get_image_surface (cairo_xcb_surface_t *surface,
x2 - x1,
y2 - y1,
bytes_per_line);
+ if (image->base.status)
+ goto FAIL;
} else {
/*
* XXX This can't work. We must convert the data to one of the
@@ -510,12 +516,14 @@ _get_image_surface (cairo_xcb_surface_t *surface,
* which takes data in an arbitrary format and converts it
* to something supported by that library.
*/
- image = _cairo_image_surface_create_with_masks (data,
- &masks,
- x2 - x1,
- y2 - y1,
- bytes_per_line);
-
+ image = (cairo_image_surface_t *)
+ _cairo_image_surface_create_with_masks (data,
+ &masks,
+ x2 - x1,
+ y2 - y1,
+ bytes_per_line);
+ if (image->base.status)
+ goto FAIL;
}
/* Let the surface take ownership of the data */
@@ -523,6 +531,10 @@ _get_image_surface (cairo_xcb_surface_t *surface,
*image_out = image;
return CAIRO_STATUS_SUCCESS;
+
+ FAIL:
+ free (data);
+ return CAIRO_STATUS_NO_MEMORY;
}
static void
@@ -570,6 +582,7 @@ _cairo_xcb_surface_acquire_source_image (void *abstract_surfa
return status;
*image_out = image;
+ *image_extra = NULL;
return CAIRO_STATUS_SUCCESS;
}
@@ -598,6 +611,7 @@ _cairo_xcb_surface_acquire_dest_image (void *abstract_surface
return status;
*image_out = image;
+ *image_extra = NULL;
return CAIRO_STATUS_SUCCESS;
}
@@ -637,11 +651,14 @@ _cairo_xcb_surface_clone_similar (void *abstract_surface,
} else if (_cairo_surface_is_image (src)) {
cairo_image_surface_t *image_src = (cairo_image_surface_t *)src;
cairo_content_t content = _cairo_content_from_format (image_src->format);
+
+ if (surface->base.status)
+ return surface->base.status;
clone = (cairo_xcb_surface_t *)
_cairo_xcb_surface_create_similar (surface, content,
image_src->width, image_src->height);
- if (clone == NULL)
+ if (clone->base.status)
return CAIRO_STATUS_NO_MEMORY;
_draw_image_surface (clone, image_src, 0, 0);
@@ -888,9 +905,9 @@ _cairo_xcb_surface_composite (cairo_operator_t operator,
}
if (mask)
- _cairo_pattern_release_surface (&dst->base, &mask->base, &mask_attr);
+ _cairo_pattern_release_surface (mask_pattern, &mask->base, &mask_attr);
- _cairo_pattern_release_surface (&dst->base, &src->base, &src_attr);
+ _cairo_pattern_release_surface (src_pattern, &src->base, &src_attr);
return status;
}
@@ -977,7 +994,7 @@ _cairo_xcb_surface_composite_trapezoids (cairo_operator_t operator,
render_src_y + attributes.y_offset,
num_traps, (XCBRenderTRAP *) traps);
- _cairo_pattern_release_surface (&dst->base, &src->base, &attributes);
+ _cairo_pattern_release_surface (pattern, &src->base, &attributes);
return status;
}
@@ -1062,8 +1079,10 @@ _cairo_xcb_surface_create_internal (XCBConnection *dpy,
cairo_xcb_surface_t *surface;
surface = malloc (sizeof (cairo_xcb_surface_t));
- if (surface == NULL)
- return NULL;
+ if (surface == NULL) {
+ _cairo_error (CAIRO_STATUS_NO_MEMORY);
+ return (cairo_surface_t*) &_cairo_surface_nil;
+ }
_cairo_surface_init (&surface->base, &cairo_xcb_surface_backend);