| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * @author Igor V. Stolyarov |
| * @version $Revision$ |
| */ |
| |
| package java.awt.image; |
| |
| import com.android.internal.awt.AndroidGraphics2D; |
| |
| import java.awt.Graphics; |
| import java.awt.Graphics2D; |
| import java.awt.GraphicsEnvironment; |
| import java.awt.Image; |
| import java.awt.Point; |
| import java.awt.Rectangle; |
| import java.awt.Transparency; |
| import java.awt.color.ColorSpace; |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| import java.util.Vector; |
| |
| import org.apache.harmony.awt.gl.ImageSurface; |
| import org.apache.harmony.awt.gl.Surface; |
| import org.apache.harmony.awt.gl.image.BufferedImageSource; |
| import org.apache.harmony.awt.internal.nls.Messages; |
| |
| /** |
| * The BufferedImage class describes an Image which contains a buffer of image |
| * data and includes a ColorModel and a Raster for this data. This class |
| * provides methods for obtaining and setting the Raster and for manipulating |
| * the ColorModel parameters. |
| * |
| * @since Android 1.0 |
| */ |
| public class BufferedImage extends Image implements WritableRenderedImage, Transparency { |
| |
| /** |
| * The Constant TYPE_CUSTOM indicates that Image type is unknown. |
| */ |
| public static final int TYPE_CUSTOM = 0; |
| |
| /** |
| * The Constant TYPE_INT_RGB indicates an image with 8 bit RGB color |
| * components, it has a DirectColorModel without alpha. |
| */ |
| public static final int TYPE_INT_RGB = 1; |
| |
| /** |
| * The Constant TYPE_INT_ARGB indicates an image with 8 bit RGBA color |
| * components, it has a DirectColorModel with alpha. |
| */ |
| public static final int TYPE_INT_ARGB = 2; |
| |
| /** |
| * The Constant TYPE_INT_ARGB_PRE indicates an image with 8 bit RGBA color |
| * components, it has a DirectColorModel with alpha, and image data is |
| * pre-multiplied by alpha. |
| */ |
| public static final int TYPE_INT_ARGB_PRE = 3; |
| |
| /** |
| * The Constant TYPE_INT_BGR indicates an image with 8 bit RGB color |
| * components, BGR color model (with the colors Blue, Green, and Red). There |
| * is no alpha. The image has a DirectColorModel. |
| */ |
| public static final int TYPE_INT_BGR = 4; |
| |
| /** |
| * The Constant TYPE_3BYTE_BGR indicates an image with 8 bit RGB color |
| * components, BGR color model (with the colors Blue, Green, and Red stored |
| * in 3 bytes). There is no alpha. The image has a ComponentColorModel. |
| */ |
| public static final int TYPE_3BYTE_BGR = 5; |
| |
| /** |
| * The Constant TYPE_4BYTE_ABGR indicates an image with 8 bit RGBA color |
| * components stored in 3 bytes and 1 byte of alpha. It has a |
| * ComponentColorModel with alpha. |
| */ |
| public static final int TYPE_4BYTE_ABGR = 6; |
| |
| /** |
| * The Constant TYPE_4BYTE_ABGR_PRE indicates an image with 8 bit RGBA color |
| * components stored in 3 bytes and 1 byte for alpha. The image has a |
| * ComponentColorModel with alpha. The color data is pre-multiplied with |
| * alpha. |
| */ |
| public static final int TYPE_4BYTE_ABGR_PRE = 7; |
| |
| /** |
| * The Constant TYPE_USHORT_565_RGB indicates an image with 565 RGB color |
| * components (5-bits red, 6-bits green, 5-bits blue) with no alpha. This |
| * image has a DirectColorModel. |
| */ |
| public static final int TYPE_USHORT_565_RGB = 8; |
| |
| /** |
| * The Constant TYPE_USHORT_555_RGB indicates an image with 555 RGB color |
| * components (5-bits red, 5-bits green, 5-bits blue) with no alpha. This |
| * image has a DirectColorModel. |
| */ |
| public static final int TYPE_USHORT_555_RGB = 9; |
| |
| /** |
| * The Constant TYPE_BYTE_GRAY indicates a unsigned byte image. This image |
| * has a ComponentColorModel with a CS_GRAY ColorSpace. |
| */ |
| public static final int TYPE_BYTE_GRAY = 10; |
| |
| /** |
| * The Constant TYPE_USHORT_GRAY indicates an unsigned short image. This |
| * image has a ComponentColorModel with a CS_GRAY ColorSpace. |
| */ |
| public static final int TYPE_USHORT_GRAY = 11; |
| |
| /** |
| * The Constant TYPE_BYTE_BINARY indicates an opaque byte-packed 1, 2 or 4 |
| * bit image. The image has an IndexColorModel without alpha. |
| */ |
| public static final int TYPE_BYTE_BINARY = 12; |
| |
| /** |
| * The Constant TYPE_BYTE_INDEXED indicates an indexed byte image. |
| */ |
| public static final int TYPE_BYTE_INDEXED = 13; |
| |
| /** |
| * The Constant ALPHA_MASK. |
| */ |
| private static final int ALPHA_MASK = 0xff000000; |
| |
| /** |
| * The Constant RED_MASK. |
| */ |
| private static final int RED_MASK = 0x00ff0000; |
| |
| /** |
| * The Constant GREEN_MASK. |
| */ |
| private static final int GREEN_MASK = 0x0000ff00; |
| |
| /** |
| * The Constant BLUE_MASK. |
| */ |
| private static final int BLUE_MASK = 0x000000ff; |
| |
| /** |
| * The Constant RED_BGR_MASK. |
| */ |
| private static final int RED_BGR_MASK = 0x000000ff; |
| |
| /** |
| * The Constant GREEN_BGR_MASK. |
| */ |
| private static final int GREEN_BGR_MASK = 0x0000ff00; |
| |
| /** |
| * The Constant BLUE_BGR_MASK. |
| */ |
| private static final int BLUE_BGR_MASK = 0x00ff0000; |
| |
| /** |
| * The Constant RED_565_MASK. |
| */ |
| private static final int RED_565_MASK = 0xf800; |
| |
| /** |
| * The Constant GREEN_565_MASK. |
| */ |
| private static final int GREEN_565_MASK = 0x07e0; |
| |
| /** |
| * The Constant BLUE_565_MASK. |
| */ |
| private static final int BLUE_565_MASK = 0x001f; |
| |
| /** |
| * The Constant RED_555_MASK. |
| */ |
| private static final int RED_555_MASK = 0x7c00; |
| |
| /** |
| * The Constant GREEN_555_MASK. |
| */ |
| private static final int GREEN_555_MASK = 0x03e0; |
| |
| /** |
| * The Constant BLUE_555_MASK. |
| */ |
| private static final int BLUE_555_MASK = 0x001f; |
| |
| /** |
| * The cm. |
| */ |
| private ColorModel cm; |
| |
| /** |
| * The raster. |
| */ |
| private final WritableRaster raster; |
| |
| /** |
| * The image type. |
| */ |
| private final int imageType; |
| |
| /** |
| * The properties. |
| */ |
| private Hashtable<?, ?> properties; |
| |
| // Surface of the Buffered Image - used for blitting one Buffered Image |
| // on the other one or on the Component |
| /** |
| * The image surf. |
| */ |
| private final ImageSurface imageSurf; |
| |
| /** |
| * Instantiates a new BufferedImage with the specified ColorModel, and |
| * WritableRaster objects. The Raster data can be be divided or multiplied |
| * by alpha. It depends on the alphaPremultiplied state in the ColorModel. |
| * |
| * @param cm |
| * the ColorModel of the new image. |
| * @param raster |
| * the WritableRaster of the new image. |
| * @param isRasterPremultiplied |
| * if true the data of the specified Raster is pre-multiplied by |
| * alpha. |
| * @param properties |
| * the properties of new Image. |
| */ |
| public BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, |
| Hashtable<?, ?> properties) { |
| if (!cm.isCompatibleRaster(raster)) { |
| // awt.4D=The raster is incompatible with this ColorModel |
| throw new IllegalArgumentException(Messages.getString("awt.4D")); //$NON-NLS-1$ |
| } |
| |
| if (raster.getMinX() != 0 || raster.getMinY() != 0) { |
| // awt.228=minX or minY of this raster not equal to zero |
| throw new IllegalArgumentException(Messages.getString("awt.228")); //$NON-NLS-1$ |
| } |
| |
| this.cm = cm; |
| this.raster = raster; |
| this.properties = properties; |
| |
| coerceData(isRasterPremultiplied); |
| |
| imageType = Surface.getType(cm, raster); |
| |
| imageSurf = createImageSurface(imageType); |
| } |
| |
| /** |
| * Instantiates a new BufferedImage with the specified width, height |
| * predefined image type (TYPE_BYTE_BINARY or TYPE_BYTE_INDEXED) and the |
| * specified IndexColorModel. |
| * |
| * @param width |
| * the width of new image. |
| * @param height |
| * the height of new image. |
| * @param imageType |
| * the predefined image type. |
| * @param cm |
| * the specified IndexColorModel. |
| */ |
| public BufferedImage(int width, int height, int imageType, IndexColorModel cm) { |
| switch (imageType) { |
| case TYPE_BYTE_BINARY: |
| if (cm.hasAlpha()) { |
| // awt.227=This image type can't have alpha |
| throw new IllegalArgumentException(Messages.getString("awt.227")); //$NON-NLS-1$ |
| } |
| int pixel_bits = 0; |
| int mapSize = cm.getMapSize(); |
| if (mapSize <= 2) { |
| pixel_bits = 1; |
| } else if (mapSize <= 4) { |
| pixel_bits = 2; |
| } else if (mapSize <= 16) { |
| pixel_bits = 4; |
| } else { |
| // awt.221=The imageType is TYPE_BYTE_BINARY and the color |
| // map has more than 16 entries |
| throw new IllegalArgumentException(Messages.getString("awt.221")); //$NON-NLS-1$ |
| } |
| |
| raster = Raster.createPackedRaster(DataBuffer.TYPE_BYTE, width, height, 1, |
| pixel_bits, null); |
| break; |
| |
| case TYPE_BYTE_INDEXED: |
| raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 1, |
| null); |
| break; |
| |
| default: |
| // awt.222=The imageType is not TYPE_BYTE_BINARY or |
| // TYPE_BYTE_INDEXED |
| throw new IllegalArgumentException(Messages.getString("awt.222")); //$NON-NLS-1$ |
| |
| } |
| |
| if (!cm.isCompatibleRaster(raster)) { |
| // awt.223=The imageType is not compatible with ColorModel |
| throw new IllegalArgumentException(Messages.getString("awt.223")); //$NON-NLS-1$ |
| } |
| |
| this.cm = cm; |
| this.imageType = imageType; |
| imageSurf = createImageSurface(imageType); |
| |
| } |
| |
| /** |
| * Instantiates a new BufferedImage with the specified width, height and |
| * predefined image type. |
| * |
| * @param width |
| * the width of new image. |
| * @param height |
| * the height of new image. |
| * @param imageType |
| * the predefined image type. |
| */ |
| public BufferedImage(int width, int height, int imageType) { |
| |
| switch (imageType) { |
| case TYPE_INT_RGB: |
| cm = new DirectColorModel(24, RED_MASK, GREEN_MASK, BLUE_MASK); |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_INT_ARGB: |
| cm = ColorModel.getRGBdefault(); |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_INT_ARGB_PRE: |
| cm = new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 32, RED_MASK, |
| GREEN_MASK, BLUE_MASK, ALPHA_MASK, true, DataBuffer.TYPE_INT); |
| |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_INT_BGR: |
| cm = new DirectColorModel(24, RED_BGR_MASK, GREEN_BGR_MASK, BLUE_BGR_MASK); |
| |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_3BYTE_BGR: { |
| int bits[] = { |
| 8, 8, 8 |
| }; |
| int bandOffsets[] = { |
| 2, 1, 0 |
| }; |
| cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), bits, |
| false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); |
| |
| raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, |
| width * 3, 3, bandOffsets, null); |
| } |
| break; |
| |
| case TYPE_4BYTE_ABGR: { |
| int bits[] = { |
| 8, 8, 8, 8 |
| }; |
| int bandOffsets[] = { |
| 3, 2, 1, 0 |
| }; |
| cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), bits, |
| true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); |
| |
| raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, |
| width * 4, 4, bandOffsets, null); |
| } |
| break; |
| |
| case TYPE_4BYTE_ABGR_PRE: { |
| int bits[] = { |
| 8, 8, 8, 8 |
| }; |
| int bandOffsets[] = { |
| 3, 2, 1, 0 |
| }; |
| cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), bits, |
| true, true, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); |
| |
| raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, |
| width * 4, 4, bandOffsets, null); |
| } |
| break; |
| |
| case TYPE_USHORT_565_RGB: |
| cm = new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 16, |
| RED_565_MASK, GREEN_565_MASK, BLUE_565_MASK, 0, false, |
| DataBuffer.TYPE_USHORT); |
| |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_USHORT_555_RGB: |
| cm = new DirectColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), 15, |
| RED_555_MASK, GREEN_555_MASK, BLUE_555_MASK, 0, false, |
| DataBuffer.TYPE_USHORT); |
| |
| raster = cm.createCompatibleWritableRaster(width, height); |
| break; |
| |
| case TYPE_BYTE_GRAY: { |
| int bits[] = { |
| 8 |
| }; |
| cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), bits, |
| false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); |
| |
| raster = cm.createCompatibleWritableRaster(width, height); |
| } |
| break; |
| |
| case TYPE_USHORT_GRAY: { |
| int bits[] = { |
| 16 |
| }; |
| cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), bits, |
| false, false, Transparency.OPAQUE, DataBuffer.TYPE_USHORT); |
| raster = cm.createCompatibleWritableRaster(width, height); |
| } |
| break; |
| |
| case TYPE_BYTE_BINARY: { |
| int colorMap[] = { |
| 0, 0xffffff |
| }; |
| cm = new IndexColorModel(1, 2, colorMap, 0, false, -1, DataBuffer.TYPE_BYTE); |
| |
| raster = Raster.createPackedRaster(DataBuffer.TYPE_BYTE, width, height, 1, 1, null); |
| } |
| break; |
| |
| case TYPE_BYTE_INDEXED: { |
| int colorMap[] = new int[256]; |
| int i = 0; |
| for (int r = 0; r < 256; r += 51) { |
| for (int g = 0; g < 256; g += 51) { |
| for (int b = 0; b < 256; b += 51) { |
| colorMap[i] = (r << 16) | (g << 8) | b; |
| i++; |
| } |
| } |
| } |
| |
| int gray = 0x12; |
| for (; i < 256; i++, gray += 6) { |
| colorMap[i] = (gray << 16) | (gray << 8) | gray; |
| } |
| cm = new IndexColorModel(8, 256, colorMap, 0, false, -1, DataBuffer.TYPE_BYTE); |
| raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, 1, |
| null); |
| |
| } |
| break; |
| default: |
| // awt.224=Unknown image type |
| throw new IllegalArgumentException(Messages.getString("awt.224")); //$NON-NLS-1$ |
| } |
| this.imageType = imageType; |
| imageSurf = createImageSurface(imageType); |
| } |
| |
| @Override |
| public Object getProperty(String name, ImageObserver observer) { |
| return getProperty(name); |
| } |
| |
| public Object getProperty(String name) { |
| if (name == null) { |
| // awt.225=Property name is null |
| throw new NullPointerException(Messages.getString("awt.225")); //$NON-NLS-1$ |
| } |
| if (properties == null) { |
| return Image.UndefinedProperty; |
| } |
| Object property = properties.get(name); |
| if (property == null) { |
| property = Image.UndefinedProperty; |
| } |
| return property; |
| } |
| |
| public WritableRaster copyData(WritableRaster outRaster) { |
| if (outRaster == null) { |
| outRaster = Raster.createWritableRaster(raster.getSampleModel(), new Point(raster |
| .getSampleModelTranslateX(), raster.getSampleModelTranslateY())); |
| } |
| |
| int w = outRaster.getWidth(); |
| int h = outRaster.getHeight(); |
| int minX = outRaster.getMinX(); |
| int minY = outRaster.getMinY(); |
| |
| Object data = null; |
| |
| data = raster.getDataElements(minX, minY, w, h, data); |
| outRaster.setDataElements(minX, minY, w, h, data); |
| |
| return outRaster; |
| } |
| |
| public Raster getData(Rectangle rect) { |
| int minX = rect.x; |
| int minY = rect.y; |
| int w = rect.width; |
| int h = rect.height; |
| |
| SampleModel sm = raster.getSampleModel(); |
| SampleModel nsm = sm.createCompatibleSampleModel(w, h); |
| WritableRaster outr = Raster.createWritableRaster(nsm, rect.getLocation()); |
| Object data = null; |
| |
| data = raster.getDataElements(minX, minY, w, h, data); |
| outr.setDataElements(minX, minY, w, h, data); |
| return outr; |
| } |
| |
| public Vector<RenderedImage> getSources() { |
| return null; |
| } |
| |
| public String[] getPropertyNames() { |
| if (properties == null) { |
| return null; |
| } |
| Vector<String> v = new Vector<String>(); |
| for (Enumeration<?> e = properties.keys(); e.hasMoreElements();) { |
| try { |
| v.add((String)e.nextElement()); |
| } catch (ClassCastException ex) { |
| } |
| } |
| int size = v.size(); |
| if (size > 0) { |
| String names[] = new String[size]; |
| for (int i = 0; i < size; i++) { |
| names[i] = v.elementAt(i); |
| } |
| return names; |
| } |
| return null; |
| } |
| |
| /** |
| * Returns the string representation of this BufferedImage object. |
| * |
| * @return the string representation of this BufferedImage object. |
| */ |
| @Override |
| public String toString() { |
| return "BufferedImage@" + Integer.toHexString(hashCode()) + //$NON-NLS-1$ |
| ": type = " + imageType + " " + cm + " " + raster; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| |
| public WritableRaster getWritableTile(int tileX, int tileY) { |
| return raster; |
| } |
| |
| /** |
| * Gets the WritableRaster of this BufferedImage. |
| * |
| * @return the WritableRaster of this BufferedImage. |
| */ |
| public WritableRaster getRaster() { |
| return raster; |
| } |
| |
| /** |
| * Gets a WritableRaster object which contains the alpha channel of |
| * BufferedImage object with ColorModel objects that supports a separate |
| * alpha channel such as ComponentColorModel or DirectColorModel. |
| * |
| * @return the WritableRaster object which contains the alpha channel of |
| * this BufferedImage. |
| */ |
| public WritableRaster getAlphaRaster() { |
| return cm.getAlphaRaster(raster); |
| } |
| |
| public void removeTileObserver(TileObserver to) { |
| } |
| |
| public void addTileObserver(TileObserver to) { |
| } |
| |
| public SampleModel getSampleModel() { |
| return raster.getSampleModel(); |
| } |
| |
| public void setData(Raster r) { |
| |
| Rectangle from = r.getBounds(); |
| Rectangle to = raster.getBounds(); |
| Rectangle intersection = to.intersection(from); |
| |
| int minX = intersection.x; |
| int minY = intersection.y; |
| int w = intersection.width; |
| int h = intersection.height; |
| |
| Object data = null; |
| |
| data = r.getDataElements(minX, minY, w, h, data); |
| raster.setDataElements(minX, minY, w, h, data); |
| } |
| |
| public Raster getTile(int tileX, int tileY) { |
| if (tileX == 0 && tileY == 0) { |
| return raster; |
| } |
| // awt.226=Both tileX and tileY are not equal to 0 |
| throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.226")); //$NON-NLS-1$ |
| } |
| |
| public Raster getData() { |
| int w = raster.getWidth(); |
| int h = raster.getHeight(); |
| int minX = raster.getMinX(); |
| int minY = raster.getMinY(); |
| |
| WritableRaster outr = Raster.createWritableRaster(raster.getSampleModel(), new Point(raster |
| .getSampleModelTranslateX(), raster.getSampleModelTranslateY())); |
| |
| Object data = null; |
| |
| data = raster.getDataElements(minX, minY, w, h, data); |
| outr.setDataElements(minX, minY, w, h, data); |
| |
| return outr; |
| } |
| |
| @Override |
| public ImageProducer getSource() { |
| return new BufferedImageSource(this, properties); |
| } |
| |
| @Override |
| public int getWidth(ImageObserver observer) { |
| return raster.getWidth(); |
| } |
| |
| @Override |
| public int getHeight(ImageObserver observer) { |
| return raster.getHeight(); |
| } |
| |
| public ColorModel getColorModel() { |
| return cm; |
| } |
| |
| /** |
| * Gets the rectangular area of this BufferedImage as a subimage. |
| * |
| * @param x |
| * the x coordinate. |
| * @param y |
| * the y coordinate. |
| * @param w |
| * the width of the subimage. |
| * @param h |
| * the height of the subimage. |
| * @return the BufferedImage. |
| */ |
| public BufferedImage getSubimage(int x, int y, int w, int h) { |
| WritableRaster wr = raster.createWritableChild(x, y, w, h, 0, 0, null); |
| return new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), properties); |
| } |
| |
| public Point[] getWritableTileIndices() { |
| Point points[] = new Point[1]; |
| points[0] = new Point(0, 0); |
| return points; |
| } |
| |
| /** |
| * Creates the Graphics2D object which allows to draw into this |
| * BufferedImage. |
| * |
| * @return the graphics2D object. |
| */ |
| public Graphics2D createGraphics() { |
| GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); |
| // return ge.createGraphics(this); |
| // ???AWT hack, FIXME |
| // return AndroidGraphics2D.getInstance(); |
| // throw new RuntimeException("Not implemented!"); |
| return null; |
| } |
| |
| @Override |
| public Graphics getGraphics() { |
| return createGraphics(); |
| } |
| |
| /** |
| * Coerces the data to achieve the state which is specified by the |
| * isAlphaPremultiplied variable. |
| * |
| * @param isAlphaPremultiplied |
| * the is alpha pre-multiplied state. |
| */ |
| public void coerceData(boolean isAlphaPremultiplied) { |
| if (cm.hasAlpha() && cm.isAlphaPremultiplied() != isAlphaPremultiplied) { |
| cm = cm.coerceData(raster, isAlphaPremultiplied); |
| } |
| } |
| |
| /** |
| * Gets an array of colors in the TYPE_INT_ARGB color model and default sRGB |
| * color space of the specified area of this BufferedImage. The result array |
| * is composed by the following algorithm: |
| * <p> |
| * pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)] |
| * </p> |
| * |
| * @param startX |
| * the start X area coordinate. |
| * @param startY |
| * the start Y area coordinate. |
| * @param w |
| * the width of the area. |
| * @param h |
| * the height of the area. |
| * @param rgbArray |
| * the result array will be stored to this array. |
| * @param offset |
| * the offset of the rgbArray array. |
| * @param scansize |
| * the scanline stride for the rgbArray. |
| * @return an array of colors for the specified area. |
| */ |
| public int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, |
| int scansize) { |
| if (rgbArray == null) { |
| rgbArray = new int[offset + h * scansize]; |
| } |
| |
| int off = offset; |
| for (int y = startY; y < startY + h; y++, off += scansize) { |
| int i = off; |
| for (int x = startX; x < startX + w; x++, i++) { |
| rgbArray[i] = cm.getRGB(raster.getDataElements(x, y, null)); |
| } |
| } |
| return rgbArray; |
| } |
| |
| /** |
| * Sets RGB values from the specified array to the specified BufferedImage |
| * area. The pixels are in the default RGB color model (TYPE_INT_ARGB) and |
| * default sRGB color space. |
| * |
| * @param startX |
| * the start X coordinate. |
| * @param startY |
| * the start Y coordinate. |
| * @param w |
| * the width of the BufferedImage area. |
| * @param h |
| * the height of the BufferedImage area. |
| * @param rgbArray |
| * the array of RGB values. |
| * @param offset |
| * the offset of the rgbArray array. |
| * @param scansize |
| * the scanline stride for the rgbArray. |
| */ |
| public void setRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, |
| int scansize) { |
| int off = offset; |
| for (int y = startY; y < startY + h; y++, off += scansize) { |
| int i = off; |
| for (int x = startX; x < startX + w; x++, i++) { |
| raster.setDataElements(x, y, cm.getDataElements(rgbArray[i], null)); |
| } |
| } |
| } |
| |
| /** |
| * Sets a the specified RGB value to the specified pixel of this |
| * BufferedImage. The pixel should be in the default RGB color model |
| * (TYPE_INT_ARGB) and default sRGB color space. |
| * |
| * @param x |
| * the X coordinate of the pixel. |
| * @param y |
| * the Y coordinate of the pixel. |
| * @param rgb |
| * the RGB value to be set. |
| */ |
| public synchronized void setRGB(int x, int y, int rgb) { |
| raster.setDataElements(x, y, cm.getDataElements(rgb, null)); |
| } |
| |
| public boolean isTileWritable(int tileX, int tileY) { |
| if (tileX == 0 && tileY == 0) { |
| return true; |
| } |
| // awt.226=Both tileX and tileY are not equal to 0 |
| throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.226")); //$NON-NLS-1$ |
| } |
| |
| public void releaseWritableTile(int tileX, int tileY) { |
| } |
| |
| /** |
| * Gets a color in the TYPE_INT_ARGB color model and default sRGB color |
| * space of the specified pixel. |
| * |
| * @param x |
| * the X coordinate of the pixel. |
| * @param y |
| * the Y coordinate of the pixel. |
| * @return the color of the specified pixel in the TYPE_INT_ARGB color model |
| * and default sRGB color space. |
| */ |
| public int getRGB(int x, int y) { |
| return cm.getRGB(raster.getDataElements(x, y, null)); |
| } |
| |
| /** |
| * Returns true if alpha is pre-multiplied, false if alpha is not |
| * pre-multiplied or there is no alpha. |
| * |
| * @return true if alpha is pre-multiplied, false if alpha is not |
| * pre-multiplied or there is no alpha. |
| */ |
| public boolean isAlphaPremultiplied() { |
| return cm.isAlphaPremultiplied(); |
| } |
| |
| public boolean hasTileWriters() { |
| return true; |
| } |
| |
| @Override |
| public void flush() { |
| imageSurf.dispose(); |
| } |
| |
| public int getWidth() { |
| return raster.getWidth(); |
| } |
| |
| /** |
| * Gets the image type. |
| * |
| * @return the image type. |
| */ |
| public int getType() { |
| return imageType; |
| } |
| |
| public int getTileWidth() { |
| return raster.getWidth(); |
| } |
| |
| public int getTileHeight() { |
| return raster.getHeight(); |
| } |
| |
| public int getTileGridYOffset() { |
| return raster.getSampleModelTranslateY(); |
| } |
| |
| public int getTileGridXOffset() { |
| return raster.getSampleModelTranslateX(); |
| } |
| |
| public int getNumYTiles() { |
| return 1; |
| } |
| |
| public int getNumXTiles() { |
| return 1; |
| } |
| |
| public int getMinY() { |
| return raster.getMinY(); |
| } |
| |
| public int getMinX() { |
| return raster.getMinX(); |
| } |
| |
| public int getMinTileY() { |
| return 0; |
| } |
| |
| public int getMinTileX() { |
| return 0; |
| } |
| |
| public int getHeight() { |
| return raster.getHeight(); |
| } |
| |
| /** |
| * Creates the image surface. |
| * |
| * @param type |
| * the type. |
| * @return the image surface. |
| */ |
| private ImageSurface createImageSurface(int type) { |
| return new ImageSurface(getColorModel(), getRaster(), type); |
| } |
| |
| /** |
| * Gets the image surface. |
| * |
| * @return the image surface. |
| */ |
| ImageSurface getImageSurface() { |
| return imageSurf; |
| } |
| |
| public int getTransparency() { |
| return cm.getTransparency(); |
| } |
| } |