src/macosx/classes/sun/lwawt/LWCanvasPeer.java

Print this page

        

@@ -24,48 +24,91 @@
  */
 
 
 package sun.lwawt;
 
+import sun.awt.CGraphicsConfig;
+
 import java.awt.BufferCapabilities;
+import java.awt.BufferCapabilities.FlipContents;
 import java.awt.Canvas;
 import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.GraphicsConfiguration;
 import java.awt.Image;
+import java.awt.image.VolatileImage;
 import java.awt.peer.CanvasPeer;
 
 import javax.swing.JComponent;
 
 final class LWCanvasPeer extends LWComponentPeer<Component, JComponent>
         implements CanvasPeer {
 
-    LWCanvasPeer(final Canvas target, PlatformComponent platformComponent) {
+    /**
+     * The back buffer provide user with a BufferStrategy.
+     */
+    private VolatileImage backBuffer;
+
+    LWCanvasPeer(final Canvas target,
+                 final PlatformComponent platformComponent) {
         super(target, platformComponent);
     }
 
-    // ---- PEER METHODS ---- //
-
     @Override
-    public void createBuffers(int numBuffers, BufferCapabilities caps) {
-        // TODO
+    public void createBuffers(final int numBuffers,
+                              final BufferCapabilities caps) {
+        //TODO parameters should be used.
+        final CGraphicsConfig gc = (CGraphicsConfig) getGraphicsConfiguration();
+        final VolatileImage buffer = gc.createBackBufferImage(getTarget(), 0);
+        synchronized (getStateLock()) {
+            backBuffer = buffer;
+        }
     }
 
     @Override
     public Image getBackBuffer() {
-        // TODO
-        return null;
+        synchronized (getStateLock()) {
+            return backBuffer;
+        }
     }
 
     @Override
-    public void flip(int x1, int y1, int x2, int y2,
-                     BufferCapabilities.FlipContents flipAction) {
-        // TODO
+    public void flip(final int x1, final int y1, final int x2, final int y2,
+                     final FlipContents flipAction) {
+        final VolatileImage buffer = (VolatileImage) getBackBuffer();
+        if (buffer == null) {
+            throw new IllegalStateException("Buffers have not been created");
+        }
+        final Graphics g = getGraphics();
+        try {
+            g.drawImage(buffer, x1, y1, x2, y2, x1, y1, x2, y2, null);
+        } finally {
+            g.dispose();
+        }
+        if (flipAction == FlipContents.BACKGROUND) {
+            final Graphics2D bg = (Graphics2D) buffer.getGraphics();
+            try {
+                bg.setBackground(getBackground());
+                bg.clearRect(0, 0, buffer.getWidth(), buffer.getHeight());
+            } finally {
+                bg.dispose();
+            }
+        }
     }
 
     @Override
     public void destroyBuffers() {
-        // TODO
+        final Image buffer = getBackBuffer();
+        if (buffer != null) {
+            synchronized (getStateLock()) {
+                if (buffer == backBuffer) {
+                    backBuffer = null;
+                }
+            }
+            buffer.flush();
+        }
     }
 
     @Override
     public GraphicsConfiguration getAppropriateGraphicsConfiguration(
             GraphicsConfiguration gc)