#include <assert.h>
#include <math.h>
+#include <algorithm>
+
#include "image.hpp"
{
if (width != ref.width ||
height != ref.height ||
- channels != ref.channels) {
+ channels < 3 ||
+ ref.channels < 3) {
+ return 0.0;
+ }
+
+ // Ignore missing alpha when comparing RGB w/ RGBA, but enforce an equal
+ // number of channels otherwise.
+ unsigned minChannels = std::min(channels, ref.channels);
+ if (channels != ref.channels && minChannels < 3) {
return 0.0;
}
const unsigned char *pSrc = start();
const unsigned char *pRef = ref.start();
- assert(channels >= 3);
-
unsigned long long error = 0;
for (unsigned y = 0; y < height; ++y) {
for (unsigned x = 0; x < width; ++x) {
// FIXME: Ignore alpha channel until we are able to pick a visual
// that matches the traces
- for (unsigned c = 0; c < 3; ++c) {
- int delta = pSrc[x*channels + c] - pRef[x*channels + c];
+ for (unsigned c = 0; c < minChannels; ++c) {
+ int delta = pSrc[x*channels + c] - pRef[x*ref.channels + c];
error += delta*delta;
}
}
}
double numerator = error*2 + 1;
- double denominator = height*width*3ULL*255ULL*255ULL*2;
+ double denominator = height*width*minChannels*255ULL*255ULL*2;
double quotient = numerator/denominator;
// Precision in bits
image::Image *
-getDrawBufferImage(GLenum format) {
+getDrawBufferImage() {
+ GLenum format = GL_RGB;
GLint channels = __gl_format_channels(format);
if (channels > 4) {
return NULL;
glGetIntegerv(GL_READ_BUFFER, &read_buffer);
GLint alpha_bits = 0;
+#if 0
+ // XXX: Ignore alpha until we are able to match the traced visual
glGetIntegerv(GL_ALPHA_BITS, &alpha_bits);
+#endif
GLenum format = alpha_bits ? GL_RGBA : GL_RGB;
json.beginMember(enumToString(draw_buffer));
dumpReadBufferImage(json, width, height, format);
json.endMember();
}
}
+
+
/**
* Dump the specified framebuffer attachment.
*
void dumpCurrentContext(std::ostream &os);
image::Image *
-getDrawBufferImage(GLenum format);
+getDrawBufferImage(void);
} /* namespace glstate */