diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index bc720699d..39ad0fe8b 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -504,7 +504,7 @@ void Imagefloat::calcCroppedHistogram(const ProcParams ¶ms, float scale, LUT } // Parallelized transformation; create transform with cmsFLAGS_NOCACHE! -void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) +void Imagefloat::ExecCMSTransform2(cmsHTRANSFORM hTransform) { // LittleCMS cannot parallelize planar setups -- Hombre: LCMS2.4 can! But it we use this new feature, memory allocation @@ -527,6 +527,53 @@ void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) *(p++) = *(pR++)/ 65535.f; *(p++) = *(pG++)/ 65535.f; *(p++) = *(pB++)/ 65535.f; + + } + + cmsDoTransform (hTransform, pBuf.data, pBuf.data, width); + + p = pBuf.data; + pR = r(y); + pG = g(y); + pB = b(y); + + for (int x = 0; x < width; x++) { + *(pR++) = *(p++); + *(pG++) = *(p++); + *(pB++) = *(p++); + } + } // End of parallelization + } +} + + + + +// Parallelized transformation; create transform with cmsFLAGS_NOCACHE! +void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) +{ + + // LittleCMS cannot parallelize planar setups -- Hombre: LCMS2.4 can! But it we use this new feature, memory allocation + // have to be modified too to build temporary buffers that allow multi processor execution +#ifdef _OPENMP + #pragma omp parallel +#endif + { + AlignedBuffer pBuf(width * 3); + +#ifdef _OPENMP + #pragma omp for schedule(static) +#endif + + for (int y = 0; y < height; y++) + { + float *p = pBuf.data, *pR = r(y), *pG = g(y), *pB = b(y); + + for (int x = 0; x < width; x++) { + *(p++) = *(pR++); + *(p++) = *(pG++); + *(p++) = *(pB++); + } cmsDoTransform (hTransform, pBuf.data, pBuf.data, width); diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 5246a2f6e..d48e51cee 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -104,6 +104,7 @@ public: void normalizeFloatTo1(); void normalizeFloatTo65535(); void calcCroppedHistogram(const ProcParams ¶ms, float scale, LUTu & hist); + void ExecCMSTransform2(cmsHTRANSFORM hTransform); void ExecCMSTransform(cmsHTRANSFORM hTransform); void ExecCMSTransform(cmsHTRANSFORM hTransform, const LabImage &labImage, int cx, int cy); diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 700437734..77cf65d21 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -654,7 +654,7 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int cmsHTRANSFORM hTransform = cmsCreateTransform(iprof, TYPE_RGB_FLT, oprofdef, TYPE_RGB_FLT, params->icm.outputIntent, flags); lcmsMutex->unlock(); - image->ExecCMSTransform(hTransform); + image->ExecCMSTransform2(hTransform); cmsDeleteTransform(hTransform); image->normalizeFloatTo65535();