cairo_surface_t * _cairo_xcb_surface_create_similar_image (void *abstract_other, cairo_format_t format, int width, int height) { cairo_xcb_surface_t *other = abstract_other; cairo_xcb_connection_t *connection = other->connection; cairo_xcb_shm_info_t *shm_info; cairo_image_surface_t *image; cairo_status_t status; pixman_format_code_t pixman_format; if (unlikely(width > XLIB_COORD_MAX || height > XLIB_COORD_MAX || width <= 0 || height <= 0)) return NULL; pixman_format = _cairo_format_to_pixman_format_code (format); status = _cairo_xcb_shm_image_create (connection, pixman_format, width, height, &image, &shm_info); if (unlikely (status)) return _cairo_surface_create_in_error (status); return &image->base; }
static cairo_xcb_pixmap_t * _render_to_pixmap (cairo_xcb_surface_t *target, const cairo_pattern_t *pattern, const cairo_rectangle_int_t *extents) { cairo_image_surface_t *image; cairo_xcb_shm_info_t *shm_info; cairo_pattern_union_t copy; cairo_status_t status; cairo_xcb_pixmap_t *pixmap; status = _cairo_xcb_shm_image_create (target->screen->connection, target->pixman_format, extents->width, extents->height, &image, &shm_info); if (unlikely (status)) return (cairo_xcb_pixmap_t *) _cairo_surface_create_in_error (status); _cairo_pattern_init_static_copy (©.base, pattern); cairo_matrix_translate (©.base.matrix, -extents->x, -extents->y); status = _cairo_surface_paint (&image->base, CAIRO_OPERATOR_SOURCE, ©.base, NULL); if (unlikely (status)) { cairo_surface_destroy (&image->base); return (cairo_xcb_pixmap_t *) _cairo_surface_create_in_error (status); } pixmap = _pixmap_from_image (target, target->xrender_format, image, shm_info); cairo_surface_destroy (&image->base); if (unlikely (pixmap->base.status)) return pixmap; pixmap->x0 = -extents->x; pixmap->y0 = -extents->y; return pixmap; }