blob: 433a53b164801531ee3206fd89d20c480e8de700 [file]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "testing/utils/pixel_diff_util.h"
#include <algorithm>
#include <cmath>
#include <cstdint>
namespace {
struct UnpackedPixel {
explicit UnpackedPixel(uint32_t packed)
: red(packed & 0xff),
green((packed >> 8) & 0xff),
blue((packed >> 16) & 0xff),
alpha((packed >> 24) & 0xff) {}
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t alpha;
};
uint8_t ChannelDelta(uint8_t baseline_channel, uint8_t actual_channel) {
// No casts are necessary because arithmetic operators implicitly convert
// `uint8_t` to `int` first. The final delta is always in the range 0 to 255.
return std::abs(baseline_channel - actual_channel);
}
} // namespace
uint8_t MaxPixelPerChannelDelta(uint32_t baseline_pixel,
uint32_t actual_pixel) {
UnpackedPixel baseline_unpacked(baseline_pixel);
UnpackedPixel actual_unpacked(actual_pixel);
return std::max(
{ChannelDelta(baseline_unpacked.red, actual_unpacked.red),
ChannelDelta(baseline_unpacked.green, actual_unpacked.green),
ChannelDelta(baseline_unpacked.blue, actual_unpacked.blue),
ChannelDelta(baseline_unpacked.alpha, actual_unpacked.alpha)});
}
uint32_t PixelSquaredError(uint32_t baseline_pixel, uint32_t actual_pixel) {
UnpackedPixel baseline_unpacked(baseline_pixel);
UnpackedPixel actual_unpacked(actual_pixel);
int dr = baseline_unpacked.red - actual_unpacked.red;
int dg = baseline_unpacked.green - actual_unpacked.green;
int db = baseline_unpacked.blue - actual_unpacked.blue;
return static_cast<uint32_t>(dr * dr + dg * dg + db * db);
}