1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file.
5 
6 #include "jxl/butteraugli.h"
7 
8 #include "gtest/gtest.h"
9 #include "jxl/butteraugli_cxx.h"
10 #include "lib/jxl/test_utils.h"
11 
TEST(ButteraugliTest,Lossless)12 TEST(ButteraugliTest, Lossless) {
13   uint32_t xsize = 171;
14   uint32_t ysize = 219;
15   std::vector<uint8_t> pixels = jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
16   JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
17 
18   JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
19   JxlButteraugliResultPtr result(JxlButteraugliCompute(
20       api.get(), xsize, ysize, &pixel_format, pixels.data(), pixels.size(),
21       &pixel_format, pixels.data(), pixels.size()));
22   EXPECT_EQ(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
23 }
24 
TEST(ButteraugliTest,Distmap)25 TEST(ButteraugliTest, Distmap) {
26   uint32_t xsize = 171;
27   uint32_t ysize = 219;
28   std::vector<uint8_t> pixels = jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
29   JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
30 
31   JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
32   JxlButteraugliResultPtr result(JxlButteraugliCompute(
33       api.get(), xsize, ysize, &pixel_format, pixels.data(), pixels.size(),
34       &pixel_format, pixels.data(), pixels.size()));
35   EXPECT_EQ(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
36   const float* distmap;
37   uint32_t row_stride;
38   JxlButteraugliResultGetDistmap(result.get(), &distmap, &row_stride);
39   for (uint32_t y = 0; y < ysize; y++) {
40     for (uint32_t x = 0; x < xsize; x++) {
41       EXPECT_EQ(0.0, distmap[y * row_stride + x]);
42     }
43   }
44 }
45 
TEST(ButteraugliTest,Distorted)46 TEST(ButteraugliTest, Distorted) {
47   uint32_t xsize = 171;
48   uint32_t ysize = 219;
49   std::vector<uint8_t> orig_pixels =
50       jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
51   std::vector<uint8_t> dist_pixels =
52       jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
53   dist_pixels[0] += 128;
54 
55   JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
56 
57   JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
58   JxlButteraugliResultPtr result(JxlButteraugliCompute(
59       api.get(), xsize, ysize, &pixel_format, orig_pixels.data(),
60       orig_pixels.size(), &pixel_format, dist_pixels.data(),
61       dist_pixels.size()));
62   EXPECT_NE(0.0, JxlButteraugliResultGetDistance(result.get(), 8.0));
63 }
64 
TEST(ButteraugliTest,Api)65 TEST(ButteraugliTest, Api) {
66   uint32_t xsize = 171;
67   uint32_t ysize = 219;
68   std::vector<uint8_t> orig_pixels =
69       jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
70   std::vector<uint8_t> dist_pixels =
71       jxl::test::GetSomeTestImage(xsize, ysize, 4, 0);
72   dist_pixels[0] += 128;
73 
74   JxlPixelFormat pixel_format = {4, JXL_TYPE_UINT16, JXL_BIG_ENDIAN, 0};
75 
76   JxlButteraugliApiPtr api(JxlButteraugliApiCreate(nullptr));
77   JxlButteraugliApiSetHFAsymmetry(api.get(), 1.0f);
78   JxlButteraugliApiSetIntensityTarget(api.get(), 250.0f);
79   JxlButteraugliResultPtr result(JxlButteraugliCompute(
80       api.get(), xsize, ysize, &pixel_format, orig_pixels.data(),
81       orig_pixels.size(), &pixel_format, dist_pixels.data(),
82       dist_pixels.size()));
83   double distance0 = JxlButteraugliResultGetDistance(result.get(), 8.0);
84 
85   JxlButteraugliApiSetHFAsymmetry(api.get(), 2.0f);
86   result.reset(JxlButteraugliCompute(api.get(), xsize, ysize, &pixel_format,
87                                      orig_pixels.data(), orig_pixels.size(),
88                                      &pixel_format, dist_pixels.data(),
89                                      dist_pixels.size()));
90   double distance1 = JxlButteraugliResultGetDistance(result.get(), 8.0);
91 
92   EXPECT_NE(distance0, distance1);
93 
94   JxlButteraugliApiSetIntensityTarget(api.get(), 80.0f);
95   result.reset(JxlButteraugliCompute(api.get(), xsize, ysize, &pixel_format,
96                                      orig_pixels.data(), orig_pixels.size(),
97                                      &pixel_format, dist_pixels.data(),
98                                      dist_pixels.size()));
99   double distance2 = JxlButteraugliResultGetDistance(result.get(), 8.0);
100 
101   EXPECT_NE(distance1, distance2);
102 }
103