187 lines
5.3 KiB
Java
187 lines
5.3 KiB
Java
|
/*
|
||
|
* @test
|
||
|
* @bug 6276653 6287936
|
||
|
*
|
||
|
* @summary Test verifes that Image I/O gif writer correctly handles
|
||
|
* image what supports tranclucent transparency type but contains
|
||
|
* picture with opaque or bitmask transparecy (i.e. each image pixel
|
||
|
* is ether opaque or fully transparent).
|
||
|
*
|
||
|
* @run main GifTransparencyTest
|
||
|
*/
|
||
|
|
||
|
|
||
|
import java.awt.BorderLayout;
|
||
|
import java.awt.Color;
|
||
|
import java.awt.Dimension;
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Graphics2D;
|
||
|
import java.awt.geom.Area;
|
||
|
import java.awt.geom.RoundRectangle2D;
|
||
|
import java.awt.image.BufferedImage;
|
||
|
import java.io.File;
|
||
|
import java.io.IOException;
|
||
|
import javax.imageio.ImageIO;
|
||
|
import javax.imageio.ImageWriter;
|
||
|
import javax.imageio.spi.ImageWriterSpi;
|
||
|
import javax.swing.JComponent;
|
||
|
import javax.swing.JFrame;
|
||
|
import javax.swing.JPanel;
|
||
|
|
||
|
|
||
|
public class GifTransparencyTest {
|
||
|
|
||
|
BufferedImage src;
|
||
|
BufferedImage dst;
|
||
|
|
||
|
public GifTransparencyTest() {
|
||
|
src = createTestImage();
|
||
|
}
|
||
|
|
||
|
public void doTest() {
|
||
|
File pwd = new File(".");
|
||
|
try {
|
||
|
File f = File.createTempFile("transparency_test_", ".gif", pwd);
|
||
|
System.out.println("file: " + f.getCanonicalPath());
|
||
|
|
||
|
ImageWriter w = ImageIO.getImageWritersByFormatName("GIF").next();
|
||
|
|
||
|
ImageWriterSpi spi = w.getOriginatingProvider();
|
||
|
|
||
|
boolean succeed_write = ImageIO.write(src, "gif", f);
|
||
|
|
||
|
if (!succeed_write) {
|
||
|
throw new RuntimeException("Test failed: failed to write src.");
|
||
|
}
|
||
|
|
||
|
dst = ImageIO.read(f);
|
||
|
|
||
|
checkResult(src, dst);
|
||
|
|
||
|
} catch (IOException e) {
|
||
|
throw new RuntimeException("Test failed.", e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Failure criteria:
|
||
|
* - src and dst have different dimension
|
||
|
* - any transparent pixel was lost
|
||
|
*/
|
||
|
protected void checkResult(BufferedImage src, BufferedImage dst) {
|
||
|
int w = src.getWidth();
|
||
|
int h = src.getHeight();
|
||
|
|
||
|
|
||
|
if (dst.getWidth() != w || dst.getHeight() != h) {
|
||
|
throw new RuntimeException("Test failed: wrong result dimension");
|
||
|
}
|
||
|
|
||
|
BufferedImage bg = new BufferedImage(2 * w, h, BufferedImage.TYPE_INT_RGB);
|
||
|
Graphics g = bg.createGraphics();
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(0, 0, 2 * w, h);
|
||
|
|
||
|
g.drawImage(src, 0, 0, null);
|
||
|
g.drawImage(dst, w, 0, null);
|
||
|
|
||
|
g.dispose();
|
||
|
|
||
|
for (int y = 0; y < h; y++) {
|
||
|
for (int x = 0; x < w; x++) {
|
||
|
int src_rgb = bg.getRGB(x, y);
|
||
|
int dst_rgb = bg.getRGB(x + w, y);
|
||
|
|
||
|
if (dst_rgb != src_rgb) {
|
||
|
throw new RuntimeException("Test failed: wrong color " +
|
||
|
Integer.toHexString(dst_rgb) + " at " + x + ", " +
|
||
|
y + " (instead of " + Integer.toHexString(src_rgb) +
|
||
|
")");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
System.out.println("Test passed.");
|
||
|
}
|
||
|
|
||
|
public void show() {
|
||
|
JPanel p = new JPanel(new BorderLayout()) {
|
||
|
public void paintComponent(Graphics g) {
|
||
|
g.setColor(Color.blue);
|
||
|
g.fillRect(0, 0, getWidth(), getHeight());
|
||
|
}
|
||
|
};
|
||
|
p.add(new ImageComponent(src), BorderLayout.WEST);
|
||
|
if (dst != null) {
|
||
|
p.add(new ImageComponent(dst), BorderLayout.EAST);
|
||
|
}
|
||
|
|
||
|
JFrame f = new JFrame("Transparency");
|
||
|
f.add(p);
|
||
|
|
||
|
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||
|
f.pack();
|
||
|
f.setVisible(true);
|
||
|
}
|
||
|
|
||
|
public static class ImageComponent extends JComponent {
|
||
|
BufferedImage img;
|
||
|
|
||
|
public ImageComponent(BufferedImage img) {
|
||
|
this.img = img;
|
||
|
}
|
||
|
|
||
|
public Dimension getPreferredSize() {
|
||
|
return new Dimension(img.getWidth() + 2, img.getHeight() + 2);
|
||
|
}
|
||
|
|
||
|
public void paintComponent(Graphics g) {
|
||
|
g.drawImage(img, 1, 1, this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected BufferedImage createTestImage() {
|
||
|
BufferedImage img = new BufferedImage(200, 200,
|
||
|
BufferedImage.TYPE_INT_ARGB);
|
||
|
Graphics g = img.createGraphics();
|
||
|
|
||
|
g.setColor(Color.red);
|
||
|
g.fillRect(50, 50, 100, 100);
|
||
|
g.dispose();
|
||
|
|
||
|
return img;
|
||
|
}
|
||
|
|
||
|
public static class Empty extends GifTransparencyTest {
|
||
|
protected BufferedImage createTestImage() {
|
||
|
return new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static class Opaque extends GifTransparencyTest {
|
||
|
protected BufferedImage createTestImage() {
|
||
|
BufferedImage img = new BufferedImage(200, 200,
|
||
|
BufferedImage.TYPE_INT_ARGB);
|
||
|
Graphics g = img.createGraphics();
|
||
|
g.setColor(Color.cyan);
|
||
|
g.fillRect(0, 0, 200, 200);
|
||
|
|
||
|
g.setColor(Color.red);
|
||
|
g.fillRect(50, 50, 100, 100);
|
||
|
g.dispose();
|
||
|
|
||
|
return img;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
System.out.println("Test bitmask...");
|
||
|
new GifTransparencyTest().doTest();
|
||
|
|
||
|
System.out.println("Test opaque...");
|
||
|
new GifTransparencyTest.Opaque().doTest();
|
||
|
|
||
|
System.out.println("Test empty...");
|
||
|
new GifTransparencyTest.Empty().doTest();
|
||
|
}
|
||
|
}
|