/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2015, Open Source Geospatial Foundation (OSGeo) * * 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.geotools.renderer.composite; import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.imageio.ImageIO; import org.geotools.image.test.ImageAssert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class CompositeTest { private static BufferedImage BKG; private static BufferedImage BKG2; private static BufferedImage MAP; private static BufferedImage MAP2; private String name; private Composite composite; public CompositeTest(String name, Composite composite) { this.name = name; this.composite = composite; } @BeforeClass public static void readSourceImages() throws Exception { BKG = ImageIO.read(CompositeTest.class.getResourceAsStream("test-data/bkg.png")); BKG2 = ImageIO.read(CompositeTest.class.getResourceAsStream("test-data/bkg2.png")); MAP = ImageIO.read(CompositeTest.class.getResourceAsStream("test-data/map.png")); MAP2 = ImageIO.read(CompositeTest.class.getResourceAsStream("test-data/map2.png")); } @Parameters(name = "{0}") public static Collection<Object[]> data() { List<Object[]> result = new ArrayList<>(); // compositing modes result.add(new Object[] { "copy", AlphaComposite.getInstance(AlphaComposite.SRC) }); result.add(new Object[] { "destination", AlphaComposite.getInstance(AlphaComposite.DST) }); result.add(new Object[] { "source-over", AlphaComposite.getInstance(AlphaComposite.SRC_OVER) }); result.add(new Object[] { "destination-over", AlphaComposite.getInstance(AlphaComposite.DST_OVER) }); result.add(new Object[] { "source-in", AlphaComposite.getInstance(AlphaComposite.SRC_IN) }); result.add(new Object[] { "destination-in", AlphaComposite.getInstance(AlphaComposite.DST_IN) }); result.add(new Object[] { "source-out", AlphaComposite.getInstance(AlphaComposite.SRC_OUT) }); result.add(new Object[] { "destination-out", AlphaComposite.getInstance(AlphaComposite.DST_OUT) }); result.add(new Object[] { "source-atop", AlphaComposite.getInstance(AlphaComposite.SRC_ATOP) }); result.add(new Object[] { "destination-atop", AlphaComposite.getInstance(AlphaComposite.DST_ATOP) }); result.add(new Object[] { "xor", AlphaComposite.getInstance(AlphaComposite.XOR) }); // blending modes result.add(new Object[] { "multiply", BlendComposite.MULTIPLY_COMPOSITE }); result.add(new Object[] { "screen", BlendComposite.SCREEN_COMPOSITE }); result.add(new Object[] { "overlay", BlendComposite.OVERLAY_COMPOSITE }); result.add(new Object[] { "darken", BlendComposite.DARKEN_COMPOSITE }); result.add(new Object[] { "lighten", BlendComposite.LIGHTEN_COMPOSITE }); result.add(new Object[] { "color-dodge", BlendComposite.COLOR_DODGE_COMPOSITE }); result.add(new Object[] { "color-burn", BlendComposite.COLOR_BURN_COMPOSITE }); result.add(new Object[] { "hard-light", BlendComposite.HARD_LIGHT_COMPOSITE }); result.add(new Object[] { "soft-light", BlendComposite.SOFT_LIGHT_COMPOSITE }); result.add(new Object[] { "difference", BlendComposite.DIFFERENCE_COMPOSITE }); result.add(new Object[] { "exclusion", BlendComposite.EXCLUSION_COMPOSITE }); return result; } @Test public void testCompositeInteger1() throws Exception { BufferedImage bkg = convertImage(BKG, BufferedImage.TYPE_INT_ARGB); BufferedImage map = convertImage(MAP, BufferedImage.TYPE_INT_ARGB); BufferedImage blended = blend(bkg, map); File reference = new File( "./src/test/resources/org/geotools/renderer/composite/test-data/blend1-" + name + ".png"); ImageAssert.assertEquals(reference, blended, 0); } @Test public void testCompositeByte1() throws Exception { BufferedImage bkg = convertImage(BKG, BufferedImage.TYPE_4BYTE_ABGR); BufferedImage map = convertImage(MAP, BufferedImage.TYPE_4BYTE_ABGR); BufferedImage blended = blend(bkg, map); File reference = new File( "./src/test/resources/org/geotools/renderer/composite/test-data/blend1-" + name + ".png"); ImageAssert.assertEquals(reference, blended, 0); } @Test public void testCompositeInteger2() throws Exception { BufferedImage bkg2 = convertImage(BKG2, BufferedImage.TYPE_INT_ARGB); BufferedImage map2 = convertImage(MAP2, BufferedImage.TYPE_INT_ARGB); BufferedImage blended = blend(bkg2, map2); File reference = new File( "./src/test/resources/org/geotools/renderer/composite/test-data/blend2-" + name + ".png"); ImageAssert.assertEquals(reference, blended, 0); } @Test public void testCompositeByte2() throws Exception { BufferedImage bkg2 = convertImage(BKG2, BufferedImage.TYPE_4BYTE_ABGR); BufferedImage map2 = convertImage(MAP2, BufferedImage.TYPE_4BYTE_ABGR); BufferedImage blended = blend(bkg2, map2); File reference = new File( "./src/test/resources/org/geotools/renderer/composite/test-data/blend2-" + name + ".png"); ImageAssert.assertEquals(reference, blended, 0); } private BufferedImage blend(BufferedImage src, BufferedImage dst) { BufferedImage blend = new BufferedImage(src.getWidth(), dst.getWidth(), src.getType()); Graphics2D graphics = (Graphics2D) blend.getGraphics(); graphics.drawRenderedImage(src, new AffineTransform()); graphics.setComposite(composite); graphics.drawRenderedImage(dst, new AffineTransform()); graphics.dispose(); return blend; } private BufferedImage convertImage(BufferedImage src, int imageType) { BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), imageType); Graphics2D graphics = (Graphics2D) result.getGraphics(); graphics.drawRenderedImage(src, new AffineTransform()); graphics.dispose(); return result; } }