diff --git a/rtengine/image16.cc b/rtengine/image16.cc index dbcc08612..890a90164 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -273,12 +273,25 @@ Image16::tofloat() const } // Parallized transformation; create transform with cmsFLAGS_NOCACHE! -void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, bool safe) { - if (safe) { - cmsDoTransform(hTransform, data, data, planestride); - } else { +void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) { + //cmsDoTransform(hTransform, data, data, planestride); + + // LittleCMS cannot parallize planar setups + // so build temporary buffers to allow multi processor execution #pragma omp parallel for - for (int i=0; igetXYZProfile (); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16_PLANAR, oprof, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprof, TYPE_RGB_16, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); lcmsMutex->unlock (); - cmsDoTransform (hTransform, image->data, image->data, image->planestride); + image->ExecCMSTransform(hTransform); + cmsDeleteTransform(hTransform); } else { #pragma omp parallel for if (multiThread) @@ -406,10 +407,10 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int cmsHPROFILE iprof = iccStore->getXYZProfile (); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16_PLANAR, oprofdef, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); + cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprofdef, TYPE_RGB_16, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE); lcmsMutex->unlock (); - cmsDoTransform (hTransform, image->data, image->data, image->planestride); + image->ExecCMSTransform(hTransform); cmsDeleteTransform(hTransform); } else { // diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 4510fb9a3..b5bb28568 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1767,21 +1767,21 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams } }; lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, out, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, // float is clipless, so don't trim it - settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); if (hTransform) { - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); } else { // create the profile from camera lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, - settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, out, TYPE_RGB_FLT, settings->colorimetricIntent, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); } float x, y,z; Glib::ustring choiceprofile; @@ -1808,22 +1808,22 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams // out = iccStore->workingSpaceGamma (wProfile); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, out, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, // float is clipless, so don't trim it - settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); if (hTransform) { // there is an input profile - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); } else { // create the profile from camera lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, - settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_FLT, out, TYPE_RGB_FLT, settings->colorimetricIntent, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety lcmsMutex->unlock (); - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); } cmsDeleteTransform(hTransform); @@ -1950,12 +1950,12 @@ TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working); cmsHPROFILE out = iccStore->workingSpace (cmp.working); // out = iccStore->workingSpaceGamma (wProfile); lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, - settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16, out, TYPE_RGB_16, settings->colorimetricIntent, + cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety lcmsMutex->unlock (); if (hTransform) { - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); // There might be Nikon postprocessings if (lineSum>0) { @@ -1970,11 +1970,11 @@ TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working); } else { lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, - settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE); + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16, out, TYPE_RGB_16, settings->colorimetricIntent, + cmsFLAGS_NOCACHE); lcmsMutex->unlock (); - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); } cmsDeleteTransform(hTransform); diff --git a/rtengine/settings.h b/rtengine/settings.h index a8231987c..81a30ce98 100644 --- a/rtengine/settings.h +++ b/rtengine/settings.h @@ -32,7 +32,6 @@ namespace rtengine { bool verbose; Glib::ustring darkFramesPath; ///< The default directory for dark frames Glib::ustring flatFieldsPath; ///< The default directory for flat fields - bool LCMSSafeMode; // If true, not OMP Glib::ustring adobe; // default name of AdobeRGB1998 Glib::ustring prophoto; // default name of Prophoto Glib::ustring prophoto10; // default name of Prophoto diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index e44c438b6..8001ce1ae 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -332,11 +332,11 @@ void StdImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams if (cmp.input!="(none)") { lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (in, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), out, (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)), settings->colorimetricIntent, - settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_FLT, out, TYPE_RGB_FLT, settings->colorimetricIntent, + cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE); lcmsMutex->unlock (); - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); cmsDeleteTransform(hTransform); } @@ -363,11 +363,11 @@ void StdImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams if (cmp.input!="(none)") { lcmsMutex->lock (); - cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, - settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE); + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16, out, TYPE_RGB_16, settings->colorimetricIntent, + cmsFLAGS_NOCACHE); lcmsMutex->unlock (); - im->ExecCMSTransform(hTransform, settings->LCMSSafeMode); + im->ExecCMSTransform(hTransform); cmsDeleteTransform(hTransform); } diff --git a/rtgui/options.cc b/rtgui/options.cc index d9784bb8c..acada7af2 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -270,7 +270,6 @@ void Options::setDefaults () { rtSettings.colorimetricIntent = 1; rtSettings.monitorProfile = ""; rtSettings.autoMonitorProfile = false; - rtSettings.LCMSSafeMode = true; rtSettings.adobe = "RT_Medium_gsRGB"; // put the name of yours profiles (here windows) rtSettings.prophoto = "RT_Large_gBT709"; // these names appear in the menu "output profile" rtSettings.prophoto10 = "RT_Large_g10"; // these names appear in the menu "output profile" @@ -482,9 +481,6 @@ if (keyFile.has_group ("Color Management")) { if( keyFile.has_key ("Color Management", "Beta")) rtSettings.beta = keyFile.get_string("Color Management", "Beta"); if( keyFile.has_key ("Color Management", "Best")) rtSettings.best = keyFile.get_string("Color Management", "Best"); if( keyFile.has_key ("Color Management", "Bruce")) rtSettings.bruce = keyFile.get_string("Color Management", "Bruce"); - - // Disabled (default is true) till issues are sorted out - //if (keyFile.has_key ("Color Management", "LCMSSafeMode")) rtSettings.LCMSSafeMode = keyFile.get_boolean ("Color Management", "LCMSSafeMode"); } if (keyFile.has_group ("Batch Processing")) { @@ -685,7 +681,6 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_string ("Color Management", "MonitorProfile", rtSettings.monitorProfile); keyFile.set_boolean ("Color Management", "AutoMonitorProfile", rtSettings.autoMonitorProfile); keyFile.set_integer ("Color Management", "Intent", rtSettings.colorimetricIntent); - keyFile.set_boolean ("Color Management", "LCMSSafeMode", rtSettings.LCMSSafeMode); keyFile.set_string ("Color Management", "AdobeRGB", rtSettings.adobe); keyFile.set_string ("Color Management", "ProPhoto", rtSettings.prophoto); keyFile.set_string ("Color Management", "ProPhoto10", rtSettings.prophoto10);