--- old/src/java.desktop/share/classes/sun/java2d/pipe/BufferedOpCodes.java 2019-09-03 13:50:38.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/java2d/pipe/BufferedOpCodes.java 2019-09-03 13:50:38.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, 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 @@ -27,7 +27,7 @@ import java.lang.annotation.Native; -public class BufferedOpCodes { +public final class BufferedOpCodes { // draw ops @Native public static final int DRAW_LINE = 10; @Native public static final int DRAW_RECT = 11; @@ -74,8 +74,6 @@ @Native public static final int INVALIDATE_CONTEXT = 75; @Native public static final int SYNC = 76; @Native public static final int RESTORE_DEVICES = 77; - @Native public static final int SAVE_STATE = 78; - @Native public static final int RESTORE_STATE = 79; // multibuffering ops @Native public static final int SWAP_BUFFERS = 80; --- old/src/java.desktop/share/classes/sun/java2d/pipe/BufferedContext.java 2019-09-03 13:50:39.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/java2d/pipe/BufferedContext.java 2019-09-03 13:50:38.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, 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 @@ -30,16 +30,27 @@ import java.awt.Composite; import java.awt.Paint; import java.awt.geom.AffineTransform; -import sun.java2d.pipe.hw.AccelSurface; +import java.lang.annotation.Native; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; + import sun.java2d.InvalidPipeException; import sun.java2d.SunGraphics2D; import sun.java2d.loops.XORComposite; -import static sun.java2d.pipe.BufferedOpCodes.*; -import static sun.java2d.pipe.BufferedRenderPipe.BYTES_PER_SPAN; +import sun.java2d.pipe.hw.AccelSurface; -import java.lang.annotation.Native; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; +import static sun.java2d.pipe.BufferedOpCodes.BEGIN_SHAPE_CLIP; +import static sun.java2d.pipe.BufferedOpCodes.END_SHAPE_CLIP; +import static sun.java2d.pipe.BufferedOpCodes.RESET_CLIP; +import static sun.java2d.pipe.BufferedOpCodes.RESET_COMPOSITE; +import static sun.java2d.pipe.BufferedOpCodes.RESET_TRANSFORM; +import static sun.java2d.pipe.BufferedOpCodes.SET_ALPHA_COMPOSITE; +import static sun.java2d.pipe.BufferedOpCodes.SET_RECT_CLIP; +import static sun.java2d.pipe.BufferedOpCodes.SET_SHAPE_CLIP_SPANS; +import static sun.java2d.pipe.BufferedOpCodes.SET_SURFACES; +import static sun.java2d.pipe.BufferedOpCodes.SET_TRANSFORM; +import static sun.java2d.pipe.BufferedOpCodes.SET_XOR_COMPOSITE; +import static sun.java2d.pipe.BufferedRenderPipe.BYTES_PER_SPAN; /** * Base context class for managing state in a single-threaded rendering @@ -77,8 +88,8 @@ */ @Native public static final int USE_MASK = (1 << 1); - protected RenderQueue rq; - protected RenderBuffer buf; + private final RenderQueue rq; + private final RenderBuffer buf; /** * This is a reference to the most recently validated BufferedContext. If @@ -172,7 +183,7 @@ * @throws InvalidPipeException if either src or dest surface is not valid * or lost */ - public void validate(AccelSurface srcData, AccelSurface dstData, + private void validate(AccelSurface srcData, AccelSurface dstData, Region clip, Composite comp, AffineTransform xform, Paint paint, SunGraphics2D sg2d, int flags) @@ -310,21 +321,6 @@ dstData.markDirty(); } - /** - * Invalidates the surfaces associated with this context. This is - * useful when the context is no longer needed, and we want to break - * the chain caused by these surface references. - * - * Note: must be called while the RenderQueue lock is held. - * - * @see RenderQueue#lock - * @see RenderQueue#unlock - */ - private void invalidateSurfaces() { - validSrcDataRef.clear(); - validDstDataRef.clear(); - } - private void setSurfaces(AccelSurface srcData, AccelSurface dstData) { @@ -433,12 +429,13 @@ * @see RenderQueue#lock * @see RenderQueue#unlock */ - public void invalidateContext() { + public final void invalidateContext() { resetTransform(); resetComposite(); resetClip(); BufferedPaints.resetPaint(rq); - invalidateSurfaces(); + validSrcDataRef.clear(); + validDstDataRef.clear(); validCompRef.clear(); validClipRef.clear(); validPaintRef.clear(); @@ -453,27 +450,7 @@ * @return a render queue * @see RenderQueue */ - public abstract RenderQueue getRenderQueue(); - - /** - * Saves the state of this context. - * It may reset the current context. - * - * Note: must be called while the RenderQueue lock is held. - * - * @see RenderQueue#lock - * @see RenderQueue#unlock - */ - public abstract void saveState(); - - /** - * Restores the native state of this context. - * It may reset the current context. - * - * Note: must be called while the RenderQueue lock is held. - * - * @see RenderQueue#lock - * @see RenderQueue#unlock - */ - public abstract void restoreState(); + public final RenderQueue getRenderQueue() { + return rq; + } } --- old/src/java.desktop/share/classes/sun/java2d/opengl/OGLContext.java 2019-09-03 13:50:40.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/java2d/opengl/OGLContext.java 2019-09-03 13:50:39.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2019, 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 @@ -25,26 +25,24 @@ package sun.java2d.opengl; +import java.lang.annotation.Native; + import sun.java2d.pipe.BufferedContext; import sun.java2d.pipe.RenderBuffer; import sun.java2d.pipe.RenderQueue; import sun.java2d.pipe.hw.ContextCapabilities; -import static sun.java2d.pipe.BufferedOpCodes.*; -import static sun.java2d.pipe.hw.ContextCapabilities.*; -import java.lang.annotation.Native; +import static sun.java2d.pipe.BufferedOpCodes.INVALIDATE_CONTEXT; +import static sun.java2d.pipe.BufferedOpCodes.SET_SCRATCH_SURFACE; /** * Note that the RenderQueue lock must be acquired before calling any of * the methods in this class. */ -public class OGLContext extends BufferedContext { +final class OGLContext extends BufferedContext { - private final OGLGraphicsConfig config; - - OGLContext(RenderQueue rq, OGLGraphicsConfig config) { + OGLContext(RenderQueue rq) { super(rq); - this.config = config; } /** @@ -111,10 +109,6 @@ rq.flushNow(); } - public RenderQueue getRenderQueue() { - return OGLRenderQueue.getInstance(); - } - /** * Returns a string representing adapter id (vendor, renderer, version). * Must be called on the rendering thread. @@ -123,38 +117,6 @@ */ static final native String getOGLIdString(); - @Override - public void saveState() { - // assert rq.lock.isHeldByCurrentThread(); - - // reset all attributes of this and current contexts - invalidateContext(); - invalidateCurrentContext(); - - setScratchSurface(config); - - // save the state on the native level - rq.ensureCapacity(4); - buf.putInt(SAVE_STATE); - rq.flushNow(); - } - - @Override - public void restoreState() { - // assert rq.lock.isHeldByCurrentThread(); - - // reset all attributes of this and current contexts - invalidateContext(); - invalidateCurrentContext(); - - setScratchSurface(config); - - // restore the state on the native level - rq.ensureCapacity(4); - buf.putInt(RESTORE_STATE); - rq.flushNow(); - } - static class OGLContextCaps extends ContextCapabilities { /** * Indicates the presence of the GL_EXT_framebuffer_object extension. --- old/src/java.desktop/windows/classes/sun/java2d/d3d/D3DContext.java 2019-09-03 13:50:41.000000000 -0700 +++ new/src/java.desktop/windows/classes/sun/java2d/d3d/D3DContext.java 2019-09-03 13:50:40.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, 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 @@ -26,19 +26,20 @@ package sun.java2d.d3d; import java.lang.annotation.Native; + import sun.java2d.pipe.BufferedContext; import sun.java2d.pipe.RenderBuffer; import sun.java2d.pipe.RenderQueue; import sun.java2d.pipe.hw.ContextCapabilities; -import static sun.java2d.pipe.BufferedOpCodes.*; -import static sun.java2d.pipe.hw.ContextCapabilities.*; -import static sun.java2d.d3d.D3DContext.D3DContextCaps.*; + +import static sun.java2d.pipe.BufferedOpCodes.INVALIDATE_CONTEXT; +import static sun.java2d.pipe.BufferedOpCodes.SET_SCRATCH_SURFACE; /** * Note that the RenderQueue lock must be acquired before calling any of * the methods in this class. */ -class D3DContext extends BufferedContext { +final class D3DContext extends BufferedContext { private final D3DGraphicsDevice device; @@ -101,42 +102,6 @@ buf.putInt(d3dc.getDevice().getScreen()); } - public RenderQueue getRenderQueue() { - return D3DRenderQueue.getInstance(); - } - - @Override - public void saveState() { - // assert rq.lock.isHeldByCurrentThread(); - - // reset all attributes of this and current contexts - invalidateContext(); - invalidateCurrentContext(); - - setScratchSurface(this); - - // save the state on the native level - rq.ensureCapacity(4); - buf.putInt(SAVE_STATE); - rq.flushNow(); - } - - @Override - public void restoreState() { - // assert rq.lock.isHeldByCurrentThread(); - - // reset all attributes of this and current contexts - invalidateContext(); - invalidateCurrentContext(); - - setScratchSurface(this); - - // restore the state on the native level - rq.ensureCapacity(4); - buf.putInt(RESTORE_STATE); - rq.flushNow(); - } - D3DGraphicsDevice getDevice() { return device; } --- old/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java 2019-09-03 13:50:42.000000000 -0700 +++ new/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java 2019-09-03 13:50:41.000000000 -0700 @@ -75,7 +75,7 @@ private BufferCapabilities bufferCaps; private long pConfigInfo; private ContextCapabilities oglCaps; - private OGLContext context; + private final OGLContext context; private final Object disposerReferent = new Object(); private final int maxTextureSize; @@ -105,7 +105,7 @@ this.pConfigInfo = configInfo; this.oglCaps = oglCaps; this.maxTextureSize = maxTextureSize; - context = new OGLContext(OGLRenderQueue.getInstance(), this); + context = new OGLContext(OGLRenderQueue.getInstance()); // add a record to the Disposer so that we destroy the native // CGLGraphicsConfigInfo data when this object goes away --- old/src/java.desktop/unix/classes/sun/java2d/opengl/GLXGraphicsConfig.java 2019-09-03 13:50:43.000000000 -0700 +++ new/src/java.desktop/unix/classes/sun/java2d/opengl/GLXGraphicsConfig.java 2019-09-03 13:50:42.000000000 -0700 @@ -71,7 +71,7 @@ private BufferCapabilities bufferCaps; private long pConfigInfo; private ContextCapabilities oglCaps; - private OGLContext context; + private final OGLContext context; private static native long getGLXConfigInfo(int screennum, int visualnum); private static native int getOGLCapabilities(long configInfo); @@ -85,7 +85,7 @@ pConfigInfo = configInfo; initConfig(getAData(), configInfo); this.oglCaps = oglCaps; - context = new OGLContext(OGLRenderQueue.getInstance(), this); + context = new OGLContext(OGLRenderQueue.getInstance()); } @Override --- old/src/java.desktop/windows/classes/sun/java2d/opengl/WGLGraphicsConfig.java 2019-09-03 13:50:44.000000000 -0700 +++ new/src/java.desktop/windows/classes/sun/java2d/opengl/WGLGraphicsConfig.java 2019-09-03 13:50:43.000000000 -0700 @@ -71,7 +71,7 @@ private BufferCapabilities bufferCaps; private long pConfigInfo; private ContextCapabilities oglCaps; - private OGLContext context; + private final OGLContext context; private Object disposerReferent = new Object(); public static native int getDefaultPixFmt(int screennum); @@ -90,7 +90,7 @@ super(device, visualnum); this.pConfigInfo = configInfo; this.oglCaps = oglCaps; - context = new OGLContext(OGLRenderQueue.getInstance(), this); + context = new OGLContext(OGLRenderQueue.getInstance()); // add a record to the Disposer so that we destroy the native // WGLGraphicsConfigInfo data when this object goes away --- old/src/java.desktop/share/native/common/java2d/opengl/OGLRenderQueue.c 2019-09-03 13:50:45.000000000 -0700 +++ new/src/java.desktop/share/native/common/java2d/opengl/OGLRenderQueue.c 2019-09-03 13:50:44.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, 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 @@ -502,31 +502,6 @@ dstOps = NULL; } break; - case sun_java2d_pipe_BufferedOpCodes_SAVE_STATE: - { - j2d_glPushAttrib(GL_ALL_ATTRIB_BITS); - j2d_glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); - j2d_glMatrixMode(GL_MODELVIEW); - j2d_glPushMatrix(); - j2d_glMatrixMode(GL_PROJECTION); - j2d_glPushMatrix(); - j2d_glMatrixMode(GL_TEXTURE); - j2d_glPushMatrix(); - } - break; - - case sun_java2d_pipe_BufferedOpCodes_RESTORE_STATE: - { - j2d_glPopAttrib(); - j2d_glPopClientAttrib(); - j2d_glMatrixMode(GL_MODELVIEW); - j2d_glPopMatrix(); - j2d_glMatrixMode(GL_PROJECTION); - j2d_glPopMatrix(); - j2d_glMatrixMode(GL_TEXTURE); - j2d_glPopMatrix(); - } - break; case sun_java2d_pipe_BufferedOpCodes_SYNC: { sync = JNI_TRUE; --- old/src/java.desktop/windows/native/libawt/java2d/d3d/D3DRenderQueue.cpp 2019-09-03 13:50:45.000000000 -0700 +++ new/src/java.desktop/windows/native/libawt/java2d/d3d/D3DRenderQueue.cpp 2019-09-03 13:50:45.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, 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 @@ -677,23 +677,6 @@ } } break; - - case sun_java2d_pipe_BufferedOpCodes_SAVE_STATE: - { - CONTINUE_IF_NULL(d3dc); - - res = d3dc->SaveState(); - } - break; - - case sun_java2d_pipe_BufferedOpCodes_RESTORE_STATE: - { - CONTINUE_IF_NULL(d3dc); - - res = d3dc->RestoreState(); - } - break; - // multibuffering ops case sun_java2d_pipe_BufferedOpCodes_SWAP_BUFFERS: { --- old/src/java.desktop/windows/native/libawt/java2d/d3d/D3DContext.cpp 2019-09-03 13:50:46.000000000 -0700 +++ new/src/java.desktop/windows/native/libawt/java2d/d3d/D3DContext.cpp 2019-09-03 13:50:46.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, 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 @@ -685,64 +685,6 @@ return res; } -HRESULT -D3DContext::SaveState() -{ - HRESULT res; - - RETURN_STATUS_IF_NULL(pd3dDevice, S_OK); - - J2dTraceLn(J2D_TRACE_INFO, "D3DContext::SaveState"); - - FlushVertexQueue(); - UpdateState(STATE_CHANGE); - - if (pStateBlock != NULL) { - J2dTraceLn(J2D_TRACE_WARNING, - "D3DContext::SaveState: existing state block!"); - SAFE_RELEASE(pStateBlock); - } - - if (SUCCEEDED(res = - pd3dDevice->CreateStateBlock(D3DSBT_ALL, &pStateBlock))) - { - J2dTraceLn(J2D_TRACE_VERBOSE, " created state block"); - } else { - J2dTraceLn(J2D_TRACE_WARNING, - "D3DContext::SaveState: failed to create state block"); - } - ZeroMemory(lastTexture, sizeof(lastTexture)); - - return res; -} - -HRESULT -D3DContext::RestoreState() -{ - HRESULT res = S_OK; - - J2dTraceLn(J2D_TRACE_INFO, "D3DContext::RestoreState"); - - FlushVertexQueue(); - UpdateState(STATE_CHANGE); - - if (pStateBlock != NULL) { - if (SUCCEEDED(res = pStateBlock->Apply())) { - J2dTraceLn(J2D_TRACE_VERBOSE, " restored device state"); - } else { - J2dTraceLn(J2D_TRACE_WARNING, - "D3DContext::RestoreState: failed to restore state"); - } - SAFE_RELEASE(pStateBlock); - } else { - J2dTraceLn(J2D_TRACE_WARNING, - "D3DContext::RestoreState: empty state block!"); - } - ZeroMemory(lastTexture, sizeof(lastTexture)); - - return res; -} - #define POINT_FILTER_CAP (D3DPTFILTERCAPS_MAGFPOINT|D3DPTFILTERCAPS_MINFPOINT) #define LINEAR_FILTER_CAP (D3DPTFILTERCAPS_MAGFLINEAR|D3DPTFILTERCAPS_MINFLINEAR) --- old/src/java.desktop/windows/native/libawt/java2d/d3d/D3DContext.h 2019-09-03 13:50:47.000000000 -0700 +++ new/src/java.desktop/windows/native/libawt/java2d/d3d/D3DContext.h 2019-09-03 13:50:47.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, 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 @@ -133,13 +133,6 @@ HRESULT ResetContext(); HRESULT CheckAndResetDevice(); - // saves the state of the D3D device in a state block, resets - // context's state to STATE_CHANGE - HRESULT SaveState(); - // restores the state of the D3D device from existing state block, - // resets context's state to STATE_CHANGE - HRESULT RestoreState(); - void ReleaseContextResources(); void ReleaseDefPoolResources(); virtual ~D3DContext(); --- old/test/jdk/sun/java2d/pipe/hw/RSLAPITest/RSLAPITest.java 2019-09-03 13:50:48.000000000 -0700 +++ new/test/jdk/sun/java2d/pipe/hw/RSLAPITest/RSLAPITest.java 2019-09-03 13:50:48.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2019, 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 @@ -44,7 +44,6 @@ import java.util.HashSet; import sun.java2d.DestSurfaceProvider; import sun.java2d.Surface; -import sun.java2d.pipe.BufferedContext; import sun.java2d.pipe.RenderQueue; import sun.java2d.pipe.hw.AccelGraphicsConfig; import sun.java2d.pipe.hw.AccelSurface; @@ -161,8 +160,6 @@ AccelGraphicsConfig agc = (AccelGraphicsConfig) gc; printAGC(agc); - testContext(agc); - VolatileImage vi = gc.createCompatibleVolatileImage(10, 10); vi.validate(gc); if (vi instanceof DestSurfaceProvider) { @@ -250,22 +247,6 @@ } } - private static void testContext(final AccelGraphicsConfig agc) { - BufferedContext c = agc.getContext(); - - RenderQueue rq = c.getRenderQueue(); - rq.lock(); - try { - c.saveState(); - rq.flushNow(); - c.restoreState(); - rq.flushNow(); - System.out.println("Passed: Save/Restore"); - } finally { - rq.unlock(); - } - } - private static void testForNPEDuringCreation(AccelGraphicsConfig agc) { int iterations = 100; HashSet vis = new HashSet(); --- old/test/jdk/sun/java2d/pipe/hw/RSLContextInvalidationTest/RSLContextInvalidationTest.java 2019-09-03 13:50:49.000000000 -0700 +++ /dev/null 2019-09-03 13:50:49.000000000 -0700 @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2007, 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 6764257 8198613 - * @summary Tests that the color is reset properly after save/restore context - * @author Dmitri.Trembovetski@sun.com: area=Graphics - * @modules java.desktop/sun.java2d - * java.desktop/sun.java2d.pipe - * java.desktop/sun.java2d.pipe.hw - * @compile -XDignore.symbol.file=true RSLContextInvalidationTest.java - * @run main/othervm RSLContextInvalidationTest - * @run main/othervm -Dsun.java2d.noddraw=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."); - } -}