diff options
Diffstat (limited to 'src/cairo-xcb-surface.c')
-rw-r--r-- | src/cairo-xcb-surface.c | 51 |
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); |