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) {
|