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 }