diff options
author | Jeremias Maerki <jeremias@apache.org> | 2005-08-10 12:56:30 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2005-08-10 12:56:30 +0000 |
commit | e82d4f6dc76e345262e8abf6408093c00b9aa210 (patch) | |
tree | 0485d1136ce3824ecbae4109126811d5e00139e3 /src/java-1.4/org/apache/fop | |
parent | 492202d19631cbbc742f20b66051ea6e581f8218 (diff) | |
download | xmlgraphics-fop-e82d4f6dc76e345262e8abf6408093c00b9aa210.tar.gz xmlgraphics-fop-e82d4f6dc76e345262e8abf6408093c00b9aa210.zip |
AbstractFopImage subclass using ImageIO (JDK >= 1.4) to load images (works with GIF, too). Some of the code dealing with the BufferedImage could probably be extracted to a common subclass since it's mostly a copy from a different FopImage implementation.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@231223 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java-1.4/org/apache/fop')
-rw-r--r-- | src/java-1.4/org/apache/fop/image/ImageIOImage.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/java-1.4/org/apache/fop/image/ImageIOImage.java b/src/java-1.4/org/apache/fop/image/ImageIOImage.java new file mode 100644 index 000000000..915d0a233 --- /dev/null +++ b/src/java-1.4/org/apache/fop/image/ImageIOImage.java @@ -0,0 +1,145 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed 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. + */ + +/* $Id$ */ + +package org.apache.fop.image; + +// AWT +import java.awt.Color; +import java.awt.image.ColorModel; +import java.awt.image.IndexColorModel; +import java.awt.image.BufferedImage; + +// ImageIO +import javax.imageio.ImageIO; + +// FOP +import org.apache.fop.apps.FOUserAgent; + +/** + * FopImage object using ImageIO. + * @see AbstractFopImage + * @see FopImage + */ +public class ImageIOImage extends AbstractFopImage { + + /** + * Creates a new ImageIOImage. + * @param info the image info from the ImageReader + */ + public ImageIOImage(FopImage.ImageInfo info) { + super(info); + } + + /** @see org.apache.fop.image.AbstractFopImage#loadBitmap() */ + protected boolean loadBitmap() { + try { + BufferedImage imageData = ImageIO.read(inputStream); + + this.height = imageData.getHeight(); + this.width = imageData.getWidth(); + + ColorModel cm = imageData.getColorModel(); + this.bitsPerPixel = cm.getComponentSize(0); //only use first, we assume all are equal + this.colorSpace = cm.getColorSpace(); + + int[] tmpMap = imageData.getRGB(0, 0, this.width, + this.height, null, 0, this.width); + + if (cm.hasAlpha()) { + // java.awt.Transparency. BITMASK or OPAQUE or TRANSLUCENT + int transparencyType = cm.getTransparency(); + + if (transparencyType == java.awt.Transparency.OPAQUE) { + this.isTransparent = false; + } else if (transparencyType == java.awt.Transparency.BITMASK) { + if (cm instanceof IndexColorModel) { + this.isTransparent = false; + byte[] alphas = new byte[ + ((IndexColorModel) cm).getMapSize()]; + byte[] reds = new byte[ + ((IndexColorModel) cm).getMapSize()]; + byte[] greens = new byte[ + ((IndexColorModel) cm).getMapSize()]; + byte[] blues = new byte[ + ((IndexColorModel) cm).getMapSize()]; + ((IndexColorModel) cm).getAlphas(alphas); + ((IndexColorModel) cm).getReds(reds); + ((IndexColorModel) cm).getGreens(greens); + ((IndexColorModel) cm).getBlues(blues); + for (int i = 0; + i < ((IndexColorModel) cm).getMapSize(); + i++) { + if ((alphas[i] & 0xFF) == 0) { + this.isTransparent = true; + this.transparentColor = new Color( + (int)(reds[i] & 0xFF), + (int)(greens[i] & 0xFF), + (int)(blues[i] & 0xFF)); + break; + } + } + } else { + // TRANSLUCENT + /* + * this.isTransparent = false; + * for (int i = 0; i < this.width * this.height; i++) { + * if (cm.getAlpha(tmpMap[i]) == 0) { + * this.isTransparent = true; + * this.transparentColor = new PDFColor(cm.getRed(tmpMap[i]), + * cm.getGreen(tmpMap[i]), cm.getBlue(tmpMap[i])); + * break; + * } + * } + * // or use special API... + */ + this.isTransparent = false; + } + } else { + this.isTransparent = false; + } + } else { + this.isTransparent = false; + } + + // Should take care of the ColorSpace and bitsPerPixel + this.bitmapsSize = this.width * this.height * 3; + this.bitmaps = new byte[this.bitmapsSize]; + for (int i = 0; i < this.height; i++) { + for (int j = 0; j < this.width; j++) { + int p = tmpMap[i * this.width + j]; + int r = (p >> 16) & 0xFF; + int g = (p >> 8) & 0xFF; + int b = (p) & 0xFF; + this.bitmaps[3 * (i * this.width + j)] + = (byte)(r & 0xFF); + this.bitmaps[3 * (i * this.width + j) + 1] + = (byte)(g & 0xFF); + this.bitmaps[3 * (i * this.width + j) + 2] + = (byte)(b & 0xFF); + } + } + + } catch (Exception ex) { + log.error("Error while loading image: " + ex.getMessage(), ex); + return false; + } + return true; + } + +} + |