From bd821672161db0f2be855b75e1f11a332478b8ba Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sun, 7 Feb 2010 20:20:48 -0500 Subject: [PATCH] lbxgui: Allow frame to be specified. --- src/gui/lbxgui.c | 77 ++++++++++++++++++++++++++++---------------- src/gui/lbxgui.glade | 54 +++++++++++++++++++++++++++++-- 2 files changed, 101 insertions(+), 30 deletions(-) diff --git a/src/gui/lbxgui.c b/src/gui/lbxgui.c index 2d60e6e..f943be3 100644 --- a/src/gui/lbxgui.c +++ b/src/gui/lbxgui.c @@ -19,20 +19,7 @@ static struct lbx_colour palette_override[256]; GdkPixbuf *framebuf; -gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data) -{ - if (!framebuf) - return TRUE; - - gdk_draw_pixbuf(canvas->window, NULL, framebuf, - event->area.x, event->area.y, event->area.x, event->area.y, - event->area.width, event->area.height, - GDK_RGB_DITHER_NORMAL, 0, 0); - - return TRUE; -} - -void get_colour(unsigned char index, unsigned char out[static 3]) +static void get_colour(unsigned char index, unsigned char out[static 3]) { struct lbx_colour *colour; @@ -50,30 +37,23 @@ void get_colour(unsigned char index, unsigned char out[static 3]) out[2] = colour->blue; } -static int init_framedata(void) +static int render_frame(LBX_IMG *img, GdkPixbuf *buf, unsigned frame) { - struct lbx_imginfo info; unsigned char **imgdata, **imgmask; + struct lbx_imginfo info; unsigned char *data; unsigned stride; lbximg_getinfo(image, &info); - imgdata = lbximg_getframe(image, 0); + imgdata = lbximg_getframe(image, frame); if (!imgdata) { - printf("failed to decode frame 0\n"); + printf("failed to decode frame %u\n", frame); return -1; } imgmask = lbximg_getmask(image); - framebuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, - info.width, info.height); - if (!framebuf) { - printf("failed to allocate pixbuf\n"); - return -1; - } - - data = gdk_pixbuf_get_pixels(framebuf); - stride = gdk_pixbuf_get_rowstride(framebuf); + data = gdk_pixbuf_get_pixels(buf); + stride = gdk_pixbuf_get_rowstride(buf); for (unsigned i = 0; i < info.height; i++) { unsigned char (*p)[3] = (void *)(data + i*stride); @@ -89,8 +69,49 @@ static int init_framedata(void) } } - gtk_widget_set_size_request(canvas, info.width, info.height); + return 0; +} + +void set_frame(GtkSpinButton *spin, gpointer data) +{ + unsigned frame = gtk_spin_button_get_value_as_int(spin); + + render_frame(image, framebuf, frame); gdk_window_invalidate_rect(canvas->window, NULL, FALSE); +} + +gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data) +{ + if (!framebuf) + return TRUE; + + gdk_draw_pixbuf(canvas->window, NULL, framebuf, + event->area.x, event->area.y, event->area.x, event->area.y, + event->area.width, event->area.height, + GDK_RGB_DITHER_NORMAL, 0, 0); + + return TRUE; +} + +static int init_framedata(void) +{ + struct lbx_imginfo info; + GtkSpinButton *spin; + + lbximg_getinfo(image, &info); + framebuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, + info.width, info.height); + if (!framebuf) { + printf("failed to allocate pixbuf\n"); + return -1; + } + + gtk_widget_set_size_request(canvas, info.width, info.height); + + spin = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "framespin")); + gtk_spin_button_set_range(spin, 0, info.nframes-1); + gtk_spin_button_set_value(spin, 0); + set_frame(spin, NULL); return 0; } diff --git a/src/gui/lbxgui.glade b/src/gui/lbxgui.glade index 1896267..fb12bce 100644 --- a/src/gui/lbxgui.glade +++ b/src/gui/lbxgui.glade @@ -102,9 +102,55 @@ True vertical - + True - + + + True + 1 + 3 + Image: + + + False + 0 + + + + + True + + + + False + 3 + 1 + + + + + True + 1 + 3 + Frame: + + + 2 + + + + + True + True + + adjustment1 + + + + False + 3 + + False @@ -141,4 +187,8 @@ + + 1 + 10 + -- 2.43.2