3789983e89
Reviewed-by: darcy, ihse
214 lines
6.5 KiB
Java
214 lines
6.5 KiB
Java
/*
|
|
* Copyright (c) 2007, 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 6570475
|
|
* @summary Test verifies that palette comparison procedure of
|
|
* ImageRepresentation class does not produce extra transparent
|
|
* pixels.
|
|
*
|
|
* @run main LUTCompareTest
|
|
*/
|
|
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Dimension;
|
|
import java.awt.Graphics;
|
|
import java.awt.Graphics2D;
|
|
import java.awt.Image;
|
|
import java.awt.MediaTracker;
|
|
import java.awt.Toolkit;
|
|
import java.awt.image.BufferedImage;
|
|
import java.awt.image.DataBuffer;
|
|
import java.awt.image.ImageObserver;
|
|
import java.awt.image.IndexColorModel;
|
|
import java.awt.image.WritableRaster;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.Arrays;
|
|
import javax.imageio.IIOImage;
|
|
import javax.imageio.ImageIO;
|
|
import javax.imageio.ImageWriteParam;
|
|
import javax.imageio.ImageWriter;
|
|
import javax.imageio.stream.ImageOutputStream;
|
|
import javax.swing.JComponent;
|
|
import javax.swing.JFrame;
|
|
|
|
public class LUTCompareTest implements ImageObserver {
|
|
|
|
public static void main(String[] args) throws IOException {
|
|
Image img = createTestImage();
|
|
|
|
Toolkit tk = Toolkit.getDefaultToolkit();
|
|
|
|
LUTCompareTest o = new LUTCompareTest(img);
|
|
|
|
tk.prepareImage(img, -1, -1, o);
|
|
|
|
while(!o.isImageReady()) {
|
|
synchronized(lock) {
|
|
try {
|
|
lock.wait(200);
|
|
} catch (InterruptedException e) {
|
|
}
|
|
}
|
|
}
|
|
|
|
checkResults(img);
|
|
}
|
|
|
|
private static Object lock = new Object();
|
|
|
|
Image image;
|
|
|
|
boolean isReady = false;
|
|
|
|
public LUTCompareTest(Image img) {
|
|
this.image = img;
|
|
}
|
|
|
|
public boolean imageUpdate(Image image, int info,
|
|
int x, int y, int w, int h) {
|
|
if (image == this.image) {
|
|
System.out.println("Image status: " + dump(info));
|
|
synchronized(this) {
|
|
isReady = (info & ImageObserver.ALLBITS) != 0;
|
|
if (isReady) {
|
|
synchronized(lock) {
|
|
lock.notifyAll();
|
|
}
|
|
}
|
|
}
|
|
return !isReady;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public synchronized boolean isImageReady() {
|
|
return isReady;
|
|
}
|
|
|
|
private static void checkResults(Image image) {
|
|
BufferedImage buf = new BufferedImage(w, h,
|
|
BufferedImage.TYPE_INT_RGB);
|
|
Graphics2D g = buf.createGraphics();
|
|
g.setColor(Color.pink);
|
|
g.fillRect(0, 0, w, h);
|
|
|
|
g.drawImage(image, 0, 0, null);
|
|
|
|
g.dispose();
|
|
|
|
int rgb = buf.getRGB(w/2, h/2);
|
|
|
|
System.out.printf("Result color: %x\n", rgb);
|
|
|
|
/* Buffered image should be the same as the last frame
|
|
* of animated sequence (which is filled with blue).
|
|
* Any other color indicates the problem.
|
|
*/
|
|
if (rgb != 0xff0000ff) {
|
|
throw new RuntimeException("Test FAILED!");
|
|
}
|
|
|
|
System.out.println("Test PASSED.");
|
|
}
|
|
|
|
private static int w = 100;
|
|
private static int h = 100;
|
|
|
|
/* Create test image with two frames:
|
|
* 1) with {red, red} palette
|
|
* 2) with {blue, red } palette
|
|
*/
|
|
private static Image createTestImage() throws IOException {
|
|
BufferedImage frame1 = createFrame(new int[] { 0xffff0000, 0xffff0000 });
|
|
BufferedImage frame2 = createFrame(new int[] { 0xff0000ff, 0xffff0000 });
|
|
|
|
ImageWriter writer = ImageIO.getImageWritersByFormatName("GIF").next();
|
|
ImageOutputStream ios = ImageIO.createImageOutputStream(new File("lut_test.gif"));
|
|
ImageWriteParam param = writer.getDefaultWriteParam();
|
|
writer.setOutput(ios);
|
|
writer.prepareWriteSequence(null);
|
|
writer.writeToSequence(new IIOImage(frame1, null, null), param);
|
|
writer.writeToSequence(new IIOImage(frame2, null, null), param);
|
|
writer.endWriteSequence();
|
|
writer.reset();
|
|
writer.dispose();
|
|
|
|
ios.flush();
|
|
ios.close();
|
|
|
|
return Toolkit.getDefaultToolkit().createImage("lut_test.gif");
|
|
}
|
|
|
|
private static BufferedImage createFrame(int[] palette) {
|
|
IndexColorModel icm = new IndexColorModel(getNumBits(palette.length),
|
|
palette.length, palette, 0, false, -1, DataBuffer.TYPE_BYTE);
|
|
WritableRaster wr = icm.createCompatibleWritableRaster(w, h);
|
|
int[] samples = new int[w * h];
|
|
Arrays.fill(samples, 0);
|
|
wr.setSamples(0, 0, w, h, 0, samples);
|
|
|
|
BufferedImage img = new BufferedImage(icm, wr, false, null);
|
|
return img;
|
|
}
|
|
|
|
private static int getNumBits(int size) {
|
|
if (size < 0) {
|
|
throw new RuntimeException("Invalid palette size: " + size);
|
|
} else if (size < 3) {
|
|
return 1;
|
|
} else if (size < 5) {
|
|
return 2;
|
|
} else {
|
|
throw new RuntimeException("Palette size is not supported: " + size);
|
|
}
|
|
}
|
|
|
|
private static String[] name = new String[] {
|
|
"WIDTH", "HEIGHT", "PROPERTIES", "SOMEBITS",
|
|
"FRAMEBITS", "ALLBITS", "ERROR", "ABORT"
|
|
};
|
|
|
|
private static String dump(int info) {
|
|
String res = "";
|
|
int count = 0;
|
|
while (info != 0) {
|
|
//System.out.println("info = " + info);
|
|
if ((info & 0x1) == 1) {
|
|
res += name[count];
|
|
if ((info >> 1) != 0) {
|
|
res += " ";
|
|
}
|
|
|
|
}
|
|
count ++;
|
|
info = (info >> 1);
|
|
}
|
|
return res;
|
|
}
|
|
}
|