[OpenJDK 2D-Dev] 6603887: Where are transparent areas filled with bgColor?

Jim Graham Jim.A.Graham at Sun.COM
Fri Sep 28 21:31:24 UTC 2007


Perhaps the difference is that Dmitri is running on a display with Xbgr 
which has to decompose the argb value and recompose it into a BGR value 
- in the process it only moves the r, g, and b bits around.

Clemens is running on an Xrgb screen and so the pixelconverter just 
passes on the argb value as the pixel - alpha bits and all - as he 
discovered.  That's safe for most purposes since the alpha value should 
be ignored, but causes a problem with this "+1" hack.  I think we ran 
into a case internally where the extra bits of the pixel value did cause 
a problem with some of the Solaris X11 drivers, but we proposed that it 
was a violation of X protocol and the driver was fixed.

The simplest fix would probably be to just mask off the alpha in 
rgbToPixel and stop "playing with fire" by leaving the alpha bits set. 
This could also be done more specifically in the BlitBg support code 
(mask the pixel and +1 to see if it is set yet or not).  The most robust 
fix is to add a boolean as originally proposed...

			...jim

Clemens Eisserer wrote:
> Hi Dimitri,
> 
>>    I'm having issues with reproducing the bug with
>>    this or the original test.
>>    I've tried on solaris and linux, it works fine in
>>    both cases on all jdks I've tried. Weird.
>>    What is your desktop bit depth?  I've tried on 24bit
>>    systems.
> My display also has 24bit depth, when I switch to 16bit, pixel has
> some ~65535 value and everything works as expected.
> I am using Fedora7, updated once or twice, my Laptop has an Intel
> GMA950, using the i810 driver.
> 
>>    In the debugger I see that the pixel passed to
>>    X11SD_GetPixmapWithBg is 0x00ffffff, not 0xffffffff,
>>    so pixel+1 != 0 .
> Wow thats really weird, however from the pixel-point-of-view it makes
> sence - 24 bytes are 1.
> 
> I did some debugging, and that's the stack where I get the pixel-value from:
>   PixelConverter$Xrgb.rgbToPixel(int, ColorModel) line: 143
>   SurfaceType.pixelFor(int, ColorModel) line: 434
>   X11SurfaceData$X11PixmapSurfaceData(SurfaceData).pixelFor(int) line: 835
>   X11PMBlitBgLoops.BlitBg(SurfaceData, SurfaceData, Composite, Region,
> Color, int, int, int, int, int, int) line: 90
>   BlitBg$TraceBlitBg.BlitBg(SurfaceData, SurfaceData, Composite,
> Region, Color, int, int, int, int, int, int) line: 211
>   DrawImage.blitSurfaceData(SunGraphics2D, Region, SurfaceData,
> SurfaceData, SurfaceType, SurfaceType, int, int, int, int, int, int,
> Color) line: 957
>   DrawImage.renderImageCopy(SunGraphics2D, Image, Color, int, int,
> int, int, int, int) line: 575
>   DrawImage.copyImage(SunGraphics2D, Image, int, int, Color) line: 71
>   DrawImage.copyImage(SunGraphics2D, Image, int, int, Color,
> ImageObserver) line: 1008
>   SunGraphics2D.drawImage(Image, int, int, Color, ImageObserver) line: 3053
>   ImageRepresentation.drawToBufImage(Graphics, ToolkitImage, int, int,
> Color, ImageObserver) line: 764
>   DrawImage.copyImage(SunGraphics2D, Image, int, int, Color,
> ImageObserver) line: 1015
>   SunGraphics2D.drawImage(Image, int, int, Color, ImageObserver) line: 3053
>   BgRegTest.start() line: 39
>   AppletViewerPanel(AppletPanel).run() line: 476
>   Thread.run() line: 659
> 
> Its  simply returns the parameter we hand in from Color.getRGB(), my
> SurfaceData-Object is a
> sun.java2d.x11.X11SurfaceData$X11PixmapSurfaceData.
> Could it be a bug or no clear specification in
> PixelConverter$Xrgb.rgbToPixel(int, ColorModel) line: 143 be:
> 
> 	public int rgbToPixel(int rgb, ColorModel cm) {
> 	    return rgb;
> 	}
> 
> 	public int pixelToRgb(int pixel, ColorModel cm) {
> 	    return (0xff000000 | pixel);
> 	}
> 
> rgbToPixel simply returns the rgb value, but  pixelToRgb sets the
> first two bytes. The question is why doesn't it look like:
> public int rgbToPixel(int rgb, ColorModel cm) {
> 	    return rgb & 0x00ffffff;
> 	}
> 
> I am using jdk7b19, so maybe some things have changed already :-/
> 
> ------------
> 
> I wonder how the code does/should behave in the 32-bit depth case?
> Wouldn't be a -1 value be possible in this case?
> 
> lg Clemens



More information about the 2d-dev mailing list