blob: e73a1be19f386dcc554d4bfe3bc0bdcb69f3d394 [file] [log] [blame]
/*
* 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.");
}
}