1 /* 2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package sun.java2d.opengl; 27 28 import sun.lwawt.macosx.CFRetainedResource; 29 import sun.lwawt.LWWindowPeer; 30 31 import sun.java2d.SurfaceData; 32 import sun.java2d.NullSurfaceData; 33 34 import sun.awt.CGraphicsConfig; 35 36 import java.awt.Rectangle; 37 import java.awt.GraphicsConfiguration; 38 import java.awt.Transparency; 39 40 public class CGLLayer extends CFRetainedResource { 41 42 private native long nativeCreateLayer(); 43 44 private static native void validate(long layerPtr, CGLSurfaceData cglsd); 45 private static native void blitTexture(long layerPtr); 46 47 private LWWindowPeer peer; 48 49 private SurfaceData surfaceData; // represents intermediate buffer (texture) 50 51 public CGLLayer(LWWindowPeer peer) { 52 super(0, true); 53 54 setPtr(nativeCreateLayer()); 55 this.peer = peer; 56 } 57 58 public long getPointer() { 59 return ptr; 60 } 61 62 public Rectangle getBounds() { 63 return peer.getBounds(); 64 } 65 66 public GraphicsConfiguration getGraphicsConfiguration() { 67 return peer.getGraphicsConfiguration(); 68 } 69 70 public boolean isOpaque() { 71 return peer.isOpaque(); 72 } 73 74 public int getTransparency() { 75 return (peer.isOpaque() ? Transparency.OPAQUE : Transparency.TRANSLUCENT); 76 } 77 78 public Object getDestination() { 79 return peer; 80 } 81 82 public SurfaceData replaceSurfaceData() { 83 if (peer.getBounds().isEmpty()) { 84 surfaceData = NullSurfaceData.theInstance; 85 return surfaceData; 86 } 87 88 // the layer redirects all painting to the buffer's graphics 89 // and blits the buffer to the layer surface (in drawInCGLContext callback) 90 CGraphicsConfig gc = (CGraphicsConfig)peer.getGraphicsConfiguration(); 91 surfaceData = gc.createSurfaceData(this); 92 93 // the layer holds a reference to the buffer, which in 94 // turn has a reference back to this layer 95 if (surfaceData instanceof CGLSurfaceData) { 96 validate((CGLSurfaceData)surfaceData); 97 } 98 99 return surfaceData; 100 } 101 102 public SurfaceData getSurfaceData() { 103 return surfaceData; 104 } 105 106 public void validate(final CGLSurfaceData cglsd) { 107 OGLRenderQueue rq = OGLRenderQueue.getInstance(); 108 rq.lock(); 109 try { 110 validate(getPointer(), cglsd); 111 } finally { 112 rq.unlock(); 113 } 114 } 115 116 @Override 117 public void dispose() { 118 // break the connection between the layer and the buffer 119 validate(null); 120 super.dispose(); 121 } 122 123 // ---------------------------------------------------------------------- 124 // NATIVE CALLBACKS 125 // ---------------------------------------------------------------------- 126 127 private void drawInCGLContext() { 128 // tell the flusher thread not to update the intermediate buffer 129 // until we are done blitting from it 130 OGLRenderQueue rq = OGLRenderQueue.getInstance(); 131 rq.lock(); 132 try { 133 blitTexture(getPointer()); 134 } finally { 135 rq.unlock(); 136 } 137 } 138 }