From 5a0d7f856fb0489ccf48cfb5bd943c109769fd0d Mon Sep 17 00:00:00 2001 From: Alexander Stepanov Date: Thu, 14 Jan 2016 16:22:31 +0300 Subject: [PATCH] 8145776: [TEST] add a test checking multipage tiff creation Reviewed-by: bpb, serb, ssadetsky --- .../tiff/MultiPageTest/MultiPageTest.java | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 jdk/test/javax/imageio/plugins/tiff/MultiPageTest/MultiPageTest.java diff --git a/jdk/test/javax/imageio/plugins/tiff/MultiPageTest/MultiPageTest.java b/jdk/test/javax/imageio/plugins/tiff/MultiPageTest/MultiPageTest.java new file mode 100644 index 00000000000..2edb9a1f1c5 --- /dev/null +++ b/jdk/test/javax/imageio/plugins/tiff/MultiPageTest/MultiPageTest.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2016, 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 + * @library /lib/testlibrary/ + * @build jdk.testlibrary.* + * + * @bug 8145776 + * @author a.stepanov + * @summary A simple write-read test for the multi-page tiff. + * Create the file programmaticaly, then do some simple checks + * (number of pages, sizes, colors). Use -Dseed=X to set + * the random generator seed. + * + * @run main MultiPageTest + * @key randomness + */ + + +import java.awt.*; +import java.awt.image.*; +import java.io.*; + +import java.util.*; + +import javax.imageio.*; +import javax.imageio.stream.*; + +import jdk.testlibrary.RandomFactory; + + +public class MultiPageTest { + + private final String fileName; + + private final int NUM_IMAGES = 51; + + private final static Random rnd = RandomFactory.getRandom(); + + private final int w[], h[]; + private final Color colors[]; + private final int BLACK_SIZE = 100; + + private final int imageType; + + + public MultiPageTest(int type, String tName) { + + imageType = type; + fileName = "test__" + tName + ".tif"; + + w = new int[NUM_IMAGES + 4]; + h = new int[NUM_IMAGES + 4]; + + for (int i = 2; i < NUM_IMAGES + 2; i++) { + w[i] = 10 + rnd.nextInt(21); + h[i] = 10 + rnd.nextInt(21); + } + + w[0] = BLACK_SIZE; h[0] = BLACK_SIZE; + w[1] = BLACK_SIZE; h[1] = BLACK_SIZE; + w[NUM_IMAGES + 2] = BLACK_SIZE; h[NUM_IMAGES + 2] = BLACK_SIZE; + w[NUM_IMAGES + 3] = BLACK_SIZE; h[NUM_IMAGES + 3] = BLACK_SIZE; + + + colors = new Color[NUM_IMAGES + 4]; + for (int i = 2; i < NUM_IMAGES + 2; ++i) { + colors[i] = new Color( + rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); + } + + colors[0] = Color.black; + colors[1] = Color.black; + colors[NUM_IMAGES + 2] = Color.black; + colors[NUM_IMAGES + 3] = Color.black; + } + + + private ImageWriter getTIFFWriter() throws Exception { + + Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); + if (!writers.hasNext()) { + throw new RuntimeException("No writers available for " + fileName); + } + return writers.next(); + } + + private ImageReader getTIFFReader() throws Exception { + + Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); + if (!readers.hasNext()) { + throw new RuntimeException("No readers available for " + fileName); + } + return readers.next(); + } + + + private void createImage() throws Exception { + + OutputStream s = new BufferedOutputStream(new FileOutputStream(fileName)); + try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) { + + ImageWriter writer = getTIFFWriter(); + writer.setOutput(ios); + + Graphics g; + + BufferedImage blackImg = + new BufferedImage(BLACK_SIZE, BLACK_SIZE, imageType); + g = blackImg.getGraphics(); + g.setColor(Color.black); + g.fillRect(0, 0, BLACK_SIZE, BLACK_SIZE); + + writer.prepareWriteSequence(null); + + for (int i = 2; i < NUM_IMAGES + 2; i++) { + BufferedImage img = new BufferedImage(w[i], h[i], imageType); + + g = img.getGraphics(); + g.setColor(colors[i]); + g.fillRect(0, 0, w[i], h[i]); + + writer.writeToSequence(new IIOImage(img, null, null), null); + } + + writer.endWriteSequence(); + + // check: insert to the beginning + writer.writeInsert(0, new IIOImage(blackImg, null, null), null); + + // check: insert to non-zero position + writer.writeInsert(1, new IIOImage(blackImg, null, null), null); + + // check: append to the end by index + writer.writeInsert(NUM_IMAGES + 2, + new IIOImage(blackImg, null, null), null); + + // check: append to the end using index "-1" + writer.writeInsert(-1, new IIOImage(blackImg, null, null), null); + + ios.flush(); + writer.dispose(); + } + s.close(); + } + + + + private void readAndCheckImage() throws Exception { + + ImageReader reader = getTIFFReader(); + + ImageInputStream s = ImageIO.createImageInputStream(new File(fileName)); + reader.setInput(s); + + + // check number of pages + if ((NUM_IMAGES + 4) != reader.getNumImages(true)) { + throw new RuntimeException("invalid number of images!"); + } + + // check colors / sizes + for (int i = 0; i < NUM_IMAGES + 4; i++) { + + BufferedImage img = reader.read(i); + + int imw = w[i], imh = h[i]; + + if ( (img.getWidth() != imw) || (img.getHeight() != imh) ) { + throw new RuntimeException("NOK: size(" + i + ")"); + } + + Color + c1 = new Color(img.getRGB(0, 0)), + c2 = new Color(img.getRGB(imw / 2, imh / 2)), + c3 = new Color(img.getRGB(imw - 1, imh - 1)); + if (! (c1.equals(colors[i]) && c1.equals(c2) && c1.equals(c3) ) ) { + throw new RuntimeException("NOK: color(" + i + ")"); + } + } + + reader.dispose(); + s.close(); + } + + public void doTest() throws Exception { + createImage(); + readAndCheckImage(); + } + + public static void main(String[] args) throws Exception { + + int types[] = new int[]{ + BufferedImage.TYPE_INT_RGB, + BufferedImage.TYPE_INT_ARGB, + BufferedImage.TYPE_INT_ARGB_PRE, + BufferedImage.TYPE_INT_BGR, + BufferedImage.TYPE_3BYTE_BGR, + BufferedImage.TYPE_4BYTE_ABGR, + BufferedImage.TYPE_4BYTE_ABGR_PRE + }; + + String names[] = new String[]{ + "TYPE_INT_RGB", + "TYPE_INT_ARGB", + "TYPE_INT_ARGB_PRE", + "TYPE_INT_BGR", + "TYPE_3BYTE_BGR", + "TYPE_4BYTE_ABGR", + "TYPE_4BYTE_ABGR_PRE" + }; + + for (int i = 0; i < types.length; i++) { + System.out.println("image type: " + names[i]); + (new MultiPageTest(types[i], names[i])).doTest(); + } + } +}