提交 fb441757 编写于 作者: L lana

Merge

...@@ -53,7 +53,9 @@ public class LCMS implements PCMM { ...@@ -53,7 +53,9 @@ public class LCMS implements PCMM {
public static native long getProfileID(ICC_Profile profile); public static native long getProfileID(ICC_Profile profile);
public static native long createNativeTransform( 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); Object disposerRef);
/** /**
......
...@@ -196,7 +196,8 @@ class LCMSImageLayout { ...@@ -196,7 +196,8 @@ class LCMSImageLayout {
case BufferedImage.TYPE_4BYTE_ABGR: case BufferedImage.TYPE_4BYTE_ABGR:
byteRaster = (ByteComponentRaster)image.getRaster(); byteRaster = (ByteComponentRaster)image.getRaster();
nextRowOffset = byteRaster.getScanlineStride(); nextRowOffset = byteRaster.getScanlineStride();
offset = byteRaster.getDataOffset(0); int firstBand = image.getSampleModel().getNumBands() - 1;
offset = byteRaster.getDataOffset(firstBand);
dataArray = byteRaster.getDataStorage(); dataArray = byteRaster.getDataStorage();
dataType = DT_BYTE; dataType = DT_BYTE;
break; break;
......
...@@ -55,8 +55,10 @@ import sun.java2d.cmm.lcms.*; ...@@ -55,8 +55,10 @@ import sun.java2d.cmm.lcms.*;
public class LCMSTransform implements ColorTransform { public class LCMSTransform implements ColorTransform {
long ID; long ID;
private int inFormatter; private int inFormatter = 0;
private int outFormatter; private boolean isInIntPacked = false;
private int outFormatter = 0;
private boolean isOutIntPacked = false;
ICC_Profile[] profiles; ICC_Profile[] profiles;
long [] profileIDs; long [] profileIDs;
...@@ -135,18 +137,23 @@ public class LCMSTransform implements ColorTransform { ...@@ -135,18 +137,23 @@ public class LCMSTransform implements ColorTransform {
LCMSImageLayout out) { LCMSImageLayout out) {
// update native transfrom if needed // update native transfrom if needed
if (ID == 0L || if (ID == 0L ||
inFormatter != in.pixelType || inFormatter != in.pixelType || isInIntPacked != in.isIntPacked ||
outFormatter != out.pixelType) { outFormatter != out.pixelType || isOutIntPacked != out.isIntPacked)
{
if (ID != 0L) { if (ID != 0L) {
// Disposer will destroy forgotten transform // Disposer will destroy forgotten transform
disposerReferent = new Object(); disposerReferent = new Object();
} }
inFormatter = in.pixelType; inFormatter = in.pixelType;
isInIntPacked = in.isIntPacked;
outFormatter = out.pixelType; outFormatter = out.pixelType;
isOutIntPacked = out.isIntPacked;
ID = LCMS.createNativeTransform(profileIDs, renderType, ID = LCMS.createNativeTransform(profileIDs, renderType,
inFormatter, outFormatter, inFormatter, isInIntPacked,
outFormatter, isOutIntPacked,
disposerReferent); disposerReferent);
} }
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
<target name="compile" depends="init" <target name="compile" depends="init"
description="compile the source " > description="compile the source " >
<!-- Compile the java code from ${src} into ${build} --> <!-- 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>
<target name="run" depends="dist" <target name="run" depends="dist"
......
...@@ -69,6 +69,7 @@ import j2dbench.tests.MiscTests; ...@@ -69,6 +69,7 @@ import j2dbench.tests.MiscTests;
import j2dbench.tests.RenderTests; import j2dbench.tests.RenderTests;
import j2dbench.tests.PixelTests; import j2dbench.tests.PixelTests;
import j2dbench.tests.iio.IIOTests; import j2dbench.tests.iio.IIOTests;
import j2dbench.tests.cmm.CMMTests;
import j2dbench.tests.text.TextConstructionTests; import j2dbench.tests.text.TextConstructionTests;
import j2dbench.tests.text.TextMeasureTests; import j2dbench.tests.text.TextMeasureTests;
import j2dbench.tests.text.TextRenderTests; import j2dbench.tests.text.TextRenderTests;
...@@ -199,6 +200,7 @@ public class J2DBench { ...@@ -199,6 +200,7 @@ public class J2DBench {
TextMeasureTests.init(); TextMeasureTests.init();
TextConstructionTests.init(); TextConstructionTests.init();
IIOTests.init(); IIOTests.init();
CMMTests.init();
boolean gui = true; boolean gui = true;
boolean showresults = true; boolean showresults = true;
......
/*
* 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.");
}
}
/*
* 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);
}
}
/*
* 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;
}
}
/*
* 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);
}
}
}
/*
* 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);
}
}
}
...@@ -159,7 +159,8 @@ void LCMS_freeTransform(JNIEnv *env, jlong ID) ...@@ -159,7 +159,8 @@ void LCMS_freeTransform(JNIEnv *env, jlong ID)
*/ */
JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
(JNIEnv *env, jclass cls, jlongArray profileIDs, jint renderType, (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[DF_ICC_BUF_SIZE];
cmsHPROFILE *iccArray = &_iccArray[0]; cmsHPROFILE *iccArray = &_iccArray[0];
...@@ -170,6 +171,16 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform ...@@ -170,6 +171,16 @@ JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_createNativeTransform
size = (*env)->GetArrayLength (env, profileIDs); size = (*env)->GetArrayLength (env, profileIDs);
ids = (*env)->GetPrimitiveArrayCritical(env, profileIDs, 0); 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) { if (DF_ICC_BUF_SIZE < size*2) {
iccArray = (cmsHPROFILE*) malloc( iccArray = (cmsHPROFILE*) malloc(
size*2*sizeof(cmsHPROFILE)); size*2*sizeof(cmsHPROFILE));
...@@ -567,7 +578,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert ...@@ -567,7 +578,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
(JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst) (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
{ {
storeID_t sTrans; storeID_t sTrans;
int inFmt, outFmt, srcDType, dstDType; int srcDType, dstDType;
int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset; int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
int width, height, i; int width, height, i;
void* inputBuffer; void* inputBuffer;
...@@ -576,23 +587,13 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert ...@@ -576,23 +587,13 @@ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
char* outputRow; char* outputRow;
jobject srcData, dstData; 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); srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID); srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID); dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID); dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
width = (*env)->GetIntField (env, src, IL_width_fID); width = (*env)->GetIntField (env, src, IL_width_fID);
height = (*env)->GetIntField (env, src, IL_height_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); sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
if (sTrans.xf == NULL) { if (sTrans.xf == NULL) {
......
...@@ -147,6 +147,24 @@ AwtDebugSupport::~AwtDebugSupport() { ...@@ -147,6 +147,24 @@ AwtDebugSupport::~AwtDebugSupport() {
DTrace_Shutdown(); 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) { void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int line) {
static const int ASSERT_MSG_SIZE = 1024; static const int ASSERT_MSG_SIZE = 1024;
static const char * AssertFmt = static const char * AssertFmt =
...@@ -158,7 +176,8 @@ void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int l ...@@ -158,7 +176,8 @@ void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int l
static char assertMsg[ASSERT_MSG_SIZE+1]; static char assertMsg[ASSERT_MSG_SIZE+1];
DWORD lastError = GetLastError(); DWORD lastError = GetLastError();
LPSTR msgBuffer = NULL; LPSTR msgBuffer = NULL;
int ret; int ret = IDNO;
static jboolean headless = isHeadless();
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_SYSTEM |
...@@ -183,8 +202,11 @@ void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int l ...@@ -183,8 +202,11 @@ void AwtDebugSupport::AssertCallback(const char * expr, const char * file, int l
fprintf(stderr, "*********************\n"); fprintf(stderr, "*********************\n");
fprintf(stderr, "%s\n", assertMsg); fprintf(stderr, "%s\n", assertMsg);
fprintf(stderr, "*********************\n"); 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 clicked Yes, break into the debugger
if ( ret == IDYES ) { if ( ret == IDYES ) {
......
/*
* 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.");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册