/* ImageWriteParam.java --
   Copyright (C) 2004  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.imageio;

import java.awt.Dimension;
import java.util.Locale;

/**
 * DOCUMENT ME
 */
public class ImageWriteParam extends IIOParam
{
  
  /** 
   * Can be passed to setTilingMode, setProgressiveMode and
   * setCompressionMode to disable feature.
   */
  public static final int MODE_DISABLED = 0;
  
  /** 
   * Can be passed to setTilingMode, setProgressiveMode and 
   * setCompressionMode to enable feature.
   */
  public static final int MODE_DEFAULT = 1;
  
  /** 
   * Can be passed to setTilingMode, setCompressionMode to disable feature.
   */
  public static final int MODE_EXPLICIT = 2;
  
  /** 
   * Can be passed to setTilingMode, setProgressiveMode and 
   * setCompressionMode to enable feature.
   */
  public static final int MODE_COPY_FROM_METADATA = 3;
  
  /**
   * True if tiling grid offset parameters can be set.
   */
  protected boolean canOffsetTiles;
  
  /**
   * True if this writer can write images using compression.
   */
  protected boolean canWriteCompressed;
  
  /**
   * True if images can be written as a progressive sequence
   * of increasing quality.
   */
  protected boolean canWriteProgressive;
  
  /**
   * True if tile width and height parameters can be set.
   */
  protected boolean canWriteTiles;
  
  /**
   * Controls compression settings, which must be set to one of the four
   * MODE_* values.
   */
  protected int compressionMode = MODE_COPY_FROM_METADATA;
  
  /**
   * Contains the current compression quality setting.
   */
  protected float compressionQuality;
  
  /**
   * Contains the name of the current compression type.
   */
  protected String compressionType;
  
  /**
   * Array of the names of the available compression types.
   */
  protected String[] compressionTypes;
  
  /**
   * Localizes compression type names and quality descriptions,
   * or null to use default Locale.
   */
  protected Locale locale;
  
  /**
   * Preferred tile size range pairs.
   */
  protected Dimension[] preferredTileSizes;
  
  /**
   * The mode controlling progressive encoding, which must
   * be set to one of the four MODE_* values, except
   * MODE_EXPLICIT.
   */
  protected int progressiveMode = MODE_COPY_FROM_METADATA;
  
  /**
   * The amount by which the tile grid origin should be offset
   * horizontally from the image origin if tiling has been set.
   */
  protected int tileGridXOffset;
  
  /**
   * The amount by which the tile grid origin should be offset
   * vertically from the image origin if tiling has been set.
   */
  protected int tileGridYOffset;
  
  /**
   * The height of each tile if tiling has been set.
   */
  protected int tileHeight;
  
  /**
   * The width of each tile if tiling has been set.
   */
  protected int tileWidth;
  
  /**
   * The mode controlling tiling settings, which must be
   * set to one of the four MODE_* values.
   */
  protected int tilingMode;
  
  /**
   * True if the tiling parameters have been specified.
   */
  protected boolean tilingSet;

  /**
   * Creates an empty <code>ImageWriteParam</code> object.
   * The subclass is responsible to initialize all fields.
   */
  protected ImageWriteParam()
  {
    // Do nothing here.
  }

  /**
   * Creates an <code>ImageWriteParam</code> object with the given locale.
   *
   * @param locale the locale to use for user visible strings
   */
  public ImageWriteParam(Locale locale)
  {
    this.locale = locale;
  }

  public float getBitRate(float quality)
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();

    return -1.0f;
  }

  private void checkSupportsCompression()
  {
    if (! canWriteCompressed())
      throw new UnsupportedOperationException("compression not supported");
  }

  private void checkNotExplicitCompression()
  {
    if (getCompressionMode() != MODE_EXPLICIT)
      throw new IllegalStateException("compression mode is not MODE_EXPLICIT");
  }
  
  private void checkCompressionTypesSet()
  {
    if (getCompressionType() == null
	&& getCompressionTypes() != null)
      throw new IllegalStateException("no compression type set");
  }

  private void checkSupportsProgressiveEncoding()
  {
    if (! canWriteProgressive())
      throw new UnsupportedOperationException
	("progressive output not supported");
  }
  
  private void checkSupportsTiling()
  {
    if (! canWriteTiles())
      throw new UnsupportedOperationException("tiling not supported");
  }

  private void checkNotExplicitTiling()
  {
    if (getTilingMode() != MODE_EXPLICIT)
      throw new IllegalStateException("tiling mode not MODE_EXPLICIT");
  }

  private void checkTilingInitialized()
  {
    if (! tilingSet)
      throw new IllegalStateException("tiling parameters not set");
  }

  private void checkMode(int mode)
  {
    if (mode < MODE_DISABLED || mode > MODE_COPY_FROM_METADATA)
      throw new IllegalArgumentException("mode not supported");
  }

  public boolean canOffsetTiles()
  {
    return canOffsetTiles;
  }

  public boolean canWriteCompressed()
  {
    return canWriteCompressed;
  }

  public boolean canWriteProgressive()
  {
    return canWriteProgressive;
  }

  public boolean canWriteTiles()
  {
    return canWriteTiles;
  }

  public int getCompressionMode()
  {
    checkSupportsCompression();

    return compressionMode;
  }

  public float getCompressionQuality()
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();

    return compressionQuality;
  }

  public String[] getCompressionQualityDescriptions()
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();
    
    return null;
  }

  public float[] getCompressionQualityValues()
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();
    
    return null;
  }

  public String getCompressionType()
  {
    checkNotExplicitCompression();

    return compressionType;
  }

  public String[] getCompressionTypes()
  {
    checkSupportsCompression();

    return compressionTypes != null ? (String[]) compressionTypes.clone() : null;
  }

  public Locale getLocale()
  {
    return locale;
  }

  public String getLocalizedCompressionTypeName()
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();

    return getCompressionType();
  }

  public Dimension[] getPreferredTileSizes()
  {
    checkSupportsTiling();

    return preferredTileSizes;
  }

  public int getProgressiveMode()
  {
    checkSupportsProgressiveEncoding();

    return progressiveMode;
  }

  public int getTileGridXOffset()
  {
    checkNotExplicitTiling();
    checkTilingInitialized();

    return tileGridXOffset;
  }

  public int getTileGridYOffset()
  {
    checkNotExplicitTiling();
    checkTilingInitialized();

    return tileGridYOffset;
  }

  public int getTileHeight()
  {
    checkNotExplicitTiling();
    checkTilingInitialized();

    return tileHeight;
  }

  public int getTileWidth()
  {
    checkNotExplicitTiling();
    checkTilingInitialized();

    return tileWidth;
  }

  public int getTilingMode()
  {
    checkSupportsTiling();

    return tilingMode;
  }

  public boolean isCompressionLossless()
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();

    return true;
  }

  public void setCompressionMode(int mode)
  {
    checkSupportsCompression();
    checkMode(mode);
    
    compressionMode = mode;
    
    if (mode == MODE_EXPLICIT)
      unsetCompression();
  }

  public void setCompressionQuality(float quality)
  {
    checkNotExplicitCompression();
    checkCompressionTypesSet();

    if (quality < 0.0f || quality > 1.0f)
      throw new IllegalArgumentException("quality out of range");

    compressionQuality = quality;
  }

  public void setCompressionType(String compressionType)
  {
    checkNotExplicitCompression();

    String[] types = getCompressionTypes();

    if (types == null)
      throw new UnsupportedOperationException("no settable compression types");
    
    if (compressionType == null)
      this.compressionType = null;

    for (int i = types.length - 1; i >= 0; --i)
      if (types[i].equals(compressionType))
	{
	  this.compressionType = compressionType;
	  return;
	}
    
    throw new IllegalArgumentException("unknown compression type");
  }

  public void setProgressiveMode(int mode)
  {
    checkSupportsProgressiveEncoding();
    checkMode(mode);
    
    progressiveMode = mode;
  }

  public void setTiling(int tileWidth, int tileHeight,
		        int tileGridXOffset, int tileGridYOffset)
  {
    checkNotExplicitTiling();

    if (! canOffsetTiles
	&& tileGridXOffset != 0
	&& tileGridYOffset != 0)
      throw new UnsupportedOperationException("tile offsets not supported");

    if (tileWidth < 0 || tileHeight < 0)
      throw new IllegalArgumentException("negative tile dimension");

    if (preferredTileSizes != null)
      {
	boolean found = false;

	for (int i = 0; i < preferredTileSizes.length; i += 2)
	  {
	    if (tileWidth >= preferredTileSizes[i].width
		&& tileWidth <= preferredTileSizes[i + 1].width
		&& tileHeight >= preferredTileSizes[i].height
		&& tileHeight <= preferredTileSizes[i + 1].height)
	      found = true;
	  }

	if (! found)
          throw new IllegalArgumentException("illegal tile size");
      }

    this.tilingSet = true;
    this.tileWidth = tileWidth;
    this.tileHeight = tileHeight;
    this.tileGridXOffset = tileGridXOffset;
    this.tileGridYOffset = tileGridYOffset;
  }

  public void setTilingMode(int mode)
  {
    checkSupportsTiling();
    checkMode(mode);
    tilingMode = mode;
  }

  public void unsetCompression()
  {
    checkNotExplicitCompression();
    
    compressionType = null;
    compressionQuality = 1.0F;
  }

  public void unsetTiling()
  {
    checkNotExplicitTiling();
    
    tileWidth = 0;
    tileHeight = 0;
    tileGridXOffset = 0;
    tileGridYOffset = 0;
  }
}
