// Copyright 2019 Google LLC
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

// Image Diff:   Provides a metric for measuring the difference between two encoded images.   Prints
// out a single floating-point number between 0.0 and 1.0; 0 means that the images are identical; 1
// means that each pixel is maximally different in each channel.  A non-zero return value indicates
// that something went wrong.

#include "include/codec/SkCodec.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkData.h"
#include "include/core/SkPixmap.h"
#include "include/core/SkSize.h"

#include <array>
#include <cmath>
#include <cstdio>

int main(int argc, char** argv) {
    if (argc != 3) {
        const char usage[] = "\nUsage:\n  %s {FILE1}.png {FILE2}.png\n\n";
        fprintf(stderr, usage, argv[0]);
        return 1;
    }
    std::array<SkBitmap, 2> bm;
    for (int i = 0; i < 2; ++i) {
        const char* path = argv[i + 1];
        if (std::unique_ptr<SkCodec> codec =
                SkCodec::MakeFromData(SkData::MakeFromFileName(path))) {
            bm[i].allocN32Pixels(codec->dimensions().fWidth, codec->dimensions().fHeight);
            if (SkCodec::kSuccess == codec->getPixels(bm[i].pixmap())) {
                continue;
            }
        }
        fprintf(stderr, "\nBad file: '%s'.\n\n", path);
        return 2;
    }
    SkISize dim = bm[0].dimensions();
    if (dim != bm[1].dimensions()) {
        fprintf(stderr, "\nImages must be same size: (%d,%d) != (%d,%d)\n\n",
                dim.fWidth, dim.fHeight, bm[1].dimensions().fWidth, bm[1].dimensions().fHeight);
        return 3;
    }
    int64_t totalDiffs = 0; // Manhattan distance in ARGB color-space.
    for (int y = 0; y < dim.fHeight; ++y) {
        const uint8_t* row1 = reinterpret_cast<const uint8_t*>(bm[0].pixmap().addr32(0, y));
        const uint8_t* row2 = reinterpret_cast<const uint8_t*>(bm[1].pixmap().addr32(0, y));
        for (size_t i = 0; i < (size_t)dim.fWidth * (size_t)4; ++i) {
            totalDiffs += std::abs((int)row1[i] - (int)row2[i]);
        }
    }
    printf("%g\n", (double)totalDiffs /
                   ((uint64_t)255 * 4 * (uint64_t)dim.fWidth * (uint64_t)dim.fHeight));
    return 0;
}
