X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fblitspin.c;h=af3ea752e76a51ab35cb9863b6f04d673b1d8582;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=1c18881c8fda0b8347fb31fb912dc9cdba287ad8;hpb=c1b9b55ad8d59dc05ef55e316aebf5863e7dfa56;p=xscreensaver diff --git a/hacks/blitspin.c b/hacks/blitspin.c index 1c18881c..af3ea752 100644 --- a/hacks/blitspin.c +++ b/hacks/blitspin.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski +/* xscreensaver, Copyright (c) 1992-2014 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -25,8 +25,10 @@ */ #include "screenhack.h" +#include "pow2.h" #include "xpm-pixmap.h" #include +#include #include "images/som.xbm" @@ -40,7 +42,7 @@ So, on OSX, we implement the blitter by hand. It is correct, but orders of magnitude slower. */ -#ifndef HAVE_COCOA +#ifndef HAVE_JWXYZ # define USE_XCOPYAREA #endif @@ -154,7 +156,7 @@ blitspin_draw (Display *dpy, Window window, void *closure) st->first_time = 0; st->loaded_p = True; st->qwad = -1; - st->start_time = time ((time_t) 0); + st->start_time = time ((time_t *) 0); blitspin_init_2 (st); } @@ -165,7 +167,7 @@ blitspin_draw (Display *dpy, Window window, void *closure) if (!st->img_loader && st->load_ext_p && - st->start_time + st->duration < time ((time_t) 0)) { + st->start_time + st->duration < time ((time_t *) 0)) { /* Start a new image loading, but keep rotating the old image until the new one arrives. */ st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window, @@ -219,17 +221,13 @@ blitspin_draw (Display *dpy, Window window, void *closure) static int -to_pow2(struct state *st, int n, Bool up) +blitspin_to_pow2(int n, Bool up) { - int powers_of_2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, - 2048, 4096, 8192, 16384, 32768, 65536 }; - int i = 0; - if (n > 65536) st->size = 65536; - while (n >= powers_of_2[i]) i++; - if (n == powers_of_2[i-1]) + int pow2 = to_pow2 (n); + if (n == pow2) return n; else - return powers_of_2[up ? i : i-1]; + return up ? pow2 : pow2 >> 1; } static void * @@ -254,7 +252,7 @@ blitspin_init (Display *d_arg, Window w_arg) if (st->delay2 < 0) st->delay2 = 0; if (st->duration < 1) st->duration = 1; - st->start_time = time ((time_t) 0); + st->start_time = time ((time_t *) 0); bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap"); if (! bitmap_name || !*bitmap_name) @@ -296,6 +294,7 @@ blitspin_init (Display *d_arg, Window w_arg) st->bitmap = xpm_file_to_pixmap (st->dpy, st->window, bitmap_name, &st->width, &st->height, 0); st->scale_up = True; /* probably? */ + blitspin_init_2 (st); } return st; @@ -309,11 +308,12 @@ blitspin_init_2 (struct state *st) /* make it square */ st->size = (st->width < st->height) ? st->height : st->width; - st->size = to_pow2(st, st->size, st->scale_up); /* round up to power of 2 */ + /* round up to power of 2 */ + st->size = blitspin_to_pow2(st->size, st->scale_up); { /* don't exceed screen size */ int s = XScreenNumberOfScreen(st->xgwa.screen); - int w = to_pow2(st, XDisplayWidth(st->dpy, s), False); - int h = to_pow2(st, XDisplayHeight(st->dpy, s), False); + int w = blitspin_to_pow2(XDisplayWidth(st->dpy, s), False); + int h = blitspin_to_pow2(XDisplayHeight(st->dpy, s), False); if (st->size > w) st->size = w; if (st->size > h) st->size = h; } @@ -397,6 +397,12 @@ blitspin_reshape (Display *dpy, Window window, void *closure, static Bool blitspin_event (Display *dpy, Window window, void *closure, XEvent *event) { + struct state *st = (struct state *) closure; + if (screenhack_event_helper (dpy, window, event)) + { + st->start_time = 0; + return True; + } return False; } @@ -414,7 +420,10 @@ static const char *blitspin_defaults [] = { "*delay2: 500000", "*duration: 120", "*bitmap: (default)", - "*geometry: 512x512", + "*geometry: 1080x1080", +#ifdef HAVE_MOBILE + "*ignoreRotation: True", +#endif 0 };