X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Fimage.cpp;h=e69231332a7b6f413edc397b7e8e1f12764bd03f;hb=e86f5a2f9b1e57ee2535a285f6385878c78cf0ea;hp=4da9c1339696bc565678a9fce53cdb37ccb420ba;hpb=ae2b4d32ed56e3ac193cc7205aeb58082c448ce8;p=apitrace diff --git a/common/image.cpp b/common/image.cpp index 4da9c13..e692313 100644 --- a/common/image.cpp +++ b/common/image.cpp @@ -28,32 +28,40 @@ #include #include +#include + #include "image.hpp" -namespace Image { +namespace image { double Image::compare(Image &ref) { 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; } } @@ -63,7 +71,7 @@ double Image::compare(Image &ref) } 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 @@ -73,4 +81,4 @@ double Image::compare(Image &ref) } -} /* namespace Image */ +} /* namespace image */