diff --git a/rtengine/image16.cc b/rtengine/image16.cc index 997d7d992..c545497e3 100644 --- a/rtengine/image16.cc +++ b/rtengine/image16.cc @@ -78,7 +78,7 @@ void Image16::getScanline (int row, unsigned char* buffer, int bps) * void Image16::setScanline (int row, unsigned char* buffer, int bps, int minValue[3], int maxValue[3]); * has not been implemented yet, because as of now, this method is called for IIOSF_FLOAT sample format only */ -void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Image16::setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue, float *maxValue) { if (data == nullptr) { @@ -92,12 +92,17 @@ void Image16::setScanline (int row, unsigned char* buffer, int bps, float *minVa case (IIOSF_UNSIGNED_CHAR): { int ix = 0; - for (int i = 0; i < width; ++i) { - r(row, i) = static_cast(buffer[ix++]) * 257; - g(row, i) = static_cast(buffer[ix++]) * 257; - b(row, i) = static_cast(buffer[ix++]) * 257; + if(numSamples == 1) { + for (int i = 0; i < width; ++i) { + r(row, i) = g(row, i) = b(row, i) = static_cast(buffer[ix++]) * 257; + } + } else { + for (int i = 0; i < width; ++i) { + r(row, i) = static_cast(buffer[ix++]) * 257; + g(row, i) = static_cast(buffer[ix++]) * 257; + b(row, i) = static_cast(buffer[ix++]) * 257; + } } - break; } diff --git a/rtengine/image16.h b/rtengine/image16.h index ee402d556..af5642638 100644 --- a/rtengine/image16.h +++ b/rtengine/image16.h @@ -56,7 +56,7 @@ public: return 8 * sizeof(unsigned short); } virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue = nullptr, float *maxValue = nullptr); // functions inherited from IImage16: virtual MyMutex& getMutex () diff --git a/rtengine/image8.cc b/rtengine/image8.cc index 86294236b..69066f2dd 100644 --- a/rtengine/image8.cc +++ b/rtengine/image8.cc @@ -55,7 +55,7 @@ void Image8::getScanline (int row, unsigned char* buffer, int bps) } } -void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Image8::setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue, float *maxValue) { if (data == nullptr) { @@ -67,7 +67,13 @@ void Image8::setScanline (int row, unsigned char* buffer, int bps, float *minVal switch (sampleFormat) { case (IIOSF_UNSIGNED_CHAR): - memcpy (data + row * width * 3u, buffer, width * 3); + if(numSamples == 1) { + for(size_t i = 0; i < static_cast(width); ++i) { + data[row * width * 3 + 3 * i] = data[row * width * 3 + 3 * i + 1] = data[row * width * 3 + 3 * i + 2] = buffer[i]; + } + } else { + memcpy (data + row * width * 3u, buffer, width * 3); + } break; case (IIOSF_UNSIGNED_SHORT): { diff --git a/rtengine/image8.h b/rtengine/image8.h index c4651a07d..eafaa2d46 100644 --- a/rtengine/image8.h +++ b/rtengine/image8.h @@ -51,7 +51,7 @@ public: return 8 * sizeof(unsigned char); } virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue = nullptr, float *maxValue = nullptr); // functions inherited from IImage*: virtual MyMutex& getMutex () diff --git a/rtengine/imagefloat.cc b/rtengine/imagefloat.cc index 3b211d15e..f6cc252fa 100644 --- a/rtengine/imagefloat.cc +++ b/rtengine/imagefloat.cc @@ -44,7 +44,7 @@ Imagefloat::~Imagefloat () } // Call this method to handle floating points input values of different size -void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, float *minValue, float *maxValue) +void Imagefloat::setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue, float *maxValue) { if (data == nullptr) { diff --git a/rtengine/imagefloat.h b/rtengine/imagefloat.h index 753406d25..5246a2f6e 100644 --- a/rtengine/imagefloat.h +++ b/rtengine/imagefloat.h @@ -60,7 +60,7 @@ public: return 8 * sizeof(float); } virtual void getScanline (int row, unsigned char* buffer, int bps); - virtual void setScanline (int row, unsigned char* buffer, int bps, float *minValue = nullptr, float *maxValue = nullptr); + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples, float *minValue = nullptr, float *maxValue = nullptr); // functions inherited from IImagefloat: virtual MyMutex& getMutex () diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 147edba53..1d07fbc84 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -523,7 +523,7 @@ int ImageIO::loadJPEGFromMemory (const char* buffer, int bufsize) return IMIO_READERROR; } - setScanline (cinfo.output_scanline - 1, row, 8); + setScanline (cinfo.output_scanline - 1, row, 8, cinfo.num_components); if (pl && !(cinfo.output_scanline % 100)) { pl->setProgress ((double)(cinfo.output_scanline) / cinfo.output_height); @@ -860,7 +860,7 @@ int ImageIO::loadTIFF (Glib::ustring fname) } } - setScanline (row, linebuffer, bitspersample, nullptr, nullptr); + setScanline (row, linebuffer, bitspersample); if (pl && !(row % 100)) { pl->setProgress ((double)(row + 1) / height); diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 4c0cd56c5..294a3d476 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -113,7 +113,7 @@ public: virtual int getBPS () = 0; virtual void getScanline (int row, unsigned char* buffer, int bps) {} - virtual void setScanline (int row, unsigned char* buffer, int bps, float minValue[3] = nullptr, float maxValue[3] = nullptr) {} + virtual void setScanline (int row, unsigned char* buffer, int bps, unsigned int numSamples = 3, float minValue[3] = nullptr, float maxValue[3] = nullptr) {} virtual bool readImage (Glib::ustring &fname, FILE *fh) { diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 8d7292113..b2f77026d 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -332,10 +332,16 @@ skip_block: pre_mul_[3] = pre_mul_[1] = (pre_mul_[3] + pre_mul_[1]) / 2; } - if (colors == 1) + if (colors == 1) { + // there are monochrome cameras with wrong matrix. We just replace with this one. + rgb_cam[0][0] = 1; rgb_cam[1][0] = 0; rgb_cam[2][0] = 0; + rgb_cam[0][1] = 0; rgb_cam[1][1] = 1; rgb_cam[2][1] = 0; + rgb_cam[0][2] = 0; rgb_cam[1][2] = 0; rgb_cam[2][2] = 1; + for (c = 1; c < 4; c++) { cblack_[c] = cblack_[0]; } + } bool multiple_whites = false; int largest_white = this->get_white(0); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 8be6cfb1d..d6ae6a199 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1593,7 +1593,7 @@ int RawImageSource::load (const Glib::ustring &fname) for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { - imatrices.rgb_cam[i][j] = ri->get_rgb_cam(i, j); + imatrices.rgb_cam[i][j] = ri->get_colors() == 1 ? (i == j) : ri->get_rgb_cam(i, j); } // compute inverse of the color transformation matrix