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