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 64a4335844d7e012c620703a734e03280d70c13b Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Sat Nov 6 13:59:42 2021 +0100 Fix the range of signed data type in GeoTIFF images. --- .../java/org/apache/sis/internal/coverage/j2d/ColorModelFactory.java | 3 ++- .../src/main/java/org/apache/sis/internal/coverage/j2d/Colorizer.java | 2 +- .../main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/ColorModelFactory.java b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/ColorModelFactory.java index 615fd71..52f426f 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/ColorModelFactory.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/ColorModelFactory.java @@ -420,9 +420,10 @@ public final class ColorModelFactory { final int visibleBand, final double minimum, final double maximum) { final ColorModel cm; - if (numComponents == 1 && isStandardRange(dataType, minimum, maximum)) { + if (numComponents == 1 && minimum > -1 && isStandardRange(dataType, minimum, maximum)) { final ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); cm = new ComponentColorModel(cs, false, true, Transparency.OPAQUE, dataType); + // Note: `ComponentColorModel` does not work well with negative values. } else { final ScaledColorSpace cs = new ScaledColorSpace(numComponents, visibleBand, minimum, maximum); cm = new ScaledColorModel(cs, dataType); diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/Colorizer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/Colorizer.java index b11dc09..1b3a83f 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/Colorizer.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/Colorizer.java @@ -468,7 +468,7 @@ reuse: if (source != null) { // Following loop will usually be executed only once. for (final NumberRange<?> sourceRange : defaultRange.subtractAny(themes)) { span += sourceRange.getSpan(); - final ColorsForRange[] tmp = new ColorsForRange[++count]; + final ColorsForRange[] tmp = Arrays.copyOf(entries, ++count); System.arraycopy(entries, deferred, tmp, ++deferred, count - deferred); tmp[deferred-1] = new ColorsForRange(null, sourceRange, new Color[] {Color.BLACK, Color.WHITE}); entries = tmp; diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java index 4430848..4b55c6b 100644 --- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java +++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/ImageFileDirectory.java @@ -1583,6 +1583,10 @@ final class ImageFileDirectory extends DataCube { } double min = 0; double max = Numerics.bitmask(bitsPerSample); // Exclusive. + if (sampleFormat != UNSIGNED) { + max /= 2; + min = -max; + } if (minValues != null) min = Math.max(min, minValues.doubleValue(visibleBand)); if (maxValues != null) max = Math.min(max, maxValues.doubleValue(visibleBand) + 1); colorModel = ColorModelFactory.createColorScale(dataType, samplesPerPixel, visibleBand, min, max, colors);