summaryrefslogtreecommitdiffstats
path: root/third_party/jpeg-xl/lib/jxl/noise.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/jpeg-xl/lib/jxl/noise.h')
-rw-r--r--third_party/jpeg-xl/lib/jxl/noise.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/third_party/jpeg-xl/lib/jxl/noise.h b/third_party/jpeg-xl/lib/jxl/noise.h
new file mode 100644
index 0000000000..d897ea3abe
--- /dev/null
+++ b/third_party/jpeg-xl/lib/jxl/noise.h
@@ -0,0 +1,60 @@
+// 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.
+
+#ifndef LIB_JXL_NOISE_H_
+#define LIB_JXL_NOISE_H_
+
+// Noise parameters shared by encoder/decoder.
+
+#include <stddef.h>
+
+#include <algorithm>
+#include <cmath>
+#include <utility>
+
+#include "lib/jxl/base/compiler_specific.h"
+
+namespace jxl {
+
+const float kNoisePrecision = 1 << 10;
+
+struct NoiseParams {
+ // LUT index is an intensity of pixel / mean intensity of patch
+ static constexpr size_t kNumNoisePoints = 8;
+ float lut[kNumNoisePoints];
+
+ void Clear() {
+ for (float& i : lut) i = 0.f;
+ }
+ bool HasAny() const {
+ for (float i : lut) {
+ if (std::abs(i) > 1e-3f) return true;
+ }
+ return false;
+ }
+};
+
+static inline std::pair<int, float> IndexAndFrac(float x) {
+ constexpr size_t kScaleNumerator = NoiseParams::kNumNoisePoints - 2;
+ // TODO: instead of 1, this should be a proper Y range.
+ constexpr float kScale = kScaleNumerator / 1;
+ float scaled_x = std::max(0.f, x * kScale);
+ float floor_x;
+ float frac_x = std::modf(scaled_x, &floor_x);
+ if (JXL_UNLIKELY(scaled_x >= kScaleNumerator + 1)) {
+ floor_x = kScaleNumerator;
+ frac_x = 1.f;
+ }
+ return std::make_pair(static_cast<int>(floor_x), frac_x);
+}
+
+struct NoiseLevel {
+ float noise_level;
+ float intensity;
+};
+
+} // namespace jxl
+
+#endif // LIB_JXL_NOISE_H_