Coverage Report

Created: 2025-06-16 07:00

/src/libjxl/lib/jxl/cms/opsin_params.h
Line
Count
Source (jump to first uncovered line)
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
#ifndef LIB_JXL_CMS_OPSIN_PARAMS_H_
7
#define LIB_JXL_CMS_OPSIN_PARAMS_H_
8
9
#include <array>
10
#include <cstddef>
11
12
#include "lib/jxl/base/matrix_ops.h"
13
14
// Constants that define the XYB color space.
15
16
namespace jxl {
17
namespace cms {
18
19
// Parameters for opsin absorbance.
20
constexpr float kM02 = 0.078f;
21
constexpr float kM00 = 0.30f;
22
constexpr float kM01 = 1.0f - kM02 - kM00;
23
24
constexpr float kM12 = 0.078f;
25
constexpr float kM10 = 0.23f;
26
constexpr float kM11 = 1.0f - kM12 - kM10;
27
28
constexpr float kM20 = 0.24342268924547819f;
29
constexpr float kM21 = 0.20476744424496821f;
30
constexpr float kM22 = 1.0f - kM20 - kM21;
31
32
constexpr float kBScale = 1.0f;
33
constexpr float kYToBRatio = 1.0f;  // works better with 0.50017729543783418
34
constexpr float kBToYRatio = 1.0f / kYToBRatio;
35
36
constexpr float kOpsinAbsorbanceBias0 = 0.0037930732552754493f;
37
constexpr float kOpsinAbsorbanceBias1 = kOpsinAbsorbanceBias0;
38
constexpr float kOpsinAbsorbanceBias2 = kOpsinAbsorbanceBias0;
39
40
// Opsin absorbance matrix is now frozen.
41
constexpr Matrix3x3 kOpsinAbsorbanceMatrix{
42
    {{kM00, kM01, kM02}, {kM10, kM11, kM12}, {kM20, kM21, kM22}}};
43
44
constexpr Matrix3x3 kDefaultInverseOpsinAbsorbanceMatrix{
45
    {{11.031566901960783f, -9.866943921568629f, -0.16462299647058826f},
46
     {-3.254147380392157f, 4.418770392156863f, -0.16462299647058826f},
47
     {-3.6588512862745097f, 2.7129230470588235f, 1.9459282392156863f}}};
48
49
// Must be the inverse matrix of kOpsinAbsorbanceMatrix and match the spec.
50
50.5k
static inline const Matrix3x3& DefaultInverseOpsinAbsorbanceMatrix() {
51
50.5k
  return kDefaultInverseOpsinAbsorbanceMatrix;
52
50.5k
}
Unexecuted instantiation: encode.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_fields.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_ans.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_lz77.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_fast_lossless.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_frame.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_modular.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_patch_dictionary.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_dot_dictionary.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_detect_dots.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_debug_image.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_quant_weights.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_xyb.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_image_bundle.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_external_image.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_photon_noise.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_heuristics.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_adaptive_quantization.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_butteraugli_comparator.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_cache.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_group.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_progressive_split.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_splines.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_chroma_from_luma.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_ac_strategy.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_entropy_coder.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: jxl_cms.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_jpeg_data.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: enc_encoding.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: chroma_from_luma.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: color_encoding_internal.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: compressed_dc.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_cache.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: blending.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_external_image.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_frame.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_group.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_modular.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_noise.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_patch_dictionary.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: dec_xyb.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: decode.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: epf.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: frame_header.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: image_bundle.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
image_metadata.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Line
Count
Source
50
50.5k
static inline const Matrix3x3& DefaultInverseOpsinAbsorbanceMatrix() {
51
50.5k
  return kDefaultInverseOpsinAbsorbanceMatrix;
52
50.5k
}
Unexecuted instantiation: luminance.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: opsin_params.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: passes_state.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: quant_weights.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: render_pipeline.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: low_memory_render_pipeline.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: simple_render_pipeline.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_blending.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: render_pipeline_stage.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_chroma_upsampling.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_cms.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_epf.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_from_linear.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_gaborish.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_noise.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_patches.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_splines.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_spot.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_to_linear.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_tone_mapping.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_upsampling.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_write.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_xyb.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: stage_ycbcr.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: splines.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
Unexecuted instantiation: decode_to_jpeg.cc:jxl::cms::DefaultInverseOpsinAbsorbanceMatrix()
53
54
constexpr Vector3 kOpsinAbsorbanceBias = {
55
    kOpsinAbsorbanceBias0,
56
    kOpsinAbsorbanceBias1,
57
    kOpsinAbsorbanceBias2,
58
};
59
60
constexpr std::array<float, 4> kNegOpsinAbsorbanceBiasRGB = {
61
    -kOpsinAbsorbanceBias0, -kOpsinAbsorbanceBias1, -kOpsinAbsorbanceBias2,
62
    1.0f};
63
64
constexpr float kScaledXYBOffset0 = 0.015386134f;
65
constexpr float kScaledXYBOffset1 = 0.0f;
66
constexpr float kScaledXYBOffset2 = 0.27770459f;
67
68
constexpr Vector3 kScaledXYBOffset = {kScaledXYBOffset0, kScaledXYBOffset1,
69
                                      kScaledXYBOffset2};
70
71
constexpr float kScaledXYBScale0 = 22.995788804f;
72
constexpr float kScaledXYBScale1 = 1.183000077f;
73
constexpr float kScaledXYBScale2 = 1.502141333f;
74
75
constexpr Vector3 kScaledXYBScale = {
76
    kScaledXYBScale0,
77
    kScaledXYBScale1,
78
    kScaledXYBScale2,
79
};
80
81
// NB(eustas): following function/variable names are just "namos".
82
83
// More precise calculation of 1 / ((1 / r1) + (1 / r2))
84
0
constexpr float ReciprocialSum(float r1, float r2) {
85
0
  return (r1 * r2) / (r1 + r2);
86
0
}
87
88
constexpr float kXYBOffset0 = kScaledXYBOffset0 + kScaledXYBOffset1;
89
constexpr float kXYBOffset1 =
90
    kScaledXYBOffset1 - kScaledXYBOffset0 + (1.0f / kScaledXYBScale0);
91
constexpr float kXYBOffset2 = kScaledXYBOffset1 + kScaledXYBOffset2;
92
93
constexpr std::array<float, 3> kXYBOffset = {kXYBOffset0, kXYBOffset1,
94
                                             kXYBOffset2};
95
96
constexpr float kXYBScale0 = ReciprocialSum(kScaledXYBScale0, kScaledXYBScale1);
97
constexpr float kXYBScale1 = ReciprocialSum(kScaledXYBScale0, kScaledXYBScale1);
98
constexpr float kXYBScale2 = ReciprocialSum(kScaledXYBScale1, kScaledXYBScale2);
99
100
constexpr std::array<float, 3> kXYBScale = {kXYBScale0, kXYBScale1, kXYBScale2};
101
102
template <size_t idx>
103
0
constexpr float ScaledXYBScale() {
104
0
  return (idx == 0)   ? kScaledXYBScale0
105
0
         : (idx == 1) ? kScaledXYBScale1
106
0
                      : kScaledXYBScale2;
107
0
}
Unexecuted instantiation: float jxl::cms::ScaledXYBScale<1ul>()
Unexecuted instantiation: float jxl::cms::ScaledXYBScale<0ul>()
Unexecuted instantiation: float jxl::cms::ScaledXYBScale<2ul>()
108
109
template <size_t idx>
110
0
constexpr float ScaledXYBOffset() {
111
0
  return (idx == 0)   ? kScaledXYBOffset0
112
0
         : (idx == 1) ? kScaledXYBOffset1
113
0
                      : kScaledXYBOffset2;
114
0
}
Unexecuted instantiation: float jxl::cms::ScaledXYBOffset<1ul>()
Unexecuted instantiation: float jxl::cms::ScaledXYBOffset<0ul>()
Unexecuted instantiation: float jxl::cms::ScaledXYBOffset<2ul>()
115
116
template <size_t x, size_t y, size_t b, size_t idx>
117
0
constexpr float XYBCorner() {
118
0
  return (((idx == 0)   ? x
119
0
           : (idx == 1) ? y
120
0
                        : b) /
121
0
          ScaledXYBScale<idx>()) -
122
0
         ScaledXYBOffset<idx>();
123
0
}
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 0ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<0ul, 1ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 0ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::XYBCorner<1ul, 1ul, 1ul, 2ul>()
124
125
template <size_t x, size_t y, size_t b, size_t idx>
126
0
constexpr float ScaledA2BCorner() {
127
0
  return (idx == 0)   ? (XYBCorner<x, y, b, 1>() + XYBCorner<x, y, b, 0>())
128
0
         : (idx == 1) ? (XYBCorner<x, y, b, 1>() - XYBCorner<x, y, b, 0>())
129
0
                      : (XYBCorner<x, y, b, 2>() + XYBCorner<x, y, b, 1>());
130
0
}
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 0ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<0ul, 1ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 0ul, 1ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 0ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 0ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 0ul, 2ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 1ul, 0ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 1ul, 1ul>()
Unexecuted instantiation: float jxl::cms::ScaledA2BCorner<1ul, 1ul, 1ul, 2ul>()
131
132
using ColorCube0D = std::array<float, 3>;
133
template <size_t x, size_t y, size_t b>
134
0
constexpr ColorCube0D UnscaledA2BCorner() {
135
0
  return {(ScaledA2BCorner<x, y, b, 0>() + kXYBOffset0) * kXYBScale0,
136
0
          (ScaledA2BCorner<x, y, b, 1>() + kXYBOffset1) * kXYBScale1,
137
0
          (ScaledA2BCorner<x, y, b, 2>() + kXYBOffset2) * kXYBScale2};
138
0
}
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<0ul, 0ul, 0ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<0ul, 0ul, 1ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<0ul, 1ul, 0ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<0ul, 1ul, 1ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<1ul, 0ul, 0ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<1ul, 0ul, 1ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<1ul, 1ul, 0ul>()
Unexecuted instantiation: std::__1::array<float, 3ul> jxl::cms::UnscaledA2BCorner<1ul, 1ul, 1ul>()
139
140
using ColorCube1D = std::array<ColorCube0D, 2>;
141
template <size_t x, size_t y>
142
0
constexpr ColorCube1D UnscaledA2BCubeXY() {
143
0
  return {UnscaledA2BCorner<x, y, 0>(), UnscaledA2BCorner<x, y, 1>()};
144
0
}
Unexecuted instantiation: std::__1::array<std::__1::array<float, 3ul>, 2ul> jxl::cms::UnscaledA2BCubeXY<0ul, 0ul>()
Unexecuted instantiation: std::__1::array<std::__1::array<float, 3ul>, 2ul> jxl::cms::UnscaledA2BCubeXY<0ul, 1ul>()
Unexecuted instantiation: std::__1::array<std::__1::array<float, 3ul>, 2ul> jxl::cms::UnscaledA2BCubeXY<1ul, 0ul>()
Unexecuted instantiation: std::__1::array<std::__1::array<float, 3ul>, 2ul> jxl::cms::UnscaledA2BCubeXY<1ul, 1ul>()
145
146
using ColorCube2D = std::array<ColorCube1D, 2>;
147
template <size_t x>
148
0
constexpr ColorCube2D UnscaledA2BCubeX() {
149
0
  return {UnscaledA2BCubeXY<x, 0>(), UnscaledA2BCubeXY<x, 1>()};
150
0
}
Unexecuted instantiation: std::__1::array<std::__1::array<std::__1::array<float, 3ul>, 2ul>, 2ul> jxl::cms::UnscaledA2BCubeX<0ul>()
Unexecuted instantiation: std::__1::array<std::__1::array<std::__1::array<float, 3ul>, 2ul>, 2ul> jxl::cms::UnscaledA2BCubeX<1ul>()
151
152
using ColorCube3D = std::array<ColorCube2D, 2>;
153
104
constexpr ColorCube3D UnscaledA2BCube() {
154
104
  return {UnscaledA2BCubeX<0>(), UnscaledA2BCubeX<1>()};
155
104
}
156
157
constexpr ColorCube3D kUnscaledA2BCube = UnscaledA2BCube();
158
159
}  // namespace cms
160
}  // namespace jxl
161
162
#endif  // LIB_JXL_CMS_OPSIN_PARAMS_H_