Move avifImageIsOpaque() from write.c to avif.h
Make it public so that it can be used in aviftest_helpers.cc and by
users.
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 632ba7a..e340ff8 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -98,6 +98,11 @@
target_include_directories(avifmetadatatest PRIVATE ${GTEST_INCLUDE_DIRS})
add_test(NAME avifmetadatatest COMMAND avifmetadatatest ${CMAKE_CURRENT_SOURCE_DIR}/data/)
+ add_executable(avifopaquetest gtest/avifopaquetest.cc)
+ target_link_libraries(avifopaquetest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
+ target_include_directories(avifopaquetest PRIVATE ${GTEST_INCLUDE_DIRS})
+ add_test(NAME avifopaquetest COMMAND avifopaquetest)
+
add_executable(avifrgbtoyuvtest gtest/avifrgbtoyuvtest.cc)
target_link_libraries(avifrgbtoyuvtest aviftest_helpers ${GTEST_BOTH_LIBRARIES})
target_include_directories(avifrgbtoyuvtest PRIVATE ${GTEST_INCLUDE_DIRS})
diff --git a/tests/gtest/avifopaquetest.cc b/tests/gtest/avifopaquetest.cc
new file mode 100644
index 0000000..5a48526
--- /dev/null
+++ b/tests/gtest/avifopaquetest.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 Google LLC
+// SPDX-License-Identifier: BSD-2-Clause
+
+#include "avif/avif.h"
+#include "aviftest_helpers.h"
+#include "gtest/gtest.h"
+
+namespace libavif {
+namespace {
+
+TEST(OpaqueTest, AlphaAndNoAlpha) {
+ for (bool alpha_is_opaque : {false, true}) {
+ for (int depth : {8, 10, 12}) {
+ testutil::AvifImagePtr alpha = testutil::CreateImage(
+ 1, 1, depth, AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_ALL);
+ testutil::AvifImagePtr no_alpha = testutil::CreateImage(
+ 1, 1, depth, AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_YUV);
+
+ const uint32_t max_value = (1u << depth) - 1;
+ const uint32_t yuva[] = {max_value, max_value, max_value,
+ alpha_is_opaque ? max_value : (max_value - 1)};
+ testutil::FillImagePlain(alpha.get(), yuva);
+ testutil::FillImagePlain(no_alpha.get(), yuva);
+
+ EXPECT_EQ(testutil::AreImagesEqual(*alpha, *no_alpha), alpha_is_opaque);
+ }
+ }
+}
+
+} // namespace
+} // namespace libavif
diff --git a/tests/gtest/aviftest_helpers.cc b/tests/gtest/aviftest_helpers.cc
index daa2cc9..f48e970 100644
--- a/tests/gtest/aviftest_helpers.cc
+++ b/tests/gtest/aviftest_helpers.cc
@@ -166,6 +166,12 @@
const uint8_t* row1 = avifImagePlane(&image1, c);
const uint8_t* row2 = avifImagePlane(&image2, c);
if (!row1 != !row2) {
+ // Maybe one image contains an opaque alpha channel while the other has no
+ // alpha channel, but they should still be considered equal.
+ if (c == AVIF_CHAN_A && avifImageIsOpaque(&image1) &&
+ avifImageIsOpaque(&image2)) {
+ continue;
+ }
return false;
}
const uint32_t row_bytes1 = avifImagePlaneRowBytes(&image1, c);