DWORD ScLcmsColorMgmtEngineImpl::translateFormatToLcmsFormat(eColorFormat format) { DWORD lFormat = 0; if (format == Format_RGB_8) lFormat = TYPE_RGB_8; if (format == Format_RGB_16) lFormat = TYPE_RGB_16; if (format == Format_RGBA_8) lFormat = TYPE_RGBA_8; if (format == Format_RGBA_16) lFormat = TYPE_RGBA_16; if (format == Format_ARGB_8) lFormat = TYPE_ARGB_8; if (format == Format_ARGB_16) lFormat = TYPE_ARGB_16; if (format == Format_BGRA_8) lFormat = TYPE_BGRA_8; if (format == Format_BGRA_16) lFormat = TYPE_BGRA_16; if (format == Format_CMYK_8) lFormat = TYPE_CMYK_8; if (format == Format_CMYK_16) lFormat = TYPE_CMYK_16; if (format == Format_CMYKA_8) lFormat = (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)); if (format == Format_CMYKA_16) lFormat = (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(2)); if (format == Format_YMCK_8) lFormat = (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)); if (format == Format_YMCK_16) lFormat = (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)); if (format == Format_GRAY_8) lFormat = TYPE_GRAY_8; if (format == Format_GRAY_16) lFormat = TYPE_GRAY_16; if (format == Format_LabA_8) lFormat = COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1); return lFormat; }
/* * Class: sun_java2d_cmm_lcms_LCMS * Method: colorConvert * Signature: (Lsun/java2d/cmm/lcms/LCMSTransform;Lsun/java2d/cmm/lcms/LCMSImageLayout;Lsun/java2d/cmm/lcms/LCMSImageLayout;)V */ JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst) { storeID_t sTrans; int size, inFmt, outFmt, srcDType, dstDType, outSize, renderType; int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset; int width, height, i; void* inputBuffer; void* outputBuffer; char* inputRow; 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); cmsChangeBuffersFormat(sTrans.xf, inFmt, outFmt); if (sTrans.xf == NULL) { J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL"); JNU_ThrowByName(env, "java/awt/color/CMMException", "Cannot get color transform"); return; } inputBuffer = getILData (env, src, &srcDType, &srcData); if (inputBuffer == NULL) { J2dRlsTraceLn(J2D_TRACE_ERROR, ""); JNU_ThrowByName(env, "java/awt/color/CMMException", "Cannot get input data"); return; } outputBuffer = getILData (env, dst, &dstDType, &dstData); if (outputBuffer == NULL) { releaseILData(env, inputBuffer, srcDType, srcData); JNU_ThrowByName(env, "java/awt/color/CMMException", "Cannot get output data"); return; } inputRow = (char*)inputBuffer + srcOffset; outputRow = (char*)outputBuffer + dstOffset; for (i = 0; i < height; i++) { cmsDoTransform(sTrans.xf, inputRow, outputRow, width); inputRow += srcNextRowOffset; outputRow += dstNextRowOffset; } releaseILData(env, inputBuffer, srcDType, srcData); releaseILData(env, outputBuffer, dstDType, dstData); }