void Gui::debugImage(const Image* image, const RectI& roi, const QString & filename ) { if (image->getBitDepth() != eImageBitDepthFloat) { qDebug() << "Debug image only works on float images."; return; } RectI renderWindow; RectI bounds = image->getBounds(); if ( roi.isNull() ) { renderWindow = bounds; } else { if ( !roi.intersect(bounds, &renderWindow) ) { qDebug() << "The RoI does not interesect the bounds of the image."; return; } } QImage output(renderWindow.width(), renderWindow.height(), QImage::Format_ARGB32); const Color::Lut* lut = Color::LutManager::sRGBLut(); lut->validate(); Image::ReadAccess acc = image->getReadRights(); const float* from = (const float*)acc.pixelAt( renderWindow.left(), renderWindow.bottom() ); assert(from); int srcNComps = (int)image->getComponentsCount(); int srcRowElements = srcNComps * bounds.width(); for ( int y = renderWindow.height() - 1; y >= 0; --y, from += ( srcRowElements - srcNComps * renderWindow.width() ) ) { QRgb* dstPixels = (QRgb*)output.scanLine(y); assert(dstPixels); unsigned error_r = 0x80; unsigned error_g = 0x80; unsigned error_b = 0x80; for (int x = 0; x < renderWindow.width(); ++x, from += srcNComps, ++dstPixels) { float r, g, b, a; switch (srcNComps) { case 1: r = g = b = *from; a = 1; break; case 2: r = *from; g = *(from + 1); b = 0; a = 1; break; case 3: r = *from; g = *(from + 1); b = *(from + 2); a = 1; break; case 4: r = *from; g = *(from + 1); b = *(from + 2); a = *(from + 3); break; default: assert(false); return; } error_r = (error_r & 0xff) + lut->toColorSpaceUint8xxFromLinearFloatFast(r); error_g = (error_g & 0xff) + lut->toColorSpaceUint8xxFromLinearFloatFast(g); error_b = (error_b & 0xff) + lut->toColorSpaceUint8xxFromLinearFloatFast(b); assert(error_r < 0x10000 && error_g < 0x10000 && error_b < 0x10000); *dstPixels = qRgba( U8(error_r >> 8), U8(error_g >> 8), U8(error_b >> 8), U8(a * 255) ); } } U64 hashKey = image->getHashKey(); QString hashKeyStr = QString::number(hashKey); QString realFileName = filename.isEmpty() ? QString( hashKeyStr + QString::fromUtf8(".png") ) : filename; #ifdef DEBUG qDebug() << "Writing image: " << realFileName; renderWindow.debug(); #endif output.save(realFileName); } // Gui::debugImage