// 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 #include #include #include #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 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(floor_x), frac_x); } struct NoiseLevel { float noise_level; float intensity; }; } // namespace jxl #endif // LIB_JXL_NOISE_H_