sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] branch geoapi-4.0 updated: More tests about the inferrence of band names from a color model.
Date Sat, 21 Dec 2019 11:46:26 GMT
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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new a57da1e  More tests about the inferrence of band names from a color model.
a57da1e is described below

commit a57da1ec4494c3eddf0cae68a46fd5db81dde768
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Sat Dec 21 12:45:36 2019 +0100

    More tests about the inferrence of band names from a color model.
---
 .../sis/internal/coverage/ImageUtilities.java      |  15 ++-
 .../sis/internal/coverage/ImageUtilitiesTest.java  | 109 +++++++++++++++------
 .../org/apache/sis/util/resources/Vocabulary.java  |   5 +
 .../sis/util/resources/Vocabulary.properties       |   1 +
 .../sis/util/resources/Vocabulary_fr.properties    |   1 +
 5 files changed, 102 insertions(+), 29 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/ImageUtilities.java
b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/ImageUtilities.java
index 2dcab5a..efc1498 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/ImageUtilities.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/ImageUtilities.java
@@ -20,6 +20,7 @@ import java.util.Arrays;
 import java.awt.Rectangle;
 import java.awt.color.ColorSpace;
 import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
 import java.awt.image.PackedColorModel;
 import java.awt.image.RenderedImage;
 import java.awt.image.Raster;
@@ -78,7 +79,19 @@ public final class ImageUtilities {
         }
         final short[] keys = new short[n];
         final ColorModel cm = image.getColorModel();
-        if (cm != null) {
+        if (cm instanceof IndexColorModel) {
+            /*
+             * IndexColorModel normally uses exactly one band. But SIS has a custom subtype
which
+             * allows to use an arbitrary band for displaying purpose and ignore all other
bands.
+             */
+            int visibleBand = 0;
+            if (cm instanceof MultiBandsIndexColorModel) {
+                visibleBand = ((MultiBandsIndexColorModel) cm).visibleBand;
+            }
+            if (visibleBand < n) {
+                keys[visibleBand] = Vocabulary.Keys.ColorIndex;
+            }
+        } else if (cm != null) {
             final ColorSpace cs = cm.getColorSpace();
             if (cs != null) {
                 /*
diff --git a/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/ImageUtilitiesTest.java
b/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/ImageUtilitiesTest.java
index ba21f6c..1abd0fd 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/ImageUtilitiesTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/internal/coverage/ImageUtilitiesTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.internal.coverage;
 
+import java.awt.image.ColorModel;
 import java.awt.image.BufferedImage;
 import java.awt.image.RenderedImage;
 import org.apache.sis.util.resources.Vocabulary;
@@ -35,43 +36,95 @@ import static org.junit.Assert.*;
  */
 public final strictfp class ImageUtilitiesTest extends TestCase {
     /**
-     * Tests {@link ImageUtilities#bandNames(RenderedImage)}.
+     * Verifies that {@link ImageUtilities#bandNames(RenderedImage)} returns expected band
names.
+     *
+     * @param  nde    expected number of data elements. This number categorizes the tests
in this class.
+     * @param  type   one of the {@link BufferedImage} {@code TYPE_*} constants.
+     * @param  names  vocabulary keys of expected names.
+     */
+    private static void assertBandNamesEqual(final int nde, final int type, final short...
names) {
+        final BufferedImage image = new BufferedImage(1, 1, type);
+        assertEquals("numDataElements", nde, image.getSampleModel().getNumDataElements());
+        assertArrayEquals("bandNames", names, ImageUtilities.bandNames(image));
+        /*
+         * The following is more for testing our understanding of the way BufferedImage works.
+         * We want to verify that no matter which BufferedImage.TYPE_* constant we used,
values
+         * managed by the sample model are in RGBA order.
+         */
+        image.getRaster().setPixel(0, 0, new int[] {10, 20, 30, 40});       // Always RGBA
order for this test.
+        final Object data = image.getRaster().getDataElements(0, 0, null);
+        final ColorModel cm = image.getColorModel();
+        for (final short k : names) {
+            final int expected, actual;
+            switch (k) {
+                case Vocabulary.Keys.Gray:         continue;
+                case Vocabulary.Keys.Red:          expected = 10; actual = cm.getRed  (data);
break;
+                case Vocabulary.Keys.Green:        expected = 20; actual = cm.getGreen(data);
break;
+                case Vocabulary.Keys.Blue:         expected = 30; actual = cm.getBlue (data);
break;
+                case Vocabulary.Keys.Transparency: expected = 40; actual = cm.getAlpha(data);
break;
+                case Vocabulary.Keys.ColorIndex:   continue;
+                default: throw new AssertionError(k);
+            }
+            assertEquals(expected, actual);
+        }
+    }
+
+    /**
+     * Tests {@link ImageUtilities#bandNames(RenderedImage)} with {@link BufferedImage} instances
+     * created from the {@code BufferedImage.TYPE_*} constants.
      */
     @Test
-    public void testBandNames() {
-        RenderedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
-        assertArrayEquals(new short[] {
-            Vocabulary.Keys.Red,
-            Vocabulary.Keys.Green,
-            Vocabulary.Keys.Blue,
-            Vocabulary.Keys.Transparency
-        }, ImageUtilities.bandNames(image));
+    public void testBandNameOfBufferedImages() {
         /*
-         * Same as above, but without alpha channel.
+         * Images having a single data element.
          */
-        image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
-        assertArrayEquals(new short[] {
-            Vocabulary.Keys.Red,
-            Vocabulary.Keys.Green,
-            Vocabulary.Keys.Blue
-        }, ImageUtilities.bandNames(image));
+        assertBandNamesEqual(1, BufferedImage.TYPE_BYTE_GRAY,    Vocabulary.Keys.Gray);
+        assertBandNamesEqual(1, BufferedImage.TYPE_USHORT_GRAY,  Vocabulary.Keys.Gray);
+        assertBandNamesEqual(1, BufferedImage.TYPE_BYTE_BINARY,  Vocabulary.Keys.ColorIndex);
+        assertBandNamesEqual(1, BufferedImage.TYPE_BYTE_INDEXED, Vocabulary.Keys.ColorIndex);
         /*
-         * Same as above but in sample values packed in reverse order. Note that while values
+         * Image having a pixel packed in a single data element. The red color uses high
+         * order bits (00FF0000 mask) and the blue color uses low order bits (000000FF).
+         */
+        assertBandNamesEqual(1, BufferedImage.TYPE_INT_RGB,
+                Vocabulary.Keys.Red,
+                Vocabulary.Keys.Green,
+                Vocabulary.Keys.Blue);
+        /*
+         * Same as above, but with alpha channel. The alpha value uses highest order bits
+         * (FF000000) mask but despite that fact, that value is ordered last by SampleModel.
+         */
+        assertBandNamesEqual(1, BufferedImage.TYPE_INT_ARGB,
+                Vocabulary.Keys.Red,
+                Vocabulary.Keys.Green,
+                Vocabulary.Keys.Blue,
+                Vocabulary.Keys.Transparency);
+        /*
+         * Same as above but with sample values packed in reverse order. Note that while
values
          * are packed in BGR order, the sample model is still providing the values in RGB
order.
          * For that reason, the band order below is the same than in above test.
          */
-        image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_BGR);
-        assertArrayEquals(new short[] {
-            Vocabulary.Keys.Red,
-            Vocabulary.Keys.Green,
-            Vocabulary.Keys.Blue
-        }, ImageUtilities.bandNames(image));
+        assertBandNamesEqual(1, BufferedImage.TYPE_INT_BGR,
+                Vocabulary.Keys.Red,
+                Vocabulary.Keys.Green,
+                Vocabulary.Keys.Blue);
+        /*
+         * Image having pixel stored in many data elements. BufferedImage still use a single
bank,
+         * but values are stored in 3 consecutive bytes with blue first, then green, then
red.
+         * Despite this storage order, SampleModel exposes those data in red, green, blue
order.
+         */
+        assertBandNamesEqual(3, BufferedImage.TYPE_3BYTE_BGR,
+                Vocabulary.Keys.Red,
+                Vocabulary.Keys.Green,
+                Vocabulary.Keys.Blue);
         /*
-         * One-banded image.
+         * Add an alpha channel, which appears first in sequence of bytes. Despite this internal
+         * order, SampleModel still exposes the alpha channel as the last sample value.
          */
-        image = new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY);
-        assertArrayEquals(new short[] {
-            Vocabulary.Keys.Gray
-        }, ImageUtilities.bandNames(image));
+        assertBandNamesEqual(4, BufferedImage.TYPE_4BYTE_ABGR,
+                Vocabulary.Keys.Red,
+                Vocabulary.Keys.Green,
+                Vocabulary.Keys.Blue,
+                Vocabulary.Keys.Transparency);
     }
 }
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java
b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java
index cf576a6..214f330 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.java
@@ -172,6 +172,11 @@ public final class Vocabulary extends IndexedResourceBundle {
         public static final short Code_1 = 21;
 
         /**
+         * Color index
+         */
+        public static final short ColorIndex = 184;
+
+        /**
          * Commands
          */
         public static final short Commands = 22;
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties
b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties
index 89741cf..3f8be4d 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary.properties
@@ -37,6 +37,7 @@ Characteristics         = Characteristics
 Classpath               = Classpath
 Code                    = Code
 Code_1                  = {0} code
+ColorIndex              = Color index
 Commands                = Commands
 ConstantPressureSurface = Constant pressure surface
 Container               = Container
diff --git a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties
b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties
index e9e6323..44a736f 100644
--- a/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties
+++ b/core/sis-utility/src/main/java/org/apache/sis/util/resources/Vocabulary_fr.properties
@@ -44,6 +44,7 @@ Characteristics         = Caract\u00e9ristiques
 Classpath               = Chemin de classes
 Code                    = Code
 Code_1                  = Code {0}
+ColorIndex              = Indice de couleur
 Commands                = Commandes
 ConstantPressureSurface = Surface \u00e0 pression constante
 Container               = Conteneur


Mime
View raw message