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

📄 cmsvirt.c

📁 Linux下的无线网卡通用驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
////  Little cms//  Copyright (C) 1998-2004 Marti Maria//// Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.#include "lcms.h"// Virtual (built-in) profiles// -----------------------------------------------------------------------------------// This function creates a profile based on White point, primaries and// transfer functions.cmsHPROFILE LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,                                LPcmsCIExyYTRIPLE Primaries,                                LPGAMMATABLE TransferFunction[3]){       cmsHPROFILE hICC;       cmsCIEXYZ tmp;       MAT3 MColorants;       cmsCIEXYZTRIPLE Colorants;       cmsCIExyY MaxWhite;             hICC = _cmsCreateProfilePlaceholder();       if (!hICC)                          // can't allocate            return NULL;                     cmsSetDeviceClass(hICC,      icSigDisplayClass);       cmsSetColorSpace(hICC,       icSigRgbData);       cmsSetPCS(hICC,              icSigXYZData);       cmsSetRenderingIntent(hICC,  INTENT_PERCEPTUAL);                      // Implement profile using following tags:       //       //  1 icSigProfileDescriptionTag       //  2 icSigMediaWhitePointTag       //  3 icSigRedColorantTag       //  4 icSigGreenColorantTag       //  5 icSigBlueColorantTag       //  6 icSigRedTRCTag       //  7 icSigGreenTRCTag       //  8 icSigBlueTRCTag       // This conforms a standard RGB DisplayProfile as says ICC, and then I add       // 9 icSigChromaticityTag       // As addendum II             // Fill-in the tags       cmsAddTag(hICC, icSigDeviceMfgDescTag,       (LPVOID) "(lcms internal)");       cmsAddTag(hICC, icSigProfileDescriptionTag,  (LPVOID) "lcms RGB virtual profile");       cmsAddTag(hICC, icSigDeviceModelDescTag,     (LPVOID) "rgb built-in");                       if (WhitePoint) {       cmsxyY2XYZ(&tmp, WhitePoint);       cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) &tmp);       }       if (WhitePoint && Primaries) {        MaxWhite.x =  WhitePoint -> x;        MaxWhite.y =  WhitePoint -> y;        MaxWhite.Y =  1.0;       if (!cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries))       {              cmsCloseProfile(hICC);              return NULL;       }              cmsAdaptMatrixToD50(&MColorants, &MaxWhite);       Colorants.Red.X = MColorants.v[0].n[0];       Colorants.Red.Y = MColorants.v[1].n[0];       Colorants.Red.Z = MColorants.v[2].n[0];       Colorants.Green.X = MColorants.v[0].n[1];       Colorants.Green.Y = MColorants.v[1].n[1];       Colorants.Green.Z = MColorants.v[2].n[1];       Colorants.Blue.X = MColorants.v[0].n[2];       Colorants.Blue.Y = MColorants.v[1].n[2];       Colorants.Blue.Z = MColorants.v[2].n[2];       cmsAddTag(hICC, icSigRedColorantTag,   (LPVOID) &Colorants.Red);       cmsAddTag(hICC, icSigBlueColorantTag,  (LPVOID) &Colorants.Blue);       cmsAddTag(hICC, icSigGreenColorantTag, (LPVOID) &Colorants.Green);       }       if (TransferFunction) {       // In case of gamma, we must dup' the table pointer        cmsAddTag(hICC, icSigRedTRCTag,   (LPVOID) TransferFunction[0]);        cmsAddTag(hICC, icSigGreenTRCTag, (LPVOID) TransferFunction[1]);        cmsAddTag(hICC, icSigBlueTRCTag,  (LPVOID) TransferFunction[2]);       }       if (Primaries) {            cmsAddTag(hICC, icSigChromaticityTag, (LPVOID) Primaries);       }       return hICC;}// This function creates a profile based on White point and transfer function.cmsHPROFILE   LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,                                              LPGAMMATABLE TransferFunction){       cmsHPROFILE hICC;       cmsCIEXYZ tmp;                                  hICC = _cmsCreateProfilePlaceholder();       if (!hICC)                          // can't allocate            return NULL;                     cmsSetDeviceClass(hICC,      icSigDisplayClass);       cmsSetColorSpace(hICC,       icSigGrayData);       cmsSetPCS(hICC,              icSigXYZData);       cmsSetRenderingIntent(hICC,  INTENT_PERCEPTUAL);        // Implement profile using following tags:       //       //  1 icSigProfileDescriptionTag       //  2 icSigMediaWhitePointTag       //  6 icSigGrayTRCTag              // This conforms a standard Gray DisplayProfile                    // Fill-in the tags              cmsAddTag(hICC, icSigDeviceMfgDescTag,       (LPVOID) "(lcms internal)");       cmsAddTag(hICC, icSigProfileDescriptionTag,  (LPVOID) "lcms gray virtual profile");       cmsAddTag(hICC, icSigDeviceModelDescTag,     (LPVOID) "gray built-in");                 if (WhitePoint) {       cmsxyY2XYZ(&tmp, WhitePoint);       cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) &tmp);       }       if (TransferFunction) {       // In case of gamma, we must dup' the table pointer       cmsAddTag(hICC, icSigGrayTRCTag, (LPVOID) TransferFunction);       }       return hICC;}staticint IsPCS(icColorSpaceSignature ColorSpace){    return (ColorSpace == icSigXYZData ||            ColorSpace == icSigLabData);}staticvoid FixColorSpaces(cmsHPROFILE hProfile,                               icColorSpaceSignature ColorSpace,                               icColorSpaceSignature PCS,                              DWORD dwFlags){    if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) {            if (IsPCS(ColorSpace) && IsPCS(PCS)) {                     cmsSetDeviceClass(hProfile,      icSigAbstractClass);                    cmsSetColorSpace(hProfile,       ColorSpace);                    cmsSetPCS(hProfile,              PCS);                    return;            }            if (IsPCS(ColorSpace) && !IsPCS(PCS)) {                    cmsSetDeviceClass(hProfile, icSigOutputClass);                    cmsSetPCS(hProfile,         ColorSpace);                    cmsSetColorSpace(hProfile,  PCS);                            return;            }            if (IsPCS(PCS) && !IsPCS(ColorSpace)) {                   cmsSetDeviceClass(hProfile,  icSigInputClass);                   cmsSetColorSpace(hProfile,   ColorSpace);                   cmsSetPCS(hProfile,          PCS);                   return;            }    }    cmsSetDeviceClass(hProfile,      icSigLinkClass);    cmsSetColorSpace(hProfile,       ColorSpace);    cmsSetPCS(hProfile,              PCS);}staticcmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform){    _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;    cmsHPROFILE hICC;    cmsCIEXYZ WhitePoint;        int i, nColors;    size_t Size;    LPcmsNAMEDCOLORLIST nc2;    hICC = _cmsCreateProfilePlaceholder();    if (hICC == NULL) return NULL;    cmsSetRenderingIntent(hICC, v -> Intent);     cmsSetDeviceClass(hICC, icSigNamedColorClass);    cmsSetColorSpace(hICC, v ->ExitColorSpace);    cmsSetPCS(hICC, cmsGetPCS(v ->InputProfile));    cmsTakeMediaWhitePoint(&WhitePoint, v ->InputProfile);    cmsAddTag(hICC, icSigMediaWhitePointTag,  &WhitePoint);    cmsAddTag(hICC, icSigDeviceMfgDescTag,       (LPVOID) "LittleCMS");           cmsAddTag(hICC, icSigProfileDescriptionTag,  (LPVOID) "Named color Device link");    cmsAddTag(hICC, icSigDeviceModelDescTag,     (LPVOID) "Named color Device link");              nColors = cmsNamedColorCount(xform);    nc2     = cmsAllocNamedColorList(nColors);    Size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * (nColors-1));    CopyMemory(nc2, v->NamedColorList, Size);    nc2 ->ColorantCount = _cmsChannelsOf(v ->ExitColorSpace);    for (i=0; i < nColors; i++) {        cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1);    }    cmsAddTag(hICC, icSigNamedColor2Tag, (void*) nc2);    cmsFreeNamedColorList(nc2);    return hICC;}// Does convert a transform into a device link profilecmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags){        cmsHPROFILE hICC;        _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) hTransform;        LPLUT Lut;        BOOL MustFreeLUT;              // Check if is a named color transform        if (cmsGetDeviceClass(v ->InputProfile) == icSigNamedColorClass) {                                       return CreateNamedColorDevicelink(hTransform);                        }        if (v ->DeviceLink) {                Lut = v -> DeviceLink;                MustFreeLUT = FALSE;        }        else {            Lut = _cmsPrecalculateDeviceLink(hTransform, dwFlags);            if (!Lut) return NULL;            MustFreeLUT = TRUE;        }       hICC = _cmsCreateProfilePlaceholder();       if (!hICC) {                          // can't allocate                  if (MustFreeLUT) cmsFreeLUT(Lut);            return NULL;       }       FixColorSpaces(hICC, v -> EntryColorSpace, v -> ExitColorSpace, dwFlags);                    cmsSetRenderingIntent(hICC,  v -> Intent);                      // Implement devicelink profile using following tags:       //       //  1 icSigProfileDescriptionTag       //  2 icSigMediaWhitePointTag       //  3 icSigAToB0Tag                               cmsAddTag(hICC, icSigDeviceMfgDescTag,       (LPVOID) "LittleCMS");              cmsAddTag(hICC, icSigProfileDescriptionTag,  (LPVOID) "Device link");       cmsAddTag(hICC, icSigDeviceModelDescTag,     (LPVOID) "Device link");                 cmsAddTag(hICC, icSigMediaWhitePointTag,  (LPVOID) cmsD50_XYZ());       if (cmsGetDeviceClass(hICC) == icSigOutputClass) {                                           cmsAddTag(hICC, icSigBToA0Tag, (LPVOID) Lut);       }       else                cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);              if (MustFreeLUT) cmsFreeLUT(Lut);       return hICC;}// This is a devicelink operating in the target colorspace with as many transfer// functions as componentscmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,                                                        LPGAMMATABLE TransferFunctions[]){       cmsHPROFILE hICC;       LPLUT Lut;                          hICC = _cmsCreateProfilePlaceholder();       if (!hICC)                          // can't allocate            return NULL;       cmsSetDeviceClass(hICC,      icSigLinkClass);       cmsSetColorSpace(hICC,       ColorSpace);       cmsSetPCS(hICC,              ColorSpace);       cmsSetRenderingIntent(hICC,  INTENT_PERCEPTUAL);             // Creates a LUT with prelinearization step only       Lut = cmsAllocLUT();       // Set up channels       Lut ->InputChan = Lut ->OutputChan = _cmsChannelsOf(ColorSpace);       // Copy tables to LUT       cmsAllocLinearTable(Lut, TransferFunctions, 1);       // Create tags              cmsAddTag(hICC, icSigDeviceMfgDescTag,       (LPVOID) "(lcms internal)");       cmsAddTag(hICC, icSigProfileDescriptionTag,  (LPVOID) "lcms linearization device link");       cmsAddTag(hICC, icSigDeviceModelDescTag,     (LPVOID) "linearization built-in");                 cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ());       cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);              // LUT is already on virtual profile       cmsFreeLUT(Lut);       // Ok, done       return hICC;}// Ink-limiting algorithm////  Sum = C + M + Y + K //  If Sum > InkLimit //        Ratio= 1 - (Sum - InkLimit) / (C + M + Y)//        if Ratio <0 //              Ratio=0//        endif     //     Else //         Ratio=1//     endif////     C = Ratio * C//     M = Ratio * M//     Y = Ratio * Y//     K: Does not change   static

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -