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);

Reply via email to