src/share/native/sun/java2d/cmm/lcms/LCMS.c

Print this page




 100     jobject jobj;
 101     jlong j;
 102 } storeID_t, *storeID_p;
 103 
 104 typedef union {
 105     cmsTagSignature cms;
 106     jint j;
 107 } TagSignature_t, *TagSignature_p;
 108 
 109 static jfieldID Trans_profileIDs_fID;
 110 static jfieldID Trans_renderType_fID;
 111 static jfieldID Trans_ID_fID;
 112 static jfieldID IL_isIntPacked_fID;
 113 static jfieldID IL_dataType_fID;
 114 static jfieldID IL_pixelType_fID;
 115 static jfieldID IL_dataArray_fID;
 116 static jfieldID IL_offset_fID;
 117 static jfieldID IL_nextRowOffset_fID;
 118 static jfieldID IL_width_fID;
 119 static jfieldID IL_height_fID;

 120 static jfieldID PF_ID_fID;
 121 
 122 JavaVM *javaVM;
 123 
 124 void errorHandler(cmsContext ContextID, cmsUInt32Number errorCode,
 125                   const char *errorText) {
 126     JNIEnv *env;
 127     char errMsg[ERR_MSG_SIZE];
 128 
 129     int count = snprintf(errMsg, ERR_MSG_SIZE,
 130                           "LCMS error %d: %s", errorCode, errorText);
 131     if (count < 0 || count >= ERR_MSG_SIZE) {
 132         count = ERR_MSG_SIZE - 1;
 133     }
 134     errMsg[count] = 0;
 135 
 136     (*javaVM)->AttachCurrentThread(javaVM, (void**)&env, NULL);
 137     JNU_ThrowByName(env, "java/awt/color/CMMException", errMsg);
 138 }
 139 


 569     }
 570 }
 571 
 572 /*
 573  * Class:     sun_java2d_cmm_lcms_LCMS
 574  * Method:    colorConvert
 575  * Signature: (Lsun/java2d/cmm/lcms/LCMSTransform;Lsun/java2d/cmm/lcms/LCMSImageLayout;Lsun/java2d/cmm/lcms/LCMSImageLayout;)V
 576  */
 577 JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
 578   (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
 579 {
 580     storeID_t sTrans;
 581     int srcDType, dstDType;
 582     int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
 583     int width, height, i;
 584     void* inputBuffer;
 585     void* outputBuffer;
 586     char* inputRow;
 587     char* outputRow;
 588     jobject srcData, dstData;

 589 
 590     srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
 591     srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
 592     dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
 593     dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
 594     width = (*env)->GetIntField (env, src, IL_width_fID);
 595     height = (*env)->GetIntField (env, src, IL_height_fID);
 596 



 597     sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
 598 
 599     if (sTrans.xf == NULL) {
 600         J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
 601         JNU_ThrowByName(env, "java/awt/color/CMMException",
 602                         "Cannot get color transform");
 603         return;
 604     }
 605 
 606 
 607     inputBuffer = getILData (env, src, &srcDType, &srcData);
 608 
 609     if (inputBuffer == NULL) {
 610         J2dRlsTraceLn(J2D_TRACE_ERROR, "");
 611         JNU_ThrowByName(env, "java/awt/color/CMMException",
 612                         "Cannot get input data");
 613         return;
 614     }
 615 
 616     outputBuffer = getILData (env, dst, &dstDType, &dstData);
 617 
 618     if (outputBuffer == NULL) {
 619         releaseILData(env, inputBuffer, srcDType, srcData);
 620         JNU_ThrowByName(env, "java/awt/color/CMMException",
 621                         "Cannot get output data");
 622         return;
 623     }
 624 
 625     inputRow = (char*)inputBuffer + srcOffset;
 626     outputRow = (char*)outputBuffer + dstOffset;
 627 



 628     for (i = 0; i < height; i++) {
 629         cmsDoTransform(sTrans.xf, inputRow, outputRow, width);
 630         inputRow += srcNextRowOffset;
 631         outputRow += dstNextRowOffset;
 632     }

 633 
 634     releaseILData(env, inputBuffer, srcDType, srcData);
 635     releaseILData(env, outputBuffer, dstDType, dstData);
 636 }
 637 
 638 /*
 639  * Class:     sun_java2d_cmm_lcms_LCMS
 640  * Method:    getProfileID
 641  * Signature: (Ljava/awt/color/ICC_Profile;)J
 642  */
 643 JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
 644   (JNIEnv *env, jclass cls, jobject pf)
 645 {
 646     return (*env)->GetLongField (env, pf, PF_ID_fID);
 647 }
 648 
 649 /*
 650  * Class:     sun_java2d_cmm_lcms_LCMS
 651  * Method:    initLCMS
 652  * Signature: (Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V
 653  */
 654 JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS
 655   (JNIEnv *env, jclass cls, jclass Trans, jclass IL, jclass Pf)
 656 {
 657     /* TODO: move initialization of the IDs to the static blocks of
 658      * corresponding classes to avoid problems with invalidating ids by class
 659      * unloading
 660      */
 661     Trans_profileIDs_fID = (*env)->GetFieldID (env, Trans, "profileIDs", "[J");
 662     Trans_renderType_fID = (*env)->GetFieldID (env, Trans, "renderType", "I");
 663     Trans_ID_fID = (*env)->GetFieldID (env, Trans, "ID", "J");
 664 
 665     IL_isIntPacked_fID = (*env)->GetFieldID (env, IL, "isIntPacked", "Z");
 666     IL_dataType_fID = (*env)->GetFieldID (env, IL, "dataType", "I");
 667     IL_pixelType_fID = (*env)->GetFieldID (env, IL, "pixelType", "I");
 668     IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
 669                                           "Ljava/lang/Object;");
 670     IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
 671     IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
 672     IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");

 673     IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
 674 
 675     PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
 676 }
 677 
 678 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
 679 {
 680   cmsUInt32Number pfSize = 0;
 681   cmsUInt8Number* pfBuffer = NULL;
 682   cmsBool status = FALSE;
 683 
 684   if (!cmsSaveProfileToMem(pf, NULL, &pfSize) ||
 685       pfSize < sizeof(cmsICCHeader) ||
 686       bufferSize < sizeof(cmsICCHeader))
 687   {
 688     return FALSE;
 689   }
 690 
 691   pfBuffer = malloc(pfSize);
 692   if (pfBuffer == NULL) {




 100     jobject jobj;
 101     jlong j;
 102 } storeID_t, *storeID_p;
 103 
 104 typedef union {
 105     cmsTagSignature cms;
 106     jint j;
 107 } TagSignature_t, *TagSignature_p;
 108 
 109 static jfieldID Trans_profileIDs_fID;
 110 static jfieldID Trans_renderType_fID;
 111 static jfieldID Trans_ID_fID;
 112 static jfieldID IL_isIntPacked_fID;
 113 static jfieldID IL_dataType_fID;
 114 static jfieldID IL_pixelType_fID;
 115 static jfieldID IL_dataArray_fID;
 116 static jfieldID IL_offset_fID;
 117 static jfieldID IL_nextRowOffset_fID;
 118 static jfieldID IL_width_fID;
 119 static jfieldID IL_height_fID;
 120 static jfieldID IL_imageAtOnce_fID;
 121 static jfieldID PF_ID_fID;
 122 
 123 JavaVM *javaVM;
 124 
 125 void errorHandler(cmsContext ContextID, cmsUInt32Number errorCode,
 126                   const char *errorText) {
 127     JNIEnv *env;
 128     char errMsg[ERR_MSG_SIZE];
 129 
 130     int count = snprintf(errMsg, ERR_MSG_SIZE,
 131                           "LCMS error %d: %s", errorCode, errorText);
 132     if (count < 0 || count >= ERR_MSG_SIZE) {
 133         count = ERR_MSG_SIZE - 1;
 134     }
 135     errMsg[count] = 0;
 136 
 137     (*javaVM)->AttachCurrentThread(javaVM, (void**)&env, NULL);
 138     JNU_ThrowByName(env, "java/awt/color/CMMException", errMsg);
 139 }
 140 


 570     }
 571 }
 572 
 573 /*
 574  * Class:     sun_java2d_cmm_lcms_LCMS
 575  * Method:    colorConvert
 576  * Signature: (Lsun/java2d/cmm/lcms/LCMSTransform;Lsun/java2d/cmm/lcms/LCMSImageLayout;Lsun/java2d/cmm/lcms/LCMSImageLayout;)V
 577  */
 578 JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_colorConvert
 579   (JNIEnv *env, jclass obj, jobject trans, jobject src, jobject dst)
 580 {
 581     storeID_t sTrans;
 582     int srcDType, dstDType;
 583     int srcOffset, srcNextRowOffset, dstOffset, dstNextRowOffset;
 584     int width, height, i;
 585     void* inputBuffer;
 586     void* outputBuffer;
 587     char* inputRow;
 588     char* outputRow;
 589     jobject srcData, dstData;
 590     jboolean srcAtOnce = JNI_FALSE, dstAtOnce = JNI_FALSE;
 591 
 592     srcOffset = (*env)->GetIntField (env, src, IL_offset_fID);
 593     srcNextRowOffset = (*env)->GetIntField (env, src, IL_nextRowOffset_fID);
 594     dstOffset = (*env)->GetIntField (env, dst, IL_offset_fID);
 595     dstNextRowOffset = (*env)->GetIntField (env, dst, IL_nextRowOffset_fID);
 596     width = (*env)->GetIntField (env, src, IL_width_fID);
 597     height = (*env)->GetIntField (env, src, IL_height_fID);
 598 
 599     srcAtOnce = (*env)->GetBooleanField(env, src, IL_imageAtOnce_fID);
 600     dstAtOnce = (*env)->GetBooleanField(env, dst, IL_imageAtOnce_fID);
 601 
 602     sTrans.j = (*env)->GetLongField (env, trans, Trans_ID_fID);
 603 
 604     if (sTrans.xf == NULL) {
 605         J2dRlsTraceLn(J2D_TRACE_ERROR, "LCMS_colorConvert: transform == NULL");
 606         JNU_ThrowByName(env, "java/awt/color/CMMException",
 607                         "Cannot get color transform");
 608         return;
 609     }
 610 
 611 
 612     inputBuffer = getILData (env, src, &srcDType, &srcData);
 613 
 614     if (inputBuffer == NULL) {
 615         J2dRlsTraceLn(J2D_TRACE_ERROR, "");
 616         JNU_ThrowByName(env, "java/awt/color/CMMException",
 617                         "Cannot get input data");
 618         return;
 619     }
 620 
 621     outputBuffer = getILData (env, dst, &dstDType, &dstData);
 622 
 623     if (outputBuffer == NULL) {
 624         releaseILData(env, inputBuffer, srcDType, srcData);
 625         JNU_ThrowByName(env, "java/awt/color/CMMException",
 626                         "Cannot get output data");
 627         return;
 628     }
 629 
 630     inputRow = (char*)inputBuffer + srcOffset;
 631     outputRow = (char*)outputBuffer + dstOffset;
 632 
 633     if (srcAtOnce && dstAtOnce) {
 634         cmsDoTransform(sTrans.xf, inputRow, outputRow, width * height);
 635     } else {
 636         for (i = 0; i < height; i++) {
 637             cmsDoTransform(sTrans.xf, inputRow, outputRow, width);
 638             inputRow += srcNextRowOffset;
 639             outputRow += dstNextRowOffset;
 640         }
 641     }
 642 
 643     releaseILData(env, inputBuffer, srcDType, srcData);
 644     releaseILData(env, outputBuffer, dstDType, dstData);
 645 }
 646 
 647 /*
 648  * Class:     sun_java2d_cmm_lcms_LCMS
 649  * Method:    getProfileID
 650  * Signature: (Ljava/awt/color/ICC_Profile;)J
 651  */
 652 JNIEXPORT jlong JNICALL Java_sun_java2d_cmm_lcms_LCMS_getProfileID
 653   (JNIEnv *env, jclass cls, jobject pf)
 654 {
 655     return (*env)->GetLongField (env, pf, PF_ID_fID);
 656 }
 657 
 658 /*
 659  * Class:     sun_java2d_cmm_lcms_LCMS
 660  * Method:    initLCMS
 661  * Signature: (Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/Class;)V
 662  */
 663 JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_initLCMS
 664   (JNIEnv *env, jclass cls, jclass Trans, jclass IL, jclass Pf)
 665 {
 666     /* TODO: move initialization of the IDs to the static blocks of
 667      * corresponding classes to avoid problems with invalidating ids by class
 668      * unloading
 669      */
 670     Trans_profileIDs_fID = (*env)->GetFieldID (env, Trans, "profileIDs", "[J");
 671     Trans_renderType_fID = (*env)->GetFieldID (env, Trans, "renderType", "I");
 672     Trans_ID_fID = (*env)->GetFieldID (env, Trans, "ID", "J");
 673 
 674     IL_isIntPacked_fID = (*env)->GetFieldID (env, IL, "isIntPacked", "Z");
 675     IL_dataType_fID = (*env)->GetFieldID (env, IL, "dataType", "I");
 676     IL_pixelType_fID = (*env)->GetFieldID (env, IL, "pixelType", "I");
 677     IL_dataArray_fID = (*env)->GetFieldID(env, IL, "dataArray",
 678                                           "Ljava/lang/Object;");
 679     IL_width_fID = (*env)->GetFieldID (env, IL, "width", "I");
 680     IL_height_fID = (*env)->GetFieldID (env, IL, "height", "I");
 681     IL_offset_fID = (*env)->GetFieldID (env, IL, "offset", "I");
 682     IL_imageAtOnce_fID = (*env)->GetFieldID (env, IL, "imageAtOnce", "Z");
 683     IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I");
 684 
 685     PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J");
 686 }
 687 
 688 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
 689 {
 690   cmsUInt32Number pfSize = 0;
 691   cmsUInt8Number* pfBuffer = NULL;
 692   cmsBool status = FALSE;
 693 
 694   if (!cmsSaveProfileToMem(pf, NULL, &pfSize) ||
 695       pfSize < sizeof(cmsICCHeader) ||
 696       bufferSize < sizeof(cmsICCHeader))
 697   {
 698     return FALSE;
 699   }
 700 
 701   pfBuffer = malloc(pfSize);
 702   if (pfBuffer == NULL) {