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

commit cbe04576b25e4661315792597191813bfd7e5f83
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Wed Dec 29 05:38:38 2021 +0100

    Add a safety check for tile size before to reuse a tile from the cache.
---
 .../sis/internal/storage/TiledGridCoverage.java    | 27 ++++++++++++++--------
 .../sis/internal/storage/TiledGridResource.java    |  1 +
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
index 78490e0..05a4ed6 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridCoverage.java
@@ -179,9 +179,9 @@ public abstract class TiledGridCoverage extends 
GridCoverage {
     private final Map<TiledGridResource.CacheKey, Raster> rasters;
 
     /**
-     * The sample model for all rasters. The size of this sample model is the 
values of two elements
-     * of {@link #tileSize} divided by subsampling and clipped to the domain. 
If user requested to
-     * read only a subset of the bands, then this sample model is already the 
subset.
+     * The sample model for all rasters. The width and height of this sample 
model are the two first elements
+     * of {@link #tileSize} divided by subsampling and clipped to the domain. 
If user requested to read only
+     * a subset of the bands, then this sample model is already the subset.
      */
     protected final SampleModel model;
 
@@ -600,7 +600,7 @@ public abstract class TiledGridCoverage extends 
GridCoverage {
          * @see Snapshot#cache(Raster)
          */
         public Raster getCachedTile() {
-            Raster tile = rasters.get(createCacheKey(indexInTileVector));
+            final Raster tile = rasters.get(createCacheKey(indexInTileVector));
             if (tile != null) {
                 /*
                  * Found a tile, but the sample model may be different because 
band order may be different.
@@ -608,13 +608,22 @@ public abstract class TiledGridCoverage extends 
GridCoverage {
                  */
                 final int x = getTileOrigin(X_DIMENSION);
                 final int y = getTileOrigin(Y_DIMENSION);
-                if (!model.equals(tile.getSampleModel())) {
-                    tile = Raster.createRaster(model, tile.getDataBuffer(), 
new Point(x, y));
-                } else if (tile.getMinX() != x || tile.getMinY() != y) {
-                    tile = tile.createTranslatedChild(x, y);
+                if (model.equals(tile.getSampleModel())) {
+                    if (tile.getMinX() == x && tile.getMinY() == y) {
+                        return tile;
+                    }
+                    return tile.createTranslatedChild(x, y);
+                }
+                if (tile.getWidth() == model.getWidth() && tile.getHeight() == 
model.getHeight()) {
+                    /*
+                     * It is okay to have a different number of bands if the 
sample model is
+                     * a view created by 
`SampleModel.createSubsetSampleModel(int[] bands)`.
+                     * Bands can also be in a different order and still share 
the same buffer.
+                     */
+                    return Raster.createRaster(model, tile.getDataBuffer(), 
new Point(x, y));
                 }
             }
-            return tile;
+            return null;
         }
 
         /**
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
index e4fc973..9f8b5cd 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/TiledGridResource.java
@@ -393,6 +393,7 @@ public abstract class TiledGridResource extends 
AbstractGridResource {
                 bands = Arrays.asList(rangeIndices.select(bands));
                 loadAllBands = !getDissociableBands();
                 if (!loadAllBands) {
+                    sharedCache = false;
                     includedBands = new int[rangeIndices.getNumBands()];
                     for (int i=0; i<includedBands.length; i++) {
                         includedBands[i] = rangeIndices.getSourceIndex(i);

Reply via email to