From d7f7c06f10c5d3070c3cfd503a76c284c482ae2d Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 9 Feb 2018 22:25:40 +0100 Subject: [PATCH] Whean read, 32 bits tiff image data are not scaled anymore So the highlights above the 1.0 upper limit will be clipped but colors will be preserved. Fix #4379 --- rtengine/imagefloat.cc | 15 +++++++++------ rtengine/imageio.cc | 23 +---------------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index fa45c53ba..0352c0b10 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -57,35 +57,38 @@ void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, float *mi float* sbuffer = (float*) buffer; for (int i = 0; i < width; i++) { - r(row, i) = sbuffer[ix]; + r(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[0]) { minValue[0] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[0]) { maxValue[0] = sbuffer[ix]; - } ++ix; + } } + ++ix; - g(row, i) = sbuffer[ix]; + g(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[1]) { minValue[1] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[1]) { maxValue[1] = sbuffer[ix]; - } ++ix; + } } + ++ix; - b(row, i) = sbuffer[ix]; + b(row, i) = 65535.f * sbuffer[ix]; if (minValue) { if (sbuffer[ix] < minValue[2]) { minValue[2] = sbuffer[ix]; } else if (sbuffer[ix] > maxValue[2]) { maxValue[2] = sbuffer[ix]; - } ++ix; + } } + ++ix; } break; diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 306c95892..4ea09aaf2 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -835,7 +835,6 @@ int ImageIO::loadTIFF (Glib::ustring fname) allocate (width, height); - float minValue[3] = {0.f, 0.f, 0.f}, maxValue[3] = {0.f, 0.f, 0.f}; unsigned char* linebuffer = new unsigned char[TIFFScanlineSize(in) * (samplesperpixel == 1 ? 3 : 1)]; for (int row = 0; row < height; row++) { @@ -861,33 +860,13 @@ int ImageIO::loadTIFF (Glib::ustring fname) } } - if (sampleFormat & (IIOSF_LOGLUV24 | IIOSF_LOGLUV32 | IIOSF_FLOAT)) { - setScanline (row, linebuffer, bitspersample, minValue, maxValue); - } else { - setScanline (row, linebuffer, bitspersample, nullptr, nullptr); - } + setScanline (row, linebuffer, bitspersample, nullptr, nullptr); if (pl && !(row % 100)) { pl->setProgress ((double)(row + 1) / height); } } - if (sampleFormat & (IIOSF_FLOAT | IIOSF_LOGLUV24 | IIOSF_LOGLUV32)) { -#ifdef _DEBUG - - if (options.rtSettings.verbose) - printf("Normalizing \"%s\" image \"%s\" whose mini/maxi values are:\n Red: minimum value=%0.5f / maximum value=%0.5f\n Green: minimum value=%0.5f / maximum value=%0.5f\n Blue: minimum value=%0.5f / maximum value=%0.5f\n", - getType(), fname.c_str(), - minValue[0], maxValue[0], minValue[1], - maxValue[1], minValue[2], maxValue[2] - ); - -#endif - float minVal = rtengine::min(minValue[0], minValue[1], minValue[2]); - float maxVal = rtengine::max(maxValue[0], maxValue[1], maxValue[2]); - normalizeFloat(minVal, maxVal); - } - TIFFClose(in); delete [] linebuffer;