Imported Upstream version 0.9.0
[platform/upstream/libjxl.git] / lib / jxl / preview_test.cc
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/cms.h>
7
8 #include <cstddef>
9 #include <cstdint>
10 #include <string>
11 #include <vector>
12
13 #include "lib/extras/codec.h"
14 #include "lib/jxl/base/compiler_specific.h"
15 #include "lib/jxl/base/data_parallel.h"
16 #include "lib/jxl/base/override.h"
17 #include "lib/jxl/base/span.h"
18 #include "lib/jxl/codec_in_out.h"
19 #include "lib/jxl/color_encoding_internal.h"
20 #include "lib/jxl/enc_butteraugli_comparator.h"
21 #include "lib/jxl/enc_cache.h"
22 #include "lib/jxl/enc_params.h"
23 #include "lib/jxl/headers.h"
24 #include "lib/jxl/image_bundle.h"
25 #include "lib/jxl/test_utils.h"
26 #include "lib/jxl/testing.h"
27
28 namespace jxl {
29 namespace {
30 using test::ReadTestData;
31 using test::Roundtrip;
32
33 TEST(PreviewTest, RoundtripGivenPreview) {
34   const std::vector<uint8_t> orig =
35       ReadTestData("external/wesaturate/500px/u76c0g_bliznaca_srgb8.png");
36   CodecInOut io;
37   ASSERT_TRUE(SetFromBytes(Bytes(orig), &io));
38   io.ShrinkTo(io.xsize() / 8, io.ysize() / 8);
39   // Same as main image
40   io.preview_frame = io.Main().Copy();
41   const size_t preview_xsize = 15;
42   const size_t preview_ysize = 27;
43   io.preview_frame.ShrinkTo(preview_xsize, preview_ysize);
44   io.metadata.m.have_preview = true;
45   ASSERT_TRUE(io.metadata.m.preview_size.Set(io.preview_frame.xsize(),
46                                              io.preview_frame.ysize()));
47
48   CompressParams cparams;
49   cparams.butteraugli_distance = 2.0;
50   cparams.speed_tier = SpeedTier::kSquirrel;
51   cparams.SetCms(*JxlGetDefaultCms());
52
53   CodecInOut io2;
54   JXL_EXPECT_OK(Roundtrip(&io, cparams, {}, &io2, _));
55   EXPECT_EQ(preview_xsize, io2.metadata.m.preview_size.xsize());
56   EXPECT_EQ(preview_ysize, io2.metadata.m.preview_size.ysize());
57   EXPECT_EQ(preview_xsize, io2.preview_frame.xsize());
58   EXPECT_EQ(preview_ysize, io2.preview_frame.ysize());
59
60   EXPECT_LE(ButteraugliDistance(io.preview_frame, io2.preview_frame,
61                                 ButteraugliParams(), *JxlGetDefaultCms(),
62                                 /*distmap=*/nullptr),
63             2.5);
64   EXPECT_LE(ButteraugliDistance(io.Main(), io2.Main(), ButteraugliParams(),
65                                 *JxlGetDefaultCms(),
66                                 /*distmap=*/nullptr),
67             2.5);
68 }
69
70 }  // namespace
71 }  // namespace jxl