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 27 package sun.lwawt; 28 29 import sun.awt.CGraphicsConfig; 30 31 import java.awt.BufferCapabilities; 32 import java.awt.BufferCapabilities.FlipContents; 33 import java.awt.Canvas; 34 import java.awt.Component; 35 import java.awt.Graphics; 36 import java.awt.Graphics2D; 37 import java.awt.GraphicsConfiguration; 38 import java.awt.Image; 39 import java.awt.image.VolatileImage; 40 import java.awt.peer.CanvasPeer; 41 42 import javax.swing.JComponent; 43 44 final class LWCanvasPeer extends LWComponentPeer<Component, JComponent> 45 implements CanvasPeer { 46 47 /** 48 * The back buffer provide user with a BufferStrategy. 49 */ 50 private VolatileImage backBuffer; 51 52 LWCanvasPeer(final Canvas target, 53 final PlatformComponent platformComponent) { 54 super(target, platformComponent); 55 } 56 57 @Override 58 public void createBuffers(final int numBuffers, 59 final BufferCapabilities caps) { 60 //TODO parameters should be used. 61 final CGraphicsConfig gc = (CGraphicsConfig) getGraphicsConfiguration(); 62 final VolatileImage buffer = gc.createBackBufferImage(getTarget(), 0); 63 synchronized (getStateLock()) { 64 backBuffer = buffer; 65 } 66 } 67 68 @Override 69 public Image getBackBuffer() { 70 synchronized (getStateLock()) { 71 return backBuffer; 72 } 73 } 74 75 @Override 76 public void flip(final int x1, final int y1, final int x2, final int y2, 77 final FlipContents flipAction) { 78 final VolatileImage buffer = (VolatileImage) getBackBuffer(); 79 if (buffer == null) { 80 throw new IllegalStateException("Buffers have not been created"); 81 } 82 final Graphics g = getGraphics(); 83 try { 84 g.drawImage(buffer, x1, y1, x2, y2, x1, y1, x2, y2, null); 85 } finally { 86 g.dispose(); 87 } 88 if (flipAction == FlipContents.BACKGROUND) { 89 final Graphics2D bg = (Graphics2D) buffer.getGraphics(); 90 try { 91 bg.setBackground(getBackground()); 92 bg.clearRect(0, 0, buffer.getWidth(), buffer.getHeight()); 93 } finally { 94 bg.dispose(); 95 } 96 } 97 } 98 99 @Override 100 public void destroyBuffers() { 101 final Image buffer = getBackBuffer(); 102 if (buffer != null) { 103 synchronized (getStateLock()) { 104 if (buffer == backBuffer) { 105 backBuffer = null; 106 } 107 } 108 buffer.flush(); 109 } 110 } 111 112 @Override 113 public GraphicsConfiguration getAppropriateGraphicsConfiguration( 114 GraphicsConfiguration gc) 115 { 116 // TODO 117 return gc; 118 } 119 }