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;