lib/sys/src/apple/coregraphics.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub const CGFloat = f64;
4 pub const ColorSpace = *opaque {};
5 pub const DataProvider = *opaque {};
6 pub const Event = *opaque {};
7 pub const EventFlags = u64;
8 pub const EventType = u32;
9 pub const Image = *opaque {};
10 pub const MouseButton = u32;
11 pub const Point = extern struct {
12 x: CGFloat,
13 y: CGFloat,
14 };
15
16 const image_alpha_last: u32 = 3;
17 const bitmap_byte_order_32_big: u32 = 4 << 12;
18 pub const event_left_mouse_down: EventType = 1;
19 pub const event_left_mouse_up: EventType = 2;
20 pub const event_right_mouse_down: EventType = 3;
21 pub const event_right_mouse_up: EventType = 4;
22 pub const event_other_mouse_down: EventType = 25;
23 pub const event_other_mouse_up: EventType = 26;
24 pub const event_other_mouse_dragged: EventType = 27;
25 const rendering_intent_default: c_int = 0;
26 const keyboard_event_autorepeat: u32 = 8;
27
28 extern fn CFRelease(value: *const anyopaque) void;
29 extern fn CGColorSpaceCreateDeviceRGB() ?ColorSpace;
30 extern fn CGColorSpaceRelease(space: ColorSpace) void;
31 extern fn CGDataProviderCreateWithData(
32 info: ?*anyopaque,
33 data: *const anyopaque,
34 size: usize,
35 release_data: ?*const fn (?*anyopaque, *const anyopaque, usize) callconv(.c) void,
36 ) ?DataProvider;
37 extern fn CGDataProviderRelease(provider: DataProvider) void;
38 extern fn CGImageCreate(
39 width: usize,
40 height: usize,
41 bits_per_component: usize,
42 bits_per_pixel: usize,
43 bytes_per_row: usize,
44 color_space: ColorSpace,
45 bitmap_info: u32,
46 provider: DataProvider,
47 decode: ?[*]const CGFloat,
48 should_interpolate: bool,
49 intent: c_int,
50 ) ?Image;
51 extern fn CGImageRelease(image: Image) void;
52 extern fn CGEventCreateKeyboardEvent(
53 source: ?*const anyopaque,
54 virtual_key: u16,
55 key_down: bool,
56 ) ?Event;
57 extern fn CGEventCreateMouseEvent(
58 source: ?*const anyopaque,
59 mouse_type: EventType,
60 mouse_cursor_position: Point,
61 mouse_button: MouseButton,
62 ) ?Event;
63 extern fn CGEventSetFlags(event: ?Event, flags: EventFlags) void;
64 extern fn CGEventSetIntegerValueField(event: ?Event, field: u32, value: i64) void;
65
66 pub fn createDeviceRgbColorSpace() ?ColorSpace {
67 return CGColorSpaceCreateDeviceRGB();
68 }
69
70 pub fn releaseColorSpace(space: ColorSpace) void {
71 CGColorSpaceRelease(space);
72 }
73
74 pub fn createDataProvider(data: []const u8) ?DataProvider {
75 if (data.len == 0) return null;
76 return CGDataProviderCreateWithData(null, data.ptr, data.len, null);
77 }
78
79 pub fn releaseDataProvider(provider: DataProvider) void {
80 CGDataProviderRelease(provider);
81 }
82
83 pub fn createRgba8Image(
84 width: u32,
85 height: u32,
86 bytes_per_row: usize,
87 color_space: ColorSpace,
88 provider: DataProvider,
89 ) ?Image {
90 return CGImageCreate(
91 @as(usize, width),
92 @as(usize, height),
93 8,
94 32,
95 bytes_per_row,
96 color_space,
97 image_alpha_last | bitmap_byte_order_32_big,
98 provider,
99 null,
100 false,
101 rendering_intent_default,
102 );
103 }
104
105 pub fn releaseImage(image: Image) void {
106 CGImageRelease(image);
107 }
108
109 pub fn createKeyboardEvent(virtual_key: u16, key_down: bool) ?Event {
110 return CGEventCreateKeyboardEvent(null, virtual_key, key_down);
111 }
112
113 pub fn createMouseEvent(
114 event_type: EventType,
115 position: Point,
116 button: MouseButton,
117 ) ?Event {
118 return CGEventCreateMouseEvent(null, event_type, position, button);
119 }
120
121 pub fn setKeyboardEventFlags(event: Event, flags: EventFlags) void {
122 CGEventSetFlags(event, flags);
123 }
124
125 pub fn setKeyboardEventRepeated(event: Event, repeated: bool) void {
126 CGEventSetIntegerValueField(event, keyboard_event_autorepeat, @intFromBool(repeated));
127 }
128
129 pub fn releaseEvent(event: Event) void {
130 CFRelease(event);
131 }
132
133 test "CoreGraphics ABI uses 64-bit scalars and opaque pointer handles" {
134 try std.testing.expectEqual(@as(usize, 8), @sizeOf(CGFloat));
135 try std.testing.expectEqual(@sizeOf(usize), @sizeOf(ColorSpace));
136 try std.testing.expectEqual(@sizeOf(usize), @sizeOf(DataProvider));
137 try std.testing.expectEqual(@sizeOf(usize), @sizeOf(Event));
138 try std.testing.expectEqual(@as(usize, 8), @sizeOf(EventFlags));
139 try std.testing.expectEqual(@as(usize, 4), @sizeOf(EventType));
140 try std.testing.expectEqual(@sizeOf(usize), @sizeOf(Image));
141 try std.testing.expectEqual(@as(usize, 4), @sizeOf(MouseButton));
142 try std.testing.expectEqual(@as(usize, 16), @sizeOf(Point));
143 }