8200200: test java/awt/image/ColorModel/Non_sRGBCMTest.java fails with open profiles
authorprr
Thu, 29 Mar 2018 12:49:26 -0700
changeset 49504 8a23dbe5ed1b
parent 49501 5daa8ef17089
child 49505 64d6895dfc24
8200200: test java/awt/image/ColorModel/Non_sRGBCMTest.java fails with open profiles Reviewed-by: serb
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()");
+        }
+  }
+}