This is an automated email from the ASF dual-hosted git repository.

jsorel 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 1590b5a41b Hide aggregated resources in GIMI store, fix incorrect tile 
raster offset
1590b5a41b is described below

commit 1590b5a41b680be8b007d237432384501c3385d4
Author: jsorel <johann.so...@geomatys.com>
AuthorDate: Wed Oct 2 11:18:07 2024 +0200

    Hide aggregated resources in GIMI store, fix incorrect tile raster offset
---
 .../main/module-info.java                          |  2 ++
 .../org/apache/sis/storage/gimi/GimiProvider.java  | 12 ++++++++-
 .../org/apache/sis/storage/gimi/GimiStore.java     | 22 +++++++++++++++-
 .../apache/sis/storage/gimi/ResourcePyramid.java   |  2 +-
 .../apache/sis/storage/gimi/ResourceUnknown.java   | 15 +++++++++++
 .../storage/gimi/internal/MatrixGridRessource.java |  6 +++--
 .../apache/sis/storage/gimi/isobmff/gimi/GIMI.java |  6 ++++-
 .../gimi/TiledImageConfigurationBox.java}          | 29 ++++++++--------------
 .../gimi/isobmff/iso23001_17/ISO23001_17.java      |  2 +-
 .../gimi/isobmff/iso23001_17/TAIClockInfo.java     |  1 +
 10 files changed, 72 insertions(+), 25 deletions(-)

diff --git a/incubator/src/org.apache.sis.storage.gimi/main/module-info.java 
b/incubator/src/org.apache.sis.storage.gimi/main/module-info.java
index c3b6f462db..453daa9cd2 100644
--- a/incubator/src/org.apache.sis.storage.gimi/main/module-info.java
+++ b/incubator/src/org.apache.sis.storage.gimi/main/module-info.java
@@ -27,6 +27,8 @@ module org.apache.sis.storage.gimi {
 
     exports org.apache.sis.storage.gimi.isobmff;
 
+    uses org.apache.sis.storage.gimi.isobmff.BoxRegistry;
+
     provides org.apache.sis.storage.DataStoreProvider
             with org.apache.sis.storage.gimi.GimiProvider;
 
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java
index 239e08d1e5..a8e26482d1 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiProvider.java
@@ -21,24 +21,34 @@ import java.nio.file.Path;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.apache.sis.parameter.ParameterBuilder;
+import org.apache.sis.storage.Aggregate;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.DataStoreProvider;
 import org.apache.sis.storage.ProbeResult;
 import org.apache.sis.storage.StorageConnector;
 import static org.apache.sis.storage.DataStoreProvider.LOCATION;
+import org.apache.sis.storage.GridCoverageResource;
+import org.apache.sis.storage.base.Capability;
+import org.apache.sis.storage.base.StoreMetadata;
+import org.apache.sis.storage.tiling.TiledResource;
 
 
 /**
  *
  * @author Johann Sorel (Geomatys)
  */
+@StoreMetadata(formatName    = GimiProvider.NAME,
+               capabilities  = {Capability.READ},
+               fileSuffixes  = {"heij", "heif", "heic", "avif"},
+               resourceTypes = {Aggregate.class, GridCoverageResource.class, 
TiledResource.class},
+               yieldPriority = false)
 public final class GimiProvider extends DataStoreProvider {
 
     /**
      * Format name.
      */
-    public static final String NAME = "gimi";
+    public static final String NAME = "GIMI";
 
     /**
      * Format mime type.
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java
index 5490c19cb4..f383d49897 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/GimiStore.java
@@ -21,9 +21,11 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import org.opengis.metadata.Metadata;
 import org.opengis.parameter.ParameterValueGroup;
 import org.apache.sis.io.stream.ChannelDataInput;
@@ -41,6 +43,7 @@ import 
org.apache.sis.storage.gimi.isobmff.iso14496_12.GroupList;
 import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemInfo;
 import org.apache.sis.storage.gimi.isobmff.iso14496_12.ItemInfoEntry;
 import org.apache.sis.storage.gimi.isobmff.iso14496_12.Meta;
+import org.apache.sis.storage.gimi.isobmff.iso14496_12.SingleItemTypeReference;
 import org.apache.sis.storage.gimi.isobmff.iso23008_12.ImagePyramidEntityGroup;
 import org.apache.sis.util.iso.Names;
 
@@ -127,8 +130,11 @@ public final class GimiStore extends DataStore implements 
Aggregate {
 
         components = new ArrayList<>();
         componentIndex = new HashMap<>();
-        try {
 
+        //collect elements which should not be displayed since they are part 
of a larger image (grid or pyramid)
+        final Set<Integer> includedInParents = new HashSet<>();
+
+        try {
             final Box root = getRootBox();
             final Meta meta = (Meta) root.getChild(Meta.FCC, null);
 
@@ -146,6 +152,12 @@ public final class GimiStore extends DataStore implements 
Aggregate {
                 }  else if (ResourceGrid.TYPE.equals(iie.itemType)) {
                     //tiled image
                     resource = new ResourceGrid(item);
+
+                    for (SingleItemTypeReference refs : item.references) {
+                        for (int i :refs.toItemId) {
+                            includedInParents.add(i);
+                        }
+                    }
                 } else {
                     //TODO
                     resource = new ResourceUnknown(this, item);
@@ -167,6 +179,9 @@ public final class GimiStore extends DataStore implements 
Aggregate {
                         //force initialize now, pyramids may amend existing 
grids
                         pyramid.getGridGeometry();
 
+                        for (int i :img.entitiesId) {
+                            includedInParents.add(i);
+                        }
                     }
                 }
             }
@@ -175,6 +190,11 @@ public final class GimiStore extends DataStore implements 
Aggregate {
             ex.printStackTrace();
         }
 
+        //remove resources which are in a parent
+        for (Integer itemId : includedInParents) {
+            components.remove(componentIndex.get(itemId));
+        }
+
         return components;
     }
 
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java
index ffef8b7d67..6838a5464d 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourcePyramid.java
@@ -75,7 +75,7 @@ final class ResourcePyramid extends 
AbstractGridCoverageResource implements Tile
 
     @Override
     public Optional<GenericName> getIdentifier() throws DataStoreException {
-        return Optional.of(Names.createLocalName(null, null, "" + 
group.groupId));
+        return Optional.of(Names.createLocalName(null, null, 
"ImagePyramidEntityGroup " + group.groupId));
     }
 
     private synchronized void initialize() throws DataStoreException {
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
index ca31067625..635b8673e6 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
@@ -16,10 +16,13 @@
  */
 package org.apache.sis.storage.gimi;
 
+import java.util.Optional;
 import org.apache.sis.storage.AbstractResource;
 import org.apache.sis.storage.DataStore;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.base.StoreResource;
+import org.apache.sis.util.iso.Names;
+import org.opengis.util.GenericName;
 
 
 /**
@@ -31,11 +34,23 @@ final class ResourceUnknown extends AbstractResource 
implements StoreResource {
 
     private final GimiStore store;
     private final Item item;
+    private final GenericName identifier;
 
     public ResourceUnknown(GimiStore store, Item item) throws 
DataStoreException {
         super(store);
         this.store = store;
         this.item = item;
+
+        if (item.entry.itemName == null || item.entry.itemName.isBlank()) {
+            this.identifier = Names.createLocalName(null, null, 
Integer.toString(item.entry.itemId));
+        } else {
+            this.identifier = Names.createLocalName(null, null, 
item.entry.itemName);
+        }
+    }
+
+    @Override
+    public Optional<GenericName> getIdentifier() throws DataStoreException {
+        return Optional.of(identifier);
     }
 
     @Override
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java
index 6cbf6d0d35..9fe163fe80 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/internal/MatrixGridRessource.java
@@ -123,8 +123,10 @@ public abstract class MatrixGridRessource extends 
TiledGridResource {
                     } else {
                         long[] tileCoord = 
iterator.getTileCoordinatesInResource();
                         final RenderedImage image = getTileImage(tileCoord);
-                        result[iterator.getTileIndexInResultArray()] =
-                                (image instanceof BufferedImage) ? 
((BufferedImage)image).getRaster() : image.getData();
+                        var s = new Snapshot(iterator);
+                        Raster raster = (image instanceof BufferedImage) ? 
((BufferedImage)image).getRaster() : image.getData();
+                        raster = raster.createTranslatedChild(s.originX, 
s.originY);
+                        result[iterator.getTileIndexInResultArray()] = raster;
                     }
                 } while (iterator.next());
             }
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java
index cf5010cd64..b258d5616a 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/GIMI.java
@@ -28,7 +28,9 @@ import org.apache.sis.storage.gimi.isobmff.BoxRegistry;
  */
 public final class GIMI implements BoxRegistry {
 
-    private static final Set<String> BOXES = Set.of();
+    private static final Set<String> BOXES = Set.of(
+            TiledImageConfigurationBox.FCC
+        );
     private static final Set<String> EXTENSIONS = Set.of(
             ModelTiePointProperty.UUID,
             ModelTransformationProperty.UUID,
@@ -52,6 +54,8 @@ public final class GIMI implements BoxRegistry {
 
     @Override
     public Box create(String fourCC) throws IllegalNameException {
+        //TODO replace by String switch when SIS minimum java is updated
+        if (TiledImageConfigurationBox.FCC.equals(fourCC)) return new 
TiledImageConfigurationBox();
         throw new IllegalNameException();
     }
 
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java
similarity index 58%
copy from 
incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
copy to 
incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java
index ca31067625..922213d3db 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/ResourceUnknown.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/gimi/TiledImageConfigurationBox.java
@@ -14,33 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.storage.gimi;
-
-import org.apache.sis.storage.AbstractResource;
-import org.apache.sis.storage.DataStore;
-import org.apache.sis.storage.DataStoreException;
-import org.apache.sis.storage.base.StoreResource;
+package org.apache.sis.storage.gimi.isobmff.gimi;
 
+import java.io.IOException;
+import org.apache.sis.storage.gimi.isobmff.FullBox;
+import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader;
 
 /**
- * Unknown item type.
+ * Definition from OGC TestBed 20 : tild.pdf
+ *
+ * CAUTION : this is not final and may be changed in HEIF specification.
  *
  * @author Johann Sorel (Geomatys)
  */
-final class ResourceUnknown extends AbstractResource implements StoreResource {
+public final class TiledImageConfigurationBox extends FullBox {
 
-    private final GimiStore store;
-    private final Item item;
-
-    public ResourceUnknown(GimiStore store, Item item) throws 
DataStoreException {
-        super(store);
-        this.store = store;
-        this.item = item;
-    }
+    public static final String FCC = "tilC";
 
     @Override
-    public DataStore getOriginator() {
-        return store;
+    public void readProperties(ISOBMFFReader reader) throws IOException {
+        throw new IOException("Not supported yet");
     }
 
 }
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java
index f683ed8e04..005aa8a19f 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/ISO23001_17.java
@@ -43,7 +43,7 @@ public final class ISO23001_17 implements BoxRegistry {
             DepthMappingInformation.FCC,
             FieldInterlaceType.FCC,
             FieldInterlaceProperty.FCC,
-            TAIClockInfo.FCC,
+            //TAIClockInfo.FCC, //TODO : find box structure, it seems to have 
a variable size
             TAITimeStamp.FCC
         );
     private static final Set<String> EXTENSIONS = Set.of();
diff --git 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java
 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java
index 0458e6bbce..77878aa346 100644
--- 
a/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java
+++ 
b/incubator/src/org.apache.sis.storage.gimi/main/org/apache/sis/storage/gimi/isobmff/iso23001_17/TAIClockInfo.java
@@ -23,6 +23,7 @@ import org.apache.sis.storage.gimi.isobmff.ISOBMFFReader;
 
 /**
  * From ISO/IEC 23001-17:2024 amendment 1
+ * TODO : find box structure, it seems to have a variable size
  *
  * @author Johann Sorel (Geomatys)
  */

Reply via email to