// 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; } 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)) { floor_x = kScaleNumerator - 1; frac_x = 1; } return std::make_pair(static_cast(static_cast(floor_x)), frac_x); } struct NoiseLevel { float noise_level; float intensity; }; } // namespace jxl #endif // LIB_JXL_NOISE_H_