# HG changeset patch # User lana # Date 1356748119 28800 # Node ID cc1e1dd567c06927b1d577a1d393135e69a086ff # Parent ec916d926e0e77be7b7360102ea65955156a16d7# Parent ef6e0146b7780c515c53dbd0d681135f30cfbbaa Merge diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/classes/sun/java2d/cmm/lcms/LCMS.java --- 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); /** diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSImageLayout.java --- 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; diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/classes/sun/java2d/cmm/lcms/LCMSTransform.java --- 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); } diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/demo/java2d/J2DBench/build.xml --- 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 @@ - + = 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; + } +} diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/DataConversionTests.java --- /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); + } + } +} diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/demo/java2d/J2DBench/src/j2dbench/tests/cmm/ProfileTests.java --- /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); + } + } +} diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c --- 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) { diff -r ec916d926e0e -r cc1e1dd567c0 jdk/src/windows/native/sun/windows/awt_Debug.cpp --- 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 ) { diff -r ec916d926e0e -r cc1e1dd567c0 jdk/test/sun/java2d/cmm/ColorConvertOp/GrayTest.java --- /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."); + } +}