Skip to main content

apple_cf/raw/
extras.rs

1#![allow(warnings)]
2#![allow(clippy::all)]
3
4use super::generated::*;
5use core::ptr;
6
7#[must_use]
8#[inline]
9/// Apple SDK function `CFRangeMake`.
10pub const fn CFRangeMake(loc: CFIndex, len: CFIndex) -> CFRange {
11    CFRange {
12        location: loc,
13        length: len,
14    }
15}
16
17/// Apple SDK constant `CFByteOrderUnknown`.
18pub const CFByteOrderUnknown: CFByteOrder = 0;
19/// Apple SDK constant `CFByteOrderLittleEndian`.
20pub const CFByteOrderLittleEndian: CFByteOrder = 1;
21/// Apple SDK constant `CFByteOrderBigEndian`.
22pub const CFByteOrderBigEndian: CFByteOrder = 2;
23
24#[must_use]
25#[inline]
26/// Apple SDK function `CFByteOrderGetCurrent`.
27pub const fn CFByteOrderGetCurrent() -> CFByteOrder {
28    if cfg!(target_endian = "little") {
29        CFByteOrderLittleEndian
30    } else if cfg!(target_endian = "big") {
31        CFByteOrderBigEndian
32    } else {
33        CFByteOrderUnknown
34    }
35}
36
37#[must_use]
38#[inline]
39/// Apple SDK function `CFSwapInt16`.
40pub const fn CFSwapInt16(arg: u16) -> u16 {
41    arg.swap_bytes()
42}
43
44#[must_use]
45#[inline]
46/// Apple SDK function `CFSwapInt32`.
47pub const fn CFSwapInt32(arg: u32) -> u32 {
48    arg.swap_bytes()
49}
50
51#[must_use]
52#[inline]
53/// Apple SDK function `CFSwapInt64`.
54pub const fn CFSwapInt64(arg: u64) -> u64 {
55    arg.swap_bytes()
56}
57
58#[must_use]
59#[inline]
60/// Apple SDK function `CFSwapInt16BigToHost`.
61pub const fn CFSwapInt16BigToHost(arg: u16) -> u16 {
62    if cfg!(target_endian = "big") {
63        arg
64    } else {
65        CFSwapInt16(arg)
66    }
67}
68
69#[must_use]
70#[inline]
71/// Apple SDK function `CFSwapInt32BigToHost`.
72pub const fn CFSwapInt32BigToHost(arg: u32) -> u32 {
73    if cfg!(target_endian = "big") {
74        arg
75    } else {
76        CFSwapInt32(arg)
77    }
78}
79
80#[must_use]
81#[inline]
82/// Apple SDK function `CFSwapInt64BigToHost`.
83pub const fn CFSwapInt64BigToHost(arg: u64) -> u64 {
84    if cfg!(target_endian = "big") {
85        arg
86    } else {
87        CFSwapInt64(arg)
88    }
89}
90
91#[must_use]
92#[inline]
93/// Apple SDK function `CFSwapInt16HostToBig`.
94pub const fn CFSwapInt16HostToBig(arg: u16) -> u16 {
95    if cfg!(target_endian = "big") {
96        arg
97    } else {
98        CFSwapInt16(arg)
99    }
100}
101
102#[must_use]
103#[inline]
104/// Apple SDK function `CFSwapInt32HostToBig`.
105pub const fn CFSwapInt32HostToBig(arg: u32) -> u32 {
106    if cfg!(target_endian = "big") {
107        arg
108    } else {
109        CFSwapInt32(arg)
110    }
111}
112
113#[must_use]
114#[inline]
115/// Apple SDK function `CFSwapInt64HostToBig`.
116pub const fn CFSwapInt64HostToBig(arg: u64) -> u64 {
117    if cfg!(target_endian = "big") {
118        arg
119    } else {
120        CFSwapInt64(arg)
121    }
122}
123
124#[must_use]
125#[inline]
126/// Apple SDK function `CFSwapInt16LittleToHost`.
127pub const fn CFSwapInt16LittleToHost(arg: u16) -> u16 {
128    if cfg!(target_endian = "little") {
129        arg
130    } else {
131        CFSwapInt16(arg)
132    }
133}
134
135#[must_use]
136#[inline]
137/// Apple SDK function `CFSwapInt32LittleToHost`.
138pub const fn CFSwapInt32LittleToHost(arg: u32) -> u32 {
139    if cfg!(target_endian = "little") {
140        arg
141    } else {
142        CFSwapInt32(arg)
143    }
144}
145
146#[must_use]
147#[inline]
148/// Apple SDK function `CFSwapInt64LittleToHost`.
149pub const fn CFSwapInt64LittleToHost(arg: u64) -> u64 {
150    if cfg!(target_endian = "little") {
151        arg
152    } else {
153        CFSwapInt64(arg)
154    }
155}
156
157#[must_use]
158#[inline]
159/// Apple SDK function `CFSwapInt16HostToLittle`.
160pub const fn CFSwapInt16HostToLittle(arg: u16) -> u16 {
161    if cfg!(target_endian = "little") {
162        arg
163    } else {
164        CFSwapInt16(arg)
165    }
166}
167
168#[must_use]
169#[inline]
170/// Apple SDK function `CFSwapInt32HostToLittle`.
171pub const fn CFSwapInt32HostToLittle(arg: u32) -> u32 {
172    if cfg!(target_endian = "little") {
173        arg
174    } else {
175        CFSwapInt32(arg)
176    }
177}
178
179#[must_use]
180#[inline]
181/// Apple SDK function `CFSwapInt64HostToLittle`.
182pub const fn CFSwapInt64HostToLittle(arg: u64) -> u64 {
183    if cfg!(target_endian = "little") {
184        arg
185    } else {
186        CFSwapInt64(arg)
187    }
188}
189
190#[must_use]
191#[inline]
192/// Apple SDK function `CFConvertFloat32HostToSwapped`.
193pub fn CFConvertFloat32HostToSwapped(arg: Float32) -> CFSwappedFloat32 {
194    let mut bits = arg.to_bits();
195    if cfg!(target_endian = "little") {
196        bits = bits.swap_bytes();
197    }
198    CFSwappedFloat32 { v: bits }
199}
200
201#[must_use]
202#[inline]
203/// Apple SDK function `CFConvertFloat32SwappedToHost`.
204pub fn CFConvertFloat32SwappedToHost(arg: CFSwappedFloat32) -> Float32 {
205    let mut bits = arg.v;
206    if cfg!(target_endian = "little") {
207        bits = bits.swap_bytes();
208    }
209    Float32::from_bits(bits)
210}
211
212#[must_use]
213#[inline]
214/// Apple SDK function `CFConvertFloat64HostToSwapped`.
215pub fn CFConvertFloat64HostToSwapped(arg: Float64) -> CFSwappedFloat64 {
216    let mut bits = arg.to_bits();
217    if cfg!(target_endian = "little") {
218        bits = bits.swap_bytes();
219    }
220    CFSwappedFloat64 { v: bits }
221}
222
223#[must_use]
224#[inline]
225/// Apple SDK function `CFConvertFloat64SwappedToHost`.
226pub fn CFConvertFloat64SwappedToHost(arg: CFSwappedFloat64) -> Float64 {
227    let mut bits = arg.v;
228    if cfg!(target_endian = "little") {
229        bits = bits.swap_bytes();
230    }
231    Float64::from_bits(bits)
232}
233
234#[must_use]
235#[inline]
236/// Apple SDK function `CFConvertFloatHostToSwapped`.
237pub fn CFConvertFloatHostToSwapped(arg: f32) -> CFSwappedFloat32 {
238    CFConvertFloat32HostToSwapped(arg)
239}
240
241#[must_use]
242#[inline]
243/// Apple SDK function `CFConvertFloatSwappedToHost`.
244pub fn CFConvertFloatSwappedToHost(arg: CFSwappedFloat32) -> f32 {
245    CFConvertFloat32SwappedToHost(arg)
246}
247
248#[must_use]
249#[inline]
250/// Apple SDK function `CFConvertDoubleHostToSwapped`.
251pub fn CFConvertDoubleHostToSwapped(arg: f64) -> CFSwappedFloat64 {
252    CFConvertFloat64HostToSwapped(arg)
253}
254
255#[must_use]
256#[inline]
257/// Apple SDK function `CFConvertDoubleSwappedToHost`.
258pub fn CFConvertDoubleSwappedToHost(arg: CFSwappedFloat64) -> f64 {
259    CFConvertFloat64SwappedToHost(arg)
260}
261
262#[must_use]
263#[inline]
264/// Apple SDK function `CFUserNotificationCheckBoxChecked`.
265pub const fn CFUserNotificationCheckBoxChecked(i: CFIndex) -> CFOptionFlags {
266    (1_u64 << (8 + i as u32)) as CFOptionFlags
267}
268
269#[must_use]
270#[inline]
271/// Apple SDK function `CFUserNotificationSecureTextField`.
272pub const fn CFUserNotificationSecureTextField(i: CFIndex) -> CFOptionFlags {
273    (1_u64 << (16 + i as u32)) as CFOptionFlags
274}
275
276#[must_use]
277#[inline]
278/// Apple SDK function `CFUserNotificationPopUpSelection`.
279pub const fn CFUserNotificationPopUpSelection(n: CFIndex) -> CFOptionFlags {
280    ((n as u64) << 24) as CFOptionFlags
281}
282
283#[inline]
284/// Initializes a `CFStringInlineBuffer` for indexed character access. Wraps `CFStringInitInlineBuffer`.
285///
286/// # Safety
287/// `str_` must be a valid `CFStringRef`, `buf` must point to writable storage, and `range` must describe a valid slice of `str_`.
288pub unsafe fn CFStringInitInlineBuffer(
289    str_: CFStringRef,
290    buf: *mut CFStringInlineBuffer,
291    range: CFRange,
292) {
293    if let Some(buf) = unsafe { buf.as_mut() } {
294        buf.theString = str_;
295        buf.rangeToBuffer = range;
296        let direct_uni = unsafe { CFStringGetCharactersPtr(str_) };
297        buf.directUniCharBuffer = direct_uni;
298        buf.directCStringBuffer = if direct_uni.is_null() {
299            unsafe { CFStringGetCStringPtr(str_, kCFStringEncodingASCII) }
300        } else {
301            ptr::null()
302        };
303        buf.bufferedRangeStart = 0;
304        buf.bufferedRangeEnd = 0;
305    }
306}
307
308#[must_use]
309#[inline]
310/// Returns a character from a `CFStringInlineBuffer`. Wraps `CFStringGetCharacterFromInlineBuffer`.
311///
312/// # Safety
313/// `buf` must point to an initialized inline buffer created for the referenced string, and it must remain valid for the duration of the call.
314pub unsafe fn CFStringGetCharacterFromInlineBuffer(
315    buf: *mut CFStringInlineBuffer,
316    idx: CFIndex,
317) -> UniChar {
318    let Some(buf) = (unsafe { buf.as_mut() }) else {
319        return 0;
320    };
321    if idx < 0 || idx >= buf.rangeToBuffer.length {
322        return 0;
323    }
324    if !buf.directUniCharBuffer.is_null() {
325        return unsafe {
326            *buf.directUniCharBuffer
327                .add((idx + buf.rangeToBuffer.location) as usize)
328        };
329    }
330    if !buf.directCStringBuffer.is_null() {
331        return unsafe {
332            *buf.directCStringBuffer
333                .add((idx + buf.rangeToBuffer.location) as usize) as u8
334        } as UniChar;
335    }
336    if idx >= buf.bufferedRangeEnd || idx < buf.bufferedRangeStart {
337        buf.bufferedRangeStart = (idx - 4).max(0);
338        buf.bufferedRangeEnd = (buf.bufferedRangeStart + 64).min(buf.rangeToBuffer.length);
339        unsafe {
340            CFStringGetCharacters(
341                buf.theString,
342                CFRangeMake(
343                    buf.rangeToBuffer.location + buf.bufferedRangeStart,
344                    buf.bufferedRangeEnd - buf.bufferedRangeStart,
345                ),
346                buf.buffer.as_mut_ptr(),
347            );
348        }
349    }
350    buf.buffer[(idx - buf.bufferedRangeStart) as usize]
351}
352
353#[must_use]
354#[inline]
355/// Apple SDK function `CFStringIsSurrogateHighCharacter`.
356pub const fn CFStringIsSurrogateHighCharacter(character: UniChar) -> Boolean {
357    ((character >= 0xD800) && (character <= 0xDBFF)) as Boolean
358}
359
360#[must_use]
361#[inline]
362/// Apple SDK function `CFStringIsSurrogateLowCharacter`.
363pub const fn CFStringIsSurrogateLowCharacter(character: UniChar) -> Boolean {
364    ((character >= 0xDC00) && (character <= 0xDFFF)) as Boolean
365}
366
367#[must_use]
368#[inline]
369/// Apple SDK function `CFStringGetLongCharacterForSurrogatePair`.
370pub const fn CFStringGetLongCharacterForSurrogatePair(
371    surrogateHigh: UniChar,
372    surrogateLow: UniChar,
373) -> UTF32Char {
374    (((surrogateHigh as UTF32Char - 0xD800) << 10) + (surrogateLow as UTF32Char - 0xDC00) + 0x10000)
375        as UTF32Char
376}
377
378#[must_use]
379#[inline]
380/// Writes the UTF-16 surrogate pair for a Unicode scalar. Wraps `CFStringGetSurrogatePairForLongCharacter`.
381///
382/// # Safety
383/// `surrogates` must be null or point to writable storage for two `UniChar` values.
384pub unsafe fn CFStringGetSurrogatePairForLongCharacter(
385    character: UTF32Char,
386    surrogates: *mut UniChar,
387) -> Boolean {
388    if !(0x10000..0x110000).contains(&character) {
389        return 0;
390    }
391    let scalar = character - 0x10000;
392    if !surrogates.is_null() {
393        unsafe {
394            *surrogates = (0xD800 + (scalar >> 10)) as UniChar;
395            *surrogates.add(1) = (0xDC00 + (scalar & 0x3ff)) as UniChar;
396        }
397    }
398    1
399}
400
401#[must_use]
402#[inline]
403/// Apple SDK function `CMTagGetCategory`.
404pub fn CMTagGetCategory(tag: CMTag) -> CMTagCategory {
405    tag.category
406}
407
408#[must_use]
409#[inline]
410/// Apple SDK function `CMTagGetValue`.
411pub fn CMTagGetValue(tag: CMTag) -> CMTagValue {
412    tag.value
413}
414
415#[must_use]
416#[inline]
417/// Apple SDK function `CMTagHasCategory`.
418pub fn CMTagHasCategory(tag: CMTag, category: CMTagCategory) -> Boolean {
419    (CMTagGetCategory(tag) == category) as Boolean
420}
421
422#[must_use]
423#[inline]
424/// Apple SDK function `CMTagCategoryEqualToTagCategory`.
425pub fn CMTagCategoryEqualToTagCategory(tag1: CMTag, tag2: CMTag) -> Boolean {
426    (tag1.category == tag2.category) as Boolean
427}
428
429#[must_use]
430#[inline]
431/// Apple SDK function `CMTagIsValid`.
432pub fn CMTagIsValid(tag: CMTag) -> Boolean {
433    (unsafe { CMTagGetValueDataType(tag) } != kCMTagDataType_Invalid as CMTagDataType) as Boolean
434}
435
436#[must_use]
437#[inline]
438/// Apple SDK function `CMTagCategoryValueEqualToValue`.
439pub fn CMTagCategoryValueEqualToValue(tag1: CMTag, tag2: CMTag) -> Boolean {
440    ((tag1.category == tag2.category)
441        && (unsafe { CMTagGetValueDataType(tag1) } == unsafe { CMTagGetValueDataType(tag2) })
442        && (tag1.value == tag2.value)) as Boolean
443}
444
445#[must_use]
446#[inline]
447/// Creates a timebase using another timebase as its master. Wraps `CMTimebaseCreateWithMasterTimebase`.
448///
449/// # Safety
450/// `timebaseOut` must be writable, and every supplied Core Media reference must be valid for the duration of the call.
451pub unsafe fn CMTimebaseCreateWithMasterTimebase(
452    allocator: CFAllocatorRef,
453    masterTimebase: CMTimebaseRef,
454    timebaseOut: *mut CMTimebaseRef,
455) -> OSStatus {
456    unsafe { CMTimebaseCreateWithSourceTimebase(allocator, masterTimebase, timebaseOut) }
457}
458
459#[must_use]
460#[inline]
461/// Sets the master clock for a timebase. Wraps `CMTimebaseSetMasterClock`.
462///
463/// # Safety
464/// `timebase` and `newMasterClock` must be valid Core Media references.
465pub unsafe fn CMTimebaseSetMasterClock(
466    timebase: CMTimebaseRef,
467    newMasterClock: CMClockRef,
468) -> OSStatus {
469    unsafe { CMTimebaseSetSourceClock(timebase, newMasterClock) }
470}
471
472#[must_use]
473#[inline]
474/// Sets the master timebase for a timebase. Wraps `CMTimebaseSetMasterTimebase`.
475///
476/// # Safety
477/// `timebase` and `newMasterTimebase` must be valid Core Media references.
478pub unsafe fn CMTimebaseSetMasterTimebase(
479    timebase: CMTimebaseRef,
480    newMasterTimebase: CMTimebaseRef,
481) -> OSStatus {
482    unsafe { CMTimebaseSetSourceTimebase(timebase, newMasterTimebase) }
483}
484
485/// Opaque tag for `CGContextRef`.
486pub enum __CGContext {}
487
488/// CoreGraphics drawing context (`CGContextRef` in CoreGraphics).
489pub type CGContextRef = *mut __CGContext;
490
491/// CoreGraphics 16-bit Unicode character code (`CGCharCode` in CoreGraphics).
492pub type CGCharCode = u16;
493
494/// CoreGraphics 16-bit virtual key code (`CGKeyCode` in CoreGraphics).
495pub type CGKeyCode = u16;
496
497#[repr(C)]
498#[derive(Debug, Copy, Clone)]
499/// Opaque Apple SDK type `__CVMetalTextureCache`.
500pub struct __CVMetalTextureCache {
501    _unused: [u8; 0],
502}
503
504/// Apple SDK type alias `CVMetalTextureCacheRef`.
505pub type CVMetalTextureCacheRef = *mut __CVMetalTextureCache;
506/// Apple SDK type alias `CVMetalTextureRef`.
507pub type CVMetalTextureRef = CVImageBufferRef;
508
509extern "C" {
510/// Apple SDK function `CVMetalTextureGetTypeID`.
511    pub fn CVMetalTextureGetTypeID() -> CFTypeID;
512/// Apple SDK function `CVMetalTextureGetTexture`.
513    pub fn CVMetalTextureGetTexture(image: CVMetalTextureRef) -> *mut core::ffi::c_void;
514/// Apple SDK function `CVMetalTextureIsFlipped`.
515    pub fn CVMetalTextureIsFlipped(image: CVMetalTextureRef) -> Boolean;
516/// Apple SDK function `CVMetalTextureGetCleanTexCoords`.
517    pub fn CVMetalTextureGetCleanTexCoords(
518        image: CVMetalTextureRef,
519        lowerLeft: *mut f32,
520        lowerRight: *mut f32,
521        upperRight: *mut f32,
522        upperLeft: *mut f32,
523    );
524/// Apple SDK function `CVMetalTextureCacheCreateTextureFromImage`.
525    pub fn CVMetalTextureCacheCreateTextureFromImage(
526        allocator: CFAllocatorRef,
527        textureCache: CVMetalTextureCacheRef,
528        sourceImage: CVImageBufferRef,
529        textureAttributes: CFDictionaryRef,
530        pixelFormat: usize,
531        width: usize,
532        height: usize,
533        planeIndex: usize,
534        textureOut: *mut CVMetalTextureRef,
535    ) -> CVReturn;
536/// Apple SDK function `CVMetalBufferGetBuffer`.
537    pub fn CVMetalBufferGetBuffer(buffer: CVMetalBufferRef) -> *mut core::ffi::c_void;
538/// Apple SDK function `CVMetalBufferCacheCreate`.
539    pub fn CVMetalBufferCacheCreate(
540        allocator: CFAllocatorRef,
541        cacheAttributes: CFDictionaryRef,
542        metalDevice: *mut core::ffi::c_void,
543        metalBufferAttributes: CFDictionaryRef,
544        cacheOut: *mut CVMetalBufferCacheRef,
545    ) -> CVReturn;
546}
547
548#[must_use]
549#[inline]
550/// Returns the process-wide Dispatch main queue pointer. Wraps `dispatch_get_main_queue`.
551///
552/// # Safety
553/// The returned pointer follows Apple's global-queue ownership rules and must not be released as an owned +1 reference.
554pub unsafe fn dispatch_get_main_queue() -> dispatch_queue_main_t {
555    ptr::addr_of_mut!(_dispatch_main_q)
556}