New option [Color Management]/LCMSSafeMode (no GUI) to allow disabled multithreading on LCMS
This commit is contained in:
@@ -273,8 +273,12 @@ Image16::tofloat() const
|
||||
}
|
||||
|
||||
// Parallized transformation; create transform with cmsFLAGS_NOCACHE!
|
||||
void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) {
|
||||
void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform, bool safe) {
|
||||
if (safe) {
|
||||
cmsDoTransform(hTransform, data, data, planestride);
|
||||
} else {
|
||||
#pragma omp parallel for
|
||||
for (int i=0; i<height; i++)
|
||||
cmsDoTransform(hTransform, data + 3*i*rowstride, data + 3*i*rowstride, rowstride);
|
||||
}
|
||||
}
|
@@ -88,7 +88,7 @@ class Image16 : public ImageIO, public IImage16 {
|
||||
virtual unsigned short** getGPlane () { return g; }
|
||||
virtual unsigned short** getBPlane () { return b; }
|
||||
|
||||
void ExecCMSTransform(cmsHTRANSFORM hTransform);
|
||||
void ExecCMSTransform(cmsHTRANSFORM hTransform, bool safe);
|
||||
};
|
||||
};
|
||||
#endif
|
||||
|
@@ -236,8 +236,12 @@ Imagefloat::to16() const
|
||||
}
|
||||
|
||||
// Parallized transformation; create transform with cmsFLAGS_NOCACHE!
|
||||
void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) {
|
||||
void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform, bool safe) {
|
||||
if (safe) {
|
||||
cmsDoTransform(hTransform, data, data, planestride);
|
||||
} else {
|
||||
#pragma omp parallel for
|
||||
for (int i=0; i<height; i++)
|
||||
cmsDoTransform(hTransform, data + 3*i*rowstride, data + 3*i*rowstride, rowstride);
|
||||
}
|
||||
}
|
||||
|
@@ -90,7 +90,7 @@ class Imagefloat : public ImageIO, public IImagefloat {
|
||||
virtual float** getGPlane () { return g; }
|
||||
virtual float** getBPlane () { return b; }
|
||||
|
||||
void ExecCMSTransform(cmsHTRANSFORM hTransform);
|
||||
void ExecCMSTransform(cmsHTRANSFORM hTransform, bool safe);
|
||||
};
|
||||
};
|
||||
#endif
|
||||
|
@@ -32,7 +32,6 @@
|
||||
#include <imagesource.h>
|
||||
#include <rtthumbnail.h>
|
||||
#include <utils.h>
|
||||
|
||||
#include <iccmatrices.h>
|
||||
|
||||
#ifdef _OPENMP
|
||||
@@ -165,7 +164,7 @@ void ImProcFunctions::firstAnalysis (Imagefloat* original, const ProcParams* par
|
||||
cmsHPROFILE iprof = iccStore->getXYZProfile ();
|
||||
lcmsMutex->lock ();
|
||||
monitorTransform = cmsCreateTransform (iprof, TYPE_RGB_FLT, monitor, TYPE_RGB_8, settings->colorimetricIntent,
|
||||
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
lcmsMutex->unlock ();
|
||||
}
|
||||
|
||||
|
@@ -150,7 +150,7 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch,
|
||||
cmsHPROFILE iprof = iccStore->getXYZProfile ();
|
||||
lcmsMutex->lock ();
|
||||
cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16, oprof, TYPE_RGB_8, settings->colorimetricIntent,
|
||||
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
// cmsDoTransform is relatively expensive
|
||||
@@ -180,7 +180,9 @@ Image8* ImProcFunctions::lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch,
|
||||
buffer[iy++] = CLIP((int)z_);
|
||||
}
|
||||
|
||||
if (settings->LCMSSafeMode) lcmsMutex->lock ();
|
||||
cmsDoTransform (hTransform, buffer, image->data + ix, cw);
|
||||
if (settings->LCMSSafeMode) lcmsMutex->unlock ();
|
||||
}
|
||||
|
||||
cmsDeleteTransform(hTransform);
|
||||
@@ -265,10 +267,12 @@ Image16* ImProcFunctions::lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int
|
||||
za[j-cx] = CLIP((int)z_);
|
||||
}
|
||||
}
|
||||
|
||||
cmsHPROFILE iprof = iccStore->getXYZProfile ();
|
||||
lcmsMutex->lock ();
|
||||
cmsHTRANSFORM hTransform = cmsCreateTransform (iprof, TYPE_RGB_16_PLANAR, oprof, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOOPTIMIZE);
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
cmsDoTransform (hTransform, image->data, image->data, image->planestride);
|
||||
cmsDeleteTransform(hTransform);
|
||||
} else {
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include <ffmanager.h>
|
||||
#include <slicer.h>
|
||||
#include <iostream>
|
||||
#include <options.h>
|
||||
|
||||
#include <improcfun.h>
|
||||
|
||||
@@ -1603,7 +1604,7 @@ 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)), settings->colorimetricIntent,
|
||||
cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
if (hTransform) {
|
||||
@@ -1622,15 +1623,15 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams
|
||||
}
|
||||
}
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
} 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,
|
||||
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE ); // NOCACHE is important for thread safety
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
}
|
||||
|
||||
cmsDeleteTransform(hTransform);
|
||||
@@ -1688,7 +1689,7 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams
|
||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE); //cmsFLAGS_MATRIXINPUT | cmsFLAGS_MATRIXOUTPUT);//cmsFLAGS_MATRIXINPUT | cmsFLAGS_MATRIXOUTPUT);
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
cmsDeleteTransform(hTransform);
|
||||
*/
|
||||
// in this case we avoid using the slllllooooooowwww lcms
|
||||
@@ -1716,7 +1717,8 @@ TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working);
|
||||
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, cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety
|
||||
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
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
if (hTransform) {
|
||||
@@ -1733,14 +1735,15 @@ TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working);
|
||||
}
|
||||
}
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
}
|
||||
else {
|
||||
lcmsMutex->lock ();
|
||||
hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE);
|
||||
hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent,
|
||||
settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE);
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
}
|
||||
|
||||
cmsDeleteTransform(hTransform);
|
||||
|
@@ -33,6 +33,7 @@ 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
|
||||
|
||||
/** Creates a new instance of Settings.
|
||||
* @return a pointer to the new Settings instance. */
|
||||
|
@@ -328,10 +328,10 @@ 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,
|
||||
cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
|
||||
settings->LCMSSafeMode ? cmsFLAGS_NOOPTIMIZE : cmsFLAGS_NOOPTIMIZE | cmsFLAGS_NOCACHE);
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
|
||||
cmsDeleteTransform(hTransform);
|
||||
}
|
||||
@@ -365,10 +365,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, cmsFLAGS_NOCACHE);
|
||||
cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent,
|
||||
settings->LCMSSafeMode ? 0 : cmsFLAGS_NOCACHE);
|
||||
lcmsMutex->unlock ();
|
||||
|
||||
im->ExecCMSTransform(hTransform);
|
||||
im->ExecCMSTransform(hTransform, settings->LCMSSafeMode);
|
||||
|
||||
cmsDeleteTransform(hTransform);
|
||||
}
|
||||
|
@@ -151,6 +151,7 @@ void Options::setDefaults () {
|
||||
rtSettings.colorimetricIntent = 1;
|
||||
rtSettings.monitorProfile = "";
|
||||
rtSettings.autoMonitorProfile = false;
|
||||
rtSettings.LCMSSafeMode = false;
|
||||
|
||||
rtSettings.verbose = false;
|
||||
}
|
||||
@@ -312,6 +313,8 @@ if (keyFile.has_group ("Color Management")) {
|
||||
if (keyFile.has_key ("Color Management", "AutoMonitorProfile")) rtSettings.autoMonitorProfile = keyFile.get_boolean ("Color Management", "AutoMonitorProfile");
|
||||
|
||||
if (keyFile.has_key ("Color Management", "Intent")) rtSettings.colorimetricIntent = keyFile.get_integer("Color Management", "Intent");
|
||||
|
||||
if (keyFile.has_key ("Color Management", "LCMSSafeMode")) rtSettings.LCMSSafeMode = keyFile.get_boolean ("Color Management", "LCMSSafeMode");
|
||||
}
|
||||
|
||||
if (keyFile.has_group ("Batch Processing")) {
|
||||
@@ -453,6 +456,7 @@ 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);
|
||||
|
||||
Glib::ArrayHandle<int> bab = baBehav;
|
||||
keyFile.set_integer_list ("Batch Processing", "AdjusterBehavior", bab);
|
||||
|
Reference in New Issue
Block a user