⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmsio1.c

📁 Linux下的无线网卡通用驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
                      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 + -