diff options
author | Jeremias Maerki <jeremias@apache.org> | 2004-10-11 21:43:13 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2004-10-11 21:43:13 +0000 |
commit | 266648065ca98637f6a9175258acc82be6f94dfd (patch) | |
tree | 9f323439e409913b0efaadfd40c4a0212ae3bab4 /src/java/org/apache/fop/image | |
parent | a27301f15b36c5fa8d8900715e5c543711d492a4 (diff) | |
download | xmlgraphics-fop-266648065ca98637f6a9175258acc82be6f94dfd.tar.gz xmlgraphics-fop-266648065ca98637f6a9175258acc82be6f94dfd.zip |
Made a common base class for both PNG and TIFF classes because they are almost identical.
Some style updates.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@198038 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/image')
-rw-r--r-- | src/java/org/apache/fop/image/BatikImage.java | 194 | ||||
-rw-r--r-- | src/java/org/apache/fop/image/PNGImage.java | 165 | ||||
-rw-r--r-- | src/java/org/apache/fop/image/TIFFImage.java | 179 |
3 files changed, 238 insertions, 300 deletions
diff --git a/src/java/org/apache/fop/image/BatikImage.java b/src/java/org/apache/fop/image/BatikImage.java new file mode 100644 index 000000000..96a79ecd9 --- /dev/null +++ b/src/java/org/apache/fop/image/BatikImage.java @@ -0,0 +1,194 @@ +/* + * Copyright 2004 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; + +import java.awt.Color; +import java.awt.Transparency; +import java.awt.image.ColorModel; +import java.awt.image.IndexColorModel; +import java.awt.image.WritableRaster; +import java.awt.image.BufferedImage; +import java.io.IOException; + +import org.apache.batik.ext.awt.image.codec.SeekableStream; +import org.apache.batik.ext.awt.image.codec.MemoryCacheSeekableStream; +import org.apache.batik.ext.awt.image.codec.FileCacheSeekableStream; +import org.apache.batik.ext.awt.image.rendered.Any2sRGBRed; +import org.apache.batik.ext.awt.image.rendered.CachableRed; + +/** + * FopImage object using TIFF + * @author Eric SCHAEFFER + * @see AbstractFopImage + * @see FopImage + */ +public abstract class BatikImage extends AbstractFopImage { + + private byte[] softMask = null; + + /** + * Constructs a new BatikImage instance. + * @param imgReader basic metadata for the image + */ + public BatikImage(FopImage.ImageInfo imgReader) { + super(imgReader); + } + + /** + * @see org.apache.fop.image.AbstractFopImage#loadDimensions() + */ + protected boolean loadDimensions() { + if (this.bitmaps == null) { + loadImage(); + } + + return this.bitmaps != null; + } + + /** + * @see org.apache.fop.image.AbstractFopImage#loadBitmap() + */ + protected boolean loadBitmap() { + if (this.bitmaps == null) { + loadImage(); + } + + return this.bitmaps != null; + } + + /** + * @see org.apache.fop.image.FopImage#hasSoftMask() + */ + public boolean hasSoftMask() { + if (this.bitmaps == null) { + loadImage(); + } + + return (this.softMask != null); + } + + /** + * @see org.apache.fop.image.FopImage#getSoftMask() + */ + public byte[] getSoftMask() { + if (this.bitmaps == null) { + loadImage(); + } + + return this.softMask; + } + + /** + * Decodes the image from the stream. + * @param stream the stream to read the image from + * @return the decoded image + * @throws IOException in case an I/O problem occurs + */ + protected abstract CachableRed decodeImage(SeekableStream stream) throws IOException; + + /** + * Loads the image from the InputStream. + */ + protected void loadImage() { + try { + SeekableStream seekableInput; + try { seekableInput = new FileCacheSeekableStream(inputStream); + } catch (IOException ioe) { + seekableInput = new MemoryCacheSeekableStream(inputStream); + } + + CachableRed cr = decodeImage(seekableInput); + ColorModel cm = cr.getColorModel(); + + this.height = cr.getHeight(); + this.width = cr.getWidth(); + + cr = new Any2sRGBRed(cr); + + this.isTransparent = false; + this.softMask = null; + int transparencyType = cm.getTransparency(); + if ((transparencyType == Transparency.BITMASK) + && (cm instanceof IndexColorModel)) { + // Use 'transparent color'. + IndexColorModel icm = (IndexColorModel)cm; + int numColor = icm.getMapSize(); + byte [] alpha = new byte[numColor]; + icm.getAlphas(alpha); + for (int i = 0; i < numColor; i++) { + if ((alpha[i] & 0xFF) == 0) { + this.isTransparent = true; + int red = (icm.getRed (i)) & 0xFF; + int grn = (icm.getGreen(i)) & 0xFF; + int blu = (icm.getBlue (i)) & 0xFF; + this.transparentColor = new Color(red, grn, blu); + break; + } + } + } + + // Get our current ColorModel + cm = cr.getColorModel(); + + // It has an alpha channel so generate a soft mask. + if ((!this.isTransparent) && cm.hasAlpha()) { + this.softMask = new byte[this.width * this.height]; + } + + this.bitsPerPixel = 8; + this.bitmapsSize = this.width * this.height * 3; + this.bitmaps = new byte[this.bitmapsSize]; + this.colorSpace = cm.getColorSpace(); + + WritableRaster wr = (WritableRaster)cr.getData(); + BufferedImage bi = new BufferedImage + (cm, wr.createWritableTranslatedChild(0, 0), + cm.isAlphaPremultiplied(), null); + int [] tmpMap = new int[this.width]; + int idx = 0; + int sfIdx = 0; + for (int y = 0; y < this.height; y++) { + tmpMap = bi.getRGB(0, y, this.width, 1, tmpMap, 0, this.width); + if (softMask != null) { + for (int x = 0; x < this.width; x++) { + int pix = tmpMap[x]; + this.softMask[sfIdx++] = (byte)(pix >>> 24); + this.bitmaps[idx++] = (byte)((pix >>> 16) & 0xFF); + this.bitmaps[idx++] = (byte)((pix >>> 8) & 0xFF); + this.bitmaps[idx++] = (byte)((pix) & 0xFF); + } + } else { + for (int x = 0; x < this.width; x++) { + int pix = tmpMap[x]; + this.bitmaps[idx++] = (byte)((pix >> 16) & 0xFF); + this.bitmaps[idx++] = (byte)((pix >> 8) & 0xFF); + this.bitmaps[idx++] = (byte)((pix) & 0xFF); + } + } + } + } catch (Exception ex) { + log.error("Error loading an image" , ex); + /*throw new FopImageException("Error while loading image " + + "" + " : " + + ex.getClass() + " - " + + ex.getMessage()); + */ + } + } +}; diff --git a/src/java/org/apache/fop/image/PNGImage.java b/src/java/org/apache/fop/image/PNGImage.java index 4d7cef565..292febc0e 100644 --- a/src/java/org/apache/fop/image/PNGImage.java +++ b/src/java/org/apache/fop/image/PNGImage.java @@ -1,36 +1,28 @@ /* - * Copyright 2004 The Apache Software Foundation + * Copyright 2004 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 + * 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. - * + * 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; -import java.awt.Color; -import java.awt.Transparency; -import java.awt.image.ColorModel; -import java.awt.image.IndexColorModel; -import java.awt.image.WritableRaster; -import java.awt.image.BufferedImage; import java.io.IOException; import org.apache.batik.ext.awt.image.codec.PNGRed; import org.apache.batik.ext.awt.image.codec.PNGDecodeParam; import org.apache.batik.ext.awt.image.codec.SeekableStream; -import org.apache.batik.ext.awt.image.codec.MemoryCacheSeekableStream; -import org.apache.batik.ext.awt.image.codec.FileCacheSeekableStream; -import org.apache.batik.ext.awt.image.rendered.Any2sRGBRed; import org.apache.batik.ext.awt.image.rendered.CachableRed; /** @@ -39,133 +31,24 @@ import org.apache.batik.ext.awt.image.rendered.CachableRed; * @see AbstractFopImage * @see FopImage */ -public class PNGImage extends AbstractFopImage { - - private byte[] softMask = null; +public class PNGImage extends BatikImage { + /** + * Constructs a new PNGImage instance. + * @param imgReader basic metadata for the image + */ public PNGImage(FopImage.ImageInfo imgReader) { super(imgReader); } - protected boolean loadDimensions() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.bitmaps != null; - } - /** - * @see org.apache.fop.image.AbstractFopImage#loadBitmap() + * @see org.apache.fop.image.BatikImage#decodeImage(org.apache.batik.ext.awt.image.codec.SeekableStream) */ - protected boolean loadBitmap() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.bitmaps != null; - } - - public boolean hasSoftMask() { - if (this.bitmaps == null) { - loadImage(); - } - - return (this.softMask != null); - } - - public byte[] getSoftMask() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.softMask; - } - - protected void loadImage() { - try { - SeekableStream seekableInput; - try { seekableInput = new FileCacheSeekableStream(inputStream); - } catch (IOException ioe) { - seekableInput = new MemoryCacheSeekableStream(inputStream); - } - - PNGDecodeParam param = new PNGDecodeParam(); - param.setPerformGammaCorrection(true); - param.setDisplayExponent(2.2f); // sRGB gamma - CachableRed cr = new PNGRed(seekableInput, param); - ColorModel cm = cr.getColorModel(); - - this.height = cr.getHeight(); - this.width = cr.getWidth(); - - cr = new Any2sRGBRed(cr); - - this.isTransparent = false; - this.softMask = null; - int transparencyType = cm.getTransparency(); - if ((transparencyType == Transparency.BITMASK) - && (cm instanceof IndexColorModel)) { - // Currently only supports 'transparent color'(?) - IndexColorModel icm = (IndexColorModel)cm; - int numColor = icm.getMapSize(); - byte [] alpha = new byte[numColor]; - icm.getAlphas(alpha); - for (int i = 0; i < numColor; i++) { - if ((alpha[i] & 0xFF) == 0) { - this.isTransparent = true; - int red = (icm.getRed (i)) & 0xFF; - int grn = (icm.getGreen(i)) & 0xFF; - int blu = (icm.getBlue (i)) & 0xFF; - this.transparentColor = new Color(red, grn, blu); - break; - } - } - } - - cm = cr.getColorModel(); - if ((!this.isTransparent) && cm.hasAlpha()) { - this.softMask = new byte[this.width * this.height]; - } - - this.bitsPerPixel = 8; - this.bitmapsSize = this.width * this.height * 3; - this.bitmaps = new byte[this.bitmapsSize]; - this.colorSpace = cm.getColorSpace(); - - WritableRaster wr = (WritableRaster)cr.getData(); - BufferedImage bi = new BufferedImage - (cm, wr.createWritableTranslatedChild(0, 0), - cm.isAlphaPremultiplied(), null); - int [] tmpMap = new int[this.width]; - int idx = 0; - int sfIdx = 0; - for (int y = 0; y < this.height; y++) { - tmpMap = bi.getRGB(0, y, this.width, 1, tmpMap, 0, this.width); - if (softMask != null) { - for (int x = 0; x < this.width; x++) { - int pix = tmpMap[x]; - this.softMask[sfIdx++] = (byte)(pix >>> 24); - this.bitmaps[idx++] = (byte)((pix >>> 16) & 0xFF); - this.bitmaps[idx++] = (byte)((pix >>> 8) & 0xFF); - this.bitmaps[idx++] = (byte)((pix) & 0xFF); - } - } else { - for (int x = 0; x < this.width; x++) { - int pix = tmpMap[x]; - this.bitmaps[idx++] = (byte)((pix >> 16) & 0xFF); - this.bitmaps[idx++] = (byte)((pix >> 8) & 0xFF); - this.bitmaps[idx++] = (byte)((pix) & 0xFF); - } - } - } - } catch (Exception ex) { - ex.printStackTrace(); - /*throw new FopImageException("Error while loading image " - + "" + " : " - + ex.getClass() + " - " - + ex.getMessage()); - */ - } + protected CachableRed decodeImage(SeekableStream stream) throws IOException { + PNGDecodeParam param = new PNGDecodeParam(); + param.setPerformGammaCorrection(true); + param.setDisplayExponent(2.2f); // sRGB gamma + return new PNGRed(stream, param); } -}; + +} diff --git a/src/java/org/apache/fop/image/TIFFImage.java b/src/java/org/apache/fop/image/TIFFImage.java index d4359d844..254b81912 100644 --- a/src/java/org/apache/fop/image/TIFFImage.java +++ b/src/java/org/apache/fop/image/TIFFImage.java @@ -1,48 +1,35 @@ /* - * Copyright 2004 The Apache Software Foundation + * Copyright 2004 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 + * 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. - * + * 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; -import java.awt.Color; -import java.awt.Transparency; -import java.awt.image.ColorModel; -import java.awt.image.IndexColorModel; -import java.awt.image.WritableRaster; -import java.awt.image.BufferedImage; import java.io.IOException; import org.apache.batik.ext.awt.image.codec.SeekableStream; -import org.apache.batik.ext.awt.image.codec.MemoryCacheSeekableStream; -import org.apache.batik.ext.awt.image.codec.FileCacheSeekableStream; -import org.apache.batik.ext.awt.image.rendered.Any2sRGBRed; import org.apache.batik.ext.awt.image.rendered.CachableRed; /** - * FopImage object using TIFF - * @author Eric SCHAEFFER - * @see AbstractFopImage - * @see FopImage + * @author Jeremias Maerki */ -public class TIFFImage extends AbstractFopImage { - - private byte[] softMask = null; +public class TIFFImage extends BatikImage { /** - * Constructs a new TIFFImage instance. + * Constructs a new BatikImage instance. * @param imgReader basic metadata for the image */ public TIFFImage(FopImage.ImageInfo imgReader) { @@ -50,137 +37,11 @@ public class TIFFImage extends AbstractFopImage { } /** - * @see org.apache.fop.image.AbstractFopImage#loadDimensions() - */ - protected boolean loadDimensions() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.bitmaps != null; - } - - /** - * @see org.apache.fop.image.AbstractFopImage#loadBitmap() + * @see org.apache.fop.image.BatikImage#decodeImage(org.apache.batik.ext.awt.image.codec.SeekableStream) */ - protected boolean loadBitmap() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.bitmaps != null; - } - - /** - * @see org.apache.fop.image.FopImage#hasSoftMask() - */ - public boolean hasSoftMask() { - if (this.bitmaps == null) { - loadImage(); - } - - return (this.softMask != null); - } - - /** - * @see org.apache.fop.image.FopImage#getSoftMask() - */ - public byte[] getSoftMask() { - if (this.bitmaps == null) { - loadImage(); - } - - return this.softMask; - } - - /** - * Loads the image from the InputStream. - */ - protected void loadImage() { - try { - SeekableStream seekableInput; - try { seekableInput = new FileCacheSeekableStream(inputStream); - } catch (IOException ioe) { - seekableInput = new MemoryCacheSeekableStream(inputStream); - } - - CachableRed cr; - cr = new org.apache.batik.ext.awt.image.codec.tiff.TIFFImage - (seekableInput, null, 0); - ColorModel cm = cr.getColorModel(); - - this.height = cr.getHeight(); - this.width = cr.getWidth(); - - cr = new Any2sRGBRed(cr); - - this.isTransparent = false; - this.softMask = null; - int transparencyType = cm.getTransparency(); - if ((transparencyType == Transparency.BITMASK) - && (cm instanceof IndexColorModel)) { - // Use 'transparent color'. - IndexColorModel icm = (IndexColorModel)cm; - int numColor = icm.getMapSize(); - byte [] alpha = new byte[numColor]; - icm.getAlphas(alpha); - for (int i = 0; i < numColor; i++) { - if ((alpha[i] & 0xFF) == 0) { - this.isTransparent = true; - int red = (icm.getRed (i)) & 0xFF; - int grn = (icm.getGreen(i)) & 0xFF; - int blu = (icm.getBlue (i)) & 0xFF; - this.transparentColor = new Color(red, grn, blu); - break; - } - } - } - - // Get our current ColorModel - cm = cr.getColorModel(); - - // It has an alpha channel so generate a soft mask. - if ((!this.isTransparent) && cm.hasAlpha()) { - this.softMask = new byte[this.width * this.height]; - } - - this.bitsPerPixel = 8; - this.bitmapsSize = this.width * this.height * 3; - this.bitmaps = new byte[this.bitmapsSize]; - this.colorSpace = cm.getColorSpace(); - - WritableRaster wr = (WritableRaster)cr.getData(); - BufferedImage bi = new BufferedImage - (cm, wr.createWritableTranslatedChild(0, 0), - cm.isAlphaPremultiplied(), null); - int [] tmpMap = new int[this.width]; - int idx = 0; - int sfIdx = 0; - for (int y = 0; y < this.height; y++) { - tmpMap = bi.getRGB(0, y, this.width, 1, tmpMap, 0, this.width); - if (softMask != null) { - for (int x = 0; x < this.width; x++) { - int pix = tmpMap[x]; - this.softMask[sfIdx++] = (byte)(pix >>> 24); - this.bitmaps[idx++] = (byte)((pix >>> 16) & 0xFF); - this.bitmaps[idx++] = (byte)((pix >>> 8) & 0xFF); - this.bitmaps[idx++] = (byte)((pix) & 0xFF); - } - } else { - for (int x = 0; x < this.width; x++) { - int pix = tmpMap[x]; - this.bitmaps[idx++] = (byte)((pix >> 16) & 0xFF); - this.bitmaps[idx++] = (byte)((pix >> 8) & 0xFF); - this.bitmaps[idx++] = (byte)((pix) & 0xFF); - } - } - } - } catch (Exception ex) { - /*throw new FopImageException("Error while loading image " - + "" + " : " - + ex.getClass() + " - " - + ex.getMessage()); - */ - } + protected CachableRed decodeImage(SeekableStream stream) throws IOException { + return new org.apache.batik.ext.awt.image.codec.tiff.TIFFImage + (stream, null, 0); } -}; + +} |