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 c0ea93a7411b9bd2f9f6d88c930f68914cad863b
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Mon Sep 30 18:18:35 2024 +0200

    Fix a spurious "no data" which was not supposed to be there after 
conversion to NaN.
    This spurious "no data" blocked the viewing of GeoTIFF with floating point 
numbers.
---
 .../main/org/apache/sis/coverage/privy/ColorModelBuilder.java  |  8 +++++---
 .../org/apache/sis/storage/geotiff/ImageFileDirectory.java     | 10 +++++++---
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
index cc67e17afa..bede3afd18 100644
--- 
a/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
+++ 
b/endorsed/src/org.apache.sis.feature/main/org/apache/sis/coverage/privy/ColorModelBuilder.java
@@ -545,8 +545,8 @@ reuse:  if (source != null) {
         int deferred = 0;                                   // Number of 
entries deferred to next loop.
         int count    = entries.length;                      // Total number of 
valid entries.
         NumberRange<?> themes = null;                       // The range of 
values in a thematic map.
-        final Map<NumberRange<Integer>,ColorsForRange> mapper = new 
HashMap<>();
-        final SampleDimension.Builder builder = new SampleDimension.Builder();
+        final var mapper  = new HashMap<NumberRange<Integer>, 
ColorsForRange>();
+        final var builder = new SampleDimension.Builder();
         /*
          * We will use the byte values range [0 … 255] with 0 reserved in 
priority for the most transparent pixels.
          * The first loop below processes NaN values, which are usually the 
ones associated to transparent pixels.
@@ -573,7 +573,9 @@ reuse:  if (source != null) {
                         builder.mapQualitative(entry.name(), targetRange, 
(float) value);
                     } else {
                         if (value == entry.sampleRange.getMaxDouble()) {
-                            sourceRange = NumberRange.create(value - 0.5, 
true, value + 0.5, false);
+                            sourceRange = NumberRange.create(
+                                    Math.min(value - 0.5, 
Math.nextDown(value)), true,
+                                    Math.max(value + 0.5, Math.nextUp(value)), 
false);
                         }
                         builder.addQuantitative(entry.name(), targetRange, 
sourceRange);
                         themes = (themes != null) ? 
themes.unionAny(sourceRange) : sourceRange;
diff --git 
a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
 
b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
index e115ebe374..887ce92d68 100644
--- 
a/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
+++ 
b/endorsed/src/org.apache.sis.storage.geotiff/main/org/apache/sis/storage/geotiff/ImageFileDirectory.java
@@ -1548,10 +1548,14 @@ final class ImageFileDirectory extends DataCube {
     public List<SampleDimension> getSampleDimensions() throws 
DataStoreContentException {
         synchronized (getSynchronizationLock()) {
             if (sampleDimensions == null) {
-                final Number fill = getFillValue(true);
+                /*
+                 * For floating point type, 
`DataSubset.createWritableRaster(…)` has already replaced
+                 * fill value by NaN. Therefore, it shall not appear anymore 
in the `SampleDimension`.
+                 */
+                final Number fill = (sampleFormat != FLOAT) ? 
getFillValue(true) : null;
                 final DataType dataType = getDataType();
-                final SampleDimension[] dimensions = new 
SampleDimension[samplesPerPixel];
-                final SampleDimension.Builder builder = new 
SampleDimension.Builder();
+                final var dimensions = new SampleDimension[samplesPerPixel];
+                final var builder = new SampleDimension.Builder();
                 final boolean isIndexValid = !isReducedResolution();
                 for (int band = 0; band < dimensions.length; band++) {
                     short nameKey = 0;

Reply via email to