| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/camera/lib/image_utils/image_format_rgba.h" |
| |
| #include <gtest/gtest.h> |
| |
| namespace camera { |
| namespace { |
| |
| bool ComparePacked(fuchsia::sysmem::PixelFormatType format1, uint32_t value1, |
| fuchsia::sysmem::PixelFormatType format2, uint32_t value2) { |
| Rgba unpacked1 = RgbaUnpack(format1, value1); |
| Rgba unpacked2 = RgbaUnpack(format2, value2); |
| // Since the formats may have different bit_widths, mask the unpacked values |
| // so we only compare bits that both values share. |
| Rgba min_mask = BitWidthToByteMask(Min(BitWidth(format1), BitWidth(format2))); |
| return (unpacked1 & min_mask) == (unpacked2 & min_mask); |
| } |
| |
| // Fixed test colors using common patterns. |
| constexpr Rgba kTestColors[]{ |
| {0x00, 0x00, 0x00, 0x00}, // transparent black |
| {0xFF, 0xFF, 0xFF, 0x00}, // transparent white |
| {0x00, 0x00, 0x00, 0xFF}, // opaque black |
| {0xFF, 0xFF, 0xFF, 0xFF}, // opaque white |
| {0x00, 0x00, 0x00, 0x7F}, // 50% transparent black |
| {0xFF, 0xFF, 0xFF, 0x7F}, // 50% transparent white |
| {0xC5, 0x5C, 0x55, 0xCC}, // alternating bits 1 |
| {0x55, 0x5C, 0xC5, 0xCC}, // alternating bits 2 |
| {0x01, 0x23, 0x45, 0x67}, // sequential ascending |
| {0xFE, 0xDC, 0xBA, 0x98}, // sequential descending |
| }; |
| |
| TEST(RgbaImageFormat, RGBAColorConversionForAllFormats) { |
| auto testing_formats = GetSupportedFormats(); |
| for (size_t i = 0; i < testing_formats.size(); ++i) { |
| auto format1 = testing_formats[i]; |
| for (size_t j = i; j < testing_formats.size(); ++j) { |
| auto format2 = testing_formats[j]; |
| for (auto color : kTestColors) { |
| auto packed1 = RgbaPack(format1, color); |
| auto packed2 = RgbaPack(format2, color); |
| ASSERT_TRUE(ComparePacked(format1, packed1, format2, packed2)) |
| << "Format " << ToString(format1) << " did not match format " << ToString(format2) |
| << " At R: " << (int)color.r << " G: " << (int)color.g << " B: " << (int)color.b |
| << " A: " << (int)color.a << " packed1: " << packed1 << " packed2: " << packed2; |
| } |
| } |
| } |
| } |
| |
| } // namespace |
| } // namespace camera |