001: /*
002: * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package sun.awt.image;
027:
028: import java.awt.AWTException;
029: import java.awt.Component;
030: import java.awt.Graphics2D;
031: import java.awt.GraphicsConfiguration;
032: import java.awt.GraphicsDevice;
033: import java.awt.ImageCapabilities;
034: import java.awt.Rectangle;
035: import java.awt.Transparency;
036: import java.awt.geom.AffineTransform;
037: import java.awt.image.BufferedImage;
038: import java.awt.image.ColorModel;
039: import java.awt.image.DirectColorModel;
040: import java.awt.image.Raster;
041: import java.awt.image.VolatileImage;
042: import java.awt.image.WritableRaster;
043:
044: public class BufferedImageGraphicsConfig extends GraphicsConfiguration {
045: private static final int numconfigs = BufferedImage.TYPE_BYTE_BINARY;
046: private static BufferedImageGraphicsConfig configs[] = new BufferedImageGraphicsConfig[numconfigs];
047:
048: public static BufferedImageGraphicsConfig getConfig(
049: BufferedImage bImg) {
050: BufferedImageGraphicsConfig ret;
051: int type = bImg.getType();
052: if (type > 0 && type < numconfigs) {
053: ret = configs[type];
054: if (ret != null) {
055: return ret;
056: }
057: }
058: ret = new BufferedImageGraphicsConfig(bImg, null);
059: if (type > 0 && type < numconfigs) {
060: configs[type] = ret;
061: }
062: return ret;
063: }
064:
065: GraphicsDevice gd;
066: ColorModel model;
067: Raster raster;
068: int width, height;
069:
070: public BufferedImageGraphicsConfig(BufferedImage bufImg,
071: Component comp) {
072: if (comp == null) {
073: this .gd = new BufferedImageDevice(this );
074: } else {
075: Graphics2D g2d = (Graphics2D) comp.getGraphics();
076: this .gd = g2d.getDeviceConfiguration().getDevice();
077: }
078: this .model = bufImg.getColorModel();
079: this .raster = bufImg.getRaster()
080: .createCompatibleWritableRaster(1, 1);
081: this .width = bufImg.getWidth();
082: this .height = bufImg.getHeight();
083: }
084:
085: /**
086: * Return the graphics device associated with this configuration.
087: */
088: public GraphicsDevice getDevice() {
089: return gd;
090: }
091:
092: /**
093: * Returns a BufferedImage with channel layout and color model
094: * compatible with this graphics configuration. This method
095: * has nothing to do with memory-mapping
096: * a device. This BufferedImage has
097: * a layout and color model
098: * that is closest to this native device configuration and thus
099: * can be optimally blitted to this device.
100: */
101: public BufferedImage createCompatibleImage(int width, int height) {
102: WritableRaster wr = raster.createCompatibleWritableRaster(
103: width, height);
104: return new BufferedImage(model, wr, model
105: .isAlphaPremultiplied(), null);
106: }
107:
108: /**
109: * Returns the color model associated with this configuration.
110: */
111: public ColorModel getColorModel() {
112: return model;
113: }
114:
115: /**
116: * Returns the color model associated with this configuration that
117: * supports the specified transparency.
118: */
119: public ColorModel getColorModel(int transparency) {
120:
121: if (model.getTransparency() == transparency) {
122: return model;
123: }
124: switch (transparency) {
125: case Transparency.OPAQUE:
126: return new DirectColorModel(24, 0xff0000, 0xff00, 0xff);
127: case Transparency.BITMASK:
128: return new DirectColorModel(25, 0xff0000, 0xff00, 0xff,
129: 0x1000000);
130: case Transparency.TRANSLUCENT:
131: return ColorModel.getRGBdefault();
132: default:
133: return null;
134: }
135: }
136:
137: /**
138: * Returns the default Transform for this configuration. This
139: * Transform is typically the Identity transform for most normal
140: * screens. Device coordinates for screen and printer devices will
141: * have the origin in the upper left-hand corner of the target region of
142: * the device, with X coordinates
143: * increasing to the right and Y coordinates increasing downwards.
144: * For image buffers, this Transform will be the Identity transform.
145: */
146: public AffineTransform getDefaultTransform() {
147: return new AffineTransform();
148: }
149:
150: /**
151: *
152: * Returns a Transform that can be composed with the default Transform
153: * of a Graphics2D so that 72 units in user space will equal 1 inch
154: * in device space.
155: * Given a Graphics2D, g, one can reset the transformation to create
156: * such a mapping by using the following pseudocode:
157: * <pre>
158: * GraphicsConfiguration gc = g.getGraphicsConfiguration();
159: *
160: * g.setTransform(gc.getDefaultTransform());
161: * g.transform(gc.getNormalizingTransform());
162: * </pre>
163: * Note that sometimes this Transform will be identity (e.g. for
164: * printers or metafile output) and that this Transform is only
165: * as accurate as the information supplied by the underlying system.
166: * For image buffers, this Transform will be the Identity transform,
167: * since there is no valid distance measurement.
168: */
169: public AffineTransform getNormalizingTransform() {
170: return new AffineTransform();
171: }
172:
173: public Rectangle getBounds() {
174: return new Rectangle(0, 0, width, height);
175: }
176: }
|