From b176767dfac722d85b3d3b4ab7969e5572189aa0 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Wed, 22 Jun 2005 08:30:31 +0000 Subject: New front end functions to save and restore a region of the puzzle bitmap. Can be used to implement sprite-like animations: for example, useful for games that wish to implement a user interface which involves dragging an object around the playing area. [originally from svn r5987] --- gtk.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'gtk.c') diff --git a/gtk.c b/gtk.c index 5f016ad..e3bffa5 100644 --- a/gtk.c +++ b/gtk.c @@ -334,6 +334,57 @@ void draw_polygon(frontend *fe, int *coords, int npoints, sfree(points); } +struct blitter { + GdkPixmap *pixmap; + int w, h, x, y; +}; + +blitter *blitter_new(int w, int h) +{ + /* + * We can't create the pixmap right now, because fe->window + * might not yet exist. So we just cache w and h and create it + * during the firs call to blitter_save. + */ + blitter *bl = snew(blitter); + bl->pixmap = NULL; + bl->w = w; + bl->h = h; + return bl; +} + +void blitter_free(blitter *bl) +{ + if (bl->pixmap) + gdk_pixmap_unref(bl->pixmap); + sfree(bl); +} + +void blitter_save(frontend *fe, blitter *bl, int x, int y) +{ + if (!bl->pixmap) + bl->pixmap = gdk_pixmap_new(fe->area->window, bl->w, bl->h, -1); + bl->x = x; + bl->y = y; + gdk_draw_pixmap(bl->pixmap, + fe->area->style->fg_gc[GTK_WIDGET_STATE(fe->area)], + fe->pixmap, + x, y, 0, 0, bl->w, bl->h); +} + +void blitter_load(frontend *fe, blitter *bl, int x, int y) +{ + assert(bl->pixmap); + if (x == BLITTER_FROMSAVED && y == BLITTER_FROMSAVED) { + x = bl->x; + y = bl->y; + } + gdk_draw_pixmap(fe->pixmap, + fe->area->style->fg_gc[GTK_WIDGET_STATE(fe->area)], + bl->pixmap, + 0, 0, x, y, bl->w, bl->h); +} + void draw_update(frontend *fe, int x, int y, int w, int h) { if (fe->bbox_l > x ) fe->bbox_l = x ; -- cgit v1.1