+uint32_t PixelBuffer::GetBrightness() const
+{
+ uint32_t brightness = 0;
+
+ uint32_t bytesPerPixel = Pixel::GetBytesPerPixel(mPixelFormat);
+ if(bytesPerPixel)
+ {
+ unsigned char* pixel = mBuffer;
+ const uint32_t bufferSize = mWidth * mHeight;
+
+ if(bufferSize) // avoid division by zero to calculate brightness
+ {
+ uint64_t red = 0;
+ uint64_t green = 0;
+ uint64_t blue = 0;
+
+ for(uint32_t i = 0; i < bufferSize; ++i)
+ {
+ red += ReadChannel(pixel, mPixelFormat, Adaptor::RED);
+ green += ReadChannel(pixel, mPixelFormat, Adaptor::GREEN);
+ blue += ReadChannel(pixel, mPixelFormat, Adaptor::BLUE);
+ pixel += bytesPerPixel;
+ }
+ // http://www.w3.org/TR/AERT#color-contrast
+ brightness = (red * BRIGHTNESS_CONSTANT_R + green * BRIGHTNESS_CONSTANT_G + blue * BRIGHTNESS_CONSTANT_B) / (1000uLL * bufferSize);
+ }
+ }
+
+ return brightness;
+}
+