/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2007-2012, Open Source Geospatial Foundation (OSGeo) * (C) 2009-2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.coverage.processing; import java.awt.Color; import org.apache.sis.measure.Units; import org.geotoolkit.coverage.Category; import org.geotoolkit.coverage.GridSampleDimension; import org.apache.sis.measure.MeasurementRange; import org.apache.sis.measure.NumberRange; import org.junit.*; import static org.junit.Assert.*; /** * Tests {@link ColorMap}. * * @author Martin Desruisseaux (IRD) * @version 3.00 * * @since 2.4 */ public final strictfp class ColorMapTest extends org.geotoolkit.test.TestBase { /** * The grid sample dimension to be used for testing purpose. */ private GridSampleDimension band; /** * The color map to test. Will initially match the grid sample dimension. */ private ColorMap map; /** * A initially empty ARGB array with expected length. */ private int[] ARGB; /** * Creates a sample dimension and a color map for testing purpose. */ @Before public void setUp() { band = new GridSampleDimension("Temperature", new Category[] { new Category("Sea", Color.BLUE, 2), new Category("Lands", Color.GREEN, 1), new Category("Clouds", Color.GRAY, 0), new Category("Temperature", new Color[] {Color.CYAN, Color.YELLOW}, 3, 256, 0.1, 0), }, Units.CELSIUS); map = new ColorMap(); map.setColor ("Sea", Color.BLUE); map.setColor ("Lands", Color.GREEN); map.setColor ("Clouds", Color.GRAY); map.setColors("Temperature", new Color[] {Color.CYAN, Color.YELLOW}); ARGB = new int[256]; } /** * Operations that should not modify the sample dimension. */ @Test public void testIdentity() { assertEquals(map, map); assertSame("No category changes expected.", band, map.recolor(band, null)); map.setColor("Sea", null); assertSame("No category changes expected.", band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals(Color.GREEN .getRGB(), ARGB[ 1]); assertEquals("No change expected", 0, ARGB[ 2]); assertEquals(Color.CYAN .getRGB(), ARGB[ 3]); assertEquals(Color.YELLOW.getRGB(), ARGB[255]); // Some interpolated values assertEquals("ff01fffe", Integer.toHexString(ARGB[ 4])); assertEquals("ff02fffd", Integer.toHexString(ARGB[ 5])); assertEquals("fffdff02", Integer.toHexString(ARGB[253])); assertEquals("fffeff01", Integer.toHexString(ARGB[254])); } /** * Simple color changes. */ @Test public void testSimpleChange() { map.setColor("Lands", Color.RED); map.setColors("Temperature", new Color[] {Color.WHITE, Color.YELLOW, Color.ORANGE}); assertNotSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals(Color.RED .getRGB(), ARGB[ 1]); assertEquals(Color.BLUE .getRGB(), ARGB[ 2]); assertEquals(Color.WHITE .getRGB(), ARGB[ 3]); assertEquals(Color.ORANGE.getRGB(), ARGB[255]); ensureFilledARGB(); } /** * Applies a relative range. */ @Test public void testRelativeRange() { map.setRelativeRange("Temperature", NumberRange.create(20, true, 70, true)); assertSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals(Color.GREEN .getRGB(), ARGB[ 1]); assertEquals(Color.BLUE .getRGB(), ARGB[ 2]); assertEquals(Color.CYAN .getRGB(), ARGB[ 3]); assertEquals(Color.CYAN .getRGB(), ARGB[ 4]); assertEquals(Color.CYAN .getRGB(), ARGB[ 5]); assertEquals(Color.YELLOW.getRGB(), ARGB[253]); assertEquals(Color.YELLOW.getRGB(), ARGB[254]); assertEquals(Color.YELLOW.getRGB(), ARGB[255]); ensureFilledARGB(); } /** * Applies a geophysics range. */ @Test public void testGeophysicsRange() { map.setGeophysicsRange("Temperature", MeasurementRange.create(5, true, 20, true, Units.CELSIUS)); assertSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals(Color.GREEN .getRGB(), ARGB[ 1]); assertEquals(Color.BLUE .getRGB(), ARGB[ 2]); assertEquals(Color.CYAN .getRGB(), ARGB[ 3]); assertEquals(Color.CYAN .getRGB(), ARGB[ 4]); assertEquals(Color.CYAN .getRGB(), ARGB[ 5]); assertEquals(Color.YELLOW.getRGB(), ARGB[253]); assertEquals(Color.YELLOW.getRGB(), ARGB[254]); assertEquals(Color.YELLOW.getRGB(), ARGB[255]); ensureFilledARGB(); } /** * Recolor the quantitative range, without prior knowledge of its name. */ @Test public void testAnyQuantitativeCategory() { map.setColor ("Sea", null); map.setColor ("Lands", null); map.setColors("Temperature", null); assertSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY.getRGB(), ARGB[ 0]); assertEquals("No change expected", 0, ARGB[ 1]); assertEquals("No change expected", 0, ARGB[ 2]); assertEquals("No change expected", 0, ARGB[ 3]); assertEquals("No change expected", 0, ARGB[255]); map.setColors(ColorMap.ANY_QUANTITATIVE_CATEGORY, new Color[] {Color.WHITE, Color.ORANGE}); assertNotSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals("No change expected", 0, ARGB[ 1]); assertEquals("No change expected", 0, ARGB[ 2]); assertEquals(Color.WHITE .getRGB(), ARGB[ 3]); assertEquals(Color.ORANGE.getRGB(), ARGB[255]); map.setResetUnspecifiedColors(true); assertNotSame(band, map.recolor(band, ARGB)); assertEquals(Color.GRAY .getRGB(), ARGB[ 0]); assertEquals(Color.GREEN .getRGB(), ARGB[ 1]); assertEquals(Color.BLUE .getRGB(), ARGB[ 2]); assertEquals(Color.WHITE .getRGB(), ARGB[ 3]); assertEquals(Color.ORANGE.getRGB(), ARGB[255]); } /** * Ensures that the {@link #ARGB} array contains no uninitialized element. */ private void ensureFilledARGB() { for (int i=0; i<ARGB.length; i++) { assertFalse(String.valueOf(i), ARGB[i] == 0); } } }