diff --git a/matron/src/hardware/screen.c b/matron/src/hardware/screen.c index 21c48a45d..b5749760b 100644 --- a/matron/src/hardware/screen.c +++ b/matron/src/hardware/screen.c @@ -636,6 +636,9 @@ bool screen_surface_get_extents(screen_surface_t *s, screen_surface_extents_t *e void screen_surface_display(screen_surface_t *s, double x, double y) { cairo_surface_t *image = (cairo_surface_t *)s; + + surface_may_have_color = true; + int width = cairo_image_surface_get_width(image); int height = cairo_image_surface_get_height(image); diff --git a/matron/src/screen_events.c b/matron/src/screen_events.c index 8ae76a187..5ebcd1b4c 100644 --- a/matron/src/screen_events.c +++ b/matron/src/screen_events.c @@ -191,6 +191,14 @@ void handle_screen_event(struct screen_event_data *ev) { case SCREEN_EVENT_DISPLAY_PNG: screen_display_png(ev->buf, ev->payload.bd.d1, ev->payload.bd.d2); break; + case SCREEN_EVENT_DISPLAY_SURFACE: + screen_surface_display(ev->buf, ev->payload.bd.d1, ev->payload.bd.d2); + ev->buf = NULL; // Didn't make a copy of the pointer, nullify to avoid double free. + break; + case SCREEN_EVENT_DISPLAY_SURFACE_REGION: + screen_surface_display_region(ev->buf, ev->payload.d.d1, ev->payload.d.d2, ev->payload.d.d3, ev->payload.d.d4, ev->payload.d.d5, ev->payload.d.d6); + ev->buf = NULL; // Didn't make a copy of the pointer, nullify to avoid double free. + break; case SCREEN_EVENT_ROTATE: screen_rotate(ev->payload.d.d1); break; @@ -496,6 +504,30 @@ void screen_event_display_png(const char *s, double x, double y) { screen_event_data_push(&ev); } +void screen_event_display_surface(void* surface, double x, double y) { + struct screen_event_data ev; + screen_event_data_init(&ev); + ev.type = SCREEN_EVENT_DISPLAY_SURFACE; + ev.buf = surface; + ev.payload.bd.d1 = x; + ev.payload.bd.d2 = y; + screen_event_data_push(&ev); +} + +void screen_event_display_surface_region(void* surface, double left, double top, double width, double height, double x, double y) { + struct screen_event_data ev; + screen_event_data_init(&ev); + ev.type = SCREEN_EVENT_DISPLAY_SURFACE_REGION; + ev.buf = surface; + ev.payload.d.d1 = left; + ev.payload.d.d2 = top; + ev.payload.d.d3 = width; + ev.payload.d.d4 = height; + ev.payload.d.d5 = x; + ev.payload.d.d6 = y; + screen_event_data_push(&ev); +} + void screen_event_peek(int x, int y, int w, int h) { struct screen_event_data ev; screen_event_data_init(&ev); diff --git a/matron/src/screen_events.h b/matron/src/screen_events.h index 2384990f1..3a3653118 100644 --- a/matron/src/screen_events.h +++ b/matron/src/screen_events.h @@ -33,6 +33,8 @@ extern void screen_event_close_path(void); extern void screen_event_text_extents(const char *s); extern void screen_event_export_png(const char *s); extern void screen_event_display_png(const char *filename, double x, double y); +extern void screen_event_display_surface(void* surface, double x, double y); +extern void screen_event_display_surface_region(void* surface, double left, double top, double width, double height, double x, double y); extern void screen_event_peek(int x, int y, int w, int h); extern void screen_event_poke(int x, int y, int w, int h, unsigned char *buf); extern void screen_event_rotate(double r); diff --git a/matron/src/screen_events_pr.h b/matron/src/screen_events_pr.h index 023370978..4b32a1da4 100644 --- a/matron/src/screen_events_pr.h +++ b/matron/src/screen_events_pr.h @@ -36,6 +36,8 @@ typedef enum { SCREEN_EVENT_CLOSE_PATH, SCREEN_EVENT_EXPORT_PNG, SCREEN_EVENT_DISPLAY_PNG, + SCREEN_EVENT_DISPLAY_SURFACE, + SCREEN_EVENT_DISPLAY_SURFACE_REGION, SCREEN_EVENT_ROTATE, SCREEN_EVENT_TRANSLATE, SCREEN_EVENT_SET_OPERATOR, diff --git a/matron/src/screen_results.c b/matron/src/screen_results.c index 7344f3886..df36d9580 100644 --- a/matron/src/screen_results.c +++ b/matron/src/screen_results.c @@ -14,11 +14,11 @@ static sem_t sem_results; void screen_results_init() { results_data = NULL; sem_init(&sem_results, 0, 0); -} +} void screen_results_deinit() { screen_results_free(); -} +} void screen_results_wait() { sem_wait(&sem_results); diff --git a/matron/src/weaver.c b/matron/src/weaver.c index 660e63cd2..a6e165252 100644 --- a/matron/src/weaver.c +++ b/matron/src/weaver.c @@ -1399,7 +1399,7 @@ int _screen_display_image(lua_State *l) { _image_t *i = _image_check(l, 1); double x = luaL_checknumber(l, 2); double y = luaL_checknumber(l, 3); - screen_surface_display(i->surface, x, y); + screen_event_display_surface(i->surface, x, y); lua_settop(l, 0); return 0; } @@ -1424,7 +1424,7 @@ int _screen_display_image_region(lua_State *l) { double height = luaL_checknumber(l, 5); double x = luaL_checknumber(l, 6); double y = luaL_checknumber(l, 7); - screen_surface_display_region(i->surface, left, top, width, height, x, y); + screen_event_display_surface_region(i->surface, left, top, width, height, x, y); return 0; }