[cairo-bugs] [Bug 12996] New: Using Cairo to blit nested Composite'd windows fails for alpha=1

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Mon Oct 29 20:14:10 PDT 2007


           Summary: Using Cairo to blit nested Composite'd windows fails for
           Product: cairo
           Version: 1.4.9
          Platform: x86-64 (AMD64)
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: xlib backend
        AssignedTo: cworth at cworth.org
        ReportedBy: njs at pobox.com
         QAContact: cairo-bugs at cairographics.org

Attached is a PyGtk test program.  It has a simple widget that simply blinks
every 500 milliseconds, and then this widget is placed into various
Composite-ful situations to see how they work.

The general strategy for this use of Composite involves at least 4 windows. 
First, there is the blinker itself, which has manual compositing enabled on it.
 This is then nested within a window owned by an 'ExposeForwarder' widget --
the purpose of this widget is to receive Damage notifications from the
composited window, and forward them on to the widget that will render the
composited window.    This, in turn is nested within a window owned by the
widget "BlinkWatcher", which is the one that actually will draw the composited
blinker.  However, it cannot draw it on its own window, because cairo does not
support IncludeInferiors on the target surface, and its drawing would be
clipped by the 'ExposeForwarder' window.  Therefore, it also creates a child
window named '_other_window', and does its actual drawing onto that.

The test program creates 5 blinkers and packs them into a vbox.  From top to
bottom, they are:
  1) a raw blinker, for comparison
  2) a blinker that is composited using paint_with_alpha(0.99)
  3) a blinker that is composited using paint_with_alpha(1)
  4) a blinker that is packed inside a secondary window, and then that
secondary window is composited using paint_with_alpha(0.99)
  5) like (4), but using paint_with_alpha(1).

(1)-(4) all display perfectly; (5) simply shows up as a black square.  From the
fact that triggering this bug requires both alpha=1 *and* putting the window
that is being drawn on as a child of the window being composited, I suspect
that Cairo's non-Render pathway is not setting IncludeInferiors correctly.

Some further evidence for this is that running through xtrace, the relevant GC
being passed to CopyArea is created as
  CreateGC cid=0x03e0003c drawable=0x03e00003
and has its clip mask tweaked from time to time, but I see no mention of
IncludeInferiors.  The calls to RenderCreatePicture, on the other hand, do
mention IncludeInferiors.

Configure bugmail: http://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug, or are watching the QA contact.

More information about the cairo-bugs mailing list