[xlib] DO_XCOPYAREA and DO_XTILE optimizations break with Window source

Cairo should include the contents of subwindows when using a Window as a
source but will clip to subwindows when using a Window as a destination.
This can be set using the GC's subwindow_mode.

XCopyArea and XFillRectangle can however only use one GC for both source
and destination. Cairo's mode is set to (the default) ClipByChildren.
This means that copying from a Window is broken, so we only allow the
optimization when we know that the source is a Pixmap.

The performance impact of this change has not been tested. It should be
small, as the code will use XRender otherwise.

If it turns out to be a bigger impact, the optimizations could be
improved by doing a two-step copy process:
1) Copy to an intermediate Pixmap with IncludeInferiors
2) Copy to the destination with ClipByChildren
(potentially omitting one one of the steps if source or destination are
known to be Pixmaps).

references:
commit 0c5d28a4e5
https://bugs.freedesktop.org/show_bug.cgi?id=12996
This commit is contained in:
Benjamin Otte 2009-08-26 21:22:07 +02:00
parent 90536ef2dd
commit 40aefac5d7

View file

@ -1765,6 +1765,7 @@ _recategorize_composite_operation (cairo_xlib_surface_t *dst,
is_integer_translation &&
src_attr->extend == CAIRO_EXTEND_NONE &&
! needs_alpha_composite &&
src->owns_pixmap &&
_surfaces_compatible (src, dst))
{
return DO_XCOPYAREA;
@ -1777,6 +1778,7 @@ _recategorize_composite_operation (cairo_xlib_surface_t *dst,
{
if (! have_mask &&
! needs_alpha_composite &&
src->owns_pixmap &&
_surfaces_compatible (dst, src))
{
return DO_XTILE;