diff --git a/rtengine/image16.cc b/rtengine/image16.cc index f0c8aa6b3..47b365dd8 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -271,3 +271,10 @@ Image16::tofloat() const } return imgfloat; } + +// Parallized transformation; create transform with cmsFLAGS_NOCACHE! +void Image16::ExecCMSTransform(cmsHTRANSFORM hTransform) { + #pragma omp parallel for + for (int i=0; i #include #include +#include using namespace rtengine; @@ -234,4 +235,9 @@ Imagefloat::to16() const return img16; } - +// Parallized transformation; create transform with cmsFLAGS_NOCACHE! +void Imagefloat::ExecCMSTransform(cmsHTRANSFORM hTransform) { + #pragma omp parallel for + for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { @@ -1587,8 +1587,9 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams im->b[i][j] = (newb); } - } else {// use supplied input profile - //color space transform is expecting data in the range (0,1) + } else { + // use supplied input profile + // color space transform is expecting data in the range (0,1) for ( int h = 0; h < im->height; ++h ) for ( int w = 0; w < im->width; ++w ) { im->r[h][w] /= 65535.0f ; @@ -1597,14 +1598,19 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams } out = iccStore->workingSpace (cmp.working); // 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)), settings->colorimetricIntent, 0); + 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 lcmsMutex->unlock (); - if (hTransform) {//there is an input profile + + if (hTransform) { + // there is an input profile if (cmp.gammaOnInput) { float gd = pow (2.0, defgain); - defgain = 0.0;// Writeback defgain to be 0.0 -#pragma omp parallel for + defgain = 0.0; // Writeback defgain to be 0.0 + + #pragma omp parallel for for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { //TODO: extend beyond 65535 @@ -1613,21 +1619,28 @@ void RawImageSource::colorSpaceConversion (Imagefloat* im, ColorManagementParams im->b[i][j] = CurveFactory::gamma (CLIP(gd*im->b[i][j])); } } - cmsDoTransform (hTransform, im->data, im->data, im->planestride); - } else {//create the profile + + 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, cmsFLAGS_NOOPTIMIZE); + 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 lcmsMutex->unlock (); - cmsDoTransform (hTransform, im->data, im->data, im->planestride); + + im->ExecCMSTransform(hTransform); } - //restore normalization to the range (0,65535) + + cmsDeleteTransform(hTransform); + + // restore normalization to the range (0,65535) + #pragma omp parallel for for ( int h = 0; h < im->height; ++h ) for ( int w = 0; w < im->width; ++w ) { im->r[h][w] *= 65535.0 ; im->g[h][w] *= 65535.0 ; im->b[h][w] *= 65535.0 ; } - cmsDeleteTransform(hTransform); } t3.set (); // printf ("ICM TIME: %d\n", t3.etime(t1)); @@ -1642,9 +1655,8 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams if (cmp.input == "(none)") return; - MyTime t1, t2, t3; - - t1.set (); + //MyTime t1, t2, t3; + //t1.set (); cmsHPROFILE in; cmsHPROFILE out; @@ -1697,13 +1709,15 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams 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, 0); + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety lcmsMutex->unlock (); + if (hTransform) { if (cmp.gammaOnInput) { float gd = pow (2.0, defgain); defgain = 0.0; -#pragma omp parallel for + + #pragma omp parallel for for (int i=0; iheight; i++) for (int j=0; jwidth; j++) { im->r[i][j] = CurveFactory::gamma ((gd*im->r[i][j])); @@ -1711,17 +1725,21 @@ void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams im->b[i][j] = CurveFactory::gamma ((gd*im->b[i][j])); } } - cmsDoTransform (hTransform, im->data, im->data, im->planestride); + + im->ExecCMSTransform(hTransform); } else { lcmsMutex->lock (); - hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, 0); + hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE); lcmsMutex->unlock (); - cmsDoTransform (hTransform, im->data, im->data, im->planestride); + + im->ExecCMSTransform(hTransform); } + cmsDeleteTransform(hTransform); } - t3.set (); + + //t3.set (); // printf ("ICM TIME: %d\n", t3.etime(t1)); } diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index dcfde2d6e..820dba25f 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -315,10 +315,13 @@ 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); + 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); lcmsMutex->unlock (); - cmsDoTransform (hTransform, im->data, im->data, im->planestride); - cmsDeleteTransform(hTransform); + + im->ExecCMSTransform(hTransform); + + cmsDeleteTransform(hTransform); } } @@ -350,9 +353,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, 0); + cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16_PLANAR, out, TYPE_RGB_16_PLANAR, settings->colorimetricIntent, cmsFLAGS_NOCACHE); lcmsMutex->unlock (); - cmsDoTransform (hTransform, im->data, im->data, im->planestride); + + im->ExecCMSTransform(hTransform); + cmsDeleteTransform(hTransform); } }