2018-05-17 21:28:30 -04:00
|
|
|
// TODO: Upstream these
|
|
|
|
|
|
2018-05-20 10:24:05 -04:00
|
|
|
#![allow(dead_code, non_snake_case, non_upper_case_globals)]
|
2018-05-17 21:28:30 -04:00
|
|
|
|
2021-07-13 17:27:47 +02:00
|
|
|
use std::ffi::c_void;
|
|
|
|
|
|
2019-07-29 21:16:14 +03:00
|
|
|
use core_foundation::{
|
|
|
|
|
array::CFArrayRef, dictionary::CFDictionaryRef, string::CFStringRef, uuid::CFUUIDRef,
|
|
|
|
|
};
|
|
|
|
|
use core_graphics::{
|
|
|
|
|
base::CGError,
|
|
|
|
|
display::{CGDirectDisplayID, CGDisplayConfigRef},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
pub type CGDisplayFadeInterval = f32;
|
|
|
|
|
pub type CGDisplayReservationInterval = f32;
|
|
|
|
|
pub type CGDisplayBlendFraction = f32;
|
|
|
|
|
|
|
|
|
|
pub const kCGDisplayBlendNormal: f32 = 0.0;
|
|
|
|
|
pub const kCGDisplayBlendSolidColor: f32 = 1.0;
|
|
|
|
|
|
|
|
|
|
pub type CGDisplayFadeReservationToken = u32;
|
|
|
|
|
pub const kCGDisplayFadeReservationInvalidToken: CGDisplayFadeReservationToken = 0;
|
|
|
|
|
|
|
|
|
|
pub type Boolean = u8;
|
|
|
|
|
pub const FALSE: Boolean = 0;
|
|
|
|
|
pub const TRUE: Boolean = 1;
|
|
|
|
|
|
|
|
|
|
pub const kCGErrorSuccess: i32 = 0;
|
|
|
|
|
pub const kCGErrorFailure: i32 = 1000;
|
|
|
|
|
pub const kCGErrorIllegalArgument: i32 = 1001;
|
|
|
|
|
pub const kCGErrorInvalidConnection: i32 = 1002;
|
|
|
|
|
pub const kCGErrorInvalidContext: i32 = 1003;
|
|
|
|
|
pub const kCGErrorCannotComplete: i32 = 1004;
|
|
|
|
|
pub const kCGErrorNotImplemented: i32 = 1006;
|
|
|
|
|
pub const kCGErrorRangeCheck: i32 = 1007;
|
|
|
|
|
pub const kCGErrorTypeCheck: i32 = 1008;
|
|
|
|
|
pub const kCGErrorInvalidOperation: i32 = 1010;
|
|
|
|
|
pub const kCGErrorNoneAvailable: i32 = 1011;
|
|
|
|
|
|
|
|
|
|
pub const IO1BitIndexedPixels: &str = "P";
|
|
|
|
|
pub const IO2BitIndexedPixels: &str = "PP";
|
|
|
|
|
pub const IO4BitIndexedPixels: &str = "PPPP";
|
|
|
|
|
pub const IO8BitIndexedPixels: &str = "PPPPPPPP";
|
|
|
|
|
pub const IO16BitDirectPixels: &str = "-RRRRRGGGGGBBBBB";
|
|
|
|
|
pub const IO32BitDirectPixels: &str = "--------RRRRRRRRGGGGGGGGBBBBBBBB";
|
|
|
|
|
|
|
|
|
|
pub const kIO30BitDirectPixels: &str = "--RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB";
|
|
|
|
|
pub const kIO64BitDirectPixels: &str = "-16R16G16B16";
|
|
|
|
|
|
|
|
|
|
pub const kIO16BitFloatPixels: &str = "-16FR16FG16FB16";
|
|
|
|
|
pub const kIO32BitFloatPixels: &str = "-32FR32FG32FB32";
|
|
|
|
|
|
|
|
|
|
pub const IOYUV422Pixels: &str = "Y4U2V2";
|
|
|
|
|
pub const IO8BitOverlayPixels: &str = "O8";
|
|
|
|
|
|
|
|
|
|
pub type CGWindowLevel = i32;
|
2021-07-13 17:27:47 +02:00
|
|
|
pub type CGDisplayModeRef = *mut c_void;
|
2019-07-29 21:16:14 +03:00
|
|
|
|
2022-01-05 14:38:24 +01:00
|
|
|
// `CGDisplayCreateUUIDFromDisplayID` comes from the `ColorSync` framework.
|
|
|
|
|
// However, that framework was only introduced "publicly" in macOS 10.13.
|
|
|
|
|
//
|
|
|
|
|
// Since we want to support older versions, we can't link to `ColorSync`
|
|
|
|
|
// directly. Fortunately, it has always been available as a subframework of
|
|
|
|
|
// `ApplicationServices`, see:
|
|
|
|
|
// https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/OSX_Technology_Overview/SystemFrameworks/SystemFrameworks.html#//apple_ref/doc/uid/TP40001067-CH210-BBCFFIEG
|
2022-01-23 20:38:08 +01:00
|
|
|
#[link(name = "ApplicationServices", kind = "framework")]
|
2021-02-05 02:58:55 -05:00
|
|
|
extern "C" {
|
|
|
|
|
pub fn CGDisplayCreateUUIDFromDisplayID(display: CGDirectDisplayID) -> CFUUIDRef;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-29 21:16:14 +03:00
|
|
|
#[link(name = "CoreGraphics", kind = "framework")]
|
|
|
|
|
extern "C" {
|
|
|
|
|
pub fn CGRestorePermanentDisplayConfiguration();
|
|
|
|
|
pub fn CGDisplayCapture(display: CGDirectDisplayID) -> CGError;
|
|
|
|
|
pub fn CGDisplayRelease(display: CGDirectDisplayID) -> CGError;
|
|
|
|
|
pub fn CGConfigureDisplayFadeEffect(
|
|
|
|
|
config: CGDisplayConfigRef,
|
|
|
|
|
fadeOutSeconds: CGDisplayFadeInterval,
|
|
|
|
|
fadeInSeconds: CGDisplayFadeInterval,
|
|
|
|
|
fadeRed: f32,
|
|
|
|
|
fadeGreen: f32,
|
|
|
|
|
fadeBlue: f32,
|
|
|
|
|
) -> CGError;
|
|
|
|
|
pub fn CGAcquireDisplayFadeReservation(
|
|
|
|
|
seconds: CGDisplayReservationInterval,
|
|
|
|
|
token: *mut CGDisplayFadeReservationToken,
|
|
|
|
|
) -> CGError;
|
|
|
|
|
pub fn CGDisplayFade(
|
|
|
|
|
token: CGDisplayFadeReservationToken,
|
|
|
|
|
duration: CGDisplayFadeInterval,
|
|
|
|
|
startBlend: CGDisplayBlendFraction,
|
|
|
|
|
endBlend: CGDisplayBlendFraction,
|
|
|
|
|
redBlend: f32,
|
|
|
|
|
greenBlend: f32,
|
|
|
|
|
blueBlend: f32,
|
|
|
|
|
synchronous: Boolean,
|
|
|
|
|
) -> CGError;
|
|
|
|
|
pub fn CGReleaseDisplayFadeReservation(token: CGDisplayFadeReservationToken) -> CGError;
|
|
|
|
|
pub fn CGShieldingWindowLevel() -> CGWindowLevel;
|
|
|
|
|
pub fn CGDisplaySetDisplayMode(
|
|
|
|
|
display: CGDirectDisplayID,
|
|
|
|
|
mode: CGDisplayModeRef,
|
|
|
|
|
options: CFDictionaryRef,
|
|
|
|
|
) -> CGError;
|
|
|
|
|
pub fn CGDisplayCopyAllDisplayModes(
|
|
|
|
|
display: CGDirectDisplayID,
|
|
|
|
|
options: CFDictionaryRef,
|
|
|
|
|
) -> CFArrayRef;
|
|
|
|
|
pub fn CGDisplayModeGetPixelWidth(mode: CGDisplayModeRef) -> usize;
|
|
|
|
|
pub fn CGDisplayModeGetPixelHeight(mode: CGDisplayModeRef) -> usize;
|
|
|
|
|
pub fn CGDisplayModeGetRefreshRate(mode: CGDisplayModeRef) -> f64;
|
|
|
|
|
pub fn CGDisplayModeCopyPixelEncoding(mode: CGDisplayModeRef) -> CFStringRef;
|
|
|
|
|
pub fn CGDisplayModeRetain(mode: CGDisplayModeRef);
|
|
|
|
|
pub fn CGDisplayModeRelease(mode: CGDisplayModeRef);
|
|
|
|
|
}
|
2022-06-11 02:37:46 +02:00
|
|
|
|
|
|
|
|
mod core_video {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[link(name = "CoreVideo", kind = "framework")]
|
|
|
|
|
extern "C" {}
|
|
|
|
|
|
|
|
|
|
// CVBase.h
|
|
|
|
|
|
|
|
|
|
pub type CVTimeFlags = i32; // int32_t
|
|
|
|
|
pub const kCVTimeIsIndefinite: CVTimeFlags = 1 << 0;
|
|
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub struct CVTime {
|
|
|
|
|
pub time_value: i64, // int64_t
|
|
|
|
|
pub time_scale: i32, // int32_t
|
|
|
|
|
pub flags: i32, // int32_t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CVReturn.h
|
|
|
|
|
|
|
|
|
|
pub type CVReturn = i32; // int32_t
|
|
|
|
|
pub const kCVReturnSuccess: CVReturn = 0;
|
|
|
|
|
|
|
|
|
|
// CVDisplayLink.h
|
|
|
|
|
|
|
|
|
|
pub type CVDisplayLinkRef = *mut c_void;
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
pub fn CVDisplayLinkCreateWithCGDisplay(
|
|
|
|
|
displayID: CGDirectDisplayID,
|
|
|
|
|
displayLinkOut: *mut CVDisplayLinkRef,
|
|
|
|
|
) -> CVReturn;
|
|
|
|
|
pub fn CVDisplayLinkGetNominalOutputVideoRefreshPeriod(
|
|
|
|
|
displayLink: CVDisplayLinkRef,
|
|
|
|
|
) -> CVTime;
|
|
|
|
|
pub fn CVDisplayLinkRelease(displayLink: CVDisplayLinkRef);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub use core_video::*;
|