6764257: D3D/OGL: color is not reset properly after save/restoreState() [RSL]
authortdv
Tue, 28 Oct 2008 14:47:14 -0700
changeset 1732 cbd1ef3625fc
parent 1731 830101735cdb
child 1733 95c41a86eac9
6764257: D3D/OGL: color is not reset properly after save/restoreState() [RSL] Reviewed-by: campbell
jdk/src/share/classes/sun/java2d/pipe/BufferedContext.java
jdk/test/sun/java2d/pipe/hw/RSLContextInvalidationTest/RSLContextInvalidationTest.java
--- a/jdk/src/share/classes/sun/java2d/pipe/BufferedContext.java	Tue Oct 28 14:40:58 2008 -0700
+++ b/jdk/src/share/classes/sun/java2d/pipe/BufferedContext.java	Tue Oct 28 14:47:14 2008 -0700
@@ -90,7 +90,8 @@
     private Region          validatedClip;
     private Composite       validatedComp;
     private Paint           validatedPaint;
-    private boolean         isValidatedPaintAColor;
+    // renamed from isValidatedPaintAColor as part of a work around for 6764257
+    private boolean         isValidatedPaintJustAColor;
     private int             validatedRGB;
     private int             validatedFlags;
     private boolean         xformInUse;
@@ -182,7 +183,7 @@
         if (paint instanceof Color) {
             // REMIND: not 30-bit friendly
             int newRGB = ((Color)paint).getRGB();
-            if (isValidatedPaintAColor) {
+            if (isValidatedPaintJustAColor) {
                 if (newRGB != validatedRGB) {
                     validatedRGB = newRGB;
                     updatePaint = true;
@@ -190,13 +191,13 @@
             } else {
                 validatedRGB = newRGB;
                 updatePaint = true;
-                isValidatedPaintAColor = true;
+                isValidatedPaintJustAColor = true;
             }
         } else if (validatedPaint != paint) {
             updatePaint = true;
             // this should be set when we are switching from paint to color
             // in which case this condition will be true
-            isValidatedPaintAColor = false;
+            isValidatedPaintJustAColor = false;
         }
 
         if ((currentContext != this) ||
@@ -281,7 +282,7 @@
             txChanged = true;
         }
         // non-Color paints may require paint revalidation
-        if (!isValidatedPaintAColor && txChanged) {
+        if (!isValidatedPaintJustAColor && txChanged) {
             updatePaint = true;
         }
 
@@ -427,10 +428,12 @@
         resetTransform();
         resetComposite();
         resetClip();
+        BufferedPaints.resetPaint(rq);
         invalidateSurfaces();
         validatedComp = null;
         validatedClip = null;
         validatedPaint = null;
+        isValidatedPaintJustAColor = false;
         xformInUse = false;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/pipe/hw/RSLContextInvalidationTest/RSLContextInvalidationTest.java	Tue Oct 28 14:47:14 2008 -0700
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2007-2008 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6764257
+ * @summary Tests that the color is reset properly after save/restore context
+ * @author Dmitri.Trembovetski@sun.com: area=Graphics
+ * @compile -XDignore.symbol.file=true RSLContextInvalidationTest.java
+ * @run main/othervm RSLContextInvalidationTest
+ * @run main/othervm -Dsun.java2d.noddraw=true RSLContextInvalidationTest
+ * @run main/othervm -Dsun.java2d.opengl=True RSLContextInvalidationTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.image.BufferedImage;
+import java.awt.image.VolatileImage;
+import sun.java2d.DestSurfaceProvider;
+import sun.java2d.Surface;
+import sun.java2d.pipe.RenderQueue;
+import sun.java2d.pipe.hw.*;
+
+public class RSLContextInvalidationTest {
+
+    public static void main(String[] args) {
+        GraphicsEnvironment ge =
+            GraphicsEnvironment.getLocalGraphicsEnvironment();
+        GraphicsDevice gd = ge.getDefaultScreenDevice();
+        GraphicsConfiguration gc = gd.getDefaultConfiguration();
+        VolatileImage vi = gc.createCompatibleVolatileImage(100, 100);
+        vi.validate(gc);
+        VolatileImage vi1 = gc.createCompatibleVolatileImage(100, 100);
+        vi1.validate(gc);
+
+        if (!(vi instanceof DestSurfaceProvider)) {
+            System.out.println("Test considered PASSED: no HW acceleration");
+            return;
+        }
+
+        DestSurfaceProvider p = (DestSurfaceProvider)vi;
+        Surface s = p.getDestSurface();
+        if (!(s instanceof AccelSurface)) {
+            System.out.println("Test considered PASSED: no HW acceleration");
+            return;
+        }
+        AccelSurface dst = (AccelSurface)s;
+
+        Graphics g = vi.createGraphics();
+        g.drawImage(vi1, 95, 95, null);
+        g.setColor(Color.red);
+        g.fillRect(0, 0, 100, 100);
+        g.setColor(Color.black);
+        g.fillRect(0, 0, 100, 100);
+        // after this the validated context color is black
+
+        RenderQueue rq = dst.getContext().getRenderQueue();
+        rq.lock();
+        try {
+            dst.getContext().saveState();
+            dst.getContext().restoreState();
+        } finally {
+            rq.unlock();
+        }
+
+        // this will cause ResetPaint (it will set color to extended EA=ff,
+        // which is ffffffff==Color.white)
+        g.drawImage(vi1, 95, 95, null);
+
+        // now try filling with black again, but it will come up as white
+        // because this fill rect won't validate the color properly
+        g.setColor(Color.black);
+        g.fillRect(0, 0, 100, 100);
+
+        BufferedImage bi = vi.getSnapshot();
+        if (bi.getRGB(50, 50) != Color.black.getRGB()) {
+            throw new RuntimeException("Test FAILED: found color="+
+                Integer.toHexString(bi.getRGB(50, 50))+" instead of "+
+                Integer.toHexString(Color.black.getRGB()));
+        }
+
+        System.out.println("Test PASSED.");
+    }
+}