swingx-master/swingx-graphics/src/test/java/org/jdesktop/swingx/graphics/BlendCompositeTest.java
package org.jdesktop.swingx.graphics;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.jdesktop.swingx.util.GraphicsUtilities.createCompatibleImage;
import static org.jdesktop.swingx.util.GraphicsUtilities.getPixels;
import static org.jdesktop.swingx.util.GraphicsUtilities.loadCompatibleImage;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeThat;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.DirectColorModel;

import org.jdesktop.swingx.util.GraphicsUtilities;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * This unit test performs blend operations on known image inputs and compares the results to
 * expected image output. All expected images have been visually verified prior to inclusion in this
 * test.
 * 
 * @author kschaefer
 */
@SuppressWarnings("nls")
public class BlendCompositeTest {
    private static BufferedImage VERTICAL_IMAGE;
    private static BufferedImage HORIZONTAL_IMAGE;
    
    @BeforeClass
    public static void initialize() throws Exception {
        VERTICAL_IMAGE = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("vertical.gif"));
        HORIZONTAL_IMAGE = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("horizontal.gif"));
        
        assertThat(VERTICAL_IMAGE.getWidth(), is(HORIZONTAL_IMAGE.getWidth()));
        assertThat(VERTICAL_IMAGE.getHeight(), is(HORIZONTAL_IMAGE.getHeight()));
        
        assumeThat(VERTICAL_IMAGE.getColorModel(), is(instanceOf(DirectColorModel.class)));
        assumeThat(HORIZONTAL_IMAGE.getColorModel(), is(instanceOf(DirectColorModel.class)));
    }
    
    private BufferedImage actual;
    private BufferedImage expected;
    
    @Before
    public void setUp() {
        actual = createCompatibleImage(VERTICAL_IMAGE);
    }
    
    private void blend(BufferedImage src, BlendComposite composite, BufferedImage dst) {
        Graphics2D g2 = actual.createGraphics();
        
        try {
            g2.setComposite(AlphaComposite.Clear);
            g2.fillRect(0, 0, actual.getWidth(), actual.getHeight());
            
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
            g2.setComposite(AlphaComposite.Src);
            g2.drawImage(src, 0, 0, null);
            g2.setComposite(composite);
            g2.drawImage(dst, 0, 0, null);
        } finally {
            g2.dispose();
        }
    }
    
    @Test
    public void testDarkenHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("darken.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Darken, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testDarkenVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("darken.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Darken, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testMultiplyHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("multiply.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Multiply, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testMultiplyVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("multiply.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Multiply, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testColorBurnHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-burn-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.ColorBurn, HORIZONTAL_IMAGE);

        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testColorBurnVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-burn-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.ColorBurn, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testInverseColorBurnHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-burn-voh.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.InverseColorBurn, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testInverseColorBurnVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-burn-hov.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.InverseColorBurn, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftBurnHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-burn-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.SoftBurn, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftBurnVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-burn-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.SoftBurn, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSubtractHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("subtract.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Subtract, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSubtractVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("subtract.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Subtract, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testLightenHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("lighten.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Lighten, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testLightenVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("lighten.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Lighten, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testScreenHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("screen.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Screen, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testScreenVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("screen.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Screen, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testColorDodgeHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-dodge-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.ColorDodge, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testColorDodgeVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-dodge-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.ColorDodge, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testInverseColorDodgeHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-dodge-voh.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.InverseColorDodge, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testInverseColorDodgeVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("color-dodge-hov.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.InverseColorDodge, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftDodgeHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-burn-voh.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.SoftDodge, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftDodgeVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-burn-hov.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.SoftDodge, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testAddHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("add.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Add, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testAddVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("add.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Add, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testOverlayHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("overlay-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Overlay, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testOverlayVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("overlay-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Overlay, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftLightHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-light-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.SoftLight, HORIZONTAL_IMAGE);

        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testSoftLightVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("soft-light-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.SoftLight, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testHardLightHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("overlay-voh.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.HardLight, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testHardLightVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("overlay-hov.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.HardLight, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testVividLightHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("vivid-light-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.VividLight, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testVividLightVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("vivid-light-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.VividLight, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testLinearLightHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("linear-light-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.LinearLight, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testLinearLightVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("linear-light-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.LinearLight, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testPinLightHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("pin-light-hov.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.PinLight, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testPinLightVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("pin-light-voh.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.PinLight, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testHardMixHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("hard-mix.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.HardMix, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testHardMixVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("hard-mix.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.HardMix, VERTICAL_IMAGE);

        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testDifferenceHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("difference.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Difference, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testDifferenceVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("difference.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Difference, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testExclusionHorizontalOverVertical() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("exclusion.gif"));
        blend(VERTICAL_IMAGE, BlendComposite.Exclusion, HORIZONTAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testExclusionVerticalOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("exclusion.gif"));
        blend(HORIZONTAL_IMAGE, BlendComposite.Exclusion, VERTICAL_IMAGE);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testRedOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("red-over-horizontal.gif"));
        
        BufferedImage red = GraphicsUtilities.createCompatibleImage(VERTICAL_IMAGE);
        Graphics2D g = red.createGraphics();
        
        try {
            g.setColor(Color.RED);
            g.fillRect(0, 0, red.getWidth(), red.getHeight());
        } finally {
            g.dispose();
        }
        
        blend(HORIZONTAL_IMAGE, BlendComposite.Red, red);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testGreenOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("green-over-horizontal.gif"));
        
        BufferedImage green = GraphicsUtilities.createCompatibleImage(VERTICAL_IMAGE);
        Graphics2D g = green.createGraphics();
        
        try {
            g.setColor(Color.GREEN);
            g.fillRect(0, 0, green.getWidth(), green.getHeight());
        } finally {
            g.dispose();
        }
        
        blend(HORIZONTAL_IMAGE, BlendComposite.Green, green);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
    
    @Test
    public void testBlueOverHorizontal() throws Exception {
        expected = loadCompatibleImage(BlendCompositeTest.class.getResourceAsStream("blue-over-horizontal.gif"));
        
        BufferedImage blue = GraphicsUtilities.createCompatibleImage(VERTICAL_IMAGE);
        Graphics2D g = blue.createGraphics();
        
        try {
            g.setColor(Color.BLUE);
            g.fillRect(0, 0, blue.getWidth(), blue.getHeight());
        } finally {
            g.dispose();
        }
        
        blend(HORIZONTAL_IMAGE, BlendComposite.Blue, blue);
        
        assertArrayEquals(getPixels(expected, 0, 0, expected.getWidth(), expected.getHeight(), null),
                getPixels(actual, 0, 0, actual.getWidth(), actual.getHeight(), null));
    }
}
