blob: f22b6084e62e496bb64fadf9310752d46d58f006 [file] [log] [blame]
// 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)});
}