Reject avifRGBImage dimensions mismatch (#3394)

Make the implementation match the documentation.

Add tests.

---------

Co-authored-by: krishna28238-arch <krishna28238-arch@users.noreply.github.com>
Co-authored-by: Yannis Guyon <yguyon@google.com>
diff --git a/src/reformat.c b/src/reformat.c
index d1a511b..8ac4945 100644
--- a/src/reformat.c
+++ b/src/reformat.c
@@ -160,6 +160,10 @@
 
 static avifBool avifPrepareReformatState(const avifImage * image, const avifRGBImage * rgb, avifReformatState * state)
 {
+    if (rgb->width != image->width || rgb->height != image->height) {
+        return AVIF_FALSE;
+    }
+
     const avifBool useYCgCoRe = (image->matrixCoefficients == AVIF_MATRIX_COEFFICIENTS_YCGCO_RE);
     const avifBool useYCgCoRo = (image->matrixCoefficients == AVIF_MATRIX_COEFFICIENTS_YCGCO_RO);
     if (useYCgCoRe || useYCgCoRo) {
diff --git a/tests/gtest/avifrgbtoyuvtest.cc b/tests/gtest/avifrgbtoyuvtest.cc
index 54dc993..99301c9 100644
--- a/tests/gtest/avifrgbtoyuvtest.cc
+++ b/tests/gtest/avifrgbtoyuvtest.cc
@@ -520,6 +520,35 @@
   avifRGBImageFreePixels(&rgb);
 }
 
+TEST(YUVToRGBTest, DimensionMismatchIsRejected) {
+  ImagePtr image =
+      testutil::CreateImage(/*width=*/4, /*height=*/4, /*depth=*/8,
+                            AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_ALL);
+  ASSERT_NE(image, nullptr);
+  testutil::FillImageGradient(image.get());
+
+  testutil::AvifRgbImage rgb(image.get(), /*rgbDepth=*/8, AVIF_RGB_FORMAT_RGBA);
+  rgb.width = image->width - 1;
+  ASSERT_EQ(avifRGBImageAllocatePixels(&rgb), AVIF_RESULT_OK);
+  EXPECT_EQ(avifImageYUVToRGB(image.get(), &rgb), AVIF_RESULT_REFORMAT_FAILED);
+}
+
+TEST(RGBToYUVTest, DimensionMismatchIsRejected) {
+  ImagePtr image =
+      testutil::CreateImage(/*width=*/4, /*height=*/4, /*depth=*/8,
+                            AVIF_PIXEL_FORMAT_YUV444, AVIF_PLANES_ALL);
+  ASSERT_NE(image, nullptr);
+
+  testutil::AvifRgbImage rgb(image.get(), /*rgbDepth=*/8, AVIF_RGB_FORMAT_RGBA);
+  rgb.height = image->height + 1;
+  ASSERT_EQ(avifRGBImageAllocatePixels(&rgb), AVIF_RESULT_OK);
+  for (uint32_t channel_offset : {0, 1, 2, 3}) {
+    testutil::FillImageChannel(&rgb, channel_offset, 123);
+  }
+
+  EXPECT_EQ(avifImageRGBToYUV(image.get(), &rgb), AVIF_RESULT_REFORMAT_FAILED);
+}
+
 //------------------------------------------------------------------------------
 // Selected configurations