LPMATSHAPER cmsAllocMatShaper2(LPMAT3 Matrix, LPGAMMATABLE In[], LPGAMMATABLE Out[], DWORD Behaviour) { LPMATSHAPER NewMatShaper; int rc; 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 if (Out) { rc = ComputeTables(Out, NewMatShaper ->L, &NewMatShaper ->p16); if (rc < 0) { cmsFreeMatShaper(NewMatShaper); return NULL; } if (rc == 1) NewMatShaper -> dwFlags |= MATSHAPER_HASSHAPER; } if (In) { rc = ComputeTables(In, NewMatShaper ->L2, &NewMatShaper ->p2_16); if (rc < 0) { cmsFreeMatShaper(NewMatShaper); return NULL; } if (rc == 1) NewMatShaper -> dwFlags |= MATSHAPER_HASINPSHAPER; } return NewMatShaper; }
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; }