/* * Copyright (c) 2004, 2017, 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 * @bug 4994702 * @key headful * @summary verifies that no regression were introduced with the fix for this * bug */ import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.ImageCapabilities; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.VolatileImage; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.FileImageInputStream; import javax.imageio.stream.ImageOutputStream; public class JPEGsNotAcceleratedTest { public static final int testRGB = Color.red.getRGB(); public static final int TEST_W = 100; public static final int TEST_H = 100; public static final Rectangle roi = new Rectangle(TEST_W/4, TEST_H/4, TEST_W/2, TEST_H/2); static Frame f; static boolean showRes = false; static int testsFinished = 0; static int testsStarted = 0; static boolean lowCompression = false; static boolean failed = false; public JPEGsNotAcceleratedTest(String name) { BufferedImage bi = readTestImage(name, null, null); runTestOnImage("no dest image, no region of interest", bi, null); BufferedImage destBI = getDestImage(); bi = readTestImage(name, destBI, null); runTestOnImage("w/ dest image, no region of interest", bi, null); // steal the raster, see if the destination image // gets accelerated destBI = getDestImage(); DataBuffer db = ((WritableRaster)destBI.getRaster()).getDataBuffer(); bi = readTestImage(name, destBI, null); runTestOnImage("w/ dest image (with stolen raster),"+ " no region of interest", bi, null); bi = readTestImage(name, null, roi); runTestOnImage("no dest image, region of interest", bi, roi); destBI = getDestImage(); bi = readTestImage(name, destBI, roi); runTestOnImage("w/ dest image, region of interest", bi, roi); // accelerate the destination image first, then load // an image into it. Check that the accelerated copy gets // updated destBI = getDestImage(); accelerateImage(destBI); bi = readTestImage(name, destBI, roi); runTestOnImage("w/ accelerated dest image,"+ " region of interest", bi, roi); synchronized (JPEGsNotAcceleratedTest.class) { testsFinished++; JPEGsNotAcceleratedTest.class.notify(); } } public static BufferedImage readTestImage(String fileName, BufferedImage dest, Rectangle srcROI) { BufferedImage bi = null; try { FileImageInputStream is = new FileImageInputStream(new File(fileName)); ImageReader reader = (ImageReader)ImageIO.getImageReaders(is).next(); ImageReadParam param = reader.getDefaultReadParam(); if (dest != null) { param.setDestination(dest); } if (srcROI != null) { param.setSourceRegion(srcROI); } reader.setInput(is); bi = reader.read(0, param); } catch (IOException e) { System.err.println("Error " + e + " when reading file: " + fileName); throw new RuntimeException(e); } return bi; } public static void writeTestImage(String fileName) { BufferedImage bi = new BufferedImage(TEST_W, TEST_H, BufferedImage.TYPE_INT_RGB); Graphics g = bi.getGraphics(); g.setColor(new Color(testRGB)); g.fillRect(0, 0, TEST_W, TEST_H); try { System.err.printf("Writing %s\n", fileName); if (lowCompression) { ImageWriter iw = (ImageWriter)ImageIO.getImageWritersBySuffix("jpeg").next(); if(iw == null) { throw new RuntimeException("No available image writer for " + "jpeg " + " Test failed."); } File file = new File(fileName); ImageOutputStream ios = ImageIO.createImageOutputStream(file); iw.setOutput(ios); ImageWriteParam param = iw.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(1); IIOImage iioImg = new IIOImage(bi, null, null); iw.write(null, iioImg, param); } else { ImageIO.write(bi, "jpeg", new File(fileName)); } } catch (IOException e) { System.err.println("Error " + e + " when writing file: " + fileName); throw new RuntimeException(e); } } public VolatileImage accelerateImage(BufferedImage bi) { VolatileImage testVI = f.createVolatileImage(TEST_W, TEST_H); do { if (testVI.validate(f.getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE) { testVI = f.createVolatileImage(TEST_W, TEST_H); } Graphics2D g = testVI.createGraphics(); g.setComposite(AlphaComposite.Src); g.setColor(Color.green); g.fillRect(0, 0, TEST_W, TEST_H); g.drawImage(bi, 0, 0, null); g.drawImage(bi, 0, 0, null); g.drawImage(bi, 0, 0, null); g.dispose(); } while (testVI.contentsLost()); return testVI; } public BufferedImage getDestImage() { BufferedImage destBI = new BufferedImage(TEST_W, TEST_H, BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D)destBI.getGraphics(); g.setComposite(AlphaComposite.Src); g.setColor(Color.blue); g.fillRect(0, 0, TEST_W, TEST_H); return destBI; } public void runTestOnImage(String desc, BufferedImage bi, Rectangle srcROI) { if (srcROI == null) { srcROI = new Rectangle(0, 0, TEST_W, TEST_H); } VolatileImage testVI = accelerateImage(bi); ImageCapabilities ic = bi.getCapabilities(f.getGraphicsConfiguration()); boolean accelerated = ic.isAccelerated(); System.err.println("Testing: " + desc + " -- bi.isAccelerated(): " + accelerated ); BufferedImage snapshot = testVI.getSnapshot(); if (showRes) { showRes(desc, snapshot); } for (int y = 0; y < srcROI.height; y++) { for (int x = 0; x < srcROI.width; x++) { int destRGB = snapshot.getRGB(x, y); if (destRGB != testRGB && destRGB != 0xfffe0000) { failed = true; System.err.printf("Test failed at %dx%d pixel=%x\n", x, y, snapshot.getRGB(x, y)); if (!showRes) { showRes(desc, snapshot); } break; } } } } static int startX = 64, startY = 0; static int frameX = startX, frameY = startY; private static void showRes(String desc, final BufferedImage src) { final int w = src.getWidth(); final int h = src.getHeight(); Frame f = new Frame(desc+": dbl-click to exit"); Component c; f.add(c = new Component() { public Dimension getPreferredSize() { return new Dimension(w,h); } public void paint(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); g.drawImage(src, 0,0, null); } }); c.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { System.exit(0); } } }); f.pack(); synchronized (JPEGsNotAcceleratedTest.class) { f.setLocation(frameX, frameY); frameX += f.getWidth(); if ((frameX + f.getWidth()) > f.getGraphicsConfiguration().getBounds().width) { frameY += TEST_H; if ((frameY + f.getHeight()) > f.getGraphicsConfiguration().getBounds().height) { startY += 30; startX += 30; frameY = startY; } frameX = startX; } }; f.setVisible(true); } public static void usage() { System.err.println("Usage: java Test [file name] [-write][-show][-low]"); System.exit(0); } public static void main(String[] args) { System.setProperty("sun.java2d.pmoffscreen", "true"); System.setProperty("sun.java2d.ddforcevram", "true"); String name = "red.jpg"; f = new Frame(); f.pack(); if (f.getGraphicsConfiguration().getColorModel().getPixelSize() < 16) { System.err.println("8-bit display mode detected, dithering issues possible, "+ "considering test passed."); f.dispose(); return; } for (String arg : args) { if (arg.equals("-write")) { writeTestImage(name); System.exit(0); } else if (arg.equals("-show")) { showRes = true; } else if (arg.equals("-low")) { lowCompression = true; name ="red_low.jpg"; System.err.println("Using low jpeg compression"); } else if (arg.equals("-help")) { usage(); } else { final String filename = arg; testsStarted++; new Thread(new Runnable() { public void run() { new JPEGsNotAcceleratedTest(filename); } }).start(); } } if (testsStarted == 0) { writeTestImage(name); testsStarted++; new JPEGsNotAcceleratedTest(name); } synchronized (JPEGsNotAcceleratedTest.class) { while (testsFinished < testsStarted) { try { JPEGsNotAcceleratedTest.class.wait(100); } catch (InterruptedException e) { failed = true; break; } } } f.dispose(); if (failed) { throw new RuntimeException("Test failed"); } System.err.println("Passed."); } }