mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
/* IIOParam.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.Point;
 | 
						|
import java.awt.Rectangle;
 | 
						|
 | 
						|
/**
 | 
						|
 * An IIOParam stores parameters used when encoding or decoding image
 | 
						|
 * streams.  ImageReadParam and ImageWriteParam extend this abstract
 | 
						|
 * base class.
 | 
						|
 *
 | 
						|
 * IIOParams allow control over how source pixels converted into
 | 
						|
 * destination pixels.  This conversion can take place between a
 | 
						|
 * stream and in-memory image data, when an image reader is doing the
 | 
						|
 * conversion, or a writer can be doing the conversion from an
 | 
						|
 * in-memory source to a stream destination.
 | 
						|
 *
 | 
						|
 * An image reader can be restricted to only read from a given region;
 | 
						|
 * likewise a writer can be restricted to only write output to a given
 | 
						|
 * region.
 | 
						|
 *
 | 
						|
 * For image readers and writers, IIOParam supports image pixelation
 | 
						|
 * -- where the input image is approximated by the output image using
 | 
						|
 * larger-sized pixel blocks.  For example: FIXME
 | 
						|
 *
 | 
						|
 * IIOParams can control how pixels are combined into larger blocks
 | 
						|
 * using sub-sampling matrices.  For example: FIXME
 | 
						|
 *
 | 
						|
 * They can also control which source bands are read and written; this
 | 
						|
 * example reads the RGBA (red, green, blue, transparency) data from a
 | 
						|
 * PNG image and outputs just the red and transparency bands: FIXME
 | 
						|
 *
 | 
						|
 * @author Thomas Fitzsimmons (fitzsim@redhat.com)
 | 
						|
 * @author Michael Koch (konqueror@gmx.de)
 | 
						|
 */
 | 
						|
public abstract class IIOParam
 | 
						|
{
 | 
						|
  /**
 | 
						|
   * The controller called by this IIOParam to retrieve parameters.
 | 
						|
   */
 | 
						|
  protected IIOParamController controller = null;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The default controller called by this IIOParam to retrieve
 | 
						|
   * parameters.
 | 
						|
   */
 | 
						|
  protected IIOParamController defaultController = null;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The offset in the destination where the upper-left
 | 
						|
   * decoded/encoded pixel should be located.
 | 
						|
   */
 | 
						|
  protected Point destinationOffset = new Point(0, 0);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sets the output colour type when writing or the destination image
 | 
						|
   * type when reading.
 | 
						|
   */
 | 
						|
  protected ImageTypeSpecifier destinationType = null;
 | 
						|
 | 
						|
  /**
 | 
						|
   * An array indicating which source bands will be used or null.
 | 
						|
   */
 | 
						|
  protected int[] sourceBands = null;
 | 
						|
 | 
						|
  /**
 | 
						|
   * The source pixel region or null.
 | 
						|
   */
 | 
						|
  protected Rectangle sourceRegion = null;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sample every sourceXSubsampling'th pixel in the source image when
 | 
						|
   * pixelating the destination image in the horizontal direction.
 | 
						|
   */
 | 
						|
  protected int sourceXSubsampling = 1;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sample every sourceYSubsampling'th pixel in the source image when
 | 
						|
   * pixelating the destination image in the vertical direction.
 | 
						|
   */
 | 
						|
  protected int sourceYSubsampling = 1;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Start sampling at this horizontal offset within the source region
 | 
						|
   * when pixelating the destination image in the horizontal
 | 
						|
   * direction.
 | 
						|
   */
 | 
						|
  protected int subsamplingXOffset = 0;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Start sampling at this vertical offset within the source region
 | 
						|
   * when pixelating the destination image in the vertical direction.
 | 
						|
   */
 | 
						|
  protected int subsamplingYOffset = 0;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Indicates whether or not the controller has been explicitly set
 | 
						|
   * to null.
 | 
						|
   */
 | 
						|
  private boolean no_controller = false;
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs an IIOParam object.
 | 
						|
   */
 | 
						|
  protected IIOParam()
 | 
						|
  {
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Activates the parameter controller by calling its activate method
 | 
						|
   * and passing it this IIOParam.  A true return value indicates that
 | 
						|
   * this IIOParam's values are ready for the next read or write
 | 
						|
   * operation.  A return value of false means that this IIOParam's
 | 
						|
   * values have not been affected because the controller operations
 | 
						|
   * were cancelled.
 | 
						|
   *
 | 
						|
   * @return true if parameters were successfully set, false if
 | 
						|
   * parameters were not changed
 | 
						|
   */
 | 
						|
  public boolean activateController()
 | 
						|
  {
 | 
						|
    if (controller == null)
 | 
						|
      {
 | 
						|
        if (defaultController == null || no_controller)
 | 
						|
          return false;
 | 
						|
        else
 | 
						|
          return defaultController.activate (this);
 | 
						|
      }
 | 
						|
    else
 | 
						|
      return controller.activate(this);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the currently set controller if one has been set, or the
 | 
						|
   * default controller, or null if the controller has been explicitly
 | 
						|
   * set to null.
 | 
						|
   *
 | 
						|
   * @return the currently used controller or null
 | 
						|
   */
 | 
						|
  public IIOParamController getController()
 | 
						|
  {
 | 
						|
    return controller == null ?
 | 
						|
      (no_controller ? null : defaultController) : controller;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the default controller regardless of whether or not a
 | 
						|
   * non-default controller has been set.  The default controller may
 | 
						|
   * be null.
 | 
						|
   *
 | 
						|
   * @return the default controller or null
 | 
						|
   */
 | 
						|
  public IIOParamController getDefaultController()
 | 
						|
  {
 | 
						|
    return defaultController;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the offset in the destination where the upper-left
 | 
						|
   * decoded/encoded pixel should be located. (0, 0) by default.
 | 
						|
   *
 | 
						|
   * @return the destination offset
 | 
						|
   */
 | 
						|
  public Point getDestinationOffset()
 | 
						|
  {
 | 
						|
    return destinationOffset;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the currently set image-type specifier or null if none
 | 
						|
   * has been set.
 | 
						|
   *
 | 
						|
   * @return the current image-type specifier or null
 | 
						|
   */
 | 
						|
  public ImageTypeSpecifier getDestinationType()
 | 
						|
  {
 | 
						|
    return destinationType;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the current source band values or null if source band
 | 
						|
   * values have not been set.
 | 
						|
   *
 | 
						|
   * The returned array is a copy of this IIOParam's source band
 | 
						|
   * array.
 | 
						|
   *
 | 
						|
   * @return the current set of source band values or null
 | 
						|
   */
 | 
						|
  public int[] getSourceBands()
 | 
						|
  {
 | 
						|
    if (sourceBands == null)
 | 
						|
      return null;
 | 
						|
 | 
						|
    int[] sourceBandsCopy = new int[sourceBands.length];
 | 
						|
    System.arraycopy (sourceBands, 0, sourceBandsCopy, 0, sourceBands.length);
 | 
						|
    return sourceBandsCopy;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the source rectangle from which pixels should be read or
 | 
						|
   * null if no source region has been set.
 | 
						|
   *
 | 
						|
   * @return the current source region or null
 | 
						|
   */
 | 
						|
  public Rectangle getSourceRegion()
 | 
						|
  {
 | 
						|
    return sourceRegion;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the number of pixel columns to advance before taking a
 | 
						|
   * pixel sample.
 | 
						|
   *
 | 
						|
   * @return the horizontal sub-sampling interval
 | 
						|
   */
 | 
						|
  public int getSourceXSubsampling()
 | 
						|
  {
 | 
						|
    return sourceXSubsampling;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the number of pixel rows to advance before taking a
 | 
						|
   * pixel sample.
 | 
						|
   *
 | 
						|
   * @return the vertical sub-sampling interval
 | 
						|
   */
 | 
						|
  public int getSourceYSubsampling()
 | 
						|
  {
 | 
						|
    return sourceYSubsampling;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the number of pixel columns to advance before taking any
 | 
						|
   * pixel samples.
 | 
						|
   *
 | 
						|
   * @return the horizontal sub-sampling offset
 | 
						|
   */
 | 
						|
  public int getSubsamplingXOffset()
 | 
						|
  {
 | 
						|
    return subsamplingXOffset;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Retrieve the number of pixel rows to advance before taking any
 | 
						|
   * pixel samples.
 | 
						|
   *
 | 
						|
   * @return the vertical sub-sampling offset
 | 
						|
   */
 | 
						|
  public int getSubsamplingYOffset()
 | 
						|
  {
 | 
						|
    return subsamplingYOffset;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Check if a non-null controller is currently available.
 | 
						|
   *
 | 
						|
   * @return true if getController returns a non-null value, false if
 | 
						|
   * getController returns null
 | 
						|
   */
 | 
						|
  public boolean hasController()
 | 
						|
  {
 | 
						|
    return getController() != null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Sets the controller for this IIOParam.  This is the controller
 | 
						|
   * that will be activated when activateController is called.  The
 | 
						|
   * argument controller overrides this IIOParam's default controller.
 | 
						|
   * If the argument is null then no controller will be set, not even
 | 
						|
   * the default one.  To reset the default controller call
 | 
						|
   * setController(getDefaultController()).
 | 
						|
   *
 | 
						|
   * @param controller the controller to set or null
 | 
						|
   */
 | 
						|
  public void setController(IIOParamController controller)
 | 
						|
  {
 | 
						|
    if (controller == defaultController)
 | 
						|
      {
 | 
						|
        this.controller = null;
 | 
						|
        no_controller = false;
 | 
						|
      }
 | 
						|
    else
 | 
						|
      {
 | 
						|
        no_controller = (controller == null);
 | 
						|
        this.controller = controller;
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the destination image type.
 | 
						|
   *
 | 
						|
   * If this value is set on an image reader then its read method will
 | 
						|
   * return a new BufferedImage of the specified destination type.  In
 | 
						|
   * this case any destination image set using setDestination() is
 | 
						|
   * ignored.
 | 
						|
   *
 | 
						|
   * If this is set on an image writer then the destination type
 | 
						|
   * affects only the colour model of the destination image.  The
 | 
						|
   * destination type's SampleModel is ignored.  The destination
 | 
						|
   * type's ColorModel will override the source image's colour model.
 | 
						|
   *
 | 
						|
   * @param destinationType the sample and colour models of the
 | 
						|
   * destination image
 | 
						|
   */
 | 
						|
  public void setDestinationType (ImageTypeSpecifier destinationType)
 | 
						|
  {
 | 
						|
    this.destinationType = destinationType;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Specify the destination pixel offset.  Image writers are only
 | 
						|
   * affected by this setting when ImageWriter.replacePixels is called
 | 
						|
   * in which case the offset is into the region of pixels being
 | 
						|
   * changed.
 | 
						|
   *
 | 
						|
   * @param destinationOffset the offset where pixel writing should
 | 
						|
   * begin
 | 
						|
   */
 | 
						|
  public void setDestinationOffset(Point destinationOffset)
 | 
						|
  {
 | 
						|
    if (destinationOffset == null)
 | 
						|
      throw new IllegalArgumentException("destinationOffset is null");
 | 
						|
 | 
						|
    this.destinationOffset = destinationOffset;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the indices of the source bands to be used.  Duplicate
 | 
						|
   * indices are not allowed.  A value of null means use all source
 | 
						|
   * bands.  The argument array is copied and stored, so subsequent
 | 
						|
   * updates to it will not be reflected in this IIOParam.
 | 
						|
   *
 | 
						|
   * @param sourceBands the array of source bands to use
 | 
						|
   */
 | 
						|
  public void setSourceBands(int[] sourceBands)
 | 
						|
  {
 | 
						|
    int[] sourceBandsCopy = new int[sourceBands.length];
 | 
						|
    System.arraycopy (sourceBands, 0, sourceBandsCopy, 0, sourceBands.length);
 | 
						|
    this.sourceBands = sourceBandsCopy;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the source region from which to read.  The number of pixels
 | 
						|
   * sampled from the source region depends on the source sub-sampling
 | 
						|
   * settings.  If the combination of this sourceRegion and the
 | 
						|
   * current sub-sampling settings would result in no pixels being
 | 
						|
   * sampled then an IllegalStateException will be thrown.
 | 
						|
   *
 | 
						|
   * The source region is specified in the source image coordinate
 | 
						|
   * system which has point (0, 0) at the top-left and increases down
 | 
						|
   * and to the right.  The argument source region is clipped to the
 | 
						|
   * image boundaries at read-time.
 | 
						|
   *
 | 
						|
   * A null argument sets the source region to null meaning that the
 | 
						|
   * whole image should be read.
 | 
						|
   *
 | 
						|
   * @param sourceRegion the rectangular source region
 | 
						|
   *
 | 
						|
   * @exception IllegalArgumentException if sourceRegion has width or
 | 
						|
   * height <= 0 or x or y < 0
 | 
						|
   * @exception IllegalStateException if the given sourceRegion and
 | 
						|
   * the current sampling settings would produce zero samples
 | 
						|
   */
 | 
						|
  public void setSourceRegion(Rectangle sourceRegion)
 | 
						|
  {
 | 
						|
    if (sourceRegion != null
 | 
						|
        && (sourceRegion.x < 0
 | 
						|
            || sourceRegion.y < 0
 | 
						|
            || sourceRegion.width <= 0
 | 
						|
            || sourceRegion.height <= 0))
 | 
						|
      throw new IllegalArgumentException("illegal source region");
 | 
						|
 | 
						|
    if (sourceRegion != null)
 | 
						|
      {
 | 
						|
        int num_rows =
 | 
						|
          (sourceRegion.height - subsamplingYOffset + sourceYSubsampling - 1)
 | 
						|
          / sourceYSubsampling;
 | 
						|
 | 
						|
        int num_columns =
 | 
						|
          (sourceRegion.width - subsamplingXOffset + sourceXSubsampling - 1)
 | 
						|
          / sourceXSubsampling;
 | 
						|
 | 
						|
        if (num_rows <= 0 || num_columns <= 0)
 | 
						|
          throw new IllegalStateException("zero pixels in source region");
 | 
						|
      }
 | 
						|
 | 
						|
    this.sourceRegion = sourceRegion;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set the source sampling intervals and offsets.  Every
 | 
						|
   * sourceXSubsampling'th pixel horizontally and
 | 
						|
   * sourceYSubsampling'th pixel vertically will be sampled.  Sampling
 | 
						|
   * will being a the subsamplingXOffset'th column and the
 | 
						|
   * subsamplingYOffset'th row.
 | 
						|
   *
 | 
						|
   * Horizontally, the number of sampled pixels will be:
 | 
						|
   *
 | 
						|
   * floor((width - subsamplingXOffset + sourceXSubsampling - 1) / sourceXSubsampling)
 | 
						|
   *
 | 
						|
   * Vertically:
 | 
						|
   *
 | 
						|
   * floor((height - subsamplingYOffset + sourceYSubsampling - 1) / sourceYSubsampling)
 | 
						|
   *
 | 
						|
   * If the current source region setting is such that the given
 | 
						|
   * sub-sampling arguments would produce zero pixel samples, an
 | 
						|
   * IllegalStateException is thrown.
 | 
						|
   *
 | 
						|
   * The offset parameters can be used to make source regions overlap
 | 
						|
   * when tiling across an image.  This can eliminate seams and
 | 
						|
   * better-tile images whose width or height is not a multiple of the
 | 
						|
   * sampling interval.
 | 
						|
   *
 | 
						|
   * @param sourceXSubsampling the horizontal sampling interval
 | 
						|
   * @param sourceYSubsampling the vertical sampling interval
 | 
						|
   * @param subsamplingXOffset the horizontal offset of the initial
 | 
						|
   * sample
 | 
						|
   * @param subsamplingYOffset the vertical offset of the initial
 | 
						|
   * sample
 | 
						|
   *
 | 
						|
   * @exception IllegalArgumentException if either subsamplingXOffset
 | 
						|
   * or subsamplingYOffset is < 0
 | 
						|
   * @exception IllegalStateException if the current source region
 | 
						|
   * combined with the given sub-sampling parameters would produce
 | 
						|
   * zero pixel samples
 | 
						|
   */
 | 
						|
  public void setSourceSubsampling(int sourceXSubsampling, int sourceYSubsampling,
 | 
						|
                                   int subsamplingXOffset, int subsamplingYOffset)
 | 
						|
  {
 | 
						|
    if (subsamplingXOffset < 0 || subsamplingYOffset < 0)
 | 
						|
      throw new IllegalArgumentException("subsampling offset < 0");
 | 
						|
 | 
						|
    if (sourceRegion != null)
 | 
						|
      {
 | 
						|
        int num_rows =
 | 
						|
          (sourceRegion.height - subsamplingYOffset + sourceYSubsampling - 1)
 | 
						|
          / sourceYSubsampling;
 | 
						|
 | 
						|
        int num_columns =
 | 
						|
          (sourceRegion.width - subsamplingXOffset + sourceXSubsampling - 1)
 | 
						|
          / sourceXSubsampling;
 | 
						|
 | 
						|
        if (num_rows <= 0 || num_columns <= 0)
 | 
						|
          throw new IllegalStateException("subsampling parameters would"
 | 
						|
                                          + " produce zero pixel samples"
 | 
						|
                                          + " in source region");
 | 
						|
      }
 | 
						|
 | 
						|
    this.sourceXSubsampling = sourceXSubsampling;
 | 
						|
    this.sourceYSubsampling = sourceYSubsampling;
 | 
						|
    this.subsamplingXOffset = subsamplingXOffset;
 | 
						|
    this.subsamplingYOffset = subsamplingYOffset;
 | 
						|
  }
 | 
						|
}
 |