GifTransparencyTest.java revision 8729:0242fce0f717
1/* 2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @bug 6276653 6287936 27 * 28 * @summary Test verifes that Image I/O gif writer correctly handles 29 * image what supports tranclucent transparency type but contains 30 * picture with opaque or bitmask transparecy (i.e. each image pixel 31 * is ether opaque or fully transparent). 32 * 33 * @run main GifTransparencyTest 34 */ 35 36 37import java.awt.BorderLayout; 38import java.awt.Color; 39import java.awt.Dimension; 40import java.awt.Graphics; 41import java.awt.Graphics2D; 42import java.awt.geom.Area; 43import java.awt.geom.RoundRectangle2D; 44import java.awt.image.BufferedImage; 45import java.io.File; 46import java.io.IOException; 47import javax.imageio.ImageIO; 48import javax.imageio.ImageWriter; 49import javax.imageio.spi.ImageWriterSpi; 50import javax.swing.JComponent; 51import javax.swing.JFrame; 52import javax.swing.JPanel; 53 54 55public class GifTransparencyTest { 56 57 BufferedImage src; 58 BufferedImage dst; 59 60 public GifTransparencyTest() { 61 src = createTestImage(); 62 } 63 64 public void doTest() { 65 File pwd = new File("."); 66 try { 67 File f = File.createTempFile("transparency_test_", ".gif", pwd); 68 System.out.println("file: " + f.getCanonicalPath()); 69 70 ImageWriter w = ImageIO.getImageWritersByFormatName("GIF").next(); 71 72 ImageWriterSpi spi = w.getOriginatingProvider(); 73 74 boolean succeed_write = ImageIO.write(src, "gif", f); 75 76 if (!succeed_write) { 77 throw new RuntimeException("Test failed: failed to write src."); 78 } 79 80 dst = ImageIO.read(f); 81 82 checkResult(src, dst); 83 84 } catch (IOException e) { 85 throw new RuntimeException("Test failed.", e); 86 } 87 } 88 89 /* 90 * Failure criteria: 91 * - src and dst have different dimension 92 * - any transparent pixel was lost 93 */ 94 protected void checkResult(BufferedImage src, BufferedImage dst) { 95 int w = src.getWidth(); 96 int h = src.getHeight(); 97 98 99 if (dst.getWidth() != w || dst.getHeight() != h) { 100 throw new RuntimeException("Test failed: wrong result dimension"); 101 } 102 103 BufferedImage bg = new BufferedImage(2 * w, h, BufferedImage.TYPE_INT_RGB); 104 Graphics g = bg.createGraphics(); 105 g.setColor(Color.white); 106 g.fillRect(0, 0, 2 * w, h); 107 108 g.drawImage(src, 0, 0, null); 109 g.drawImage(dst, w, 0, null); 110 111 g.dispose(); 112 113 for (int y = 0; y < h; y++) { 114 for (int x = 0; x < w; x++) { 115 int src_rgb = bg.getRGB(x, y); 116 int dst_rgb = bg.getRGB(x + w, y); 117 118 if (dst_rgb != src_rgb) { 119 throw new RuntimeException("Test failed: wrong color " + 120 Integer.toHexString(dst_rgb) + " at " + x + ", " + 121 y + " (instead of " + Integer.toHexString(src_rgb) + 122 ")"); 123 } 124 } 125 } 126 System.out.println("Test passed."); 127 } 128 129 public void show() { 130 JPanel p = new JPanel(new BorderLayout()) { 131 public void paintComponent(Graphics g) { 132 g.setColor(Color.blue); 133 g.fillRect(0, 0, getWidth(), getHeight()); 134 } 135 }; 136 p.add(new ImageComponent(src), BorderLayout.WEST); 137 if (dst != null) { 138 p.add(new ImageComponent(dst), BorderLayout.EAST); 139 } 140 141 JFrame f = new JFrame("Transparency"); 142 f.add(p); 143 144 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 145 f.pack(); 146 f.setVisible(true); 147 } 148 149 public static class ImageComponent extends JComponent { 150 BufferedImage img; 151 152 public ImageComponent(BufferedImage img) { 153 this.img = img; 154 } 155 156 public Dimension getPreferredSize() { 157 return new Dimension(img.getWidth() + 2, img.getHeight() + 2); 158 } 159 160 public void paintComponent(Graphics g) { 161 g.drawImage(img, 1, 1, this); 162 } 163 } 164 165 protected BufferedImage createTestImage() { 166 BufferedImage img = new BufferedImage(200, 200, 167 BufferedImage.TYPE_INT_ARGB); 168 Graphics g = img.createGraphics(); 169 170 g.setColor(Color.red); 171 g.fillRect(50, 50, 100, 100); 172 g.dispose(); 173 174 return img; 175 } 176 177 public static class Empty extends GifTransparencyTest { 178 protected BufferedImage createTestImage() { 179 return new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB); 180 } 181 } 182 183 public static class Opaque extends GifTransparencyTest { 184 protected BufferedImage createTestImage() { 185 BufferedImage img = new BufferedImage(200, 200, 186 BufferedImage.TYPE_INT_ARGB); 187 Graphics g = img.createGraphics(); 188 g.setColor(Color.cyan); 189 g.fillRect(0, 0, 200, 200); 190 191 g.setColor(Color.red); 192 g.fillRect(50, 50, 100, 100); 193 g.dispose(); 194 195 return img; 196 } 197 } 198 199 public static void main(String[] args) { 200 System.out.println("Test bitmask..."); 201 new GifTransparencyTest().doTest(); 202 203 System.out.println("Test opaque..."); 204 new GifTransparencyTest.Opaque().doTest(); 205 206 System.out.println("Test empty..."); 207 new GifTransparencyTest.Empty().doTest(); 208 } 209} 210