package test;

import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageReaderSpi;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class TestTIFFRendering
{
    public TestTIFFRendering()
    {
        IIORegistry theRegistry = IIORegistry.getDefaultInstance();
        theRegistry.registerApplicationClasspathSpis();

        ImageReaderSpi r1 = null;
        ImageReaderSpi r2 = null;
        ImageReaderSpi r3 = null;

        Iterator<ImageReaderSpi> it = theRegistry.getServiceProviders(ImageReaderSpi.class, false);
        while (it.hasNext()) {
            ImageReaderSpi r = it.next();
            Class c = r.getClass();
            String name = c.getName();
            if (name.contains("TIFF")) {
                System.err.println(name);
                if (name.contains("com.sun.imageio")) {
                    r1 = r;
                } else if (name.contains("com.twelvemonkeys.imageio")) {
                    if (name.contains("Big")) {
                        r3 = r;
                    } else {
                        r2 = r;
                    }
                }
            }
        }

        if (r1 != null && r2 != null && r3 != null) {
            boolean useTwelveMonkeys = false;
            if (useTwelveMonkeys) {
                theRegistry.deregisterServiceProvider(r1);
            } else {
                theRegistry.deregisterServiceProvider(r2);
                theRegistry.deregisterServiceProvider(r3);
            }
        }

        File f = new File("Pasted Graphic 2.tiff");
        try {
            Image image = ImageIO.read(f);
            TestFrame fr = new TestFrame(image);
            fr.setBounds(0, 0, 800, 800);
            fr.setVisible(true);
        } catch (IOException ex) {
            System.err.println("Unable to read image: " + ex);
        }
    }

    private class TestFrame extends JFrame
    {
        public TestFrame(Image image)
          throws HeadlessException
        {
            TestView v = new TestView(image);
            setContentPane(v);
        }
    }

    private class TestView extends JComponent
    {
        private final Image image;

        public TestView(Image image)
        {
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g)
        {
            int imageWidth = image.getWidth(null);
            int imageHeight = image.getHeight(null);
            long t1 = System.currentTimeMillis();
            g.drawImage(image, 0, 0, imageWidth, imageHeight, null);
            long t2 = System.currentTimeMillis();
            long delta = t2 - t1;
            if (delta > 10) {
                System.err.println("Image rendering: " + delta + " ms");
            }
        }
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> new TestTIFFRendering());
    }
}
