summaryrefslogtreecommitdiff
path: root/src/platform/cocoa/window.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/cocoa/window.m')
-rw-r--r--src/platform/cocoa/window.m15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/platform/cocoa/window.m b/src/platform/cocoa/window.m
index 1efff59..2f9f8e5 100644
--- a/src/platform/cocoa/window.m
+++ b/src/platform/cocoa/window.m
@@ -89,6 +89,8 @@ struct cocoa_surface {
struct yasl_frame frame;
struct yasl_damage_list damage;
bool did_present;
+ /* Extent of the frame in pixels, valid while did_present is set. */
+ struct yasl_vector2i shown_size;
unsigned idle_frames;
bool want_draw;
bool frame_due;
@@ -1073,6 +1075,7 @@ bool cocoa_surface_present(struct cocoa_surface *w, const struct yasl_framebuffe
}
yasl_clock_presented(&w->clock, yasl_loop_now_ns(), false);
w->did_present = true;
+ w->shown_size = w->size;
return true;
}
@@ -2198,6 +2201,17 @@ static bool impl_surface_place_under_pointer(struct yasl_surface *s, struct yasl
return cocoa_surface_place_under_pointer((struct cocoa_surface *)s, at);
}
+static bool impl_surface_read_pixels(struct yasl_surface *s, uint32_t *out, size_t cap,
+ struct yasl_vector2i *size)
+{
+ struct cocoa_surface *w = (struct cocoa_surface *)s;
+ /* did_present stays set from the last draw until the next one starts, and
+ * pixels are reallocated only when a draw starts. */
+ if (w->closed || w->rendering || !w->did_present || !w->software_queue || !w->pixels)
+ return false;
+ return yasl_copy_frame(w->pixels, w->shown_size, out, cap, size);
+}
+
static bool impl_surface_bell(struct yasl_surface *s)
{
assert([NSThread isMainThread]);
@@ -2266,6 +2280,7 @@ const struct yasl_backend_ops yasl_cocoa_backend = {
.surface_drag_carry = impl_surface_drag_carry,
.surface_place_under_pointer = impl_surface_place_under_pointer,
.surface_bell = impl_surface_bell,
+ .surface_read_pixels = impl_surface_read_pixels,
.display_get_native_handle = impl_display_get_native_handle,
.surface_get_native_handle = impl_surface_get_native_handle,
.surface_get_native_frame = impl_surface_get_native_frame,