/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2007-2008, Open Source Geospatial Foundation (OSGeo)
*
* 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;
* version 2.1 of the License.
*
* 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.
*/
package org.geotools.image.io;
import java.util.Locale;
import javax.imageio.ImageReader;
import javax.imageio.ImageReadParam;
import org.geotools.resources.Classes;
import org.geotools.resources.i18n.Errors;
import org.geotools.resources.i18n.ErrorKeys;
import org.geotools.resources.IndexedResourceBundle;
/**
* Default parameters for {@link GeographicImageReader}.
*
* @since 2.4
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux
*/
public class GeographicImageReadParam extends ImageReadParam {
/**
* The name of the default color palette to apply when none was explicitly specified.
*
* @see #getPaletteName
* @see #setPaletteName
*/
public static final String DEFAULT_PALETTE_NAME = "rainbow";
/**
* The name of the color palette.
*/
private String palette;
/**
* The band to display.
*/
private int visibleBand;
/**
* The locale for formatting error messages. Will be inferred from
* the {@linkplain ImageReader image reader} at construction time.
*/
private final Locale locale;
/**
* Creates a new, initially empty, set of parameters.
*
* @param reader The reader for which this parameter block is created
*/
public GeographicImageReadParam(final ImageReader reader) {
locale = (reader != null) ? reader.getLocale() : null;
}
/**
* Returns the resources for formatting error messages.
*/
private IndexedResourceBundle getErrorResources() {
return Errors.getResources(locale);
}
/**
* Ensures that the specified band number is valid.
*/
private void ensureValidBand(final int band) throws IllegalArgumentException {
if (band < 0) {
throw new IllegalArgumentException(getErrorResources().getString(
ErrorKeys.BAD_BAND_NUMBER_$1, band));
}
}
/**
* Returns the band to display in the target image. In theory, images backed by
* {@linkplain java.awt.image.IndexColorModel index color model} should have only
* ony band. But sometime we want to load additional bands as numerical data, in
* order to perform computations. In such case, we need to specify which band in
* the destination image will be used as an index for displaying the colors. The
* default value is 0.
*/
public int getVisibleBand() {
return visibleBand;
}
/**
* Sets the band to make visible in the destination image.
*
* @param visibleBand The band to make visible.
* @throws IllegalArgumentException if the specified band index is invalid.
*/
public void setVisibleBand(final int visibleBand) throws IllegalArgumentException {
ensureValidBand(visibleBand);
this.visibleBand = visibleBand;
}
/**
* Returns a name of the color palette, or a {@linkplain #DEFAULT_PALETTE_NAME default name}
* if none were explicitly specified.
*/
final String getNonNullPaletteName() {
final String palette = getPaletteName();
return (palette != null) ? palette : DEFAULT_PALETTE_NAME;
}
/**
* Returns the name of the color palette to apply when creating an
* {@linkplain java.awt.image.IndexColorModel index color model}.
* This is the name specified by the last call to {@link #setPaletteName}.
*/
public String getPaletteName() {
return palette;
}
/**
* Sets the color palette as one of the {@linkplain PaletteFactory#getAvailableNames available
* names} provided by the {@linkplain PaletteFactory#getDefault default palette factory}. This
* name will be given by the {@link GeographicImageReader} default implementation to the
* {@linkplain PaletteFactory#getDefault default palette factory} for creating a
* {@linkplain javax.imageio.ImageTypeSpecifier image type specifier}.
*
* @see PaletteFactory#getAvailableNames
*/
public void setPaletteName(final String palette) {
this.palette = palette;
}
/**
* Returns a string representation of this block of parameters.
*/
@Override
public String toString() {
final StringBuilder buffer = new StringBuilder(Classes.getShortClassName(this));
buffer.append('[');
if (sourceRegion != null) {
buffer.append("sourceRegion=(").
append(sourceRegion.x).append(':').append(sourceRegion.x + sourceRegion.width).append(',').
append(sourceRegion.y).append(':').append(sourceRegion.y + sourceRegion.height).append("), ");
}
if (sourceXSubsampling != 1 || sourceYSubsampling != 1) {
buffer.append("subsampling=(").append(sourceXSubsampling).append(',').
append(sourceYSubsampling).append("), ");
}
if (sourceBands != null) {
buffer.append("sourceBands={");
for (int i=0; i<sourceBands.length; i++) {
if (i != 0) {
buffer.append(',');
}
buffer.append(sourceBands[i]);
}
buffer.append("}, ");
}
buffer.append("palette=\"").append(palette).append("\", ").append(']');
return buffer.toString();
}
}