jdk/src/java.desktop/share/native/liblcms/cmsio0.c
changeset 26747 2a4b66b4d50a
parent 26609 de18f570018c
child 30491 ea1c291ee28f
equal deleted inserted replaced
26746:67d075b319c1 26747:2a4b66b4d50a
  1165 cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize)
  1165 cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize)
  1166 {
  1166 {
  1167     return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
  1167     return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
  1168 }
  1168 }
  1169 
  1169 
  1170 static
       
  1171 cmsBool SanityCheck(_cmsICCPROFILE* profile)
       
  1172 {
       
  1173     cmsIOHANDLER* io;
       
  1174 
       
  1175     if (!profile) {
       
  1176         return FALSE;
       
  1177     }
       
  1178 
       
  1179     io = profile->IOhandler;
       
  1180     if (!io) {
       
  1181         return FALSE;
       
  1182     }
       
  1183 
       
  1184     if (!io->Seek ||
       
  1185         !(io->Seek==NULLSeek || io->Seek==MemorySeek || io->Seek==FileSeek))
       
  1186     {
       
  1187         return FALSE;
       
  1188     }
       
  1189     if (!io->Read ||
       
  1190         !(io->Read==NULLRead || io->Read==MemoryRead || io->Read==FileRead))
       
  1191     {
       
  1192         return FALSE;
       
  1193     }
       
  1194 
       
  1195     return TRUE;
       
  1196 }
       
  1197 
       
  1198 // Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig
  1170 // Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig
  1199 static
  1171 static
  1200 cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)
  1172 cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)
  1201 {
  1173 {
  1202     cmsUInt8Number* Data;
  1174     cmsUInt8Number* Data;
  1223 
  1195 
  1224         if (!Data) {
  1196         if (!Data) {
  1225 
  1197 
  1226             // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
  1198             // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
  1227             // In this case a blind copy of the block data is performed
  1199             // In this case a blind copy of the block data is performed
  1228             if (SanityCheck(FileOrig) && Icc -> TagOffsets[i]) {
  1200             if (FileOrig != NULL && FileOrig->IOhandler != NULL && Icc -> TagOffsets[i]) {
  1229 
  1201 
  1230                 cmsUInt32Number TagSize   = FileOrig -> TagSizes[i];
  1202                 cmsUInt32Number TagSize   = FileOrig -> TagSizes[i];
  1231                 cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
  1203                 cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
  1232                 void* Mem;
  1204                 void* Mem;
  1233 
  1205 
  1878 // the profile to memry or disk and then reopen it.
  1850 // the profile to memry or disk and then reopen it.
  1879 cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
  1851 cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
  1880 {
  1852 {
  1881     _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
  1853     _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
  1882     int i;
  1854     int i;
       
  1855     cmsBool ret = TRUE;
  1883 
  1856 
  1884     if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
  1857     if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
  1885 
  1858 
  1886     if (!_cmsNewTag(Icc, sig, &i)) {
  1859     if (!_cmsNewTag(Icc, sig, &i)) {
  1887         _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
  1860         _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
  1893     Icc ->TagNames[i]     = sig;
  1866     Icc ->TagNames[i]     = sig;
  1894     Icc ->TagLinked[i]    = (cmsTagSignature) 0;
  1867     Icc ->TagLinked[i]    = (cmsTagSignature) 0;
  1895 
  1868 
  1896     // Keep a copy of the block
  1869     // Keep a copy of the block
  1897     Icc ->TagPtrs[i]  = _cmsDupMem(Icc ->ContextID, data, Size);
  1870     Icc ->TagPtrs[i]  = _cmsDupMem(Icc ->ContextID, data, Size);
       
  1871     if (!Icc ->TagPtrs[i]) ret = FALSE;
  1898     Icc ->TagSizes[i] = Size;
  1872     Icc ->TagSizes[i] = Size;
  1899 
  1873 
  1900     _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
  1874     _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
  1901     return TRUE;
  1875     return ret;
  1902 }
  1876 }
  1903 
  1877 
  1904 // Using this function you can collapse several tag entries to the same block in the profile
  1878 // Using this function you can collapse several tag entries to the same block in the profile
  1905 cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
  1879 cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
  1906 {
  1880 {