X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fdistort.c;h=919aa4bd83219f88daab240017cfc0ea85c3f207;hb=2d04c4f22466851aedb6ed0f2919d148f726b889;hp=4218418f201628b8b54c2969a506736196883d0e;hpb=5832fe184606766fef23369159306c0a5799aeb0;p=xscreensaver diff --git a/hacks/distort.c b/hacks/distort.c index 4218418f..919aa4bd 100644 --- a/hacks/distort.c +++ b/hacks/distort.c @@ -1,6 +1,5 @@ /* -*- mode: C; tab-width: 4 -*- - * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998 - * Jamie Zawinski + * xscreensaver, Copyright (c) 1992-2005 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 @@ -113,6 +112,8 @@ static void init_distort(Display *dpy, Window window) if (get_boolean_resource("bounce", "Boolean")) effect = &move_lense; + XGetWindowAttributes (dpy, window, &xgwa); + if (effect == NULL && radius == 0 && speed == 0 && number == 0 && !blackhole && !vortex && !magnify && !reflect) { /* if no cmdline options are given, randomly choose one of: @@ -201,8 +202,23 @@ static void init_distort(Display *dpy, Window window) abort(); break; } + /* but if the window is small, reduce default radius */ + if (xgwa.width < radius * 8) + radius = xgwa.width/8; } + /* never allow the radius to be too close to the min window dimension + */ + if (radius >= xgwa.width * 0.45) radius = xgwa.width * 0.45; + if (radius >= xgwa.height * 0.45) radius = xgwa.height * 0.45; + + + /* -swamp mode consumes vast amounts of memory, proportional to radius -- + so throttle radius to a small-ish value (60 => ~30MB.) + */ + if (effect == &swamp_thing && radius > 60) + radius = 60; + if (delay < 0) delay = 0; if (radius <= 0) @@ -222,7 +238,6 @@ static void init_distort(Display *dpy, Window window) if (draw == NULL) draw = &plain_draw; - XGetWindowAttributes (dpy, window, &xgwa); black_pixel = BlackPixelOfScreen( xgwa.screen ); gcv.function = GXcopy; @@ -232,7 +247,7 @@ static void init_distort(Display *dpy, Window window) gcflags |= GCSubwindowMode; gc = XCreateGC (dpy, window, gcflags, &gcv); - grab_screen_image (xgwa.screen, window); + load_random_image (xgwa.screen, window, window, NULL, NULL); buffer_map = 0; orig_map = XGetImage(dpy, window, 0, 0, xgwa.width, xgwa.height, @@ -533,9 +548,9 @@ static void plain_draw(int k) XShmPutImage(g_dpy, g_window, gc, buffer_map, 0, 0, xy_coo[k].x, xy_coo[k].y, 2*radius+speed+2, 2*radius+speed+2, False); else -# endif if (!use_shm) +# endif XPutImage(g_dpy, g_window, gc, buffer_map, 0, 0, xy_coo[k].x, xy_coo[k].y, 2*radius+speed+2, 2*radius+speed+2); @@ -564,6 +579,7 @@ static void reflect_draw(int k) ly = i - cy; lysq = ly * ly; ny = xy_coo[k].y + i; + if (ny >= orig_map->height) ny = orig_map->height-1; for(j = 0 ; j < 2*radius+speed+2 ; j++) { lx = j - cx; dist = lx * lx + lysq; @@ -692,7 +708,7 @@ char *defaults [] = { "*visualID: Best", #endif - "*delay: 1000", + "*delay: 20000", "*radius: 0", "*speed: 0", "*number: 0",