summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/opsin_params.cc
blob: e1fdda5322c19ca137370732c7af3136d3578dc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Copyright (c) the JPEG XL Project Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "lib/jxl/opsin_params.h"

#include "lib/jxl/cms/opsin_params.h"

#define INVERSE_OPSIN_FROM_SPEC 1

#if not(INVERSE_OPSIN_FROM_SPEC)
#include "lib/jxl/base/matrix_ops.h"
#endif

namespace jxl {

const float* GetOpsinAbsorbanceInverseMatrix() {
#if INVERSE_OPSIN_FROM_SPEC
  return jxl::cms::DefaultInverseOpsinAbsorbanceMatrix();
#else   // INVERSE_OPSIN_FROM_SPEC
  // Compute the inverse opsin matrix from the forward matrix. Less precise
  // than taking the values from the specification, but must be used if the
  // forward transform is changed and the spec will require updating.
  static const float* const kInverse = [] {
    static float inverse[9];
    for (int i = 0; i < 9; i++) {
      inverse[i] = kOpsinAbsorbanceMatrix[i];
    }
    Inv3x3Matrix(inverse);
    return inverse;
  }();
  return kInverse;
#endif  // INVERSE_OPSIN_FROM_SPEC
}

void InitSIMDInverseMatrix(const float* JXL_RESTRICT inverse,
                           float* JXL_RESTRICT simd_inverse,
                           float intensity_target) {
  for (size_t i = 0; i < 9; ++i) {
    simd_inverse[4 * i] = simd_inverse[4 * i + 1] = simd_inverse[4 * i + 2] =
        simd_inverse[4 * i + 3] = inverse[i] * (255.0f / intensity_target);
  }
}

}  // namespace jxl