| 
									
										
										
										
											2021-03-29 15:59:14 +08:00
										 |  |  | #![allow(dead_code)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use block::RcBlock;
 | 
					
						
							| 
									
										
										
										
											2023-02-19 10:19:28 +08:00
										 |  |  | use hbb_common::libc::c_void;
 | 
					
						
							| 
									
										
										
										
											2021-03-29 15:59:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | pub type CGDisplayStreamRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type CFDictionaryRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type CFBooleanRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type CFNumberRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type CFStringRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type CGDisplayStreamUpdateRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type IOSurfaceRef = *mut c_void;
 | 
					
						
							|  |  |  | pub type DispatchQueue = *mut c_void;
 | 
					
						
							|  |  |  | pub type DispatchQueueAttr = *mut c_void;
 | 
					
						
							|  |  |  | pub type CFAllocatorRef = *mut c_void;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(C)]
 | 
					
						
							|  |  |  | pub struct CFDictionaryKeyCallBacks {
 | 
					
						
							|  |  |  |     callbacks: [usize; 5],
 | 
					
						
							|  |  |  |     version: i32,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(C)]
 | 
					
						
							|  |  |  | pub struct CFDictionaryValueCallBacks {
 | 
					
						
							|  |  |  |     callbacks: [usize; 4],
 | 
					
						
							|  |  |  |     version: i32,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | macro_rules! pixel_format {
 | 
					
						
							|  |  |  |     ($a:expr, $b:expr, $c:expr, $d:expr) => {
 | 
					
						
							|  |  |  |         ($a as i32) << 24 | ($b as i32) << 16 | ($c as i32) << 8 | ($d as i32)
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub const SURFACE_LOCK_READ_ONLY: u32 = 0x0000_0001;
 | 
					
						
							|  |  |  | pub const SURFACE_LOCK_AVOID_SYNC: u32 = 0x0000_0002;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub fn cfbool(x: bool) -> CFBooleanRef {
 | 
					
						
							|  |  |  |     unsafe {
 | 
					
						
							|  |  |  |         if x {
 | 
					
						
							|  |  |  |             kCFBooleanTrue
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             kCFBooleanFalse
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(i32)]
 | 
					
						
							|  |  |  | #[derive(PartialEq, Eq, Debug, Clone, Copy)]
 | 
					
						
							|  |  |  | pub enum CGDisplayStreamFrameStatus {
 | 
					
						
							|  |  |  |     /// A new frame was generated.
 | 
					
						
							|  |  |  |     FrameComplete = 0,
 | 
					
						
							|  |  |  |     /// A new frame was not generated because the display did not change.
 | 
					
						
							|  |  |  |     FrameIdle = 1,
 | 
					
						
							|  |  |  |     /// A new frame was not generated because the display has gone blank.
 | 
					
						
							|  |  |  |     FrameBlank = 2,
 | 
					
						
							|  |  |  |     /// The display stream was stopped.
 | 
					
						
							|  |  |  |     Stopped = 3,
 | 
					
						
							|  |  |  |     #[doc(hidden)]
 | 
					
						
							|  |  |  |     __Nonexhaustive,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(i32)]
 | 
					
						
							|  |  |  | #[derive(PartialEq, Eq, Debug, Clone, Copy)]
 | 
					
						
							|  |  |  | pub enum CFNumberType {
 | 
					
						
							|  |  |  |     /* Fixed-width types */
 | 
					
						
							|  |  |  |     SInt8 = 1,
 | 
					
						
							|  |  |  |     SInt16 = 2,
 | 
					
						
							|  |  |  |     SInt32 = 3,
 | 
					
						
							|  |  |  |     SInt64 = 4,
 | 
					
						
							|  |  |  |     Float32 = 5,
 | 
					
						
							|  |  |  |     Float64 = 6,
 | 
					
						
							|  |  |  |     /* 64-bit IEEE 754 */
 | 
					
						
							|  |  |  |     /* Basic C types */
 | 
					
						
							|  |  |  |     Char = 7,
 | 
					
						
							|  |  |  |     Short = 8,
 | 
					
						
							|  |  |  |     Int = 9,
 | 
					
						
							|  |  |  |     Long = 10,
 | 
					
						
							|  |  |  |     LongLong = 11,
 | 
					
						
							|  |  |  |     Float = 12,
 | 
					
						
							|  |  |  |     Double = 13,
 | 
					
						
							|  |  |  |     /* Other */
 | 
					
						
							|  |  |  |     CFIndex = 14,
 | 
					
						
							|  |  |  |     NSInteger = 15,
 | 
					
						
							|  |  |  |     CGFloat = 16,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(i32)]
 | 
					
						
							|  |  |  | #[derive(PartialEq, Eq, Debug, Clone, Copy)]
 | 
					
						
							|  |  |  | #[must_use]
 | 
					
						
							|  |  |  | pub enum CGError {
 | 
					
						
							|  |  |  |     Success = 0,
 | 
					
						
							|  |  |  |     Failure = 1000,
 | 
					
						
							|  |  |  |     IllegalArgument = 1001,
 | 
					
						
							|  |  |  |     InvalidConnection = 1002,
 | 
					
						
							|  |  |  |     InvalidContext = 1003,
 | 
					
						
							|  |  |  |     CannotComplete = 1004,
 | 
					
						
							|  |  |  |     NotImplemented = 1006,
 | 
					
						
							|  |  |  |     RangeCheck = 1007,
 | 
					
						
							|  |  |  |     TypeCheck = 1008,
 | 
					
						
							|  |  |  |     InvalidOperation = 1010,
 | 
					
						
							|  |  |  |     NoneAvailable = 1011,
 | 
					
						
							|  |  |  |     #[doc(hidden)]
 | 
					
						
							|  |  |  |     __Nonexhaustive,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[repr(i32)]
 | 
					
						
							|  |  |  | #[derive(PartialEq, Eq, Debug, Clone, Copy)]
 | 
					
						
							|  |  |  | pub enum PixelFormat {
 | 
					
						
							|  |  |  |     /// Packed Little Endian ARGB8888
 | 
					
						
							|  |  |  |     Argb8888 = pixel_format!('B', 'G', 'R', 'A'),
 | 
					
						
							|  |  |  |     /// Packed Little Endian ARGB2101010
 | 
					
						
							|  |  |  |     Argb2101010 = pixel_format!('l', '1', '0', 'r'),
 | 
					
						
							|  |  |  |     /// 2-plane "video" range YCbCr 4:2:0
 | 
					
						
							|  |  |  |     YCbCr420Video = pixel_format!('4', '2', '0', 'v'),
 | 
					
						
							|  |  |  |     /// 2-plane "full" range YCbCr 4:2:0
 | 
					
						
							|  |  |  |     YCbCr420Full = pixel_format!('4', '2', '0', 'f'),
 | 
					
						
							|  |  |  |     #[doc(hidden)]
 | 
					
						
							|  |  |  |     __Nonexhaustive,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub type CGDisplayStreamFrameAvailableHandler = *const c_void;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub type FrameAvailableHandler = RcBlock<
 | 
					
						
							|  |  |  |     (
 | 
					
						
							|  |  |  |         CGDisplayStreamFrameStatus, // status
 | 
					
						
							|  |  |  |         u64,                        // displayTime
 | 
					
						
							|  |  |  |         IOSurfaceRef,               // frameSurface
 | 
					
						
							|  |  |  |         CGDisplayStreamUpdateRef,   // updateRef
 | 
					
						
							|  |  |  |     ),
 | 
					
						
							|  |  |  |     (),
 | 
					
						
							|  |  |  | >;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[cfg(target_pointer_width = "64")]
 | 
					
						
							|  |  |  | pub type CGFloat = f64;
 | 
					
						
							|  |  |  | #[cfg(not(target_pointer_width = "64"))]
 | 
					
						
							|  |  |  | pub type CGFloat = f32;
 | 
					
						
							|  |  |  | #[repr(C)]
 | 
					
						
							|  |  |  | pub struct CGPoint {
 | 
					
						
							|  |  |  |     pub x: CGFloat,
 | 
					
						
							|  |  |  |     pub y: CGFloat,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | #[repr(C)]
 | 
					
						
							|  |  |  | pub struct CGSize {
 | 
					
						
							|  |  |  |     pub width: CGFloat,
 | 
					
						
							|  |  |  |     pub height: CGFloat,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | #[repr(C)]
 | 
					
						
							|  |  |  | pub struct CGRect {
 | 
					
						
							|  |  |  |     pub origin: CGPoint,
 | 
					
						
							|  |  |  |     pub size: CGSize,
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[link(name = "System", kind = "dylib")]
 | 
					
						
							|  |  |  | #[link(name = "CoreGraphics", kind = "framework")]
 | 
					
						
							|  |  |  | #[link(name = "CoreFoundation", kind = "framework")]
 | 
					
						
							|  |  |  | #[link(name = "IOSurface", kind = "framework")]
 | 
					
						
							|  |  |  | extern "C" {
 | 
					
						
							|  |  |  |     // CoreGraphics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub static kCGDisplayStreamShowCursor: CFStringRef;
 | 
					
						
							|  |  |  |     pub static kCGDisplayStreamPreserveAspectRatio: CFStringRef;
 | 
					
						
							|  |  |  |     pub static kCGDisplayStreamMinimumFrameTime: CFStringRef;
 | 
					
						
							|  |  |  |     pub static kCGDisplayStreamQueueDepth: CFStringRef;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGDisplayStreamCreateWithDispatchQueue(
 | 
					
						
							|  |  |  |         display: u32,
 | 
					
						
							|  |  |  |         output_width: usize,
 | 
					
						
							|  |  |  |         output_height: usize,
 | 
					
						
							|  |  |  |         pixel_format: PixelFormat,
 | 
					
						
							|  |  |  |         properties: CFDictionaryRef,
 | 
					
						
							|  |  |  |         queue: DispatchQueue,
 | 
					
						
							|  |  |  |         handler: CGDisplayStreamFrameAvailableHandler,
 | 
					
						
							|  |  |  |     ) -> CGDisplayStreamRef;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGDisplayStreamStart(displayStream: CGDisplayStreamRef) -> CGError;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGDisplayStreamStop(displayStream: CGDisplayStreamRef) -> CGError;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGMainDisplayID() -> u32;
 | 
					
						
							|  |  |  |     pub fn CGDisplayPixelsWide(display: u32) -> usize;
 | 
					
						
							|  |  |  |     pub fn CGDisplayPixelsHigh(display: u32) -> usize;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGGetOnlineDisplayList(
 | 
					
						
							|  |  |  |         max_displays: u32,
 | 
					
						
							|  |  |  |         online_displays: *mut u32,
 | 
					
						
							|  |  |  |         display_count: *mut u32,
 | 
					
						
							|  |  |  |     ) -> CGError;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGDisplayIsBuiltin(display: u32) -> i32;
 | 
					
						
							|  |  |  |     pub fn CGDisplayIsMain(display: u32) -> i32;
 | 
					
						
							|  |  |  |     pub fn CGDisplayIsActive(display: u32) -> i32;
 | 
					
						
							|  |  |  |     pub fn CGDisplayIsOnline(display: u32) -> i32;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CGDisplayBounds(display: u32) -> CGRect;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // IOSurface
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn IOSurfaceGetAllocSize(buffer: IOSurfaceRef) -> usize;
 | 
					
						
							|  |  |  |     pub fn IOSurfaceGetBaseAddress(buffer: IOSurfaceRef) -> *mut c_void;
 | 
					
						
							|  |  |  |     pub fn IOSurfaceIncrementUseCount(buffer: IOSurfaceRef);
 | 
					
						
							|  |  |  |     pub fn IOSurfaceDecrementUseCount(buffer: IOSurfaceRef);
 | 
					
						
							|  |  |  |     pub fn IOSurfaceLock(buffer: IOSurfaceRef, options: u32, seed: *mut u32) -> i32;
 | 
					
						
							|  |  |  |     pub fn IOSurfaceUnlock(buffer: IOSurfaceRef, options: u32, seed: *mut u32) -> i32;
 | 
					
						
							|  |  |  |     pub fn IOSurfaceGetBaseAddressOfPlane(buffer: IOSurfaceRef, index: usize) -> *mut c_void;
 | 
					
						
							|  |  |  |     pub fn IOSurfaceGetBytesPerRowOfPlane(buffer: IOSurfaceRef, index: usize) -> usize;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Dispatch
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn dispatch_queue_create(label: *const i8, attr: DispatchQueueAttr) -> DispatchQueue;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn dispatch_release(object: DispatchQueue);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Core Foundation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub static kCFTypeDictionaryKeyCallBacks: CFDictionaryKeyCallBacks;
 | 
					
						
							|  |  |  |     pub static kCFTypeDictionaryValueCallBacks: CFDictionaryValueCallBacks;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // EVEN THE BOOLEANS ARE REFERENCES.
 | 
					
						
							|  |  |  |     pub static kCFBooleanTrue: CFBooleanRef;
 | 
					
						
							|  |  |  |     pub static kCFBooleanFalse: CFBooleanRef;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CFNumberCreate(
 | 
					
						
							|  |  |  |         allocator: CFAllocatorRef,
 | 
					
						
							|  |  |  |         theType: CFNumberType,
 | 
					
						
							|  |  |  |         valuePtr: *const c_void,
 | 
					
						
							|  |  |  |     ) -> CFNumberRef;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CFDictionaryCreate(
 | 
					
						
							|  |  |  |         allocator: CFAllocatorRef,
 | 
					
						
							|  |  |  |         keys: *const *mut c_void,
 | 
					
						
							|  |  |  |         values: *const *mut c_void,
 | 
					
						
							|  |  |  |         numValues: i64,
 | 
					
						
							|  |  |  |         keyCallBacks: *const CFDictionaryKeyCallBacks,
 | 
					
						
							|  |  |  |         valueCallBacks: *const CFDictionaryValueCallBacks,
 | 
					
						
							|  |  |  |     ) -> CFDictionaryRef;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pub fn CFRetain(cf: *const c_void);
 | 
					
						
							|  |  |  |     pub fn CFRelease(cf: *const c_void);
 | 
					
						
							|  |  |  | }
 |