From fed593e447334eddda748a997378eca571a42f18 Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Thu, 7 Apr 2011 22:36:02 +0200 Subject: [PATCH] LCMS2 threading --- rtengine/improcfun.cc | 3 ++- rtengine/iplab2rgb.cc | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 66b76a19b..bafcb2103 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -160,7 +160,8 @@ void ImProcFunctions::firstAnalysis (Imagefloat* original, const ProcParams* par if (monitor) { cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); - monitorTransform = cmsCreateTransform (iprof, TYPE_RGB_FLT, monitor, TYPE_RGB_8, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); + monitorTransform = cmsCreateTransform (iprof, TYPE_RGB_FLT, monitor, TYPE_RGB_8, settings->colorimetricIntent, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); } diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index 4c82a5a47..1d660b2cd 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -63,6 +63,9 @@ void ImProcFunctions::lab2rgb (LabImage* lab, Image8* image) { int ix = 0; float g; float* buffer = new float [3*lab->W]; + + // cmsDoTransform is relatively expensive + #pragma omp parallel for if (multiThread) for (int i=0; iH; i++) { float* rL = lab->L[i]; float* ra = lab->a[i]; @@ -134,11 +137,15 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, if (oprof) { cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprof, TYPE_RGB_8, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprof, TYPE_RGB_8, settings->colorimetricIntent, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); int ix = 0; float g; short* buffer = new short [3*cw]; + + // cmsDoTransform is relatively expensive + #pragma omp parallel for if (multiThread) for (int i=cy; iL[i]; float* ra = lab->a[i];