01: /*
02: * GeoTools - OpenSource mapping toolkit
03: * http://geotools.org
04: * (C) 2003-2006, Geotools Project Managment Committee (PMC)
05: * (C) 2003, Institut de Recherche pour le Développement
06: *
07: * This library is free software; you can redistribute it and/or
08: * modify it under the terms of the GNU Lesser General Public
09: * License as published by the Free Software Foundation; either
10: * version 2.1 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: */
17: package org.geotools.image.jai;
18:
19: /**
20: * Transforms the sample values for one pixel during a "{@link Combine Combine}" operation.
21: * The method {@link #transformSamples} is invoked by {@link Combine#computeRect
22: * Combine.computeRect(...)} just before the sample values are combined as
23: *
24: * <code>values[0]*row[0] + values[1]*row[1] + values[2]*row[2] + ... + row[sourceBands]</code>.
25: *
26: * This interface provides a hook where non-linear transformations can be performed before the
27: * linear one. For example, the {@code transformSamples} method could substitutes some
28: * values by their logarithm.
29: *
30: * @since 2.1
31: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/coverage/src/main/java/org/geotools/image/jai/CombineTransform.java $
32: * @version $Id: CombineTransform.java 20970 2006-08-11 07:53:22Z jgarnett $
33: * @author Martin Desruisseaux
34: */
35: public interface CombineTransform {
36: /**
37: * Transforms the sample values for one pixel before the linear combinaison.
38: *
39: * @param values The sampel values to transformation.
40: * Transformation are performed in-place.
41: */
42: public abstract void transformSamples(final double[] values);
43:
44: /**
45: * Returns {@code true} if the transformation performed by {@link #transformSamples}
46: * do not depends on the ordering of samples in the {@code values} array. This method
47: * can returns {@code true} if the {@code transformSamples(double[])} implementation
48: * meet the following conditions:
49: *
50: * <ul>
51: * <li>The transformation is separable, i.e. the output value {@code values[i]} depends
52: * only on the input value {@code values[i]} for all <var>i</var>.</li>
53: * <li>The transformation do not depends on the value of the index <var>i</var>.
54: * </ul>
55: *
56: * For example, the following implementations meets the above mentioned conditions:
57: *
58: * <blockquote><pre>
59: * for (int i=0; i<values.length; i++) {
60: * values[i] = someFunction(values[i]);
61: * }
62: * </pre></blockquote>
63: *
64: * A {@code true} value will allows some optimisations inside the
65: * {@link Combine#computeRect Combine.computeRect(...)} method. This method
66: * may conservatly returns {@code false} if this information is unknow.
67: */
68: public abstract boolean isSeparable();
69: }
|