use super::matrix::{Chromaticities, M33f, Primaries, F2, F3};
pub const PI: f32 = 3.14159265358979;
pub const HUE_LIMIT: f32 = 360.0;
#[inline]
pub fn wrap_to_hue_limit_unchecked(y: f32) -> f32 {
if y < 0.0 {
y + HUE_LIMIT
} else {
y
}
}
#[inline]
pub fn wrap_to_hue_limit(hue: f32) -> f32 {
wrap_to_hue_limit_unchecked(hue % HUE_LIMIT)
}
#[inline]
pub fn to_degrees(v: f32) -> f32 {
v
}
#[inline]
pub fn from_degrees(v: f32) -> f32 {
wrap_to_hue_limit(v)
}
#[inline]
pub fn to_radians(v: f32) -> f32 {
PI * v / 180.0
}
#[inline]
pub fn from_radians_unchecked(v: f32) -> f32 {
wrap_to_hue_limit_unchecked(180.0 * v / PI)
}
#[inline]
pub fn from_radians(v: f32) -> f32 {
wrap_to_hue_limit(180.0 * v / PI)
}
pub mod table {
pub const LOWER_ENTRIES: usize = 1;
pub const UPPER_ENTRIES: usize = 2;
pub const BASE_INDEX: usize = LOWER_ENTRIES;
pub const NOMINAL_SIZE: usize = 360;
pub const TOTAL_SIZE: usize = NOMINAL_SIZE + LOWER_ENTRIES + UPPER_ENTRIES;
pub const LOWER_WRAP_INDEX: usize = 0;
pub const UPPER_WRAP_INDEX: usize = BASE_INDEX + NOMINAL_SIZE;
pub const FIRST_NOMINAL_INDEX: usize = BASE_INDEX;
pub const LAST_NOMINAL_INDEX: usize = UPPER_WRAP_INDEX - 1;
#[inline]
pub fn base_hue_for_position(i_lo: usize) -> f32 {
i_lo as f32
}
#[inline]
pub fn hue_position_in_uniform_table(wrapped_hue: f32) -> usize {
(wrapped_hue as usize).min(NOMINAL_SIZE)
}
#[inline]
pub fn nominal_hue_position_in_uniform_table(wrapped_hue: f32) -> usize {
FIRST_NOMINAL_INDEX + hue_position_in_uniform_table(wrapped_hue)
}
}
pub type Table1D = [f32; table::TOTAL_SIZE];
pub type Table3D = [[f32; 3]; table::TOTAL_SIZE];
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct JMhParams {
pub matrix_rgb_to_cam16_c: M33f,
pub matrix_cam16_c_to_rgb: M33f,
pub matrix_cone_response_to_aab: M33f,
pub matrix_aab_to_cone_response: M33f,
pub f_l_n: f32,
pub cz: f32,
pub inv_cz: f32,
pub a_w_j: f32,
pub inv_a_w_j: f32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ToneScaleParams {
pub n: f32,
pub n_r: f32,
pub g: f32,
pub t_1: f32,
pub c_t: f32,
pub s_2: f32,
pub u_2: f32,
pub m_2: f32,
pub forward_limit: f32,
pub inverse_limit: f32,
pub log_peak: f32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct SharedCompressionParameters {
pub limit_j_max: f32,
pub model_gamma_inv: f32,
pub reach_m_table: Box<Table1D>,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ResolvedSharedCompressionParameters {
pub limit_j_max: f32,
pub model_gamma_inv: f32,
pub reach_max_m: f32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct ChromaCompressParams {
pub sat: f32,
pub sat_thr: f32,
pub compr: f32,
pub chroma_compress_scale: f32,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct HueDependantGamutParams {
pub gamma_bottom_inv: f32,
pub jm_cusp: F2,
pub gamma_top_inv: f32,
pub focus_j: f32,
pub analytical_threshold: f32,
}
#[derive(Debug, Clone, PartialEq)]
pub struct GamutCompressParams {
pub mid_j: f32,
pub focus_dist: f32,
pub lower_hull_gamma_inv: f32,
pub hue_linearity_search_range: [i32; 2],
pub hue_table: Box<Table1D>,
pub gamut_cusp_table: Box<Table3D>,
}
pub const REFERENCE_LUMINANCE: f32 = 100.0;
pub const L_A: f32 = 100.0;
pub const Y_B: f32 = 20.0;
pub const SURROUND: F3 = [0.9, 0.59, 0.9];
pub const J_SCALE: f32 = 100.0;
pub const CAM_NL_Y_REFERENCE: f32 = 100.0;
pub const CAM_NL_OFFSET: f32 = 0.2713 * CAM_NL_Y_REFERENCE;
pub const CAM_NL_SCALE: f32 = 4.0 * CAM_NL_Y_REFERENCE;
pub const CHROMA_COMPRESS: f32 = 2.4;
pub const CHROMA_COMPRESS_FACT: f32 = 3.3;
pub const CHROMA_EXPAND: f32 = 1.3;
pub const CHROMA_EXPAND_FACT: f32 = 0.69;
pub const CHROMA_EXPAND_THR: f32 = 0.5;
pub const SMOOTH_CUSPS: f32 = 0.12;
pub const SMOOTH_M: f32 = 0.27;
pub const CUSP_MID_BLEND: f32 = 1.3;
pub const FOCUS_GAIN_BLEND: f32 = 0.3;
pub const FOCUS_ADJUST_GAIN_INV: f32 = 1.0 / 0.55;
pub const FOCUS_DISTANCE: f32 = 1.35;
pub const FOCUS_DISTANCE_SCALING: f32 = 1.75;
pub const COMPRESSION_THRESHOLD: f32 = 0.75;
pub const CAM16_PRIMARIES: Primaries = Primaries::new(
Chromaticities::new(0.8336, 0.1735),
Chromaticities::new(2.3854, -1.4659),
Chromaticities::new(0.087, -0.125),
Chromaticities::new(0.333, 0.333),
);
pub const GAMMA_MINIMUM: f32 = 0.0;
pub const GAMMA_MAXIMUM: f32 = 5.0;
pub const GAMMA_SEARCH_STEP: f32 = 0.4;
pub const GAMMA_ACCURACY: f32 = 1e-5;
pub const CUSP_CORNER_COUNT: usize = 6;
pub const TOTAL_CORNER_COUNT: usize = CUSP_CORNER_COUNT + 2;
pub const MAX_SORTED_CORNERS: usize = 2 * CUSP_CORNER_COUNT;
pub const REACH_CUSP_TOLERANCE: f32 = 1e-3;
pub const DISPLAY_CUSP_TOLERANCE: f32 = 1e-7;