[surface] Don't AND in the desired content.

Gah, that was a horrible mistake. It was a flawed hack to create Pixmaps
of the correct depth when cloning patterns for blitting to the xlib
backend. However, it had the nasty side-effect of discarding alpha when
targeting Window surfaces. The correct solution is to simply correct the
Pixmap of the desired depth and render a matching pattern onto the
surface - i.e. a reversal the current acquire -> clone. See the
forthcoming revised xcb backend on how I should have done it originally.
This commit is contained in:
Chris Wilson 2009-10-16 10:11:41 +01:00
parent 6a19a82efd
commit 54df07a3da
13 changed files with 10 additions and 62 deletions

View file

@ -706,7 +706,6 @@ _cairo_directfb_surface_release_dest_image (void *abstract_surf
static cairo_status_t
_cairo_directfb_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -846,7 +845,6 @@ _directfb_prepare_composite (cairo_directfb_surface_t *dst,
}
status = _cairo_pattern_acquire_surface (src_pattern, &dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
*src_x, *src_y, width, height,
CAIRO_PATTERN_ACQUIRE_NO_REFLECT,
(cairo_surface_t **) &src,

View file

@ -801,7 +801,6 @@ _cairo_gl_surface_release_dest_image (void *abstract_surface,
static cairo_status_t
_cairo_gl_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -825,7 +824,7 @@ _cairo_gl_surface_clone_similar (void *abstract_surface,
clone = (cairo_gl_surface_t *)
_cairo_gl_surface_create_similar (&surface->base,
content,
src->content,
width, height);
if (clone == NULL)
return CAIRO_INT_STATUS_UNSUPPORTED;
@ -1051,7 +1050,6 @@ _cairo_gl_pattern_texture_setup (cairo_gl_composite_operand_t *operand,
}
status = _cairo_pattern_acquire_surface (src, &dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
src_x, src_y,
width, height,
CAIRO_PATTERN_ACQUIRE_NONE,

View file

@ -332,7 +332,6 @@ _cairo_glitz_surface_release_dest_image (void *abstract_surfa
static cairo_status_t
_cairo_glitz_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -737,7 +736,6 @@ _cairo_glitz_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_int_status_t status;
status = _cairo_pattern_acquire_surface (pattern, &dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
x, y, width, height,
CAIRO_PATTERN_ACQUIRE_NONE,
(cairo_surface_t **) &src,
@ -2223,7 +2221,6 @@ _cairo_glitz_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font,
status =
_cairo_glitz_surface_clone_similar (abstract_surface,
image,
CAIRO_CONTENT_COLOR_ALPHA,
0,
0,
glyph_width,

View file

@ -854,7 +854,6 @@ _cairo_image_surface_release_dest_image (void *abstract_surfa
static cairo_status_t
_cairo_image_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -1093,7 +1092,6 @@ _cairo_image_surface_composite (cairo_operator_t op,
status = _cairo_pattern_acquire_surfaces (src_pattern, mask_pattern,
&dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
src_x, src_y,
mask_x, mask_y,
width, height,
@ -1313,7 +1311,6 @@ _cairo_image_surface_composite_trapezoids (cairo_operator_t op,
return status;
status = _cairo_pattern_acquire_surface (pattern, &dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
src_x, src_y, width, height,
CAIRO_PATTERN_ACQUIRE_NONE,
(cairo_surface_t **) &src,
@ -1565,7 +1562,6 @@ _cairo_image_surface_create_span_renderer (cairo_operator_t op,
status = _cairo_pattern_acquire_surface (
renderer->pattern, &renderer->dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
rects->src.x, rects->src.y,
width, height,
CAIRO_PATTERN_ACQUIRE_NONE,

View file

@ -1603,9 +1603,6 @@ _cairo_pattern_acquire_surface_for_gradient (const cairo_gradient_pattern_t *pat
_cairo_debug_check_image_surface_is_defined (&image->base);
status = _cairo_surface_clone_similar (dst, &image->base,
opaque ?
CAIRO_CONTENT_COLOR :
CAIRO_CONTENT_COLOR_ALPHA,
0, 0, width, height,
&clone_offset_x,
&clone_offset_y,
@ -1931,7 +1928,6 @@ _pixman_nearest_sample (double d)
static cairo_int_status_t
_cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pattern,
cairo_surface_t *dst,
cairo_content_t content,
int x,
int y,
unsigned int width,
@ -2009,7 +2005,7 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat
is_bounded = _cairo_surface_get_extents (surface, &extents);
assert (is_bounded);
status = _cairo_surface_clone_similar (dst, surface, content,
status = _cairo_surface_clone_similar (dst, surface,
extents.x, extents.y,
extents.width, extents.height,
&extents.x, &extents.y, &src);
@ -2150,7 +2146,7 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat
/* XXX can we use is_empty? */
status = _cairo_surface_clone_similar (dst, surface, content,
status = _cairo_surface_clone_similar (dst, surface,
extents.x, extents.y,
extents.width, extents.height,
&x, &y, out);
@ -2224,7 +2220,6 @@ _cairo_pattern_acquire_surface_for_surface (const cairo_surface_pattern_t *pat
cairo_int_status_t
_cairo_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_content_t content,
int x,
int y,
unsigned int width,
@ -2318,7 +2313,6 @@ _cairo_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) pattern;
status = _cairo_pattern_acquire_surface_for_surface (src, dst,
content,
x, y,
width, height,
flags,
@ -2353,7 +2347,6 @@ cairo_int_status_t
_cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
cairo_content_t src_content,
int src_x,
int src_y,
int mask_x,
@ -2391,14 +2384,13 @@ _cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
_cairo_color_multiply_alpha (&combined, mask_solid->color.alpha);
_cairo_pattern_init_solid (&src_tmp.solid, &combined,
(src_solid->content | mask_solid->content) & src_content);
src_solid->content | mask_solid->content);
src = &src_tmp.base;
mask = NULL;
}
status = _cairo_pattern_acquire_surface (src, dst,
src_content,
src_x, src_y,
width, height,
flags,
@ -2412,7 +2404,6 @@ _cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
}
status = _cairo_pattern_acquire_surface (mask, dst,
CAIRO_CONTENT_ALPHA,
mask_x, mask_y,
width, height,
flags,

View file

@ -1633,7 +1633,6 @@ _cairo_quartz_surface_create_similar (void *abstract_surface,
static cairo_status_t
_cairo_quartz_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,

View file

@ -128,7 +128,6 @@ _cairo_surface_fallback_composite_trapezoids (cairo_operator_t op,
cairo_private cairo_status_t
_cairo_surface_fallback_clone_similar (cairo_surface_t *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,

View file

@ -1835,7 +1835,6 @@ _cairo_surface_fallback_composite_trapezoids (cairo_operator_t op,
cairo_status_t
_cairo_surface_fallback_clone_similar (cairo_surface_t *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -1849,7 +1848,7 @@ _cairo_surface_fallback_clone_similar (cairo_surface_t *surface,
cairo_status_t status;
new_surface = _cairo_surface_create_similar_scratch (surface,
src->content & content,
src->content,
width, height);
if (new_surface == NULL)
return CAIRO_INT_STATUS_UNSUPPORTED;

View file

@ -1413,7 +1413,6 @@ _cairo_surface_release_dest_image (cairo_surface_t *surface,
static cairo_status_t
_cairo_meta_surface_clone_similar (cairo_surface_t *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -1428,7 +1427,7 @@ _cairo_meta_surface_clone_similar (cairo_surface_t *surface,
similar = _cairo_surface_has_snapshot (src,
surface->backend,
src->content & content);
src->content);
if (similar != NULL) {
*clone_out = cairo_surface_reference (similar);
*clone_offset_x = 0;
@ -1441,7 +1440,7 @@ _cairo_meta_surface_clone_similar (cairo_surface_t *surface,
{
/* XXX use _solid to perform an initial CLEAR? */
similar = _cairo_surface_create_similar_scratch (surface,
src->content & content,
src->content,
width, height);
if (similar == NULL)
return CAIRO_INT_STATUS_UNSUPPORTED;
@ -1457,7 +1456,7 @@ _cairo_meta_surface_clone_similar (cairo_surface_t *surface,
}
} else {
similar = _cairo_surface_create_similar_scratch (surface,
src->content & content,
src->content,
meta->extents.width,
meta->extents.height);
if (similar == NULL)
@ -1510,7 +1509,6 @@ _cairo_meta_surface_clone_similar (cairo_surface_t *surface,
cairo_status_t
_cairo_surface_clone_similar (cairo_surface_t *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -1534,14 +1532,13 @@ _cairo_surface_clone_similar (cairo_surface_t *surface,
match = _cairo_tee_surface_find_match (src,
surface->backend,
content);
src->content);
if (match != NULL)
src = match;
}
if (surface->backend->clone_similar != NULL) {
status = surface->backend->clone_similar (surface, src,
content,
src_x, src_y,
width, height,
clone_offset_x,
@ -1554,7 +1551,6 @@ _cairo_surface_clone_similar (cairo_surface_t *surface,
/* First check to see if we can replay to a similar surface */
if (_cairo_surface_is_meta (src)) {
return _cairo_meta_surface_clone_similar (surface, src,
content,
src_x, src_y,
width, height,
clone_offset_x,
@ -1567,7 +1563,6 @@ _cairo_surface_clone_similar (cairo_surface_t *surface,
if (status == CAIRO_STATUS_SUCCESS) {
status =
surface->backend->clone_similar (surface, &image->base,
content,
src_x, src_y,
width, height,
clone_offset_x,
@ -1583,7 +1578,6 @@ _cairo_surface_clone_similar (cairo_surface_t *surface,
if (status == CAIRO_INT_STATUS_UNSUPPORTED) {
status =
_cairo_surface_fallback_clone_similar (surface, src,
content,
src_x, src_y,
width, height,
clone_offset_x,

View file

@ -1317,7 +1317,6 @@ _cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst,
static cairo_status_t
_cairo_xlib_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -1350,7 +1349,7 @@ _cairo_xlib_surface_clone_similar (void *abstract_surface,
clone = (cairo_xlib_surface_t *)
_cairo_xlib_surface_create_similar (surface,
image_src->base.content & content,
image_src->base.content,
width, height);
if (clone == NULL)
return UNSUPPORTED ("unhandled image format, no similar surface");
@ -1878,7 +1877,6 @@ _render_operator (cairo_operator_t op)
static cairo_int_status_t
_cairo_xlib_surface_acquire_pattern_surface (cairo_xlib_surface_t *dst,
const cairo_pattern_t *pattern,
cairo_content_t content,
int x, int y,
int width, int height,
cairo_xlib_surface_t **surface_out,
@ -2046,7 +2044,6 @@ _cairo_xlib_surface_acquire_pattern_surface (cairo_xlib_surface_t *dst,
}
return _cairo_pattern_acquire_surface (pattern, &dst->base,
content,
x, y, width, height,
dst->buggy_pad_reflect ?
CAIRO_PATTERN_ACQUIRE_NO_REFLECT :
@ -2059,7 +2056,6 @@ static cairo_int_status_t
_cairo_xlib_surface_acquire_pattern_surfaces (cairo_xlib_surface_t *dst,
const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_content_t src_content,
int src_x,
int src_y,
int mask_x,
@ -2080,7 +2076,6 @@ _cairo_xlib_surface_acquire_pattern_surfaces (cairo_xlib_surface_t *dst,
cairo_int_status_t status;
status = _cairo_xlib_surface_acquire_pattern_surface (dst, src,
src_content,
src_x, src_y,
width, height,
src_out,
@ -2090,7 +2085,6 @@ _cairo_xlib_surface_acquire_pattern_surfaces (cairo_xlib_surface_t *dst,
if (mask) {
status = _cairo_xlib_surface_acquire_pattern_surface (dst, mask,
CAIRO_CONTENT_ALPHA,
mask_x,
mask_y,
width,
@ -2111,7 +2105,6 @@ _cairo_xlib_surface_acquire_pattern_surfaces (cairo_xlib_surface_t *dst,
return _cairo_pattern_acquire_surfaces (src, mask,
&dst->base,
src_content,
src_x, src_y,
mask_x, mask_y,
width, height,
@ -2147,7 +2140,6 @@ _cairo_xlib_surface_composite (cairo_operator_t op,
int itx, ity;
cairo_bool_t is_integer_translation;
cairo_bool_t needs_alpha_composite;
cairo_content_t src_content;
GC gc;
if (mask_pattern != NULL && ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst))
@ -2164,16 +2156,12 @@ _cairo_xlib_surface_composite (cairo_operator_t op,
_operator_needs_alpha_composite (op,
_surface_has_alpha (dst),
! _cairo_pattern_is_opaque (src_pattern));
src_content = CAIRO_CONTENT_COLOR_ALPHA;
if (! needs_alpha_composite)
src_content &= ~CAIRO_CONTENT_ALPHA;
_cairo_xlib_display_notify (dst->display);
status =
_cairo_xlib_surface_acquire_pattern_surfaces (dst,
src_pattern, mask_pattern,
src_content,
src_x, src_y,
mask_x, mask_y,
width, height,
@ -2371,7 +2359,6 @@ _cairo_xlib_surface_solid_fill_rectangles (cairo_xlib_surface_t *surface,
X_DEBUG ((surface->dpy, "solid_fill_rectangles (dst=%x)", (unsigned int) surface->drawable));
status = _cairo_pattern_acquire_surface (&solid.base, &surface->base,
CAIRO_CONTENT_COLOR_ALPHA,
0, 0,
ARRAY_LENGTH (dither_pattern[0]),
ARRAY_LENGTH (dither_pattern),
@ -2562,7 +2549,6 @@ _cairo_xlib_surface_composite_trapezoids (cairo_operator_t op,
status = _cairo_xlib_surface_acquire_pattern_surface (dst,
pattern,
CAIRO_CONTENT_COLOR_ALPHA,
src_x, src_y,
width, height,
&src, &attributes);
@ -4462,7 +4448,6 @@ _cairo_xlib_surface_show_glyphs (void *abstract_dst,
if (src_pattern->type == CAIRO_PATTERN_TYPE_SOLID) {
status = _cairo_pattern_acquire_surface (src_pattern, &dst->base,
CAIRO_CONTENT_COLOR_ALPHA,
0, 0, 1, 1,
CAIRO_PATTERN_ACQUIRE_NONE,
(cairo_surface_t **) &src,
@ -4489,7 +4474,6 @@ _cairo_xlib_surface_show_glyphs (void *abstract_dst,
}
status = _cairo_xlib_surface_acquire_pattern_surface (dst, src_pattern,
dst->base.content,
glyph_extents.x,
glyph_extents.y,
glyph_extents.width,

View file

@ -622,7 +622,6 @@ struct _cairo_surface_backend {
cairo_warn cairo_status_t
(*clone_similar) (void *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -2072,7 +2071,6 @@ _cairo_surface_release_dest_image (cairo_surface_t *surface,
cairo_private cairo_status_t
_cairo_surface_clone_similar (cairo_surface_t *surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -2569,7 +2567,6 @@ enum {
cairo_private cairo_int_status_t
_cairo_pattern_acquire_surface (const cairo_pattern_t *pattern,
cairo_surface_t *dst,
cairo_content_t content,
int x,
int y,
unsigned int width,
@ -2587,7 +2584,6 @@ cairo_private cairo_int_status_t
_cairo_pattern_acquire_surfaces (const cairo_pattern_t *src,
const cairo_pattern_t *mask,
cairo_surface_t *dst,
cairo_content_t src_content,
int src_x,
int src_y,
int mask_x,

View file

@ -172,7 +172,6 @@ _test_fallback_surface_release_dest_image (void *abstract_surface,
static cairo_status_t
_test_fallback_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,

View file

@ -166,7 +166,6 @@ _test_fallback16_surface_release_dest_image (void *abstract_surface,
static cairo_status_t
_test_fallback16_surface_clone_similar (void *abstract_surface,
cairo_surface_t *src,
cairo_content_t content,
int src_x,
int src_y,
int width,
@ -185,7 +184,6 @@ _test_fallback16_surface_clone_similar (void *abstract_surface,
return CAIRO_STATUS_SUCCESS;
} else {
return _cairo_surface_clone_similar (surface->backing, src,
content,
src_x, src_y,
width, height,
clone_offset_x, clone_offset_y,