diff --git a/include/mitsuba/core/bitmap.h b/include/mitsuba/core/bitmap.h index a59328dd..2bc65e16 100644 --- a/include/mitsuba/core/bitmap.h +++ b/include/mitsuba/core/bitmap.h @@ -725,6 +725,11 @@ public: void accumulate(const Bitmap *bitmap, Point2i sourceOffset, Point2i targetOffset, Vector2i size); + /** + * \brief Scale the entire image by a certain value + */ + void scale(Float value); + /** * \brief Color balancing: apply the given scale factors to the * red, green, and blue channels of the image diff --git a/src/libcore/bitmap.cpp b/src/libcore/bitmap.cpp index 99b93ae3..dc02b7c0 100644 --- a/src/libcore/bitmap.cpp +++ b/src/libcore/bitmap.cpp @@ -555,6 +555,147 @@ void Bitmap::accumulate(const Bitmap *bitmap, Point2i sourceOffset, } } +void Bitmap::scale(Float value) { + if (m_componentFormat == EBitmask) + Log(EError, "Bitmap::scale(): bitmasks are not supported!"); + + size_t nPixels = getPixelCount(), nChannels = getChannelCount(); + + if (hasAlpha()) { + switch (m_componentFormat) { + case EUInt8: { + uint8_t *data = (uint8_t *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, *data * value + (Float) 0.5f)); + ++data; + } + ++data; + } + } + break; + + case EUInt16: { + uint16_t *data = (uint16_t *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, *data * value + (Float) 0.5f)); + ++data; + } + ++data; + } + } + break; + + case EUInt32: { + uint32_t *data = (uint32_t *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, *data * value + (Float) 0.5f)); + ++data; + } + ++data; + } + } + break; + + case EFloat16: { + half *data = (half *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, data[i] * value + (Float) 0.5f)); + } + break; + + case EUInt16: { + uint16_t *data = (uint16_t *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, data[i] * value + (Float) 0.5f)); + } + break; + + case EUInt32: { + uint32_t *data = (uint32_t *) m_data; + for (size_t i=0; i::max(), + std::max((Float) 0, data[i] * value + (Float) 0.5f)); + } + break; + + case EFloat16: { + half *data = (half *) m_data; + for (size_t i=0; i