summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/opsin_params.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/jpeg-xl/lib/jxl/opsin_params.cc')
-rw-r--r--third_party/jpeg-xl/lib/jxl/opsin_params.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/third_party/jpeg-xl/lib/jxl/opsin_params.cc b/third_party/jpeg-xl/lib/jxl/opsin_params.cc
new file mode 100644
index 0000000000..e1fdda5322
--- /dev/null
+++ b/third_party/jpeg-xl/lib/jxl/opsin_params.cc
@@ -0,0 +1,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