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]
9pub const fn CFRangeMake(loc: CFIndex, len: CFIndex) -> CFRange {
10    CFRange {
11        location: loc,
12        length: len,
13    }
14}
15
16pub const CFByteOrderUnknown: CFByteOrder = 0;
17pub const CFByteOrderLittleEndian: CFByteOrder = 1;
18pub const CFByteOrderBigEndian: CFByteOrder = 2;
19
20#[must_use]
21#[inline]
22pub const fn CFByteOrderGetCurrent() -> CFByteOrder {
23    if cfg!(target_endian = "little") {
24        CFByteOrderLittleEndian
25    } else if cfg!(target_endian = "big") {
26        CFByteOrderBigEndian
27    } else {
28        CFByteOrderUnknown
29    }
30}
31
32#[must_use]
33#[inline]
34pub const fn CFSwapInt16(arg: u16) -> u16 {
35    arg.swap_bytes()
36}
37
38#[must_use]
39#[inline]
40pub const fn CFSwapInt32(arg: u32) -> u32 {
41    arg.swap_bytes()
42}
43
44#[must_use]
45#[inline]
46pub const fn CFSwapInt64(arg: u64) -> u64 {
47    arg.swap_bytes()
48}
49
50#[must_use]
51#[inline]
52pub const fn CFSwapInt16BigToHost(arg: u16) -> u16 {
53    if cfg!(target_endian = "big") {
54        arg
55    } else {
56        CFSwapInt16(arg)
57    }
58}
59
60#[must_use]
61#[inline]
62pub const fn CFSwapInt32BigToHost(arg: u32) -> u32 {
63    if cfg!(target_endian = "big") {
64        arg
65    } else {
66        CFSwapInt32(arg)
67    }
68}
69
70#[must_use]
71#[inline]
72pub const fn CFSwapInt64BigToHost(arg: u64) -> u64 {
73    if cfg!(target_endian = "big") {
74        arg
75    } else {
76        CFSwapInt64(arg)
77    }
78}
79
80#[must_use]
81#[inline]
82pub const fn CFSwapInt16HostToBig(arg: u16) -> u16 {
83    if cfg!(target_endian = "big") {
84        arg
85    } else {
86        CFSwapInt16(arg)
87    }
88}
89
90#[must_use]
91#[inline]
92pub const fn CFSwapInt32HostToBig(arg: u32) -> u32 {
93    if cfg!(target_endian = "big") {
94        arg
95    } else {
96        CFSwapInt32(arg)
97    }
98}
99
100#[must_use]
101#[inline]
102pub const fn CFSwapInt64HostToBig(arg: u64) -> u64 {
103    if cfg!(target_endian = "big") {
104        arg
105    } else {
106        CFSwapInt64(arg)
107    }
108}
109
110#[must_use]
111#[inline]
112pub const fn CFSwapInt16LittleToHost(arg: u16) -> u16 {
113    if cfg!(target_endian = "little") {
114        arg
115    } else {
116        CFSwapInt16(arg)
117    }
118}
119
120#[must_use]
121#[inline]
122pub const fn CFSwapInt32LittleToHost(arg: u32) -> u32 {
123    if cfg!(target_endian = "little") {
124        arg
125    } else {
126        CFSwapInt32(arg)
127    }
128}
129
130#[must_use]
131#[inline]
132pub const fn CFSwapInt64LittleToHost(arg: u64) -> u64 {
133    if cfg!(target_endian = "little") {
134        arg
135    } else {
136        CFSwapInt64(arg)
137    }
138}
139
140#[must_use]
141#[inline]
142pub const fn CFSwapInt16HostToLittle(arg: u16) -> u16 {
143    if cfg!(target_endian = "little") {
144        arg
145    } else {
146        CFSwapInt16(arg)
147    }
148}
149
150#[must_use]
151#[inline]
152pub const fn CFSwapInt32HostToLittle(arg: u32) -> u32 {
153    if cfg!(target_endian = "little") {
154        arg
155    } else {
156        CFSwapInt32(arg)
157    }
158}
159
160#[must_use]
161#[inline]
162pub const fn CFSwapInt64HostToLittle(arg: u64) -> u64 {
163    if cfg!(target_endian = "little") {
164        arg
165    } else {
166        CFSwapInt64(arg)
167    }
168}
169
170#[must_use]
171#[inline]
172pub fn CFConvertFloat32HostToSwapped(arg: Float32) -> CFSwappedFloat32 {
173    let mut bits = arg.to_bits();
174    if cfg!(target_endian = "little") {
175        bits = bits.swap_bytes();
176    }
177    CFSwappedFloat32 { v: bits }
178}
179
180#[must_use]
181#[inline]
182pub fn CFConvertFloat32SwappedToHost(arg: CFSwappedFloat32) -> Float32 {
183    let mut bits = arg.v;
184    if cfg!(target_endian = "little") {
185        bits = bits.swap_bytes();
186    }
187    Float32::from_bits(bits)
188}
189
190#[must_use]
191#[inline]
192pub fn CFConvertFloat64HostToSwapped(arg: Float64) -> CFSwappedFloat64 {
193    let mut bits = arg.to_bits();
194    if cfg!(target_endian = "little") {
195        bits = bits.swap_bytes();
196    }
197    CFSwappedFloat64 { v: bits }
198}
199
200#[must_use]
201#[inline]
202pub fn CFConvertFloat64SwappedToHost(arg: CFSwappedFloat64) -> Float64 {
203    let mut bits = arg.v;
204    if cfg!(target_endian = "little") {
205        bits = bits.swap_bytes();
206    }
207    Float64::from_bits(bits)
208}
209
210#[must_use]
211#[inline]
212pub fn CFConvertFloatHostToSwapped(arg: f32) -> CFSwappedFloat32 {
213    CFConvertFloat32HostToSwapped(arg)
214}
215
216#[must_use]
217#[inline]
218pub fn CFConvertFloatSwappedToHost(arg: CFSwappedFloat32) -> f32 {
219    CFConvertFloat32SwappedToHost(arg)
220}
221
222#[must_use]
223#[inline]
224pub fn CFConvertDoubleHostToSwapped(arg: f64) -> CFSwappedFloat64 {
225    CFConvertFloat64HostToSwapped(arg)
226}
227
228#[must_use]
229#[inline]
230pub fn CFConvertDoubleSwappedToHost(arg: CFSwappedFloat64) -> f64 {
231    CFConvertFloat64SwappedToHost(arg)
232}
233
234#[must_use]
235#[inline]
236pub const fn CFUserNotificationCheckBoxChecked(i: CFIndex) -> CFOptionFlags {
237    (1_u64 << (8 + i as u32)) as CFOptionFlags
238}
239
240#[must_use]
241#[inline]
242pub const fn CFUserNotificationSecureTextField(i: CFIndex) -> CFOptionFlags {
243    (1_u64 << (16 + i as u32)) as CFOptionFlags
244}
245
246#[must_use]
247#[inline]
248pub const fn CFUserNotificationPopUpSelection(n: CFIndex) -> CFOptionFlags {
249    ((n as u64) << 24) as CFOptionFlags
250}
251
252#[inline]
253pub unsafe fn CFStringInitInlineBuffer(
254    str_: CFStringRef,
255    buf: *mut CFStringInlineBuffer,
256    range: CFRange,
257) {
258    if let Some(buf) = unsafe { buf.as_mut() } {
259        buf.theString = str_;
260        buf.rangeToBuffer = range;
261        let direct_uni = unsafe { CFStringGetCharactersPtr(str_) };
262        buf.directUniCharBuffer = direct_uni;
263        buf.directCStringBuffer = if direct_uni.is_null() {
264            unsafe { CFStringGetCStringPtr(str_, kCFStringEncodingASCII) }
265        } else {
266            ptr::null()
267        };
268        buf.bufferedRangeStart = 0;
269        buf.bufferedRangeEnd = 0;
270    }
271}
272
273#[must_use]
274#[inline]
275pub unsafe fn CFStringGetCharacterFromInlineBuffer(
276    buf: *mut CFStringInlineBuffer,
277    idx: CFIndex,
278) -> UniChar {
279    let Some(buf) = (unsafe { buf.as_mut() }) else {
280        return 0;
281    };
282    if idx < 0 || idx >= buf.rangeToBuffer.length {
283        return 0;
284    }
285    if !buf.directUniCharBuffer.is_null() {
286        return unsafe {
287            *buf.directUniCharBuffer
288                .add((idx + buf.rangeToBuffer.location) as usize)
289        };
290    }
291    if !buf.directCStringBuffer.is_null() {
292        return unsafe {
293            *buf.directCStringBuffer
294                .add((idx + buf.rangeToBuffer.location) as usize) as u8
295        } as UniChar;
296    }
297    if idx >= buf.bufferedRangeEnd || idx < buf.bufferedRangeStart {
298        buf.bufferedRangeStart = (idx - 4).max(0);
299        buf.bufferedRangeEnd = (buf.bufferedRangeStart + 64).min(buf.rangeToBuffer.length);
300        unsafe {
301            CFStringGetCharacters(
302                buf.theString,
303                CFRangeMake(
304                    buf.rangeToBuffer.location + buf.bufferedRangeStart,
305                    buf.bufferedRangeEnd - buf.bufferedRangeStart,
306                ),
307                buf.buffer.as_mut_ptr(),
308            );
309        }
310    }
311    buf.buffer[(idx - buf.bufferedRangeStart) as usize]
312}
313
314#[must_use]
315#[inline]
316pub const fn CFStringIsSurrogateHighCharacter(character: UniChar) -> Boolean {
317    ((character >= 0xD800) && (character <= 0xDBFF)) as Boolean
318}
319
320#[must_use]
321#[inline]
322pub const fn CFStringIsSurrogateLowCharacter(character: UniChar) -> Boolean {
323    ((character >= 0xDC00) && (character <= 0xDFFF)) as Boolean
324}
325
326#[must_use]
327#[inline]
328pub const fn CFStringGetLongCharacterForSurrogatePair(
329    surrogateHigh: UniChar,
330    surrogateLow: UniChar,
331) -> UTF32Char {
332    (((surrogateHigh as UTF32Char - 0xD800) << 10) + (surrogateLow as UTF32Char - 0xDC00) + 0x10000)
333        as UTF32Char
334}
335
336#[must_use]
337#[inline]
338pub unsafe fn CFStringGetSurrogatePairForLongCharacter(
339    character: UTF32Char,
340    surrogates: *mut UniChar,
341) -> Boolean {
342    if !(0x10000..0x110000).contains(&character) {
343        return 0;
344    }
345    let scalar = character - 0x10000;
346    if !surrogates.is_null() {
347        unsafe {
348            *surrogates = (0xD800 + (scalar >> 10)) as UniChar;
349            *surrogates.add(1) = (0xDC00 + (scalar & 0x3ff)) as UniChar;
350        }
351    }
352    1
353}
354
355#[must_use]
356#[inline]
357pub fn CMTagGetCategory(tag: CMTag) -> CMTagCategory {
358    tag.category
359}
360
361#[must_use]
362#[inline]
363pub fn CMTagGetValue(tag: CMTag) -> CMTagValue {
364    tag.value
365}
366
367#[must_use]
368#[inline]
369pub fn CMTagHasCategory(tag: CMTag, category: CMTagCategory) -> Boolean {
370    (CMTagGetCategory(tag) == category) as Boolean
371}
372
373#[must_use]
374#[inline]
375pub fn CMTagCategoryEqualToTagCategory(tag1: CMTag, tag2: CMTag) -> Boolean {
376    (tag1.category == tag2.category) as Boolean
377}
378
379#[must_use]
380#[inline]
381pub fn CMTagIsValid(tag: CMTag) -> Boolean {
382    (unsafe { CMTagGetValueDataType(tag) } != kCMTagDataType_Invalid as CMTagDataType) as Boolean
383}
384
385#[must_use]
386#[inline]
387pub fn CMTagCategoryValueEqualToValue(tag1: CMTag, tag2: CMTag) -> Boolean {
388    ((tag1.category == tag2.category)
389        && (unsafe { CMTagGetValueDataType(tag1) } == unsafe { CMTagGetValueDataType(tag2) })
390        && (tag1.value == tag2.value)) as Boolean
391}
392
393#[must_use]
394#[inline]
395pub unsafe fn CMTimebaseCreateWithMasterTimebase(
396    allocator: CFAllocatorRef,
397    masterTimebase: CMTimebaseRef,
398    timebaseOut: *mut CMTimebaseRef,
399) -> OSStatus {
400    unsafe { CMTimebaseCreateWithSourceTimebase(allocator, masterTimebase, timebaseOut) }
401}
402
403#[must_use]
404#[inline]
405pub unsafe fn CMTimebaseSetMasterClock(
406    timebase: CMTimebaseRef,
407    newMasterClock: CMClockRef,
408) -> OSStatus {
409    unsafe { CMTimebaseSetSourceClock(timebase, newMasterClock) }
410}
411
412#[must_use]
413#[inline]
414pub unsafe fn CMTimebaseSetMasterTimebase(
415    timebase: CMTimebaseRef,
416    newMasterTimebase: CMTimebaseRef,
417) -> OSStatus {
418    unsafe { CMTimebaseSetSourceTimebase(timebase, newMasterTimebase) }
419}
420
421#[repr(C)]
422#[derive(Debug, Copy, Clone)]
423pub struct __CVMetalTextureCache {
424    _unused: [u8; 0],
425}
426
427pub type CVMetalTextureCacheRef = *mut __CVMetalTextureCache;
428pub type CVMetalTextureRef = CVImageBufferRef;
429
430extern "C" {
431    pub fn CVMetalTextureGetTypeID() -> CFTypeID;
432    pub fn CVMetalTextureGetTexture(image: CVMetalTextureRef) -> *mut core::ffi::c_void;
433    pub fn CVMetalTextureIsFlipped(image: CVMetalTextureRef) -> Boolean;
434    pub fn CVMetalTextureGetCleanTexCoords(
435        image: CVMetalTextureRef,
436        lowerLeft: *mut f32,
437        lowerRight: *mut f32,
438        upperRight: *mut f32,
439        upperLeft: *mut f32,
440    );
441    pub fn CVMetalTextureCacheCreateTextureFromImage(
442        allocator: CFAllocatorRef,
443        textureCache: CVMetalTextureCacheRef,
444        sourceImage: CVImageBufferRef,
445        textureAttributes: CFDictionaryRef,
446        pixelFormat: usize,
447        width: usize,
448        height: usize,
449        planeIndex: usize,
450        textureOut: *mut CVMetalTextureRef,
451    ) -> CVReturn;
452    pub fn CVMetalBufferGetBuffer(buffer: CVMetalBufferRef) -> *mut core::ffi::c_void;
453    pub fn CVMetalBufferCacheCreate(
454        allocator: CFAllocatorRef,
455        cacheAttributes: CFDictionaryRef,
456        metalDevice: *mut core::ffi::c_void,
457        metalBufferAttributes: CFDictionaryRef,
458        cacheOut: *mut CVMetalBufferCacheRef,
459    ) -> CVReturn;
460}
461
462#[must_use]
463#[inline]
464pub unsafe fn dispatch_get_main_queue() -> dispatch_queue_main_t {
465    ptr::addr_of_mut!(_dispatch_main_q)
466}