/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2009-2012, Open Source Geospatial Foundation (OSGeo) * (C) 2009-2012, Geomatys * * 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.geotoolkit.coverage.io; import java.util.Arrays; /** * Describes how a stream is to be decoded. Instances of this class are used to supply * information to instances of {@link GridCoverageReader}. * * {@note This class is conceptually equivalent to the <code>ImageReadParam</code> class provided * in the standard Java library. The main difference is that <code>GridCoverageReadParam</code> * works with geodetic coordinates while <code>ImageReadParam</code> works with pixel coordinates.} * * @author Johann Sorel (Geomatys) * @author Martin Desruisseaux (Geomatys) * @version 3.15 * * @see javax.imageio.ImageReadParam * * @since 3.09 * @module */ public class GridCoverageReadParam extends GridCoverageStoreParam { /** * For cross-version compatibility. */ private static final long serialVersionUID = -7515981676576102704L; /** * The set of destination bands where data will be placed. By default, the value is * {@code null}, indicating that all destination bands should be written in order. */ private int[] destinationBands; /** * A flag which indicates if the coverage data reading may be deferred. * Default value is false which is the expected behavior when dealing with * reading operations. */ private boolean deferred = false; /** * Creates a new {@code GridCoverageReadParam} instance. All properties are * initialized to {@code null}. Callers must invoke setter methods in order * to provide information about the way to decode the stream. */ public GridCoverageReadParam() { } /** * Creates a new {@code GridCoverageReadParam} instance initialized to the same * values than the given parameters. * * @param param The parameters to copy, or {@code null} if none. * * @since 3.15 */ public GridCoverageReadParam(final GridCoverageStoreParam param) { super(param); if (param instanceof GridCoverageReadParam) { final GridCoverageReadParam rp = (GridCoverageReadParam) param; destinationBands = rp.destinationBands; } } /** * {@inheritDoc} */ @Override public void clear() { destinationBands = null; deferred = false; super.clear(); } /** * Returns the set of destination bands where data will be placed. By default, the value * is {@code null}, indicating that all destination bands should be written in order. * * @return The set of destination bands where data will be placed, or {@code null}. * * @see javax.imageio.ImageReadParam#getDestinationBands() * * @since 3.10 */ public int[] getDestinationBands() { final int[] bands = destinationBands; return (bands != null) ? bands.clone() : null; } /** * Sets the indices of the destination bands where data will be placed. A null value * indicates that all destination bands will be used. * <p> * At the time of reading, an {@link IllegalArgumentException} will be thrown by the reader * if a value larger than the largest destination band index has been specified or if the * number of source bands and destination bands to be used differ. * * @param bands The destination bands, or {@code null}. * @throws IllegalArgumentException If the given array is empty, * or if it contains duplicated or negative values. * * @see javax.imageio.ImageReadParam#setDestinationBands(int[]) * * @since 3.10 */ public void setDestinationBands(final int... bands) throws IllegalArgumentException { destinationBands = checkAndClone(bands); } /** * This flag indicates if the coverage data reading may be deferred. * Default value is false which is the expected behavior when dealing with * reading operations. * * /!\ The {@link org.opengis.coverage.grid.GridCoverage} generated by a deferred reading is strongly bound to its underlying * reader, as it may use it to load data on the fly. You should NOT call {@link GridCoverageReader#dispose()} while * you're working with a coverage generated by a deferred reading. * * @return true if reading may be deferred */ public boolean isDeferred() { return deferred; } /** * Set deferred flag. * * @see GridCoverageReadParam#isDeferred() * * @param deferred */ public void setDeferred(boolean deferred) { this.deferred = deferred; } /** * Invoked by the superclass in order to complete the string built by {@link #toString()}. */ @Override final void toString(final StringBuilder buffer, String separator) { if (destinationBands != null) { buffer.append(separator).append("destinationBands=").append(Arrays.toString(destinationBands)); } } }