1 // Copyright 2024 Google LLC
2 // SPDX-License-Identifier: BSD-2-Clause
3 
4 #include <cstdint>
5 #include <iostream>
6 #include <string>
7 
8 #include "avif/avif.h"
9 #include "aviftest_helpers.h"
10 #include "gtest/gtest.h"
11 
12 namespace avif {
13 namespace {
14 
15 // Used to pass the data folder path to the GoogleTest suites.
16 const char* data_path = nullptr;
17 
18 class ScaleTest : public testing::TestWithParam<const char*> {};
19 
TEST_P(ScaleTest,Scaling)20 TEST_P(ScaleTest, Scaling) {
21   if (!testutil::Av1DecoderAvailable()) {
22     GTEST_SKIP() << "AV1 Codec unavailable, skip test.";
23   }
24   const char* file_name = GetParam();
25   DecoderPtr decoder(avifDecoderCreate());
26   ASSERT_NE(decoder, nullptr);
27   ASSERT_EQ(avifDecoderSetIOFile(decoder.get(),
28                                  (std::string(data_path) + file_name).c_str()),
29             AVIF_RESULT_OK);
30   ASSERT_EQ(avifDecoderParse(decoder.get()), AVIF_RESULT_OK);
31   EXPECT_EQ(decoder->compressionFormat, COMPRESSION_FORMAT_AVIF);
32   EXPECT_EQ(avifDecoderNextImage(decoder.get()), AVIF_RESULT_OK);
33 
34   const uint32_t scaled_width =
35       static_cast<uint32_t>(decoder->image->width * 0.8);
36   const uint32_t scaled_height =
37       static_cast<uint32_t>(decoder->image->height * 0.8);
38 
39   ASSERT_EQ(
40       avifImageScale(decoder->image, scaled_width, scaled_height, nullptr),
41       AVIF_RESULT_OK);
42   EXPECT_EQ(decoder->image->width, scaled_width);
43   EXPECT_EQ(decoder->image->height, scaled_height);
44 
45   // Scaling to a larger dimension is not supported.
46   EXPECT_NE(avifImageScale(decoder->image, decoder->image->width * 2,
47                            decoder->image->height * 0.5, nullptr),
48             AVIF_RESULT_OK);
49   EXPECT_NE(avifImageScale(decoder->image, decoder->image->width * 0.5,
50                            decoder->image->height * 2, nullptr),
51             AVIF_RESULT_OK);
52   EXPECT_NE(avifImageScale(decoder->image, decoder->image->width * 2,
53                            decoder->image->height * 2, nullptr),
54             AVIF_RESULT_OK);
55 }
56 
57 INSTANTIATE_TEST_SUITE_P(Some, ScaleTest,
58                          testing::ValuesIn({"paris_10bpc.avif",
59                                             "paris_icc_exif_xmp.avif"}));
60 
61 }  // namespace
62 }  // namespace avif
63 
main(int argc,char ** argv)64 int main(int argc, char** argv) {
65   ::testing::InitGoogleTest(&argc, argv);
66   if (argc != 2) {
67     std::cerr << "There must be exactly one argument containing the path to "
68                  "the test data folder"
69               << std::endl;
70     return 1;
71   }
72   avif::data_path = argv[1];
73   return RUN_ALL_TESTS();
74 }
75