Series Reviewed-by: Jeremy Huddleston <[email protected]> Thanks for this cleanup effort Jamey, rootless is a big ball of ugly. I was hoping we would kill it off soon... but it looks like it will be with us for a while now, so this is very much appreciated.
On Jul 15, 2010, at 09:28, Jamey Sharp wrote: > The settings for each platform in rootlessConfig.h were misleading. On > Apple builds, ROOTLESS_PROTECT_ALPHA was defined to TRUE; on Windows it > was defined to NO. Both cases enabled alpha channel protection though, > because the test in rootlessGC.c was a simple #ifdef. > > Colin Harrison says that for Xming builds he's always patched it to > define ROOTLESS_PROTECT_ALPHA to TRUE for Windows as well, and that > unconditionally enabling alpha-channel protection would be appropriate. > > Signed-off-by: Jamey Sharp <[email protected]> > Cc: Jeremy Huddleston <[email protected]> > Cc: Jon TURNEY <[email protected]> > Cc: Colin Harrison <[email protected]> > --- > miext/rootless/README.txt | 34 ++++++++++++++++------------------ > miext/rootless/rootlessConfig.h | 2 -- > miext/rootless/rootlessGC.c | 15 +++++---------- > 3 files changed, 21 insertions(+), 30 deletions(-) > > diff --git a/miext/rootless/README.txt b/miext/rootless/README.txt > index 754715d..cea2c01 100644 > --- a/miext/rootless/README.txt > +++ b/miext/rootless/README.txt > @@ -76,13 +76,12 @@ rootlessConfig.h to specify compile time options for its > platform. > The following compile-time options are defined in > rootlessConfig.h: > > - o ROOTLESS_PROTECT_ALPHA: By default for a color bit depth of 24 and > - 32 bits per pixel, fb will overwrite the "unused" 8 bits to optimize > - drawing speed. If this is true, the alpha channel of frames is > - protected and is not modified when drawing to them. The bits > - containing the alpha channel are defined by the macro > - RootlessAlphaMask(bpp), which should return a bit mask for > - various bits per pixel. > + o RootlessAlphaMask(bpp): By default for a color bit depth of 24 and 32 > + bits per pixel, fb will overwrite the "unused" 8 bits to optimize > + drawing speed. Rootless ensures that the alpha channel of frames is > + protected and is not modified when drawing to them. The bits > + containing the alpha channel are defined by this macro, which should > + return a bit mask for various bits per pixel. > > o ROOTLESS_REDISPLAY_DELAY: Time in milliseconds between updates to > the underlying window server. Most operations will be buffered until > @@ -126,17 +125,16 @@ functions should be used instead of fb. > > Alpha Channel Protection > > - If the bits per pixel is greater then the color bit depth, the contents > -of the extra bits are undefined by the X11 protocol. Some window systems > -will use these extra bits as an alpha channel. The generic rootless layer > can > -be configured to protect these bits and make sure they are not modified by > -other parts of the X server. To protect the alpha channel > -ROOTLESS_PROTECT_ALPHA and RootlessAlphaMask(bpp) must be > -set appropriately as described under the compile time options. This > -ensures that the X11 graphics primitives do not overwrite the alpha > -channel in an attempt to optimize drawing. In addition, the window > -functions PaintWindow() and Composite() must be replaced by alpha > -channel safe variants. These are provided in rootless/safeAlpha. > + If the bits per pixel is greater then the color bit depth, the > +contents of the extra bits are undefined by the X11 protocol. Some window > +systems will use these extra bits as an alpha channel. The generic rootless > +layer will protect these bits and make sure they are not modified by other > +parts of the X server. To protect the alpha channel RootlessAlphaMask(bpp) > +must be set appropriately as described under the compile time options. This > +ensures that the X11 graphics primitives do not overwrite the alpha channel > +in an attempt to optimize drawing. In addition, the window functions > +PaintWindow() and Composite() must be replaced by alpha channel safe > +variants. These are provided in rootless/safeAlpha. > > > Credits > diff --git a/miext/rootless/rootlessConfig.h b/miext/rootless/rootlessConfig.h > index a6c0d25..222be53 100644 > --- a/miext/rootless/rootlessConfig.h > +++ b/miext/rootless/rootlessConfig.h > @@ -36,7 +36,6 @@ > > #ifdef __APPLE__ > > -# define ROOTLESS_PROTECT_ALPHA TRUE > # define ROOTLESS_REDISPLAY_DELAY 10 > # define ROOTLESS_RESIZE_GRAVITY TRUE > /*# define ROOTLESSDEBUG*/ > @@ -50,7 +49,6 @@ > > #if defined(__CYGWIN__) || defined(WIN32) > > -# define ROOTLESS_PROTECT_ALPHA NO > # define ROOTLESS_REDISPLAY_DELAY 10 > # undef ROOTLESS_RESIZE_GRAVITY > /*# define ROOTLESSDEBUG*/ > diff --git a/miext/rootless/rootlessGC.c b/miext/rootless/rootlessGC.c > index 68a9dc7..a9cb413 100644 > --- a/miext/rootless/rootlessGC.c > +++ b/miext/rootless/rootlessGC.c > @@ -148,12 +148,11 @@ static GCOps rootlessGCOps = { > }; > > /* > - If ROOTLESS_PROTECT_ALPHA is set, we have to make sure that the alpha > - channel of the on screen windows is always opaque. fb makes this harder > - than it would otherwise be by noticing that a planemask of 0x00ffffff > - includes all bits when depth==24, and so it "optimizes" the planemask to > - 0xffffffff. We work around this by temporarily setting depth=bpp while > - changing the GC. > + We have to make sure that the alpha channel of the on screen windows is > + always opaque. fb makes this harder than it would otherwise be by > + noticing that a planemask of 0x00ffffff includes all bits when > + depth==24, and so it "optimizes" the planemask to 0xffffffff. We work > + around this by temporarily setting depth=bpp while changing the GC. > > So the normal situation (in 32 bit mode) is that the planemask is > 0x00ffffff and thus fb leaves the alpha channel alone. The rootless > @@ -331,7 +330,6 @@ RootlessValidateGC(GCPtr pGC, unsigned long changes, > DrawablePtr pDrawable) > > if (pDrawable->type == DRAWABLE_WINDOW) > { > -#ifdef ROOTLESS_PROTECT_ALPHA > unsigned int depth = pDrawable->depth; > > // We force a planemask so fb doesn't overwrite the alpha channel. > @@ -340,9 +338,6 @@ RootlessValidateGC(GCPtr pGC, unsigned long changes, > DrawablePtr pDrawable) > pGC->planemask &= ~RootlessAlphaMask(pDrawable->bitsPerPixel); > VALIDATE_GC(pGC, changes | GCPlaneMask, pDrawable); > pDrawable->depth = depth; > -#else > - VALIDATE_GC(pGC, changes, pDrawable); > -#endif > } else { > pGC->funcs->ValidateGC(pGC, changes, pDrawable); > } > -- > 1.7.0 > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
