mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-29 12:38:24 +00:00
452 lines
19 KiB
Java
452 lines
19 KiB
Java
/*
|
|
* Copyright (c) 1997, 2013, 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. Oracle designates this
|
|
* particular file as subject to the "Classpath" exception as provided
|
|
* by Oracle in the LICENSE file that accompanied this code.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
package java.awt;
|
|
|
|
import java.awt.geom.AffineTransform;
|
|
import java.awt.image.BufferedImage;
|
|
import java.awt.image.ColorModel;
|
|
import java.awt.image.VolatileImage;
|
|
import java.awt.image.WritableRaster;
|
|
|
|
import sun.awt.image.SunVolatileImage;
|
|
|
|
/**
|
|
* The {@code GraphicsConfiguration} class describes the
|
|
* characteristics of a graphics destination such as a printer or monitor.
|
|
* There can be many {@code GraphicsConfiguration} objects associated
|
|
* with a single graphics device, representing different drawing modes or
|
|
* capabilities. The corresponding native structure will vary from platform
|
|
* to platform. For example, on X11 windowing systems,
|
|
* each visual is a different {@code GraphicsConfiguration}.
|
|
* On Microsoft Windows, {@code GraphicsConfiguration}s represent
|
|
* PixelFormats available in the current resolution and color depth.
|
|
* <p>
|
|
* In a virtual device multi-screen environment in which the desktop
|
|
* area could span multiple physical screen devices, the bounds of the
|
|
* {@code GraphicsConfiguration} objects are relative to the
|
|
* virtual coordinate system. When setting the location of a
|
|
* component, use {@link #getBounds() getBounds} to get the bounds of
|
|
* the desired {@code GraphicsConfiguration} and offset the location
|
|
* with the coordinates of the {@code GraphicsConfiguration},
|
|
* as the following code sample illustrates:
|
|
* </p>
|
|
*
|
|
* <pre>
|
|
* Frame f = new Frame(gc); // where gc is a GraphicsConfiguration
|
|
* Rectangle bounds = gc.getBounds();
|
|
* f.setLocation(10 + bounds.x, 10 + bounds.y); </pre>
|
|
*
|
|
* <p>
|
|
* To determine if your environment is a virtual device
|
|
* environment, call {@code getBounds} on all of the
|
|
* {@code GraphicsConfiguration} objects in your system. If
|
|
* any of the origins of the returned bounds is not (0, 0),
|
|
* your environment is a virtual device environment.
|
|
*
|
|
* <p>
|
|
* You can also use {@code getBounds} to determine the bounds
|
|
* of the virtual device. To do this, first call {@code getBounds} on all
|
|
* of the {@code GraphicsConfiguration} objects in your
|
|
* system. Then calculate the union of all of the bounds returned
|
|
* from the calls to {@code getBounds}. The union is the
|
|
* bounds of the virtual device. The following code sample
|
|
* calculates the bounds of the virtual device.
|
|
*
|
|
* <pre>{@code
|
|
* Rectangle virtualBounds = new Rectangle();
|
|
* GraphicsEnvironment ge = GraphicsEnvironment.
|
|
* getLocalGraphicsEnvironment();
|
|
* GraphicsDevice[] gs =
|
|
* ge.getScreenDevices();
|
|
* for (int j = 0; j < gs.length; j++) {
|
|
* GraphicsDevice gd = gs[j];
|
|
* GraphicsConfiguration[] gc =
|
|
* gd.getConfigurations();
|
|
* for (int i=0; i < gc.length; i++) {
|
|
* virtualBounds =
|
|
* virtualBounds.union(gc[i].getBounds());
|
|
* }
|
|
* } }</pre>
|
|
*
|
|
* @see Window
|
|
* @see Frame
|
|
* @see GraphicsEnvironment
|
|
* @see GraphicsDevice
|
|
*/
|
|
/*
|
|
* REMIND: What to do about capabilities?
|
|
* The
|
|
* capabilities of the device can be determined by enumerating the possible
|
|
* capabilities and checking if the GraphicsConfiguration
|
|
* implements the interface for that capability.
|
|
*
|
|
*/
|
|
public abstract class GraphicsConfiguration {
|
|
|
|
private static BufferCapabilities defaultBufferCaps;
|
|
private static ImageCapabilities defaultImageCaps;
|
|
|
|
/**
|
|
* This is an abstract class that cannot be instantiated directly.
|
|
* Instances must be obtained from a suitable factory or query method.
|
|
*
|
|
* @see GraphicsDevice#getConfigurations
|
|
* @see GraphicsDevice#getDefaultConfiguration
|
|
* @see GraphicsDevice#getBestConfiguration
|
|
* @see Graphics2D#getDeviceConfiguration
|
|
*/
|
|
protected GraphicsConfiguration() {
|
|
}
|
|
|
|
/**
|
|
* Returns the {@link GraphicsDevice} associated with this
|
|
* {@code GraphicsConfiguration}.
|
|
* @return a {@code GraphicsDevice} object that is
|
|
* associated with this {@code GraphicsConfiguration}.
|
|
*/
|
|
public abstract GraphicsDevice getDevice();
|
|
|
|
/**
|
|
* Returns a {@link BufferedImage} with a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}. This
|
|
* method has nothing to do with memory-mapping
|
|
* a device. The returned {@code BufferedImage} has
|
|
* a layout and color model that is closest to this native device
|
|
* configuration and can therefore be optimally blitted to this
|
|
* device.
|
|
* @param width the width of the returned {@code BufferedImage}
|
|
* @param height the height of the returned {@code BufferedImage}
|
|
* @return a {@code BufferedImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}.
|
|
*/
|
|
public BufferedImage createCompatibleImage(int width, int height) {
|
|
ColorModel model = getColorModel();
|
|
WritableRaster raster =
|
|
model.createCompatibleWritableRaster(width, height);
|
|
return new BufferedImage(model, raster,
|
|
model.isAlphaPremultiplied(), null);
|
|
}
|
|
|
|
/**
|
|
* Returns a {@code BufferedImage} that supports the specified
|
|
* transparency and has a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}. This
|
|
* method has nothing to do with memory-mapping
|
|
* a device. The returned {@code BufferedImage} has a layout and
|
|
* color model that can be optimally blitted to a device
|
|
* with this {@code GraphicsConfiguration}.
|
|
* @param width the width of the returned {@code BufferedImage}
|
|
* @param height the height of the returned {@code BufferedImage}
|
|
* @param transparency the specified transparency mode
|
|
* @return a {@code BufferedImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}
|
|
* and also supports the specified transparency.
|
|
* @throws IllegalArgumentException if the transparency is not a valid value
|
|
* @see Transparency#OPAQUE
|
|
* @see Transparency#BITMASK
|
|
* @see Transparency#TRANSLUCENT
|
|
*/
|
|
public BufferedImage createCompatibleImage(int width, int height,
|
|
int transparency)
|
|
{
|
|
if (getColorModel().getTransparency() == transparency) {
|
|
return createCompatibleImage(width, height);
|
|
}
|
|
|
|
ColorModel cm = getColorModel(transparency);
|
|
if (cm == null) {
|
|
throw new IllegalArgumentException("Unknown transparency: " +
|
|
transparency);
|
|
}
|
|
WritableRaster wr = cm.createCompatibleWritableRaster(width, height);
|
|
return new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null);
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns a {@link VolatileImage} with a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}.
|
|
* The returned {@code VolatileImage}
|
|
* may have data that is stored optimally for the underlying graphics
|
|
* device and may therefore benefit from platform-specific rendering
|
|
* acceleration.
|
|
* @param width the width of the returned {@code VolatileImage}
|
|
* @param height the height of the returned {@code VolatileImage}
|
|
* @return a {@code VolatileImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}.
|
|
* @see Component#createVolatileImage(int, int)
|
|
* @since 1.4
|
|
*/
|
|
public VolatileImage createCompatibleVolatileImage(int width, int height) {
|
|
VolatileImage vi = null;
|
|
try {
|
|
vi = createCompatibleVolatileImage(width, height,
|
|
null, Transparency.OPAQUE);
|
|
} catch (AWTException e) {
|
|
// shouldn't happen: we're passing in null caps
|
|
assert false;
|
|
}
|
|
return vi;
|
|
}
|
|
|
|
/**
|
|
* Returns a {@link VolatileImage} with a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}.
|
|
* The returned {@code VolatileImage}
|
|
* may have data that is stored optimally for the underlying graphics
|
|
* device and may therefore benefit from platform-specific rendering
|
|
* acceleration.
|
|
* @param width the width of the returned {@code VolatileImage}
|
|
* @param height the height of the returned {@code VolatileImage}
|
|
* @param transparency the specified transparency mode
|
|
* @return a {@code VolatileImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}.
|
|
* @throws IllegalArgumentException if the transparency is not a valid value
|
|
* @see Transparency#OPAQUE
|
|
* @see Transparency#BITMASK
|
|
* @see Transparency#TRANSLUCENT
|
|
* @see Component#createVolatileImage(int, int)
|
|
* @since 1.5
|
|
*/
|
|
public VolatileImage createCompatibleVolatileImage(int width, int height,
|
|
int transparency)
|
|
{
|
|
VolatileImage vi = null;
|
|
try {
|
|
vi = createCompatibleVolatileImage(width, height, null, transparency);
|
|
} catch (AWTException e) {
|
|
// shouldn't happen: we're passing in null caps
|
|
assert false;
|
|
}
|
|
return vi;
|
|
}
|
|
|
|
/**
|
|
* Returns a {@link VolatileImage} with a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}, using
|
|
* the specified image capabilities.
|
|
* If the {@code caps} parameter is null, it is effectively ignored
|
|
* and this method will create a VolatileImage without regard to
|
|
* {@code ImageCapabilities} constraints.
|
|
*
|
|
* The returned {@code VolatileImage} has
|
|
* a layout and color model that is closest to this native device
|
|
* configuration and can therefore be optimally blitted to this
|
|
* device.
|
|
* @return a {@code VolatileImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}.
|
|
* @param width the width of the returned {@code VolatileImage}
|
|
* @param height the height of the returned {@code VolatileImage}
|
|
* @param caps the image capabilities
|
|
* @exception AWTException if the supplied image capabilities could not
|
|
* be met by this graphics configuration
|
|
* @since 1.4
|
|
*/
|
|
public VolatileImage createCompatibleVolatileImage(int width, int height,
|
|
ImageCapabilities caps) throws AWTException
|
|
{
|
|
return createCompatibleVolatileImage(width, height, caps,
|
|
Transparency.OPAQUE);
|
|
}
|
|
|
|
/**
|
|
* Returns a {@link VolatileImage} with a data layout and color model
|
|
* compatible with this {@code GraphicsConfiguration}, using
|
|
* the specified image capabilities and transparency value.
|
|
* If the {@code caps} parameter is null, it is effectively ignored
|
|
* and this method will create a VolatileImage without regard to
|
|
* {@code ImageCapabilities} constraints.
|
|
*
|
|
* The returned {@code VolatileImage} has
|
|
* a layout and color model that is closest to this native device
|
|
* configuration and can therefore be optimally blitted to this
|
|
* device.
|
|
* @param width the width of the returned {@code VolatileImage}
|
|
* @param height the height of the returned {@code VolatileImage}
|
|
* @param caps the image capabilities
|
|
* @param transparency the specified transparency mode
|
|
* @return a {@code VolatileImage} whose data layout and color
|
|
* model is compatible with this {@code GraphicsConfiguration}.
|
|
* @see Transparency#OPAQUE
|
|
* @see Transparency#BITMASK
|
|
* @see Transparency#TRANSLUCENT
|
|
* @throws IllegalArgumentException if the transparency is not a valid value
|
|
* @exception AWTException if the supplied image capabilities could not
|
|
* be met by this graphics configuration
|
|
* @see Component#createVolatileImage(int, int)
|
|
* @since 1.5
|
|
*/
|
|
public VolatileImage createCompatibleVolatileImage(int width, int height,
|
|
ImageCapabilities caps, int transparency) throws AWTException
|
|
{
|
|
VolatileImage vi =
|
|
new SunVolatileImage(this, width, height, transparency, caps);
|
|
if (caps != null && caps.isAccelerated() &&
|
|
!vi.getCapabilities().isAccelerated())
|
|
{
|
|
throw new AWTException("Supplied image capabilities could not " +
|
|
"be met by this graphics configuration.");
|
|
}
|
|
return vi;
|
|
}
|
|
|
|
/**
|
|
* Returns the {@link ColorModel} associated with this
|
|
* {@code GraphicsConfiguration}.
|
|
* @return a {@code ColorModel} object that is associated with
|
|
* this {@code GraphicsConfiguration}.
|
|
*/
|
|
public abstract ColorModel getColorModel();
|
|
|
|
/**
|
|
* Returns the {@code ColorModel} associated with this
|
|
* {@code GraphicsConfiguration} that supports the specified
|
|
* transparency.
|
|
* @param transparency the specified transparency mode
|
|
* @return a {@code ColorModel} object that is associated with
|
|
* this {@code GraphicsConfiguration} and supports the
|
|
* specified transparency or null if the transparency is not a valid
|
|
* value.
|
|
* @see Transparency#OPAQUE
|
|
* @see Transparency#BITMASK
|
|
* @see Transparency#TRANSLUCENT
|
|
*/
|
|
public abstract ColorModel getColorModel(int transparency);
|
|
|
|
/**
|
|
* Returns the default {@link AffineTransform} for this
|
|
* {@code GraphicsConfiguration}. This
|
|
* {@code AffineTransform} is typically the Identity transform
|
|
* for most normal screens. The default {@code AffineTransform}
|
|
* maps coordinates onto the device such that 72 user space
|
|
* coordinate units measure approximately 1 inch in device
|
|
* space. The normalizing transform can be used to make
|
|
* this mapping more exact. Coordinates in the coordinate space
|
|
* defined by the default {@code AffineTransform} for screen and
|
|
* printer devices have the origin in the upper left-hand corner of
|
|
* the target region of the device, with X coordinates
|
|
* increasing to the right and Y coordinates increasing downwards.
|
|
* For image buffers not associated with a device, such as those not
|
|
* created by {@code createCompatibleImage},
|
|
* this {@code AffineTransform} is the Identity transform.
|
|
* @return the default {@code AffineTransform} for this
|
|
* {@code GraphicsConfiguration}.
|
|
*/
|
|
public abstract AffineTransform getDefaultTransform();
|
|
|
|
/**
|
|
* Returns an {@code AffineTransform} that can be concatenated
|
|
* with the default {@code AffineTransform}
|
|
* of a {@code GraphicsConfiguration} so that 72 units in user
|
|
* space equals 1 inch in device space.
|
|
* <p>
|
|
* For a particular {@link Graphics2D}, g, one
|
|
* can reset the transformation to create
|
|
* such a mapping by using the following pseudocode:
|
|
* <pre>
|
|
* GraphicsConfiguration gc = g.getDeviceConfiguration();
|
|
*
|
|
* g.setTransform(gc.getDefaultTransform());
|
|
* g.transform(gc.getNormalizingTransform());
|
|
* </pre>
|
|
* Note that sometimes this {@code AffineTransform} is identity,
|
|
* such as for printers or metafile output, and that this
|
|
* {@code AffineTransform} is only as accurate as the information
|
|
* supplied by the underlying system. For image buffers not
|
|
* associated with a device, such as those not created by
|
|
* {@code createCompatibleImage}, this
|
|
* {@code AffineTransform} is the Identity transform
|
|
* since there is no valid distance measurement.
|
|
* @return an {@code AffineTransform} to concatenate to the
|
|
* default {@code AffineTransform} so that 72 units in user
|
|
* space is mapped to 1 inch in device space.
|
|
*/
|
|
public abstract AffineTransform getNormalizingTransform();
|
|
|
|
/**
|
|
* Returns the bounds of the {@code GraphicsConfiguration}
|
|
* in the device coordinates. In a multi-screen environment
|
|
* with a virtual device, the bounds can have negative X
|
|
* or Y origins.
|
|
* @return the bounds of the area covered by this
|
|
* {@code GraphicsConfiguration}.
|
|
* @since 1.3
|
|
*/
|
|
public abstract Rectangle getBounds();
|
|
|
|
private static class DefaultBufferCapabilities extends BufferCapabilities {
|
|
public DefaultBufferCapabilities(ImageCapabilities imageCaps) {
|
|
super(imageCaps, imageCaps, null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the buffering capabilities of this
|
|
* {@code GraphicsConfiguration}.
|
|
* @return the buffering capabilities of this graphics
|
|
* configuration object
|
|
* @since 1.4
|
|
*/
|
|
public BufferCapabilities getBufferCapabilities() {
|
|
if (defaultBufferCaps == null) {
|
|
defaultBufferCaps = new DefaultBufferCapabilities(
|
|
getImageCapabilities());
|
|
}
|
|
return defaultBufferCaps;
|
|
}
|
|
|
|
/**
|
|
* Returns the image capabilities of this
|
|
* {@code GraphicsConfiguration}.
|
|
* @return the image capabilities of this graphics
|
|
* configuration object
|
|
* @since 1.4
|
|
*/
|
|
public ImageCapabilities getImageCapabilities() {
|
|
if (defaultImageCaps == null) {
|
|
defaultImageCaps = new ImageCapabilities(false);
|
|
}
|
|
return defaultImageCaps;
|
|
}
|
|
|
|
/**
|
|
* Returns whether this {@code GraphicsConfiguration} supports
|
|
* the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
|
|
* PERPIXEL_TRANSLUCENT} kind of translucency.
|
|
*
|
|
* @return whether the given GraphicsConfiguration supports
|
|
* the translucency effects.
|
|
*
|
|
* @see Window#setBackground(Color)
|
|
*
|
|
* @since 1.7
|
|
*/
|
|
public boolean isTranslucencyCapable() {
|
|
// Overridden in subclasses
|
|
return false;
|
|
}
|
|
}
|