#include <config.h>
#include <stdlib.h>
#include <string.h>
+#include <math.h>
+
#include <gtk/gtk.h>
#include "lbx.h"
static GtkWidget *canvas;
static LBX_IMG *image;
-
/* LBX images can have up to three palettes, with each superseding the last. */
static struct lbx_colour palette_external[256];
static struct lbx_colour palette_internal[256];
GdkPixbuf *framebuf;
+void play_toggled(GtkToggleButton *button, gpointer data)
+{
+ gboolean active = gtk_toggle_button_get_active(button);
+ GtkWidget *spin;
+
+ if (active && !image) {
+ gtk_toggle_button_set_active(button, FALSE);
+ return;
+ }
+
+ spin = GTK_WIDGET(gtk_builder_get_object(builder, "framespin"));
+ gtk_widget_set_sensitive(spin, !active);
+
+ if (active) {
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 0);
+ }
+}
+
static void get_colour(unsigned char index, unsigned char out[static 3])
{
struct lbx_colour *colour;
gdk_window_invalidate_rect(canvas->window, NULL, FALSE);
}
+static void tick(void *p, double delta)
+{
+ static double elapsed = 0;
+ double seconds_per_frame = 1.0/15;
+ struct lbx_imginfo info;
+ GtkSpinButton *spin;
+ GtkToggleButton *play;
+ unsigned frame;
+
+ if (!image)
+ return;
+
+ lbximg_getinfo(image, &info);
+ spin = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "framespin"));
+ play = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "playbutton"));
+
+ frame = gtk_spin_button_get_value_as_int(spin);
+ if (!gtk_toggle_button_get_active(play))
+ return;
+
+ elapsed += delta;
+ while (elapsed > seconds_per_frame) {
+ elapsed -= seconds_per_frame;
+
+ if (++frame >= info.nframes) {
+ if (!info.looping) {
+ gtk_toggle_button_set_active(play, FALSE);
+ break;
+ }
+
+ frame = info.loopstart;
+ }
+
+ gtk_spin_button_set_value(spin, frame);
+ }
+}
+
+static gboolean timeout(gpointer data)
+{
+ static double lasttime = INFINITY;
+ static GTimer *timer;
+
+ if (isinf(lasttime)) {
+ timer = g_timer_new();
+ if (timer) {
+ lasttime = 0;
+ }
+ } else {
+ double time = g_timer_elapsed(timer, NULL);
+
+ tick(data, time - lasttime);
+ lasttime = time;
+ }
+
+ return TRUE;
+}
+
gboolean canvas_expose(GtkWidget *canvas, GdkEventExpose *event, gpointer data)
{
if (!framebuf)
interface_init();
gtk_builder_connect_signals(builder, window);
+
+ g_timeout_add(33, timeout, NULL);
gtk_widget_show_all(window);
gtk_main();
}
<property name="position">3</property>
</packing>
</child>
+ <child>
+ <object class="GtkToggleButton" id="playbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="toggled" handler="play_toggled"/>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-media-play</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">3</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="expand">False</property>