2 Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
41 import java.awt.image.BufferStrategy;
42 import java.awt.peer.ComponentPeer;
43 import java.io.Serializable;
45 import javax.accessibility.Accessible;
46 import javax.accessibility.AccessibleContext;
47 import javax.accessibility.AccessibleRole;
50 * The <code>Canvas</code> component provides a blank rectangular
51 * area, which the client application can use for drawing and for
52 * capturing events. By overriding the <code>paint()</code> method,
53 * the canvas can be used for anything from simple line drawings to
54 * full-scale custom components.
56 * @author Original author unknown
57 * @author Tom Tromey (tromey@redhat.com)
58 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
64 implements Serializable, Accessible
68 * Compatible with Sun's JDK.
70 private static final long serialVersionUID = -2284879212465893870L;
73 * The number used to generate the name returned by getName.
75 private static transient long next_canvas_number;
78 * The buffer strategy associated with this canvas.
80 transient BufferStrategy bufferStrategy;
83 * Initializes a new instance of <code>Canvas</code>.
90 * Initializes a new instance of <code>Canvas</code>
91 * with the supplied graphics configuration.
93 * @param graphicsConfiguration the graphics configuration to use
94 * for this particular canvas.
96 public Canvas(GraphicsConfiguration graphicsConfiguration)
98 this.graphicsConfig = graphicsConfiguration;
102 * Creates the native peer for this object.
104 public void addNotify()
107 peer = (ComponentPeer) getToolkit().createCanvas(this);
112 * Repaints the canvas window. This method should be overridden by
113 * a subclass to do something useful, as this method simply paints
114 * the window with the background color.
116 * @param gfx the <code>Graphics</code> to use for painting
118 public void paint(Graphics gfx)
120 /* This implementation doesn't make much sense since the filling
121 of background color is guaranteed for heavyweight components
122 such as this. But there's no need to worry, since paint() is
123 usually overridden anyway. */
124 gfx.setColor(getBackground());
125 Dimension size = getSize();
126 gfx.fillRect(0, 0, size.width, size.height);
130 * This class provides accessibility support for the canvas.
132 protected class AccessibleAWTCanvas
133 extends AccessibleAWTComponent
136 * For compatability with Sun's JDK
138 private static final long serialVersionUID = -6325592262103146699L;
141 * Constructor for the accessible canvas.
143 protected AccessibleAWTCanvas()
148 * Returns the accessible role for the canvas.
150 * @return an instance of <code>AccessibleRole</code>, describing
151 * the role of the canvas.
153 public AccessibleRole getAccessibleRole()
155 return AccessibleRole.CANVAS;
161 * Gets the AccessibleContext associated with this <code>Canvas</code>.
162 * The context is created, if necessary.
164 * @return the associated context
166 public AccessibleContext getAccessibleContext()
168 /* Create the context if this is the first request */
169 if (accessibleContext == null)
170 accessibleContext = new AccessibleAWTCanvas();
171 return accessibleContext;
175 * A BltBufferStrategy for canvases.
177 private class CanvasBltBufferStrategy extends BltBufferStrategy
180 * Creates a block transfer strategy for this canvas.
182 * @param numBuffers the number of buffers in this strategy
183 * @param accelerated true if the buffer should be accelerated,
186 CanvasBltBufferStrategy(int numBuffers, boolean accelerated)
189 new BufferCapabilities(new ImageCapabilities(accelerated),
190 new ImageCapabilities(accelerated),
191 BufferCapabilities.FlipContents.COPIED));
196 * A FlipBufferStrategy for canvases.
198 private class CanvasFlipBufferStrategy extends FlipBufferStrategy
201 * Creates a flip buffer strategy for this canvas.
203 * @param numBuffers the number of buffers in this strategy
205 * @throws AWTException if the requested number of buffers is not
208 CanvasFlipBufferStrategy(int numBuffers)
212 new BufferCapabilities(new ImageCapabilities(true),
213 new ImageCapabilities(true),
214 BufferCapabilities.FlipContents.COPIED));
219 * Creates a buffering strategy that manages how this canvas is
220 * repainted. This method attempts to create the optimum strategy
221 * based on the desired number of buffers. Hardware or software
222 * acceleration may be used.
224 * createBufferStrategy attempts different levels of optimization,
225 * but guarantees that some strategy with the requested number of
226 * buffers will be created even if it is not optimal. First it
227 * attempts to create a page flipping strategy, then an accelerated
228 * blitting strategy, then an unaccelerated blitting strategy.
230 * Calling this method causes any existing buffer strategy to be
233 * @param numBuffers the number of buffers in this strategy
235 * @throws IllegalArgumentException if requested number of buffers
237 * @throws IllegalStateException if this canvas is not displayable
241 public void createBufferStrategy(int numBuffers)
244 throw new IllegalArgumentException("Canvas.createBufferStrategy: number"
245 + " of buffers is less than one");
247 if (!isDisplayable())
248 throw new IllegalStateException("Canvas.createBufferStrategy: canvas is"
249 + " not displayable");
251 BufferStrategy newStrategy = null;
253 // try a flipping strategy
256 newStrategy = new CanvasFlipBufferStrategy(numBuffers);
258 catch (AWTException e)
262 // fall back to an accelerated blitting strategy
263 if (newStrategy == null)
264 newStrategy = new CanvasBltBufferStrategy(numBuffers, true);
266 bufferStrategy = newStrategy;
270 * Creates a buffering strategy that manages how this canvas is
271 * repainted. This method attempts to create a strategy based on
272 * the specified capabilities and throws an exception if the
273 * requested strategy is not supported.
275 * Calling this method causes any existing buffer strategy to be
278 * @param numBuffers the number of buffers in this strategy
279 * @param caps the requested buffering capabilities
281 * @throws AWTException if the requested capabilities are not
283 * @throws IllegalArgumentException if requested number of buffers
284 * is less than one or if caps is null
288 public void createBufferStrategy(int numBuffers, BufferCapabilities caps)
292 throw new IllegalArgumentException("Canvas.createBufferStrategy: number"
293 + " of buffers is less than one");
296 throw new IllegalArgumentException("Canvas.createBufferStrategy:"
297 + " capabilities object is null");
299 // a flipping strategy was requested
300 if (caps.isPageFlipping())
301 bufferStrategy = new CanvasFlipBufferStrategy(numBuffers);
303 bufferStrategy = new CanvasBltBufferStrategy(numBuffers, true);
307 * Returns the buffer strategy used by the canvas.
309 * @return the buffer strategy.
312 public BufferStrategy getBufferStrategy()
314 return bufferStrategy;
318 * Updates the canvas in response to a request to
319 * <code>repaint()</code> it. The canvas is cleared
320 * with the current background colour, before <code>paint()</code>
321 * is called to add the new contents. Subclasses
322 * which override this method should either call this
323 * method via <code>super.update(graphics)</code> or re-implement
324 * this behaviour, so as to ensure that the canvas is
325 * clear before painting takes place.
327 * @param graphics the graphics context.
329 public void update(Graphics graphics)
333 /* Clear the canvas */
335 graphics.clearRect(0, 0, size.width, size.height);
336 /* Call the paint method */
341 * Generate a unique name for this <code>Canvas</code>.
343 * @return A unique name for this <code>Canvas</code>.
345 String generateName()
347 return "canvas" + getUniqueLong();
350 private static synchronized long getUniqueLong()
352 return next_canvas_number++;