/*
 * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @key headful
 * @bug     7124347
 * @summary Verifies that rendering with XOR composite, and arbitraty
 *          custom composite doesn not cause internal errors.
 *
 * @run     main/othervm -Dsun.java2d.opengl=True CustomCompositeTest
 */

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.ImageCapabilities;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBufferInt;
import java.awt.image.Raster;
import java.awt.image.SinglePixelPackedSampleModel;
import java.awt.image.VolatileImage;
import java.awt.image.WritableRaster;
import java.util.concurrent.CountDownLatch;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class CustomCompositeTest {

    private static JFrame frame;
    private static CountDownLatch paintLatch;
    private static Throwable paintError;

    public static void main(String[] args) {

        paintLatch = new CountDownLatch(1);
        paintError = null;

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                initGUI();
            }
        });

        try {
            paintLatch.await();
        } catch (InterruptedException e) {
        };
        System.out.println("Paint is done!");
        if (paintError != null) {
            frame.dispose();
            throw new RuntimeException("Test FAILED.", paintError);
        }

        System.out.println("Phase 1: PASSED.");

        // now resise the frame in order to cause re-paint with accelerated
        // source images.
        paintError = null;
        paintLatch = new CountDownLatch(1);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Dimension size = frame.getSize();
                size.width += 50;
                size.height += 50;

                frame.setSize(size);
            }
        });

        try {
            paintLatch.await();
        } catch (InterruptedException e) {
        };
        if (paintError != null) {
            frame.dispose();
            throw new RuntimeException("Resize test FAILED.", paintError);
        }
        frame.dispose();
        System.out.println("Phase 2: PASSED.");

        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsConfiguration cfg = env.getDefaultScreenDevice().getDefaultConfiguration();
        // test rendering to accelerated volatile image
        testVolatileImage(cfg, true);
        System.out.println("Phase 3: PASSED.");

        // test rendering to unaccelerated volatile image
        testVolatileImage(cfg, false);
        System.out.println("Phase 4: PASSED.");
    }

    private static void testVolatileImage(GraphicsConfiguration cfg,
            boolean accelerated)
    {
        VolatileImage dst = null;
        try {
            dst = cfg.createCompatibleVolatileImage(640, 480,
                new ImageCapabilities(accelerated));
        } catch (AWTException e) {
            System.out.println("Unable to create volatile image, skip the test.");
            return;
        }
        renderToVolatileImage(dst);
    }

    private static void renderToVolatileImage(VolatileImage dst) {
        Graphics2D g = dst.createGraphics();
        do {
            System.out.println("Render to volatile image..");
            try {
                MyComp.renderTest(g, dst.getHeight(), dst.getHeight());
            } catch (Throwable e) {
                throw new RuntimeException("Test FAILED.", e);
            }
        } while (dst.contentsLost());
        System.out.println("Done.");
    }

    private static void initGUI() {
        frame = new JFrame("Silly composite");
        frame.getContentPane().add(new MyComp());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    private static class MyComp extends JComponent {

        private static BufferedImage theImage;

        public MyComp() {
        }

        private static BufferedImage getTestImage() {
            if (theImage == null) {
                theImage = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
                Graphics2D g2d = theImage.createGraphics();
                g2d.setColor(Color.red);
                g2d.fillRect(0, 0, 256, 256);

                g2d.setPaint(new GradientPaint(0, 0, Color.red, 256, 256, Color.blue));
                g2d.fillRect(0, 100, 256, 256);
                g2d.dispose();
            }
            return theImage;
        }

        public Dimension getPreferredSize() {
            return new Dimension(640, 375);
        }

        public void paintComponent(Graphics g) {


            Graphics2D g2d = (Graphics2D) g;
            try {
                renderTest(g2d, getWidth(), getHeight());
            } catch (Throwable e) {
                paintError = e;
            }
            if (paintLatch != null) {
                paintLatch.countDown();
            }
        }

        public static void renderTest(Graphics2D g2d, int w, int h) {
            g2d.setColor(Color.yellow);
            g2d.fillRect(0, 0, w, h);

            BufferedImage image = getTestImage();
            // draw original image
            g2d.drawRenderedImage(image, null);

            // draw image with custom composite
            g2d.translate(175, 25);
            Composite currentComposite = g2d.getComposite();
            g2d.setComposite(new TestComposite());
            g2d.drawRenderedImage(image, null);
            g2d.setComposite(currentComposite);

            // draw image with XOR
            g2d.translate(175, 25);
            g2d.setXORMode(Color.red);
            g2d.drawRenderedImage(image, null);


            System.out.println("Painting is done...");
        }
    }

    // A silly custom Composite to demonstrate the problem - just inverts the RGB
    private static class TestComposite implements Composite {

        public CompositeContext createContext(ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints) {
            return new TestCompositeContext();
        }
    }

    private static class TestCompositeContext implements CompositeContext {

        public void dispose() {
        }

        public void compose(Raster src, Raster dstIn, WritableRaster dstOut) {
            int w = src.getWidth();
            int h = src.getHeight();

            DataBufferInt srcDB = (DataBufferInt) src.getDataBuffer();
            DataBufferInt dstOutDB = (DataBufferInt) dstOut.getDataBuffer();
            int srcRGB[] = srcDB.getBankData()[0];
            int dstOutRGB[] = dstOutDB.getBankData()[0];
            int srcOffset = srcDB.getOffset();
            int dstOutOffset = dstOutDB.getOffset();
            int srcScanStride = ((SinglePixelPackedSampleModel) src.getSampleModel()).getScanlineStride();
            int dstOutScanStride = ((SinglePixelPackedSampleModel) dstOut.getSampleModel()).getScanlineStride();
            int srcAdjust = srcScanStride - w;
            int dstOutAdjust = dstOutScanStride - w;

            int si = srcOffset;
            int doi = dstOutOffset;

            for (int i = 0; i < h; i++) {
                for (int j = 0; j < w; j++) {
                    dstOutRGB[doi] = srcRGB[si] ^ 0x00ffffff;
                    si++;
                    doi++;
                }

                si += srcAdjust;
                doi += dstOutAdjust;
            }
        }
    }
}
