linear_srgb/default.rs
1//! Recommended API for sRGB ↔ linear conversion.
2//!
3//! This module re-exports the optimal implementation for each use case:
4//!
5//! - **Single f32 values**: Rational polynomial (~14 ULP max, perfectly
6//! monotonic — no `powf`)
7//! - **Single u8/u16 values**: LUT lookup (zero math)
8//! - **Slices**: SIMD-accelerated with runtime CPU dispatch
9//! - **Custom gamma**: Pure power function (f32, slices)
10//!
11//! For exact `powf()` conversions with C0-continuous constants, see [`crate::precise`].
12//!
13//! # Quick Start
14//!
15//! ```rust
16//! use linear_srgb::default::{srgb_to_linear, linear_to_srgb};
17//!
18//! let linear = srgb_to_linear(0.5);
19//! let srgb = linear_to_srgb(linear);
20//! ```
21//!
22//! # Batch Processing
23//!
24//! ```rust
25//! use linear_srgb::default::{srgb_to_linear_slice, linear_to_srgb_slice};
26//!
27//! let mut values = vec![0.5f32; 10000];
28//! srgb_to_linear_slice(&mut values); // SIMD-accelerated
29//! linear_to_srgb_slice(&mut values);
30//! ```
31
32// ============================================================================
33// Single-value sRGB f32 (rational polynomial — fast, ≤14 ULP, monotonic)
34// ============================================================================
35
36pub use crate::rational_poly::{
37 linear_to_srgb_fast as linear_to_srgb, srgb_to_linear_fast as srgb_to_linear,
38};
39
40// ============================================================================
41// Single-value sRGB integer (LUT lookup — zero math)
42// ============================================================================
43
44pub use crate::scalar::{
45 linear_to_srgb_u8, linear_to_srgb_u16, srgb_u8_to_linear, srgb_u16_to_linear,
46};
47
48// ============================================================================
49// Slice functions (SIMD-dispatched)
50// ============================================================================
51
52pub use crate::simd::{
53 // Custom gamma slices
54 gamma_to_linear_slice,
55 linear_to_gamma_slice,
56 // f32 RGBA slices (alpha-preserving)
57 linear_to_srgb_rgba_slice,
58 // f32 slices (in-place)
59 linear_to_srgb_slice,
60 linear_to_srgb_u8_rgba_slice,
61 // u8 slices
62 linear_to_srgb_u8_slice,
63 linear_to_srgb_u16_rgba_slice,
64 // u16 slices
65 linear_to_srgb_u16_slice,
66 // f32 RGBA slices (alpha-preserving)
67 srgb_to_linear_rgba_slice,
68 // f32 slices (in-place)
69 srgb_to_linear_slice,
70 srgb_u8_to_linear_rgba_slice,
71 // u8 slices
72 srgb_u8_to_linear_slice,
73 srgb_u16_to_linear_rgba_slice,
74 // u16 slices
75 srgb_u16_to_linear_slice,
76};
77
78// ============================================================================
79// Custom gamma (scalar)
80// ============================================================================
81
82pub use crate::scalar::{gamma_to_linear, linear_to_gamma};
83
84// ============================================================================
85// Transfer functions (behind `transfer` feature)
86// ============================================================================
87
88#[cfg(feature = "transfer")]
89pub use crate::tf::{
90 bt709_to_linear, hlg_to_linear, linear_to_bt709, linear_to_hlg, linear_to_pq, pq_to_linear,
91};
92
93// ============================================================================
94// LUT converter (zero-cost const tables)
95// ============================================================================
96
97pub use crate::lut::SrgbConverter;