📄 cmsio1.c
字号:
AdjustEndianess16((LPBYTE) &Type); if (Type > 5) { cmsSignalError(LCMS_ERRC_ABORTED, "Unknown parametric curve type '%d' found.", Type); return NULL; } ZeroMemory(Params, 10* sizeof(double)); n = ParamsByType[Type]; for (i=0; i < n; i++) { Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc); Params[i] = Convert15Fixed16(Num); } // Negative type as a mark of reversed curve NewGamma = cmsBuildParametricGamma(4096, -(Type+1), Params); return NewGamma; } default: cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType); return NULL; }}// V4 stuff. Read matrix for LutAtoB and LutBtoAstaticBOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags){ icS15Fixed16Number All[12]; int i; MAT3 m; VEC3 o; if (Icc -> Seek(Icc, Offset)) return FALSE; Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc); for (i=0; i < 12; i++) AdjustEndianess32((LPBYTE) &All[i]); m.v[0].n[0] = FIXED_TO_DOUBLE((Fixed32) All[0]); m.v[0].n[1] = FIXED_TO_DOUBLE((Fixed32) All[1]); m.v[0].n[2] = FIXED_TO_DOUBLE((Fixed32) All[2]); m.v[1].n[0] = FIXED_TO_DOUBLE((Fixed32) All[3]); m.v[1].n[1] = FIXED_TO_DOUBLE((Fixed32) All[4]); m.v[1].n[2] = FIXED_TO_DOUBLE((Fixed32) All[5]); m.v[2].n[0] = FIXED_TO_DOUBLE((Fixed32) All[6]); m.v[2].n[1] = FIXED_TO_DOUBLE((Fixed32) All[7]); m.v[2].n[2] = FIXED_TO_DOUBLE((Fixed32) All[8]); o.n[0] = FIXED_TO_DOUBLE((Fixed32) All[9]); o.n[1] = FIXED_TO_DOUBLE((Fixed32) All[10]); o.n[2] = FIXED_TO_DOUBLE((Fixed32) All[11]); cmsSetMatrixLUT4(NewLUT, &m, &o, dwFlags); return TRUE;}// V4 stuff. Read CLUT part for LutAtoB and LutBtoAstaticBOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT){ icCLutStruct CLUT; if (Icc -> Seek(Icc, Offset)) return FALSE; Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc); cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan, NewLUT ->OutputChan); // Precission can be 1 or 2 bytes if (CLUT.prec == 1) { BYTE v; unsigned int i; for (i=0; i < NewLUT->Tsize / sizeof(WORD); i++) { Icc ->Read(&v, sizeof(BYTE), 1, Icc); NewLUT->T[i] = TO16_TAB(v); } } else if (CLUT.prec == 2) { Icc ->Read(NewLUT ->T, sizeof(WORD), NewLUT->Tsize / sizeof(WORD), Icc); AdjustEndianessArray16(NewLUT ->T, NewLUT->Tsize / sizeof(WORD)); } else { cmsSignalError(LCMS_ERRC_ABORTED, "Unknow precission of '%d'", CLUT.prec); return FALSE; } return TRUE;}staticvoid SkipAlignment(LPLCMSICCPROFILE Icc){ BYTE Buffer[4]; size_t At = Icc ->Tell(Icc); int BytesToNextAlignedPos = (int) (At % 4); Icc ->Read(Buffer, 1, BytesToNextAlignedPos, Icc);}// Read a set of curves from specific offsetstaticBOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation){ LPGAMMATABLE Curves[MAXCHANNELS]; unsigned int i, nCurves; if (Icc -> Seek(Icc, Offset)) return FALSE; if (nLocation == 1 || nLocation == 3) nCurves = NewLUT ->InputChan; else nCurves = NewLUT ->OutputChan; for (i=0; i < nCurves; i++) { Curves[i] = ReadCurve(Icc); SkipAlignment(Icc); } NewLUT = cmsAllocLinearTable(NewLUT, Curves, nLocation); for (i=0; i < nCurves; i++) cmsFreeGamma(Curves[i]); return TRUE;}// V4 stuff. LutAtoB type //// [L1] -> [CLUT] -> [L4] -> [Mat4] -> [Ofs4] -> [L2]//// Mat, Mat3, Ofs3, L3 are missing// L1 = A curves// L4 = M curves// L2 = B curvesstaticBOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig){ icLutAtoB LUT16; Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc); NewLUT -> InputChan = LUT16.inputChan; NewLUT -> OutputChan = LUT16.outputChan; AdjustEndianess32((LPBYTE) &LUT16.offsetB); AdjustEndianess32((LPBYTE) &LUT16.offsetMat); AdjustEndianess32((LPBYTE) &LUT16.offsetM); AdjustEndianess32((LPBYTE) &LUT16.offsetC); AdjustEndianess32((LPBYTE) &LUT16.offsetA); if (LUT16.offsetB != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetB, NewLUT, 2); if (LUT16.offsetMat != 0) ReadMatrixOffset(Icc, BaseOffset + LUT16.offsetMat, NewLUT, LUT_HASMATRIX4); if (LUT16.offsetM != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetM, NewLUT, 4); if (LUT16.offsetC != 0) ReadCLUT(Icc, BaseOffset + LUT16.offsetC, NewLUT); if (LUT16.offsetA!= 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetA, NewLUT, 1); // Convert to v2 PCS if (Icc ->PCS == icSigLabData) { switch (sig) { case icSigAToB0Tag: case icSigAToB1Tag: case icSigAToB2Tag: case icSigGamutTag: case icSigPreview0Tag: case icSigPreview1Tag: case icSigPreview2Tag: NewLUT ->wFlags |= LUT_V4_INPUT_EMULATE_V2; break; default:; } } return TRUE;}// V4 stuff. LutBtoA type staticBOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig){ icLutBtoA LUT16; Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc); NewLUT -> InputChan = LUT16.inputChan; NewLUT -> OutputChan = LUT16.outputChan; AdjustEndianess32((LPBYTE) &LUT16.offsetB); AdjustEndianess32((LPBYTE) &LUT16.offsetMat); AdjustEndianess32((LPBYTE) &LUT16.offsetM); AdjustEndianess32((LPBYTE) &LUT16.offsetC); AdjustEndianess32((LPBYTE) &LUT16.offsetA); if (LUT16.offsetB != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetB, NewLUT, 1); if (LUT16.offsetMat != 0) ReadMatrixOffset(Icc, BaseOffset + LUT16.offsetMat, NewLUT, LUT_HASMATRIX3); if (LUT16.offsetM != 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetM, NewLUT, 3); if (LUT16.offsetC != 0) ReadCLUT(Icc, BaseOffset + LUT16.offsetC, NewLUT); if (LUT16.offsetA!= 0) ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetA, NewLUT, 2); // Convert to v2 PCS if (Icc ->PCS == icSigLabData) { switch (sig) { case icSigBToA0Tag: case icSigBToA1Tag: case icSigBToA2Tag: case icSigGamutTag: case icSigPreview0Tag: case icSigPreview1Tag: case icSigPreview2Tag: NewLUT ->wFlags |= LUT_V4_OUTPUT_EMULATE_V2; break; default:; } } return TRUE;}// CLUT main readerLPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig){ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile; icTagTypeSignature BaseType; int n; size_t offset; LPLUT NewLUT; n = _cmsSearchTag(Icc, sig, TRUE); if (n < 0) return NULL; // If is in memory, the LUT is already there, so throw a copy if (!Icc -> stream) { return cmsDupLUT((LPLUT) Icc ->TagPtrs[n]); } offset = Icc -> TagOffsets[n]; if (Icc -> Seek(Icc, offset)) return NULL; BaseType = ReadBase(Icc); NewLUT = cmsAllocLUT(); if (!NewLUT) { cmsSignalError(LCMS_ERRC_ABORTED, "cmsAllocLUT() failed"); return NULL; } switch (BaseType) { case icSigLut8Type: ReadLUT8(Icc, NewLUT, sig); break; case icSigLut16Type: ReadLUT16(Icc, NewLUT); break; case icSiglutAtoBType: ReadLUT_A2B(Icc, NewLUT, offset, sig); break; case icSiglutBtoAType: ReadLUT_B2A(Icc, NewLUT, offset, sig); break; default: cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType); cmsFreeLUT(NewLUT); return NULL; } return NewLUT;}// Sets the language & country preferences. Used only in ICC 4.0 profilesvoid LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode){ GlobalLanguageCode = LanguageCode; GlobalCountryCode = CountryCode;}// Some tags (e.g, 'pseq') can have text tags embedded. This function// handles such special case.staticint ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name){ icTagTypeSignature BaseType; BaseType = ReadBase(Icc); size -= sizeof(icTagBase); switch (BaseType) { case icSigTextDescriptionType: { icUInt32Number AsciiCount; icUInt32Number i, UnicodeCode, UnicodeCount; icUInt16Number ScriptCodeCode, Dummy; icUInt8Number ScriptCodeCount; Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc); size -= sizeof(icUInt32Number); AdjustEndianess32((LPBYTE) &AsciiCount); Icc ->Read(Name, 1, AsciiCount, Icc); size -= AsciiCount; // Skip Unicode code Icc ->Read(&UnicodeCode, sizeof(icUInt32Number), 1, Icc); size -= sizeof(icUInt32Number); Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc); size -= sizeof(icUInt32Number); AdjustEndianess32((LPBYTE) &UnicodeCount); if (UnicodeCount > size) return (int) size; for (i=0; i < UnicodeCount; i++) Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc); size -= UnicodeCount * sizeof(icUInt16Number); // Skip ScriptCode code Icc ->Read(&ScriptCodeCode, sizeof(icUInt16Number), 1, Icc); size -= sizeof(icUInt16Number); Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc); size -= sizeof(icUInt8Number); if (size < 67) return (int) size; for (i=0; i < 67; i++) Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc); size -= 67; } break; case icSigCopyrightTag: // Broken profiles from agfa does store copyright info in such type case icSigTextType: Icc -> Read(Name, 1, size, Icc); break; // MultiLocalizedUnicodeType, V4 only case icSigMultiLocalizedUnicodeType: { icUInt32Number Count, RecLen; icUInt16Number Language, Country; icUInt32Number ThisLen, ThisOffset; size_t Offset = 0; size_t Len = 0; size_t i; wchar_t* wchar = L""; Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc); AdjustEndianess32((LPBYTE) &Count); Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc); AdjustEndianess32((LPBYTE) &RecLen); if (RecLen != 12) { cmsSignalError(LCMS_ERRC_ABORTED, "multiLocalizedUnicodeType of len != 12 is not supported."); return -1; } for (i=0; i < Count; i++) { Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc); AdjustEndianess16((LPBYTE) &Language); Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc); AdjustEndianess16((LPBYTE) &Country); Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc); AdjustEndianess32((LPBYTE) &ThisLen); Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc); AdjustEndianess32((LPBYTE) &ThisOffset); if (Language == GlobalLanguageCode || Offset == 0) { Len = ThisLen; Offset = ThisOffset; if (Country == GlobalCountryCode) break; // Found } } if (Offset == 0) { strcpy(Name, "(no info)"); break; } // Compute true offset Offset -= 12 * Count + 8 + sizeof(icTagBase); // Skip unused bytes for (i=0; i < Offset; i++) { char Discard; Icc ->Read(&Discard, 1, 1, Icc); } wchar = (wchar_t*) malloc(Len+2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -