Skip to main content

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, linear_to_srgb_u16_fast, srgb_u8_to_linear,
46    srgb_u16_to_linear,
47};
48
49// ============================================================================
50// Slice functions (SIMD-dispatched)
51// ============================================================================
52
53pub use crate::simd::{
54    // Custom gamma slices
55    gamma_to_linear_slice,
56    linear_to_gamma_slice,
57    // Extended-range f32 slices (no clamping, sign-preserving)
58    linear_to_srgb_extended_slice,
59    // f32 RGBA slices (alpha-preserving)
60    linear_to_srgb_rgba_slice,
61    // f32 slices (in-place)
62    linear_to_srgb_slice,
63    linear_to_srgb_u8_rgba_slice,
64    // u8 slices
65    linear_to_srgb_u8_slice,
66    linear_to_srgb_u16_rgba_slice,
67    linear_to_srgb_u16_rgba_slice_fast,
68    // u16 slices
69    linear_to_srgb_u16_slice,
70    linear_to_srgb_u16_slice_fast,
71    srgb_to_linear_extended_slice,
72    // Fused premultiply/unpremultiply
73    srgb_to_linear_premultiply_rgba_slice,
74    // f32 RGBA slices (alpha-preserving)
75    srgb_to_linear_rgba_slice,
76    // f32 slices (in-place)
77    srgb_to_linear_slice,
78    srgb_u8_to_linear_premultiply_rgba_slice,
79    srgb_u8_to_linear_rgba_slice,
80    // u8 slices
81    srgb_u8_to_linear_slice,
82    srgb_u16_to_linear_rgba_slice,
83    // u16 slices
84    srgb_u16_to_linear_slice,
85    unpremultiply_linear_to_srgb_rgba_slice,
86    unpremultiply_linear_to_srgb_u8_rgba_slice,
87};
88
89// Deprecated gamma premultiply/unpremultiply re-exports
90#[allow(deprecated)]
91pub use crate::simd::{
92    gamma_to_linear_premultiply_rgba_slice, unpremultiply_linear_to_gamma_rgba_slice,
93};
94
95// ============================================================================
96// Custom gamma (scalar)
97// ============================================================================
98
99pub use crate::scalar::{gamma_to_linear, linear_to_gamma};
100
101// ============================================================================
102// Transfer functions (behind `transfer` feature)
103// ============================================================================
104
105#[cfg(feature = "transfer")]
106pub use crate::tf::{
107    bt709_to_linear, hlg_to_linear, linear_to_bt709, linear_to_hlg, linear_to_pq, pq_to_linear,
108};
109
110// ============================================================================
111// Transfer function slice operations (behind `transfer` feature)
112// ============================================================================
113
114#[cfg(feature = "transfer")]
115pub use crate::simd::{
116    // RGBA variants (alpha-preserving; every 4th element left unchanged)
117    bt709_to_linear_rgba_slice,
118    // Channel-agnostic slice (applies TF to every element — including alpha
119    // if RGBA data is passed; use the *_rgba_slice variants for alpha-preserving)
120    bt709_to_linear_slice,
121    hlg_to_linear_rgba_slice,
122    hlg_to_linear_slice,
123    linear_to_bt709_rgba_slice,
124    linear_to_bt709_slice,
125    linear_to_hlg_rgba_slice,
126    linear_to_hlg_slice,
127    linear_to_pq_rgba_slice,
128    linear_to_pq_slice,
129    pq_to_linear_rgba_slice,
130    pq_to_linear_slice,
131};
132
133// ============================================================================
134// LUT converter (zero-cost const tables)
135// ============================================================================
136
137pub use crate::lut::SrgbConverter;