X-Git-Url: https://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/85ab8496645e958bbc36b64cd2827e0c47c761eb..f9f3a47a274221c512a23a76dceb6b2b1ee1d6a6:/src/gui/lbxgui.c diff --git a/src/gui/lbxgui.c b/src/gui/lbxgui.c index 14da378..e9726a6 100644 --- a/src/gui/lbxgui.c +++ b/src/gui/lbxgui.c @@ -27,7 +27,7 @@ #include "lbx.h" #include "image.h" -#include "render.h" +#include "lbxgui.h" #include "bg.xbm" @@ -36,12 +36,27 @@ static GtkBuilder *builder; static GtkWidget *canvas; +static cairo_surface_t *framebuf; static cairo_pattern_t *bg_pattern; static bool bg_stipple; static struct lbx_image *image; +static struct lbx_colour palette[256]; -static GdkPixbuf *framebuf; +/* We support stacking up to three palettes, with each superseding the last. */ +static struct lbx_colour palette_external[256]; +static struct lbx_colour palette_internal[256]; +static struct lbx_colour palette_override[256]; + +static void refresh_palette(void) +{ + memcpy(palette, palette_external, sizeof palette); + lbxgui_stack_palette(palette, palette_internal); + lbxgui_stack_palette(palette, palette_override); + + if (framebuf) + lbxgui_render_restart(framebuf); +} void play_toggled(GtkToggleButton *button, gpointer data) { @@ -65,8 +80,8 @@ void set_frame(GtkSpinButton *spin, gpointer data) { unsigned frame = gtk_spin_button_get_value_as_int(spin); - if (image && framebuf) - render_to_pixbuf(image, framebuf, frame); + if (image) + lbxgui_render_argb(framebuf, image, frame, palette); gdk_window_invalidate_rect(canvas->window, NULL, FALSE); } @@ -74,6 +89,8 @@ static void redraw_image(void) { GtkSpinButton *spin; + refresh_palette(); + spin = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "framespin")); set_frame(spin, NULL); } @@ -141,9 +158,6 @@ gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data) { cairo_t *cr; - if (!framebuf) - return FALSE; - cr = gdk_cairo_create(canvas->window); if (bg_stipple) { @@ -160,7 +174,7 @@ gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data) cairo_fill(cr); } - gdk_cairo_set_source_pixbuf(cr, framebuf, 0, 0); + cairo_set_source_surface(cr, framebuf, 0, 0); gdk_cairo_rectangle(cr, &event->area); cairo_fill(cr); @@ -169,22 +183,19 @@ gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data) return TRUE; } -static int alloc_framebuffer(struct lbx_image *image) +static int alloc_framebuffer(struct lbx_image *img) { GtkSpinButton *spin; - if (framebuf) - g_object_unref(framebuf); - - framebuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, - image->width, image->height); - g_return_val_if_fail(framebuf, -1); + cairo_surface_destroy(framebuf); + framebuf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, + img->width, img->height); spin = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "framespin")); - gtk_spin_button_set_range(spin, 0, image->frames-1); + gtk_spin_button_set_range(spin, 0, img->frames-1); gtk_spin_button_set_value(spin, 0); - gtk_widget_set_size_request(canvas, image->width, image->height); + gtk_widget_set_size_request(canvas, img->width, img->height); return 0; } @@ -287,10 +298,7 @@ void set_image(GtkComboBox *combo) lbx_img_close(img); } - if (alloc_framebuffer(img) == -1) { - puts("crap"); - lbx_img_close(img); - } + alloc_framebuffer(img); } image = img;