diff -r 7849dc795c3a -r a40c1ec7883d ui/gtk/image.c --- a/ui/gtk/image.c Thu Aug 27 19:57:28 2026 +0200 +++ b/ui/gtk/image.c Fri Aug 28 20:27:23 2026 +0200 @@ -238,6 +238,48 @@ } } +static void imageviewer_set(UiImageViewer *imgviewer, GdkPixbuf *pixbuf) { + if(imgviewer->pixbuf) { + g_object_unref(imgviewer->pixbuf); + } + + g_object_ref(pixbuf); + imgviewer->pixbuf = pixbuf; + + imageviewer_reset(imgviewer); + if(imgviewer->adjustwidgetsize && !imgviewer->autoscale) { + int width = gdk_pixbuf_get_width(pixbuf); + int height = gdk_pixbuf_get_height(pixbuf); + gtk_widget_set_size_request(imgviewer->widget, width, height); + } + gtk_widget_queue_draw(imgviewer->widget); +} + +void ui_imageviewer_load_file(UIWIDGET w, const char *path) { + UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer"); + if(imgviewer) { + GError *error = NULL; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, &error); + if(pixbuf) { + imageviewer_set(imgviewer, pixbuf); + } + } +} + +void ui_imageviewer_load_data(UIWIDGET w, const void *imgdata, size_t size) { + UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer"); + if(imgviewer) { + GBytes *bytes = g_bytes_new_static(imgdata, size); + GInputStream *in = g_memory_input_stream_new_from_bytes(bytes); + GError *error = NULL; + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_stream(in, NULL, &error); + g_object_unref(in); + if(pixbuf) { + imageviewer_set(imgviewer, pixbuf); + } + } +} + void ui_cairo_draw_image(UiImageViewer *imgviewer, cairo_t *cr, int width, int height) { if(!imgviewer->pixbuf) { return; @@ -306,24 +348,9 @@ } GdkPixbuf *pixbuf = value; - g_object_ref(pixbuf); - UiImageViewer *imgviewer = g->obj; g->value = pixbuf; - - imageviewer_reset(imgviewer); - - if(imgviewer->pixbuf) { - g_object_unref(imgviewer->pixbuf); - } - imgviewer->pixbuf = pixbuf; - - if(imgviewer->adjustwidgetsize && !imgviewer->autoscale) { - int width = gdk_pixbuf_get_width(pixbuf); - int height = gdk_pixbuf_get_height(pixbuf); - gtk_widget_set_size_request(imgviewer->widget, width, height); - } - gtk_widget_queue_draw(imgviewer->widget); + imageviewer_set(imgviewer, pixbuf); return 0; }