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 9edee116e148b738097cfeecc40cff1f75982300
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Sun Nov 28 13:37:53 2021 +0100

    In `PlanarImage.verify()`, an unexpected value for "width" and "height" 
properties may be normal.
    So those "anomalies" should be reported only if everything else is okay.
---
 .../sis/gui/coverage/ImagePropertyExplorer.java    |  8 +++--
 .../org/apache/sis/internal/gui/Resources.java     |  2 +-
 .../apache/sis/internal/gui/Resources.properties   |  2 +-
 .../sis/internal/gui/Resources_fr.properties       |  2 +-
 .../apache/sis/coverage/grid/ReshapedImage.java    | 16 ++++-----
 .../java/org/apache/sis/image/PlanarImage.java     | 39 ++++++++++++++--------
 .../java/org/apache/sis/image/ResampledImage.java  | 10 +++---
 .../sis/internal/coverage/j2d/TiledImage.java      |  7 ++--
 8 files changed, 51 insertions(+), 35 deletions(-)

diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
index eb1208d..4de7c8b 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/ImagePropertyExplorer.java
@@ -630,7 +630,9 @@ public class ImagePropertyExplorer extends Widget {
 
         /**
          * Invoked when a new image is shown in this cell node. This method 
also tests image consistency.
-         * If an inconsistency is found, the line is shown in read with a 
warning message.
+         * If an inconsistency is found, the line is shown in red (except for 
"width" and "height") with
+         * a warning message. We do not use a red color for "width" and 
"height" because the mismatch may
+         * be normal.
          */
         @Override protected void updateItem(final RenderedImage image, final 
boolean empty) {
             super.updateItem(image, empty);
@@ -642,7 +644,9 @@ public class ImagePropertyExplorer extends Widget {
                     final String check = ((PlanarImage) image).verify();
                     if (check != null) {
                         text = 
Resources.format(Resources.Keys.InconsistencyIn_2, text, check);
-                        fill = Styles.ERROR_TEXT;
+                        if (!(check.equals("width") || 
check.equals("height"))) {
+                            fill = Styles.ERROR_TEXT;
+                        }
                     }
                 }
             }
diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
index e9e4b79..b693899 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.java
@@ -257,7 +257,7 @@ public final class Resources extends IndexedResourceBundle {
         public static final short ImageStart = 36;
 
         /**
-         * {0} – inconsistency in `{1}` property
+         * {0} – `{1}` has an unexpected value.
          */
         public static final short InconsistencyIn_2 = 39;
 
diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
index 5fdf198..cbaefa2 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources.properties
@@ -60,7 +60,7 @@ GeodeticDataset_1      = {0} geodetic dataset
 GeospatialFiles        = Geospatial data files
 Help                   = Help
 ImageStart             = Image start
-InconsistencyIn_2      = {0} \u2013 inconsistency in `{1}` property
+InconsistencyIn_2      = {0} \u2013 `{1}` has an unexpected value.
 IsolinesInRange        = Generate isolines at constant interval\nstarting from 
given minimum.
 LicenseAgreement       = Do you accept the license shown below?
 Loading                = Loading\u2026
diff --git 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
index c2bf0d5..06e8ac6 100644
--- 
a/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
+++ 
b/application/sis-javafx/src/main/java/org/apache/sis/internal/gui/Resources_fr.properties
@@ -65,7 +65,7 @@ GeodeticDataset_1      = Base de donn\u00e9es 
g\u00e9od\u00e9siques {0}
 GeospatialFiles        = Fichiers de donn\u00e9es g\u00e9ospatiales
 Help                   = Aide
 ImageStart             = D\u00e9but de l\u2019image
-InconsistencyIn_2      = {0} \u2013 incoh\u00e9rence dans la 
propri\u00e9t\u00e9 `{1}`
+InconsistencyIn_2      = {0} \u2013 `{1}` a une valeur inattendue.
 IsolinesInRange        = G\u00e9n\u00e8re des isolignes \u00e0 intervalle 
constant en\ncommen\u00e7ant \u00e0 la valeur minimale sp\u00e9cifi\u00e9e.
 LicenseAgreement       = Acceptez-vous la licence ci-dessous?
 Loading                = Chargement\u2026
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ReshapedImage.java
 
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ReshapedImage.java
index ca98c7f..c0efa44 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ReshapedImage.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/ReshapedImage.java
@@ -288,16 +288,16 @@ final class ReshapedImage extends PlanarImage {
 
     /**
      * Verifies whether image layout information are consistent.
+     * This method first checks the properties modified by this class.
+     * If okay, then this method completes the check with all verifications
+     * {@linkplain ComputedImage#verify() documented in parent class}
      */
     @Override
     public String verify() {
-        final String error = super.verify();
-        if (error == null) {
-            if (getMinX() != image.getMinX() + (minTileX - 
image.getMinTileX()) * getTileWidth()  + offsetX) return "minX";
-            if (getMinY() != image.getMinY() + (minTileY - 
image.getMinTileY()) * getTileHeight() + offsetY) return "minY";
-            if (getTileGridXOffset() != super.getTileGridXOffset()) return 
"tileGridXOffset";
-            if (getTileGridYOffset() != super.getTileGridYOffset()) return 
"tileGridYOffset";
-        }
-        return error;
+        if (getMinX() != image.getMinX() + (minTileX - image.getMinTileX()) * 
getTileWidth()  + offsetX) return "minX";
+        if (getMinY() != image.getMinY() + (minTileY - image.getMinTileY()) * 
getTileHeight() + offsetY) return "minY";
+        if (getTileGridXOffset() != super.getTileGridXOffset()) return 
"tileGridXOffset";
+        if (getTileGridYOffset() != super.getTileGridYOffset()) return 
"tileGridYOffset";
+        return super.verify();      // "width" and "height" properties should 
be checked last.
     }
 }
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/image/PlanarImage.java 
b/core/sis-feature/src/main/java/org/apache/sis/image/PlanarImage.java
index 56046c1..ff230d7 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/image/PlanarImage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/image/PlanarImage.java
@@ -102,7 +102,7 @@ import org.apache.sis.coverage.grid.GridGeometry;       // 
For javadoc
  *
  * @author  Johann Sorel (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.2
  * @since   1.1
  * @module
  */
@@ -517,20 +517,31 @@ public abstract class PlanarImage implements 
RenderedImage {
      *
      * <p>The default implementation may return the following identifiers, in 
that order
      * (i.e. this method returns the identifier of the first test that 
fail):</p>
-     * <ul>
-     *   <li>{@code "SampleModel"} — Sample model is incompatible with color 
model.</li>
-     *   <li>{@code "tileWidth"}   — tile width is greater than sample model 
width.</li>
-     *   <li>{@code "tileHeight"}  — tile height is greater than sample model 
height.</li>
-     *   <li>{@code "numXTiles"}   — number of tiles on the X axis is 
inconsistent with image width.</li>
-     *   <li>{@code "width"}       — image width is not an integer multiple of 
tile width.</li>
-     *   <li>{@code "numYTiles"}   — number of tiles on the Y axis is 
inconsistent with image height.</li>
-     *   <li>{@code "height"}      — image height is not an integer multiple 
of tile height.</li>
-     *   <li>{@code "tileX"}       — {@code minTileX} and/or {@code 
tileGridXOffset} is inconsistent.</li>
-     *   <li>{@code "tileY"}       — {@code minTileY} and/or {@code 
tileGridYOffset} is inconsistent.</li>
-     * </ul>
      *
-     * Subclasses may perform additional checks. For example some subclasses 
also check specifically
-     * for {@code "minX"}, {@code "minY"}, {@code "tileGridXOffset"} and 
{@code "tileGridYOffset"}.
+     * <table class="sis">
+     *   <caption>Identifiers of inconsistent values</caption>
+     *   <tr><th>Identifier</th>            <th>Meaning</th></tr>
+     *   <tr><td>{@code "SampleModel"}</td> <td>Sample model is incompatible 
with color model.</td></tr>
+     *   <tr><td>{@code "tileWidth"}</td>   <td>Tile width is greater than 
sample model width.</td></tr>
+     *   <tr><td>{@code "tileHeight"}</td>  <td>Tile height is greater than 
sample model height.</td></tr>
+     *   <tr><td>{@code "numXTiles"}</td>   <td>Number of tiles on the X axis 
is inconsistent with image width.</td></tr>
+     *   <tr><td>{@code "numYTiles"}</td>   <td>Number of tiles on the Y axis 
is inconsistent with image height.</td></tr>
+     *   <tr><td>{@code "tileX"}</td>       <td>{@code minTileX} and/or {@code 
tileGridXOffset} is inconsistent.</td></tr>
+     *   <tr><td>{@code "tileY"}</td>       <td>{@code minTileY} and/or {@code 
tileGridYOffset} is inconsistent.</td></tr>
+     *   <tr><td>{@code "width"}</td>       <td>image width is not an integer 
multiple of tile width.</td></tr>
+     *   <tr><td>{@code "height"}</td>      <td>Image height is not an integer 
multiple of tile height.</td></tr>
+     * </table>
+     *
+     * Subclasses may perform additional checks. For example some subclasses 
have specialized checks
+     * for {@code "minX"}, {@code "minY"}, {@code "tileGridXOffset"} and 
{@code "tileGridYOffset"}
+     * values before to fallback on the more generic {@code "tileX"} and 
{@code "tileY"} above checks.
+     *
+     * <h4>Ignorable inconsistency</h4>
+     * Inconsistency in {@code "width"} and {@code "height"} values may be 
acceptable
+     * if all other verifications pass (in particular the {@code "numXTiles"} 
and {@code "numYTiles"} checks).
+     * It happens when tiles in the last row or last column have some unused 
space compared to the image size.
+     * This is legal in TIFF format for example. For this reason, the {@code 
"width"} and {@code "height"}
+     * values should be checked last, after all other values have been 
verified consistent.
      *
      * @return {@code null} if image layout information are consistent,
      *         or the name of inconsistent attribute if a problem is found.
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/image/ResampledImage.java 
b/core/sis-feature/src/main/java/org/apache/sis/image/ResampledImage.java
index 54974f1..f348c61 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/image/ResampledImage.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/image/ResampledImage.java
@@ -438,19 +438,19 @@ public class ResampledImage extends ComputedImage {
     }
 
     /**
-     * Verifies whether image layout information are consistent. This method 
performs all verifications
-     * {@linkplain ComputedImage#verify() documented in parent class}, then 
verifies that source coordinates
+     * Verifies whether image layout information are consistent. This method 
verifies that source coordinates
      * required by this image (computed by converting {@linkplain #getBounds() 
this image bounds} using the
      * {@link #toSource} transform) intersects the bounds of the source image. 
If this is not the case, then
      * this method returns {@code "toSource"} for signaling that the transform 
may have a problem.
+     * Otherwise this method completes the check with all verifications
+     * {@linkplain ComputedImage#verify() documented in parent class}
      *
      * @return {@code null} if image layout information are consistent,
      *         or the name of inconsistent attribute if a problem is found.
      */
     @Override
     public String verify() {
-        String error = super.verify();
-        if (error == null && toSource instanceof MathTransform2D) try {
+        if (toSource instanceof MathTransform2D) try {
             final Rectangle bounds = getBounds();
             final Rectangle2D tb = Shapes2D.transform((MathTransform2D) 
toSource, bounds, bounds);
             if (!ImageUtilities.getBounds(getSource()).intersects(tb)) {
@@ -460,7 +460,7 @@ public class ResampledImage extends ComputedImage {
             recoverableException("verify", e);
             return "toSource";
         }
-        return error;
+        return super.verify();      // "width" and "height" properties should 
be checked last.
     }
 
     /**
diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/TiledImage.java
 
b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/TiledImage.java
index abecce8..19976bf 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/TiledImage.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/TiledImage.java
@@ -100,8 +100,9 @@ public class TiledImage extends PlanarImage {
 
     /**
      * Verifies whether image layout information and tile coordinates are 
consistent.
-     * This method verifies the size and minimum pixel coordinates of all 
tiles,
-     * in addition to the verifications documented in the super-class.
+     * This method verifies the size and minimum pixel coordinates of all 
tiles.
+     * If okay, then this method completes the check with all verifications
+     * {@linkplain ComputedImage#verify() documented in parent class}
      *
      * @return {@code null} if image layout information are consistent,
      *         or the name of inconsistent attribute if a problem is found.
@@ -122,7 +123,7 @@ public class TiledImage extends PlanarImage {
             if (tile.getMinX()   != tileWidth  * tx + minX) return 
property(tx, ty, "x");
             if (tile.getMinY()   != tileHeight * ty + minY) return 
property(tx, ty, "y");
         }
-        return super.verify();
+        return super.verify();      // "width" and "height" properties should 
be checked last.
     }
 
     /**

Reply via email to