| // 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)}); | |
| } |