This is an automated email from the ASF dual-hosted git repository.
desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
new 61589faccb Rename `MultiSourceLayout` and `BandAggregateLayout` for
making clear that this is about band aggregate only rather than all
multi-source image.
61589faccb is described below
commit 61589faccbda84edd3ff45b733e91a753beb4d9f
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Sat Dec 14 20:11:12 2024 +0100
Rename `MultiSourceLayout` and `BandAggregateLayout` for making clear
that this is about band aggregate only rather than all multi-source image.
---
.../coverage/grid/BandAggregateGridCoverage.java | 6 +++---
.../sis/coverage/grid/GridCoverageProcessor.java | 4 ++--
...rceArgument.java => BandAggregateArgument.java} | 6 +++---
.../org/apache/sis/coverage/privy/ImageLayout.java | 12 +++++++-----
.../org/apache/sis/image/BandAggregateImage.java | 22 +++++++++++++++-------
...iSourceLayout.java => BandAggregateLayout.java} | 22 +++++++++++-----------
.../org/apache/sis/image/MultiSourceImage.java | 2 +-
.../aggregate/BandAggregateGridResource.java | 10 +++++-----
8 files changed, 47 insertions(+), 37 deletions(-)
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/BandAggregateGridCoverage.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/BandAggregateGridCoverage.java
index 2f3d391420..695876c2c8 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/BandAggregateGridCoverage.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/BandAggregateGridCoverage.java
@@ -24,7 +24,7 @@ import org.opengis.referencing.operation.TransformException;
import org.apache.sis.image.DataType;
import org.apache.sis.image.ImageProcessor;
import org.apache.sis.feature.internal.Resources;
-import org.apache.sis.coverage.privy.MultiSourceArgument;
+import org.apache.sis.coverage.privy.BandAggregateArgument;
import org.apache.sis.util.privy.CollectionsExt;
@@ -93,7 +93,7 @@ final class BandAggregateGridCoverage extends GridCoverage {
* @throws IllegalArgumentException if there is an incompatibility between
some source coverages
* or if some band indices are duplicated or outside their range
of validity.
*/
- BandAggregateGridCoverage(final MultiSourceArgument<GridCoverage>
aggregate, final ImageProcessor processor) {
+ BandAggregateGridCoverage(final BandAggregateArgument<GridCoverage>
aggregate, final ImageProcessor processor) {
super(aggregate.domain(GridCoverage::getGridGeometry),
aggregate.ranges());
this.sources = aggregate.sources();
this.bandsPerSource = aggregate.bandsPerSource(true);
@@ -118,7 +118,7 @@ final class BandAggregateGridCoverage extends GridCoverage {
*
* @param unwrapper a handler where to supply the result of an aggregate
decomposition.
*/
- static void unwrap(final MultiSourceArgument<GridCoverage>.Unwrapper
unwrapper) {
+ static void unwrap(final BandAggregateArgument<GridCoverage>.Unwrapper
unwrapper) {
if (unwrapper.source instanceof BandAggregateGridCoverage) {
final var aggregate = (BandAggregateGridCoverage) unwrapper.source;
unwrapper.applySubset(aggregate.sources, aggregate.bandsPerSource,
GridCoverage::getSampleDimensions);
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCoverageProcessor.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCoverageProcessor.java
index 3128803050..69fcbc0b47 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCoverageProcessor.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/grid/GridCoverageProcessor.java
@@ -46,7 +46,7 @@ import org.apache.sis.image.PlanarImage;
import org.apache.sis.image.ImageProcessor;
import org.apache.sis.image.Interpolation;
import org.apache.sis.coverage.privy.SampleDimensions;
-import org.apache.sis.coverage.privy.MultiSourceArgument;
+import org.apache.sis.coverage.privy.BandAggregateArgument;
import org.apache.sis.referencing.CommonCRS;
import org.apache.sis.referencing.crs.DefaultTemporalCRS;
import org.apache.sis.referencing.operation.transform.MathTransforms;
@@ -886,7 +886,7 @@ public class GridCoverageProcessor implements Cloneable {
* @since 1.4
*/
public GridCoverage aggregateRanges(GridCoverage[] sources, int[][]
bandsPerSource) {
- final var aggregate = new MultiSourceArgument<>(sources,
bandsPerSource);
+ final var aggregate = new BandAggregateArgument<>(sources,
bandsPerSource);
aggregate.unwrap(BandAggregateGridCoverage::unwrap);
aggregate.completeAndValidate(GridCoverage::getSampleDimensions);
aggregate.mergeConsecutiveSources();
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/MultiSourceArgument.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/BandAggregateArgument.java
similarity index 99%
rename from
endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/MultiSourceArgument.java
rename to
endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/BandAggregateArgument.java
index b7f0c965ea..a4c9737149 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/MultiSourceArgument.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/BandAggregateArgument.java
@@ -56,7 +56,7 @@ import org.apache.sis.util.resources.Errors;
* @param <S> type of objects that are the source of sample dimensions.
*/
@SuppressWarnings("ReturnOfCollectionOrArrayField") // See class Javadoc.
-public final class MultiSourceArgument<S> {
+public final class BandAggregateArgument<S> {
/**
* The user-specified sources, usually grid coverages or rendered images.
* This is initially a copy of the array specified at construction time.
@@ -142,7 +142,7 @@ public final class MultiSourceArgument<S> {
* @param sources the sources from which to get the sample
dimensions.
* @param bandsPerSource sample dimensions for each source. May contain
{@code null} elements.
*/
- public MultiSourceArgument(S[] sources, int[][] bandsPerSource) {
+ public BandAggregateArgument(S[] sources, int[][] bandsPerSource) {
/*
* Ensure that both arrays are non-null and have the same length.
* Copy those arrays because their content will be overwritten.
@@ -287,7 +287,7 @@ public final class MultiSourceArgument<S> {
}
/**
- * Notifies the enclosing {@code MultiSourceArgument} that the
{@linkplain #source}
+ * Notifies the enclosing {@code BandAggregateArgument} that the
{@linkplain #source}
* shall be replaced by deeper sources. The {@code componentBands}
array specifies
* the bands to use for each source and shall take in account the
{@link #bands} subset.
*
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ImageLayout.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ImageLayout.java
index 719e6ed9de..50e0bfa8cb 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ImageLayout.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ImageLayout.java
@@ -382,12 +382,13 @@ public class ImageLayout {
*
* <p>This method constructs the simplest possible banded sample model:
* All {@linkplain BandedSampleModel#getBandOffsets() band offsets} are
zero and
- * all {@linkplain BandedSampleModel#getBankIndices() bank indices} are
identity mapping.</p>
+ * all {@linkplain BandedSampleModel#getBankIndices() bank indices} are
identity mapping.
+ * This simplicity is needed by current implementation of {@link
org.apache.sis.image.BandAggregateImage}.</p>
*
- * @param dataType desired data type as a {@link
java.awt.image.DataBuffer} constant.
- * @param numBands desired number of bands.
- * @param image the image which will be the source of the image for
which a sample model is created.
- * @param bounds the bounds of the image to create, or {@code null} if
same as {@code image}.
+ * @param dataType desired data type as a {@link
java.awt.image.DataBuffer} constant.
+ * @param numBands desired number of bands.
+ * @param image the image which will be the source of the image
for which a sample model is created.
+ * @param bounds the bounds of the image to create, or {@code
null} if same as {@code image}.
* @param scanlineStride the line stride of the of the image data, or ≤
0 for automatic.
* @return a banded sample model of the given type with the given number
of bands.
*/
@@ -398,6 +399,7 @@ public class ImageLayout {
if (scanlineStride <= 0) {
scanlineStride = tileSize.width;
}
+ // Pixel stride, bank indices and band offsets intentionally
non-configurable. See Javadoc.
return RasterFactory.unique(new BandedSampleModel(dataType,
tileSize.width, tileSize.height,
scanlineStride, ArraysExt.range(0,
numBands), new int[numBands]));
}
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateImage.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateImage.java
index 3403b1abdc..47b8bdc130 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateImage.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateImage.java
@@ -25,7 +25,7 @@ import java.awt.image.WritableRaster;
import java.awt.image.WritableRenderedImage;
import org.apache.sis.util.ArraysExt;
import org.apache.sis.coverage.privy.ImageUtilities;
-import org.apache.sis.coverage.privy.MultiSourceArgument;
+import org.apache.sis.coverage.privy.BandAggregateArgument;
/**
@@ -61,7 +61,7 @@ class BandAggregateImage extends MultiSourceImage {
*
* @param unwrapper a handler where to supply the result of an aggregate
decomposition.
*/
- static void unwrap(final MultiSourceArgument<RenderedImage>.Unwrapper
unwrapper) {
+ static void unwrap(final BandAggregateArgument<RenderedImage>.Unwrapper
unwrapper) {
RenderedImage source = unwrapper.source;
int[] bands = unwrapper.bands;
while (source instanceof ImageAdapter) {
@@ -93,7 +93,7 @@ class BandAggregateImage extends MultiSourceImage {
* @return an image with a subset of the bands of this image, or {@code
null} if {@code unwrapper} was non-null.
*/
final RenderedImage subset(final int[] bands, final ColorModel colors,
- final MultiSourceArgument<RenderedImage>.Unwrapper unwrapper)
+ final BandAggregateArgument<RenderedImage>.Unwrapper unwrapper)
{
final RenderedImage[] sources = new RenderedImage[bands.length];
final int[][] bandsPerSource = new int[bands.length][];
@@ -140,7 +140,7 @@ class BandAggregateImage extends MultiSourceImage {
static RenderedImage create(final RenderedImage[] sources, final int[][]
bandsPerSource, final Colorizer colorizer,
final boolean forceColors, final boolean
allowSharing, final boolean parallel)
{
- final var layout = MultiSourceLayout.create(sources, bandsPerSource,
allowSharing);
+ final var layout = BandAggregateLayout.create(sources, bandsPerSource,
allowSharing);
final BandAggregateImage image;
if (layout.isWritable()) {
image = new Writable(layout, colorizer, allowSharing, parallel);
@@ -169,7 +169,7 @@ class BandAggregateImage extends MultiSourceImage {
* @param layout pixel and tile coordinate spaces of this image,
together with sample model.
* @param colorizer provider of color model to use for this image, or
{@code null} for automatic.
*/
- private BandAggregateImage(final MultiSourceLayout layout, final Colorizer
colorizer,
+ private BandAggregateImage(final BandAggregateLayout layout, final
Colorizer colorizer,
final boolean allowSharing, final boolean
parallel)
{
super(layout, colorizer, parallel);
@@ -191,7 +191,7 @@ class BandAggregateImage extends MultiSourceImage {
/*
* If we are allowed to share the data arrays, try that first.
* The cast to `BandedSampleModel` is safe because this is the
- * type given by `MultiSourceLayout` in the constructor.
+ * type given by `BandAggregateLayout` in the constructor.
*/
BandSharedRaster shared = null;
if (allowSharing) {
@@ -237,7 +237,7 @@ class BandAggregateImage extends MultiSourceImage {
* @param layout pixel and tile coordinate spaces of this image,
together with sample model.
* @param colorizer provider of color model to use for this image,
or {@code null} for automatic.
*/
- Writable(final MultiSourceLayout layout, final Colorizer colorizer,
+ Writable(final BandAggregateLayout layout, final Colorizer colorizer,
final boolean allowSharing, final boolean parallel)
{
super(layout, colorizer, allowSharing, parallel);
@@ -332,4 +332,12 @@ class BandAggregateImage extends MultiSourceImage {
public boolean equals(final Object object) {
return super.equals(object) && ((BandAggregateImage)
object).allowSharing == allowSharing;
}
+
+ /**
+ * Returns a hash code value for this image.
+ */
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ Boolean.hashCode(allowSharing);
+ }
}
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceLayout.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateLayout.java
similarity index 95%
rename from
endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceLayout.java
rename to
endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateLayout.java
index 884e620780..744c9d84df 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceLayout.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/BandAggregateLayout.java
@@ -34,13 +34,12 @@ import org.apache.sis.coverage.grid.DisjointExtentException;
import org.apache.sis.coverage.privy.ImageLayout;
import org.apache.sis.coverage.privy.ImageUtilities;
import org.apache.sis.coverage.privy.ColorModelFactory;
-import org.apache.sis.coverage.privy.MultiSourceArgument;
+import org.apache.sis.coverage.privy.BandAggregateArgument;
import org.apache.sis.coverage.privy.CommonDomainFinder;
/**
- * Computes the bounds of a destination image which will combine many source
images.
- * A combination may be an aggregation or an overlay of bands, depending on
the image class.
+ * Computes the bounds of a destination image which will combine the bands of
many source images.
* All images are assumed to use the same pixel coordinate space:
(<var>x</var>, <var>y</var>)
* expressed in pixel coordinates should map to the same geospatial location
in all images.
*
@@ -52,7 +51,7 @@ import org.apache.sis.coverage.privy.CommonDomainFinder;
* @see ImageCombiner
* @see BandAggregateImage
*/
-final class MultiSourceLayout extends ImageLayout {
+final class BandAggregateLayout extends ImageLayout {
/**
* The source images. This is a copy of the user-specified array,
* except that images associated to an empty set of bands are discarded.
@@ -66,7 +65,7 @@ final class MultiSourceLayout extends ImageLayout {
final RenderedImage[] filteredSources;
/**
- * Ordered (not necessarily sorted) indices of bands to select in each
source image.
+ * Indices of bands to select in each source image, in the order of target
image bands.
* The length of this array is always equal to the length of the {@link
#sources} array.
* A {@code null} element means that all bands of the corresponding image
should be used.
* All non-null elements are non-empty and without duplicated values.
@@ -75,6 +74,7 @@ final class MultiSourceLayout extends ImageLayout {
/**
* Final band select operation to apply on the aggregated result.
+ * This is needed if the final band order implies interleaving bands of
different images.
*/
final int[] bandSelect;
@@ -112,7 +112,7 @@ final class MultiSourceLayout extends ImageLayout {
private final boolean exactTileSize;
/**
- * Computes the layout of an image combining all the specified source
images.
+ * Computes the layout of an image combining the bands of all the
specified source images.
* The optional {@code bandsPerSource} argument specifies the bands to
select in each source images.
* That array can be {@code null} for selecting all bands in all source
images,
* or may contain {@code null} elements for selecting all bands of the
corresponding image.
@@ -128,8 +128,8 @@ final class MultiSourceLayout extends ImageLayout {
* or if some band indices are duplicated or outside their range
of validity.
*/
@Workaround(library="JDK", version="1.8")
- static MultiSourceLayout create(RenderedImage[] sources, int[][]
bandsPerSource, boolean allowSharing) {
- final var aggregate = new MultiSourceArgument<RenderedImage>(sources,
bandsPerSource);
+ static BandAggregateLayout create(RenderedImage[] sources, int[][]
bandsPerSource, boolean allowSharing) {
+ final var aggregate = new
BandAggregateArgument<RenderedImage>(sources, bandsPerSource);
aggregate.unwrap(BandAggregateImage::unwrap);
aggregate.validate(ImageUtilities::getNumBands);
@@ -151,7 +151,7 @@ final class MultiSourceLayout extends ImageLayout {
*/
final SampleModel sm = source.getSampleModel();
if (allowSharing && (allowSharing = (sm instanceof
ComponentSampleModel))) {
- final ComponentSampleModel csm = (ComponentSampleModel) sm;
+ final var csm = (ComponentSampleModel) sm;
if (allowSharing = (csm.getPixelStride() == 1)) {
allowSharing &= scanlineStride == (scanlineStride =
csm.getScanlineStride());
allowSharing &= tileWidth == (tileWidth =
source.getTileWidth());
@@ -211,7 +211,7 @@ final class MultiSourceLayout extends ImageLayout {
final var preferredTileSize = new Dimension((int) cx, (int) cy);
final boolean exactTileSize = ((cx | cy) >>> Integer.SIZE) == 0;
allowSharing &= exactTileSize;
- return new MultiSourceLayout(sources, bandsPerSource, bandSelect,
domain, preferredTileSize, exactTileSize,
+ return new BandAggregateLayout(sources, bandsPerSource, bandSelect,
domain, preferredTileSize, exactTileSize,
chooseMinTile(tileGridXOffset, domain.x,
preferredTileSize.width),
chooseMinTile(tileGridYOffset, domain.y,
preferredTileSize.height),
commonDataType, aggregate.numBands(), allowSharing ?
scanlineStride : 0);
@@ -229,7 +229,7 @@ final class MultiSourceLayout extends ImageLayout {
* @param scanlineStride common scanline stride if data buffers will
be shared, or 0 if no sharing.
* @param numBands number of bands of the image to create.
*/
- private MultiSourceLayout(final RenderedImage[] sources, final int[][]
bandsPerSource, final int[] bandSelect,
+ private BandAggregateLayout(final RenderedImage[] sources, final int[][]
bandsPerSource, final int[] bandSelect,
final Rectangle domain, final Dimension preferredTileSize, final
boolean exactTileSize,
final int minTileX, final int minTileY, final int commonDataType,
final int numBands,
final int scanlineStride)
diff --git
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceImage.java
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceImage.java
index 2bf062c5d0..1cb416dd13 100644
---
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceImage.java
+++
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/image/MultiSourceImage.java
@@ -70,7 +70,7 @@ abstract class MultiSourceImage extends WritableComputedImage
{
* @param colorizer provider of color model to use for this image, or
{@code null} for automatic.
* @param parallel whether parallel computation is allowed.
*/
- MultiSourceImage(final MultiSourceLayout layout, final Colorizer
colorizer, final boolean parallel) {
+ MultiSourceImage(final BandAggregateLayout layout, final Colorizer
colorizer, final boolean parallel) {
super(layout.sampleModel, layout.filteredSources);
final Rectangle r = layout.domain;
minX = r.x;
diff --git
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/aggregate/BandAggregateGridResource.java
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/aggregate/BandAggregateGridResource.java
index 7839cb582d..420e57e20c 100644
---
a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/aggregate/BandAggregateGridResource.java
+++
b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/aggregate/BandAggregateGridResource.java
@@ -26,7 +26,7 @@ import org.apache.sis.coverage.grid.GridCoverage;
import org.apache.sis.coverage.grid.GridGeometry;
import org.apache.sis.coverage.grid.GridCoverageProcessor;
import org.apache.sis.coverage.grid.IllegalGridGeometryException;
-import org.apache.sis.coverage.privy.MultiSourceArgument;
+import org.apache.sis.coverage.privy.BandAggregateArgument;
import org.apache.sis.coverage.privy.RangeArgument;
import org.apache.sis.storage.Resource;
import org.apache.sis.storage.GridCoverageResource;
@@ -127,7 +127,7 @@ final class BandAggregateGridResource extends
AbstractGridCoverageResource imple
* @throws IllegalArgumentException if some band indices are duplicated or
outside their range of validity.
*/
private BandAggregateGridResource(final StoreListeners parentListeners,
- final
MultiSourceArgument<GridCoverageResource> aggregate,
+ final
BandAggregateArgument<GridCoverageResource> aggregate,
final GridCoverageProcessor processor)
{
super(parentListeners, false);
@@ -208,11 +208,11 @@ final class BandAggregateGridResource extends
AbstractGridCoverageResource imple
}
}
/*
- * If the same source appears two or more times consecutively,
`MultiSourceArgument` will merge them
+ * If the same source appears two or more times consecutively,
`BandAggregateArgument` will merge them
* in a single reference to that source. Consequently the arrays of
sources may become shorter.
*/
try {
- final var aggregate = new
MultiSourceArgument<GridCoverageResource>(sources, bandsPerSource);
+ final var aggregate = new
BandAggregateArgument<GridCoverageResource>(sources, bandsPerSource);
aggregate.unwrap(BandAggregateGridResource::unwrap);
aggregate.completeAndValidate(BandAggregateGridResource::range);
aggregate.mergeConsecutiveSources();
@@ -256,7 +256,7 @@ final class BandAggregateGridResource extends
AbstractGridCoverageResource imple
*
* @param unwrapper a handler where to supply the result of an aggregate
decomposition.
*/
- private static void unwrap(final
MultiSourceArgument<GridCoverageResource>.Unwrapper unwrapper) {
+ private static void unwrap(final
BandAggregateArgument<GridCoverageResource>.Unwrapper unwrapper) {
if (unwrapper.source instanceof BandAggregateGridResource) {
final var aggregate = (BandAggregateGridResource) unwrapper.source;
unwrapper.applySubset(aggregate.sources, aggregate.bandsPerSource,
BandAggregateGridResource::range);