*** openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h.orig 2008-04-11 19:17:54.000000000 -0700 --- openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/lcms.h 2008-04-11 19:19:48.000000000 -0700 *************** LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile( *** 1244,1250 **** LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, size_t* BytesNeeded); ! // PostScript ColorRenderingDictionary and ColorSpaceArray --- 1244,1251 ---- LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, size_t* BytesNeeded); ! // Modify data for a tag in a profile ! LCMSAPI BOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, void *data, size_t size); // PostScript ColorRenderingDictionary and ColorSpaceArray *************** typedef struct _lcms_iccprofile_struct { *** 1838,1843 **** --- 1839,1845 ---- BOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset); BOOL (* Close)(struct _lcms_iccprofile_struct* Icc); size_t (* Tell)(struct _lcms_iccprofile_struct* Icc); + BOOL (* Grow)(struct _lcms_iccprofile_struct* Icc, size_t amount); // Writting *** openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c.orig 2008-04-11 19:18:43.000000000 -0700 --- openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c 2008-04-11 19:19:48.000000000 -0700 *************** JNIEXPORT void JNICALL Java_sun_java2d_c *** 347,353 **** JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data) { ! fprintf(stderr, "setTagData operation is not implemented"); } void* getILData (JNIEnv *env, jobject img, jint* pDataType, --- 347,368 ---- JNIEXPORT void JNICALL Java_sun_java2d_cmm_lcms_LCMS_setTagData (JNIEnv *env, jobject obj, jlong id, jint tagSig, jbyteArray data) { ! cmsHPROFILE profile; ! storeID_t sProf; ! jbyte* dataArray; ! int tagSize; ! ! if (tagSig == SigHead) { ! fprintf(stderr, "setTagData on icSigHead not permitted"); ! return; ! } ! ! sProf.j = id; ! profile = (cmsHPROFILE) sProf.pf; ! dataArray = (*env)->GetByteArrayElements(env, data, 0); ! tagSize =(*env)->GetArrayLength(env, data); ! _cmsModifyTagData(profile, (icTagSignature) tagSig, dataArray, tagSize); ! (*env)->ReleaseByteArrayElements(env, data, dataArray, 0); } void* getILData (JNIEnv *env, jobject img, jint* pDataType, *** openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c.orig 2008-04-11 19:17:54.000000000 -0700 --- openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c 2008-04-11 19:19:48.000000000 -0700 *************** BOOL MemoryWrite(struct _lcms_iccprofile *** 157,164 **** if (size == 0) return TRUE; if (ResData != NULL) ! CopyMemory(ResData ->Block + Icc ->UsedSpace, Ptr, size); Icc->UsedSpace += size; return TRUE; --- 157,165 ---- if (size == 0) return TRUE; if (ResData != NULL) ! CopyMemory(ResData ->Block + ResData ->Pointer, Ptr, size); + ResData->Pointer += size; Icc->UsedSpace += size; return TRUE; *************** BOOL MemoryWrite(struct _lcms_iccprofile *** 166,171 **** --- 167,184 ---- static + BOOL MemoryGrow(struct _lcms_iccprofile_struct* Icc, size_t size) + { + FILEMEM* ResData = (FILEMEM*) Icc->stream; + ResData->Size += size; + ResData->Block = realloc(ResData->Block, ResData->Size); + if (!ResData->Block) + return FALSE; + return TRUE; + } + + + static BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc) { FILEMEM* ResData = (FILEMEM*) Icc ->stream; *************** BOOL FileWrite(struct _lcms_iccprofile_s *** 239,244 **** --- 252,264 ---- static + BOOL FileGrow(struct _lcms_iccprofile_struct* Icc, size_t size) + { + return TRUE; + } + + + static BOOL FileClose(struct _lcms_iccprofile_struct* Icc) { return fclose((FILE*) Icc ->stream); *************** LPLCMSICCPROFILE _cmsCreateProfileFromFi *** 382,387 **** --- 402,408 ---- NewIcc ->Seek = FileSeek; NewIcc ->Tell = FileTell; NewIcc ->Close = FileClose; + NewIcc ->Grow = FileGrow; NewIcc ->Write = NULL; NewIcc ->IsWrite = FALSE; *************** LPLCMSICCPROFILE _cmsCreateProfileFromMe *** 419,425 **** NewIcc ->Seek = MemorySeek; NewIcc ->Tell = MemoryTell; NewIcc ->Close = MemoryClose; ! NewIcc ->Write = NULL; NewIcc ->IsWrite = FALSE; --- 440,447 ---- NewIcc ->Seek = MemorySeek; NewIcc ->Tell = MemoryTell; NewIcc ->Close = MemoryClose; ! NewIcc ->Grow = MemoryGrow; ! NewIcc ->Write = MemoryWrite; NewIcc ->IsWrite = FALSE; *** openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c.orig 2008-04-11 19:17:54.000000000 -0700 --- openjdk/jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c 2008-04-11 19:19:48.000000000 -0700 *************** CleanUp: *** 3661,3663 **** --- 3661,3800 ---- CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE)); return FALSE; } + + BOOL LCMSEXPORT _cmsModifyTagData(cmsHPROFILE hProfile, icTagSignature sig, + void *data, size_t size) + { + BOOL isNew; + int i, idx, delta, count; + LPBYTE padChars[3] = {0, 0, 0}; + LPBYTE beforeBuf, afterBuf, ptr; + size_t beforeSize, afterSize; + icUInt32Number profileSize, temp; + LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; + + isNew = FALSE; + idx = _cmsSearchTag(Icc, sig, FALSE); + if (idx < 0) + { + isNew = TRUE; + idx = Icc->TagCount++; + if (Icc->TagCount >= MAX_TABLE_TAG) + { + fprintf(stderr, "Too many tags (%d)\n", Icc->TagCount); + Icc->TagCount = MAX_TABLE_TAG-1; + return FALSE; + } + } + + /* Read in size from header */ + Icc->Seek(Icc, 0); + Icc->Read(&profileSize, sizeof(icUInt32Number), 1, Icc); + AdjustEndianess32((LPBYTE) &profileSize); + + /* Compute the change in profile size */ + if (isNew) + delta = sizeof(icTag) + ALIGNLONG(size); + else + delta = ALIGNLONG(size) - ALIGNLONG(Icc->TagSizes[idx]); + + /* Add tag to internal structures */ + ptr = malloc(size); + CopyMemory(ptr, data, size); + Icc->TagSizes[idx] = size; + Icc->TagNames[idx] = sig; + if (Icc->TagPtrs[idx]) + free(Icc->TagPtrs[idx]); + Icc->TagPtrs[idx] = ptr; + if (isNew) + Icc->TagOffsets[idx] = profileSize; + + /* Compute size of tag data before/after the modified tag */ + beforeSize = Icc->TagOffsets[idx] - Icc->TagOffsets[0]; + if (Icc->TagCount == (idx + 1)) + afterSize = 0; + else + afterSize = profileSize - Icc->TagOffsets[idx+1]; + + /* Make copies of the data before/after the modified tag */ + if (beforeSize > 0) + { + beforeBuf = malloc(beforeSize); + Icc->Seek(Icc, Icc->TagOffsets[0]); + Icc->Read(beforeBuf, beforeSize, 1, Icc); + } + + if (afterSize > 0) + { + afterBuf = malloc(afterSize); + Icc->Seek(Icc, Icc->TagOffsets[idx+1]); + Icc->Read(afterBuf, afterSize, 1, Icc); + } + + /* Update the profile size in the header */ + profileSize += delta; + Icc->Seek(Icc, 0); + temp = TransportValue32(profileSize); + Icc->Write(Icc, sizeof(icUInt32Number), &temp); + + Icc->Grow(Icc, delta); + + /* Adjust tag offsets: if the tag is new, we must account + for the new tag table entry; otherwise, only those tags after + the modified tag are changed (by delta) */ + if (isNew) + { + for (i = 0; i < Icc->TagCount; ++i) + Icc->TagOffsets[i] += sizeof(icTag); + } + else + { + for (i = idx+1; i < Icc->TagCount; ++i) + Icc->TagOffsets[i] += delta; + } + + /* Write out a new tag table */ + count = 0; + for (i = 0; i < Icc->TagCount; ++i) + { + if (Icc->TagNames[i] != 0) + ++count; + } + Icc->Seek(Icc, sizeof(icHeader)); + temp = TransportValue32(count); + Icc->Write(Icc, sizeof(icUInt32Number), &temp); + + for (i = 0; i < Icc->TagCount; ++i) + { + if (Icc->TagNames[i] != 0) + { + icTag tag; + tag.sig = TransportValue32(Icc->TagNames[i]); + tag.offset = TransportValue32((icInt32Number) Icc->TagOffsets[i]); + tag.size = TransportValue32((icInt32Number) Icc->TagSizes[i]); + Icc->Write(Icc, sizeof(icTag), &tag); + } + } + + /* Write unchanged data before the modified tag */ + if (beforeSize > 0) + { + Icc->Write(Icc, beforeSize, beforeBuf); + free(beforeBuf); + } + + /* Write modified tag data */ + Icc->Write(Icc, size, data); + if (size % 4) + Icc->Write(Icc, 4 - (size % 4), padChars); + + /* Write unchanged data after the modified tag */ + if (afterSize > 0) + { + Icc->Write(Icc, afterSize, afterBuf); + free(afterBuf); + } + + return TRUE; + } +