diff options
Diffstat (limited to 'src/platform/macos.rs')
| -rw-r--r-- | src/platform/macos.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/platform/macos.rs b/src/platform/macos.rs new file mode 100644 index 0000000..0292250 --- /dev/null +++ b/src/platform/macos.rs @@ -0,0 +1,44 @@ +use core_graphics::display::CGDisplay; + +pub fn set_temp(temp: u32) { + use std::os::raw::c_int; + + let ratio: f64 = (temp % 500) as f64 / 500f64; + let gamma = crate::avg(temp, ratio); + + let main_display = CGDisplay::main(); + + extern "C" { + fn CGSetDisplayTransferByTable( + display: u32, + table_size: u32, + red_table: *const f32, + green_table: *const f32, + blue_table: *const f32, + ) -> c_int; + fn CGDisplayGammaTableCapacity(display: u32) -> u32; + } + + let table_size = unsafe { CGDisplayGammaTableCapacity(main_display.id) } as usize; + + let mut red_table = vec![0.0; table_size]; + let mut green_table = vec![0.0; table_size]; + let mut blue_table = vec![0.0; table_size]; + + for i in 0..table_size { + let value = (i as f32) / (table_size as f32 - 1.0); + red_table[i] = (value * gamma.red as f32).min(1.0); + green_table[i] = (value * gamma.green as f32).min(1.0); + blue_table[i] = (value * gamma.blue as f32).min(1.0); + } + + unsafe { + CGSetDisplayTransferByTable( + main_display.id, + table_size as u32, + red_table.as_ptr(), + green_table.as_ptr(), + blue_table.as_ptr(), + ); + } +} |
