X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Fimage.cpp;h=e69231332a7b6f413edc397b7e8e1f12764bd03f;hb=67ec200baea241d55bea33c43fd5194d90d9e401;hp=0cb38ed3d5fdcce5a947ac06fd9b4583379a0a75;hpb=b4a3d1495a5e92ba23bf463bcea34a6e75b55294;p=apitrace diff --git a/common/image.cpp b/common/image.cpp index 0cb38ed..e692313 100644 --- a/common/image.cpp +++ b/common/image.cpp @@ -28,6 +28,8 @@ #include #include +#include + #include "image.hpp" @@ -38,22 +40,28 @@ 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