static int ComputeTables(LPGAMMATABLE Table[3], LPWORD Out[3], LPL16PARAMS p16) { int i, AllLinear; cmsCalcL16Params(Table[0] -> nEntries, p16); AllLinear = 0; for (i=0; i < 3; i++) { LPWORD PtrW; PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * p16 -> nSamples); if (PtrW == NULL) return -1; // Signal error CopyMemory(PtrW, Table[i] -> GammaTable, sizeof(WORD) * Table[i] -> nEntries); Out[i] = PtrW; // Set table pointer // Linear after all? AllLinear += cmsIsLinear(PtrW, p16 -> nSamples); } // If is all linear, then supress table interpolation (this // will speed greately some trivial operations. // Return 1 if present, 0 if all linear if (AllLinear != 3) return 1; return 0; }
LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behaviour) { LPMATSHAPER NewMatShaper; int i, AllLinear; NewMatShaper = (LPMATSHAPER) _cmsMalloc(sizeof(MATSHAPER)); if (NewMatShaper) ZeroMemory(NewMatShaper, sizeof(MATSHAPER)); NewMatShaper->dwFlags = Behaviour & (MATSHAPER_ALLSMELTED); // Fill matrix part MAT3toFix(&NewMatShaper -> Matrix, Matrix); // Reality check if (!MAT3isIdentity(&NewMatShaper -> Matrix, 0.00001)) NewMatShaper -> dwFlags |= MATSHAPER_HASMATRIX; // Now, on the table characteristics cmsCalcL16Params(Tables[0] -> nEntries, &NewMatShaper -> p16); // Copy tables AllLinear = 0; for (i=0; i < 3; i++) { LPWORD PtrW; PtrW = (LPWORD) _cmsMalloc(sizeof(WORD) * NewMatShaper -> p16.nSamples); if (PtrW == NULL) { cmsFreeMatShaper(NewMatShaper); return NULL; } CopyMemory(PtrW, Tables[i] -> GammaTable, sizeof(WORD) * Tables[i] -> nEntries); NewMatShaper -> L[i] = PtrW; // Set table pointer // Linear after all? AllLinear += cmsIsLinear(PtrW, NewMatShaper -> p16.nSamples); } // If is all linear, then supress table interpolation (this // will speed greately some trivial operations if (AllLinear != 3) NewMatShaper -> dwFlags |= MATSHAPER_HASSHAPER; return NewMatShaper; }