231 { |
231 { |
232 jbyte* dataArray; |
232 jbyte* dataArray; |
233 jint dataSize; |
233 jint dataSize; |
234 storeID_t sProf; |
234 storeID_t sProf; |
235 |
235 |
|
236 if (JNU_IsNull(env, data)) { |
|
237 JNU_ThrowIllegalArgumentException(env, "Invalid profile data"); |
|
238 return 0L; |
|
239 } |
|
240 |
236 dataArray = (*env)->GetByteArrayElements (env, data, 0); |
241 dataArray = (*env)->GetByteArrayElements (env, data, 0); |
237 dataSize = (*env)->GetArrayLength (env, data); |
242 dataSize = (*env)->GetArrayLength (env, data); |
|
243 |
|
244 if (dataArray == NULL) { |
|
245 JNU_ThrowIllegalArgumentException(env, "Invalid profile data"); |
|
246 return 0L; |
|
247 } |
238 |
248 |
239 sProf.pf = cmsOpenProfileFromMem((const void *)dataArray, |
249 sProf.pf = cmsOpenProfileFromMem((const void *)dataArray, |
240 (cmsUInt32Number) dataSize); |
250 (cmsUInt32Number) dataSize); |
241 |
251 |
242 (*env)->ReleaseByteArrayElements (env, data, dataArray, 0); |
252 (*env)->ReleaseByteArrayElements (env, data, dataArray, 0); |
332 return; |
342 return; |
333 } |
343 } |
334 } |
344 } |
335 |
345 |
336 /* Get profile header info */ |
346 /* Get profile header info */ |
337 cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize); |
347 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize); |
338 cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize); |
348 static cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize); |
|
349 static cmsBool _writeCookedTag(cmsHPROFILE pfTarget, cmsTagSignature sig, jbyte *pData, jint size); |
339 |
350 |
340 /* |
351 /* |
341 * Class: sun_java2d_cmm_lcms_LCMS |
352 * Class: sun_java2d_cmm_lcms_LCMS |
342 * Method: getTagSize |
353 * Method: getTagSize |
343 * Signature: (JI)I |
354 * Signature: (JI)I |
354 |
365 |
355 if (tagSig == SigHead) { |
366 if (tagSig == SigHead) { |
356 result = sizeof(cmsICCHeader); |
367 result = sizeof(cmsICCHeader); |
357 } else { |
368 } else { |
358 if (cmsIsTag(sProf.pf, sig.cms)) { |
369 if (cmsIsTag(sProf.pf, sig.cms)) { |
359 result = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0); |
370 result = cmsReadRawTag(sProf.pf, sig.cms, NULL, 0); |
360 } else { |
371 } else { |
361 JNU_ThrowByName(env, "java/awt/color/CMMException", |
372 JNU_ThrowByName(env, "java/awt/color/CMMException", |
362 "ICC profile tag not found"); |
373 "ICC profile tag not found"); |
363 } |
374 } |
364 } |
375 } |
466 int tagSize; |
477 int tagSize; |
467 |
478 |
468 sProf.j = id; |
479 sProf.j = id; |
469 sig.j = tagSig; |
480 sig.j = tagSig; |
470 |
481 |
|
482 if (JNU_IsNull(env, data)) { |
|
483 JNU_ThrowIllegalArgumentException(env, "Can not write tag data."); |
|
484 return; |
|
485 } |
471 |
486 |
472 tagSize =(*env)->GetArrayLength(env, data); |
487 tagSize =(*env)->GetArrayLength(env, data); |
473 |
488 |
474 dataArray = (*env)->GetByteArrayElements(env, data, 0); |
489 dataArray = (*env)->GetByteArrayElements(env, data, 0); |
|
490 |
|
491 if (dataArray == NULL) { |
|
492 JNU_ThrowIllegalArgumentException(env, "Can not write tag data."); |
|
493 return; |
|
494 } |
475 |
495 |
476 if (tagSig == SigHead) { |
496 if (tagSig == SigHead) { |
477 status = _setHeaderInfo(sProf.pf, dataArray, tagSize); |
497 status = _setHeaderInfo(sProf.pf, dataArray, tagSize); |
478 } else { |
498 } else { |
479 status = cmsWriteRawTag(sProf.pf, sig.cms, dataArray, tagSize); |
499 status = _writeCookedTag(sProf.pf, sig.cms, dataArray, tagSize); |
480 } |
500 } |
481 |
501 |
482 (*env)->ReleaseByteArrayElements(env, data, dataArray, 0); |
502 (*env)->ReleaseByteArrayElements(env, data, dataArray, 0); |
483 |
503 |
484 if (!status) { |
504 if (!status) { |
485 JNU_ThrowByName(env, "java/awt/color/CMMException", |
505 JNU_ThrowIllegalArgumentException(env, "Can not write tag data."); |
486 "Can not write tag data."); |
|
487 } |
506 } |
488 } |
507 } |
489 |
508 |
490 void* getILData (JNIEnv *env, jobject img, jint* pDataType, |
509 void* getILData (JNIEnv *env, jobject img, jint* pDataType, |
491 jobject* pDataObject) { |
510 jobject* pDataObject) { |
643 IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I"); |
662 IL_nextRowOffset_fID = (*env)->GetFieldID (env, IL, "nextRowOffset", "I"); |
644 |
663 |
645 PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J"); |
664 PF_ID_fID = (*env)->GetFieldID (env, Pf, "ID", "J"); |
646 } |
665 } |
647 |
666 |
648 cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize) |
667 static cmsBool _getHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize) |
649 { |
668 { |
650 cmsUInt32Number pfSize = 0; |
669 cmsUInt32Number pfSize = 0; |
651 cmsUInt8Number* pfBuffer = NULL; |
670 cmsUInt8Number* pfBuffer = NULL; |
652 cmsBool status = FALSE; |
671 cmsBool status = FALSE; |
653 |
672 |
694 cmsSetDeviceClass(pf, pfHeader.deviceClass); |
713 cmsSetDeviceClass(pf, pfHeader.deviceClass); |
695 cmsSetEncodedICCversion(pf, pfHeader.version); |
714 cmsSetEncodedICCversion(pf, pfHeader.version); |
696 |
715 |
697 return TRUE; |
716 return TRUE; |
698 } |
717 } |
|
718 |
|
719 static cmsBool _writeCookedTag(cmsHPROFILE pfTarget, |
|
720 cmsTagSignature sig, |
|
721 jbyte *pData, jint size) |
|
722 { |
|
723 cmsBool status; |
|
724 cmsUInt32Number pfSize = 0; |
|
725 cmsUInt8Number* pfBuffer = NULL; |
|
726 |
|
727 cmsHPROFILE p = cmsCreateProfilePlaceholder(NULL); |
|
728 if (NULL != p) { |
|
729 cmsICCHeader hdr = { 0 }; |
|
730 |
|
731 /* Populate the placeholder's header according to target profile */ |
|
732 hdr.flags = cmsGetHeaderFlags(pfTarget); |
|
733 hdr.renderingIntent = cmsGetHeaderRenderingIntent(pfTarget); |
|
734 hdr.manufacturer = cmsGetHeaderManufacturer(pfTarget); |
|
735 hdr.model = cmsGetHeaderModel(pfTarget); |
|
736 hdr.pcs = cmsGetPCS(pfTarget); |
|
737 hdr.colorSpace = cmsGetColorSpace(pfTarget); |
|
738 hdr.deviceClass = cmsGetDeviceClass(pfTarget); |
|
739 hdr.version = cmsGetEncodedICCversion(pfTarget); |
|
740 cmsGetHeaderAttributes(pfTarget, &hdr.attributes); |
|
741 cmsGetHeaderProfileID(pfTarget, (cmsUInt8Number*)&hdr.profileID); |
|
742 |
|
743 cmsSetHeaderFlags(p, hdr.flags); |
|
744 cmsSetHeaderManufacturer(p, hdr.manufacturer); |
|
745 cmsSetHeaderModel(p, hdr.model); |
|
746 cmsSetHeaderAttributes(p, hdr.attributes); |
|
747 cmsSetHeaderProfileID(p, (cmsUInt8Number*)&(hdr.profileID)); |
|
748 cmsSetHeaderRenderingIntent(p, hdr.renderingIntent); |
|
749 cmsSetPCS(p, hdr.pcs); |
|
750 cmsSetColorSpace(p, hdr.colorSpace); |
|
751 cmsSetDeviceClass(p, hdr.deviceClass); |
|
752 cmsSetEncodedICCversion(p, hdr.version); |
|
753 |
|
754 |
|
755 if (cmsWriteRawTag(p, sig, pData, size)) { |
|
756 if (cmsSaveProfileToMem(p, NULL, &pfSize)) { |
|
757 pfBuffer = malloc(pfSize); |
|
758 if (pfBuffer != NULL) { |
|
759 /* load raw profile data into the buffer */ |
|
760 if (!cmsSaveProfileToMem(p, pfBuffer, &pfSize)) { |
|
761 free(pfBuffer); |
|
762 pfBuffer = NULL; |
|
763 } |
|
764 } |
|
765 } |
|
766 } |
|
767 cmsCloseProfile(p); |
|
768 } |
|
769 |
|
770 if (pfBuffer == NULL) { |
|
771 return FALSE; |
|
772 } |
|
773 |
|
774 /* re-open the placeholder profile */ |
|
775 p = cmsOpenProfileFromMem(pfBuffer, pfSize); |
|
776 free(pfBuffer); |
|
777 status = FALSE; |
|
778 |
|
779 if (p != NULL) { |
|
780 /* Note that pCookedTag points to internal structures of the placeholder, |
|
781 * so this data is valid only while the placeholder is open. |
|
782 */ |
|
783 void *pCookedTag = cmsReadTag(p, sig); |
|
784 if (pCookedTag != NULL) { |
|
785 status = cmsWriteTag(pfTarget, sig, pCookedTag); |
|
786 } |
|
787 pCookedTag = NULL; |
|
788 cmsCloseProfile(p); |
|
789 } |
|
790 return status; |
|
791 } |