Path: blob/master/test/jdk/javax/imageio/plugins/jpeg/JPEGsNotAcceleratedTest.java
41152 views
/*1* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 499470226* @key headful27* @summary verifies that no regression were introduced with the fix for this28* bug29*/3031import java.awt.AlphaComposite;32import java.awt.Color;33import java.awt.Component;34import java.awt.Dimension;35import java.awt.Frame;36import java.awt.Graphics;37import java.awt.Graphics2D;38import java.awt.ImageCapabilities;39import java.awt.Rectangle;40import java.awt.event.MouseAdapter;41import java.awt.event.MouseEvent;42import java.awt.image.BufferedImage;43import java.awt.image.DataBuffer;44import java.awt.image.VolatileImage;45import java.awt.image.WritableRaster;46import java.io.File;47import java.io.IOException;4849import javax.imageio.IIOImage;50import javax.imageio.ImageIO;51import javax.imageio.ImageReadParam;52import javax.imageio.ImageReader;53import javax.imageio.ImageWriteParam;54import javax.imageio.ImageWriter;55import javax.imageio.stream.FileImageInputStream;56import javax.imageio.stream.ImageOutputStream;5758public class JPEGsNotAcceleratedTest {5960public static final int testRGB = Color.red.getRGB();61public static final int TEST_W = 100;62public static final int TEST_H = 100;63public static final Rectangle roi =64new Rectangle(TEST_W/4, TEST_H/4, TEST_W/2, TEST_H/2);6566static Frame f;67static boolean showRes = false;68static int testsFinished = 0;69static int testsStarted = 0;70static boolean lowCompression = false;7172static boolean failed = false;7374public JPEGsNotAcceleratedTest(String name) {75BufferedImage bi = readTestImage(name, null, null);76runTestOnImage("no dest image, no region of interest", bi, null);7778BufferedImage destBI = getDestImage();79bi = readTestImage(name, destBI, null);80runTestOnImage("w/ dest image, no region of interest", bi, null);8182// steal the raster, see if the destination image83// gets accelerated84destBI = getDestImage();85DataBuffer db =86((WritableRaster)destBI.getRaster()).getDataBuffer();87bi = readTestImage(name, destBI, null);88runTestOnImage("w/ dest image (with stolen raster),"+89" no region of interest", bi, null);9091bi = readTestImage(name, null, roi);92runTestOnImage("no dest image, region of interest", bi, roi);9394destBI = getDestImage();95bi = readTestImage(name, destBI, roi);96runTestOnImage("w/ dest image, region of interest", bi, roi);9798// accelerate the destination image first, then load99// an image into it. Check that the accelerated copy gets100// updated101destBI = getDestImage();102accelerateImage(destBI);103bi = readTestImage(name, destBI, roi);104runTestOnImage("w/ accelerated dest image,"+105" region of interest", bi, roi);106107synchronized (JPEGsNotAcceleratedTest.class) {108testsFinished++;109JPEGsNotAcceleratedTest.class.notify();110}111112}113114public static BufferedImage readTestImage(String fileName,115BufferedImage dest,116Rectangle srcROI)117{118BufferedImage bi = null;119120try {121FileImageInputStream is =122new FileImageInputStream(new File(fileName));123ImageReader reader =124(ImageReader)ImageIO.getImageReaders(is).next();125ImageReadParam param = reader.getDefaultReadParam();126if (dest != null) {127param.setDestination(dest);128}129if (srcROI != null) {130param.setSourceRegion(srcROI);131}132reader.setInput(is);133bi = reader.read(0, param);134} catch (IOException e) {135System.err.println("Error " + e +136" when reading file: " + fileName);137throw new RuntimeException(e);138}139140return bi;141}142143public static void writeTestImage(String fileName) {144BufferedImage bi =145new BufferedImage(TEST_W, TEST_H, BufferedImage.TYPE_INT_RGB);146Graphics g = bi.getGraphics();147g.setColor(new Color(testRGB));148g.fillRect(0, 0, TEST_W, TEST_H);149try {150System.err.printf("Writing %s\n", fileName);151if (lowCompression) {152ImageWriter iw = (ImageWriter)ImageIO.getImageWritersBySuffix("jpeg").next();153if(iw == null) {154throw new RuntimeException("No available image writer for "155+ "jpeg "156+ " Test failed.");157}158159File file = new File(fileName);160ImageOutputStream ios = ImageIO.createImageOutputStream(file);161iw.setOutput(ios);162163ImageWriteParam param = iw.getDefaultWriteParam();164param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);165param.setCompressionQuality(1);166167IIOImage iioImg = new IIOImage(bi, null, null);168iw.write(null, iioImg, param);169170} else {171ImageIO.write(bi, "jpeg", new File(fileName));172}173} catch (IOException e) {174System.err.println("Error " + e +175" when writing file: " + fileName);176throw new RuntimeException(e);177}178}179180public VolatileImage accelerateImage(BufferedImage bi) {181VolatileImage testVI = f.createVolatileImage(TEST_W, TEST_H);182do {183if (testVI.validate(f.getGraphicsConfiguration()) ==184VolatileImage.IMAGE_INCOMPATIBLE)185{186testVI = f.createVolatileImage(TEST_W, TEST_H);187}188Graphics2D g = testVI.createGraphics();189g.setComposite(AlphaComposite.Src);190g.setColor(Color.green);191g.fillRect(0, 0, TEST_W, TEST_H);192193g.drawImage(bi, 0, 0, null);194g.drawImage(bi, 0, 0, null);195g.drawImage(bi, 0, 0, null);196g.dispose();197} while (testVI.contentsLost());198199return testVI;200}201202public BufferedImage getDestImage() {203BufferedImage destBI =204new BufferedImage(TEST_W, TEST_H, BufferedImage.TYPE_INT_RGB);205Graphics2D g = (Graphics2D)destBI.getGraphics();206g.setComposite(AlphaComposite.Src);207g.setColor(Color.blue);208g.fillRect(0, 0, TEST_W, TEST_H);209return destBI;210}211212public void runTestOnImage(String desc, BufferedImage bi,213Rectangle srcROI)214{215216if (srcROI == null) {217srcROI = new Rectangle(0, 0, TEST_W, TEST_H);218}219220VolatileImage testVI = accelerateImage(bi);221222ImageCapabilities ic =223bi.getCapabilities(f.getGraphicsConfiguration());224boolean accelerated = ic.isAccelerated();225226System.err.println("Testing: " + desc +227" -- bi.isAccelerated(): " + accelerated );228229BufferedImage snapshot = testVI.getSnapshot();230if (showRes) {231showRes(desc, snapshot);232}233234for (int y = 0; y < srcROI.height; y++) {235for (int x = 0; x < srcROI.width; x++) {236int destRGB = snapshot.getRGB(x, y);237if (destRGB != testRGB && destRGB != 0xfffe0000) {238failed = true;239System.err.printf("Test failed at %dx%d pixel=%x\n",240x, y, snapshot.getRGB(x, y));241if (!showRes) {242showRes(desc, snapshot);243}244break;245}246}247}248}249250static int startX = 64, startY = 0;251static int frameX = startX, frameY = startY;252private static void showRes(String desc, final BufferedImage src) {253final int w = src.getWidth();254final int h = src.getHeight();255256Frame f = new Frame(desc+": dbl-click to exit");257Component c;258f.add(c = new Component() {259public Dimension getPreferredSize() {260return new Dimension(w,h);261}262263public void paint(Graphics g) {264g.clearRect(0, 0, getWidth(), getHeight());265g.drawImage(src, 0,0, null);266}267});268c.addMouseListener(new MouseAdapter() {269public void mouseClicked(MouseEvent e) {270if (e.getClickCount() > 1) {271System.exit(0);272}273}274});275f.pack();276synchronized (JPEGsNotAcceleratedTest.class) {277f.setLocation(frameX, frameY);278frameX += f.getWidth();279if ((frameX + f.getWidth()) >280f.getGraphicsConfiguration().getBounds().width)281{282frameY += TEST_H;283if ((frameY + f.getHeight()) >284f.getGraphicsConfiguration().getBounds().height)285{286startY += 30;287startX += 30;288frameY = startY;289}290frameX = startX;291}292};293f.setVisible(true);294}295296public static void usage() {297System.err.println("Usage: java Test [file name] [-write][-show][-low]");298System.exit(0);299}300301public static void main(String[] args) {302System.setProperty("sun.java2d.pmoffscreen", "true");303System.setProperty("sun.java2d.ddforcevram", "true");304String name = "red.jpg";305306f = new Frame();307f.pack();308309if (f.getGraphicsConfiguration().getColorModel().getPixelSize() < 16) {310System.err.println("8-bit display mode detected, dithering issues possible, "+311"considering test passed.");312f.dispose();313return;314}315316317for (String arg : args) {318if (arg.equals("-write")) {319writeTestImage(name);320System.exit(0);321} else if (arg.equals("-show")) {322showRes = true;323} else if (arg.equals("-low")) {324lowCompression = true;325name ="red_low.jpg";326System.err.println("Using low jpeg compression");327} else if (arg.equals("-help")) {328usage();329} else {330final String filename = arg;331testsStarted++;332new Thread(new Runnable() {333public void run() {334new JPEGsNotAcceleratedTest(filename);335}336}).start();337}338}339340if (testsStarted == 0) {341writeTestImage(name);342testsStarted++;343new JPEGsNotAcceleratedTest(name);344}345346347synchronized (JPEGsNotAcceleratedTest.class) {348while (testsFinished < testsStarted) {349try {350JPEGsNotAcceleratedTest.class.wait(100);351} catch (InterruptedException e) {352failed = true; break;353}354}355}356357f.dispose();358if (failed) {359throw new RuntimeException("Test failed");360}361362System.err.println("Passed.");363}364}365366367