jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c
changeset 9784 3a0ebf0b855d
parent 9035 1255eb81cc2f
child 14154 9acc7f86a458
equal deleted inserted replaced
9778:967402e4be8b 9784:3a0ebf0b855d
   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 
   670   }
   689   }
   671   free(pfBuffer);
   690   free(pfBuffer);
   672   return status;
   691   return status;
   673 }
   692 }
   674 
   693 
   675 cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
   694 static cmsBool _setHeaderInfo(cmsHPROFILE pf, jbyte* pBuffer, jint bufferSize)
   676 {
   695 {
   677   cmsICCHeader pfHeader = { 0 };
   696   cmsICCHeader pfHeader = { 0 };
   678 
   697 
   679   if (pBuffer == NULL || bufferSize < sizeof(cmsICCHeader)) {
   698   if (pBuffer == NULL || bufferSize < sizeof(cmsICCHeader)) {
   680     return FALSE;
   699     return FALSE;
   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 }