--- a/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java Fri Dec 28 18:28:39 2012 -0800
@@ -53,7 +53,9 @@
public static native long getProfileID(ICC_Profile profile);
public static native long createNativeTransform(
- long[] profileIDs, int renderType, int inFormatter, int outFormatter,
+ long[] profileIDs, int renderType,
+ int inFormatter, boolean isInIntPacked,
+ int outFormatter, boolean isOutIntPacked,
Object disposerRef);
/**
--- a/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java Fri Dec 28 18:28:39 2012 -0800
@@ -196,7 +196,8 @@
case BufferedImage.TYPE_4BYTE_ABGR:
byteRaster = (ByteComponentRaster)image.getRaster();
nextRowOffset = byteRaster.getScanlineStride();
- offset = byteRaster.getDataOffset(0);
+ int firstBand = image.getSampleModel().getNumBands() - 1;
+ offset = byteRaster.getDataOffset(firstBand);
dataArray = byteRaster.getDataStorage();
dataType = DT_BYTE;
break;
--- a/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java Fri Dec 28 18:28:39 2012 -0800
@@ -55,8 +55,10 @@
public class LCMSTransform implements ColorTransform {
long ID;
- private int inFormatter;
- private int outFormatter;
+ private int inFormatter = 0;
+ private boolean isInIntPacked = false;
+ private int outFormatter = 0;
+ private boolean isOutIntPacked = false;
ICC_Profile[] profiles;
long [] profileIDs;
@@ -135,18 +137,23 @@
LCMSImageLayout out) {
// update native transfrom if needed
if (ID == 0L ||
- inFormatter != in.pixelType ||
- outFormatter != out.pixelType) {
+ inFormatter != in.pixelType || isInIntPacked != in.isIntPacked ||
+ outFormatter != out.pixelType || isOutIntPacked != out.isIntPacked)
+ {
if (ID != 0L) {
// Disposer will destroy forgotten transform
disposerReferent = new Object();
}
inFormatter = in.pixelType;
+ isInIntPacked = in.isIntPacked;
+
outFormatter = out.pixelType;
+ isOutIntPacked = out.isIntPacked;
ID = LCMS.createNativeTransform(profileIDs, renderType,
- inFormatter, outFormatter,
+ inFormatter, isInIntPacked,
+ outFormatter, isOutIntPacked,
disposerReferent);
}
--- a/jdk/src/share/demo/java2d/J2DBench/build.xml Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/demo/java2d/J2DBench/build.xml Fri Dec 28 18:28:39 2012 -0800
@@ -49,7 +49,7 @@
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
- <javac debug="false" source="1.2" target="1.2" srcdir="${src}" destdir="${build}"/>
+ <javac debug="flase" source="1.5" target="1.5" srcdir="${src}" destdir="${build}"/>
</target>
<target name="run" depends="dist"
--- a/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/J2DBench.java Fri Dec 28 18:28:39 2012 -0800
@@ -69,6 +69,7 @@
import j2dbench.tests.RenderTests;
import j2dbench.tests.PixelTests;
import j2dbench.tests.iio.IIOTests;
+import j2dbench.tests.cmm.CMMTests;
import j2dbench.tests.text.TextConstructionTests;
import j2dbench.tests.text.TextMeasureTests;
import j2dbench.tests.text.TextRenderTests;
@@ -199,6 +200,7 @@
TextMeasureTests.init();
TextConstructionTests.init();
IIOTests.init();
+ CMMTests.init();
boolean gui = true;
boolean showresults = true;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/CMMTests.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Option;
+import j2dbench.Result;
+import j2dbench.Test;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CMMTests extends Test {
+
+ protected static Group cmmRoot;
+ protected static Group cmmOptRoot;
+ protected static Option csList;
+ protected static Option usePlatfromProfiles;
+
+ public static void init() {
+ cmmRoot = new Group("cmm", "Color Management Benchmarks");
+ cmmRoot.setTabbed();
+
+ cmmOptRoot = new Group(cmmRoot, "opts", "General Options");
+
+ /*
+ usePlatfromProfiles =
+ new Option.Enable(cmmOptRoot, "csPlatfrom",
+ "Use Platfrom Profiles", false);
+ */
+ int[] colorspaces = new int[] {
+ ColorSpace.CS_sRGB,
+ ColorSpace.CS_GRAY,
+ ColorSpace.CS_LINEAR_RGB,
+ ColorSpace.CS_CIEXYZ
+ };
+
+ String[] csNames = new String[]{
+ "CS_sRGB",
+ "CS_GRAY",
+ "CS_LINEAR_RGB",
+ "CS_CIEXYZ"
+ };
+
+ csList = new Option.IntList(cmmOptRoot,
+ "profiles", "Color Profiles",
+ colorspaces, csNames, csNames, 0x8);
+
+ ColorConversionTests.init();
+ ProfileTests.init();
+ }
+
+ protected static ColorSpace getColorSpace(TestEnvironment env) {
+ ColorSpace cs;
+ Boolean usePlatfrom = true; //(Boolean)env.getModifier(usePlatfromProfiles);
+
+ int cs_code = env.getIntValue(csList);
+ if (usePlatfrom) {
+ cs = ColorSpace.getInstance(cs_code);
+ } else {
+ String resource = "profiles/";
+ switch (cs_code) {
+ case ColorSpace.CS_CIEXYZ:
+ resource += "CIEXYZ.pf";
+ break;
+ case ColorSpace.CS_GRAY:
+ resource += "GRAY.pf";
+ break;
+ case ColorSpace.CS_LINEAR_RGB:
+ resource += "LINEAR_RGB.pf";
+ break;
+ case ColorSpace.CS_PYCC:
+ resource += "PYCC.pf";
+ break;
+ case ColorSpace.CS_sRGB:
+ resource += "sRGB.pf";
+ break;
+ default:
+ throw new RuntimeException("Unknown color space: " + cs_code);
+ }
+
+ try {
+ InputStream is = CMMTests.class.getResourceAsStream(resource);
+ ICC_Profile p = ICC_Profile.getInstance(is);
+
+ cs = new ICC_ColorSpace(p);
+ } catch (IOException e) {
+ throw new RuntimeException("Unable load profile from resource " + resource, e);
+ }
+ }
+ return cs;
+ }
+
+ protected CMMTests(Group parent, String nodeName, String description) {
+ super(parent, nodeName, description);
+ addDependencies(cmmOptRoot, true);
+ }
+
+ @Override
+ public Object initTest(TestEnvironment te, Result result) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void runTest(Object o, int i) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void cleanupTest(TestEnvironment te, Object o) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ColorConversionTests.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+
+public class ColorConversionTests extends CMMTests {
+
+ protected static Group colorConvRoot;
+
+ public static void init() {
+ colorConvRoot = new Group(cmmRoot, "colorconv", "Color Conversion Benchmarks");
+ colorConvRoot.setTabbed();
+
+ DataConversionTests.init();
+ ColorConvertOpTests.init();
+ }
+
+ protected ColorConversionTests(Group parent, String nodeName, String description) {
+ super(parent, nodeName, description);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ColorConvertOpTests.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,383 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Option;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import j2dbench.tests.iio.IIOTests;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+import javax.imageio.ImageIO;
+
+public class ColorConvertOpTests extends ColorConversionTests {
+
+ private static enum ImageContent {
+ BLANK("bank", "Blank (opaque black)"),
+ RANDOM("random", "Random"),
+ VECTOR("vector", "Vector Art"),
+ PHOTO("photo", "Photograph");
+
+ public final String name;
+ public final String descr;
+
+ private ImageContent(String name, String descr) {
+ this.name = name;
+ this.descr = descr;
+ }
+ }
+
+ private static enum ImageType {
+ INT_ARGB(BufferedImage.TYPE_INT_ARGB, "INT_ARGB", "TYPE_INT_ARGB"),
+ INT_RGB(BufferedImage.TYPE_INT_RGB, "INT_RGB", "TYPE_INT_RGB"),
+ INT_BGR(BufferedImage.TYPE_INT_BGR, "INT_BGR", "TYPE_INT_BGR"),
+ BYTE_3BYTE_BGR(BufferedImage.TYPE_3BYTE_BGR, "3BYTE_BGR", "TYPE_3BYTE_BGR"),
+ BYTE_4BYTE_ABGR(BufferedImage.TYPE_4BYTE_ABGR, "4BYTE_BGR", "TYPE_4BYTE_BGR"),
+ COMPATIBLE_DST(0, "Compatible", "Compatible destination");
+
+ private ImageType(int type, String abbr, String descr) {
+ this.type = type;
+ this.abbrev = abbr;
+ this.descr = descr;
+ }
+
+ public final int type;
+ public final String abbrev;
+ public final String descr;
+ }
+
+ private static enum ListType {
+ SRC("srcType", "Source Images"),
+ DST("dstType", "Destination Images");
+
+ private ListType(String name, String description) {
+ this.name = name;
+ this.description = description;
+ }
+ public final String name;
+ public final String description;
+ }
+
+ public static Option createImageTypeList(ListType listType) {
+
+ ImageType[] allTypes = ImageType.values();
+
+ int num = allTypes.length;
+ if (listType == ListType.SRC) {
+ num -= 1; // exclude compatible destination
+ }
+
+ ImageType[] t = new ImageType[num];
+ String[] names = new String[num];
+ String[] abbrev = new String[num];
+ String[] descr = new String[num];
+
+ for (int i = 0; i < num; i++) {
+ t[i] = allTypes[i];
+ names[i] = t[i].toString();
+ abbrev[i] = t[i].abbrev;
+ descr[i] = t[i].descr;
+ }
+
+ Option list = new Option.ObjectList(opOptionsRoot,
+ listType.name, listType.description,
+ names, t, abbrev, descr, 1);
+ return list;
+ }
+
+ protected static Group opConvRoot;
+
+ protected static Group opOptionsRoot;
+ protected static Option sizeList;
+ protected static Option contentList;
+
+ protected static Option sourceType;
+
+ protected static Option destinationType;
+
+ public static void init() {
+ opConvRoot = new Group(colorConvRoot, "ccop", "ColorConvertOp Tests");
+
+ opOptionsRoot = new Group(opConvRoot, "ccopOptions", "Options");
+
+ // size list
+ int[] sizes = new int[] {1, 20, 250, 1000, 4000};
+ String[] sizeStrs = new String[] {
+ "1x1", "20x20", "250x250", "1000x1000", "4000x4000"
+ };
+ String[] sizeDescs = new String[] {
+ "Tiny Images (1x1)",
+ "Small Images (20x20)",
+ "Medium Images (250x250)",
+ "Large Images (1000x1000)",
+ "Huge Images (4000x4000)",
+ };
+ sizeList = new Option.IntList(opOptionsRoot,
+ "size", "Image Size",
+ sizes, sizeStrs, sizeDescs, 0x4);
+ ((Option.ObjectList) sizeList).setNumRows(5);
+
+ // image content
+ ImageContent[] c = ImageContent.values();
+
+ String[] contentStrs = new String[c.length];
+ String[] contentDescs = new String[c.length];
+
+ for (int i = 0; i < c.length; i++) {
+ contentStrs[i] = c[i].name;
+ contentDescs[i] = c[i].descr;
+ };
+
+ contentList = new Option.ObjectList(opOptionsRoot,
+ "content", "Image Content",
+ contentStrs, c,
+ contentStrs, contentDescs,
+ 0x8);
+
+ sourceType = createImageTypeList(ListType.SRC);
+
+ destinationType = createImageTypeList(ListType.DST);
+
+ new ConvertImageTest();
+ new ConvertRasterTest();
+ new DrawImageTest();
+ }
+
+ public ColorConvertOpTests(Group parent, String nodeName, String description) {
+ super(parent, nodeName, description);
+ addDependencies(opOptionsRoot, true);
+ }
+
+ public Object initTest(TestEnvironment env, Result res) {
+ return new Context(env, res);
+ }
+
+ public void cleanupTest(TestEnvironment env, Object o) {
+ Context ctx = (Context)o;
+ ctx.cs = null;
+ ctx.op_img = null;
+ ctx.op_rst = null;
+ ctx.dst = null;
+ ctx.src = null;
+ ctx.graphics = null;
+ }
+
+ private static class Context {
+ ColorSpace cs;
+ Graphics2D graphics;
+ ColorConvertOp op_img;
+ ColorConvertOp op_rst;
+
+ BufferedImage src;
+ BufferedImage dst;
+
+ WritableRaster rsrc;
+ WritableRaster rdst;
+
+ public Context(TestEnvironment env, Result res) {
+
+ graphics = (Graphics2D)env.getGraphics();
+ cs = getColorSpace(env);
+
+ // TODO: provide rendering hints
+ op_img = new ColorConvertOp(cs, null);
+ ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ op_rst = new ColorConvertOp(sRGB, cs, null);
+
+ int size = env.getIntValue(sizeList);
+
+ ImageContent content = (ImageContent)env.getModifier(contentList);
+ ImageType srcType = (ImageType)env.getModifier(sourceType);
+
+ src = createBufferedImage(size, size, content, srcType.type);
+ rsrc = src.getRaster();
+
+ ImageType dstType = (ImageType)env.getModifier(destinationType);
+ if (dstType == ImageType.COMPATIBLE_DST) {
+ dst = op_img.createCompatibleDestImage(src, null);
+ } else {
+ dst = createBufferedImage(size, size, content, dstType.type);
+ }
+ // raster always has to be comatible
+ rdst = op_rst.createCompatibleDestRaster(rsrc);
+ }
+ }
+
+ private static class ConvertImageTest extends ColorConvertOpTests {
+ public ConvertImageTest() {
+ super(opConvRoot, "op_img", "op.filetr(BufferedImage)");
+ }
+
+ public void runTest(Object octx, int numReps) {
+ final Context ctx = (Context)octx;
+ final ColorConvertOp op = ctx.op_img;
+
+ final BufferedImage src = ctx.src;
+ BufferedImage dst = ctx.dst;
+ do {
+ try {
+ dst = op.filter(src, dst);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class ConvertRasterTest extends ColorConvertOpTests {
+ public ConvertRasterTest() {
+ super(opConvRoot, "op_rst", "op.filetr(Raster)");
+ }
+
+ public void runTest(Object octx, int numReps) {
+ final Context ctx = (Context)octx;
+ final ColorConvertOp op = ctx.op_rst;
+
+ final Raster src = ctx.rsrc;
+ WritableRaster dst = ctx.rdst;
+ do {
+ try {
+ dst = op.filter(src, dst);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class DrawImageTest extends ColorConvertOpTests {
+ public DrawImageTest() {
+ super(opConvRoot, "op_draw", "drawImage(ColorConvertOp)");
+ }
+
+ public void runTest(Object octx, int numReps) {
+ final Context ctx = (Context)octx;
+ final ColorConvertOp op = ctx.op_img;
+
+ final Graphics2D g = ctx.graphics;
+
+ final BufferedImage src = ctx.src;
+
+ do {
+ g.drawImage(src, op, 0, 0);
+ } while (--numReps >= 0);
+ }
+ }
+
+ /**************************************************************************
+ ****** Helper routines
+ *************************************************************************/
+ protected static BufferedImage createBufferedImage(int width,
+ int height,
+ ImageContent contentType,
+ int type)
+ {
+ BufferedImage image;
+ image = new BufferedImage(width, height, type);
+ boolean hasAlpha = image.getColorModel().hasAlpha();
+ switch (contentType) {
+ case RANDOM:
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++) {
+ int rgb = (int)(Math.random() * 0xffffff);
+ if (hasAlpha) {
+ rgb |= 0x7f000000;
+ }
+ image.setRGB(x, y, rgb);
+ }
+ }
+ break;
+ case VECTOR:
+ {
+ Graphics2D g = image.createGraphics();
+ if (hasAlpha) {
+ // fill background with a translucent color
+ g.setComposite(AlphaComposite.getInstance(
+ AlphaComposite.SRC, 0.5f));
+ }
+ g.setColor(Color.blue);
+ g.fillRect(0, 0, width, height);
+ g.setComposite(AlphaComposite.Src);
+ g.setColor(Color.yellow);
+ g.fillOval(2, 2, width-4, height-4);
+ g.setColor(Color.red);
+ g.fillOval(4, 4, width-8, height-8);
+ g.setColor(Color.green);
+ g.fillRect(8, 8, width-16, height-16);
+ g.setColor(Color.white);
+ g.drawLine(0, 0, width, height);
+ g.drawLine(0, height, width, 0);
+ g.dispose();
+ break;
+ }
+ case PHOTO:
+ {
+ Image photo = null;
+ try {
+ photo = ImageIO.read(
+ IIOTests.class.getResourceAsStream("images/photo.jpg"));
+ } catch (Exception e) {
+ System.err.println("error loading photo");
+ e.printStackTrace();
+ }
+ Graphics2D g = image.createGraphics();
+ if (hasAlpha) {
+ g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC,
+ 0.5f));
+ }
+ g.drawImage(photo, 0, 0, width, height, null);
+ g.dispose();
+ break;
+ }
+ default:
+ break;
+ }
+
+ return image;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/DataConversionTests.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+
+public class DataConversionTests extends ColorConversionTests {
+
+ protected static Group dataConvRoot;
+
+ public static void init() {
+ dataConvRoot = new Group(colorConvRoot, "data", "Data Conversoion Tests");
+
+ new FromRGBTest();
+ new ToRGBTest();
+ new FromCIEXYZTest();
+ new ToCIEXYZTest();
+ }
+
+ public DataConversionTests(Group parent, String nodeName, String description) {
+ super(parent, nodeName, description);
+ }
+
+ protected static class Context {
+
+ ColorSpace cs;
+ int numComponents;
+ float[] val;
+ float[] rgb;
+ float[] cie;
+ TestEnvironment env;
+ Result res;
+
+ public Context(TestEnvironment env, Result result, ColorSpace cs) {
+ this.cs = cs;
+ this.env = env;
+ this.res = result;
+
+ numComponents = cs.getNumComponents();
+
+ val = new float[numComponents];
+
+ for (int i = 0; i < numComponents; i++) {
+ float min = cs.getMinValue(i);
+ float max = cs.getMaxValue(i);
+
+ val[i] = 0.5f * (max - min);
+ }
+
+ rgb = new float[]{0.5f, 0.5f, 0.5f};
+ cie = new float[]{0.5f, 0.5f, 0.5f};
+ }
+ }
+
+ @Override
+ public Object initTest(TestEnvironment env, Result result) {
+ ColorSpace cs = getColorSpace(env);
+ return new Context(env, result, cs);
+ }
+
+ @Override
+ public void cleanupTest(TestEnvironment te, Object o) {
+ }
+
+ private static class FromRGBTest extends DataConversionTests {
+
+ public FromRGBTest() {
+ super(dataConvRoot,
+ "fromRGB",
+ "ColorSpace.fromRGB()");
+ }
+
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ColorSpace cs = ictx.cs;
+
+ final float[] rgb = ictx.rgb;
+ do {
+ try {
+ cs.fromRGB(rgb);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class FromCIEXYZTest extends DataConversionTests {
+
+ public FromCIEXYZTest() {
+ super(dataConvRoot,
+ "fromCIEXYZ",
+ "ColorSpace.fromCIEXYZ()");
+ }
+
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ColorSpace cs = ictx.cs;
+
+ final float[] val = ictx.cie;
+ do {
+ try {
+ cs.fromCIEXYZ(val);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class ToCIEXYZTest extends DataConversionTests {
+
+ public ToCIEXYZTest() {
+ super(dataConvRoot,
+ "toCIEXYZ",
+ "ColorSpace.toCIEXYZ()");
+ }
+
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ColorSpace cs = ictx.cs;
+
+ final float[] val = ictx.val;
+
+ do {
+ try {
+ cs.toCIEXYZ(val);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class ToRGBTest extends DataConversionTests {
+
+ public ToRGBTest() {
+ super(dataConvRoot,
+ "toRGB",
+ "ColorSpace.toRGB()");
+ }
+
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ColorSpace cs = ictx.cs;
+
+ final float[] val = ictx.val;
+
+ do {
+ try {
+ cs.toRGB(val);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ProfileTests.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This source code is provided to illustrate the usage of a given feature
+ * or technique and has been deliberately simplified. Additional steps
+ * required for a production-quality application, such as security checks,
+ * input validation and proper error handling, might not be present in
+ * this sample code.
+ */
+package j2dbench.tests.cmm;
+
+import j2dbench.Group;
+import j2dbench.Result;
+import j2dbench.TestEnvironment;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+
+public class ProfileTests extends CMMTests {
+
+ protected static Group profileRoot;
+
+ public static void init() {
+ profileRoot = new Group(cmmRoot, "profiles", "Profile Handling Benchmarks");
+
+ new ReadHeaderTest();
+ new GetNumComponentsTest();
+ }
+
+ protected ProfileTests(Group parent, String nodeName, String description) {
+ super(parent, nodeName, description);
+ }
+
+ protected static class Context {
+
+ ICC_Profile profile;
+ TestEnvironment env;
+ Result res;
+
+ public Context(ICC_Profile profile, TestEnvironment env, Result res) {
+ this.profile = profile;
+ this.env = env;
+ this.res = res;
+ }
+ }
+
+ @Override
+ public Object initTest(TestEnvironment env, Result res) {
+ ICC_ColorSpace cs = (ICC_ColorSpace) getColorSpace(env);
+ return new Context(cs.getProfile(), env, res);
+ }
+
+ @Override
+ public void cleanupTest(TestEnvironment env, Object o) {
+ }
+
+ private static class ReadHeaderTest extends ProfileTests {
+
+ public ReadHeaderTest() {
+ super(profileRoot,
+ "getHeader",
+ "getData(icSigHead)");
+ }
+
+ @Override
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ICC_Profile profile = ictx.profile;
+
+ byte[] data = null;
+ do {
+ try {
+ data = profile.getData(ICC_Profile.icSigHead);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+
+ private static class GetNumComponentsTest extends ProfileTests {
+
+ public GetNumComponentsTest() {
+ super(profileRoot,
+ "getNumComponents",
+ "getNumComponents");
+ }
+
+ @Override
+ public void runTest(Object ctx, int numReps) {
+ final Context ictx = (Context) ctx;
+ final ICC_Profile profile = ictx.profile;
+
+ do {
+ try {
+ int num = profile.getNumComponents();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } while (--numReps >= 0);
+ }
+ }
+}
--- a/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c Fri Dec 28 18:28:39 2012 -0800
@@ -159,7 +159,8 @@
*/
JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
(JNIEnv *env, jclass cls, jlongArray profileIDs, jint renderType,
- jint inFormatter, jint outFormatter, jobject disposerRef)
+ jint inFormatter, jboolean isInIntPacked,
+ jint outFormatter, jboolean isOutIntPacked, jobject disposerRef)
{
cmsHPROFILE _iccArray[DF_ICC_BUF_SIZE];
cmsHPROFILE *iccArray = &_iccArray[0];
@@ -170,6 +171,16 @@
size = (*env)->GetArrayLength (env, profileIDs);
ids = (*env)->GetPrimitiveArrayCritical(env, profileIDs, 0);
+#ifdef _LITTLE_ENDIAN
+ /* Reversing data packed into int for LE archs */
+ if (isInIntPacked) {
+ inFormatter ^= DOSWAP_SH(1);
+ }
+ if (isOutIntPacked) {
+ outFormatter ^= DOSWAP_SH(1);
+ }
+#endif
+
if (DF_ICC_BUF_SIZE < size*2) {
iccArray = (cmsHPROFILE*) malloc(
size*2*sizeof(cmsHPROFILE));
@@ -567,7 +578,7 @@
(JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
{
storeID_t sTrans;
- int inFmt, outFmt, srcDType, dstDType;
+ int srcDType, dstDType;
int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
int width, height, i;
void* inputBuffer;
@@ -576,23 +587,13 @@
char* outputRow;
jobject srcData, dstData;
- inFmt = (*env)->GetIntField (env, src, IL_pixelType_fID);
- outFmt = (*env)->GetIntField (env, dst, IL_pixelType_fID);
srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
width = (*env)->GetIntField (env, src, IL_width_fID);
height = (*env)->GetIntField (env, src, IL_height_fID);
-#ifdef _LITTLE_ENDIAN
- /* Reversing data packed into int for LE archs */
- if ((*env)->GetBooleanField (env, src, IL_isIntPacked_fID) == JNI_TRUE) {
- inFmt ^= DOSWAP_SH(1);
- }
- if ((*env)->GetBooleanField (env, dst, IL_isIntPacked_fID) == JNI_TRUE) {
- outFmt ^= DOSWAP_SH(1);
- }
-#endif
+
sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
if (sTrans.xf == NULL) {
--- a/jdk/src/windows/native/sun/windows/awt_Debug.cpp Thu Dec 27 12:15:09 2012 -0800
+++ b/jdk/src/windows/native/sun/windows/awt_Debug.cpp Fri Dec 28 18:28:39 2012 -0800
@@ -147,6 +147,24 @@
DTrace_Shutdown();
}
+static jboolean isHeadless() {
+ jmethodID headlessFn;
+ JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+ jclass graphicsEnvClass = env->FindClass(
+ "java/awt/GraphicsEnvironment");
+
+ if (graphicsEnvClass != NULL) {
+ headlessFn = env->GetStaticMethodID(
+ graphicsEnvClass, "isHeadless", "()Z");
+ if (headlessFn != NULL) {
+ return env->CallStaticBooleanMethod(graphicsEnvClass,
+ headlessFn);
+ }
+ }
+ return true;
+}
+
+
void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int line) {
static const int ASSERT_MSG_SIZE = 1024;
static const char * AssertFmt =
@@ -158,7 +176,8 @@
static char assertMsg[ASSERT_MSG_SIZE+1];
DWORD lastError = GetLastError();
LPSTR msgBuffer = NULL;
- int ret;
+ int ret = IDNO;
+ static jboolean headless = isHeadless();
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
@@ -183,8 +202,11 @@
fprintf(stderr, "*********************\n");
fprintf(stderr, "%s\n", assertMsg);
fprintf(stderr, "*********************\n");
- ret = MessageBoxA(NULL, assertMsg, "AWT Assertion Failure",
- MB_YESNO|MB_ICONSTOP|MB_TASKMODAL);
+
+ if (!headless) {
+ ret = MessageBoxA(NULL, assertMsg, "AWT Assertion Failure",
+ MB_YESNO|MB_ICONSTOP|MB_TASKMODAL);
+ }
// if clicked Yes, break into the debugger
if ( ret == IDYES ) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/cmm/ColorConvertOp/GrayTest.java Fri Dec 28 18:28:39 2012 -0800
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2012, 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 7124245
+ * @summary Test verifies that color conversion does not distort
+ * colors in destination image of standard type.
+ *
+ * @run main GrayTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.color.ColorSpace;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorConvertOp;
+
+public class GrayTest {
+ public static void main(String[] args) {
+ GrayTest t = new GrayTest();
+
+ t.doTest(BufferedImage.TYPE_INT_RGB);
+ t.doTest(BufferedImage.TYPE_INT_BGR);
+ t.doTest(BufferedImage.TYPE_INT_ARGB);
+ t.doTest(BufferedImage.TYPE_3BYTE_BGR);
+ t.doTest(BufferedImage.TYPE_4BYTE_ABGR);
+ System.out.println("Test passed.");
+ }
+
+ private static final int w = 3;
+ private static final int h = 3;
+
+ private BufferedImage src;
+ private BufferedImage dst;
+
+ private ColorConvertOp op;
+
+ public GrayTest() {
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+ op = new ColorConvertOp(cs, null);
+ }
+
+ private void render(Graphics2D g) {
+ g.setColor(Color.red);
+ g.fillRect(0, 0, w, h);
+ }
+
+ private BufferedImage initImage(int type) {
+ BufferedImage img = new BufferedImage(w, h, type);
+ Graphics2D g = img.createGraphics();
+
+ render(g);
+
+ g.dispose();
+
+ return img;
+ }
+
+ public void doTest(int type) {
+ System.out.println("Test for type: " + type);
+ src = initImage(type);
+
+ dst = initImage(type);
+
+ dst = op.filter(src, dst);
+
+ int pixel = dst.getRGB(1, 1);
+ int r = 0xff & (pixel >> 16);
+ int g = 0xff & (pixel >> 8);
+ int b = 0xff & (pixel );
+
+ System.out.printf("dst: r:%02x, g: %02x, %02x\n",
+ r, g, b);
+
+ if (r != g || r != b) {
+ String msg = String.format("Invalid pixel: %08x", pixel);
+ throw new RuntimeException(msg);
+ }
+ System.out.println("Done.");
+ }
+}