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

📄 cmsintrp.c

📁 Linux下的无线网卡通用驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                if (Value == 0xFFFF) return 0xFFFF;                // else restrict to valid zone                a = ((NumZeroes-1) * 0xFFFF) / p->Domain;                               b = ((p -> Domain - NumPoles) * 0xFFFF) / p ->Domain;                                                                                l = a - 1;                r = b + 1;        }        // Seems not a degenerated case... apply binary search        while (r > l) {                x = (l + r) / 2;                res = (int) cmsLinearInterpLUT16((WORD) (x - 1), LutTable, p);                if (res == Value) {                    // Found exact match.                                         return (WORD) (x - 1);                }                if (res > Value) r = x - 1;                else l = x + 1;        }        // Not found, should we interpolate?                        // Get surrounding nodes                val2 = p -> Domain * ((double) (x - 1) / 65535.0);        cell0 = (int) floor(val2);        cell1 = (int) ceil(val2);                   if (cell0 == cell1) return (WORD) x;        y0 = LutTable[cell0] ;        x0 = (65535.0 * cell0) / p ->Domain;         y1 = LutTable[cell1] ;        x1 = (65535.0 * cell1) / p ->Domain;        a = (y1 - y0) / (x1 - x0);        b = y0 - a * x0;        if (a == 0) return (WORD) x;        f = ((Value - b) / a);        if (f < 0.0) return (WORD) 0;        if (f >= 65535.0) return (WORD) 0xFFFF;        return (WORD) floor(f + 0.5);                                }// Trilinear interpolation (16 bits) - float version#ifdef USE_FLOATvoid cmsTrilinearInterp16(WORD Input[], WORD Output[],                            WORD LutTable[], LPL16PARAMS p){#   define LERP(a,l,h)  (double) ((l)+(((h)-(l))*(a)))#   define DENS(X, Y, Z)    (double) (LutTable[TotalOut*((Z)+clutPoints*((Y)+clutPoints*(X)))+OutChan])    double     px, py, pz;    int        x0, y0, z0,               x1, y1, z1;               int clutPoints, TotalOut, OutChan;    double     fx, fy, fz,               d000, d001, d010, d011,               d100, d101, d110, d111,               dx00, dx01, dx10, dx11,               dxy0, dxy1, dxyz;    clutPoints = p -> Domain + 1;    TotalOut   = p -> nOutputs;    px = ((double) Input[0] * (p->Domain)) / 65535.0;    py = ((double) Input[1] * (p->Domain)) / 65535.0;    pz = ((double) Input[2] * (p->Domain)) / 65535.0;    x0 = (int) _cmsQuickFloor(px); fx = px - (double) x0;    y0 = (int) _cmsQuickFloor(py); fy = py - (double) y0;    z0 = (int) _cmsQuickFloor(pz); fz = pz - (double) z0;    x1 = x0 + (Input[0] != 0xFFFFU ? 1 : 0);    y1 = y0 + (Input[1] != 0xFFFFU ? 1 : 0);    z1 = z0 + (Input[2] != 0xFFFFU ? 1 : 0);    for (OutChan = 0; OutChan < TotalOut; OutChan++)    {        d000 = DENS(x0, y0, z0);        d001 = DENS(x0, y0, z1);        d010 = DENS(x0, y1, z0);        d011 = DENS(x0, y1, z1);        d100 = DENS(x1, y0, z0);        d101 = DENS(x1, y0, z1);        d110 = DENS(x1, y1, z0);        d111 = DENS(x1, y1, z1);    dx00 = LERP(fx, d000, d100);    dx01 = LERP(fx, d001, d101);    dx10 = LERP(fx, d010, d110);    dx11 = LERP(fx, d011, d111);    dxy0 = LERP(fy, dx00, dx10);    dxy1 = LERP(fy, dx01, dx11);    dxyz = LERP(fz, dxy0, dxy1);    Output[OutChan] = (WORD) floor(dxyz + .5);    }#   undef LERP#   undef DENS}#endif#ifndef USE_FLOAT// Trilinear interpolation (16 bits) - optimized versionvoid cmsTrilinearInterp16(WORD Input[], WORD Output[],                            WORD LutTable[], LPL16PARAMS p){#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])#define LERP(a,l,h)     (WORD) (l+ ROUND_FIXED_TO_INT(((h-l)*a)))           int        OutChan, TotalOut;           Fixed32    fx, fy, fz;  register int        rx, ry, rz;           int        x0, y0, z0;  register int        X0, X1, Y0, Y1, Z0, Z1;           int        d000, d001, d010, d011,                      d100, d101, d110, d111,                      dx00, dx01, dx10, dx11,                      dxy0, dxy1, dxyz;    TotalOut   = p -> nOutputs;    fx = ToFixedDomain((int) Input[0] * p -> Domain);    x0  = FIXED_TO_INT(fx);    rx  = FIXED_REST_TO_INT(fx);    // Rest in 0..1.0 domain    fy = ToFixedDomain((int) Input[1] * p -> Domain);    y0  = FIXED_TO_INT(fy);    ry  = FIXED_REST_TO_INT(fy);    fz = ToFixedDomain((int) Input[2] * p -> Domain);    z0 = FIXED_TO_INT(fz);    rz = FIXED_REST_TO_INT(fz);    X0 = p -> opta3 * x0;    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3);	Y0 = p -> opta2 * y0;    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2);       Z0 = p -> opta1 * z0;    Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta1);        for (OutChan = 0; OutChan < TotalOut; OutChan++)    {        d000 = DENS(X0, Y0, Z0);        d001 = DENS(X0, Y0, Z1);        d010 = DENS(X0, Y1, Z0);        d011 = DENS(X0, Y1, Z1);        d100 = DENS(X1, Y0, Z0);        d101 = DENS(X1, Y0, Z1);        d110 = DENS(X1, Y1, Z0);        d111 = DENS(X1, Y1, Z1);        dx00 = LERP(rx, d000, d100);        dx01 = LERP(rx, d001, d101);        dx10 = LERP(rx, d010, d110);        dx11 = LERP(rx, d011, d111);        dxy0 = LERP(ry, dx00, dx10);        dxy1 = LERP(ry, dx01, dx11);        dxyz = LERP(rz, dxy0, dxy1);        Output[OutChan] = (WORD) dxyz;    }#   undef LERP#   undef DENS}#endif#ifdef USE_FLOAT#define DENS(X, Y, Z)    (double) (LutTable[TotalOut*((Z)+clutPoints*((Y)+clutPoints*(X)))+OutChan])// Tetrahedral interpolation, using Sakamoto algorithm. void cmsTetrahedralInterp16(WORD Input[],                            WORD Output[],                            WORD LutTable[],                            LPL16PARAMS p){    double     px, py, pz;    int        x0, y0, z0,               x1, y1, z1;    double     fx, fy, fz;    double     c1=0, c2=0, c3=0;    int        clutPoints, OutChan, TotalOut;    clutPoints = p -> Domain + 1;    TotalOut   = p -> nOutputs;    px = ((double) Input[0] * p->Domain) / 65535.0;    py = ((double) Input[1] * p->Domain) / 65535.0;    pz = ((double) Input[2] * p->Domain) / 65535.0;    x0 = (int) _cmsQuickFloor(px); fx = (px - (double) x0);    y0 = (int) _cmsQuickFloor(py); fy = (py - (double) y0);    z0 = (int) _cmsQuickFloor(pz); fz = (pz - (double) z0);    x1 = x0 + (Input[0] != 0xFFFFU ? 1 : 0);    y1 = y0 + (Input[1] != 0xFFFFU ? 1 : 0);    z1 = z0 + (Input[2] != 0xFFFFU ? 1 : 0);    for (OutChan=0; OutChan < TotalOut; OutChan++)    {       // These are the 6 Tetrahedral       if (fx >= fy && fy >= fz)       {              c1 = DENS(x1, y0, z0) - DENS(x0, y0, z0);              c2 = DENS(x1, y1, z0) - DENS(x1, y0, z0);              c3 = DENS(x1, y1, z1) - DENS(x1, y1, z0);       }       else       if (fx >= fz && fz >= fy)       {              c1 = DENS(x1, y0, z0) - DENS(x0, y0, z0);              c2 = DENS(x1, y1, z1) - DENS(x1, y0, z1);              c3 = DENS(x1, y0, z1) - DENS(x1, y0, z0);       }       else       if (fz >= fx && fx >= fy)       {              c1 = DENS(x1, y0, z1) - DENS(x0, y0, z1);              c2 = DENS(x1, y1, z1) - DENS(x1, y0, z1);              c3 = DENS(x0, y0, z1) - DENS(x0, y0, z0);       }       else       if (fy >= fx && fx >= fz)       {              c1 = DENS(x1, y1, z0) - DENS(x0, y1, z0);              c2 = DENS(x0, y1, z0) - DENS(x0, y0, z0);              c3 = DENS(x1, y1, z1) - DENS(x1, y1, z0);       }       else       if (fy >= fz && fz >= fx)       {              c1 = DENS(x1, y1, z1) - DENS(x0, y1, z1);              c2 = DENS(x0, y1, z0) - DENS(x0, y0, z0);              c3 = DENS(x0, y1, z1) - DENS(x0, y1, z0);       }       else       if (fz >= fy && fy >= fx)       {              c1 = DENS(x1, y1, z1) - DENS(x0, y1, z1);              c2 = DENS(x0, y1, z1) - DENS(x0, y0, z1);              c3 = DENS(x0, y0, z1) - DENS(x0, y0, z0);       }       else       {          c1 = c2 = c3 = 0;       //  assert(FALSE);       }       Output[OutChan] = (WORD) floor((double) DENS(x0,y0,z0) + c1 * fx + c2 * fy + c3 * fz + .5);       }}#undef DENS#else#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])void cmsTetrahedralInterp16(WORD Input[],                            WORD Output[],                            WORD LutTable[],                            LPL16PARAMS p){       Fixed32    fx, fy, fz;       Fixed32    rx, ry, rz;       int        x0, y0, z0;       Fixed32    c1, c2, c3, Rest;              int        OutChan;       register   Fixed32    X0, X1, Y0, Y1, Z0, Z1;       int        TotalOut = p -> nOutputs;    fx  = ToFixedDomain((int) Input[0] * p -> Domain);    fy  = ToFixedDomain((int) Input[1] * p -> Domain);    fz  = ToFixedDomain((int) Input[2] * p -> Domain);    x0  = FIXED_TO_INT(fx);    y0  = FIXED_TO_INT(fy);     z0  = FIXED_TO_INT(fz);    rx  = FIXED_REST_TO_INT(fx);       ry  = FIXED_REST_TO_INT(fy);          rz  = FIXED_REST_TO_INT(fz);    X0 = p -> opta3 * x0;    X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3);	Y0 = p -> opta2 * y0;    Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2);       Z0 = p -> opta1 * z0;    Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta1);        // These are the 6 Tetrahedral    for (OutChan=0; OutChan < TotalOut; OutChan++) {                     if (rx >= ry && ry >= rz) {                           c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);              c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);              c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);                                   }       else       if (rx >= rz && rz >= ry) {                          c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);              c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);              c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);                                 }       else       if (rz >= rx && rx >= ry) {                           c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);              c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);              c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);                                   }       else       if (ry >= rx && rx >= rz) {                            c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);              c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);              c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);                                   }       else       if (ry >= rz && rz >= rx) {                           c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);              c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);              c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);                                  }       else       if (rz >= ry && ry >= rx) {                           c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);              c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);              c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);                                  }       else  {              c1 = c2 = c3 = 0;              // assert(FALSE);       }                Rest = c1 * rx + c2 * ry + c3 * rz;                      		// There is a lot of math hidden in this expression. The rest is in fixed domain		// and the result in 0..ffff domain. So the complete expression should be 				// ROUND_FIXED_TO_INT(ToFixedDomain(Rest)) But that can be optimized as (Rest + 0x7FFF) / 0xFFFF		Output[OutChan] = (WORD) (DENS(X0,Y0,Z0) + ((Rest + 0x7FFF) / 0xFFFF));    }}#undef DENS#endif// A optimized interpolation for 8-bit input.#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])void cmsTetrahedralInterp8(WORD Input[],                           WORD Output[],                           WORD LutTable[],                           LPL16PARAMS p){       int        r, g, b;       Fixed32    rx, ry, rz;                   Fixed32    c1, c2, c3, Rest;              int        OutChan;       register   Fixed32    X0, X1, Y0, Y1, Z0, Z1;       int        TotalOut = p -> nOutputs;       register   LPL8PARAMS p8 = p ->p8;                r = Input[0] >> 8;    g = Input[1] >> 8;    b = Input[2] >> 8;    X0 = X1 = p8->X0[r];    Y0 = Y1 = p8->Y0[g];    Z0 = Z1 = p8->Z0[b];    X1 += (r == 255) ? 0 : p ->opta3;    Y1 += (g == 255) ? 0 : p ->opta2;    Z1 += (b == 255) ? 0 : p ->opta1;    rx = p8 ->rx[r];    ry = p8 ->ry[g];    rz = p8 ->rz[b];        // These are the 6 Tetrahedral    for (OutChan=0; OutChan < TotalOut; OutChan++) {                     if (rx >= ry && ry >= rz)       {                           c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);              c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);              c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);                                   }       else       if (rx >= rz && rz >= ry)       {                          c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);              c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);              c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);                                 }       else       if (rz >= rx && rx >= ry)       {                           c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);              c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);              c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);                                   }       else       if (ry >= rx && rx >= rz)       {                            c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);              c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);              c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);                                   }       else       if (ry >= rz && rz >= rx)       {                           c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);              c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);              c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);                                  }       else       if (rz >= ry && ry >= rx)       {                           c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);              c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);              c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);                                  }       else  {              c1 = c2 = c3 = 0;              // assert(FALSE);       }                Rest = c1 * rx + c2 * ry + c3 * rz;                        Output[OutChan] = (WORD) (DENS(X0,Y0,Z0) + ((Rest + 0x7FFF) / 0xFFFF));    }}#undef DENS

⌨️ 快捷键说明

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