static void _copy_transformed_pattern (cairo_pattern_t *pattern, const cairo_pattern_t *original, const cairo_matrix_t *ctm_inverse) { _cairo_pattern_init_static_copy (pattern, original); if (! _cairo_matrix_is_identity (ctm_inverse)) _cairo_pattern_transform (pattern, ctm_inverse); }
static void _cairo_composite_reduce_pattern (const cairo_pattern_t *src, cairo_pattern_union_t *dst) { int tx, ty; _cairo_pattern_init_static_copy (&dst->base, src); if (dst->base.type == CAIRO_PATTERN_TYPE_SOLID) return; dst->base.filter = _cairo_pattern_analyze_filter (&dst->base, NULL), tx = ty = 0; if (_cairo_matrix_is_pixman_translation (&dst->base.matrix, dst->base.filter, &tx, &ty)) { dst->base.matrix.x0 = tx; dst->base.matrix.y0 = ty; } }
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; }
static void _copy_transformed_pattern (cairo_pattern_t *pattern, const cairo_pattern_t *original, const cairo_matrix_t *ctm_inverse) { _cairo_pattern_init_static_copy (pattern, original); /* apply device_transform first so that it is transformed by ctm_inverse */ if (original->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern; cairo_surface_t *surface; surface_pattern = (cairo_surface_pattern_t *) original; surface = surface_pattern->surface; if (_cairo_surface_has_device_transform (surface)) _cairo_pattern_transform (pattern, &surface->device_transform); } if (! _cairo_matrix_is_identity (ctm_inverse)) _cairo_pattern_transform (pattern, ctm_inverse); }