# HG changeset patch # User prr # Date 1522352966 25200 # Node ID 8a23dbe5ed1bc567389ccc8935d939b6f1489831 # Parent 5daa8ef1708997a5611179494b5756a40446f54e 8200200: test java/awt/image/ColorModel/Non_sRGBCMTest.java fails with open profiles Reviewed-by: serb diff -r 5daa8ef17089 -r 8a23dbe5ed1b test/jdk/java/awt/image/ColorModel/Non_sRGBCMTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/java/awt/image/ColorModel/Non_sRGBCMTest.java Thu Mar 29 12:49:26 2018 -0700 @@ -0,0 +1,152 @@ +/* + * Copyright (c) 1999, 2018, 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 + * @bug 4278771 8200200 + * @summary This test verifies that various non-sRGB ColorModels correctly + * convert to and from default sRGB ColorModel pixel values + * + */ + +import java.awt.image.*; +import java.awt.Transparency; +import java.awt.color.ColorSpace; + +public class Non_sRGBCMTest { + public static void main(String args[]) { + int[] nBits = {8, 8, 8, 8}; + ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ); + ComponentColorModel ccm = + new ComponentColorModel(cs, nBits, true, true, + Transparency.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + byte[] pixel = new byte[4]; + float val = (0.1f - cs.getMinValue(0)) / + (cs.getMaxValue(0) - cs.getMinValue(0)); + pixel[0] = (byte) ((int) (val * 255.0f)); + val = (0.2f - cs.getMinValue(1)) / + (cs.getMaxValue(1) - cs.getMinValue(1)); + pixel[1] = (byte) ((int) (val * 255.0f)); + val = (0.3f - cs.getMinValue(2)) / + (cs.getMaxValue(2) - cs.getMinValue(2)); + pixel[2] = (byte) ((int) (val * 255.0f)); + pixel[3] = (byte) ((int) (0.4f * 255.0f)); + // The theoretically correct value for blue, when converting from + // the specified XYZ value to sRGB, is 248. This test allows a + // two-bit difference. This may have to be adjusted over time + // to track evolution of the ICC spec, etc. + if (Math.abs(ccm.getBlue(pixel) - 248) > 2) { + throw new Error("Problem with ComponentColorModel.getBlue()"); + } + ccm = new ComponentColorModel(cs, nBits, true, false, + Transparency.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + val = ((0.1f / 0.4f) - cs.getMinValue(0)) / + (cs.getMaxValue(0) - cs.getMinValue(0)); + pixel[0] = (byte) ((int) (val * 255.0f)); + val = ((0.2f / 0.4f) - cs.getMinValue(1)) / + (cs.getMaxValue(1) - cs.getMinValue(1)); + pixel[1] = (byte) ((int) (val * 255.0f)); + val = ((0.3f / 0.4f) - cs.getMinValue(2)) / + (cs.getMaxValue(2) - cs.getMinValue(2)); + pixel[2] = (byte) ((int) (val * 255.0f)); + pixel[3] = (byte) ((int) (0.4f * 255.0f)); + if (Math.abs(ccm.getBlue(pixel) - 248) > 2) { + throw new Error("Problem with ComponentColorModel.getBlue()"); + } + int[] nBits3 = {8, 8, 8}; + ccm = new ComponentColorModel(cs, nBits3, false, false, + Transparency.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + val = ((0.1f / 0.4f) - cs.getMinValue(0)) / + (cs.getMaxValue(0) - cs.getMinValue(0)); + pixel[0] = (byte) ((int) (val * 255.0f)); + val = ((0.2f / 0.4f) - cs.getMinValue(1)) / + (cs.getMaxValue(1) - cs.getMinValue(1)); + pixel[1] = (byte) ((int) (val * 255.0f)); + val = ((0.3f / 0.4f) - cs.getMinValue(2)) / + (cs.getMaxValue(2) - cs.getMinValue(2)); + pixel[2] = (byte) ((int) (val * 255.0f)); + if (Math.abs(ccm.getBlue(pixel) - 248) > 2) { + throw new Error("Problem with ComponentColorModel.getBlue()"); + } + + DirectColorModel dcm = new DirectColorModel( + ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), 32, + 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, true, + DataBuffer.TYPE_INT); + int[] ipixel = new int[1]; + ipixel[0] = (127 << 24) | (127 << 16) | (127 << 8) | 127; + if (Math.abs(dcm.getBlue(ipixel) - 254) > 1) { + throw new Error("Problem with DirectColorModel.getBlue()"); + } + dcm = new DirectColorModel( + ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), 32, + 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, false, + DataBuffer.TYPE_INT); + ipixel[0] = (255 << 24) | (255 << 16) | (255 << 8) | 255; + if (Math.abs(dcm.getBlue(ipixel) - 254) > 1) { + throw new Error("Problem with DirectColorModel.getBlue()"); + } + dcm = new DirectColorModel( + ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), 32, + 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000, false, + DataBuffer.TYPE_INT); + ipixel[0] = (255 << 16) | (255 << 8) | 255; + if (Math.abs(dcm.getBlue(ipixel) - 254) > 1) { + throw new Error("Problem with DirectColorModel.getBlue()"); + } + + dcm = new DirectColorModel( + ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), 32, + 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000, true, + DataBuffer.TYPE_INT); + ipixel[0] = (127 << 24) | (127 << 16) | (127 << 8) | 127; + int i = dcm.getRGB(ipixel); + if (Math.abs(((i & 0x00ff0000) >> 16) - 253) > 2) { + throw new Error("Problem with DirectColorModel.getRGB()"); + } + int[] idata = (int []) dcm.getDataElements(i, null); + if (Math.abs(((idata[0] & 0x00ff0000) >> 16) - 125) > 3) { + throw new Error("Problem with DirectColorModel.getDataElements()"); + } + + ccm = new ComponentColorModel( + ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), nBits, true, + true, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE); + pixel[0] = 127; + pixel[1] = 127; + pixel[2] = 127; + pixel[3] = 127; + i = ccm.getRGB(pixel); + if (Math.abs(((i & 0x00ff0000) >> 16) - 253) > 2) { + throw new Error("Problem with ComponentColorModel.getRGB()"); + } + byte[] bdata = (byte []) ccm.getDataElements(i, null); + if (Math.abs((bdata[0] & 0xff) - 125) > 3) { + throw new Error("Problem with" + + "ComponentColorModel.getDataElements()"); + } + } +}