1 /* 2 * Copyright (c) 2007, 2013, 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 6476665 27 * @summary Verifies color conversion of Direct Color Model based images 28 * @run main ColConvDCMTest 29 */ 30 31 import java.awt.color.ColorSpace; 32 import java.awt.image.BufferedImage; 33 import java.awt.image.ColorConvertOp; 34 import java.io.File; 35 import java.io.IOException; 36 import javax.imageio.ImageIO; 37 38 public class ColConvDCMTest extends ColConvTest { 39 40 /* 41 * Test case descriptors: <imgType> <rBits> <gBits> <bBits> <csNum> <gldNum> 42 */ 43 final static int [][] imgTypes = { 44 {BufferedImage.TYPE_INT_ARGB, 8, 8, 8, 0, 0}, 45 {BufferedImage.TYPE_INT_ARGB, 8, 8, 8, 1, 3}, 46 47 {BufferedImage.TYPE_INT_RGB, 8, 8, 8, 0, 0}, 48 {BufferedImage.TYPE_INT_RGB, 8, 8, 8, 1, 3}, 49 50 {BufferedImage.TYPE_INT_BGR, 8, 8, 8, 0, 0}, 51 {BufferedImage.TYPE_INT_BGR, 8, 8, 8, 1, 3}, 52 53 {BufferedImage.TYPE_USHORT_555_RGB, 5, 5, 5, 0, 1}, 54 {BufferedImage.TYPE_USHORT_555_RGB, 5, 5, 5, 1, 4}, 55 56 {BufferedImage.TYPE_USHORT_565_RGB, 5, 6, 5, 0, 2}, 57 {BufferedImage.TYPE_USHORT_565_RGB, 5, 6, 5, 1, 5} 58 }; 59 60 final static int [] cSpaces = { 61 ColorSpace.CS_sRGB, 62 ColorSpace.CS_LINEAR_RGB, 63 }; 64 65 final static double [] ACCURACY = { 66 // Accuracy for color conversions 67 2.5, // sRGB 68 (isOpenProfile() ? 45.0 : 2.5), // LINEAR_RGB 69 }; 70 71 final static String [] gldImgNames = { 72 "SRGB.png", "SRGB555.png", "SRGB565.png", "LRGB.png", "LRGB555.png", 73 "LRGB565.png" 74 }; 75 76 static BufferedImage [] gldImages = null; 77 testImage(int type, int rBits, int gBits, int bBits, int cs, BufferedImage gldImage, double accuracy)78 static boolean testImage(int type, int rBits, int gBits, int bBits, 79 int cs, BufferedImage gldImage, 80 double accuracy) 81 { 82 BufferedImage src = ImageFactory.createDCMImage(type, cs); 83 BufferedImage dst = ImageFactory.createDstImage( 84 BufferedImage.TYPE_INT_RGB); 85 ColorConvertOp op = new ColorConvertOp(null); 86 87 op.filter(src, dst); 88 89 ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 90 bBits); 91 boolean result = cmp.compare(gldImage, dst); 92 if (!result) { 93 System.err.println(cmp.getStat()); 94 } 95 return result; 96 } 97 testSubImage(int x0, int y0, int dx, int dy, int type, int rBits, int gBits, int bBits, int cs, BufferedImage gldImage, double accuracy)98 static boolean testSubImage(int x0, int y0, int dx, int dy, int type, 99 int rBits, int gBits, int bBits, 100 int cs, BufferedImage gldImage, 101 double accuracy) 102 { 103 BufferedImage src = ImageFactory.createDCMImage(type, cs); 104 BufferedImage subSrc = src.getSubimage(x0, y0, dx, dy); 105 BufferedImage dst = ImageFactory.createDstImage( 106 BufferedImage.TYPE_INT_RGB); 107 BufferedImage subDst = dst.getSubimage(x0, y0, dx, dy); 108 109 ColorConvertOp op = new ColorConvertOp(null); 110 111 op.filter(subSrc, subDst); 112 113 ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 114 bBits); 115 boolean result = cmp.compare(subDst, gldImage, x0, y0, dx, dy); 116 if (!result) { 117 System.err.println(cmp.getStat()); 118 } 119 return result; 120 } 121 initGoldenImages()122 synchronized public static void initGoldenImages() { 123 if (gldImages == null) { 124 gldImages = new BufferedImage[gldImgNames.length]; 125 for (int i = 0; i < gldImgNames.length; i++) { 126 try { 127 File gldFile = new File(System.getProperty("test.src", "."), 128 gldImgNames[i]); 129 130 gldImages[i] = ImageIO.read(gldFile); 131 } catch (IOException e) { 132 throw new RuntimeException("Cannot initialize golden " + 133 "image: " + gldImgNames[i]); 134 } 135 } 136 } 137 } 138 init()139 public void init() { 140 initGoldenImages(); 141 } 142 runTest()143 public void runTest() { 144 for (int i = 0; i < imgTypes.length; i++) { 145 BufferedImage gldImage = gldImages[imgTypes[i][5]]; 146 147 if (!testImage(imgTypes[i][0], imgTypes[i][1], imgTypes[i][2], 148 imgTypes[i][3], cSpaces[imgTypes[i][4]], gldImage, 149 ACCURACY[imgTypes[i][4]])) 150 { 151 throw new RuntimeException( 152 "Invalid result of the ColorConvertOp for " + 153 "ColorSpace:" + getCSName(cSpaces[imgTypes[i][4]]) + 154 " Image type:" + 155 getImageTypeName(imgTypes[i][0]) + ". Golden image:" + 156 gldImgNames[imgTypes[i][5]]); 157 } 158 159 if (!testSubImage(SI_X, SI_Y, SI_W, SI_H, imgTypes[i][0], 160 imgTypes[i][1], imgTypes[i][2], imgTypes[i][3], 161 cSpaces[imgTypes[i][4]], gldImage, 162 ACCURACY[imgTypes[i][4]])) 163 { 164 throw new RuntimeException( 165 "Invalid result of the ColorConvertOp for " + 166 "ColorSpace:" + getCSName(cSpaces[imgTypes[i][4]]) + 167 " Image type:" + 168 getImageTypeName(imgTypes[i][0]) + ". Golden image:" + 169 gldImgNames[imgTypes[i][5]]); 170 } 171 } 172 } 173 main(String [] args)174 public static void main(String [] args) throws Exception { 175 ColConvDCMTest test = new ColConvDCMTest(); 176 test.init(); 177 test.run(); 178 } 179 } 180