--- /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()");
+ }
+ }
+}