]> git.cworth.org Git - apitrace/blobdiff - common/image.cpp
Fix scripts absolute earch path (issue #76).
[apitrace] / common / image.cpp
index 4da9c1339696bc565678a9fce53cdb37ccb420ba..e69231332a7b6f413edc397b7e8e1f12764bd03f 100644 (file)
 #include <assert.h>
 #include <math.h>
 
+#include <algorithm>
+
 #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 */