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 7033534 6830714 8052162 27 * @summary Verifies color conversion of Component Color Model based images 28 * @run main ColConvCCMTest 29 */ 30 31 import java.awt.color.ColorSpace; 32 import java.awt.image.BufferedImage; 33 import java.awt.image.ColorConvertOp; 34 import java.awt.image.DataBuffer; 35 import java.io.File; 36 import java.io.IOException; 37 import javax.imageio.ImageIO; 38 public class ColConvCCMTest extends ColConvTest { 39 40 final static int [] dataTypes = { 41 DataBuffer.TYPE_BYTE, 42 DataBuffer.TYPE_DOUBLE, 43 DataBuffer.TYPE_FLOAT, 44 DataBuffer.TYPE_INT, 45 DataBuffer.TYPE_SHORT, 46 DataBuffer.TYPE_USHORT 47 }; 48 49 final static int [] cSpaces = { 50 ColorSpace.CS_sRGB, 51 ColorSpace.CS_LINEAR_RGB, 52 ColorSpace.CS_GRAY, 53 ColorSpace.CS_PYCC, 54 ColorSpace.CS_CIEXYZ 55 }; 56 57 final static double [] ACCURACY = { 58 // Accuracy for color conversions 59 2.5, // sRGB 60 (isOpenProfile() ? 45.0 : 10.1), // LINEAR_RGB 61 10.5, // GRAY 62 (isOpenProfile() ? 207 : 45.5), // PYCC 63 47.5 // CIEXYZ 64 }; 65 66 final static String [] gldImgNames = { 67 "SRGB.png", "LRGB.png", "GRAY.png", "PYCC.png", "CIEXYZ.png" 68 }; 69 70 static BufferedImage [] gldImages = null; 71 72 static boolean testImage(int dataType, int rBits, int gBits, int bBits, 73 int cs, BufferedImage gldImage, 74 double accuracy) 75 { 76 BufferedImage src = ImageFactory.createCCMImage(cs, dataType); 77 BufferedImage dst = ImageFactory.createDstImage( 78 BufferedImage.TYPE_INT_RGB); 79 ColorConvertOp op = new ColorConvertOp(null); 80 op.filter(src, dst); 81 82 ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 83 bBits); 84 boolean result = cmp.compare(gldImage, dst); 85 if (!result) { 86 System.err.println(cmp.getStat()); 87 } 88 return result; 89 } 90 91 static boolean testSubImage(int x0, int y0, int dx, int dy, 92 int dataType, int rBits, int gBits, 93 int bBits, int cs, BufferedImage gldImage, 94 double accuracy) 95 { 96 BufferedImage src = ImageFactory.createCCMImage(cs, dataType); 97 BufferedImage subSrc = src.getSubimage(x0, y0, dx, dy); 98 BufferedImage dst = ImageFactory.createDstImage( 99 BufferedImage.TYPE_INT_RGB); 100 BufferedImage subDst = dst.getSubimage(x0, y0, dx, dy); 101 ColorConvertOp op = new ColorConvertOp(null); 102 103 op.filter(subSrc, subDst); 104 ImageComparator cmp = new ImageComparator(accuracy, rBits, gBits, 105 bBits); 106 boolean result = cmp.compare(subDst, gldImage, x0, y0, dx, dy); 107 if (!result) { 108 System.err.println(cmp.getStat()); 109 } 110 return result; 111 } 112 synchronized public static void initGoldenImages() { 113 if (gldImages == null) { 114 gldImages = new BufferedImage[gldImgNames.length]; 115 for (int i = 0; i < gldImgNames.length; i++) { 116 try { 117 File gldFile = new File(System.getProperty("test.src", "."), 118 gldImgNames[i]); 119 120 gldImages[i] = ImageIO.read(gldFile); 121 } catch (IOException e) { 122 throw new RuntimeException("Cannot initialize golden " + 123 "image: " + gldImgNames[i]); 124 } 125 } 126 } 127 } 128 129 public void init() { 130 initGoldenImages(); 131 } 132 133 public void runTest() { 134 for (int i = 0; i < cSpaces.length; i++) { 135 BufferedImage gldImage = gldImages[i]; 136 for (int j = 0; j < dataTypes.length; j++) { 137 if (!testImage(dataTypes[j], 8, 8, 8, cSpaces[i], gldImage, 138 ACCURACY[i])) 139 { 140 throw new RuntimeException( 141 "Invalid result of the ColorConvertOp for " + 142 "ColorSpace:" + getCSName(cSpaces[i]) + 143 " Data type:" + 144 getDTName(dataTypes[j]) + ". Golden image:" + 145 gldImages[i]); 146 } 147 148 if (!testSubImage(SI_X, SI_Y, SI_W, SI_H, dataTypes[j], 149 8, 8, 8, cSpaces[i], gldImage, ACCURACY[i])) 150 { 151 throw new RuntimeException( 152 "Invalid result of the ColorConvertOp for " + 153 "ColorSpace:" + getCSName(cSpaces[i]) + 154 " Data type:" + 155 getDTName(dataTypes[j]) + ". Golden image:" + 156 gldImages[i]); 157 } 158 } 159 } 160 } 161 162 public static void main(String [] args) throws Exception { 163 ColConvCCMTest test = new ColConvCCMTest(); 164 test.init(); 165 test.run(); 166 } 167 }