Skip to content

Commit

Permalink
Fixed issue with image buffers not being displayed properly. (#1795)
Browse files Browse the repository at this point in the history
  • Loading branch information
skibu authored Jan 29, 2025
1 parent b6a038e commit 0a15d4d
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 4 deletions.
3 changes: 3 additions & 0 deletions matron/src/hardware/screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
32 changes: 32 additions & 0 deletions matron/src/screen_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions matron/src/screen_events.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions matron/src/screen_events_pr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions matron/src/screen_results.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions matron/src/weaver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}

Expand Down

0 comments on commit 0a15d4d

Please sign in to comment.