committing some missing parts

metadata
Wenzel Jakob 2013-11-26 17:48:33 +01:00
parent 307e345f4d
commit fd7400593a
3 changed files with 65 additions and 0 deletions

View File

@ -732,6 +732,9 @@ public:
/// Vertically flip the image contents
void flipVertically();
/// Compute the average value of the bitmap
Spectrum average() const;
/// Perform the specified rotatation & flip operation
ref<Bitmap> rotateFlip(ERotateFlipType type) const;

View File

@ -163,6 +163,15 @@ public:
*/
static Thread *registerUnmanagedThread(const std::string &name);
/**
* \brief Register a thread crash handler
*
* A crash handler is called whenever a thread fails with an uncaught
* exception. This can be used to implement more useful error messages
* in certain circumstances
*/
static void registerCrashHandler(bool (*handler)(void));
MTS_DECLARE_CLASS()
protected:
/// Virtual destructor

View File

@ -592,6 +592,59 @@ void Bitmap::accumulate(const Bitmap *bitmap, Point2i sourceOffset,
}
}
Spectrum Bitmap::average() const {
if (m_gamma != 1 || (m_componentFormat != EFloat16 &&
m_componentFormat != EFloat32 && m_componentFormat != EFloat64))
Log(EError, "Bitmap::average() assumes a floating point image with linear gamma!");
size_t pixelCount = (size_t) m_size.x * (size_t) m_size.y;
Float *accum = new Float[m_channelCount];
memset(accum, 0, sizeof(Float) * m_channelCount);
switch (m_componentFormat) {
case EFloat16: {
const half *ptr = getFloat16Data();
for (size_t i=0; i<pixelCount; ++i)
for (int ch=0; ch<m_channelCount; ++ch)
accum[ch] += (Float) *ptr++;
}
break;
case EFloat32: {
const float *ptr = getFloat32Data();
for (size_t i=0; i<pixelCount; ++i)
for (int ch=0; ch<m_channelCount; ++ch)
accum[ch] += (Float) *ptr++;
}
break;
case EFloat64: {
const double *ptr = getFloat64Data();
for (size_t i=0; i<pixelCount; ++i)
for (int ch=0; ch<m_channelCount; ++ch)
accum[ch] += (Float) *ptr++;
}
break;
default:
Log(EError, "average(): Unsupported component format!");
}
for (int ch=0; ch<m_channelCount; ++ch)
accum[ch] /= pixelCount;
const FormatConverter *cvt = FormatConverter::getInstance(
std::make_pair(EFloat, EFloat)
);
Spectrum result;
cvt->convert(m_pixelFormat, 1.0f, accum,
ESpectrum, 1.0f, &result, 1);
delete[] accum;
return result;
}
#if defined(MTS_HAS_FFTW)
static boost::mutex __fftw_lock;
#endif