New option [Color Management]/LCMSSafeMode (no GUI) to allow disabled multithreading on LCMS

This commit is contained in:
Oliver Duis
2011-04-14 19:54:13 +02:00
parent af91e3bfb5
commit f258169b08
10 changed files with 92 additions and 72 deletions

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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 ();
}

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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. */

View File

@@ -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);
}

View File

@@ -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);