content: /* ===========================================================
   * JFreeChart : a free chart library for the Java(tm) platform
   * ===========================================================
   *
   * (C) Copyright 2000-2011, by Object Refinery Limited and Contributors.
   *
   * Project Info:  http://www.jfree.org/jfreechart/index.html
   *
   * This library is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation; either version 2.1 of the License, or
   * (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
   * License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
   * USA.
   *
   * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.]
   *
   * --------------------------
   * SunJPEGEncoderAdapter.java
   * --------------------------
   * (C) Copyright 2004-2008, by Richard Atkinson and Contributors.
   *
   * Original Author:  Richard Atkinson;
   * Contributor(s):   David Gilbert (for Object Refinery Limited);
   *
   * Changes
   * -------
   * 01-Aug-2004 : Initial version (RA);
   * 01-Nov-2005 : To remove the dependency on non-supported APIs, use ImageIO
   *               instead of com.sun.image.codec.jpeg.JPEGImageEncoder - this
   *               adapter will only be available on JDK 1.4 or later (DG);
   * ------------- JFREECHART 1.0.x ---------------------------------------------
   * 20-Jul-2006 : Pass quality setting to ImageIO. Also increased default
   *               value to 0.95 (DG);
   *
   */
  
  package org.jfree.chart.encoders;
  
  import java.awt.image.BufferedImage;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Iterator;
  
  import javax.imageio.IIOImage;
  import javax.imageio.ImageIO;
  import javax.imageio.ImageWriteParam;
  import javax.imageio.ImageWriter;
  import javax.imageio.stream.ImageOutputStream;
  
  /**
   * Adapter class for the Sun JPEG Encoder.  The {@link ImageEncoderFactory}
   * will only return a reference to this class by default if the library has
   * been compiled under a JDK 1.4+ and is being run using a JRE 1.4+.
   */
  public class SunJPEGEncoderAdapter implements ImageEncoder {
  
      /** The quality setting (in the range 0.0f to 1.0f). */
      private float quality = 0.95f;
  
      /**
       * Creates a new <code>SunJPEGEncoderAdapter</code> instance.
       */
      public SunJPEGEncoderAdapter() {
      }
  
      /**
       * Returns the quality of the image encoding, which is a number in the
       * range 0.0f to 1.0f (higher values give better quality output, but larger
       * file sizes).  The default value is 0.95f.
       *
       * @return A float representing the quality, in the range 0.0f to 1.0f.
       *
       * @see #setQuality(float)
       */
      @Override
      public float getQuality() {
          return this.quality;
      }
  
      /**
       * Set the quality of the image encoding.
       *
       * @param quality  A float representing the quality (in the range 0.0f to
       *     1.0f).
       *
       * @see #getQuality()
       */
      @Override
      public void setQuality(float quality) {
          if (quality < 0.0f || quality > 1.0f) {
              throw new IllegalArgumentException(
                      "The 'quality' must be in the range 0.0f to 1.0f");
          }
          this.quality = quality;
      }
  
      /**
       * Returns <code>false</code> always, indicating that this encoder does not
       * encode alpha transparency.
       *
       * @return <code>false</code>.
       */
      @Override
      public boolean isEncodingAlpha() {
          return false;
      }
  
      /**
       * Set whether the encoder should encode alpha transparency (this is not
       * supported for JPEG, so this method does nothing).
       *
       * @param encodingAlpha  ignored.
       */
      @Override
      public void setEncodingAlpha(boolean encodingAlpha) {
          //  No op
      }
  
      /**
       * Encodes an image in JPEG format.
       *
       * @param bufferedImage  the image to be encoded (<code>null</code> not
       *     permitted).
       *
       * @return The byte[] that is the encoded image.
       *
       * @throws IOException if there is an I/O problem.
       * @throws NullPointerException if <code>bufferedImage</code> is
       *     <code>null</code>.
       */
      @Override
      public byte[] encode(BufferedImage bufferedImage) throws IOException {
          ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
          encode(bufferedImage, outputStream);
          return outputStream.toByteArray();
      }
  
      /**
       * Encodes an image in JPEG format and writes it to an output stream.
       *
       * @param bufferedImage  the image to be encoded (<code>null</code> not
       *     permitted).
       * @param outputStream  the OutputStream to write the encoded image to
       *     (<code>null</code> not permitted).
       *
       * @throws IOException if there is an I/O problem.
       * @throws NullPointerException if <code>bufferedImage</code> is
       *     <code>null</code>.
       */
      @Override
      public void encode(BufferedImage bufferedImage, OutputStream outputStream)
              throws IOException {
          if (bufferedImage == null) {
              throw new IllegalArgumentException("Null 'image' argument.");
          }
          if (outputStream == null) {
              throw new IllegalArgumentException("Null 'outputStream' argument.");
          }
          Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg");
          ImageWriter writer = iterator.next();
          ImageWriteParam p = writer.getDefaultWriteParam();
          p.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
          p.setCompressionQuality(this.quality);
          ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
          writer.setOutput(ios);
          writer.write(null, new IIOImage(bufferedImage, null, null), p);
          ios.flush();
          writer.dispose();
          ios.close();
      }
  
  }
  