# HG changeset patch # User tdv # Date 1225230434 25200 # Node ID cbd1ef3625fcab9d3e7027b083f08ce890b0e73d # Parent 830101735cdb0fe353d298ff00dfcc1e722a9743 6764257: D3D/OGL: color is not reset properly after save/restoreState() [RSL] Reviewed-by: campbell diff -r 830101735cdb -r cbd1ef3625fc jdk/src/share/classes/sun/java2d/pipe/BufferedContext.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; } diff -r 830101735cdb -r cbd1ef3625fc jdk/test/sun/java2d/pipe/hw/RSLContextInvalidationTest/RSLContextInvalidationTest.java --- /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."); + } +}