# HG changeset patch # User prr # Date 1533071069 25200 # Node ID 331888ea4a788df801b1edf8836646cd25fc758b # Parent 66d9993dd4adb9ee85427c5a2a3b0177d1a023d0 8204931: Colors with alpha are painted incorrectly on Linux Reviewed-by: jdv, psadhukhan diff -r 66d9993dd4ad -r 331888ea4a78 src/java.desktop/unix/classes/sun/java2d/xr/XRGraphicsConfig.java --- a/src/java.desktop/unix/classes/sun/java2d/xr/XRGraphicsConfig.java Tue Jul 31 14:03:39 2018 -0700 +++ b/src/java.desktop/unix/classes/sun/java2d/xr/XRGraphicsConfig.java Tue Jul 31 14:04:29 2018 -0700 @@ -30,9 +30,14 @@ package sun.java2d.xr; -import sun.awt.*; -import sun.awt.image.*; -import sun.java2d.*; +import java.awt.Transparency; +import sun.awt.X11GraphicsConfig; +import sun.awt.X11ComponentPeer; +import sun.awt.X11GraphicsDevice; +import sun.awt.X11GraphicsEnvironment; +import sun.awt.image.SurfaceManager; +import sun.java2d.SurfaceData; +import sun.java2d.loops.SurfaceType; public class XRGraphicsConfig extends X11GraphicsConfig implements SurfaceManager.ProxiedGraphicsConfig { @@ -58,4 +63,14 @@ public Object getProxyKey() { return this; } + + public synchronized SurfaceType getSurfaceType() { + if (surfaceType != null) { + return surfaceType; + } + + surfaceType = XRSurfaceData.getSurfaceType(this, Transparency.OPAQUE); + return surfaceType; + } + } diff -r 66d9993dd4ad -r 331888ea4a78 src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java --- a/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java Tue Jul 31 14:03:39 2018 -0700 +++ b/src/java.desktop/unix/classes/sun/java2d/xr/XRSurfaceData.java Tue Jul 31 14:04:29 2018 -0700 @@ -25,17 +25,36 @@ package sun.java2d.xr; -import java.awt.*; -import java.awt.geom.*; -import java.awt.image.*; -import sun.awt.*; +import java.awt.AlphaComposite; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.Transparency; +import java.awt.geom.AffineTransform; +import java.awt.image.ColorModel; +import java.awt.image.DirectColorModel; +import java.awt.image.Raster; +import sun.awt.SunHints; +import sun.awt.SunToolkit; +import sun.awt.X11ComponentPeer; +import sun.awt.image.PixelConverter; import sun.java2d.InvalidPipeException; import sun.java2d.SunGraphics2D; import sun.java2d.SurfaceData; import sun.java2d.SurfaceDataProxy; -import sun.java2d.loops.*; -import sun.java2d.pipe.*; -import sun.java2d.x11.*; +import sun.java2d.loops.CompositeType; +import sun.java2d.loops.MaskFill; +import sun.java2d.loops.RenderLoops; +import sun.java2d.loops.SurfaceType; +import sun.java2d.loops.XORComposite; +import sun.java2d.pipe.PixelToShapeConverter; +import sun.java2d.pipe.Region; +import sun.java2d.pipe.ShapeDrawPipe; +import sun.java2d.pipe.TextPipe; +import sun.java2d.pipe.ValidatePipe; +import sun.java2d.x11.XSurfaceData; import sun.font.FontManagerNativeLibrary; public abstract class XRSurfaceData extends XSurfaceData { @@ -63,7 +82,8 @@ public static final SurfaceType ByteA8X11 = SurfaceType.ByteGray.deriveSubType(DESC_BYTE_A8_X11); public static final SurfaceType - IntRgbX11 = SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_X11); + IntRgbX11 = SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_X11, + PixelConverter.ArgbPre.instance); public static final SurfaceType IntArgbPreX11 = SurfaceType.IntArgbPre.deriveSubType(DESC_INT_ARGB_X11); diff -r 66d9993dd4ad -r 331888ea4a78 test/jdk/java/awt/Color/AlphaColorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/java/awt/Color/AlphaColorTest.java Tue Jul 31 14:04:29 2018 -0700 @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @key headful + * @bug 8204931 + * @summary test alpha colors are blended with background. + */ + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Robot; +import javax.swing.SwingUtilities; + +public class AlphaColorTest extends Component { + + private Color color; + + public AlphaColorTest(Color c) { + this.color = c; + } + + public void paint(Graphics g) { + g.setColor(color); + g.fillRect(0, 0, getSize().width, getSize().height); + } + + public Dimension getPreferredSize() { + return getSize(); + } + + public Dimension getSize() { + return new Dimension(200, 200); + } + + public static void main(String args[]) throws Exception { + SwingUtilities.invokeAndWait(() -> createAndShowGUI()); + Robot robot = new Robot(); + robot.delay(5000); + robot.waitForIdle(); + Color c = robot.getPixelColor(frame.getX() + 100, frame.getY() + 100); + int red = c.getRed(); + frame.dispose(); + // Should be 126-128, but be tolerant of gamma correction. + if (red < 122 || red > 132) { + throw new RuntimeException("Color is not as expected. Got " + c); + } + } + + static Frame frame; + private static void createAndShowGUI() { + frame = new Frame("Alpha Color Test"); + frame.setBackground(Color.black); + Color color = new Color(255, 255, 255, 127); + frame.add("Center", new AlphaColorTest(color)); + frame.pack(); + frame.setVisible(true); + } +}