src/share/native/sun/java2d/cmm/lcms/LCMS.c
Print this page
*** 115,124 ****
--- 115,125 ----
static jfieldID IL_dataArray_fID;
static jfieldID IL_offset_fID;
static jfieldID IL_nextRowOffset_fID;
static jfieldID IL_width_fID;
static jfieldID IL_height_fID;
+ static jfieldID IL_imageAtOnce_fID;
static jfieldID PF_ID_fID;
JavaVM *javaVM;
void errorHandler(cmsContext ContextID, cmsUInt32Number errorCode,
*** 235,245 ****
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: loadProfile
* Signature: ([B)J
*/
! JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfile
(JNIEnv *env, jobject obj, jbyteArray data)
{
jbyte* dataArray;
jint dataSize;
storeID_t sProf;
--- 236,246 ----
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: loadProfile
* Signature: ([B)J
*/
! JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_loadProfileNative
(JNIEnv *env, jobject obj, jbyteArray data)
{
jbyte* dataArray;
jint dataSize;
storeID_t sProf;
*** 282,292 ****
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: freeProfile
* Signature: (J)V
*/
! JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_freeProfile
(JNIEnv *env, jobject obj, jlong id)
{
storeID_t sProf;
sProf.j = id;
--- 283,293 ----
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: freeProfile
* Signature: (J)V
*/
! JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_freeProfileNative
(JNIEnv *env, jobject obj, jlong id)
{
storeID_t sProf;
sProf.j = id;
*** 401,432 ****
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: getTagData
* Signature: (JI[B)V
*/
! JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagData
! (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
{
storeID_t sProf;
TagSignature_t sig;
cmsInt32Number tagSize;
! jbyte* dataArray;
jint bufSize;
sProf.j = id;
sig.j = tagSig;
if (tagSig == SigHead) {
cmsBool status;
! bufSize =(*env)->GetArrayLength(env, data);
! if (bufSize < sizeof(cmsICCHeader)) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
! "Insufficient buffer capacity");
! return;
}
dataArray = (*env)->GetByteArrayElements (env, data, 0);
if (dataArray == NULL) {
--- 402,436 ----
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: getTagData
* Signature: (JI[B)V
*/
! JNIEXPORT jbyteArray JNICALL Java_sun_java2d_cmm_lcms_LCMS_getTagNative
! (JNIEnv *env, jobject obj, jlong id, jint tagSig)
{
storeID_t sProf;
TagSignature_t sig;
cmsInt32Number tagSize;
! jbyte* dataArray = NULL;
! jbyteArray data = NULL;
!
jint bufSize;
sProf.j = id;
sig.j = tagSig;
if (tagSig == SigHead) {
cmsBool status;
! // allocate java array
! data = (*env)->NewByteArray(env, sizeof(cmsICCHeader));
! if (data == NULL) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
! "Unable to allocate buffer");
! return NULL;
}
dataArray = (*env)->GetByteArrayElements (env, data, 0);
if (dataArray == NULL) {
*** 440,496 ****
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
if (!status) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"ICC Profile header not found");
}
! return;
}
if (cmsIsTag(sProf.pf, sig.cms)) {
tagSize = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0);
} else {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"ICC profile tag not found");
! return;
}
! // verify data buffer capacity
! bufSize = (*env)->GetArrayLength(env, data);
!
! if (tagSize < 0 || 0 > bufSize || tagSize > bufSize) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
! "Insufficient buffer capacity.");
! return;
}
dataArray = (*env)->GetByteArrayElements (env, data, 0);
if (dataArray == NULL) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"Unable to get buffer");
! return;
}
bufSize = cmsReadRawTag(sProf.pf, sig.cms, dataArray, tagSize);
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
if (bufSize != tagSize) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"Can not get tag data.");
}
! return;
}
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: setTagData
* Signature: (JI[B)V
*/
! JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData
(JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
{
storeID_t sProf;
TagSignature_t sig;
cmsBool status;
--- 444,501 ----
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
if (!status) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"ICC Profile header not found");
+ return NULL;
}
! return data;
}
if (cmsIsTag(sProf.pf, sig.cms)) {
tagSize = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0);
} else {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"ICC profile tag not found");
! return NULL;
}
! // allocate java array
! data = (*env)->NewByteArray(env, tagSize);
! if (data == NULL) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
! "Unable to allocate buffer");
! return NULL;
}
dataArray = (*env)->GetByteArrayElements (env, data, 0);
if (dataArray == NULL) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"Unable to get buffer");
! return NULL;
}
bufSize = cmsReadRawTag(sProf.pf, sig.cms, dataArray, tagSize);
(*env)->ReleaseByteArrayElements (env, data, dataArray, 0);
if (bufSize != tagSize) {
JNU_ThrowByName(env, "java/awt/color/CMMException",
"Can not get tag data.");
+ return NULL;
}
! return data;
}
/*
* Class: sun_java2d_cmm_lcms_LCMS
* Method: setTagData
* Signature: (JI[B)V
*/
! JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagDataNative
(JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data)
{
storeID_t sProf;
TagSignature_t sig;
cmsBool status;
*** 584,601 ****
--- 589,610 ----
void* inputBuffer;
void* outputBuffer;
char* inputRow;
char* outputRow;
jobject srcData, dstData;
+ jboolean srcAtOnce = JNI_FALSE, dstAtOnce = JNI_FALSE;
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);
+ srcAtOnce = (*env)->GetBooleanField(env, src, IL_imageAtOnce_fID);
+ dstAtOnce = (*env)->GetBooleanField(env, dst, IL_imageAtOnce_fID);
+
sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
if (sTrans.xf == NULL) {
J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
JNU_ThrowByName(env, "java/awt/color/CMMException",
*** 623,637 ****
--- 632,650 ----
}
inputRow = (char*)inputBuffer + srcOffset;
outputRow = (char*)outputBuffer + dstOffset;
+ if (srcAtOnce && dstAtOnce) {
+ cmsDoTransform(sTrans.xf, inputRow, outputRow, width * height);
+ } else {
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);
}
*** 668,677 ****
--- 681,691 ----
IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
"Ljava/lang/Object;");
IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");
+ IL_imageAtOnce_fID = (*env)->GetFieldID (env, IL, "imageAtOnce", "Z");
IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
}