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