equal
deleted
inserted
replaced
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 { |