[prev in list] [next in list] [prev in thread] [next in thread] 

List:       fop-cvs
Subject:    cvs commit: xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg DCT.java Encoder.java Huffman.java
From:       bdelacretaz () apache ! org
Date:       2003-06-25 9:01:18
[Download RAW message or body]

bdelacretaz    2003/06/25 02:01:18

  Added:       src/java/org/apache/fop/rtf/rtflib/interfaces
                        ITableColumnsInfo.java
               src/java/org/apache/fop/rtf/rtflib/tools
                        DomToSaxAdapter.java ElementVisitor.java
                        ImageConstants.java ImageUtil.java
               src/java/org/apache/fop/rtf/rtflib/tools/jpeg DCT.java
                        Encoder.java Huffman.java JPEGException.java
                        JpegInfo.java
  Log:
  additional jfor packages donated to the FOP project
  
  Revision  Changes    Path
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/interfaces/ITableColumnsInfo.java  
  Index: ITableColumnsInfo.java
  ===================================================================
  package org.apache.fop.rtf.rtflib.interfaces;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**  Used to get information about tables, for example when handling nested tables
   *     
   *  @author Bertrand Delacretaz bdelacretaz@codeconsult.ch
   */
  
  //------------------------------------------------------------------------------
  // $Id: ITableColumnsInfo.java,v 1.1 2003/06/25 09:01:17 bdelacretaz Exp $
  // $Log: ITableColumnsInfo.java,v $
  // Revision 1.1  2003/06/25 09:01:17  bdelacretaz
  // additional jfor packages donated to the FOP project
  //
  // Revision 1.1  2002/08/12 09:40:02  bdelacretaz
  // V0.7.1dev-e, contributions from Boris Poudérous for number-columns-spanned
  // and vertical merging of tables cells.
  //
  //------------------------------------------------------------------------------
  
  public interface ITableColumnsInfo
  {
      float INVALID_COLUM_WIDTH = 200f;
      
      /** reset the column iteration index, meant to be called when creating a new \
row */  void selectFirstColumn();
  
      /** increment the column iteration index */
      void selectNextColumn();
  
      /** get current column width according to column iteration index
       *  @return INVALID_COLUMN_WIDTH if we cannot find the value
       */
      float getColumnWidth();
  
       /** return current column iteration index */
       int getColumnIndex();
  
       /** return number of columns */
       int getNumberOfColumns();
  }
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/DomToSaxAdapter.java  
  Index: DomToSaxAdapter.java
  ===================================================================
  package org.apache.fop.rtf.rtflib.tools;
  
  import java.io.IOException;
  import org.w3c.dom.*;
  import org.xml.sax.*;
  import org.xml.sax.helpers.AttributesImpl;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
   *  Thanks to John Cowan (cowan@ccil.org) for his DomParser class on which parts 
   *  of this are based. <br>
  -----------------------------------------------------------------------------*/
  
  /**  Walks a DOM document and fires (some) SAX events to simulate parsing
   *  of the original document. <br>
   *  Written to use jfor with Cocoon 1.8. <br>
   *  Only SAX events that are used by the jfor Converter class are implemented. <br>
   *  Namespace URIs and local names are not implemented. <br>
   *  @author Bertrand Delacretaz bdelacretaz@codeconsult.ch
   */
  
  //------------------------------------------------------------------------------
  // $Id: DomToSaxAdapter.java,v 1.1 2003/06/25 09:01:17 bdelacretaz Exp $
  // $Log: DomToSaxAdapter.java,v $
  // Revision 1.1  2003/06/25 09:01:17  bdelacretaz
  // additional jfor packages donated to the FOP project
  //
  // Revision 1.4  2002/07/12 08:08:31  bdelacretaz
  // License changed to jfor Apache-style license
  //
  // Revision 1.3  2001/08/31 07:51:01  bdelacretaz
  // MPL license text added + javadoc class comments corrected
  //
  // Revision 1.2  2001/08/30 10:21:50  bdelacretaz
  // Converter modified to be usable as a pure SAX ContentHandler for Cocoon 2 \
integration  // (thanks to Gianugo Rabellino, gianugo@rabellino.it)
  //
  // Revision 1.1  2001/08/29 13:27:51  bdelacretaz
  // V0.4.1 - base package name changed to org.apache.fop.rtf.rtflib.jfor
  //
  // Revision 1.1.1.1  2001/08/02 12:53:48  bdelacretaz
  // initial SourceForge checkin of V0.1 code
  //
  //------------------------------------------------------------------------------
  
  public class DomToSaxAdapter
  extends ElementVisitor
  {
      private ContentHandler m_handler;
      private final Document m_doc;
      
      /** create an adapter for the given DOM Document */
      public DomToSaxAdapter(Document doc)
      {
          m_doc = doc;
      }
      
      /** walk the document and send SAX events to the given ContentHandler */
      public void simulateParsing(ContentHandler ch) throws IOException,SAXException
      {
          m_handler = ch;
          this.visit(m_doc.getDocumentElement());
          m_handler.endDocument();
      }
      
      /** called at the start of the visit of an Element */
      protected void startElement(Element e) throws IOException,SAXException
      {
          m_handler.startElement(null,null,e.getTagName(),saxAttributes(e.getAttributes()));
  }
  
      /** called at the end of the visit of an Element */
      protected void endElement(Element e) throws IOException,SAXException
      {
          m_handler.endElement(null,null,e.getTagName());
      }
  
      /** called to visit a Text node */
      protected void visitText(Text t) throws IOException,SAXException
      {
          final String data = t.getNodeValue();
          final int datalen = data.length();
          final char [] array = new char[datalen];
          data.getChars(0, datalen, array, 0);
          m_handler.characters(array, 0, datalen);
      }
  
      /** called to visit a CDATASection node */
      protected void visitCDATA(CDATASection cds) throws IOException
      {
          // not needed by jfor
      }
  
      /** called to visit a Comment node */
      protected void visitComment(Comment c) throws IOException
      {
          // not needed by jfor
      }
  
      /** called to visit a Node that is not of the other types */
      protected void visitNode(Node n) throws IOException
      {
          // not needed by jfor
      }
      
      /** convert DOM attributes to SAX */
      private static Attributes saxAttributes(NamedNodeMap domAttr)
      {
          final String ATTR_TYPE = "CDATA";
          
          final AttributesImpl result = new AttributesImpl();
          for(int i=0; i < domAttr.getLength(); i++) {
              final Attr a = (Attr)domAttr.item(i);
              // namespace information is not provided, not needed by jfor
              result.addAttribute(null,null,a.getName(),ATTR_TYPE,a.getValue());
          }
          return result;
      }
  }
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/ElementVisitor.java  
  Index: ElementVisitor.java
  ===================================================================
  package org.apache.fop.rtf.rtflib.tools;
  
  import java.io.IOException;
  import org.w3c.dom.*;
  import org.xml.sax.SAXException;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**  Recursive visit of a DOM Element.
   *  @author Bertrand Delacretaz bdelacretaz@codeconsult.ch
   */
  
  //------------------------------------------------------------------------------
  // $Id: ElementVisitor.java,v 1.1 2003/06/25 09:01:17 bdelacretaz Exp $
  // $Log: ElementVisitor.java,v $
  // Revision 1.1  2003/06/25 09:01:17  bdelacretaz
  // additional jfor packages donated to the FOP project
  //
  // Revision 1.3  2002/07/12 08:08:31  bdelacretaz
  // License changed to jfor Apache-style license
  //
  // Revision 1.2  2001/08/31 07:51:01  bdelacretaz
  // MPL license text added + javadoc class comments corrected
  //
  // Revision 1.1  2001/08/29 13:27:51  bdelacretaz
  // V0.4.1 - base package name changed to org.apache.fop.rtf.rtflib.jfor
  //
  // Revision 1.1.1.1  2001/08/02 12:53:48  bdelacretaz
  // initial SourceForge checkin of V0.1 code
  //
  //------------------------------------------------------------------------------
  
  public abstract class ElementVisitor
  {
      /** recursively visit element e */
      public final void visit(Element e)
          throws IOException,SAXException
      {
          if(e!=null) {
              startElement(e);
  
              final NodeList list = e.getChildNodes();
              for(int i=0; i < list.getLength(); i++) {
                  Node n = list.item(i);
                  if(n instanceof Element) {
                      visit((Element)n);
                  } else if(n instanceof CDATASection) {
                      visitCDATA((CDATASection)n);
                  } else if(n instanceof Text) {
                      visitText((Text)n);
                  } else if(n instanceof Comment) {
                      visitComment((Comment)n);
                  } else {
                      visitNode(n);
                  }
              }
  
              endElement(e);
          }
      }
  
      /** called at the start of the visit of an Element */
      protected abstract void startElement(Element e) throws \
IOException,SAXException;  
      /** called at the end of the visit of an Element */
      protected abstract void endElement(Element e) throws IOException,SAXException;
  
      /** called to visit a Text node */
      protected abstract void visitText(Text t) throws IOException,SAXException;
  
      /** called to visit a CDATASection node */
      protected abstract void visitCDATA(CDATASection cds) throws \
IOException,SAXException;  
      /** called to visit a Comment node */
      protected abstract void visitComment(Comment c) throws \
IOException,SAXException;  
      /** called to visit a Node that is not of the other types */
      protected abstract void visitNode(Node n) throws IOException,SAXException;
  }
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/ImageConstants.java  
  Index: ImageConstants.java
  ===================================================================
  /*
   * File: ImageConstants.java
   *
   *
   * Date         Author                   Changes
   * Aug 16 01    Andreas Putz             Created
   * Aug 17 01    Andreas Putz             Extended with "gif"
   *
   * (c) 2001 skynamics AG    All rights reserved.
   */
  package org.apache.fop.rtf.rtflib.tools;
  
  import java.util.Hashtable;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /** Here will be defined all supported image formats.
   *  This class belongs to the <fo:external-graphic> tag processing.
   *  @author <a href="mailto:a.putz@skynamics.com">Andreas Putz</a>
   */
  
  public class ImageConstants
  {
  	//////////////////////////////////////////////////
  	// @@ Symbolic constants
  	//////////////////////////////////////////////////
  
  	/** Defines the case, if image is not supported */
  	public static int I_NOT_SUPPORTED = -1;
  
  	public static int I_EMF = 0;
  	public static int I_PNG = 1;
  	public static int I_JPG = 2;
  
  	/** Defines the RTF properties */
  	public static String [] RTF_TAGS = new String []
  		{
  			"emfblip", "pngblip", "jpegblip"
  		};
  
  	public static int I_TO_CONVERT_BASIS = 50;
  	public static int I_GIF = 50;
  	public static int I_JPG_C = 51;
  
  	/** Defines the types for converting rtf supported image types */
  	public static int [] CONVERT_TO = new int []
  		{
  			I_JPG, I_JPG
  		};
  
  	/** EMF file extension */
  	public static String EMF_EXT = "emf";
  	/** PNG file extension */
  	public static String PNG_EXT = "png";
  	/** JPG file extension */
  	public static String JPG_EXT = "jpg";
  	/** JPEG file extension */
  	public static String JPEG_EXT = "jpeg";
  	/** GIF file extension */
  	public static String GIF_EXT = "gif";
  
  	/** Defines the file extensions and the RTF property belongs to */
  	public static Hashtable SUPPORTED_IMAGE_TYPES = new Hashtable ();
  	static
  	{
  		SUPPORTED_IMAGE_TYPES.put (EMF_EXT, new Integer (I_EMF));
  		SUPPORTED_IMAGE_TYPES.put (PNG_EXT, new Integer (I_PNG));
  		SUPPORTED_IMAGE_TYPES.put (JPG_EXT, new Integer (I_JPG_C));
  		SUPPORTED_IMAGE_TYPES.put (JPEG_EXT,new Integer (I_JPG_C));
  		SUPPORTED_IMAGE_TYPES.put (GIF_EXT, new Integer (I_GIF));
  	}
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * Private constructor.
  	 */
  	private ImageConstants()
  	{
  	}
  }
  
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/ImageUtil.java  
  Index: ImageUtil.java
  ===================================================================
  package org.apache.fop.rtf.rtflib.tools;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**  Misc.utilities for images handling
   *  This class belongs to the <fo:external-graphic> tag processing.
   *  @author <a href="mailto:a.putz@skynamics.com">Andreas Putz</a>
   */
  public class ImageUtil
  {
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * Private constructor.
  	 */
  	private ImageUtil ()
  	{
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Public static methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * Determines the digits from a string.
  	 *
  	 * @param value String with digits
  	 *
  	 * @return
  	 *  -1      There is no digit\n
  	 *  number  The digits as integer
  	 */
  	public static int getInt (String value)
  	{
  		String retString = new String ();
  		StringBuffer s = new StringBuffer (value);
  		int len = s.length ();
  
  		for (int i = 0; i < len; i++)
  		{
  			if (Character.isDigit (s.charAt (i)))
  			{
  				retString += s.charAt (i);
  			}
  		}
  
  		if (retString.length () == 0)
  		{
  			return -1;
  		}
  		else
  		{
  			return Integer.parseInt (retString);
  		}
  	}
  
  	/**
  	 * Checks the string for percent character at the end of string.
  	 *
  	 * @param value String with digits
  	 *
  	 * @return
  	 * true    The string contains a % value
  	 * false   Other string
  	 */
  	public static boolean isPercent (String value)
  	{
  		if (value.endsWith ("%"))
  		{
  			return true;
  
  		}
  
  		return false;
  	}
  
  	/**
  	 * Compares two hexadecimal values.
  	 *
  	 * @param pattern Target
  	 * @param data Data
  	 * @param searchAt Position to start compare
  	 * @param searchForward Direction to compare byte arrays
  	 *
  	 * @return
  	 *  true    If equal\n
  	 *  false   If different
  	 */
  	public static boolean compareHexValues (byte[] pattern, byte[] data, int searchAt,
  											boolean searchForward)
  	{
  		if (searchAt >= data.length)
  		{
  			return false;
  
  		}
  
  		int pLen = pattern.length;
  
  		if (searchForward)
  		{
  			if (pLen >= (data.length - searchAt))
  			{
  				return false;
  
  			}
  
  			for (int i = 0; i < pLen; i++)
  			{
  				if (pattern[i] != data[searchAt + i])
  				{
  					return false;
  				}
  			}
  
  			return true;
  		}
  		else
  		{
  			if (pLen > (searchAt + 1))
  			{
  				return false;
  
  			}
  
  			for (int i = 0; i < pLen; i++)
  			{
  				if (pattern[pLen - i - 1] != data[searchAt - i])
  				{
  					return false;
  				}
  			}
  
  			return true;
  		}
  	}
  
  	/**
  	 * Determines a integer value from a hexadecimal byte array.
  	 *
  	 * @param data Image
  	 * @param start Start index to read from
  	 * @param end End index until to read
  	 *
  	 * @return A number
  	 */
  	public static int getIntFromByteArray (byte[] data, int startAt, int length,
  										   boolean searchForward)
  	{
  		int bit = 8;
  		int bitMoving = length * bit;
  		int retVal = 0;
  
  		if (startAt >= data.length)
  		{
  			return retVal;
  
  		}
  
  		if (searchForward)
  		{
  			if (length >= (data.length - startAt))
  			{
  				return retVal;
  
  			}
  
  			for (int i = 0; i < length; i++)
  			{
  				bitMoving -= bit;
  				int iData = (int) data[startAt + i];
  				if (iData < 0)
  					iData += 256;
  				retVal += iData << bitMoving;
  			}
  		}
  		else
  		{
  			if (length > (startAt + 1))
  			{
  				return retVal;
  
  			}
  
  			for (int i = 0; i < length; i++)
  			{
  				bitMoving -= bit;
  				int iData = (int) data[startAt - i];
  				if (iData < 0)
  					iData += 256;
  				retVal += iData << bitMoving;			}
  		}
  
  		return retVal;
  	}
  }
  
  
  1.1                  xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg/DCT.java
  
  Index: DCT.java
  ===================================================================
  /**
   * File: DCT.java
   *
   *
   * Date         Author                   Changes
   * Aug 17 01    Andreas Putz             Created
   */
  package org.apache.fop.rtf.rtflib.tools.jpeg;
  
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**
   * DCT - A Java implementation of the Discreet Cosine Transform.
   * This class incorporates quality scaling as implemented in the JPEG-6a
   * library.
   */
  class DCT
  {
  	//////////////////////////////////////////////////
  	// @@ Members
  	//////////////////////////////////////////////////
  
  	/** Quantum */
  	private Object quantum[] = new Object[2];
  	/** Divisors */
  	private Object divisors[] = new Object[2];
  
  
  	//////////////////////////////////////////////////
  	// @@ Definitions
  	//////////////////////////////////////////////////
  
  	/** DCT Block Size - default 8 */
  	private static int dctBlockSize = 8;
  
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * Constructs a new DCT object. Initializes the cosine transform matrix
  	 * these are used when computing the DCT and it's inverse. This also
  	 * initializes the run length counters and the ZigZag sequence. Note that
  	 * the image quality can be worse than 25 however the image will be
  	 * extemely pixelated, usually to a block size of N.
  	 *
  	 * @param quality The quality of the image (0 worst - 100 best) 80 ist the best \
                result
  	 *
  	 */
  	DCT (int quality)
  	{
  		initMatrix (quality);
  	}
  
  	/**
  	 * Dispose.
  	 */
  	public void dispose ()
  	{
  		// nothing to dispose
  	}
  
  	//////////////////////////////////////////////////
  	// @@ Member access
  	//////////////////////////////////////////////////
  
  	/**
  	 * Gets a value from quantum.
  	 * @param index Index
  	 * @return Interger array
  	 */
  	int[] getQuantumArray (int index)
  	{
  		return (int[]) quantum [index];
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * This method quantitizes data and rounds it to the nearest integer.
  	 *
  	 * @param inputData
  	 * @param code
  	 *
  	 * @return Integer array
  	 */
  	int[] quantizeBlock (double inputData[][], int code)
  	{
  		int outputData[] = new int[dctBlockSize * dctBlockSize];
  		int i, j;
  		int index;
  
  		index = 0;
  
  		for (i = 0; i < 8; i++)
  		{
  			for (j = 0; j < 8; j++)
  			{
  
  				// The second line results in significantly better compression.
  				outputData[index] = (int) (Math.round (inputData[i][j]
  													   * (((double[]) (divisors[code]))[index])));
  
  				index++;
  			}
  		}
  
  		return outputData;
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Private methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * This method sets up the quantization matrix for luminance and
  	 * chrominance using the Quality parameter.
  	 *
  	 * @param quality Quality of result image
  	 */
  	private void initMatrix (int quality)
  	{
  		double[] AANscaleFactor =
  		{
  			1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.541196100, \
0.275899379  };
  
  
  		// converting quality setting to that specified in the jpeg_quality_scaling
  		// method in the IJG Jpeg-6a C libraries
  
  
  		if (quality <= 0)
  		{
  			quality = 1;
  		}
  		else if (quality > 100)
  		{
  			quality = 100;
  		}
  
  		if (quality < 50)
  		{
  			quality = 5000 / quality;
  		}
  		else
  		{
  			quality = 200 - quality * 2;
  		}
  
  		 // Creating quantitization matrix for luminance.
  		int quantum_luminance[] = new int[]
  		{
  			 16, 11, 10, 16, 24, 40, 51, 61, 12, 12,
  			 14, 19, 26, 58, 60, 55, 14, 13, 16, 24,
  			 40, 57, 69, 56, 14, 17, 22, 29, 51, 87,
  			 80, 62, 18, 22, 37, 56, 68,109,103, 77,
  			 24, 35, 55, 64, 81,104,113, 92, 49, 64,
  			 78, 87,103,121,120,101, 72, 92, 95, 98,
  			112,100,103, 99
  		};
  
  		for (int j = 0; j < 64; j++)
  		{
  			int temp = (quantum_luminance[j] * quality + 50) / 100;
  
  			if (temp <= 0)
  			{
  				temp = 1;
  			}
  
  			if (temp > 255)
  			{
  				temp = 255;
  			}
  
  			quantum_luminance[j] = temp;
  		}
  
  		int index = 0;
  
  		double divisorsLuminance[] = new double[dctBlockSize * dctBlockSize];
  
  		for (int i = 0; i < 8; i++)
  		{
  			for (int j = 0; j < 8; j++)
  			{
  
  				// The divisors for the LL&M method (the slow integer method used in
  				// jpeg 6a library).  This method is currently (04/04/98) incompletely
  				// implemented.
  				// divisorsLuminance[index] = ((double) quantum_luminance[index]) << 3;
  				// The divisors for the AAN method (the float method used in jpeg 6a library.
  				divisorsLuminance[index] = (double) ((double) 1.0
  													 / ((double) quantum_luminance[index]
  														* AANscaleFactor[i] * AANscaleFactor[j]
  														* (double) 8.0));
  				index++;
  			}
  		}
  
  		// Creating the quantitization matrix for chrominance.
  		int quantum_chrominance[] = new int[]
  		{
  			17,18,24,47,99,99,99,99,18,21,
  			26,66,99,99,99,99,24,26,56,99,
  			99,99,99,99,47,66,99,99,99,99,
  			99,99,99,99,99,99,99,99,99,99,
  			99,99,99,99,99,99,99,99,99,99,
  			99,99,99,99,99,99,99,99,99,99,
  			99,99,99,99
  		};
  
  		for (int j = 0; j < 64; j++)
  		{
  			int temp = (quantum_chrominance[j] * quality + 50) / 100;
  
  			if (temp <= 0)
  			{
  				temp = 1;
  			}
  
  			if (temp >= 255)
  			{
  				temp = 255;
  			}
  
  			quantum_chrominance[j] = temp;
  		}
  
  		index = 0;
  
  		double divisorsChrominance[] = new double[dctBlockSize * dctBlockSize];
  
  		for (int i = 0; i < 8; i++)
  		{
  			for (int j = 0; j < 8; j++)
  			{
  
  				// The divisors for the LL&M method (the slow integer method used in
  				// jpeg 6a library).  This method is currently (04/04/98) incompletely
  				// implemented.
  				// divisorsChrominance[index] = ((double) quantum_chrominance[index]) << 3;
  				// The divisors for the AAN method (the float method used in jpeg 6a library.
  				divisorsChrominance[index] = (double) ((double) 1.0
  													   / ((double) quantum_chrominance[index]
  														  * AANscaleFactor[i] * AANscaleFactor[j]
  														  * (double) 8.0));
  				index++;
  			}
  		}
  
  		// quantum and Divisors are objects used to hold the appropriate matices
  
  		quantum[0] = quantum_luminance;
  		divisors[0] = divisorsLuminance;
  		quantum[1] = quantum_chrominance;
  		divisors[1] = divisorsChrominance;
  
  
  	}
  
  	/**
  	 * This method preforms forward DCT on a block of image data using
  	 * the literal method specified for a 2-D Discrete Cosine Transform.
  	 * It is included as a curiosity and can give you an idea of the
  	 * difference in the compression result (the resulting image quality)
  	 * by comparing its output to the output of the AAN method below.
  	 * It is ridiculously inefficient.
  	 *
  	 * For now the final output is unusable.  The associated quantization step
  	 * needs some tweaking.  If you get this part working, please let me know.
  	 *
  	 * @param input Float array
  	 *
  	 * @return Double array
  	 */
  	private double[][] forwardDCTExtreme (float input[][])
  	{
  		double output[][] = new double[dctBlockSize][dctBlockSize];
  
  		for (int v = 0; v < 8; v++)
  		{
  			for (int u = 0; u < 8; u++)
  			{
  				for (int x = 0; x < 8; x++)
  				{
  					for (int y = 0; y < 8; y++)
  					{
  						output[v][u] +=
  							((double) input[x][y])
  							* Math.cos (((double) (2 * x + 1) * (double) u * Math.PI) / (double) 16)
  							* Math.cos (((double) (2 * y + 1) * (double) v * Math.PI)
  										/ (double) 16);
  					}
  				}
  
  				output[v][u] *= (double) (0.25)
  								* ((u == 0) ? ((double) 1.0 / Math.sqrt (2)) : (double) 1.0)
  								* ((v == 0) ? ((double) 1.0 / Math.sqrt (2)) : (double) 1.0);
  			}
  		}
  
  		return output;
  	}
  
  
  	/**
  	 * This method preforms a DCT on a block of image data using the AAN
  	 * method as implemented in the IJG Jpeg-6a library.
  	 *
  	 * @param input Float array
  	 *
  	 * @return Double array
  	 */
  	double[][] forwardDCT (float input[][])
  	{
  		double output[][] = new double[dctBlockSize][dctBlockSize];
  		double tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  		double tmp10, tmp11, tmp12, tmp13;
  		double z1, z2, z3, z4, z5, z11, z13;
  		int i;
  		int j;
  
  		// Subtracts 128 from the input values
  		for (i = 0; i < 8; i++)
  		{
  			for (j = 0; j < 8; j++)
  			{
  				output[i][j] = ((double) input[i][j] - (double) 128.0);
  
  				// input[i][j] -= 128;
  
  			}
  		}
  
  		for (i = 0; i < 8; i++)
  		{
  			tmp0 = output[i][0] + output[i][7];
  			tmp7 = output[i][0] - output[i][7];
  			tmp1 = output[i][1] + output[i][6];
  			tmp6 = output[i][1] - output[i][6];
  			tmp2 = output[i][2] + output[i][5];
  			tmp5 = output[i][2] - output[i][5];
  			tmp3 = output[i][3] + output[i][4];
  			tmp4 = output[i][3] - output[i][4];
  
  			tmp10 = tmp0 + tmp3;
  			tmp13 = tmp0 - tmp3;
  			tmp11 = tmp1 + tmp2;
  			tmp12 = tmp1 - tmp2;
  
  			output[i][0] = tmp10 + tmp11;
  			output[i][4] = tmp10 - tmp11;
  
  			z1 = (tmp12 + tmp13) * (double) 0.707106781;
  			output[i][2] = tmp13 + z1;
  			output[i][6] = tmp13 - z1;
  
  			tmp10 = tmp4 + tmp5;
  			tmp11 = tmp5 + tmp6;
  			tmp12 = tmp6 + tmp7;
  
  			z5 = (tmp10 - tmp12) * (double) 0.382683433;
  			z2 = ((double) 0.541196100) * tmp10 + z5;
  			z4 = ((double) 1.306562965) * tmp12 + z5;
  			z3 = tmp11 * ((double) 0.707106781);
  
  			z11 = tmp7 + z3;
  			z13 = tmp7 - z3;
  
  			output[i][5] = z13 + z2;
  			output[i][3] = z13 - z2;
  			output[i][1] = z11 + z4;
  			output[i][7] = z11 - z4;
  		}
  
  		for (i = 0; i < 8; i++)
  		{
  			tmp0 = output[0][i] + output[7][i];
  			tmp7 = output[0][i] - output[7][i];
  			tmp1 = output[1][i] + output[6][i];
  			tmp6 = output[1][i] - output[6][i];
  			tmp2 = output[2][i] + output[5][i];
  			tmp5 = output[2][i] - output[5][i];
  			tmp3 = output[3][i] + output[4][i];
  			tmp4 = output[3][i] - output[4][i];
  
  			tmp10 = tmp0 + tmp3;
  			tmp13 = tmp0 - tmp3;
  			tmp11 = tmp1 + tmp2;
  			tmp12 = tmp1 - tmp2;
  
  			output[0][i] = tmp10 + tmp11;
  			output[4][i] = tmp10 - tmp11;
  
  			z1 = (tmp12 + tmp13) * (double) 0.707106781;
  			output[2][i] = tmp13 + z1;
  			output[6][i] = tmp13 - z1;
  
  			tmp10 = tmp4 + tmp5;
  			tmp11 = tmp5 + tmp6;
  			tmp12 = tmp6 + tmp7;
  
  			z5 = (tmp10 - tmp12) * (double) 0.382683433;
  			z2 = ((double) 0.541196100) * tmp10 + z5;
  			z4 = ((double) 1.306562965) * tmp12 + z5;
  			z3 = tmp11 * ((double) 0.707106781);
  
  			z11 = tmp7 + z3;
  			z13 = tmp7 - z3;
  
  			output[5][i] = z13 + z2;
  			output[3][i] = z13 - z2;
  			output[1][i] = z11 + z4;
  			output[7][i] = z11 - z4;
  		}
  
  		return output;
  	}
  
  	/**
  	 * This is the method for quantizing a block DCT'ed with forwardDCTExtreme
  	 * This method quantitizes data and rounds it to the nearest integer.
  	 *
  	 * @param inputData
  	 * @param code
  	 *
  	 * @return
  	 */
  	private int[] quantizeBlockExtreme (double inputData[][], int code)
  	{
  		int outputData[] = new int[dctBlockSize * dctBlockSize];
  		int i, j;
  		int index;
  
  		index = 0;
  
  		for (i = 0; i < 8; i++)
  		{
  			for (j = 0; j < 8; j++)
  			{
  				outputData[index] =
  					(int) (Math.round (inputData[i][j]
  									   / (double) (((int[]) (quantum[code]))[index])));
  				index++;
  			}
  		}
  
  		return outputData;
  	}
  }
  
  
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg/Encoder.java  
  Index: Encoder.java
  ===================================================================
  /**
   * File: Encoder.java
   *
   *
   * Date         Author                   Changes
   * Aug 16 01    Andreas Putz             Created
   * Aug 21 01    Andreas Putz             Bug fixed (bottom and right line)
   */
  package org.apache.fop.rtf.rtflib.tools.jpeg;
  
  
  import java.awt.Image;
  
  import java.awt.Component;
  import java.awt.MediaTracker;
  import java.io.BufferedOutputStream;
  import java.io.OutputStream;
  import java.io.IOException;
  
  import java.io.*;
  import java.net.URL;
  import java.awt.Toolkit;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
   * @author Andreas Putz <a.putz@skynamics.com>
  -----------------------------------------------------------------------------*/
  
  /**
   * Encoder - The JPEG main program which performs a jpeg compression of
   * an gif or tif image.
   */
  public class Encoder extends Component
  {
  
  	//////////////////////////////////////////////////
  	// @@ Members
  	//////////////////////////////////////////////////
  
  	private BufferedOutputStream outStream = null;
  	private JpegInfo jpegObj = null;
  	private Huffman huf = null;
  	private DCT dct = null;
  
  	private int quality;
  
  
  	//////////////////////////////////////////////////
  	// @@ Static definitions
  	//////////////////////////////////////////////////
  
  	public static int[] jpegNaturalOrder =
  	{
  		0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, \
41, 34, 27,  20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, \
23, 30, 37, 44, 51,  58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63,
  	};
  
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * Constructor.
  	 *
  	 * @param quality Percentage to compress
  	 * @param out Outputstream
  	 */
  	public Encoder (int quality, OutputStream out)
  	{
  		outStream = outStream = new BufferedOutputStream (out);
  		this.quality = quality;
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Public encode methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * Encodes a JPEG.
  	 * @param image AWT Image
  	 *
  	 * @exception JPEGException On error
  	 */
  	public void encodeJPEG (Image image) throws JPEGException
  	{
  		process (image);
  	}
  
  	/**
  	 * Encodes a JPEG.
  	 *
  	 * @param url URL of a gif or tif image
  	 *
  	 * @exception JPEGException On error
  	 */
  	public void encodeJPEG (URL url) throws JPEGException
  	{
  		Image image = Toolkit.getDefaultToolkit ().getImage (url);
  		process (image);
  	}
  
  	/**
  	 * Encodes a JPEG.
  	 *
  	 * @param data Byte array with data of a gif or tif image
  	 *
  	 * @exception JPEGException On error
  	 */
  	public void encodeJPEG (byte[] data) throws JPEGException
  	{
  		Image image = Toolkit.getDefaultToolkit ().createImage (data);
  		process (image);
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Private encode methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * Encode Image process.
  	 *
  	 * @param image AWT Image
  	 *
  	 * @exception JPEGException On error
  	 */
  	private void process (Image image) throws JPEGException
  	{
  		MediaTracker tracker = new MediaTracker (this);
  		tracker.addImage (image, 0);
  		try
  		{
  		  tracker.waitForID (0);
  		}
  		catch (InterruptedException e)
  		{
  		  // Got to do something?
  		}
  
  		/*
  		 * Quality of the image.
  		 * 0 to 100 and from bad image quality, high compression to good
  		 * image quality low compression
  		 */
  		setQuality (quality);
  
  		jpegObj = new JpegInfo (image);
  
  		huf = new Huffman ();
  
  		compress ();
  
  		dispose ();
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Member access
  	//////////////////////////////////////////////////
  
  	/**
  	 * Gets the quality of jpeg image.
  	 *
  	 * return A value between 0 and 100
  	 */
  	public int getQuality ()
  	{
  		return quality;
  	}
  
  	/**
  	 * Sets the quality of jpeg image.
  	 *
  	 * @param quality From 0 to 100 %
  	 */
  	public void setQuality (int quality)
  	{
  		this.quality = quality;
  		dct = new DCT (quality);
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Helpers
  	//////////////////////////////////////////////////
  
  	/**
  	 * Dispose.
  	 */
  	private void dispose ()
  	{
  		if (jpegObj != null)
  		{
  			jpegObj.dispose ();
  			jpegObj = null;
  		}
  		if (huf != null)
  		{
  			huf.dispose ();
  			huf = null;
  		}
  		if (dct != null)
  		{
  			dct.dispose ();
  			dct = null;
  		}
  	}
  
  	/**
  	 * Compress the image and write to output stream.
  	 *
  	 * @exception JPEGException On error
  	 */
  	private void compress () throws JPEGException
  	{
  		WriteHeaders (outStream);
  		WriteCompressedData (outStream);
  		WriteEOI (outStream);
  
  		try
  		{
  			outStream.flush ();
  		}
  		catch (IOException e)
  		{
  			throw new JPEGException (e);
  		}
  	}
  
  	/**
  	 * Writes the End Of Image marker.
  	 *
  	 * @param out Output stream to write out
  	 */
  	private void WriteEOI (BufferedOutputStream out)
  	{
  		byte[] EndOfImage =
  		{
  			(byte) 0xFF, (byte) 0xD9
  		};
  
  		WriteMarker (EndOfImage, out);
  	}
  
  	/**
  	 * Writes the header information.
  	 *
  	 * @param out Output stream to write out
  	 */
  	private void WriteHeaders (BufferedOutputStream out)
  	{
  		int i, j, index, offset, length;
  		int tempArray[];
  
  		// the SOI marker
  		byte[] startOfImage =
  		{
  			(byte) 0xFF, (byte) 0xD8
  		};
  
  		WriteMarker (startOfImage, out);
  
  		// The order of the following headers is quiet inconsequential.
  		// the jFIF header
  		byte jFIF[] = new byte[18];
  
  		jFIF[0] = (byte) 0xff;
  		jFIF[1] = (byte) 0xe0;
  		jFIF[2] = (byte) 0x00;
  		jFIF[3] = (byte) 0x10;
  		jFIF[4] = (byte) 0x4a;
  		jFIF[5] = (byte) 0x46;
  		jFIF[6] = (byte) 0x49;
  		jFIF[7] = (byte) 0x46;
  		jFIF[8] = (byte) 0x00;
  		jFIF[9] = (byte) 0x01;
  		jFIF[10] = (byte) 0x00;
  		jFIF[11] = (byte) 0x00;
  		jFIF[12] = (byte) 0x00;
  		jFIF[13] = (byte) 0x01;
  		jFIF[14] = (byte) 0x00;
  		jFIF[15] = (byte) 0x01;
  		jFIF[16] = (byte) 0x00;
  		jFIF[17] = (byte) 0x00;
  
  		WriteArray (jFIF, out);
  
  		// Comment Header
  		String comment = new String ();
  
  		comment = jpegObj.getComment ();
  		length = comment.length ();
  
  		byte cOM[] = new byte[length + 4];
  
  		cOM[0] = (byte) 0xFF;
  		cOM[1] = (byte) 0xFE;
  		cOM[2] = (byte) ((length >> 8) & 0xFF);
  		cOM[3] = (byte) (length & 0xFF);
  
  		java.lang.System.arraycopy (jpegObj.getComment().getBytes (), 0, cOM, 4,
  									jpegObj.getComment().length ());
  		WriteArray (cOM, out);
  
  		// The dQT header
  		// 0 is the luminance index and 1 is the chrominance index
  		byte dQT[] = new byte[134];
  
  		dQT[0] = (byte) 0xFF;
  		dQT[1] = (byte) 0xDB;
  		dQT[2] = (byte) 0x00;
  		dQT[3] = (byte) 0x84;
  		offset = 4;
  
  		for (i = 0; i < 2; i++)
  		{
  			dQT[offset++] = (byte) ((0 << 4) + i);
  			tempArray = dct.getQuantumArray (i);
  
  			for (j = 0; j < 64; j++)
  			{
  				dQT[offset++] = (byte) tempArray[jpegNaturalOrder[j]];
  			}
  		}
  
  		WriteArray (dQT, out);
  
  		// Start of Frame Header
  		byte startOfFrame[] = new byte[19];
  
  		startOfFrame[0] = (byte) 0xFF;
  		startOfFrame[1] = (byte) 0xC0;
  		startOfFrame[2] = (byte) 0x00;
  		startOfFrame[3] = (byte) 17;
  		startOfFrame[4] = (byte) jpegObj.PRECISION;
  		startOfFrame[5] = (byte) ((jpegObj.getImageHeight () >> 8) & 0xFF);
  		startOfFrame[6] = (byte) ((jpegObj.getImageHeight ()) & 0xFF);
  		startOfFrame[7] = (byte) ((jpegObj.getImageWidth () >> 8) & 0xFF);
  		startOfFrame[8] = (byte) ((jpegObj.getImageWidth ()) & 0xFF);
  		startOfFrame[9] = (byte) jpegObj.getNumberOfComponents ();
  		index = 10;
  
  		for (i = 0; i < startOfFrame[9]; i++)
  		{
  			startOfFrame[index++] = (byte) jpegObj.COMP_ID[i];
  			startOfFrame[index++] = (byte) ((jpegObj.H_SAMP_FACTOR[i] << 4) + \
jpegObj.V_SAMP_FACTOR[i]);  startOfFrame[index++] = (byte) jpegObj.Q_TABLE_NUMBER[i];
  		}
  
  		WriteArray (startOfFrame, out);
  
  		// The dHT Header
  		byte dHT1[], dHT2[], dHT3[], dHT4[];
  		int bytes, temp, oldindex, intermediateindex;
  
  		length = 2;
  		index = 4;
  		oldindex = 4;
  		dHT1 = new byte[17];
  		dHT4 = new byte[4];
  		dHT4[0] = (byte) 0xFF;
  		dHT4[1] = (byte) 0xC4;
  
  		for (i = 0; i < 4; i++)
  		{
  			bytes = 0;
  			dHT1[index++ - oldindex] = (byte) huf.getBits (i)[0];
  
  			for (j = 1; j < 17; j++)
  			{
  				temp = huf.getBits (i)[j];
  				dHT1[index++ - oldindex] = (byte) temp;
  				bytes += temp;
  			}
  
  			intermediateindex = index;
  			dHT2 = new byte[bytes];
  
  			for (j = 0; j < bytes; j++)
  			{
  				dHT2[index++ - intermediateindex] = (byte) huf.getVal (i)[j];
  			}
  
  			dHT3 = new byte[index];
  
  			java.lang.System.arraycopy (dHT4, 0, dHT3, 0, oldindex);
  			java.lang.System.arraycopy (dHT1, 0, dHT3, oldindex, 17);
  			java.lang.System.arraycopy (dHT2, 0, dHT3, oldindex + 17, bytes);
  
  			dHT4 = dHT3;
  			oldindex = index;
  		}
  
  		dHT4[2] = (byte) (((index - 2) >> 8) & 0xFF);
  		dHT4[3] = (byte) ((index - 2) & 0xFF);
  
  		WriteArray (dHT4, out);
  
  
  		// Start of Scan Header
  		byte SOS[] = new byte[14];
  
  		SOS[0] = (byte) 0xFF;
  		SOS[1] = (byte) 0xDA;
  		SOS[2] = (byte) 0x00;
  		SOS[3] = (byte) 12;
  		SOS[4] = (byte) jpegObj.getNumberOfComponents ();
  		index = 5;
  
  		for (i = 0; i < SOS[4]; i++)
  		{
  			SOS[index++] = (byte) jpegObj.COMP_ID[i];
  			SOS[index++] = (byte) ((jpegObj.D_C_TABLE_NUMBER[i] << 4) + \
jpegObj.A_C_TABLE_NUMBER[i]);  }
  
  		SOS[index++] = (byte) jpegObj.ss;
  		SOS[index++] = (byte) jpegObj.se;
  		SOS[index++] = (byte) ((jpegObj.ah << 4) + jpegObj.al);
  
  		WriteArray (SOS, out);
  
  	}
  
  	/**
  	 * Writes the compressed data to the outputstream
  	 *
  	 * @param outputStream Stream to write out the jpeg data
  	 */
  	private void WriteCompressedData (BufferedOutputStream outputStream)
  	{
  		float dctArray1[][] = new float[8][8];
  		double dctArray2[][] = new double[8][8];
  		int dctArray3[] = new int[8 * 8];
  
  		/*
  		 * This method controls the compression of the image.
  		 * Starting at the upper left of the image, it compresses 8x8 blocks
  		 * of data until the entire image has been compressed.
  		 */
  
  		int lastDCvalue[] = new int [jpegObj.getNumberOfComponents ()];
  		int zeroArray[] = new int[64];		// initialized to hold all zeros
  
  		int nothing = 0, not;
  		int minBlockWidth, minBlockHeight;
  
  		// This initial setting of minBlockWidth and minBlockHeight is done to
  		// ensure they start with values larger than will actually be the case.
  		minBlockWidth = ((jpegObj.getImageWidth () % 8 != 0)
  						 ? (int) (Math.floor ((double) jpegObj.getImageWidth () / 8.0) + 1) * 8 : \
jpegObj.getImageWidth ());  minBlockHeight = ((jpegObj.getImageHeight () % 8 != 0)
  						  ? (int) (Math.floor ((double) jpegObj.getImageHeight () / 8.0) + 1) * 8 : \
jpegObj.getImageHeight ());  
  		for (int comp = 0; comp < jpegObj.getNumberOfComponents (); comp++)
  		{
  			minBlockWidth = Math.min (minBlockWidth, jpegObj.getBlockWidth (comp));
  			minBlockHeight = Math.min (minBlockHeight, jpegObj.getBlockHeight (comp));
  		}
  
  		for (int r = 0; r < minBlockHeight; r++)
  		{
  			for (int c = 0; c < minBlockWidth; c++)
  			{
  				int xpos = c * 8;
  				int ypos = r * 8;
  
  				for (int comp = 0; comp < jpegObj.getNumberOfComponents (); comp++)
  				{
  			int blockWidth = jpegObj.getBlockWidth (comp);
  			int blockHeight = jpegObj.getBlockHeight (comp);
  					float[][] inputArray = (float[][]) jpegObj.getComponent (comp);
  
  					for (int i = 0; i < jpegObj.V_SAMP_FACTOR[comp]; i++)
  					{
  						for (int j = 0; j < jpegObj.H_SAMP_FACTOR[comp]; j++)
  						{
  							int xblockoffset = j * 8;
  							int yblockoffset = i * 8;
  
  							for (int a = 0; a < 8; a++)
  							{
  								for (int b = 0; b < 8; b++)
  								{
  
  									// I believe this is where the dirty line at the bottom of the image is
  									// coming from.  I need to do a check here to make sure I'm not reading \
past  // image data.
  									// This seems to not be a big issue right now. (04/04/98)
  
  									dctArray1[a][b] =
  										inputArray[ypos + yblockoffset + a][xpos + xblockoffset + b];
  								}
  							}
  
  							// The following code commented out because on some images this technique
  							// results in poor right and bottom borders.
  							 if ((! jpegObj.isLastColumnDummy (comp) || c < blockWidth - 1)
  								 && (!jpegObj.isLastRowDummy (comp) || r < blockHeight - 1))
  							 {
  										dctArray2 = dct.forwardDCT (dctArray1);
  										dctArray3 = dct.quantizeBlock (dctArray2, jpegObj.Q_TABLE_NUMBER[comp]);
  
  							 }
  							 else
  							 {
  								 zeroArray[0] = dctArray3[0];
  								 zeroArray[0] = lastDCvalue[comp];
  								 dctArray3 = zeroArray;
  							 }
  
  							huf.encodeHuffmanBlock (outputStream, dctArray3, lastDCvalue[comp],
  													 jpegObj.D_C_TABLE_NUMBER[comp],
  													 jpegObj.A_C_TABLE_NUMBER[comp]);
  
  							lastDCvalue[comp] = dctArray3[0];
  						}
  					}
  				}
  			}
  		}
  
  		huf.flushBuffer (outputStream);
  	}
  
  	/**
  	 * Writes a marker.
  	 *
  	 * @param data Data to write
  	 * @param out Output stream to write out
  	 */
  	private void WriteMarker (byte[] data, BufferedOutputStream out)
  	{
  		try
  		{
  			out.write (data, 0, 2);
  		}
  		catch (IOException e)
  		{
  			System.err.println ("Error: " + e.getMessage ());
  		}
  	}
  
  	/**
  	 * Writes a array.
  	 *
  	 * @param data Data to write
  	 * @param out Output stream to write out
  	 */
  	private void WriteArray (byte[] data, BufferedOutputStream out)
  	{
  		int i, length;
  
  		try
  		{
  			length = (((int) (data[2] & 0xFF)) << 8) + (int) (data[3] & 0xFF) + 2;
  
  			out.write (data, 0, length);
  		}
  		catch (IOException e)
  		{
  			System.out.println ("IO Error: " + e.getMessage ());
  		}
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Main method
  	//////////////////////////////////////////////////
  
  	/**
  	 * Main method
  	 *
  	 * @param args Command line arguments
  	 */
  	public static void main (String args[])
  	{
  		String string = new String ();
  		int defaultQuality = 80;
  
  		// Check to see if the input file name has one of the extensions:
  		// .tif, .gif, .jpg
  		// If not, print the standard use info.
  		if (args.length < 2)
  		{
  			StandardUsage ();
  		}
  
  		if (!args[0].endsWith (".jpg") &&!args[0].endsWith (".tif") &&!args[0].endsWith \
(".gif"))  {
  			StandardUsage ();
  
  			// First check to see if there is an OutputFile argument.  If there isn't
  			// then name the file "InputFile".jpg
  			// Second check to see if the .jpg extension is on the OutputFile argument.
  			// If there isn't one, add it.
  			// Need to check for the existence of the output file.  If it exists already,
  			// rename the file with a # after the file name, then the .jpg extension.
  		}
  
  		if (args.length < 3)
  		{
  			string = args[0].substring (0, args[0].lastIndexOf (".")) + ".jpg";
  		}
  		else
  		{
  			string = args[2];
  
  			if (string.endsWith (".tif") || string.endsWith (".gif"))
  			{
  				string = string.substring (0, string.lastIndexOf ("."));
  			}
  
  			if (!string.endsWith (".jpg"))
  			{
  				string = string.concat (".jpg");
  			}
  		}
  
  		File outFile = new File (string);
  
  		for (int i = 0; outFile.exists (); i++)
  		{
  			outFile = new File (string.substring (0, string.lastIndexOf (".")) + i + \
".jpg");  
  			if (i > 100)
  			{
  				System.exit (0);
  			}
  		}
  
  		File inFile = new File (args[0]);
  
  		try
  		{
  			if (inFile.exists ())
  			{
  				int qual = defaultQuality;
  				FileOutputStream dataOut = null;
  
  				try
  				{
  					dataOut = new FileOutputStream (outFile);
  				}
  				catch (IOException e)
  				{
  				}
  
  				try
  				{
  					qual = Integer.parseInt (args[1]);
  				}
  				catch (NumberFormatException e)
  				{
  					StandardUsage ();
  				}
  
  				Image image = Toolkit.getDefaultToolkit ().getImage (args[0]);
  				Encoder jpgEncoder = new Encoder (qual, dataOut);
  				jpgEncoder.encodeJPEG (image);
  
  				try
  				{
  					dataOut.close ();
  				}
  				catch (IOException e)
  				{
  				}
  			}
  			else
  			{
  				System.out.println ("I couldn't find " + args[0] + ". Is it in another \
directory?");  }
  		}
  		catch (JPEGException e)
  		{
  			e.printStackTrace ();
  		}
  		finally
  		{
  			System.exit (0);
  		}
  	}
  
  	/**
  	 * Standard usage method.
  	 */
  	public static void StandardUsage()
  	{
  		System.out.println("Program usage: java Jpeg \"InputImage\".\"ext\" Quality \
[\"OutputFile\"[.jpg]]");  System.exit(0);
  	}
  }
  
  
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg/Huffman.java  
  Index: Huffman.java
  ===================================================================
  /**
   * File: Huffmann.java
   *
   *
   * Date         Author                   Changes
   * Aug 17 01    Andreas Putz             Created
   */
  package org.apache.fop.rtf.rtflib.tools.jpeg;
  
  import java.util.Vector;
  import java.io.BufferedOutputStream;
  import java.io.IOException;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**
   * This class was modified by James R. Weeks on 3/27/98.
   * It now incorporates Huffman table derivation as in the C jpeg library
   * from the IJG, Jpeg-6a.
   */
  class Huffman
  {
  	//////////////////////////////////////////////////
  	// @@ Members
  	//////////////////////////////////////////////////
  
  	private int bufferPutBits;
  	private int bufferPutBuffer;
  
  	private Object DC_matrix[] = null;
  	private Object AC_matrix[] = null;
  
  	private Vector bits = null;
  	private Vector val = null;
  
  
  	//////////////////////////////////////////////////
  	// @@ Definitions
  	//////////////////////////////////////////////////
  
  	private int[] bitsDCluminance =
  	{
  		0x00, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
  	};
  	private int[] valDCluminance =
  	{
  		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
  	};
  	private int[] bitsDCchrominance =
  	{
  		0x01, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
  	};
  	private int[] valDCchrominance =
  	{
  		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
  	};
  	private int[] bitsACluminance =
  	{
  		0x10, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
  	};
  	private int[] valACluminance =
  	{
  		0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, \
0x51, 0x61,  0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, \
0xc1, 0x15, 0x52,  0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, \
0x18, 0x19, 0x1a, 0x25,  0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, \
0x39, 0x3a, 0x43, 0x44, 0x45,  0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, \
0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,  0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, \
0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83,  0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, \
0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,  0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, \
0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,  0xb7, 0xb8, 0xb9, 0xba, 0xc2, \
0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3,  0xd4, 0xd5, 0xd6, 0xd7, \
0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8,  0xe9, 0xea, 0xf1, \
0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa  };
  	private int[] bitsACchrominance =
  	{
  		0x11, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
  	};
  
          private int[] valACchrominance =
  	{
  		0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, \
0x07, 0x61,  0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, \
0x09, 0x23, 0x33,  0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, \
0x25, 0xf1, 0x17, 0x18,  0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, \
0x38, 0x39, 0x3a, 0x43, 0x44,  0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, \
0x56, 0x57, 0x58, 0x59, 0x5a, 0x63,  0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, \
0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,  0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, \
0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,  0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, \
0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,  0xb5, 0xb6, 0xb7, 0xb8, 0xb9, \
0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca,  0xd2, 0xd3, 0xd4, 0xd5, \
0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,  0xe8, 0xe9, 0xea, \
0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa  };
  
  	/**
  	 * jpegNaturalOrder[i] is the natural-order position of the i'th element
  	 * of zigzag order.
  	 */
  	static int[] jpegNaturalOrder =
  	{
  		0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, \
41, 34, 27,  20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, \
23, 30, 37, 44, 51,  58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63,
  	};
  
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * The Huffman class constructor.
  	 */
  	Huffman ()
  	{
  		bits = new Vector ();
  
  		bits.addElement (bitsDCluminance);
  		bits.addElement (bitsACluminance);
  		bits.addElement (bitsDCchrominance);
  		bits.addElement (bitsACchrominance);
  
  		val = new Vector ();
  
  		val.addElement (valDCluminance);
  		val.addElement (valACluminance);
  		val.addElement (valDCchrominance);
  		val.addElement (valACchrominance);
  		initHuf ();
  	}
  
  	/**
  	 * Dispose.
  	 */
  	public void dispose ()
  	{
  		DC_matrix = null;
  		AC_matrix = null;
  		bits = null;
  		val = null;
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Member access
  	//////////////////////////////////////////////////
  
  	/**
  	 * Gets the bits.
  	 * @param index Index
  	 * @return Integer array
  	 */
  	int[] getBits (int index)
  	{
  		return (int []) bits.elementAt (index);
  	}
  
  	/**
  	 * Get the values.
  	 * @param index Index
  	 * @return Integer array
  	 */
  	 int [] getVal (int index)
  	 {
  		return (int []) val.elementAt (index);
  	 }
  
  
  	//////////////////////////////////////////////////
  	// @@ Methods
  	//////////////////////////////////////////////////
  
  	/**
  	 * HuffmanBlockEncoder run length encodes and Huffman encodes the quantized
  	 * data.
  	 *
  	 * @param outStream Stream for output
  	 * @param zigzag
  	 * @param prec
  	 * @param dCcode
  	 * @param aCcode
  	 */
  	void encodeHuffmanBlock (BufferedOutputStream outStream, int zigzag[], int prec,
  									int dCcode, int aCcode)
  	{
  		// The DC portion
  
  		int temp = zigzag[0] - prec;
  		int temp2 = temp;
  
  		if (temp < 0)
  		{
  			temp = -temp;
  			temp2--;
  		}
  
  		int nbits = 0;
  
  		while (temp != 0)
  		{
  			nbits++;
  			temp >>= 1;
  		}
  
  		// if (nbits > 11) nbits = 11;
  		bufferIt (outStream, ((int[][]) DC_matrix[dCcode])[nbits][0],
  				  ((int[][]) DC_matrix[dCcode])[nbits][1]);
  
  		// The arguments in bufferIt are code and size.
  		if (nbits != 0)
  		{
  			bufferIt (outStream, temp2, nbits);
  		}
  
  		// The AC portion
  
  		int r = 0;
  
  		for (int k = 1; k < 64; k++)
  		{
  			if ((temp = zigzag[jpegNaturalOrder[k]]) == 0)
  			{
  				r++;
  			}
  			else
  			{
  				while (r > 15)
  				{
  					bufferIt (outStream, ((int[][]) AC_matrix[aCcode])[0xF0][0],
  							  ((int[][]) AC_matrix[aCcode])[0xF0][1]);
  
  					r -= 16;
  				}
  
  				temp2 = temp;
  
  				if (temp < 0)
  				{
  					temp = -temp;
  					temp2--;
  				}
  
  				nbits = 1;
  
  				while ((temp >>= 1) != 0)
  				{
  					nbits++;
  				}
  
  				int i = (r << 4) + nbits;
  
  				bufferIt (outStream, ((int[][]) AC_matrix[aCcode])[i][0],
  						  ((int[][]) AC_matrix[aCcode])[i][1]);
  				bufferIt (outStream, temp2, nbits);
  
  				r = 0;
  			}
  		}
  
  		if (r > 0)
  		{
  			bufferIt (outStream, ((int[][]) AC_matrix[aCcode])[0][0],
  					  ((int[][]) AC_matrix[aCcode])[0][1]);
  		}
  
  	}
  
  	/**
  	 * Uses an integer long (32 bits) buffer to store the Huffman encoded bits
  	 * and sends them to outStream by the byte.
  	 *
  	 * @param outStream Stream for output
  	 * @param code Code
  	 * @param size Size
  	 */
  	void bufferIt (BufferedOutputStream outStream, int code, int size)
  	{
  		int PutBuffer = code;
  		int PutBits = bufferPutBits;
  
  		PutBuffer &= (1 << size) - 1;
  		PutBits += size;
  		PutBuffer <<= 24 - PutBits;
  		PutBuffer |= bufferPutBuffer;
  
  		while (PutBits >= 8)
  		{
  			int c = ((PutBuffer >> 16) & 0xFF);
  
  			try
  			{
  				outStream.write (c);
  			}
  			catch (IOException e)
  			{
  				System.out.println ("IO Error: " + e.getMessage ());
  			}
  
  			if (c == 0xFF)
  			{
  				try
  				{
  					outStream.write (0);
  				}
  				catch (IOException e)
  				{
  					System.out.println ("IO Error: " + e.getMessage ());
  				}
  			}
  
  			PutBuffer <<= 8;
  			PutBits -= 8;
  		}
  
  		bufferPutBuffer = PutBuffer;
  		bufferPutBits = PutBits;
  
  	}
  
  	/**
  	 * Flushed the buffer to output stream.
  	 *
  	 * @param outStream Stream for output
  	 */
  	void flushBuffer (BufferedOutputStream outStream)
  	{
  		int PutBuffer = bufferPutBuffer;
  		int PutBits = bufferPutBits;
  
  		while (PutBits >= 8)
  		{
  			int c = ((PutBuffer >> 16) & 0xFF);
  
  			try
  			{
  				outStream.write (c);
  			}
  			catch (IOException e)
  			{
  				System.out.println ("IO Error: " + e.getMessage ());
  			}
  
  			if (c == 0xFF)
  			{
  				try
  				{
  					outStream.write (0);
  				}
  				catch (IOException e)
  				{
  					System.out.println ("IO Error: " + e.getMessage ());
  				}
  			}
  
  			PutBuffer <<= 8;
  			PutBits -= 8;
  		}
  
  		if (PutBits > 0)
  		{
  			int c = ((PutBuffer >> 16) & 0xFF);
  
  			try
  			{
  				outStream.write (c);
  			}
  			catch (IOException e)
  			{
  				System.out.println ("IO Error: " + e.getMessage ());
  			}
  		}
  	}
  
  	/**
  	 * Initialisation of the Huffman codes for Luminance and Chrominance.
  	 * This code results in the same tables created in the IJG Jpeg-6a
  	 * library.
  	 */
  	void initHuf ()
  	{
  		int[][] DC_matrix0 = new int[12][2];
  		int[][] DC_matrix1 = new int[12][2];
  		int[][] AC_matrix0 = new int[255][2];
  		int[][] AC_matrix1 = new int[255][2];
  		DC_matrix = new Object[2];
  		AC_matrix = new Object[2];
  
  		int[] huffsize = new int[257];
  		int[] huffcode = new int[257];
  
  		/*
  		 * init of the DC values for the chrominance
  		 * [][0] is the code   [][1] is the number of bit
  		 */
  
  		int p = 0;
  
  		for (int l = 1; l <= 16; l++)
  		{
  			for (int i = 1; i <= bitsDCchrominance[l]; i++)
  			{
  				huffsize[p++] = l;
  			}
  		}
  
  		huffsize[p] = 0;
  		int lastp = p;
  
  		int code = 0;
  		int si = huffsize[0];
  		p = 0;
  
  		while (huffsize[p] != 0)
  		{
  			while (huffsize[p] == si)
  			{
  				huffcode[p++] = code;
  				code++;
  			}
  
  			code <<= 1;
  			si++;
  		}
  
  		for (p = 0; p < lastp; p++)
  		{
  			DC_matrix1[valDCchrominance[p]][0] = huffcode[p];
  			DC_matrix1[valDCchrominance[p]][1] = huffsize[p];
  		}
  
  		/*
  		 * Init of the AC hufmann code for the chrominance
  		 * matrix [][][0] is the code & matrix[][][1] is the number of bit needed
  		 */
  
  		p = 0;
  
  		for (int l = 1; l <= 16; l++)
  		{
  			for (int i = 1; i <= bitsACchrominance[l]; i++)
  			{
  				huffsize[p++] = l;
  			}
  		}
  
  		huffsize[p] = 0;
  		lastp = p;
  
  		code = 0;
  		si = huffsize[0];
  		p = 0;
  
  		while (huffsize[p] != 0)
  		{
  			while (huffsize[p] == si)
  			{
  				huffcode[p++] = code;
  				code++;
  			}
  
  			code <<= 1;
  			si++;
  		}
  
  		for (p = 0; p < lastp; p++)
  		{
  			AC_matrix1[valACchrominance[p]][0] = huffcode[p];
  			AC_matrix1[valACchrominance[p]][1] = huffsize[p];
  		}
  
  		/*
  		 * init of the DC values for the luminance
  		 * [][0] is the code   [][1] is the number of bit
  		 */
  		p = 0;
  
  		for (int l = 1; l <= 16; l++)
  		{
  			for (int i = 1; i <= bitsDCluminance[l]; i++)
  			{
  				huffsize[p++] = l;
  			}
  		}
  
  		huffsize[p] = 0;
  		lastp = p;
  
  		code = 0;
  		si = huffsize[0];
  		p = 0;
  
  		while (huffsize[p] != 0)
  		{
  			while (huffsize[p] == si)
  			{
  				huffcode[p++] = code;
  				code++;
  			}
  
  			code <<= 1;
  			si++;
  		}
  
  		for (p = 0; p < lastp; p++)
  		{
  			DC_matrix0[valDCluminance[p]][0] = huffcode[p];
  			DC_matrix0[valDCluminance[p]][1] = huffsize[p];
  		}
  
  		/*
  		 * Init of the AC hufmann code for luminance
  		 * matrix [][][0] is the code & matrix[][][1] is the number of bit
  		 */
  
  		p = 0;
  
  		for (int l = 1; l <= 16; l++)
  		{
  			for (int i = 1; i <= bitsACluminance[l]; i++)
  			{
  				huffsize[p++] = l;
  			}
  		}
  
  		huffsize[p] = 0;
  		lastp = p;
  
  		code = 0;
  		si = huffsize[0];
  		p = 0;
  
  		while (huffsize[p] != 0)
  		{
  			while (huffsize[p] == si)
  			{
  				huffcode[p++] = code;
  				code++;
  			}
  
  			code <<= 1;
  			si++;
  		}
  
  		for (int q = 0; q < lastp; q++)
  		{
  			AC_matrix0[valACluminance[q]][0] = huffcode[q];
  			AC_matrix0[valACluminance[q]][1] = huffsize[q];
  		}
  
  		DC_matrix[0] = DC_matrix0;
  		DC_matrix[1] = DC_matrix1;
  		AC_matrix[0] = AC_matrix0;
  		AC_matrix[1] = AC_matrix1;
  	}
  }
  
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg/JPEGException.java  
  Index: JPEGException.java
  ===================================================================
  /**
   * File: JPEGException.java
   *
   *
   * Date         Author                   Changes
   * Aug 21 01    Andreas Putz             Created
   */
  package org.apache.fop.rtf.rtflib.tools.jpeg;
  
  import java.io.IOException;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**
   * Exception if error occured in JPEG encoder.
   *  @author Andreas Putz a.putz@skynamics.com
   */
  
  //------------------------------------------------------------------------------
  // $Id: JPEGException.java,v 1.1 2003/06/25 09:01:18 bdelacretaz Exp $
  // $Log: JPEGException.java,v $
  // Revision 1.1  2003/06/25 09:01:18  bdelacretaz
  // additional jfor packages donated to the FOP project
  //
  // Revision 1.3  2002/07/12 08:08:31  bdelacretaz
  // License changed to jfor Apache-style license
  //
  // Revision 1.2  2001/08/31 07:51:01  bdelacretaz
  // MPL license text added + javadoc class comments corrected
  //
  // Revision 1.1  2001/08/29 13:27:51  bdelacretaz
  // V0.4.1 - base package name changed to org.apache.fop.rtf.rtflib.jfor
  //
  // Revision 1.4  2001/08/27 20:35:05  putzi
  // Bigfix in external graphic, insert alignment in paragraph, Converter option.
  //
  // Revision 1.2  2001/08/21 15:58:02  bdelacretaz
  // V0.3.5, jpeg and gif support added
  //
  // Revision 1.1  2001/08/21 15:18:01  bdelacretaz
  // V0.3.4 - bookmarks and links added
  //
  // Revision 1.1.1.1  2001/08/02 12:53:45  bdelacretaz
  // initial SourceForge checkin of V0.1 code
  //
  //------------------------------------------------------------------------------
  
  public class JPEGException extends IOException
  {
  	/** Exception */
  	private Exception e = null;
  	/** Message */
  	private String message = null;
  
  	/**
  	 * Constructor.
  	 *
  	 * @param message Error message
  	 */
  	public JPEGException (String message)
  	{
  		super (message);
  		this.message = message;
  	}
  
  	/**
  	 * Constructor.
  	 *
  	 * @param message Error message
  	 */
  	public JPEGException (Exception e)
  	{
  		this (e.getMessage ());
  		this.e = e;
  	}
  
  	/**
  	 * Gets the exception.
  	 *
  	 * @return Exception
  	 */
  	public Exception getException ()
  	{
  		return e;
  	}
  
  	/**
  	 * Modifies the message.
  	 *
  	 * @param message Message
  	 */
  	 public void setMessage (String message)
  	 {
  		this.message = message;
  	 }
  }
  
  
  
  
  1.1                  \
xml-fop/src/java/org/apache/fop/rtf/rtflib/tools/jpeg/JpegInfo.java  
  Index: JpegInfo.java
  ===================================================================
  /**
   * File: JpegInfo.java
   *
   *
   * Date         Author                   Changes
   * Aug 17 01    Andreas Putz             Created
   * Aug 21 01    Andreas Putz             Bug fixed (bottom and right line)
   */
  package org.apache.fop.rtf.rtflib.tools.jpeg;
  
  import java.awt.Image;
  import java.awt.image.PixelGrabber;
  import java.awt.AWTException;
  
  /*-----------------------------------------------------------------------------
   * jfor - Open-Source XSL-FO to RTF converter - see www.jfor.org
   *
   * ====================================================================
   * jfor Apache-Style Software License.
   * Copyright (c) 2002 by the jfor project. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, 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 jfor project (http://www.jfor.org)."
   * Alternately, this acknowledgment may appear in the software itself,
   * if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The name "jfor" must not be used to endorse
   * or promote products derived from this software without prior written
   * permission.  For written permission, please contact info@jfor.org.
   *
   * 5. Products derived from this software may not be called "jfor",
   * nor may "jfor" appear in their name, without prior written
   * permission of info@jfor.org.
   *
   * 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 JFOR PROJECT OR ITS CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, 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.
   * ====================================================================
   * Contributor(s):
  -----------------------------------------------------------------------------*/
  
  /**
   * JpegInfo - Given an image, sets default information about it and divides
   * it into its constituant components, downsizing those that need to be.
   */
  class JpegInfo
  {
  
  	//////////////////////////////////////////////////
  	// @@ Constants
  	//////////////////////////////////////////////////
  
  	/**
  	 * Default value of precision
  	 */
  	static int PRECISION = 8;
  
  	static int[] COMP_ID =
  	{
  		1, 2, 3
  	};
  	static int[] H_SAMP_FACTOR =
  	{
  		1, 1, 1
  	};
  	static int[] V_SAMP_FACTOR =
  	{
  		1, 1, 1
  	};
  	static int[] Q_TABLE_NUMBER =
  	{
  		0, 1, 1
  	};
  	static int[] D_C_TABLE_NUMBER =
  	{
  		0, 1, 1
  	};
  	static int[] A_C_TABLE_NUMBER =
  	{
  		0, 1, 1
  	};
  
  	static int ss = 0;
  	static int se = 63;
  	static int ah = 0;
  	static int al = 0;
  
  
  	//////////////////////////////////////////////////
  	// @@ Members
  	//////////////////////////////////////////////////
  
  	/**
  	 * Image comment
  	 */
  	private String comment;
  
  	/**
  	 * Image height
  	 */
  	private int imageHeight;
  
  	/**
  	 * Image widht
  	 */
  	private int imageWidth;
  
  	/**
  	 * Image block width
  	 */
  	private int[] blockWidth;
  
  	/**
  	 * Image block height
  	 */
  	private int[] blockHeight;
  
  	/**
  	 * Image
  	 */
  	private Image imageObj = null;
  
  	// Default settings
  
  	/**
  	 * Number of components
  	 */
  	private int numberOfComponents = 3;
  
  	/**
  	 * Components
  	 */
  	private Object[] components = null;
  
  	/**
  	 * Width of components
  	 */
  	private int[] compWidth = null;
  
  	/**
  	 * Height of components
  	 */
  	private int[] compHeight = null;
  
  	/**
  	 * maximum of horizontal sample factor
  	 */
  	private int maxHsampFactor;
  
  	/**
  	 * maximum of vertical sample factor
  	 */
  	private int maxVsampFactor;
  
  	/** Array for the dummy column */
  	private boolean[] lastColumnIsDummy = {false, false, false};
  	/** Array for the dummy row */
  	private boolean[] lastRowIsDummy = {false, false, false};
  
  
  	//////////////////////////////////////////////////
  	// @@ Construction
  	//////////////////////////////////////////////////
  
  	/**
  	 * Constructor.
  	 *
  	 * @param image AWT image
  	 */
  	JpegInfo (Image image)
  	{
  		imageObj = image;
  		components = new Object[numberOfComponents];
  		compWidth = new int[numberOfComponents];
  		compHeight = new int[numberOfComponents];
  		blockWidth = new int[numberOfComponents];
  		blockHeight = new int[numberOfComponents];
  		imageWidth = image.getWidth (null);
  		imageHeight = image.getHeight (null);
  		comment = "JPEG Encoder, skynamics AG, Munich";
  
  		getYCCArray ();
  	}
  
  	/**
  	 * Dispose.
  	 */
  	public void dispose ()
  	{
  		comment = null;
  		blockWidth = null;
  		blockHeight = null;
  		imageObj = null;
  		components = null;
  		compWidth = null;
  		compHeight = null;
  	}
  
  	//////////////////////////////////////////////////
  	// @@ Member access
  	//////////////////////////////////////////////////
  
  	/**
  	 * Adds a comment to the existent comment.
  	 *
  	 * @param comment Comment to add
  	 */
  	void setComment (String comment)
  	{
  		this.comment.concat (comment);
  	}
  
  	/**
  	 * Gets the comment.
  	 * @return Comment
  	 */
  	String getComment ()
  	{
  		return comment;
  	}
  
  	/**
  	 * Gets the image height.
  	 * @return Height
  	 */
  	int getImageHeight ()
  	{
  		return this.imageHeight;
  	}
  
  	/**
  	 * Gets the image width.
  	 * @return Width
  	 */
  	int getImageWidth ()
  	{
  		return this.imageWidth;
  	}
  
  	/**
  	 * Gets the block width.
  	 * @param index Block index
  	 * @return Width
  	 */
  	int getBlockWidth (int index)
  	{
  		return blockWidth[index];
  	}
  
  	/**
  	 * Gets the block height.
  	 * @param index Component index
  	 * @return Height
  	 */
  	int getBlockHeight (int index)
  	{
  		return blockHeight[index];
  	}
  
  	/**
  	 * Gets the number of components.
  	 * @return Number
  	 */
  	int getNumberOfComponents ()
  	{
  		return numberOfComponents;
  	}
  
  	/**
  	 * Get component by component index.
  	 * @param index Component index
  	 * @return Object of component
  	 */
  	Object getComponent (int index)
  	{
  		return this.components[index];
  	}
  
  	/**
  	 * Checks, whether last columns is as dummy checked.
  	 *
  	 * @param i Index
  	 * @return
  	 *  true    If checked\n
  	 *  false   Is no dummy column
  	 */
  	public boolean isLastColumnDummy (int i)
  	{
  		return lastColumnIsDummy [i];
  	}
  
  	/**
  	 * Checks, whether last row is as dummy checked.
  	 *
  	 * @param i Index
  	 * @return
  	 *  true    If checked\n
  	 *  false   Is no dummy row
  	 */
  	public boolean isLastRowDummy (int i)
  	{
  		return lastRowIsDummy [i];
  	}
  
  
  	//////////////////////////////////////////////////
  	// @@ Helpers
  	//////////////////////////////////////////////////
  
  	/**
  	 * This method creates and fills three arrays, Y, Cb, and Cr using the
  	 * input image.
  	 */
  	private void getYCCArray ()
  	{
  		int values[] = new int[imageWidth * imageHeight];
  		int r, g, b, y, x;
  
  		// In order to minimize the chance that grabPixels will throw an exception
  		// it may be necessary to grab some pixels every few scanlines and process
  		// those before going for more.  The time expense may be prohibitive.
  		// However, for a situation where memory overhead is a concern, this may be
  		// the only choice.
  		PixelGrabber grabber = new PixelGrabber (imageObj.getSource (), 0, 0, imageWidth,
  												 imageHeight, values, 0, imageWidth);
  
  		maxHsampFactor = 1;
  		maxVsampFactor = 1;
  
  		for (y = 0; y < numberOfComponents; y++)
  		{
  			maxHsampFactor = Math.max (maxHsampFactor, H_SAMP_FACTOR[y]);
  			maxVsampFactor = Math.max (maxVsampFactor, V_SAMP_FACTOR[y]);
  		}
  
  		for (y = 0; y < numberOfComponents; y++)
  		{
  			compWidth[y] =
  				(((imageWidth % 8 != 0) ? ((int) Math
  				.ceil ((double) imageWidth
  					   / 8.0)) * 8 : imageWidth) / maxHsampFactor) * H_SAMP_FACTOR[y];
  
  			if (compWidth[y] != ((imageWidth / maxHsampFactor) * H_SAMP_FACTOR[y]))
  			{
  				lastColumnIsDummy[y] = true;
  			}
  
  			// results in a multiple of 8 for compWidth
  			// this will make the rest of the program fail for the unlikely
  			// event that someone tries to compress an 16 x 16 pixel image
  			// which would of course be worse than pointless
  			blockWidth[y] = (int) Math.ceil ((double) compWidth[y] / 8.0);
  			compHeight[y] =
  				(((imageHeight % 8 != 0) ? ((int) Math
  				.ceil ((double) imageHeight
  					   / 8.0)) * 8 : imageHeight) / maxVsampFactor) * V_SAMP_FACTOR[y];
  
  			if (compHeight[y] != ((imageHeight / maxVsampFactor) * V_SAMP_FACTOR[y]))
  			{
  				lastRowIsDummy[y] = true;
  			}
  
  
  			blockHeight[y] = (int) Math.ceil ((double) compHeight[y] / 8.0);
  		}
  
  		try
  		{
  			grabber.grabPixels ();
  		}
  		catch (InterruptedException e)
  		{
  			System.err.println ("Error: " + e.getMessage ());
  		}
  
  		float Y[][] = new float[compHeight[0]][compWidth[0]];
  		float Cr1[][] = new float[compHeight[0]][compWidth[0]];
  		float Cb1[][] = new float[compHeight[0]][compWidth[0]];
  		float Cb2[][] = new float[compHeight[1]][compWidth[1]];
  		float Cr2[][] = new float[compHeight[2]][compWidth[2]];
  		int index = 0;
  
  		for (y = 0; y < imageHeight; ++y)
  		{
  			for (x = 0; x < imageWidth; ++x)
  			{
  				r = ((values[index] >> 16) & 0xff);
  				g = ((values[index] >> 8) & 0xff);
  				b = (values[index] & 0xff);
  
  				Y[y][x] = (float) ((0.299 * (float) r + 0.587 * (float) g + 0.114 * (float) \
b));  Cb1[y][x] = 128
  							+ (float) ((-0.16874 * (float) r - 0.33126 * (float) g
  										+ 0.5 * (float) b));
  				Cr1[y][x] = 128
  							+ (float) ((0.5 * (float) r - 0.41869 * (float) g
  										- 0.08131 * (float) b));
  				index++;
  			}
  		}
  
  		components[0] = Y;
  		components[1] = Cb1;
  		components[2] = Cr1;
  	}
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic