]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Re-adding GifJpegImage class, implementing new FopImage interface
authoreschaeffer <eschaeffer@unknown>
Wed, 24 May 2000 10:43:05 +0000 (10:43 +0000)
committereschaeffer <eschaeffer@unknown>
Wed, 24 May 2000 10:43:05 +0000 (10:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193385 13f79535-47bb-0310-9956-ffa450edef68

src/org/apache/fop/image/GifJpegImage.java [new file with mode: 0644]

diff --git a/src/org/apache/fop/image/GifJpegImage.java b/src/org/apache/fop/image/GifJpegImage.java
new file mode 100644 (file)
index 0000000..5b12918
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+
+ ============================================================================
+                   The Apache Software License, Version 1.1
+ ============================================================================
+    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
+ Redistribution and use in source and binary forms, with or without modifica-
+ tion, are permitted provided that the following conditions are met:
+ 1. Redistributions of  source code must  retain the above copyright  notice,
+    this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+ 3. The end-user documentation included with the redistribution, if any, must
+    include  the following  acknowledgment:  "This product includes  software
+    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
+    Alternately, this  acknowledgment may  appear in the software itself,  if
+    and wherever such third-party acknowledgments normally appear.
+ 4. The names "Fop" and  "Apache Software Foundation"  must not be used to
+    endorse  or promote  products derived  from this  software without  prior
+    written permission. For written permission, please contact
+    apache@apache.org.
+ 5. Products  derived from this software may not  be called "Apache", nor may
+    "Apache" appear  in their name,  without prior written permission  of the
+    Apache Software Foundation.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
+ APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
+ DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
+ ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
+ (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ This software  consists of voluntary contributions made  by many individuals
+ on  behalf of the Apache Software  Foundation and was  originally created by
+ James Tauber <jtauber@jtauber.com>. For more  information on the Apache 
+ Software Foundation, please see <http://www.apache.org/>.
+ */
+
+//Author:       Eric SCHAEFFER
+//Description:  implement FopImage using AWT classes (for Gif or Jpeg images)
+
+package org.apache.fop.image;
+
+import org.apache.fop.datatypes.ColorSpace;
+import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFFilter;
+
+// Java
+import java.util.Hashtable;
+import java.net.URL;
+import java.io.IOException;
+//import java.io.PrintWriter;
+import java.awt.image.*;
+import java.awt.*;
+
+import java.lang.reflect.Array;
+
+public class GifJpegImage implements FopImage {
+
+       int m_width = 0;
+       int m_height = 0;
+       URL m_href = null;
+       ColorSpace m_colorSpace = null;
+       int m_bitsPerPixel = 0;
+       byte[] m_bitmaps = null;
+       int m_bitmapsSize = 0;
+       boolean m_isTransparent = false;
+       PDFColor m_transparentColor = null;
+
+       // Init the object.
+       // If href protocol isn't file://, can load the entire image
+       // and keep it in memory.
+       // Should cache the input stream, and load data when needed.
+       public GifJpegImage(URL href) throws FopImageException {
+               this.m_href = href;
+       }
+
+       protected void getImage() throws FopImageException {
+               int[] tmpMap = null;
+               try {
+                       ImageProducer ip = (ImageProducer)this.m_href.getContent();
+                       FopImageConsumer consumer = new FopImageConsumer();
+                       ip.startProduction(consumer);
+
+                       while (! consumer.isImageReady()) {}
+                       this.m_height = consumer.getHeight();
+                       this.m_width = consumer.getWidth();
+
+                       tmpMap = new int[this.m_width * this.m_height];
+                       PixelGrabber pg = new PixelGrabber(
+                                                                               ip,
+                                                                               0, 0,
+                                                                               this.m_width, this.m_height,
+                                                                               tmpMap, 
+                                                                               0, this.m_width
+                                                                               );
+                       try {
+                               pg.grabPixels();
+                       } catch (InterruptedException intex) {
+                               throw new FopImageException("Image grabbing interrupted : " + intex.getMessage());
+                       }
+               } catch (Exception ex) {
+                       throw new FopImageException("Error while loading image " + this.m_href.toString() + " : " + ex.getClass() + " - " + ex.getMessage());
+               }
+
+               // Should take care of the ColorSpace and bitsPerPixel
+               this.m_bitmaps = new byte[this.m_width * this.m_height * 3];
+               for (int i = 0; i < this.m_height; i++) {
+                       for (int j = 0; j < this.m_width; j++) {
+                               int p = tmpMap[i * this.m_width + j];
+                               int r = (p >> 16) & 0xFF;
+                               int g = (p >>  8) & 0xFF;
+                               int b = (p      ) & 0xFF;
+                               this.m_bitmaps[3 * (i * this.m_width + j)] = (byte) (r & 0xFF);
+                               this.m_bitmaps[3 * (i * this.m_width + j) + 1] = (byte) (g & 0xFF);
+                               this.m_bitmaps[3 * (i * this.m_width + j) + 2] = (byte) (b & 0xFF);
+                       }
+               }
+               this.m_bitmapsSize = java.lang.reflect.Array.getLength(this.m_bitmaps);
+
+               this.m_bitsPerPixel = 8;
+               this.m_colorSpace = new ColorSpace(ColorSpace.DEVICE_RGB);
+       }
+
+       // Get image general properties.
+       // Methods throw exception because they can retrieve data
+       // when needed.
+
+       // Ressource location
+       public String getURL() {
+               return this.m_href.toString();
+       }
+
+       // image size
+       public int getWidth() throws FopImageException {
+               if (this.m_width == 0) this.getImage();
+
+               return this.m_width;
+       }
+
+       public int getHeight() throws FopImageException {
+               if (this.m_height == 0) this.getImage();
+
+               return this.m_height;
+       }
+
+       // DeviceGray, DeviceRGB, or DeviceCMYK
+       public ColorSpace getColorSpace() throws FopImageException {
+               if (this.m_colorSpace == null) this.getImage();
+
+               return this.m_colorSpace;
+       }
+
+       // bits per pixel
+       public int getBitsPerPixel() throws FopImageException {
+               if (this.m_bitsPerPixel == 0) this.getImage();
+
+               return this.m_bitsPerPixel;
+       }
+
+       // For transparent images
+       public boolean isTransparent() throws FopImageException {
+               return false;
+       }
+
+       public PDFColor getTransparentColor() throws FopImageException {
+               return null;
+       }
+
+       // get the image bytes, and bytes properties
+
+       // get uncompressed image bytes
+       public byte[] getBitmaps() throws FopImageException {
+               if (this.m_bitmaps == null) this.getImage();
+
+               return this.m_bitmaps;
+       }
+// width * (bitsPerPixel / 8) * height, no ?
+       public int getBitmapsSize() throws FopImageException {
+               if (this.m_bitmapsSize == 0) this.getImage();
+
+               return this.m_bitmapsSize;
+       }
+
+       // get compressed image bytes
+       // I don't know if we really need it, nor if it
+       // should be changed...
+       public byte[] getRessourceBytes() throws FopImageException {
+               return null;
+       }
+       public int getRessourceBytesSize() throws FopImageException {
+               return 0;
+       }
+       // return null if no corresponding PDFFilter
+       public PDFFilter getPDFFilter() throws FopImageException {
+               return null;
+       }
+
+       // release memory
+       public void close() {
+               /* For the moment, only release the bitmaps (image areas
+                  can share the same FopImage object)
+                  Thus, even if it had been called, other properties
+                  are still available.
+               */
+//             this.m_width = 0;
+//             this.m_height = 0;
+//             this.m_href = null;
+//             this.m_colorSpace = null;
+//             this.m_bitsPerPixel = 0;
+               this.m_bitmaps = null;
+               this.m_bitmapsSize = 0;
+//             this.m_isTransparent = false;
+//             this.m_transparentColor = null;
+       }
+
+       // CONSUMER CLASS
+       public class FopImageConsumer implements ImageConsumer {
+               int width = -1;
+               int height = -1;
+               Integer imageStatus = new Integer(-1);
+
+               public FopImageConsumer() {
+               }
+
+               public void imageComplete(int status) {
+                       synchronized(this.imageStatus) {
+                               // Need to stop status if image done
+                               if (this.imageStatus.intValue() != ImageConsumer.STATICIMAGEDONE)
+                                       this.imageStatus = new Integer(status);
+                       }
+/*
+System.err.print("Status ");
+if (status == ImageConsumer.COMPLETESCANLINES) {
+       System.err.println("CompleteScanLines");
+} else if (status == ImageConsumer.IMAGEABORTED) {
+       System.err.println("ImageAborted");
+} else if (status == ImageConsumer.IMAGEERROR) {
+       System.err.println("ImageError");
+} else if (status == ImageConsumer.RANDOMPIXELORDER) {
+       System.err.println("RandomPixelOrder");
+} else if (status == ImageConsumer.SINGLEFRAME) {
+       System.err.println("SingleFrame");
+} else if (status == ImageConsumer.SINGLEFRAMEDONE) {
+       System.err.println("SingleFrameDone");
+} else if (status == ImageConsumer.SINGLEPASS) {
+       System.err.println("SinglePass");
+} else if (status == ImageConsumer.STATICIMAGEDONE) {
+       System.err.println("StaticImageDone");
+} else if (status == ImageConsumer.TOPDOWNLEFTRIGHT) {
+       System.err.println("TopDownLeftRight");
+}
+*/
+               }
+
+               public boolean isImageReady()
+                       throws Exception {
+                       synchronized(this.imageStatus) {
+                               if ( this.imageStatus.intValue() != -1 ) {
+                                       String statusStr = null;
+                                       if ( this.imageStatus.intValue() == ImageConsumer.IMAGEABORTED ) {
+                                               statusStr = new String("Image Aborted");
+                                       } else if ( this.imageStatus.intValue() == ImageConsumer.IMAGEERROR ) {
+                                               statusStr = new String("Image Error");
+                                       }
+                                       if ( statusStr != null ) {
+                                               throw new Exception("Error in image consumer (" + statusStr + ")");
+                                       }
+               
+                                       if ( this.imageStatus.intValue() == ImageConsumer.STATICIMAGEDONE ) {
+                                               return true;
+                                       }
+                               }
+                               return false;
+                       }
+               }
+
+               public void setColorModel(ColorModel model) {}
+
+               public void setDimensions(int width, int height) {
+                       this.width = width;
+                       this.height = height;
+               }
+
+               public void setHints(int hintflags) {}
+
+               public void setPixels(int x, int y, int w, int h,
+                  ColorModel model, byte[] pixels,int off,
+                  int scansize) {}
+
+               public void setPixels(int x, int y, int w, int h,
+                  ColorModel model, int[] pixels, int off,
+                  int scansize) {}
+
+               public void setProperties(Hashtable props) {}
+
+               public int getWidth() {
+                       return this.width;
+               }
+
+               public int getHeight() {
+                       return this.height;
+               }
+       }
+}