Better GrayscaleDecorator ------------------------- Key: PIVOT-723 URL: https://issues.apache.org/jira/browse/PIVOT-723 Project: Pivot Issue Type: Improvement Components: wtk-effects Affects Versions: 2.0 Reporter: Bill van Melle Priority: Minor
The current GrayscaleDecorator doesn't work properly when the decorated component uses transparency -- it turns the transparent pixels black, which seems unlikely to be what you want. Here's a new version of GrayscaleDecorator#prepare that creates the BufferedImage in a transparency-aware way: public Graphics2D prepare(Component component, Graphics2D graphics) { this.graphics = graphics; int width = component.getWidth(); int height = component.getHeight(); // To convert to gray, we create a BufferedImage in the grayscale color space // into which the decorated component draws, and we output the resulting image. // The naive way to create the buffer is // new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); // but that doesn't respect transparency. Hence the following more complicated method. if (bufferedImage == null || bufferedImage.getWidth() < width || bufferedImage.getHeight() < height) { ColorSpace gsColorSpace = ColorSpace.getInstance(ColorSpace.CS_GRAY); ComponentColorModel ccm = new ComponentColorModel(gsColorSpace, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); WritableRaster raster = ccm.createCompatibleWritableRaster(width, height); bufferedImage = new BufferedImage(ccm, raster, ccm.isAlphaPremultiplied(), null); } bufferedImageGraphics = bufferedImage.createGraphics(); bufferedImageGraphics.setClip(graphics.getClip()); return bufferedImageGraphics; } -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira