source: josm/trunk/test/unit/org/openstreetmap/josm/gui/layer/imagery/ColorfulImageProcessorTest.java@ 13397

Last change on this file since 13397 was 13397, checked in by michael2402, 6 years ago

Fix #15878: Implement colorfullness filter for indexed images.

  • Property svn:eol-style set to native
File size: 6.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.imagery;
3
4import static org.junit.Assert.assertEquals;
5import static org.junit.Assert.assertTrue;
6
7import java.awt.Color;
8import java.awt.Graphics2D;
9import java.awt.image.BufferedImage;
10import java.awt.image.DataBuffer;
11import java.awt.image.IndexColorModel;
12
13import org.junit.Rule;
14import org.junit.Test;
15import org.openstreetmap.josm.testutils.JOSMTestRules;
16
17import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
18
19/**
20 * Tests for the {@link ColorfulImageProcessor} class.
21 * @author Michael Zangl
22 */
23public class ColorfulImageProcessorTest {
24
25 private static final int TEST_IMAGE_SIZE = 5;
26
27 private static final int[] PALETTE = {
28 Color.BLACK.getRGB(),
29 Color.WHITE.getRGB(),
30 Color.GRAY.getRGB(),
31 Color.GREEN.getRGB(),
32 Color.RED.getRGB(),
33 Color.BLUE.getRGB(),
34 0xff908050,
35 0xff908070,
36 0xff908070,
37 0xff908070,
38 0xfff02080,
39 };
40
41 private static final IndexColorModel COLOR_MODEL = new IndexColorModel(8, PALETTE.length, PALETTE, 0, true, 255, DataBuffer.TYPE_BYTE);
42
43 /**
44 * No special rules
45 */
46 @Rule
47 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
48 public JOSMTestRules test = new JOSMTestRules();
49
50 /**
51 * Test {@link ColorfulImageProcessor#setColorfulness(double)} and {@link ColorfulImageProcessor#getColorfulness()}
52 */
53 @Test
54 public void testSetGet() {
55 ColorfulImageProcessor processor = new ColorfulImageProcessor();
56
57 assertEquals(1, processor.getColorfulness(), 0.001);
58
59 processor.setColorfulness(2);
60 assertEquals(2, processor.getColorfulness(), 0.001);
61
62 processor.setColorfulness(0);
63 assertEquals(0, processor.getColorfulness(), 0.001);
64
65 processor.setColorfulness(0.78);
66 assertEquals(0.78, processor.getColorfulness(), 0.001);
67
68 processor.setColorfulness(1);
69 assertEquals(1, processor.getColorfulness(), 0.001);
70
71 processor.setColorfulness(-1);
72 assertEquals(0, processor.getColorfulness(), 0.001);
73
74 processor.setColorfulness(5);
75 assertEquals(5, processor.getColorfulness(), 0.001);
76 }
77
78 /**
79 *
80 */
81 @Test
82 public void testProcessing() {
83 for (ConversionData data : new ConversionData[] {
84 new ConversionData(Color.BLACK, 1.5, Color.BLACK),
85 new ConversionData(Color.WHITE, 0.5, Color.WHITE),
86 new ConversionData(Color.GRAY, 0, Color.GRAY),
87 new ConversionData(Color.GREEN, 1, Color.GREEN),
88 new ConversionData(Color.RED, 1, Color.RED),
89 new ConversionData(Color.BLUE, 1, Color.BLUE),
90 new ConversionData(0x908050, 0, 0x808080),
91 new ConversionData(0x908070, 1, 0x908070),
92 new ConversionData(0x908070, 2, 0x9c7c5c),
93 new ConversionData(0x908070, 2, 0x9c7c5c),
94 new ConversionData(0xf02080, 2, 0xff00ac),
95 }) {
96 for (int type : new int[] {
97 BufferedImage.TYPE_3BYTE_BGR,
98 BufferedImage.TYPE_4BYTE_ABGR,
99 BufferedImage.TYPE_4BYTE_ABGR_PRE,
100 BufferedImage.TYPE_BYTE_INDEXED }) {
101 assertTrue(runProcessing(data, type));
102 }
103 }
104 }
105
106 private boolean runProcessing(ConversionData data, int type) {
107 BufferedImage image = createImage(data.getOldColor(), type);
108
109 ColorfulImageProcessor processor = new ColorfulImageProcessor();
110 processor.setColorfulness(data.getFactor());
111 image = processor.process(image);
112
113 for (int x = 0; x < TEST_IMAGE_SIZE; x++) {
114 for (int y = 0; y < TEST_IMAGE_SIZE; y++) {
115 Color color = new Color(image.getRGB(x, y));
116 assertEquals(data + ":" + type + ": red", data.getExpectedColor().getRed(), color.getRed(), 1.05);
117 assertEquals(data + ":" + type + ": green", data.getExpectedColor().getGreen(), color.getGreen(), 1.05);
118 assertEquals(data + ":" + type + ": blue", data.getExpectedColor().getBlue(), color.getBlue(), 1.05);
119 }
120 }
121 return true;
122 }
123
124 private BufferedImage createImage(Color color, int type) {
125 BufferedImage image = type == BufferedImage.TYPE_BYTE_INDEXED
126 ? new BufferedImage(TEST_IMAGE_SIZE, TEST_IMAGE_SIZE, type, COLOR_MODEL)
127 : new BufferedImage(TEST_IMAGE_SIZE, TEST_IMAGE_SIZE, type);
128 Graphics2D graphics = image.createGraphics();
129 graphics.setColor(color);
130 graphics.fillRect(0, 0, TEST_IMAGE_SIZE, TEST_IMAGE_SIZE);
131 assertEquals(color.getRGB(), image.getRGB(1, 1));
132 return image;
133 }
134
135 private static class ConversionData {
136 private final Color oldColor;
137 private final double factor;
138 private final Color expectedColor;
139
140 ConversionData(Color oldColor, double factor, Color expectedColor) {
141 super();
142 this.oldColor = oldColor;
143 this.factor = factor;
144 this.expectedColor = expectedColor;
145 }
146
147 ConversionData(int oldColor, double factor, int expectedColor) {
148 this(new Color(oldColor), factor, new Color(expectedColor));
149 }
150
151 Color getOldColor() {
152 return oldColor;
153 }
154
155 double getFactor() {
156 return factor;
157 }
158
159 Color getExpectedColor() {
160 return expectedColor;
161 }
162
163 @Override
164 public String toString() {
165 return "ConversionData [oldColor=" + oldColor + ", factor=" + factor + "]";
166 }
167 }
168
169 /**
170 * Test {@link ColorfulImageProcessor#toString()}
171 */
172 @Test
173 public void testToString() {
174 ColorfulImageProcessor processor = new ColorfulImageProcessor();
175 assertEquals("ColorfulImageProcessor [colorfulness=1.0]", processor.toString());
176 }
177}
Note: See TracBrowser for help on using the repository browser.