From 2c902d6065f9856adf31e8540a94f1e42e68e905 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Mon, 2 Mar 2009 00:43:02 -0500 Subject: [PATCH] http://ftp.ussg.iu.edu/linux/slackware/slackware-9.0/source/xap/xscreensaver/xscreensaver-4.08.tar.bz2 -rw-r--r-- 1 zblaxell zblaxell 2423819 Feb 19 2003 xscreensaver-4.08.tar.bz2 0f6f407fa15d6a1b268fa1c92d31e8eeaa08cf35 xscreensaver-4.08.tar.bz2 --- Makefile.in | 30 +- README | 6 + configure | 163 ++++- configure.in | 79 ++- driver/Makefile.in | 3 +- driver/XScreenSaver.ad.in | 7 +- driver/XScreenSaver_ad.h | 3 + driver/demo-Gtk.c | 36 +- driver/passwd-kerberos.c | 56 +- driver/passwd.c | 4 +- driver/test-passwd.c | 5 +- driver/xscreensaver-command.man | 2 +- driver/xscreensaver-demo.man | 2 +- driver/xscreensaver-getimage-file.man | 2 +- driver/xscreensaver-getimage-video.man | 2 +- driver/xscreensaver-getimage.man | 2 +- driver/xscreensaver.c | 43 +- driver/xscreensaver.man | 427 +++++------- hacks/Makefile.in | 14 +- hacks/barcode.c | 718 +++++++++++++------- hacks/barcode.man | 8 + hacks/compile_axp.com | 1 + hacks/compile_decc.com | 1 + hacks/config/README | 4 +- hacks/config/atunnel.xml | 28 + hacks/config/barcode.xml | 6 + hacks/config/decayscreen.xml | 2 +- hacks/config/fluidballs.xml | 8 +- hacks/config/piecewise.xml | 33 + hacks/config/qix.xml | 3 +- hacks/config/ssystem.xml | 9 +- hacks/decayscreen.man | 3 +- hacks/fluidballs.c | 142 ++-- hacks/fluidballs.man | 9 +- hacks/glx/Makefile.in | 24 +- hacks/glx/atunnel.c | 308 +++++++++ hacks/glx/atunnel.man | 85 +++ hacks/glx/chessmodels.c | 2 +- hacks/glx/endgame.c | 2 +- hacks/glx/extrusion.c | 1 - hacks/glx/flurry-smoke.c | 43 +- hacks/glx/flurry.c | 50 +- hacks/glx/flurry.h | 3 - hacks/glx/glblur.c | 5 +- hacks/glx/glforestfire.c | 26 +- hacks/glx/glplanet.c | 10 +- hacks/glx/gltext.c | 9 +- hacks/glx/grab-ximage.c | 28 +- hacks/glx/lament.c | 4 +- hacks/glx/sballs.c | 10 +- hacks/glx/starwars.c | 15 +- hacks/glx/tunnel_draw.c | 472 +++++++++++++ hacks/glx/tunnel_draw.h | 3 + hacks/images/tunnel0.xpm | 198 ++++++ hacks/images/tunnel1.xpm | 134 ++++ hacks/images/tunnel2.xpm | 206 ++++++ hacks/piecewise.c | 892 +++++++++++++++++++++++++ hacks/piecewise.man | 73 ++ po/ChangeLog | 4 + po/POTFILES.in | 4 +- po/fr.po | 324 ++++++--- setup.com | 1 + utils/version.h | 2 +- utils/visual-gl.c | 28 +- utils/yarandom.c | 12 +- utils/yarandom.h | 8 +- xscreensaver.lsm | 16 +- xscreensaver.spec | 2 +- 68 files changed, 3982 insertions(+), 883 deletions(-) create mode 100644 hacks/config/atunnel.xml create mode 100644 hacks/config/piecewise.xml create mode 100644 hacks/glx/atunnel.c create mode 100644 hacks/glx/atunnel.man create mode 100644 hacks/glx/tunnel_draw.c create mode 100644 hacks/glx/tunnel_draw.h create mode 100644 hacks/images/tunnel0.xpm create mode 100644 hacks/images/tunnel1.xpm create mode 100644 hacks/images/tunnel2.xpm create mode 100644 hacks/piecewise.c create mode 100644 hacks/piecewise.man diff --git a/Makefile.in b/Makefile.in index 58ea0c34..5711b063 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,38 +22,38 @@ default:: @$(MAKE_SUBDIR) all:: @$(MAKE_SUBDIR) -install: +install:: @$(MAKE_SUBDIR) -install-program: +install-program:: @$(MAKE_SUBDIR) -install-man: +install-man:: @$(MAKE_SUBDIR) -install-strip: +install-strip:: @$(MAKE_SUBDIR) -uninstall: +uninstall:: @$(MAKE_SUBDIR) -uninstall-program: +uninstall-program:: @$(MAKE_SUBDIR) -uninstall-man: +uninstall-man:: @$(MAKE_SUBDIR) -depend: +depend:: @$(MAKE_SUBDIR) -distdepend: +distdepend:: @$(MAKE) update_spec_version @$(MAKE_SUBDIR) -TAGS: tags -tags: +TAGS:: tags +tags:: @$(MAKE_SUBDIR) -clean: +clean:: @$(MAKE_SUBDIR) -distclean: clean +distclean:: clean -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update @$(MAKE_SUBDIR) -dist: tar +dist:: tar # This really makes me sick... -tar: +tar:: @ \ sh config.status ; \ rm -f configure ; \ diff --git a/README b/README index c68b7d0c..339c03f0 100644 --- a/README +++ b/README @@ -70,6 +70,12 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html ============ +Changes since 4.07: * New hacks, `atunnels' and `piecewise'. + * Physics improvement in `fluidballs'. + * Various fixes for XDarwin systems (X11 on MacOS X.) + * Added -clock option to `barcode'. + * Minor fixes to `endgame', `flurry', `flipscreen3d', + and `gflux'. Changes since 4.06: * New hacks, `flurry', `metaballs', `eruption', `popsquares', and `barcode'. * Minor updates to `maze' for high density mazes. diff --git a/configure b/configure index f38b7fc7..be20bf30 100755 --- a/configure +++ b/configure @@ -1315,6 +1315,18 @@ done +############################################################################### +# +# Function to figure out how to turn off Objective C on MacOS X. +# (We have to do this to work around an Apple-specific gcc bug.) +# +############################################################################### + + + + + + ############################################################################### # # Function to figure out how to create directory trees. @@ -2425,6 +2437,32 @@ echo "${ECHO_T}Disabling C++ comments in ANSI C code." >&6 fi fi +if test -n "$GCC"; then + if test -n "$GCC"; then + echo "$as_me:$LINENO: checking whether gcc accepts -no-cpp-precomp" >&5 +echo $ECHO_N "checking whether gcc accepts -no-cpp-precomp... $ECHO_C" >&6 +if test "${ac_cv_gcc_accepts_no_cpp_precomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if ( ( gcc -E -no-cpp-precomp - /dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_no_cpp_precomp=no + else + ac_cv_gcc_accepts_no_cpp_precomp=yes + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_gcc_accepts_no_cpp_precomp" >&5 +echo "${ECHO_T}$ac_cv_gcc_accepts_no_cpp_precomp" >&6 + ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp" + fi + + if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then + echo "$as_me:$LINENO: result: Disabling Objective C extensions in ANSI C code." >&5 +echo "${ECHO_T}Disabling Objective C extensions in ANSI C code." >&6 + CC="$CC -no-cpp-precomp" + fi + fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -6077,6 +6115,16 @@ if test $ac_cv_lib_gen_regcmp = yes; then fi fi + + ;; + *-darwin*) + + # On MacOS X (10.x with "fink"), many things are under /sw/. + # + if test -d /sw/include ; then + X_CFLAGS="-I/sw/include $X_CFLAGS" + X_LIBS="-L/sw/lib $X_LIBS" + fi ;; esac echo "$as_me:$LINENO: checking for XPointer" >&5 @@ -11012,7 +11060,91 @@ _ACEOF if test "$have_kerberos5" = yes ; then # from Matt Knopp # (who got it from amu@mit.edu) - PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcrypt -lcom_err" + + PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err" + + # jwz: MacOS X uses -lkrb5, but not -lcrypt + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" +# ac_save_LIBS="$LIBS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + # note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + # note: $X_LIBS includes $x_libraries + LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS" + + echo "$as_me:$LINENO: checking for crypt in -lcrypt" >&5 +echo $ECHO_N "checking for crypt in -lcrypt... $ECHO_C" >&6 +if test "${ac_cv_lib_crypt_crypt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypt $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char crypt (); +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +crypt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_crypt_crypt=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_crypt_crypt=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_crypt_crypt" >&5 +echo "${ECHO_T}$ac_cv_lib_crypt_crypt" >&6 +if test $ac_cv_lib_crypt_crypt = yes; then + PASSWD_LIBS="$PASSWD_LIBS -lcrypt" +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" +# LIBS="$ac_save_LIBS" + + elif test "$have_kerberos" = yes ; then # from Tim Showalter for FreeBSD 4.2 PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err" @@ -12720,15 +12852,16 @@ fi echo "$as_me:$LINENO: result: $ac_cv_gtk_version_string" >&5 echo "${ECHO_T}$ac_cv_gtk_version_string" >&6 ac_gtk_version_string=$ac_cv_gtk_version_string + parse_gtk_version_string fi - parse_gtk_version_string - - if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002 - then - have_gtk=no - have_gnome=no - jurassic_gtk=yes + if test "$have_gtk" = yes; then + if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002 + then + have_gtk=no + have_gnome=no + jurassic_gtk=yes + fi fi if test "$have_gtk" = yes; then @@ -12768,7 +12901,7 @@ echo $ECHO_N "checking for Gnome capplet includes... $ECHO_C" >&6 if test "${ac_cv_gnome_config_cflags+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \ + if ( $gnome_config --cflags $gnome_config_libs 2>&1 | \ grep Unknown >/dev/null ) ; then ac_cv_gnome_config_cflags='' else @@ -12793,7 +12926,7 @@ echo $ECHO_N "checking for Gnome capplet libs... $ECHO_C" >&6 if test "${ac_cv_gnome_config_libs+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 | + if ( $gnome_config --libs $gnome_config_libs 2>&1 | grep Unknown >/dev/null ) ; then ac_cv_gnome_config_libs='' else @@ -14521,7 +14654,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat > conftest.$ac_ext < #ifndef MESA_MAJOR_VERSION @@ -14564,7 +14697,7 @@ EOF # M4 sucks!! mglv=`echo "$mglv" | sed -n \ - 's/^configure: *\([0-9][0-9]*\) \([0-9].*\)$/\1.\2/p'` + 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'` rm -f conftest.$ac_ext @@ -19236,6 +19369,11 @@ fi if test "$have_gl" = yes -a "$have_gle" = no ; then + + # nobody cares about this; don't print the warning unless it was + # requested and not found, or halfway-found. + if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then + if test "$with_gle_req" = yes ; then noteL 'Use of the GLE (GL Extrusion) library was requested, but' warn2 'it was not found (though the OpenGL library was found, and' @@ -19263,6 +19401,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then warn2 'GLE library at . For general' warn2 'OpenGL info, see .' + fi fi diff --git a/configure.in b/configure.in index 76ccf0f9..dc100ebc 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -# configure.in --- xscreensaver, Copyright (c) 1997-2002 Jamie Zawinski. +# configure.in --- xscreensaver, Copyright (c) 1997-2003 Jamie Zawinski. # AC_PREREQ(2.52) @@ -140,6 +140,38 @@ AC_DEFUN(AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE, ]) +############################################################################### +# +# Function to figure out how to turn off Objective C on MacOS X. +# (We have to do this to work around an Apple-specific gcc bug.) +# +############################################################################### + +AC_DEFUN(AC_GCC_ACCEPTS_NO_CPP_PRECOMP, + [if test -n "$GCC"; then + AC_CACHE_CHECK([whether gcc accepts -no-cpp-precomp], + ac_cv_gcc_accepts_no_cpp_precomp, + [if ( ( gcc -E -no-cpp-precomp - /dev/null ) 2>&1 | \ + grep unrecognized >/dev/null ); then + ac_cv_gcc_accepts_no_cpp_precomp=no + else + ac_cv_gcc_accepts_no_cpp_precomp=yes + fi]) + ac_gcc_accepts_no_cpp_precomp="$ac_cv_gcc_accepts_no_cpp_precomp" + fi +]) + +AC_DEFUN(AC_NO_OBJECTIVE_C, + [if test -n "$GCC"; then + AC_GCC_ACCEPTS_NO_CPP_PRECOMP + if test "$ac_gcc_accepts_no_cpp_precomp" = yes ; then + AC_MSG_RESULT(Disabling Objective C extensions in ANSI C code.) + CC="$CC -no-cpp-precomp" + fi + fi +]) + + ############################################################################### # # Function to figure out how to create directory trees. @@ -590,6 +622,16 @@ AC_DEFUN(AC_X_RANDOM_PATHS, # Some versions of Slowlaris Motif require -lgen. But not all. Why? AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"]) fi + + ;; + *-darwin*) + + # On MacOS X (10.x with "fink"), many things are under /sw/. + # + if test -d /sw/include ; then + X_CFLAGS="-I/sw/include $X_CFLAGS" + X_LIBS="-L/sw/lib $X_LIBS" + fi ;; esac]) @@ -743,6 +785,7 @@ AC_DEFUN(HANDLE_X_PATH_ARG, [ AC_CANONICAL_HOST AC_PROG_CC_ANSI AC_NO_CPLUSPLUS_COMMENTS_IN_C_CODE +AC_NO_OBJECTIVE_C AC_PROG_CPP AC_C_CONST AC_C_INLINE @@ -1535,7 +1578,12 @@ if test "$enable_locking" = yes -a "$with_kerberos" = yes; then if test "$have_kerberos5" = yes ; then # from Matt Knopp # (who got it from amu@mit.edu) - PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcrypt -lcom_err" + + PASSWD_LIBS="$PASSWD_LIBS -lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err" + + # jwz: MacOS X uses -lkrb5, but not -lcrypt + AC_CHECK_X_LIB(crypt, crypt, [PASSWD_LIBS="$PASSWD_LIBS -lcrypt"]) + elif test "$have_kerberos" = yes ; then # from Tim Showalter for FreeBSD 4.2 PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err" @@ -2023,15 +2071,16 @@ if test "$with_gtk" = yes; then AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string, [ac_cv_gtk_version_string=`$gtk_config --version`]) ac_gtk_version_string=$ac_cv_gtk_version_string + parse_gtk_version_string fi - parse_gtk_version_string - - if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002 - then - have_gtk=no - have_gnome=no - jurassic_gtk=yes + if test "$have_gtk" = yes; then + if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002 + then + have_gtk=no + have_gnome=no + jurassic_gtk=yes + fi fi if test "$have_gtk" = yes; then @@ -2054,7 +2103,7 @@ if test "$with_gtk" = yes; then gnome_config_libs="gtk capplet gnomeui gdk_pixbuf" AC_MSG_CHECKING(for Gnome capplet includes) AC_CACHE_VAL(ac_cv_gnome_config_cflags, - [if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \ + [if ( $gnome_config --cflags $gnome_config_libs 2>&1 | \ grep Unknown >/dev/null ) ; then ac_cv_gnome_config_cflags='' else @@ -2072,7 +2121,7 @@ if test "$with_gtk" = yes; then if test "$have_gnome" = yes -a "$have_gtk" = yes; then AC_MSG_CHECKING(for Gnome capplet libs) AC_CACHE_VAL(ac_cv_gnome_config_libs, - [if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 | + [if ( $gnome_config --libs $gnome_config_libs 2>&1 | grep Unknown >/dev/null ) ; then ac_cv_gnome_config_libs='' else @@ -2603,7 +2652,7 @@ EOF # M4 sucks!! changequote(X,Y) mglv=`echo "$mglv" | sed -n \ - 's/^configure: *\([0-9][0-9]*\) \([0-9].*\)$/\1.\2/p'` + 's/^configure: *\([0-9][0-9]*\) *\([0-9].*\)$/\1.\2/p'` changequote([,]) rm -f conftest.$ac_ext @@ -3834,6 +3883,11 @@ fi if test "$have_gl" = yes -a "$have_gle" = no ; then + + # nobody cares about this; don't print the warning unless it was + # requested and not found, or halfway-found. + if test "$with_gle_req" = yes -o "$gle_halfassed" = yes ; then + if test "$with_gle_req" = yes ; then noteL 'Use of the GLE (GL Extrusion) library was requested, but' warn2 'it was not found (though the OpenGL library was found, and' @@ -3861,6 +3915,7 @@ if test "$have_gl" = yes -a "$have_gle" = no ; then warn2 'GLE library at . For general' warn2 'OpenGL info, see .' + fi fi diff --git a/driver/Makefile.in b/driver/Makefile.in index 8dfbe6a3..c4d9c5d5 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -14,7 +14,8 @@ install_prefix = prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ -datadir = @datadir@ +#datadir = @datadir@ +datadir = $(GNOME_DATADIR) localedir = $(datadir)/locale mandir = @mandir@ mansuffix = 1 diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index 8431d144..00afdb06 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -4,8 +4,8 @@ ! a screen saver and locker for the X window system ! by Jamie Zawinski ! -! version 4.07 -! 03-Feb-2003 +! version 4.08 +! 18-Feb-2003 ! ! See "man xscreensaver" for more info. The latest version is always ! available at http://www.jwz.org/xscreensaver/ @@ -289,6 +289,7 @@ eruption -root \n\ popsquares -root \n\ barcode -root \n\ + piecewise -root \n\ color: bubbles -root \n\ - default-n: webcollage -root \n\ - default-n: "WebCollage (whacked)" \ @@ -333,12 +334,14 @@ @GL_KLUDGE@ GL: glsnake -root \n\ @GL_KLUDGE@ GL: boxed -root \n\ @GL_KLUDGE@ GL: glforestfire -root \n\ +- GL: glforestfire -root -rain \n\ @GL_KLUDGE@ GL: sballs -root \n\ @GL_KLUDGE@ GL: cubenetic -root \n\ @GL_KLUDGE@ GL: spheremonics -root \n\ @GL_KLUDGE@ GL: lavalite -root \n\ @GL_KLUDGE@ GL: queens -root \n\ @GL_KLUDGE@ GL: endgame -root \n\ +@GL_KLUDGE@ GL: atunnel -root \n\ - GL: glblur -root \n\ \ - xdaliclock -root -builtin3 -cycle \n\ diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 564aa5da..eb21a2f5 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -191,6 +191,7 @@ eruption -root \\n\ popsquares -root \\n\ barcode -root \\n\ + piecewise -root \\n\ color: bubbles -root \\n\ - default-n: webcollage -root \\n\ - default-n: \"WebCollage (whacked)\" \ @@ -235,12 +236,14 @@ GL: glsnake -root \\n\ GL: boxed -root \\n\ GL: glforestfire -root \\n\ +- GL: glforestfire -root -rain \\n\ GL: sballs -root \\n\ GL: cubenetic -root \\n\ GL: spheremonics -root \\n\ GL: lavalite -root \\n\ GL: queens -root \\n\ GL: endgame -root \\n\ + GL: atunnel -root \\n\ - GL: glblur -root \\n\ \ - xdaliclock -root -builtin3 -cycle \\n\ diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index a1d05ca8..159595b3 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -1,5 +1,5 @@ /* demo-Gtk.c --- implements the interactive demo-mode and options dialogs. - * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski + * xscreensaver, Copyright (c) 1993-2003 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 @@ -2345,6 +2345,15 @@ populate_prefs_page (state *s) { saver_preferences *p = &s->prefs; + Bool can_lock_p = True; + + /* Disable all the "lock" controls if locking support was not provided + at compile-time, or if running on MacOS. */ +# if defined(NO_LOCKING) || defined(__APPLE__) + can_lock_p = False; +# endif + + /* The file supports timeouts of less than a minute, but the GUI does not, so throttle the values to be at least one minute (since "0" is a bad rounding choice...) @@ -2444,8 +2453,9 @@ populate_prefs_page (state *s) /* Blanking and Locking */ - SENSITIZE ("lock_spinbutton", p->lock_p); - SENSITIZE ("lock_mlabel", p->lock_p); + SENSITIZE ("lock_button", can_lock_p); + SENSITIZE ("lock_spinbutton", can_lock_p && p->lock_p); + SENSITIZE ("lock_mlabel", can_lock_p && p->lock_p); /* DPMS */ @@ -3252,7 +3262,14 @@ get_best_gl_visual (state *s) sprintf (buf, "%s: running %s", blurb(), av[0]); perror (buf); } - exit (1); /* exits fork */ + + /* Note that one must use _exit() instead of exit() in procs forked + off of Gtk programs -- Gtk installs an atexit handler that has a + copy of the X connection (which we've already closed, for safety.) + If one uses exit() instead of _exit(), then one sometimes gets a + spurious "Gdk-ERROR: Fatal IO error on X server" error message. + */ + _exit (1); /* exits fork */ break; } default: @@ -3418,8 +3435,15 @@ launch_preview_subproc (state *s) exec_command (p->shell, new_cmd, p->nice_inferior); /* Don't bother printing an error message when we are unable to - exec subprocesses; we handle that by polling the pid later. */ - exit (1); /* exits child fork */ + exec subprocesses; we handle that by polling the pid later. + + Note that one must use _exit() instead of exit() in procs forked + off of Gtk programs -- Gtk installs an atexit handler that has a + copy of the X connection (which we've already closed, for safety.) + If one uses exit() instead of _exit(), then one sometimes gets a + spurious "Gdk-ERROR: Fatal IO error on X server" error message. + */ + _exit (1); /* exits child fork */ break; default: diff --git a/driver/passwd-kerberos.c b/driver/passwd-kerberos.c index ca3f13ea..1fbe2af9 100644 --- a/driver/passwd-kerberos.c +++ b/driver/passwd-kerberos.c @@ -1,6 +1,6 @@ /* kpasswd.c --- verify kerberos passwords. * written by Nat Lanza (magus@cs.cmu.edu) for - * xscreensaver, Copyright (c) 1993-1997, 1998, 2000 + * xscreensaver, Copyright (c) 1993-1997, 1998, 2000, 2003 * Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its @@ -27,7 +27,20 @@ #include #include -#ifdef HAVE_KERBEROS5 +/* I'm not sure if this is exactly the right test... + Might __APPLE__ be defined if this is apple hardware, but not + an Apple OS? + + Thanks to Jan Kujawa for the MacOS X code. + */ +#ifdef __APPLE__ +# define HAVE_DARWIN +#endif + + +#if defined(HAVE_DARWIN) +# include +#elif defined(HAVE_KERBEROS5) # include # include #else /* !HAVE_KERBEROS5 (meaning Kerberos 4) */ @@ -56,10 +69,14 @@ #define False 0 /* The user information we need to store */ -static char realm[REALM_SZ]; -static char name[ANAME_SZ]; -static char inst[INST_SZ]; -static char *tk_file; +#ifdef HAVE_DARWIN + static KLPrincipal princ; +#else /* !HAVE_DARWIN */ + static char realm[REALM_SZ]; + static char name[ANAME_SZ]; + static char inst[INST_SZ]; + static char *tk_file; +#endif /* !HAVE_DARWIN */ /* Called at startup to grab user, instance, and realm information @@ -83,6 +100,20 @@ static char *tk_file; Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p) { +# ifdef HAVE_DARWIN + + KLBoolean found; + return ((klNoErr == (KLCacheHasValidTickets (NULL, kerberosVersion_Any, + &found, &princ, NULL))) + && found); + +# else /* !HAVE_DARWIN */ + + /* Perhaps we should be doing it the Mac way (above) all the time? + The following code assumes Unix-style file-based Kerberos credentials + cache, which Mac OS X doesn't use. But is there any real reason to + do it this way at all, even on other Unixen? + */ int k_errno; memset(name, 0, sizeof(name)); @@ -120,6 +151,8 @@ kerberos_lock_init (int argc, char **argv, Bool verbose_p) /* success */ return True; + +# endif /* !HAVE_DARWIN */ } @@ -145,6 +178,15 @@ key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key) Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p) { +# ifdef HAVE_DARWIN + return (klNoErr == + KLAcquireNewInitialTicketsWithPassword (princ, NULL, + typed_passwd, NULL)); +# else /* !HAVE_DARWIN */ + + /* See comments in kerberos_lock_init -- should we do it the Mac Way + on all systems? + */ C_Block mitkey; Bool success; char *newtkfile; @@ -182,6 +224,8 @@ kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p) /* Did we verify successfully? */ return success; + +# endif /* !HAVE_DARWIN */ } #endif /* NO_LOCKING -- whole file */ diff --git a/driver/passwd.c b/driver/passwd.c index 9a9a4b88..fa7d4178 100644 --- a/driver/passwd.c +++ b/driver/passwd.c @@ -1,5 +1,5 @@ /* passwd.c --- verifying typed passwords with the OS. - * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski + * xscreensaver, Copyright (c) 1993-2003 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 @@ -153,7 +153,7 @@ passwd_valid_p (const char *typed_passwd, Bool verbose_p) "%s: authentication via %s passwords failed.\n", blurb(), methods[j].name); fprintf (stderr, - "%s: but authentication via %s passwords succeeded.\n", + "%s: authentication via %s passwords succeeded.\n", blurb(), methods[i].name); } diff --git a/driver/test-passwd.c b/driver/test-passwd.c index 9ef2cfe1..22ae01eb 100644 --- a/driver/test-passwd.c +++ b/driver/test-passwd.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1998, 2001 Jamie Zawinski +/* xscreensaver, Copyright (c) 1998, 2001, 2003 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 @@ -140,7 +140,7 @@ main (int argc, char **argv) hack_uid (si); - if (! lock_init (argc, argv, si->prefs.verbose_p)) + if (! lock_init (argc, argv, True)) { si->locking_disabled_p = True; si->nolock_reason = "error getting password"; @@ -171,7 +171,6 @@ main (int argc, char **argv) XtGetApplicationNameAndClass (si->dpy, &progname, &progclass); load_init_file (&si->prefs); - } p->verbose_p = True; diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man index 51bee28a..0ecf8336 100644 --- a/driver/xscreensaver-command.man +++ b/driver/xscreensaver-command.man @@ -11,7 +11,7 @@ .if n .sp 1 .if t .sp .5 .. -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver-command - control a running xscreensaver process .SH SYNOPSIS diff --git a/driver/xscreensaver-demo.man b/driver/xscreensaver-demo.man index 381786b9..b4a73a0d 100644 --- a/driver/xscreensaver-demo.man +++ b/driver/xscreensaver-demo.man @@ -11,7 +11,7 @@ .if n .sp 1 .if t .sp .5 .. -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver-demo - interactively control the background xscreensaver daemon .SH SYNOPSIS diff --git a/driver/xscreensaver-getimage-file.man b/driver/xscreensaver-getimage-file.man index f93fc3ab..5a67d6d9 100644 --- a/driver/xscreensaver-getimage-file.man +++ b/driver/xscreensaver-getimage-file.man @@ -1,4 +1,4 @@ -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver-getimage-file - put a randomly-selected image on the root window .SH SYNOPSIS diff --git a/driver/xscreensaver-getimage-video.man b/driver/xscreensaver-getimage-video.man index add058fa..7d81c2cf 100644 --- a/driver/xscreensaver-getimage-video.man +++ b/driver/xscreensaver-getimage-video.man @@ -1,4 +1,4 @@ -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver-getimage-video - put a video frame on the root window .SH SYNOPSIS diff --git a/driver/xscreensaver-getimage.man b/driver/xscreensaver-getimage.man index c70afeb4..c630decb 100644 --- a/driver/xscreensaver-getimage.man +++ b/driver/xscreensaver-getimage.man @@ -1,4 +1,4 @@ -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver-getimage - put some randomly-selected image on the root window .SH SYNOPSIS diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 57cc234d..bc20b12d 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -493,6 +493,37 @@ lock_initialization (saver_info *si, int *argc, char **argv) si->locking_disabled_p = True; si->nolock_reason = "running under GDM"; } + + /* If the server is XDarwin (MacOS X) then disable locking. + (X grabs only affect X programs, so you can use Command-Tab + to bring any other Mac program to the front, e.g., Terminal.) + */ + if (!si->locking_disabled_p) + { + int op = 0, event = 0, error = 0; + Bool macos_p = False; + +#ifdef __APPLE__ + /* Disable locking if *running* on Apple hardware, since we have no + reliable way to determine whether the server is running on MacOS. + Hopefully __APPLE__ means "MacOS" and not "Linux on Mac hardware" + but I'm not really sure about that. + */ + macos_p = True; +#endif + + if (!macos_p) + /* This extension exists on the Apple X11 server, but not + on earlier versions of the XDarwin server. */ + macos_p = XQueryExtension (si->dpy, "Apple-DRI", &op, &event, &error); + + if (macos_p) + { + si->locking_disabled_p = True; + si->nolock_reason = "Cannot lock securely on MacOS X"; + } + } + #endif /* NO_LOCKING */ } @@ -688,11 +719,17 @@ print_banner (saver_info *si) fprintf (stderr, "%s: in process %lu.\n", blurb(), (unsigned long) getpid()); } +} + +static void +print_lock_failure_banner (saver_info *si) +{ + saver_preferences *p = &si->prefs; /* If locking was not able to be initalized for some reason, explain why. (This has to be done after we've read the lock_p resource.) */ - if (p->lock_p && si->locking_disabled_p) + if (si->locking_disabled_p) { p->lock_p = False; fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(), @@ -707,6 +744,7 @@ print_banner (saver_info *si) "\t See the manual for details.\n", blurb()); } + } @@ -1250,6 +1288,7 @@ main (int argc, char **argv) exit (1); lock_initialization (si, &argc, argv); + print_lock_failure_banner (si); if (p->xsync_p) XSynchronize (si->dpy, True); @@ -1893,6 +1932,8 @@ analyze_display (saver_info *si) # endif }, { "XINERAMA", "Xinerama", True + }, { "Apple-DRI", "Apple-DRI (XDarwin)", + True }, }; diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man index 1fd6edbe..a6e1ef6c 100644 --- a/driver/xscreensaver.man +++ b/driver/xscreensaver.man @@ -11,7 +11,7 @@ .if n .sp 1 .if t .sp .5 .. -.TH XScreenSaver 1 "03-Feb-2003 (4.07)" "X Version 11" +.TH XScreenSaver 1 "18-Feb-2003 (4.08)" "X Version 11" .SH NAME xscreensaver - extensible screen saver framework, plus locking .SH SYNOPSIS @@ -57,6 +57,16 @@ The easiest way to configure \fIxscreensaver\fP is to simply run the program, and change the settings through the GUI. The rest of this manual page describes lower level ways of changing settings. +I'll repeat that because it's important: + +.RS 4 +The easy way to configure xscreensaver is to run the +.BR xscreensaver-demo (1) +program. You shouldn't need to know any of the stuff described +in \fIthis\fP manual unless you are trying to do something tricky, +like customize xscreensaver for site-wide use or something. +.RE + Options to \fIxscreensaver\fP are stored in one of two places: in a \fI.xscreensaver\fP file in your home directory; or in the X resource database. If the \fI.xscreensaver\fP file exists, it overrides any settings @@ -79,15 +89,11 @@ blanking or unblanking the screen, or picking a new graphics mode.) If you change a setting in your X resource database, or if you want xscreensaver to notice your changes immediately instead of the next time -it wakes up, then you will need to tell the running xscreensaver process -to re-initialize itself, like so: -.EX -xscreensaver-command -restart -.EE -Note that if you changed the \fI.Xdefaults\fP file, you might also need to run -.BR xrdb (1): +it wakes up, then you will need to reload your \fI.Xdefaults\fP file, +and then tell the running xscreensaver process to restart itself, like so: .EX xrdb < ~/.Xdefaults +xscreensaver-command -restart .EE If you want to set the system-wide defaults, then make your edits to the xscreensaver app-defaults file, which should have been installed @@ -210,12 +216,15 @@ See the description of the \fBprograms\fP resource, below. .RE .TP 8 .B installColormap\fP (class \fBBoolean\fP) -Install a private colormap while the screensaver is active, so that the -graphics hacks can get as many colors as possible. This is the -default. (This only applies when the screen's default visual is being -used, since non-default visuals get their own colormaps automatically.) -This can also be overridden on a per-hack basis: see the discussion of -the \fBdefault\-n\fP name in the section about the \fBprograms\fP resource. +On PseudoColor (8-bit) displays, install a private colormap while the +screensaver is active, so that the graphics hacks can get as many +colors as possible. This is the default. (This only applies when the +screen's default visual is being used, since non-default visuals get +their own colormaps automatically.) This can also be overridden on a +per-hack basis: see the discussion of the \fBdefault\-n\fP name in the +section about the \fBprograms\fP resource. + +This does nothing if you have a TrueColor (16-bit or deeper) display. .TP 8 .B verbose\fP (class \fBBoolean\fP) Whether to print diagnostics. Default false. @@ -236,12 +245,13 @@ display the web page indicated here in your web browser. .TP 8 .B loadURL\fP (class \fBLoadURL\fP) This is the shell command used to load a URL into your web browser. -The default setting will load it into Netscape if it is already running, -otherwise, will launch a new Netscape looking at the \fIhelpURL\fP. +The default setting will load it into Mozilla/Netscape if it is already +running, otherwise, will launch a new browser looking at the \fIhelpURL\fP. .TP 8 .B demoCommand\fP (class \fBDemoCommand\fP) This is the shell command run when the \fIDemo\fP button on the splash window -is pressed. It defaults to \fIxscreensaver\-demo\fP. +is pressed. It defaults to +.BR xscreensaver\-demo (1). .TP 8 .B prefsCommand\fP (class \fBPrefsCommand\fP) This is the shell command run when the \fIPrefs\fP button on the splash window @@ -345,12 +355,13 @@ do it for you! .TP 8 .B programs\fP (class \fBPrograms\fP) The graphics hacks which \fIxscreensaver\fP runs when the user is idle. -The value of this resource is a string, one \fIsh\fP-syntax command per line. -Each line must contain exactly one command: no semicolons, no ampersands. +The value of this resource is a multi-line string, one \fIsh\fP-syntax +command per line. Each line must contain exactly one command: no +semicolons, no ampersands. -When the screensaver starts up, one of these is selected at random, and -run. After the \fIcycle\fP period expires, it is killed, and another -is selected and run. +When the screensaver starts up, one of these is selected (according to +the \fBmode\fP setting), and run. After the \fIcycle\fP period +expires, it is killed, and another is selected and run. If a line begins with a dash (-) then that particular program is disabled: it won't be selected at random (though you can still select @@ -442,7 +453,7 @@ run on one, and hacks that only look good in color will show up on the other. .RE .PP .PP -Normally you won't need to change the following resources: +You shouldn't ever need to change the following resources: .PP .TP 8 .B pointerPollTime\fP (class \fBTime\fP) @@ -583,7 +594,7 @@ notice this (after a few minutes), and will not waste CPU by drawing graphics demos on a black screen. An attempt will also be made to explicitly power the monitor back up as soon as user activity is detected. -As of version 3.28, the \fI~/.xscreensaver\fP file controls the +As of version 3.28 (Feb 2001), the \fI~/.xscreensaver\fP file controls the configuration of your display's power management settings: if you have used .BR xset (1) @@ -739,10 +750,51 @@ while nobody is logged in, and kill it as soon as someone does log in. (The user will then be responsible for starting xscreensaver on their own, if they want.) +Another way to accomplish the same thing is to edit the +file \fI/etc/X11/gdm/gdm.conf\fP to include: +.EX +BackgroundProgram=xscreensaver -nosplash +RunBackgroundProgramAlways=true +.EE In this situation, the \fIxscreensaver\fP process will probably be running as user \fIgdm\fP instead of \fIroot\fP. You can configure the settings for this nobody-logged-in state (timeouts, DPMS, etc.) by editing the \fI~gdm/.xscreensaver\fP file. +.SH USING KDE (K DESKTOP ENVIRONMENT) +I understand that KDE has invented their own wrapper around xscreensaver, +that is inferior to +.BR xscreensaver-demo (1) +in any number of ways. I've never actually seen it, but I'm told that +this is the way you disable it: +.RS 4 +.TP 3 +\fB1: Switch off KDE's screen saver.\fP +Open the ``\fIControl Center\fP'' and +select the ``\fILook and Feel / Screensaver\fP'' page. +Turn off the ``\fIEnable Screensaver\fP'' checkbox. +.TP 3 +\fB2: Find your Autostart directory.\fP +Open the ``\fILook and Feel / Desktop / Paths\fP'' page, +and see what your ``Autostart'' directory is set to: it will +probably be \fI~/.kde3/Autostart/\fP or something similar. +.TP 3 +\fB3: Make xscreensaver be an Autostart program.\fP +Create a file in your autostart directory +called \fIxscreensaver.desktop\fP that contains the following five lines: +.EX +[Desktop Entry] +Exec=xscreensaver +Name=XScreensaver +Type=Application +X-KDE-StartupNotify=false +.EE +.RE +.PP +Now use xscreensaver normally, controlling it via the usual +.BR xscreensaver-demo (1) +and +.BR xscreensaver-command (1) +mechanisms. .SH USING CDE (COMMON DESKTOP ENVIRONMENT) The easiest way to use \fIxscreensaver\fP on a system with CDE is to simply switch off the built-in CDE screensaver, and use \fIxscreensaver\fP instead; @@ -850,133 +902,6 @@ This associates the VUE front panel ``Lock'' icon with the xscreensaver lock command. .RE .PP -.SH USING KDE (K DESKTOP ENVIRONMENT) -I understand that KDE has invented their own wrapper around xscreensaver, -that is inferior to -.BR xscreensaver-demo (1) -in any number of ways. I've never actually seen it, but I'm told that -this is the way you disable it: -.RS 4 -.TP 3 -\fB1: Switch off KDE's screen saver.\fP -Open the ``\fIControl Center\fP'' and -select the ``\fILook and Feel / Screensaver\fP'' page. -Turn off the ``\fIEnable Screensaver\fP'' checkbox. -.TP 3 -\fB2: Find your Autostart directory.\fP -Open the ``\fILook and Feel / Desktop / Paths\fP'' page, -and see what your ``Autostart'' directory is set to: it will -probably be \fI~/.kde3/Autostart/\fP or something similar. -.TP 3 -\fB3: Make xscreensaver be an Autostart program.\fP -Create a file in your autostart directory -called \fIxscreensaver.desktop\fP that contains the following five lines: -.EX -[Desktop Entry] -Exec=xscreensaver -Name=XScreensaver -Type=Application -X-KDE-StartupNotify=false -.EE -.RE -.PP -Now use xscreensaver normally, controlling it via the usual -.BR xscreensaver-demo (1) -and -.BR xscreensaver-command (1) -mechanisms. -.SH ADDING TO MENUS -The -.BR xscreensaver-command (1) -program is a perfect candidate for something to add to your window manager's -popup menus. If you use -.BR mwm (1), -.BR 4Dwm (1), -.BR twm (1), -or (probably) any of \fItwm\fP's many descendants, you can do it like this: -.RS 0 -.TP 3 -\fB1. Create ~/.mwmrc (or ~/.twmrc or ...)\fP -If you don't have a \fI~/.mwmrc\fP file (or, on SGIs, a \fI~/.4Dwmrc\fP file; -or, with twm, a \fI~/.twmrc\fP file) then create one by making a copy of -the \fI/usr/lib/X11/system.mwmrc\fP -file (or \fI/usr/lib/X11/twm/system.twmrc\fP, and so on.) -.TP 3 -\fB2. Add a menu definition.\fP -Something like this: -.EX -menu XScreenSaver -{ - "Blank Screen Now" !"sleep 3; xscreensaver-command -activate" - "Lock Screen Now" !"sleep 3; xscreensaver-command -lock" - "Screen Saver Demo" !"xscreensaver-demo" - "Screen Saver Preferences" !"xscreensaver-demo -prefs" - "Reinitialize Screen Saver" !"xscreensaver-command -restart" - "Kill Screen Saver" !"xscreensaver-command -exit" - "Launch Screen Saver" !"xscreensaver &" -} -.EE -.TP 3 -\fB3. Add the menu\fP -For -.BR mwm (1) -and -.BR 4Dwm (1), -find the section of the file that says \fIMenu DefaultRootMenu\fP. -For -.BR twm (1), -it will probably be \fImenu "defops"\fP. If you add a line somewhere -in that menu definition that reads -.EX - "XScreenSaver" f.menu XScreenSaver -.EE -then this will add an XScreenSaver sub-menu to your default root-window -popup menu. Alternately, you could just put the xscreensaver menu items -directly into the root menu. -.RE - -For Fvwm2, the process is similar: first create a \fI~/.fvwm2rc\fP file -if you don't already have one, by making a copy of -the \fI/etc/X11/fvwm2/system.fvwm2rc\fP file. Then, add a menu definition -to it: -.EX -AddToMenu XScreenSaver "XScreenSaver" Title -+ "Blank Screen Now" Exec xscreensaver-command -activate -+ "Lock Screen Now" Exec xscreensaver-command -lock -+ "Screen Saver Demo" Exec xscreensaver-command -demo -+ "Screen Saver Preferences" Exec xscreensaver-command -prefs -+ "Reinitialize Screen Saver" Exec xscreensaver-command -restart -+ "Kill Screen Saver" Exec xscreensaver-command -exit -+ "Launch Screen Saver" Exec xscreensaver -+ "Run Next Demo" Exec xscreensaver-command -next -+ "Run Previous Demo" Exec xscreensaver-command -prev - -# To put the XScreenSaver sub-menu at the end of the root menu: -AddToMenu RootMenu "XScreenSaver" Popup XScreenSaver -.EE -The Enlightenment window manager keeps each of its menus in a separate -file. So, you need to create a file -named \fI~/.enlightenment/xscreensaver.menu\fP with the contents: -.EX -"XScreenSaver Commands" - "Blank Screen Now" NULL exec "xscreensaver-command -activate" - "Lock Screen Now" NULL exec "xscreensaver-command -lock" - "Screen Saver Demo" NULL exec "xscreensaver-command -demo" - "Screen Saver Prefs" NULL exec "xscreensaver-command -prefs" - "Reinitialize Saver" NULL exec "xscreensaver-command -restart" - "Kill Screen Saver" NULL exec "xscreensaver-command -exit" - "Launch Screen Saver" NULL exec "xscreensaver" -.EE -then add -.EX - "XScreenSaver" NULL menu "xscreensaver.menu" -.EE -to \fI~/.enlightenment/file.menu\fP to put the XScreenSaver submenu on -your left-button root-window menu. - -As you see, every window manager does this stuff gratuitously differently, -just to make your life difficult. You are in a maze of twisty menu -configuration languages, all alike. .SH BUGS Bugs? There are no bugs. Ok, well, maybe. If you find one, please let me know. http://www.jwz.org/xscreensaver/bugs.html explains how to @@ -1039,11 +964,6 @@ in to the local machine to connect to the display.) You should be sure that this is an acceptable thing to do in your environment before doing it. See the ``\fIUsing XDM(1)\fP'' section, above, for more details. - -If anyone has suggestions on how xscreensaver could be made to work with -.BR xdm (1) -without first turning off \fI.Xauthority\fP-based access control, please -let me know. .TP 8 .B Passwords If you get an error message at startup like ``couldn't get password @@ -1061,7 +981,8 @@ with \fIconfigure\fP and recompile. If you change your password after xscreensaver has been launched, it will continue using your old password to unlock the screen until xscreensaver -is restarted. So, after you change your password, you'll have to do +is restarted. On some systems, it may accept \fIboth\fP your old and new +passwords. So, after you change your password, you'll have to do .EX xscreensaver-command -restart .EE @@ -1088,7 +1009,7 @@ configured correctly! .B Colormap lossage: TWM The \fBinstallColormap\fP option doesn't work very well with the .BR twm (1) -window manager and its descendants. +window manager and its descendants, on 8-bit screens. There is a race condition between the screensaver and this window manager, which can result in the screensaver's colormap not getting installed @@ -1141,36 +1062,21 @@ advantage of them. .B Machine Load Although this program ``nices'' the subprocesses that it starts, graphics-intensive subprograms can still overload the machine by causing -the X server process itself (which is not ``niced'') to suck a lot of -cycles. Care should be taken to slow down programs intended for use as -screensavers by inserting strategic calls to -.BR sleep (3) -or -.BR usleep (3) -(or making liberal use of any \fI\-delay\fP options which the programs -may provide.) - -Note that the OpenGL-based graphics demos are real pigs on machines that -don't have texture hardware. - -Also, an active screensaver will cause your X server to be pretty much -permanently swapped in; but the same is true of any program that draws -periodically, like -.BR xclock (1) -or -.BR xload (1). -.TP 8 -.B Latency and Responsiveness -If the subprocess is drawing too quickly and the connection to the X -server is a slow one (such as an X terminal running over a phone line) then -the screensaver might not turn off right away when the user becomes active -again (the -.BR ico (1) -demo has this problem if being run in full-speed mode). This can be -alleviated by inserting strategic calls to -.BR XSync (3) -in code intended for use as a screensaver. This prevents too much graphics -activity from being buffered up. +the X server process itself (which is not ``niced'') to consume many +cycles. Care has been taken in all the modules shipped with xscreensaver +to sleep periodically, and not run full tilt, so as not to cause +appreciable load. + +However, if you are running the OpenGL-based screen savers on a machine +that does not have a video card with 3D acceleration, they \fIwill\fP +make your machine slow, despite +.BR nice (1). + +Your options are: don't use the OpenGL display modes; or, collect the +spare change hidden under the cushions of your couch, and use it to +buy a video card manufactured after 1998. (It doesn't even need to be +\fIfast\fP 3D hardware: the problem will be fixed if there is any +3D hardware \fIat all.\fP) .TP 8 .B XFree86's Magic Keystrokes The XFree86 X server traps certain magic keystrokes before client programs ever @@ -1186,24 +1092,6 @@ your \fI/etc/X11/XF86Config\fP file. To globally disable VT switching, you can set the \fIDontVTSwitch\fP flag. See the .BR XF86Config (5) manual for details. - -Some Linux systems come with a VT_LOCKSWITCH ioctl, that one could -theoretically use to prevent VT-switching while the screen is locked; -but unfortunately, this ioctl can only be used by root, which means -that xscreensaver can't use it (since xscreensaver disavows its privileges -shortly after startup, for security reasons.) - -Any suggestions for other solutions to this problem are welcome. -.TP 8 -.B XView Clients -Apparently there are some problems with XView programs getting confused -and thinking that the screensaver window is the real root window even when -the screensaver is not active: ClientMessages intended for the window manager -are sent to the screensaver window instead. This could be solved by making -xscreensaver forward all unrecognised ClientMessages to the real root window, -but there may be other problems as well. If anyone has any insight on the -cause of this problem, please let me know. (XView is an X11 toolkit that -implements the (quite abominable) Sun OpenLook look-and-feel.) .TP 8 .B MIT Extension and Fading The \fBMIT-SCREEN-SAVER\fP extension is junk. Don't use it. @@ -1220,42 +1108,6 @@ It sure would be nice if someone would implement the \fBSGI SCREEN_SAVER\fP extension in XFree86; it's dead simple, and works far better than the overengineered and broken \fBMIT-SCREEN-SAVER\fP extension. .TP 8 -.B SGI Power Saver -If you're running Irix 6.3, you might find that your monitor is powering down -after an hour or two even if you've told it not to. This is fixed by SGI -patches 2447 and 2537. - -If you're running Irix 6.5, this bug is back. I don't know a fix. -.TP 8 -.B MesaGL and Voodoo Cards -If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will -run the GL-based graphics demos in such a way that they will not take -advantage of the 3D acceleration hardware. The solution is to change -the \fBprograms\fP entries for the GL hacks from this: -.EX - gears -root \\n\\ -.EE -to this: -.EX - MESA_GLX_FX=fullscreen gears \\n\\ -.EE -That is, make sure that \fB$MESA_GLX_FX\fP is set to \fIfullscreen\fP, and -don't tell the program to draw on the root window. This may seem strange, -but the setup used by Mesa and these kinds of cards \fIis\fP strange! - -For those who don't know, these cards work by sitting between your normal -video card and the monitor, and seizing control of the monitor when it's -time to do 3D. But this means that accelerated 3D only happens in full-screen -mode (you can't do it in a window, and you can't see the output of 3D and 2D -programs simultaniously), and that 3D will probably drive your monitor at a -lower resolution, as well. It's bizarre. - -This probably isn't ever necessary on more modern cards; I'm not sure. - -If you find that GL programs only work properly when run as root, and not -as normal users, then the problem is that your \fI/dev/3dfx\fP file is not -configured properly. Check the Linux 3Dfx FAQ. -.TP 8 .B Keyboard LEDs If \fIprocInterrupts\fP is on (which is the default on Linux systems) and you're using some program that toggles the state of your keyboard LEDs, @@ -1301,29 +1153,42 @@ The latest version of xscreensaver, an online version of this manual, and a FAQ can always be found at http://www.jwz.org/xscreensaver/ .SH SEE ALSO .BR X (1), +.BR Xsecurity (1), +.BR xauth (1), .BR xscreensaver\-demo (1), .BR xscreensaver\-command (1), .BR xscreensaver\-gl\-helper (1), +.BR xscreensaver\-getimage (1), .BR xdm (1), +.BR gdm (1), .BR xset (1), -.BR Xsecurity (1), -.BR xauth (1), .BR xhost (1). +.BR anemone (1), .BR ant (1), +.BR apollonian (1), .BR atlantis (1), .BR attraction (1), +.BR barcode (1), +.BR blaster (1), .BR blitspin (1), .BR bouboule (1), +.BR boxed (1), .BR braid (1), .BR bsod (1), .BR bubble3d (1), .BR bubbles (1), +.BR bumps (1), .BR cage (1), +.BR ccurve (1), +.BR circuit (1), .BR compass (1), .BR coral (1), +.BR cosmos (1), .BR critical (1), .BR crystal (1), +.BR cubenetic (1), .BR cynosure (1), +.BR dangerball (1), .BR decayscreen (1), .BR deco (1), .BR deluxe (1), @@ -1331,43 +1196,66 @@ and a FAQ can always be found at http://www.jwz.org/xscreensaver/ .BR discrete (1), .BR distort (1), .BR drift (1), +.BR electricsheep (1), +.BR endgame (1), +.BR engine (1), .BR epicycle (1), +.BR eruption (1),* +.BR euler2d (1), +.BR extrusion (1), .BR fadeplot (1), .BR flag (1), .BR flame (1), +.BR flipscreen3d (1), .BR flow (1), +.BR fluidballs (1), +.BR flurry (1), .BR forest (1), .BR galaxy (1), .BR gears (1), +.BR gflux (1), +.BR glblur (1), +.BR glforestfire (1), .BR glplanet (1), +.BR glsnake (1), +.BR gltext (1), +.BR goban (1), .BR goop (1), .BR grav (1), .BR greynetic (1), +.BR halftone (1), .BR halo (1), .BR helix (1), .BR hopalong (1), +.BR hyperball (1), .BR hypercube (1), .BR ifs (1), .BR imsmap (1), .BR interference (1), .BR jigsaw (1), +.BR juggle (1), .BR julia (1), .BR kaleidescope (1), .BR kumppa (1), .BR lament (1), .BR laser (1), +.BR lavalite (1), .BR lightning (1), .BR lisa (1), .BR lissie (1), .BR lmorph (1), .BR loop (1), .BR maze (1), +.BR menger (1), +.BR metaballs (1), .BR moebius (1), .BR moire (1), .BR moire2 (1), +.BR molecule (1), .BR morph3d (1), .BR mountain (1), .BR munch (1), +.BR nerverot (1), .BR noseguy (1), .BR pedal (1), .BR penetrate (1), @@ -1375,57 +1263,74 @@ and a FAQ can always be found at http://www.jwz.org/xscreensaver/ .BR petri (1), .BR phosphor (1), .BR pipes (1), +.BR polyominoes (1), +.BR popsquares (1), .BR pulsar (1), .BR pyro (1), .BR qix (1), +.BR queens (1), .BR rd-bomb (1), +.BR ripples (1), .BR rocks (1), .BR rorschach (1), .BR rotor (1), +.BR rotzoomer (1), .BR rubik (1), +.BR sballs (1), +.BR shadebobs (1), .BR sierpinski (1), +.BR sierpinski3d (1), .BR slidescreen (1), .BR slip (1), .BR sonar (1), +.BR speedmine (1), .BR sphere (1), +.BR sphereEversion (1), +.BR spheremonics (1), .BR spiral (1), .BR spotlight (1), .BR sproingies (1), .BR squiral (1), +.BR ssystem (1), .BR stairs (1), .BR starfish (1), +.BR starwars (1), +.BR stonerview (1), .BR strange (1), .BR superquadrics (1), .BR swirl (1), .BR t3d (1), +.BR thornbird (1), .BR triangle (1), .BR truchet (1), +.BR twang (1), +.BR vermiculate (1), +.BR vidwhacker (1), .BR vines (1), .BR wander (1), +.BR webcollage (1), +.BR whirlwindwarp (1), +.BR whirlygig (1), .BR worm (1), +.BR xaos (1), +.BR xdaliclock (1), +.BR xearth (1), +.BR xfishtank (1), .BR xflame (1), .BR xjack (1), .BR xlyap (1), .BR xmatrix (1), -.BR bongo (1), -.BR ico (1), -.BR xaos (1), -.BR xbouncebits (1), -.BR xcthugha (1), -.BR xdaliclock (1), -.BR xfishtank (1), .BR xmountains (1), -.BR xsplinefun (1), -.BR xswarm (1), -.BR xtacy (1), -.BR xv (1), -.BR chbg (1), -.BR xwave (1). +.BR xrayswarm (1), +.BR xsnow (1), +.BR xspirograph (1), +.BR xteevee (1), +.BR zoom (1) .SH COPYRIGHT Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -2000, 2001, 2002 by 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 the above +2000, 2001, 2002, 2003 by 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 the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. No representations are made about the suitability of this software for @@ -1448,8 +1353,6 @@ locking-disabled diagnostics. Thanks to Patrick Moreau for the VMS port. -Thanks to Mark Bowyer for figuring out how to hook it up to CDE. - Thanks to Nat Lanza for the Kerberos support. Thanks to Bill Nottingham for the initial PAM support. diff --git a/hacks/Makefile.in b/hacks/Makefile.in index 691e6b3b..770db831 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -97,7 +97,7 @@ SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \ xpm-pixmap.c webcollage-helper.c twang.c apollonian.c \ euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \ anemone.c halftone.c metaballs.c eruption.c popsquares.c \ - barcode.c + barcode.c piecewise.c SCRIPTS = vidwhacker webcollage OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ @@ -122,7 +122,7 @@ OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ xpm-pixmap.o webcollage-helper.o twang.o apollonian.o \ euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \ anemone.o halftone.o metaballs.o eruption.o popsquares.o \ - barcode.o + barcode.o piecewise.o NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ drift flag flame forest vines galaxy grav greynetic halo \ @@ -139,7 +139,7 @@ NEXES = attraction blitspin bouboule braid bubbles decayscreen deco \ nerverot xrayswarm hyperball zoom whirlwindwarp rotzoomer \ whirlygig speedmine vermiculate twang apollonian euler2d \ juggle polyominoes thornbird fluidballs anemone halftone \ - metaballs eruption popsquares barcode \ + metaballs eruption popsquares barcode piecewise \ @JPEG_EXES@ SEXES = sonar JPEG_EXES = webcollage-helper @@ -180,7 +180,8 @@ MEN = anemone.man ant.man apollonian.man attraction.man \ wander.man webcollage.man whirlwindwarp.man whirlygig.man \ worm.man xflame.man xjack.man xlyap.man xmatrix.man \ xrayswarm.man xspirograph.man xsublim.man xteevee.man \ - zoom.man halftone.man eruption.man metaballs.man barcode.man + zoom.man halftone.man eruption.man metaballs.man \ + barcode.man piecewise.man STAR = * EXTRAS = README Makefile.in xlock_23.h xml2man.pl .gdbinit \ config/README \ @@ -741,6 +742,9 @@ popsquares: popsquares.o $(HACK_OBJS) $(DBE) $(COL) barcode: barcode.o $(HACK_OBJS) $(HSV) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HSV) $(HACK_LIBS) +piecewise: piecewise.o $(HACK_OBJS) $(COL) $(DBE) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS) + # The rules for those hacks which follow the `xlockmore' API. # @@ -1174,6 +1178,8 @@ petri.o: ../config.h petri.o: $(srcdir)/screenhack.h phosphor.o: ../config.h phosphor.o: $(srcdir)/screenhack.h +piecewise.o: ../config.h +piecewise.o: $(srcdir)/screenhack.h polyominoes.o: ../config.h polyominoes.o: $(srcdir)/screenhack.h polyominoes.o: $(srcdir)/xlockmoreI.h diff --git a/hacks/barcode.c b/hacks/barcode.c index 218e3a1d..f6b19eb8 100644 --- a/hacks/barcode.c +++ b/hacks/barcode.c @@ -21,6 +21,9 @@ #include "screenhack.h" #include +#include +#include +#include /* parameters that are user configurable */ @@ -28,9 +31,6 @@ /* delay (usec) between iterations */ static int delay; -static int scroll_p; - - /* non-user-modifiable immutable definitions */ @@ -42,7 +42,7 @@ static int scroll_p; #define BARCODE_WIDTH (164) #define BARCODE_HEIGHT (69) -#define MAX_MAG (6) +#define MAX_MAG (7) /* width and height of the window */ static int windowWidth; @@ -55,6 +55,8 @@ static Screen *screen; /* the screen to draw on */ static Colormap cmap; /* the colormap of the window */ static GC theGC; /* GC for drawing */ +unsigned long fg_pixel; +static Bool button_down_p; @@ -91,247 +93,281 @@ static int barcode_max; /* the maximum number of active barcodes */ static XImage *theImage; /* ginormo image for drawing */ static Bitmap *theBitmap; /* ginormo bitmap for drawing */ +static enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode; + /* a bunch of words */ static char *words[] = { - "abdomen", - "abeyance", - "abhorrent", - "abrasive", - "abstract", - "acid", - "addiction", - "alertness", - "Algeria", - "anxiety", - "aorta", - "argyle socks", - "attrition", - "bamboo", - "bangle", - "bankruptcy", - "baptism", - "beer", - "bellicose", - "bells", - "belly", - "bread", - "bubba", - "burrito", - "California", - "capybara", - "cardinality", - "caribou", - "carnage", - "chocolate", - "constriction", - "contrition", - "corpse", - "cowboy", - "cozy", - "crabapple", - "craziness", - "Death", - "Decker", - "decoded", - "decoy", - "defenestration", - "dependency", - "despair", - "desperation", - "disease", - "doberman", - "dreams", - "drench", - "drugs", - "easy", - "ebony", - "elliptic", - "eloquence", - "emergency", - "eureka", - "excommunicate", - "fat", - "fatherland", - "Faust", - "fear", - "fever", - "flatulence", - "fluff", - "fnord", - "freedom", - "fruit", - "fruit", - "gauche", - "gawk", - "gaze", - "gerbils", - "GOD", - "goggles", - "goobers", - "gorilla", - "halibut", - "handmaid", - "hapless", - "happiness", - "hate", - "helplessness", - "hermaphrodite", - "Hindi", - "hope", - "hysteria", - "icepick", - "ignorance", - "importance", - "impossibility", - "inkling", - "insurrection", - "intoxicant", - "ire", - "irritant", - "jade", - "jaundice", - "Joyce", - "kaput", - "kitchenette", - "kiwi", - "lathe", - "lattice", - "lemming", - "liquidation", - "love", - "lozenge", - "magazine", - "magnesium", - "malfunction", - "marmot", - "marshmallow", - "merit", - "mescaline", - "milk", - "mischief", - "mistrust", - "money", - "monkey", - "monkeybutter", - "multiple", - "nature", - "neuron", - "noise", - "nomenclature", - "nutria", - "obey", - "ocelot", - "offspring", - "overseer", - "pain", - "pajamas", - "passenger", - "passion", - "Passover", - "Prozac", - "peace", - "penance", - "persimmon", - "petticoat", - "pharmacist", - "pitchfork", - "plague", - "Poindexter", - "precept", - "prison", - "prophecy", - "quadratic", - "quagmire", - "quarantine", - "quartz", - "rabies", - "radish", - "rage", - "readout", - "reality", - "reject", - "rejection", - "respect", - "revolution", - "roadrunner", - "rule", - "sanguine", - "savor", - "scab", - "scalar", - "Scandinavia", - "security", - "sediment", - "sickness", - "silicone", - "slack", - "slander", - "slavery", - "sledgehammer", - "smelly socks", - "sorrow", - "stamen", - "standardization", - "subversion", - "suffering", - "surrender", - "surveilance", - "synthesis", - "tenant", - "tendril", - "terror", - "terrorism", - "terrorist", - "the unknown", - "toast", - "topography", - "truism", - "turgid", - "underbrush", - "underling", - "unguent", - "unusual", - "unworthy", - "uplink", - "urge", - "valor", - "variance", - "vastness", - "vaudeville", - "vegetarian", - "venom", - "verifiability", - "viagra", - "vibrator", - "victim", - "vignette", - "villainy", - "W.A.S.T.E.", - "wagon", - "waiver", - "warehouse", - "waste", - "waveform", - "whiffle ball", - "whorl", - "windmill", - "wistful", - "worm", - "worship", - "worship", - "Xanax", - "Xerxes", - "Xhosa", - "xylophone", - "yellow", - "yesterday", - "your nose", - "Zanzibar", - "zeal", - "zebra", - "zest", - "zinc" + "abdomen", + "abeyance", + "abhorrence", + "abrasion", + "abstraction", + "acid", + "addiction", + "alertness", + "Algeria", + "anxiety", + "aorta", + "argyle socks", + "attrition", + "axis of evil", + "bamboo", + "bangle", + "bankruptcy", + "baptism", + "beer", + "bellicosity", + "bells", + "belly", + "bliss", + "bogosity", + "boobies", + "boobs", + "booty", + "bread", + "bubba", + "burrito", + "California", + "capybara", + "cardinality", + "caribou", + "carnage", + "children", + "chocolate", + "CLONE", + "cock", + "constriction", + "contrition", + "cop", + "corpse", + "cowboy", + "crabapple", + "craziness", + "cthulhu", + "Death", + "decepticon", + "deception", + "Decker", + "decoder", + "decoy", + "defenestration", + "democracy", + "dependency", + "despair", + "desperation", + "disease", + "disease", + "doberman", + "DOOM", + "dreams", + "dreams", + "drugs", + "easy", + "ebony", + "election", + "eloquence", + "emergency", + "eureka", + "excommunication", + "fat", + "fatherland", + "Faust", + "fear", + "fever", + "filth", + "flatulence", + "fluff", + "fnord", + "freedom", + "fruit", + "fruit", + "futility", + "gerbils", + "GOD", + "goggles", + "goobers", + "gorilla", + "halibut", + "handmaid", + "happiness", + "hate", + "helplessness", + "hemorrhoid", + "hermaphrodite", + "heroin", + "heroine", + "hope", + "hysteria", + "icepick", + "identity", + "ignorance", + "importance", + "individuality", + "inkling", + "insurrection", + "intoxicant", + "ire", + "irritant", + "jade", + "jaundice", + "Joyce", + "kidney stone", + "kitchenette", + "kiwi", + "lathe", + "lattice", + "lawyer", + "lemming", + "liquidation", + "lobbyist", + "love", + "lozenge", + "magazine", + "magnesium", + "malfunction", + "marmot", + "marshmallow", + "merit", + "merkin", + "mescaline", + "milk", + "mischief", + "mistrust", + "money", + "monkey", + "monkeybutter", + "nationalism", + "nature", + "neuron", + "noise", + "nomenclature", + "nutria", + "OBEY", + "ocelot", + "offspring", + "overseer", + "pain", + "pajamas", + "passenger", + "passion", + "Passover", + "peace", + "penance", + "persimmon", + "petticoat", + "pharmacist", + "PhD", + "pitchfork", + "plague", + "Poindexter", + "politician", + "pony", + "presidency", + "prison", + "prophecy", + "Prozac", + "punishment", + "punk rock", + "punk", + "pussy", + "quagmire", + "quarantine", + "quartz", + "rabies", + "radish", + "rage", + "readout", + "reality", + "rectum", + "reject", + "rejection", + "respect", + "revolution", + "roadrunner", + "rule", + "savor", + "scab", + "scalar", + "Scandinavia", + "schadenfreude", + "security", + "sediment", + "self worth", + "sickness", + "silicone", + "slack", + "slander", + "slavery", + "sledgehammer", + "smegma", + "smelly socks", + "sorrow", + "space program", + "stamen", + "standardization", + "stench", + "subculture", + "subversion", + "suffering", + "surrender", + "surveillance", + "synthesis", + "television", + "tenant", + "tendril", + "terror", + "terrorism", + "terrorist", + "the impossible", + "the unknown", + "toast", + "topography", + "truism", + "turgid", + "underbrush", + "underling", + "unguent", + "unusual", + "uplink", + "urge", + "valor", + "variance", + "vaudeville", + "vector", + "vegetarian", + "venom", + "verifiability", + "viagra", + "vibrator", + "victim", + "vignette", + "villainy", + "W.A.S.T.E.", + "wagon", + "waiver", + "warehouse", + "waste", + "waveform", + "whiffle ball", + "whorl", + "windmill", + "words", + "worm", + "worship", + "worship", + "Xanax", + "Xerxes", + "Xhosa", + "xylophone", + "yellow", + "yesterday", + "your nose", + "Zanzibar", + "zeal", + "zebra", + "zest", + "zinc" }; #define WORD_COUNT (sizeof(words) / sizeof(char *)) @@ -785,10 +821,10 @@ int charToDigit (char c) * used in place of any non-digit character */ void drawDigitChar (Bitmap *b, int x, int y, char c) { + if (mode != BC_CLOCK24 && + mode != BC_CLOCK12) if ((c < '0') || (c > '9')) - { - c = '0'; - } + c = '0'; bitmapDrawChar5x8 (b, x, y, c); } @@ -881,7 +917,8 @@ void drawUpcEanSupplementalBars (Bitmap *upcBitmap, char *digits, } default: { - printf("Bad supplement\n"); + fprintf (stderr, "%s: bad supplement (%d digits)\n", + progname, len); exit(1); break; } @@ -1004,27 +1041,46 @@ void drawUpcEBars (Bitmap *upcBitmap, char *digits, int x, int y, int i; int parityPattern = upcELastDigit[charToDigit(digits[7])]; + int clockp = (mode == BC_CLOCK12 || mode == BC_CLOCK24); + if (digits[0] == '1') { parityPattern = ~parityPattern; } /* header */ - bitmapVlin (upcBitmap, x, y, guardY2); + bitmapVlin (upcBitmap, x, y, guardY2); bitmapVlin (upcBitmap, x + 2, y, guardY2); /* trailer */ - bitmapVlin (upcBitmap, x + 46, y, guardY2); - bitmapVlin (upcBitmap, x + 48, y, guardY2); - bitmapVlin (upcBitmap, x + 50, y, guardY2); + bitmapVlin (upcBitmap, x + 46 + (clockp?8:0), y, guardY2); + bitmapVlin (upcBitmap, x + 48 + (clockp?8:0), y, guardY2); + bitmapVlin (upcBitmap, x + 50 + (clockp?8:0), y, guardY2); + + /* clock kludge -- this draws an extra set of dividers after + digits 2 and 4. This makes this *not* be a valid bar code, + but, it looks pretty for the clock display. + */ + if (clockp) + { + bitmapVlin (upcBitmap, x + 18, y, guardY2); + bitmapVlin (upcBitmap, x + 18 + 2, y, guardY2); + + bitmapVlin (upcBitmap, x + 36, y, guardY2); + bitmapVlin (upcBitmap, x + 36 + 2, y, guardY2); + } for (i = 0; i < 6; i++) { UpcSet lset = (parityPattern & (1 << (5 - i))) ? UPC_LEFT_B : UPC_LEFT_A; - + int off = (clockp + ? (i < 2 ? 0 : + i < 4 ? 4 : /* extra spacing for clock bars */ + 8) + : 0); drawUpcEanDigit (upcBitmap, - x + 3 + i*7, + x + 3 + i*7 + off, y, barY2, digits[i + 1], @@ -1381,7 +1437,8 @@ void processUpcEan (char *str, Bitmap *dest) } else { - printf ("Invalid supplement (must be 2 or 5 digits)\n"); + fprintf (stderr, "%s: invalid supplement (must be 2 or 5 digits)\n", + progname); exit (1); } @@ -1414,7 +1471,8 @@ void processUpcEan (char *str, Bitmap *dest) } default: { - printf("Bad barcode\n"); + fprintf (stderr, "%s: bad barcode (%d digits)\n", + progname, digitCount); exit(1); } } @@ -1464,6 +1522,7 @@ static void setup (void) display, xgwa.colormap); gcv.foreground = get_pixel_resource ("foreground", "Foreground", display, xgwa.colormap); + fg_pixel = gcv.foreground; theGC = XCreateGC (display, window, GCForeground|GCBackground, &gcv); theBitmap = makeBitmap(BARCODE_WIDTH * MAX_MAG, BARCODE_HEIGHT * MAX_MAG); @@ -1687,6 +1746,100 @@ static void updateGrid (void) } +/* update the model for one iteration. + This one draws a clock. By jwz. */ +static void updateClock (void) +{ + Barcode *b = &barcodes[0]; + int BW = 76 /* BARCODE_WIDTH */; + int BH = BARCODE_HEIGHT; + int mag_x, mag_y; + int i; + time_t now = time ((time_t *) 0); + struct tm *tm = localtime (&now); + XWindowAttributes xgwa; + int ow = windowWidth; + int oh = windowHeight; + + XGetWindowAttributes (display, window, &xgwa); + windowWidth = xgwa.width; + windowHeight = xgwa.height; + + mag_x = windowWidth / BW; + mag_y = windowHeight / BH; + + barcode_count = 1; + + b->mag = (mag_x < mag_y ? mag_x : mag_y); + + if (b->mag > MAX_MAG) b->mag = MAX_MAG; + if (b->mag < 1) b->mag = 1; + + b->x = (windowWidth - (b->mag * BW )) / 2; + b->y = (windowHeight - (b->mag * (BH + 9))) / 2; + b->pixel = fg_pixel; + + if (!button_down_p) + sprintf (b->code, "0%02d%02d%02d?:", + (mode == BC_CLOCK24 + ? tm->tm_hour + : (tm->tm_hour > 12 + ? tm->tm_hour - 12 + : (tm->tm_hour == 0 + ? 12 + : tm->tm_hour))), + tm->tm_min, + tm->tm_sec); + else + sprintf (b->code, "0%02d%02d%02d?:", + tm->tm_year % 100, tm->tm_mon+1, tm->tm_mday); + + { + int vstart = 9; + int hh = BH + vstart; + char expandedDigits[13]; + + expandedDigits[0] = '\0'; + + expandToUpcADigits (b->code, expandedDigits); + if (expandedDigits[0] != '\0') + b->code[7] = expandedDigits[11]; + + bitmapClear (theBitmap); + drawUpcEBars (theBitmap, b->code, 6, 9, 59, 65); + for (i = 0; i < 6; i++) + { + int off = (i < 2 ? 0 : + i < 4 ? 4 : + 8); + drawDigitChar (theBitmap, 11 + i*7 + off, hh - 16, b->code[i+1]); + } + + if (!button_down_p) + { +#if 0 + char *days[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; + char *s = days[tm->tm_wday]; + bitmapDrawString5x8 (theBitmap, (BW - strlen (s)*5) / 2, 0, s); +#endif + drawDigitChar (theBitmap, 0, hh - 23, (tm->tm_hour < 12 ? 'A' : 'P')); + drawDigitChar (theBitmap, 68, hh - 23, 'M'); + } + else + { + char s[20]; + sprintf (s, "%03d", tm->tm_yday); + bitmapDrawString5x8 (theBitmap, (BW - strlen (s)*5) / 2, 0, s); + } + } + + bitmapScale (b->bitmap, theBitmap, b->mag); + + if (ow != windowWidth || oh != windowHeight) + XClearWindow (display, window); +} + + /* render and display the current model */ static void renderFrame (void) @@ -1715,14 +1868,35 @@ static void renderFrame (void) /* do one iteration */ static void oneIteration (void) { - if (scroll_p) + if (mode == BC_SCROLL) scrollModel (); - else + else if (mode == BC_GRID) updateGrid (); + else if (mode == BC_CLOCK12 || mode == BC_CLOCK24) + updateClock (); + else + abort(); + renderFrame (); } +static void barcode_handle_events (Display *dpy) +{ + int clockp = (mode == BC_CLOCK12 || mode == BC_CLOCK24); + while (XPending (dpy)) + { + XEvent event; + XNextEvent (dpy, &event); + if (clockp && event.xany.type == ButtonPress) + button_down_p = True; + else if (clockp && event.xany.type == ButtonRelease) + button_down_p = False; + else + screenhack_handle_event (dpy, &event); + } +} + /* main and options and stuff */ @@ -1730,13 +1904,18 @@ char *progclass = "Barcode"; char *defaults [] = { ".background: black", - ".foreground: white", + ".foreground: green", "*delay: 10000", 0 }; XrmOptionDescRec options [] = { { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-scroll", ".mode", XrmoptionNoArg, "scroll" }, + { "-grid", ".mode", XrmoptionNoArg, "grid" }, + { "-clock", ".mode", XrmoptionNoArg, "clock" }, + { "-clock12", ".mode", XrmoptionNoArg, "clock12" }, + { "-clock24", ".mode", XrmoptionNoArg, "clock24" }, { 0, 0, 0, 0 } }; @@ -1744,15 +1923,34 @@ XrmOptionDescRec options [] = { static void initParams (void) { int problems = 0; + char *s; delay = get_integer_resource ("delay", "Delay"); if (delay < 0) { - fprintf (stderr, "error: delay must be at least 0\n"); + fprintf (stderr, "%s: delay must be at least 0\n", progname); problems = 1; } - scroll_p = 1; + s = get_string_resource ("mode", "Mode"); + if (!s || !*s || !strcasecmp (s, "scroll")) + mode = BC_SCROLL; + else if (!strcasecmp (s, "grid")) + mode = BC_GRID; + else if (!strcasecmp (s, "clock") || + !strcasecmp (s, "clock12")) + mode = BC_CLOCK12; + else if (!strcasecmp (s, "clock24")) + mode = BC_CLOCK24; + else + { + fprintf (stderr, "%s: unknown mode \"%s\"\n", progname, s); + problems = 1; + } + free (s); + + if (mode == BC_CLOCK12 || mode == BC_CLOCK24) + delay = 10000; /* only update every 1/10th second */ if (problems) { @@ -1774,7 +1972,7 @@ void screenhack (Display *dpy, Window win) { oneIteration (); XSync (dpy, False); - screenhack_handle_events (dpy); + barcode_handle_events (dpy); usleep (delay); } } diff --git a/hacks/barcode.man b/hacks/barcode.man index f5e3f37b..4c3c4762 100644 --- a/hacks/barcode.man +++ b/hacks/barcode.man @@ -8,6 +8,8 @@ barcode - draws a random sequence of barcodes for the products you enjoy [\-window] [\-root] [\-delay \fInumber\fP] +[\-clock] +[\-clock24] .SH DESCRIPTION This draws a random sequence of colorful barcodes scrolling across your screen. @@ -25,6 +27,12 @@ Draw on the root window. .TP 8 .B \-delay \fInumber\fP Per-frame delay, in microseconds. Default: 10000 (0.02 seconds.). +.TP 8 +.B \-clock +Instead of drawing a stream of barcodes, draw a barcode-based digital clock. +.TP 8 +.B \-clock24 +Same as \fI\-clock\fP, but display 24-hour time instead of 12-hour time. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com index 137c2c3b..cd28741c 100644 --- a/hacks/compile_axp.com +++ b/hacks/compile_axp.com @@ -70,6 +70,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com index 137c2c3b..cd28741c 100644 --- a/hacks/compile_decc.com +++ b/hacks/compile_decc.com @@ -70,6 +70,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PIECEWISE.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POLYOMINOES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) POPSQUARES.C $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C diff --git a/hacks/config/README b/hacks/config/README index 00b5c31b..ed40340c 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -4,8 +4,8 @@ a screen saver and locker for the X window system by Jamie Zawinski - version 4.07 - 03-Feb-2003 + version 4.08 + 18-Feb-2003 http://www.jwz.org/xscreensaver/ diff --git a/hacks/config/atunnel.xml b/hacks/config/atunnel.xml new file mode 100644 index 00000000..55f31f01 --- /dev/null +++ b/hacks/config/atunnel.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + <_description> +Draws an animation of a textured tunnel in GL. +Requires OpenGL, and a machine with fast hardware support for texture maps. + +Written by Eric Lassauge and Roman Podobedov. + + diff --git a/hacks/config/barcode.xml b/hacks/config/barcode.xml index ef406931..f568131e 100644 --- a/hacks/config/barcode.xml +++ b/hacks/config/barcode.xml @@ -4,6 +4,12 @@ + + diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml index fb01c2f6..77e555c5 100644 --- a/hacks/config/fluidballs.xml +++ b/hacks/config/fluidballs.xml @@ -13,16 +13,16 @@ low="3" high="200" default="25"/> - + + + + + + + + + + + + + + + + + + + <_description> +This draws a bunch of moving circles which switch from visibility to +invisibility at intersection points. Written by Geoffrey Irving. + + diff --git a/hacks/config/qix.xml b/hacks/config/qix.xml index b72311ec..15db088e 100644 --- a/hacks/config/qix.xml +++ b/hacks/config/qix.xml @@ -14,8 +14,7 @@ + low="10" high="500" default="50"/> diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man index 2c9af436..fe1477bd 100644 --- a/hacks/decayscreen.man +++ b/hacks/decayscreen.man @@ -73,5 +73,6 @@ of this software for any purpose. It is provided "as is" without express or implied warranty. .SH AUTHOR Vivek Khera , 05-Aug-93; based on code by David Wald, 1988. -Modified by jwz, 28-Nov-97. +Modified by jwz, 28-Nov-1997. Modified by Rick Schultz 05-Apr-1999. +Modified by Vince Levey 25-Oct-2001. diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c index b60e4395..3413a945 100644 --- a/hacks/fluidballs.c +++ b/hacks/fluidballs.c @@ -11,13 +11,17 @@ * Ported to X11 and xscreensaver by jwz, 27-Feb-2002. * * http://astronomy.swin.edu.au/~pbourke/modelling/fluid/ + * + * Some physics improvements by Steven Barker */ -/* cjb notes - * - * Future ideas: +/* Future ideas: * Specifying a distribution in the ball sizes (with a gamma curve, possibly). * Brownian motion, for that extra touch of realism. + * + * It would be nice to detect when there are more balls than fit in + * the window, and scale the number of balls back. Useful for the + * xscreensaver-demo preview, which is often too tight by default. */ #include @@ -60,7 +64,7 @@ typedef struct { float *r; /* ball radiuses */ float *m; /* ball mass, precalculated */ - float e; /* coefficient of friction, I think? */ + float e; /* coeficient of elasticity */ float max_radius; /* largest radius of any ball */ Bool random_sizes_p; /* Whether balls should be various sizes up to max. */ @@ -312,7 +316,7 @@ init_balls (Display *dpy, Window window) state->accy = get_float_resource ("gravity", "Gravity"); if (state->accy < -1.0 || state->accy > 1.0) state->accy = 0.01; - state->e = get_float_resource ("friction", "Friction"); + state->e = get_float_resource ("elasticity", "Elacitcity"); if (state->e < 0.2 || state->e > 1.0) state->e = 0.97; state->tc = get_float_resource ("timeScale", "TimeScale"); @@ -556,7 +560,7 @@ update_balls (b_state *state) { int a, b; float d, vxa, vya, vxb, vyb, dd, cdx, cdy; - float ma, mb, vela, velb, vela1, velb1; + float ma, mb, vca, vcb, dva, dvb; float dee2; check_window_moved (state); @@ -580,71 +584,69 @@ update_balls (b_state *state) } /* For each ball, compute the influence of every other ball. */ - for (a=1; a <= state->count; a++) - if (a != state->mouse_ball) - for (b=1; b <= state->count; b++) - if (a != b) - { - d = ((state->px[a] - state->px[b]) * - (state->px[a] - state->px[b]) + - (state->py[a] - state->py[b]) * - (state->py[a] - state->py[b])); - dee2 = (state->r[a] + state->r[b]) * - (state->r[a] + state->r[b]); - if (d < dee2) - { - state->collision_count++; - d = sqrt(d); - dd = state->r[a] + state->r[b] - d; - /* A pair of balls that have already collided in this - * current frame (and therefore touching each other) - * should not have another collision calculated, hence - * the fallthru if "dd ~= 0.0". - */ - if ((dd < -0.01) || (dd > 0.01)) - { - cdx = (state->px[b] - state->px[a]) / d; - cdy = (state->py[b] - state->py[a]) / d; - - /* Move each ball apart from the other by half the - * 'collision' distance. - */ - state->px[a] -= 0.5 * dd * cdx; - state->py[a] -= 0.5 * dd * cdy; - state->px[b] += 0.5 * dd * cdx; - state->py[b] += 0.5 * dd * cdy; - - ma = state->m[a]; - mb = state->m[b]; - vxa = state->vx[a]; - vya = state->vy[a]; - vxb = state->vx[b]; - vyb = state->vy[b]; - - vela = sqrt((vxa * vxa) + (vya * vya)); - velb = sqrt((vxb * vxb) + (vyb * vyb)); - - vela1 = vela * ((ma - mb) / (ma + mb)) + - velb * ((2 * mb) / (ma + mb)); - velb1 = vela * ((2 * ma) / (ma + mb)) + - velb * ((mb - ma) / (ma + mb)); - - vela1 *= state->e; /* "air resistance" */ - velb1 *= state->e; + for (a=1; a <= state->count - 1; a++) + for (b=a + 1; b <= state->count; b++) + { + d = ((state->px[a] - state->px[b]) * + (state->px[a] - state->px[b]) + + (state->py[a] - state->py[b]) * + (state->py[a] - state->py[b])); + dee2 = (state->r[a] + state->r[b]) * + (state->r[a] + state->r[b]); + if (d < dee2) + { + state->collision_count++; + d = sqrt(d); + dd = state->r[a] + state->r[b] - d; + + cdx = (state->px[b] - state->px[a]) / d; + cdy = (state->py[b] - state->py[a]) / d; + + /* Move each ball apart from the other by half the + * 'collision' distance. + */ + state->px[a] -= 0.5 * dd * cdx; + state->py[a] -= 0.5 * dd * cdy; + state->px[b] += 0.5 * dd * cdx; + state->py[b] += 0.5 * dd * cdy; + + ma = state->m[a]; + mb = state->m[b]; + + vxa = state->vx[a]; + vya = state->vy[a]; + vxb = state->vx[b]; + vyb = state->vy[b]; + + vca = vxa * cdx + vya * cdy; /* the component of each velocity */ + vcb = vxb * cdx + vyb * cdy; /* along the axis of the collision */ + + /* elastic collison */ + dva = (vca * (ma - mb) + vcb * 2 * mb) / (ma + mb) - vca; + dvb = (vcb * (mb - ma) + vca * 2 * ma) / (ma + mb) - vcb; + + dva *= state->e; /* some energy lost to inelasticity */ + dvb *= state->e; + #if 0 - vela1 += (frand (50) - 25) / ma; /* brownian motion */ - velb1 += (frand (50) - 25) / mb; + dva += (frand (50) - 25) / ma; /* q: why are elves so chaotic? */ + dvb += (frand (50) - 25) / mb; /* a: brownian motion. */ #endif - state->vx[a] = -cdx * vela1; - state->vy[a] = -cdy * vela1; - state->vx[b] = cdx * velb1; - state->vy[b] = cdy * velb1; - } - } - } - /* Force all balls to be on screen. - */ + vxa += dva * cdx; + vya += dva * cdy; + vxb += dvb * cdx; + vyb += dvb * cdy; + + state->vx[a] = vxa; + state->vy[a] = vya; + state->vx[b] = vxb; + state->vy[b] = vyb; + } + } + + /* Force all balls to be on screen. + */ for (a=1; a <= state->count; a++) { if (state->px[a] <= (state->xmin + state->r[a])) @@ -743,7 +745,7 @@ char *defaults [] = { "*random: True", "*gravity: 0.01", "*wind: 0.00", - "*friction: 0.8", + "*elasticity: 0.97", "*timeScale: 1.0", "*doFPS: False", "*shake: True", @@ -763,7 +765,7 @@ XrmOptionDescRec options [] = { { "-count", ".count", XrmoptionSepArg, 0 }, { "-gravity", ".gravity", XrmoptionSepArg, 0 }, { "-wind", ".wind", XrmoptionSepArg, 0 }, - { "-friction", ".friction", XrmoptionSepArg, 0 }, + { "-elasticity", ".elasticity", XrmoptionSepArg, 0 }, { "-fps", ".doFPS", XrmoptionNoArg, "True" }, { "-no-fps", ".doFPS", XrmoptionNoArg, "False" }, { "-shake", ".shake", XrmoptionNoArg, "True" }, diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man index 5e06b89f..b5bd2521 100644 --- a/hacks/fluidballs.man +++ b/hacks/fluidballs.man @@ -11,7 +11,7 @@ fluidballs - the physics of bouncing balls. [\-size \fInumber\fP] [\-gravity \fInumber\fP] [\-wind \fInumber\fP] -[\-friction \fInumber\fP] +[\-elasticity \fInumber\fP] [\-delay \fInumber\fP] [\-nonrandom] [\-no-shake] @@ -45,8 +45,9 @@ Coefficient of gravity. Useful values are < 0.1. Default: 0.01. .B \-wind \fInumber\fP Wind. Useful values are < 0.1. Default: 0.00. .TP 8 -.B \-friction \fInumber\fP -Coefficient of friction (or viscosity.) Useful values are < 4. Default: 0.8. +.B \-elasticity \fInumber\fP +Coefficient of elasticity. Useful values are 0.2 to 1.0. Default: 0.97. +Lower numbers make less bouncy balls. .TP 8 .B \-delay \fInumber\fP Per-frame delay, in microseconds. Default: 10000 (0.01 seconds.). @@ -85,5 +86,5 @@ documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. .SH AUTHOR -Peter Birtles and Jamie Zawinski. +Peter Birtles, Jamie Zawinski, and Steven Barker. diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in index 48382559..04125015 100644 --- a/hacks/glx/Makefile.in +++ b/hacks/glx/Makefile.in @@ -87,7 +87,7 @@ SRCS = xscreensaver-gl-helper.c \ cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \ trackball.c gltrackball.c queens.c endgame.c chessmodels.c \ glblur.c gllist.c flurry.c flurry-smoke.c flurry-spark.c \ - flurry-star.c flurry-texture.c + flurry-star.c flurry-texture.c atunnel.c tunnel_draw.c OBJS = xscreensaver-gl-helper.o \ atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \ @@ -107,14 +107,14 @@ OBJS = xscreensaver-gl-helper.o \ cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \ trackball.o gltrackball.o queens.o endgame.o chessmodels.o \ glblur.o gllist.o flurry.o flurry-smoke.o flurry-spark.o \ - flurry-star.o flurry-texture.o + flurry-star.o flurry-texture.o atunnel.o tunnel_draw.o GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \ morph3d rubik atlantis lament bubble3d glplanet pulsar \ sierpinski3d gflux stonerview starwars gltext molecule \ dangerball circuit menger engine flipscreen3d glsnake boxed \ glforestfire sballs cubenetic spheremonics lavalite queens \ - endgame glblur flurry + endgame glblur flurry atunnel GLE_EXES = extrusion GL_UTIL_EXES = xscreensaver-gl-helper HACK_EXES = @GL_EXES@ @GLE_EXES@ @@ -131,7 +131,7 @@ HDRS = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \ grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \ stonerview-move.h stonerview-osc.h glutstroke.h \ glut_roman.h marching.h rotator.h trackball.h gltrackball.h \ - chessmodels.h chessgames.h gllist.h flurry.h + chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \ cubenetic.man dangerball.man engine.man extrusion.man \ flipscreen3d.man gears.man gflux.man glforestfire.man \ @@ -140,7 +140,7 @@ GL_MEN = atlantis.man boxed.man bubble3d.man cage.man circuit.man \ pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \ spheremonics.man sproingies.man stairs.man starwars.man \ stonerview.man superquadrics.man xscreensaver-gl-helper.man \ - endgame.man flurry.man glblur.man + endgame.man flurry.man glblur.man atunnel.man MEN = @GL_MEN@ EXTRAS = README Makefile.in @@ -359,11 +359,15 @@ ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o xpm-ximage.o atlantis: atlantis.o $(ATLANTIS_OBJS) $(CC_HACK) -o $@ $@.o $(ATLANTIS_OBJS) $(HACK_LIBS) $(XPM_LIBS) +ATUNNEL_OBJS = $(HACK_OBJS) tunnel_draw.o xpm-ximage.o +atunnel: atunnel.o $(ATUNNEL_OBJS) + $(CC_HACK) -o $@ $@.o $(ATUNNEL_OBJS) $(HACK_LIBS) $(XPM_LIBS) + cage: cage.o $(HACK_OBJS) $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) FLURRY_OBJS_1 = flurry-smoke.o flurry-spark.o flurry-star.o flurry-texture.o -FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS) $(TRACK_OBJS) +FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS) flurry: flurry.o $(FLURRY_OBJS) $(CC_HACK) -o $@ $@.o $(FLURRY_OBJS) $(HACK_LIBS) -lm @@ -511,6 +515,12 @@ atlantis.o: $(srcdir)/atlantis.h atlantis.o: ../../config.h atlantis.o: $(HACK_SRC)/images/sea-texture.xpm atlantis.o: $(srcdir)/xpm-ximage.h +atunnel.o: ../../config.h +atunnel.o: $(HACK_SRC)/images/tunnel0.xpm +atunnel.o: $(HACK_SRC)/images/tunnel1.xpm +atunnel.o: $(HACK_SRC)/images/tunnel2.xpm +atunnel.o: $(srcdir)/tunnel_draw.h +atunnel.o: $(srcdir)/xpm-ximage.h b_draw.o: $(srcdir)/bubble3d.h b_draw.o: ../../config.h b_lockglue.o: $(srcdir)/bubble3d.h @@ -687,6 +697,8 @@ trackball.o: ../../config.h trackball.o: $(srcdir)/trackball.h tube.o: ../../config.h tube.o: $(srcdir)/tube.h +tunnel_draw.o: ../../config.h +tunnel_draw.o: $(srcdir)/tunnel_draw.h whale.o: $(srcdir)/atlantis.h xlock-gl.o: ../../config.h xpm-ximage.o: ../../config.h diff --git a/hacks/glx/atunnel.c b/hacks/glx/atunnel.c new file mode 100644 index 00000000..74a64b5b --- /dev/null +++ b/hacks/glx/atunnel.c @@ -0,0 +1,308 @@ +/* -*- Mode: C; tab-width: 4 -*- */ +/* atunnels --- OpenGL Advanced Tunnel Screensaver */ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)atunnels.c 5.07 2003/02/12 xlockmore"; +#endif + +/* Copyright (c) E. Lassauge, 2003. */ + +/* + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * The original code for this mode was written by Roman Podobedov + * Email: romka@ut.ee + * WEB: http://romka.demonews.com + * + * Eric Lassauge (March-16-2002) + * http://lassauge.free.fr/linux.html + * + * REVISION HISTORY: + * + * E.Lassauge - 16-Mar-2002: + * - created based on the Roman demo. + * - deleted all external file stuff to use xpm textures and + * hardcoded path point values. + * + */ + +#ifdef STANDALONE /* xscreensaver mode */ +# define PROGCLASS "Atunnels" +# define HACK_INIT init_atunnels +# define HACK_DRAW draw_atunnels +# define HACK_RESHAPE reshape_atunnels +# define atunnels_opts xlockmore_opts +#define DEFAULTS "*delay: 10000 \n" \ + "*showFPS: False \n" \ + "*light: True \n" \ + "*wire: False \n" \ + "*texture: True \n" + +#define MODE_atunnels +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef MODE_atunnels /* whole file */ + +#include +#include +#include +#include "tunnel_draw.h" + +#if defined( USE_XPM ) || defined( USE_XPMINC ) || defined( HAVE_XPM ) +/* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */ +#include "xpm-ximage.h" +#define I_HAVE_XPM + +#ifdef STANDALONE +#include "../images/tunnel0.xpm" +#include "../images/tunnel1.xpm" +#include "../images/tunnel2.xpm" +#else /* !STANDALONE */ +#include "pixmaps/tunnel0.xpm" +#include "pixmaps/tunnel1.xpm" +#include "pixmaps/tunnel2.xpm" +#endif /* !STANDALONE */ +#endif /* HAVE_XPM */ + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#define DEF_LIGHT "True" +#define DEF_WIRE "False" +#define DEF_TEXTURE "True" + +static Bool do_light; +static Bool do_wire; +static Bool do_texture; + +static XrmOptionDescRec opts[] = { + {(char *)"-light", (char *)".atunnels.light", XrmoptionNoArg, (caddr_t) "true" }, + {(char *)"+light", (char *)".atunnels.light", XrmoptionNoArg, (caddr_t) "false" }, + {(char *)"-wire", (char *)".atunnels.wire", XrmoptionNoArg, (caddr_t) "true" }, + {(char *)"+wire", (char *)".atunnels.wire", XrmoptionNoArg, (caddr_t) "false" }, + {(char *)"-texture", (char *)".atunnels.texture", XrmoptionNoArg, (caddr_t) "true" }, + {(char *)"+texture", (char *)".atunnels.texture", XrmoptionNoArg, (caddr_t) "false" }, +}; + +static argtype vars[] = { + {(caddr_t *) &do_light, (char *)"light", (char *)"Light", DEF_LIGHT, t_Bool}, + {(caddr_t *) &do_wire, (char *)"wire", (char *)"Wire", DEF_WIRE, t_Bool}, + {(caddr_t *) &do_texture, (char *)"texture",(char *)"Texture", DEF_TEXTURE, t_Bool}, +}; + +static OptionStruct desc[] = +{ + {(char *)"-/+ light", (char *)"whether to do enable lighting (slower)"}, + {(char *)"-/+ wire", (char *)"whether to do use wireframe instead of filled (faster)"}, + {(char *)"-/+ texture", (char *)"whether to apply a texture (slower)"}, +}; + +ModeSpecOpt atunnels_opts = {countof(opts), opts, countof(vars), vars, desc}; + +#ifdef USE_MODULES +ModStruct atunnels_description = +{"atunnels", "init_atunnels", "draw_atunnels", "release_atunnels", + "draw_atunnels", "init_atunnels", NULL, &atunnels_opts, + 1000, 1, 2, 1, 4, 1.0, "", + "OpenGL advanced tunnel screensaver", 0, NULL}; +#endif + +/* structure for holding the screensaver data */ +typedef struct { + int screen_width, screen_height; + GLXContext *glx_context; + Window window; +} atunnelsstruct; + +static atunnelsstruct *Atunnels = NULL; +static GLuint texture[3]; /* texture id: GL world */ + +/*=================== Load Texture =========================================*/ +static void LoadTexture(ModeInfo * mi, char **fn, int t_num) +{ +#if defined( I_HAVE_XPM ) + XImage *teximage; /* Texture data */ + + if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), + MI_COLORMAP(mi), fn)) == None) { + (void) fprintf(stderr, "Error reading the texture.\n"); + glDeleteTextures(1, &texture[t_num]); + do_texture = False; +#ifdef STANDALONE + exit(0); +#else + return; +#endif + } + +#ifdef HAVE_GLBINDTEXTURE + glBindTexture(GL_TEXTURE_2D, texture[t_num]); +#endif /* HAVE_GLBINDTEXTURE */ + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + clear_gl_error(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height, + 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data); + check_gl_error("texture"); + + /* Texture parameters, LINEAR scaling for better texture quality */ + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + XDestroyImage(teximage); +#else /* !I_HAVE_XPM */ + do_texture = False; +#endif /* !I_HAVE_XPM */ +} + +/*=================== Main Initialization ==================================*/ +static void Init(ModeInfo * mi) +{ + GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0}; + GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0}; + GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0}; + GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0}; + GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0}; + + glClearColor(0, 0, 0, 0); + if (do_texture) + { + glGenTextures(3, texture); + LoadTexture(mi, texture0,0); + LoadTexture(mi, texture1,1); + LoadTexture(mi, texture2,2); + glEnable(GL_TEXTURE_2D); + } + InitTunnel(); + + /* Set lighting parameters */ + if (do_light) + { + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + + /* Enable light 0 */ + glEnable(GL_LIGHT0); + glDepthFunc(GL_LESS); + + glEnable(GL_LIGHTING); + } + if (do_wire) { + glDisable(GL_NORMALIZE); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_TEXTURE_2D); + glPolygonMode(GL_FRONT,GL_LINE); + glPolygonMode(GL_BACK,GL_LINE); + } + else + { + glEnable(GL_DEPTH_TEST); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + /* Enable fog */ + glFogi(GL_FOG_MODE, GL_EXP); + glFogfv(GL_FOG_COLOR, fogColor); + glFogf(GL_FOG_DENSITY, 0.3); + glEnable(GL_FOG); + + /* Cull face */ + glCullFace(GL_FRONT); + glEnable(GL_CULL_FACE); + } + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +} + + +/* Standard reshape function */ +void +reshape_atunnels(ModeInfo *mi, int width, int height) +{ + float a; + + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + a = (float)width/(float)height; + glFrustum(-0.1*a, 0.1*a, -0.1, 0.1, 0.1, 10); + glMatrixMode(GL_MODELVIEW); +} + +/* draw the screensaver once */ +void draw_atunnels(ModeInfo * mi) +{ + atunnelsstruct *sa = &Atunnels[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + if (!sa->glx_context) + return; + + glXMakeCurrent(display, window, *(sa->glx_context)); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glLoadIdentity(); + + DrawTunnel(do_texture, do_light, texture); + SplashScreen(do_wire, do_texture, do_light); + + glFlush(); + /* manage framerate display */ + if (MI_IS_FPS(mi)) do_fps (mi); + glXSwapBuffers(display, window); + +} + + +/* xscreensaver initialization routine */ +void init_atunnels(ModeInfo * mi) +{ + int screen = MI_SCREEN(mi); + atunnelsstruct *sa; + + if (Atunnels == NULL) { + if ((Atunnels = (atunnelsstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (atunnelsstruct))) == NULL) + return; + } + sa = &Atunnels[screen]; + + sa->window = MI_WINDOW(mi); + if ((sa->glx_context = init_GL(mi)) != NULL) { + reshape_atunnels(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + Init(mi); + } else { + MI_CLEARWINDOW(mi); + } + +} + +/* all sorts of nice cleanup code should go here! */ +void release_atunnels(ModeInfo * mi) +{ + int screen; + if (Atunnels != NULL) { + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + /* atunnelsstruct *sa = &Atunnels[screen];*/ + } + (void) free((void *) Atunnels); + Atunnels = NULL; + } + FreeAllGL(mi); +} +#endif diff --git a/hacks/glx/atunnel.man b/hacks/glx/atunnel.man new file mode 100644 index 00000000..1baa491e --- /dev/null +++ b/hacks/glx/atunnel.man @@ -0,0 +1,85 @@ +.de EX \"Begin example +.ne 5 +.if n .sp 1 +.if t .sp .5 +.nf +.in +.5i +.. +.de EE +.fi +.in -.5i +.if n .sp 1 +.if t .sp .5 +.. +.TH XScreenSaver 1 "12-Feb-03" "X Version 11" +.SH NAME +atunnel - hypnotic GL tunnel journey +.SH SYNOPSIS +.B sballs +[\-display \fIhost:display.screen\fP] [\-window] [\-root] +[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] +[\-light] [\-no-light] +[\-wire] [\-no-wire] +[\-texture] [\-no-texture] +[\-fps] [\-no-fps] +.SH DESCRIPTION +The \fIatunnel\fP program draws an animation of a journey in a GL tunnel. +.SH OPTIONS +.I sballs +accepts the following options: +.TP 8 +.B \-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-root +Draw on the root window. +.TP 8 +.B \-install +Install a private colormap for the window. +.TP 8 +.B \-visual \fIvisual\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-fps +Display a running tally of how many frames per second are being rendered. +In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of +your GL performance. +.TP 8 +.B \-texture +Show a textured tunnel. This is the default. +.TP 8 +.B \-no\-texture +Disables texturing the animation. +.TP 8 +.B \-wire +Draw a wireframe rendition of the tunnel. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2003 by Eric Lassauge. +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. No representations are made about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +The original code for this mode was written by +Roman Podobedov +and can be found at http://romka.demonews.com + +.SH AUTHOR +Roman Podobedov +Eric Lassauge diff --git a/hacks/glx/chessmodels.c b/hacks/glx/chessmodels.c index 4ef0595d..903d2790 100644 --- a/hacks/glx/chessmodels.c +++ b/hacks/glx/chessmodels.c @@ -69,7 +69,7 @@ void revolve_line(double *trace_r, double *trace_h, double max_ih, int rot) { pradius = trace_r[0] * piece_size; pheight = trace_h[0] * piece_size; - for(p = 0; p < npoints; ++p) { + for(p = 1; p < npoints; ++p) { radius = trace_r[p] * piece_size; height = trace_h[p] * piece_size; diff --git a/hacks/glx/endgame.c b/hacks/glx/endgame.c index ecc58b52..79e86c1d 100644 --- a/hacks/glx/endgame.c +++ b/hacks/glx/endgame.c @@ -468,7 +468,7 @@ void draw_chess(ModeInfo *mi) { if(done) glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, - done == 1 ? 1.0+0.1*count : 99.0/count); + ( done == 1 || count == 0 ) ? 1.0+0.1*count : 99.0/count); if(++count == 100) { if(!done) { diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c index fd9f0f48..68348651 100644 --- a/hacks/glx/extrusion.c +++ b/hacks/glx/extrusion.c @@ -69,7 +69,6 @@ #include #include #include -#include #include #include #ifdef HAVE_GLE3 diff --git a/hacks/glx/flurry-smoke.c b/hacks/glx/flurry-smoke.c index 4b874510..c89fe7d1 100644 --- a/hacks/glx/flurry-smoke.c +++ b/hacks/glx/flurry-smoke.c @@ -194,6 +194,7 @@ void UpdateSmoke_ScalarBase(global_info_t *global, flurry_info_t *flurry, SmokeV } } +#if 0 #ifdef __ppc__ void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s) @@ -242,11 +243,13 @@ void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, Smo rsquared = (dx*dx+dy*dy+dz*dz); f = streamSpeed * streamSpeedCoherenceFactor; - /* mag = f / (float) sqrt(rsquared); */ - - /* reciprocal square-root estimate replaced above divide and call to system sqrt() */ - asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); - mag *= f; + mag = f / (float) sqrt(rsquared); + /* + reciprocal square-root estimate replaced above divide and call to system sqrt() + + asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); + mag *= f; + */ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag); s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag); @@ -307,18 +310,19 @@ void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, Smo dz = s->p[i].position[2].f[k] - flurry->spark[j]->position[2]; rsquared = (dx*dx+dy*dy+dz*dz); - asm("fres %0, %1" : "=f" (f) : "f" (rsquared)); - f *= gravity*frameRateModifier; - + /* + asm("fres %0, %1" : "=f" (f) : "f" (rsquared)); + f *= gravity*frameRateModifier; + */ + f = ( gravity * frameRateModifier ) / rsquared; + if((((i*4)+k) % flurry->numStreams) == j) { f *= 1.0f + streamBias; } - /* mag = f / (float) sqrt(rsquared); */ + mag = f / (float) sqrt(rsquared); /* reciprocal square-root estimate replaced above divide and call to system sqrt() */ - asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); - mag *= f; deltax -= (dx * mag); deltay -= (dy * mag); @@ -411,8 +415,11 @@ void UpdateSmoke_VectorBase(global_info_t *global, flurry_info_t *flurry, SmokeV rsquared = (dx*dx+dy*dy+dz*dz); f = streamSpeed * streamSpeedCoherenceFactor; - asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); - mag *= f; + mag = f / (float) sqrt(rsquared); + /* + asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); + mag *= f; + */ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag); s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag); @@ -623,8 +630,11 @@ void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s) rsquared = (dx*dx+dy*dy+dz*dz); f = streamSpeed * streamSpeedCoherenceFactor; - asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); - mag *= f; + mag = f / (float) sqrt(rsquared); + /* + asm("frsqrte %0, %1" : "=f" (mag) : "f" (rsquared)); + mag *= f; + */ s->p[s->nextParticle].delta[0].f[s->nextSubParticle] -= (dx * mag); s->p[s->nextParticle].delta[1].f[s->nextSubParticle] -= (dy * mag); @@ -918,6 +928,7 @@ void UpdateSmoke_VectorUnrolled(global_info_t *info, SmokeV *s) } #endif +#endif /* 0 */ void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness) { @@ -1076,6 +1087,7 @@ void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, f glDrawArrays(GL_QUADS,0,si*4); } +#if 0 #ifdef __VEC__ void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness) @@ -1425,3 +1437,4 @@ void DrawSmoke_Vector(global_info_t *global, flurry_info_t *flurry, SmokeV *s, f } #endif +#endif /* 0 */ diff --git a/hacks/glx/flurry.c b/hacks/glx/flurry.c index 0014cd81..63b89f66 100644 --- a/hacks/glx/flurry.c +++ b/hacks/glx/flurry.c @@ -56,8 +56,6 @@ static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore"; # define HACK_INIT init_flurry # define HACK_DRAW draw_flurry # define HACK_RESHAPE reshape_flurry -# define HACK_HANDLE_EVENT flurry_handle_event -# define EVENT_MASK PointerMotionMask # define flurry_opts xlockmore_opts # define DEFAULTS "*showFPS: False \n" \ "*preset: " DEF_PRESET " \n" @@ -66,9 +64,6 @@ static const char sccsid[] = "@(#)flurry.c 4.07 97/11/24 xlockmore"; #ifdef USE_GL -#include "rotator.h" -#include "gltrackball.h" - static char *preset_str; static XrmOptionDescRec opts[] = { @@ -103,7 +98,6 @@ ModStruct flurry_description = { #endif #include -#include #include "flurry.h" @@ -129,12 +123,14 @@ double TimeInSecondsSinceStart (void) { return currentTime() - gTimeCounter; } +#if 0 #ifdef __ppc__ static int IsAltiVecAvailable(void) { return 0; } #endif +#endif void delete_flurry_info(flurry_info_t *flurry) { @@ -158,7 +154,9 @@ flurry_info_t *new_flurry_info(global_info_t *global, int streams, ColorModes co flurry->flurryRandomSeed = RandFlt(0.0, 300.0); - flurry->fOldTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed; + flurry->fOldTime = 0; + flurry->fTime = TimeInSecondsSinceStart() + flurry->flurryRandomSeed; + flurry->fDeltaTime = flurry->fTime - flurry->fOldTime; flurry->numStreams = streams; flurry->streamExpansion = thickness; @@ -216,6 +214,7 @@ void GLSetupRC(global_info_t *global) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); +#if 0 #ifdef __ppc__ global->optMode = OPT_MODE_SCALAR_FRSQRTE; @@ -226,6 +225,7 @@ void GLSetupRC(global_info_t *global) #else global->optMode = OPT_MODE_SCALAR_BASE; #endif +#endif /* 0 */ } void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b) @@ -263,6 +263,7 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b) case OPT_MODE_SCALAR_BASE: UpdateSmoke_ScalarBase(global, flurry, flurry->s); break; +#if 0 #ifdef __ppc__ case OPT_MODE_SCALAR_FRSQRTE: UpdateSmoke_ScalarFrsqrte(global, flurry, flurry->s); @@ -276,6 +277,8 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b) UpdateSmoke_VectorUnrolled(global, flurry, flurry->s); break; #endif +#endif /* 0 */ + default: break; } @@ -287,17 +290,21 @@ void GLRenderScene(global_info_t *global, flurry_info_t *flurry, double b) switch(global->optMode) { case OPT_MODE_SCALAR_BASE: +#if 0 #ifdef __ppc__ case OPT_MODE_SCALAR_FRSQRTE: #endif +#endif /* 0 */ DrawSmoke_Scalar(global, flurry, flurry->s, b); break; +#if 0 #ifdef __VEC__ case OPT_MODE_VECTOR_SIMPLE: case OPT_MODE_VECTOR_UNROLLED: DrawSmoke_Vector(global, flurry, flurry->s, b); break; #endif +#endif /* 0 */ default: break; } @@ -332,32 +339,6 @@ void reshape_flurry(ModeInfo *mi, int width, int height) GLResize(global, (float)width, (float)height); } -Bool -flurry_handle_event (ModeInfo *mi, XEvent *event) -{ - global_info_t *global = flurry_info + MI_SCREEN(mi); - - if (event->xany.type == ButtonPress && event->xbutton.button & Button1) { - global->button_down_p = True; - gltrackball_start (global->trackball, - event->xbutton.x, event->xbutton.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - else if (event->xany.type == ButtonRelease && event->xbutton.button & Button1) { - global->button_down_p = False; - return True; - } - else if (event->xany.type == MotionNotify && global->button_down_p) { - gltrackball_track (global->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - - return False; -} - void init_flurry(ModeInfo * mi) { @@ -386,9 +367,6 @@ init_flurry(ModeInfo * mi) global->window = MI_WINDOW(mi); - global->rot = make_rotator(1, 1, 1, 1, 0, True); - global->trackball = gltrackball_init(); - global->flurry = NULL; if (!preset_str || !*preset_str) preset_str = DEF_PRESET; diff --git a/hacks/glx/flurry.h b/hacks/glx/flurry.h index 32210064..ead856e3 100644 --- a/hacks/glx/flurry.h +++ b/hacks/glx/flurry.h @@ -259,9 +259,6 @@ struct _global_info_t { /* system values */ GLXContext *glx_context; Window window; - rotator *rot; - trackball_state *trackball; - Bool button_down_p; int optMode; float sys_glWidth; diff --git a/hacks/glx/glblur.c b/hacks/glx/glblur.c index 5504e39b..f34776b3 100644 --- a/hacks/glx/glblur.c +++ b/hacks/glx/glblur.c @@ -258,7 +258,10 @@ init_texture (ModeInfo *mi) glGenTextures (1, &bp->texture); glBindTexture (GL_TEXTURE_2D, bp->texture); glTexImage2D (GL_TEXTURE_2D, 0, 4, 128, 128, 0, - GL_RGBA, GL_UNSIGNED_BYTE, bp->tex_data); + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + bp->tex_data); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } diff --git a/hacks/glx/glforestfire.c b/hacks/glx/glforestfire.c index dee6a566..2f4846d0 100644 --- a/hacks/glx/glforestfire.c +++ b/hacks/glx/glforestfire.c @@ -191,6 +191,7 @@ static XrmOptionDescRec opts[] = { {(char *) "-wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "on"}, {(char *) "+wander", (char *) ".fire.wander", XrmoptionNoArg, (caddr_t) "off"}, {(char *) "-trees", (char *) ".fire.trees", XrmoptionSepArg, (caddr_t) NULL}, + {(char *) "-rain", (char *) ".fire.count", XrmoptionNoArg, (caddr_t) "0"}, }; @@ -338,8 +339,13 @@ static float gettimerain(void) { #if 0 /* Oh yeah, *that's* portable! WTF. */ + /* + * I really thought clock() was standard ... EL + * I found this on the net: + * The clock() function conforms to ISO/IEC 9899:1990 (``ISO C89'') + * */ - static clock_t told=0; + static clock_t told= (clock_t)0; clock_t tnew,ris; tnew=clock(); @@ -348,9 +354,9 @@ static float gettimerain(void) told=tnew; - return (ris/(float)CLOCKS_PER_SEC); + return (0.0125 + ris/(float)CLOCKS_PER_SEC); #else - return 0; + return 0.0150; #endif } @@ -590,8 +596,11 @@ static void inittextures(ModeInfo * mi) glPixelStorei(GL_UNPACK_ALIGNMENT, 4); clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - fs->gtexture->width, fs->gtexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, fs->gtexture->data); + fs->gtexture->width, fs->gtexture->height, 0, + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + fs->gtexture->data); check_gl_error("texture"); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); @@ -619,8 +628,11 @@ static void inittextures(ModeInfo * mi) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - fs->ttexture->width, fs->ttexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, fs->ttexture->data); + fs->ttexture->width, fs->ttexture->height, 0, + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + fs->ttexture->data); check_gl_error("texture"); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c index 19523a59..f2080b30 100644 --- a/hacks/glx/glplanet.c +++ b/hacks/glx/glplanet.c @@ -213,7 +213,10 @@ setup_xpm_texture (ModeInfo *mi, char **xpm_data) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image->data); + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + image->data); sprintf (buf, "builtin texture (%dx%d)", image->width, image->height); check_gl_error(buf); @@ -240,7 +243,10 @@ setup_file_texture (ModeInfo *mi, char *filename) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image->data); + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + image->data); sprintf (buf, "texture: %.100s (%dx%d)", filename, image->width, image->height); check_gl_error(buf); diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c index 5b80d76c..bb3e9db3 100644 --- a/hacks/glx/gltext.c +++ b/hacks/glx/gltext.c @@ -177,13 +177,16 @@ parse_text (ModeInfo *mi) strlen(uts.sysname) + strlen(uts.version) + strlen(uts.release) + 10); -# ifdef _AIX +# if defined(_AIX) sprintf(tp->text, "%s\n%s %s.%s", uts.nodename, uts.sysname, uts.version, uts.release); -# else /* !_AIX */ +# elif defined(__APPLE__) /* MacOS X + XDarwin */ + sprintf(tp->text, "%s\n%s %s\n%s", + uts.nodename, uts.sysname, uts.release, uts.machine); +# else sprintf(tp->text, "%s\n%s %s", uts.nodename, uts.sysname, uts.release); -# endif /* !_AIX */ +# endif /* special system types */ } # else /* !HAVE_UNAME */ # ifdef VMS diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c index 6a5b1fa2..e199c4a4 100644 --- a/hacks/glx/grab-ximage.c +++ b/hacks/glx/grab-ximage.c @@ -1,5 +1,5 @@ /* grab-ximage.c --- grab the screen to an XImage for use with OpenGL. - * xscreensaver, Copyright (c) 2001 Jamie Zawinski + * xscreensaver, Copyright (c) 2001, 2003 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 @@ -149,13 +149,16 @@ screen_to_ximage (Screen *screen, Window window) unsigned char spread_map[3][256]; - srmsk = ximage1->red_mask; - sgmsk = ximage1->green_mask; - sbmsk = ximage1->blue_mask; + if (colors == 0) /* truecolor */ + { + srmsk = ximage1->red_mask; + sgmsk = ximage1->green_mask; + sbmsk = ximage1->blue_mask; - decode_mask (srmsk, &srpos, &srsiz); - decode_mask (sgmsk, &sgpos, &sgsiz); - decode_mask (sbmsk, &sbpos, &sbsiz); + decode_mask (srmsk, &srpos, &srsiz); + decode_mask (sgmsk, &sgpos, &sgsiz); + decode_mask (sbmsk, &sbpos, &sbsiz); + } /* Note that unlike X, which is endianness-agnostic (since any XImage can have its own specific bit ordering, with the server reversing @@ -165,11 +168,14 @@ screen_to_ximage (Screen *screen, Window window) */ crpos = 0, cgpos = 8, cbpos = 16, capos = 24; - for (i = 0; i < 256; i++) + if (colors == 0) /* truecolor */ { - spread_map[0][i] = spread_bits (i, srsiz); - spread_map[1][i] = spread_bits (i, sgsiz); - spread_map[2][i] = spread_bits (i, sbsiz); + for (i = 0; i < 256; i++) + { + spread_map[0][i] = spread_bits (i, srsiz); + spread_map[1][i] = spread_bits (i, sgsiz); + spread_map[2][i] = spread_bits (i, sbsiz); + } } for (y = 0; y < win_height; y++) diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c index cf5c5ba0..eb75dd6d 100644 --- a/hacks/glx/lament.c +++ b/hacks/glx/lament.c @@ -1936,7 +1936,9 @@ gl_init(ModeInfo *mi) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lc->texture->width, height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, (lc->texture->data + (lc->texture->bytes_per_line * height * i))); check_gl_error("texture"); diff --git a/hacks/glx/sballs.c b/hacks/glx/sballs.c index 9e9b2e3d..ad77d8c4 100644 --- a/hacks/glx/sballs.c +++ b/hacks/glx/sballs.c @@ -441,7 +441,10 @@ static void inittextures(ModeInfo * mi) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sb->btexture->width, sb->btexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, sb->btexture->data); + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + sb->btexture->data); check_gl_error("texture"); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); @@ -472,7 +475,10 @@ static void inittextures(ModeInfo * mi) clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sb->ftexture->width, sb->ftexture->height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, sb->ftexture->data); + GL_RGBA, + /* GL_UNSIGNED_BYTE, */ + GL_UNSIGNED_INT_8_8_8_8_REV, + sb->ftexture->data); check_gl_error("texture"); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); diff --git a/hacks/glx/starwars.c b/hacks/glx/starwars.c index 5772d1eb..1f27a7eb 100644 --- a/hacks/glx/starwars.c +++ b/hacks/glx/starwars.c @@ -289,9 +289,22 @@ launch_text_generator (sws_configuration *sc) } } #endif /* __linux__ */ + +#ifdef __APPLE__ /* MacOS X + XDarwin */ + { + static int done_once = 0; + if (!done_once) + { + struct stat st; + static char *cmd = "cat /usr/X11R6/README"; + if (!stat (cmd+4, &st)) + oprogram = cmd; + } + } +#endif /* __APPLE__ */ } - program = (char *) malloc (strlen (oprogram) + 10); + program = (char *) malloc (strlen (oprogram) + 10); strcpy (program, "( "); strcat (program, oprogram); strcat (program, " ) 2>&1"); diff --git a/hacks/glx/tunnel_draw.c b/hacks/glx/tunnel_draw.c new file mode 100644 index 00000000..71954100 --- /dev/null +++ b/hacks/glx/tunnel_draw.c @@ -0,0 +1,472 @@ +/* -*- Mode: C; tab-width: 4 -*- */ +/* atunnels --- OpenGL Advanced Tunnel Demo */ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)tunnel_draw.c 5.02 2002/03/16 xlockmore"; +#endif + +/* Copyright (c) E. Lassauge, 2002. */ + +/* + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * The original code for this mode was written by Roman Podobedov + * Email: romka@ut.ee + * WEB: http://romka.demonews.com + * + * Eric Lassauge (March-16-2002) + * http://lassauge.free.fr/linux.html + * + * REVISION HISTORY: + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef USE_GL /* whole file */ + +#include +#include +#include + +#include +#include + +#include "tunnel_draw.h" + +typedef struct +{ + float x, y, z; /* Point coordinates */ +} cvPoint; + +typedef struct _tnPath +{ + cvPoint p; + struct _tnPath *next; +} tnPath; + + +tnPath *path = NULL; + +const cvPoint initpath[]={ +{0.000000, 0.000000, 0.000000}, +{2.000000, 1.000000, 0.000000}, +{4.000000, 0.000000, 0.000000}, +{6.000000, 1.000000, 0.000000}, +{8.000000, 0.000000, 1.000000}, +{10.000000, 1.000000, 1.000000}, +{12.000000, 1.500000, 0.000000}, +{14.000000, 0.000000, 0.000000}, +{16.000000, 1.000000, 0.000000}, +{18.000000, 0.000000, 0.000000}, +{20.000000, 0.000000, 1.000000}, +{22.000000, 1.000000, 0.000000}, +{24.000000, 0.000000, 1.000000}, +{26.000000, 0.000000, 1.000000}, +{28.000000, 1.000000, 0.000000}, +{30.000000, 0.000000, 2.000000}, +{32.000000, 1.000000, 0.000000}, +{34.000000, 0.000000, 2.000000}, +{-1.000000, -1.000000, -1.000000} +}; + +/* Camera variables */ +static float cam_t=0; +static tnPath *cam_pos; +static float alpha=0; + +/* Tunnel Drawing Variables */ +static int tFlag=0; +static cvPoint prev_points[10]; +static int current_texture; + +/* Modes */ +static float ModeX=0; +static int ModeXFlag=0; + +/*=================== Vector normalization ==================================*/ +void normalize(cvPoint *V) +{ + float d; + + /* Vector length */ + d = (float)sqrt(V->x*V->x + V->y*V->y + V->z*V->z); + + /* Normalization */ + V->x /= d; + V->y /= d; + V->z /= d; +} +/*=================== C = A x B (Vector multiply) ==========================*/ +void vect_mult(cvPoint *A, cvPoint *B, cvPoint *C) +{ + /* Vector multiply */ + C->x = A->y*B->z - A->z*B->y; + C->y = A->z*B->x - A->x*B->z; + C->z = A->x*B->y - A->y*B->x; +} + +/* Catmull-Rom Curve calculations */ +void cvCatmullRom(cvPoint *p, float t, cvPoint *outp) +{ + float t2, t3, t1; + + t2 = t*t; + t3 = t*t*t; + t1 = (1-t)*(1-t); + + outp->x = (-t*t1*p[0].x + (2-5*t2+3*t3)*p[1].x + t*(1+4*t-3*t2)*p[2].x - t2*(1-t)*p[3].x)/2; + outp->y = (-t*t1*p[0].y + (2-5*t2+3*t3)*p[1].y + t*(1+4*t-3*t2)*p[2].y - t2*(1-t)*p[3].y)/2; + outp->z = (-t*t1*p[0].z + (2-5*t2+3*t3)*p[1].z + t*(1+4*t-3*t2)*p[2].z - t2*(1-t)*p[3].z)/2; +} + +/*=================== Point Rotating Around Line =========================== +// p - original point +// pp - pivot point +// pl - pivot line (vector) +// a - angle to rotate in radians +// outp - output point +//========================================================================== +*/ +void RotateAroundLine(cvPoint *p, cvPoint *pp, cvPoint *pl, float a, cvPoint *outp) +{ + cvPoint p1, p2; + float l, m, n, ca, sa; + + p1.x = p->x - pp->x; + p1.y = p->y - pp->y; + p1.z = p->z - pp->z; + + l = pl->x; + m = pl->y; + n = pl->z; + + ca = cos(a); + sa = sin(a); + + p2.x = p1.x*((l*l)+ca*(1-l*l)) + p1.y*(l*(1-ca)*m+n*sa) + p1.z*(l*(1-ca)*n-m*sa); + p2.y = p1.x*(l*(1-ca)*m-n*sa) + p1.y*(m*m+ca*(1-m*m)) + p1.z*(m*(1-ca)*n+l*sa); + p2.z = p1.x*(l*(1-ca)*n+m*sa) + p1.y*(m*(1-ca)*n-l*sa) + p1.z*(n*n+ca*(1-n*n)); + + outp->x = p2.x + pp->x; + outp->y = p2.y + pp->y; + outp->z = p2.z + pp->z; +} + + +/*=================== Load camera and tunnel path ==========================*/ +static void LoadPath(void) +{ + float x, y, z; + tnPath *path1=NULL, *path2=NULL; + + cvPoint *f = (cvPoint *)initpath; + + while (f->x != -1.0) + { + x = f->x; + y = f->y; + z = f->z; + f++; + + if (path == NULL) + { + path = (tnPath *)malloc(sizeof(tnPath)); + path1 = path; + } + else + { + path2 = (tnPath *)malloc(sizeof(tnPath)); + path1->next = path2; + path1 = path2; + } + + path1->next = NULL; + path1->p.x = x; + path1->p.y = y; + path1->p.z = z; + } + + cam_pos = path; + cam_t = 0; +} + +/*=================== Tunnel Initialization ================================*/ +void InitTunnel(void) +{ + LoadPath(); + current_texture = 0; +} + +void DrawTunnel(int do_texture, int do_light, GLuint *textures) +{ + tnPath *p, *p1, *cmpos; + cvPoint op, p4[4], T, ppp, ppp1, op1, op2; + float t; + int i, j, k, flag; + cvPoint points[10]; + GLfloat light_position[4]; + + + /* Select current tunnel texture */ + if (do_texture) + glBindTexture(GL_TEXTURE_2D, textures[current_texture]); + + cmpos = cam_pos; + /* Get current curve */ + if (cam_pos->next->next->next) + { + p1 = cam_pos; + for (i=0; i<4; i++) + { + p4[i].x = p1->p.x; + p4[i].y = p1->p.y; + p4[i].z = p1->p.z; + p1 = p1->next; + } + } + else + { + /* End of tunnel */ + ModeX = 1.0; + ModeXFlag = 0; + return; + }; + + /* Get current camera position */ + cvCatmullRom(p4, cam_t, &op); + + /* Next camera position */ + cam_t += 0.02f; + if (cam_t >= 1) + { + cam_t = cam_t - 1; + cmpos = cam_pos->next; + } + + /* Get curve for next camera position */ + if (cmpos->next->next->next) + { + p1 = cmpos; + for (i=0; i<4; i++) + { + p4[i].x = p1->p.x; + p4[i].y = p1->p.y; + p4[i].z = p1->p.z; + p1 = p1->next; + } + } + else + { + /* End of tunnel */ + ModeX = 1.0; + ModeXFlag = 0; + return; + } + + /* Get next camera position */ + cvCatmullRom(p4, cam_t, &op1); + + /* Rotate camera */ + glRotatef(alpha, 0, 0, -1); + alpha += 1; + /* Set camera position */ + gluLookAt(op.x, op.y, op.z, op1.x, op1.y, op1.z, 0, 1, 0); + + /* Set light position */ + if (do_light) + { + light_position[0] = op.x; + light_position[1] = op.y; + light_position[2] = op.z; + light_position[3] = 1; + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + } + + p = cam_pos; + flag = 0; + t = 0; + k = 0; + /* Draw tunnel from current curve and next 2 curves */ + glBegin(GL_QUADS); + while (k < 3) + { + if (p->next->next->next) + { + p1 = p; + for (i=0; i<4; i++) + { + p4[i].x = p1->p.x; + p4[i].y = p1->p.y; + p4[i].z = p1->p.z; + p1 = p1->next; + } + } + else + { + /* End of tunnel */ + ModeX = 1.0; + ModeXFlag = 0; + return; + } + cvCatmullRom(p4, t, &op); + + ppp.x = op.x; + ppp.y = op.y; + ppp.z = op.z + 0.25; + + t += 0.1; + if (t >= 1.0) + { + t = t - 1; + k++; + p = p->next; + } + + if (p->next->next->next) + { + p1 = p; + for (i=0; i<4; i++) + { + p4[i].x = p1->p.x; + p4[i].y = p1->p.y; + p4[i].z = p1->p.z; + p1 = p1->next; + } + } + else + { + /* End of tunnel */ + ModeX = 1.0; + ModeXFlag = 0; + return; + } + + cvCatmullRom(p4, t, &op1); + + ppp1.x = op1.x; + ppp1.y = op1.y; + ppp1.z = op1.z + 0.25; + + T.x = op1.x - op.x; + T.y = op1.y - op.y; + T.z = op1.z - op.z; + + normalize(&T); + + for (i=0; i<10; i++) + { + RotateAroundLine(&ppp, &op, &T, ((float)i*36.0*M_PI/180.0), &op2); + points[i].x = op2.x; + points[i].y = op2.y; + points[i].z = op2.z; + if (!flag) + { + prev_points[i].x = op2.x; + prev_points[i].y = op2.y; + prev_points[i].z = op2.z; + } + } + + if (!flag) + { + flag = 1; + continue; + } + + /* Draw 10 polygons for current point */ + for (i=0; i<10; i++) + { + j = i+1; + if (j > 9) j = 0; + glNormal3f(0, 0, 1); /* Normal for lighting */ + glTexCoord2f(0, 0); glVertex3f(prev_points[i].x, prev_points[i].y, prev_points[i].z); + glNormal3f(0, 0, 1); + glTexCoord2f(1, 0); glVertex3f(points[i].x, points[i].y, points[i].z); + glNormal3f(0, 0, 1); + glTexCoord2f(1, 1); glVertex3f(points[j].x, points[j].y, points[j].z); + glNormal3f(0, 0, 1); + glTexCoord2f(0, 1); glVertex3f(prev_points[j].x, prev_points[j].y, prev_points[j].z); + } + /* Save current polygon coordinates for next position */ + for (i=0; i<10; i++) + { + prev_points[i].x = points[i].x; + prev_points[i].y = points[i].y; + prev_points[i].z = points[i].z; + } + } + glEnd(); + cam_pos = cmpos; +} + +/* =================== Show splash screen =================================== */ +void SplashScreen(int do_wire, int do_texture, int do_light) +{ + if (ModeX > 0) + { + /* Reset tunnel and camera position */ + if (!ModeXFlag) + { + cam_pos = path; + cam_t = 0; + tFlag = 0; + ModeXFlag = 1; + current_texture++; + if (current_texture > 2) current_texture = 0; + } + /* Now we want to draw splash screen */ + glLoadIdentity(); + /* Disable all unused features */ + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + glDisable(GL_FOG); + glDisable(GL_CULL_FACE); + + glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glColor4f(1, 1, 1, ModeX); + + /* Draw splash screen (simply quad) */ + glBegin(GL_QUADS); + glVertex3f(-10, -10, -1); + glVertex3f(10, -10, -1); + glVertex3f(10, 10, -1); + glVertex3f(-10, 10, -1); + glEnd(); + + ModeX -= 0.05; + if (ModeX <= 0) ModeX = 0; + + if (!do_wire) + { + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + } + if (do_light) + { + glEnable(GL_LIGHTING); + glEnable(GL_FOG); + } + if (do_texture) + { + glEnable(GL_TEXTURE_2D); + } + glDisable(GL_BLEND); + glColor4f(1, 1, 1, 1); + } +} +#endif diff --git a/hacks/glx/tunnel_draw.h b/hacks/glx/tunnel_draw.h new file mode 100644 index 00000000..0441925d --- /dev/null +++ b/hacks/glx/tunnel_draw.h @@ -0,0 +1,3 @@ +extern void DrawTunnel(int do_texture, int do_light, GLuint *textures); +extern void SplashScreen(int do_wire, int do_texture, int do_light); +extern void InitTunnel(void); diff --git a/hacks/images/tunnel0.xpm b/hacks/images/tunnel0.xpm new file mode 100644 index 00000000..d3238a29 --- /dev/null +++ b/hacks/images/tunnel0.xpm @@ -0,0 +1,198 @@ +/* XPM */ +static char *texture0[] = { +/* columns rows colors chars-per-pixel */ +"128 128 64 1", +" c #020202", +". c gray2", +"X c #090909", +"o c gray5", +"O c gray7", +"+ c #151515", +"@ c #191919", +"# c #1d1d1d", +"$ c #222222", +"% c gray15", +"& c #2a2a2a", +"* c #2d2d2d", +"= c #323232", +"- c gray21", +"; c #3a3a3a", +": c gray24", +"> c gray26", +", c gray27", +"< c #494949", +"1 c #4e4e4e", +"2 c gray32", +"3 c #565656", +"4 c gray35", +"5 c #5d5d5d", +"6 c gray38", +"7 c gray40", +"8 c #6a6a6a", +"9 c gray43", +"0 c #727272", +"q c gray46", +"w c gray48", +"e c gray49", +"r c #818181", +"t c gray52", +"y c #898989", +"u c #8e8e8e", +"i c #929292", +"p c #959595", +"a c #9a9a9a", +"s c gray62", +"d c gray63", +"f c #a5a5a5", +"g c darkgray", +"h c #aeaeae", +"j c #b1b1b1", +"k c gray71", +"l c gray73", +"z c #bebebe", +"x c #c1c1c1", +"c c #c5c5c5", +"v c #cacaca", +"b c #cdcdcd", +"n c gray82", +"m c #d5d5d5", +"M c gray85", +"N c gray87", +"B c #e1e1e1", +"V c gray90", +"C c #e9e9e9", +"Z c gray93", +"A c #f1f1f1", +"S c #f6f6f6", +"D c gray98", +"F c #fdfdfd", +/* pixels */ +"FFFFDDSAAZVNMnzg,ihzvvvbbvcxxkgp;eahllzzzzlkjhau-qpfhjkklkkjhdpw-tagjkkllllkjgau-wpgjklzzzzlljfi;rdjzxcvbbvvvxlf,pkvMNBCZASSDDFF", +"FFFDFDSSZZVBMbxg,ihzcvvbbvvxzkgp;eahkkllzllkjgay-qifhhjkkjhgdae-epfhklzzzzlkkhdu-wagkklzxxzzljfi;rdjzxcvbbbvvxlf>pkbmMVCZASDDDFF", +"FFFFDDSAACVNMnzg,ihzvcvbvvcxzkfi;eahkkllzllkjgat-0udgghhhhgape-rafhklzxxzxzlkhdu-wahkllzxxzzlkfi;rdkxxvvbbbvvclf,pkbMNVCZASDDDFF", +"FFFDDDSAACVNMbxg>uhzccvvvvcxzjfi;wagkkllllkjhfar=9yaffgggfaiw-eafjlzxxccxxxzljfu;wahklzxxxxzljgp;rdkzxcbbbbbvxkf,pkvmNVCZASDDDFF", +"FFFDDDSAZCVNMbzf>ihzccvvvvczljfu;wpgjjkllkkjhdpr=9tadfffdauw=epfhkzxccccvcxzlkfi;eahllzxxxxzlkgp:rdkxxcbbbbvvxlf,pkbMNVCZASSDDFF", +"FFDDDSSAZCVNmbzf>ugzcccvvcxzljdu;wpfjjkkkkjhgdpe*8tpaadapuq-wpdhklxccvvvvcczljfi;eajllxxxcxzlkfp:rdkxxvvbbbvvxlf,pkvmMVCZASSDDDF", +"FDDDDSAAZCBNmbzf>uglxcccccxzlhdu-qpfhjjkkjhggaiw*7riappiyq=wpdhkzxccvvbbvvcxzkfi;rahllxxccxzzkgp;rdkxxvvbbbvvxlf,pkvMNBCZASSDDDF", +"DDDDDSAZZCBMmblf>uglxxcccxxlkhdy-qidhhjjjjhgfauq*5wyiuyr9*qidhkzxcvvbbbbbvcxzkgp;rajllxxcxxxlkfp;tdkzxvvbbbvvxkf>pkvmMBCZAASSDDD", +"FDDDSSAZCCBMmvld>uflxxcccxzlkhay-qudghhjjhgfday0&5qryte8*0uagjlxcvvbbnnnbvcxxkgp;rajlzxxccxzzkgp:rdkzxvbbbbvvxkf,pkvmMBCCZASSDDD", +"DDDSSSAZCVBMnvld>ufkxzxxcxzljgay=0uagghhhhgfapt9&30eeq7&8yafjkzccvbnnnnnbbvczlgp:rdjlzxcccxxlkgp;rdkzxcvbbbvvxkf>ikvmMBVZZASSSSD", +"DSSSSAZZCVNMnvld:yfkzzxxxzlkjgat-0uaffgggffaair8%17095&8tpfhkzxvvbnnnnnnnbvcxlgp:rajlzzxcxxzzkgp:rdkzxcvvbvvvxkd>ijvmMBVCZASSSSD", +"SSSSSAZZVVNmnckd:tfjlzzzzzlkhgat=9yadfffffaapyw6$<563%6riahjlzcvbbnnmmmnnbvczlgp:rajllxxccxzljfp;rdjzzcvvvvvcxkd,ijvnmNVCZASASSS", +"SSSAAAZCVBNmbcka:tdjllzzzlljhfpr=8tpdddfddaaitq5#:1<$4wuafjkzxcvbnnmmmmnnbvcxlgp;rajlzxxxcxzljgp:rdjzxcvvvvvczkd>ijcnmNVCZZAASSS", +"ASSAAACCVBMnbxja:tdjllllllkjgdpe*8tpaaddaaaiye93@-;@29tpdgjlxcvbnnmmmmnnnbvcxkgp;rdjllxxxxxzljfi;rdkzzccvvvcczjd>ihcnmNVVCZAASSA", +"AAAAZZCVBNMnvxja:rajkklllkjhgdiw*7riaaaaapiytw7<+$+<8wuafjkzxcvbnnmmmmmmnnvcxlgp:rahllxxxxxzljfi;eajlzxcvvvcxzjd>uhcnmMBVCZZAAAA", +"AAAZZCVVBNmbvzhp;rahjjkkkjjgfauq*6eupppppiute94:oX;5qtpdgjlxccbnnnmmmmmnnnvczlgp;rahllzxxxzlljdi;eajlzxccccxxzja:uhxbnMBVCCZZAAA", +"ZAZZCCVBNMmbczhp;eagjjjjkjhgdayq*5wyiiiiiute07<& #18euafhjlxcvbbnmmmmmmmnbvcxkgi;eahklzzxzzlkjdi;eahllzccccxzlja:yhxbnMNBVCCZZZZ", +"ZZZCCCBBNMnvclgi;wpfhhjjjhgfdpy0&4qtyuuuuteq84-oX*30ruaghklxcvbnnmmmmmmnnbvxzkgi;eahlllzzzzlkhdu;eahklzxcccxzlha>ygzvnmNBVVCZZZZ", +"ZCCCVVBNMmbvxkfi-wifghhhhgfdair9%30rttttreq84:O%O-5qyiagjklxcvbnnmmmmmnnnbvxzkfi;eahkklzzzzkkhdu-wahklzxxxxzzkha:ygzvbmMNBVVCCCZ", +"CVVVBBNMmnbczkfu-0idgggggfdapue8%28wrrrew074:+=-O:6eypdgjkzxcvbnnnnmmmnnbbcxzkfi;wagjklllzlkjhau-qpgjklzxxzzlkgp:tflcvnmNNBVVVVC", +"VVVBBNMmmnvxljdy-0uaffgffdaapye7$17qwewq084>+-,>@>7eupdgjkzxcvbbnnnmnmnnbvcxzjfu;wagjjllllkkjgay-qpfjklzzzzlljfi;rflcvbmMNNBVVVV", +"BBBBNNMmnbczlhat=9yaddddddaputq5$<60qq0974>+;11<@,7eupdgjkzxcvvbnnnnnnnbbvczljdu-qpfjjkklkkjhgat-0ifjjklzlllkjfi;rdkxcbnmMNNBBBB", +"NNNMMMmnbvxlkgar=8tpaaaaaapuyr04#,5798763:@:233<@,8ruadgjklxccvvbbnbnbbvvcxlkhdy-qidhhjkkkjhhfpr-0udghkkllkkjhdu;eajzxvbnmMNNNNB", +"MMMMmnbbcxzkhfpe*7eupaaaapuytw82@:266541;+:24541#,8rupdghklzxccvbbbbbbvvcczlkhay-0udggjjjjhhgdpr=9uaggjjkkkjjgay;wahlzcvnnmmMMMM", +"mmmnnbbvcxljgdiw*6wyiiiiiiyteq71+-1342<-+;146642#,8rupaghklzzxcvvvbvvvvccxzkjgat=0yafghhhhhgfaie*8yaffhhjjjhgfat-qpgklxcvbnmmmmm", +"mnnbbvcxzljhfay0&5qtuuuuuyteq95,+=><<,=O-<356652#<8eyiafghklzxxcccvvvccxxzljhfpr=8yadfgggggfdauw*7tpdfgghhhgfdpr-0pfjkzxcvbbnnnn", +"bbvvcxxzlkhfapr9&39ertttrreq972:O&-:;&O=,2466641@,7wyiafghjklzzxxxxxxxxzzlkhgdie*8tpadffgfdaaiy0*6riaadfgfffdaie=9uahjkzxccvvvbb", +"cxxxzzlkjhfaaue7$18qeeeewq0874<=o#&*$o&:1356664<@>6wtupadfhhkkllzzzzzzllkjhgdayq*6euaaaaddaapur9&4wypaaddddaapyq*7tafgjklzzxxccc", +"xxxzlkkjhfaaitq5$,690qqq008641:&X+#@X$-,1355653<@:5qryiadfghjkkkllzzllkkjhgfapt0&5wyipaaaaapuye8%30tiipaaaaapur0&6epafhjjllzxxxx", +"kkjjhhgddaputw83@:36788876531>=$.Xo.@&;,1244442>+;38weyipadffghhhhjjjhhggfdapue8%29ryyuiiiuyte05$18wtyuuiiiuytw7%3qypadfghjjjkkk", +"daaaappiutew084>+*,2333321<>;*$O o#%-:,,<1<<>-O*<579wetyuipaaaaaaaaaaapiutrw93#,59qweeeewwq961@:480qweereww083#,7qrtuipaaaddad", +"rreewqq997642<:%X+&--;---=&%#+o. .X+@$&*=---=*$X@=>1356890qqwwerrrrreeww008751;O&>24456665432,=o%:<3455665543<;O*,46790qweerrrr", +";;;-;--=**&%$#@o XO++++++OooX. .XooO++++@+Oo.X+#$%&**==--;;;;;;;;;;;--=**&$@.O#$%&&&&&&%%$#+.o@$%&&&*&&&%%$+.O#%&*=----;;;;;", +"iiiuuutrew0864<-o$-:>>>>:;=&#+X O#&=;:,,<<<,:=o%>3680wertyuiiippppiiiuuytew961@;36890q0009863,+=1578900009974<@;480wrtyyuiiiii", +"ffddaaapuyteq84>+*>132211,:=%O.. o$=:,134555643,+;49qetippaddfggggggggffdaaiutq6$18wrrtyyttreq83#,60werttyttew95$19eyupaadffffgf", +"kjjhggfdaaiyrq71@-1455442<:=#.O+.@*>146899000862#,7wtupadggjjjkklllllkkjhhgdait9%4qtuipappiuurq6%29eyyippppiuye8%4wypadfghjjjkkk", +"llkkkjhffapite83@:2566543<;%X#%$X$:14780qwwwwq85$19tiadfhjkllzzxxxxxxxzllkjgfauq*6eiaaaadaaapue8%4qyipaaaaaapit0&6rpafghjkllzlzz", +"xzzllkjhgfaiyr93#:3676541,*o%=-&o%,4780werrrre06%3qyaafhjklzxxcccvvvvccxzlkjgdie*7tpaddffdfaait0&5eupaadddfdapyq*7tadghjkllzzxxz", +"ccxxzlkjhgaair04#>367652<-O*:,>-O=169qertyyyttw8%5eiafhklzxcvvvbnbbbbbvvcxzkjgar=9yadfgggggfaauq*7rpadfgfggfdaue*8yaghklzzxccccc", +"vccxxzljjgdaitq4#>466531-O-,221>+;39qetyuiuiiyr0&6rafhjlxccvbnnmmmnmnnnbvcxzkhay-0udgghhhhhgfaie*7tadfgghhhgfair=0udhjlzxcccvvvv", +"vvvcxzlkjhfaptq5#>35642;O;14543<@:50eryiippaputq*8yagjkzccbbnmmMMMMmMmmnnbcxzjdu-qifhhjjjjjhfdpe=9yafghhjjhhgdpt=0ifjklxccvvbbbb", +"bvvccxzljhfaiyq4#>2442:+:2567751@,7qttipaaaaapyw*8udhkzcvbnmmMMMMNNNMMmmnbvxzkfu;wpgjjkkkkjjhdar=9uagghjjkjhhfat-qigkkzccvbbbbbb", +"bbbvcxzlkhfaiyq4#:131:@>36890973#<8eyupaaaddaaue=9ifjlzcvnmMMNNBBNBBNNNMMmbcxlgi;eagjkllllkjhfat=0idhhjkkkkjjgay-qpgklxcvbbnnnnn", +"nnbvvczlkhfait04@;<<;+>489qqw095$20ruiaddffffapr=0pgkzcvbmMNNBBBVVVBBBNNMmnvclhp;rahkllzzzlkjgay-qifhjkllllkjhay;wahlzxcvbbnnnnn", +"nnbbcczlkhfait03@-:;+:480wweew06$30tiaaffggffdat-qahlzvbnMNNBBVVCVCVVVBBNMnbczja:rajllzzxzzkkhay-qpfjjkllllkjhdu-wahlzcvbbnnmnmn", +"nnbvvczljhfair91+&*+:38qerrttrq7%4wyaadfgghggfay-wahzxvnmMNBVVCCCCCCCVVBNMmnvxja:tdkzzzxxxzlkhdu-wpgjkklzzzkkhdu;eahlzcvbnnmmmmn", +"mnbbvxzljhdaue7yfkzxxcccxzljfu;eahklzzzzzlljfi;rakzxvbnnmmmmmm", +"mnbvcxzkjfair03* #,60etuippiiut0&6rpdfhjkkkkjhdi;rdlcvnMNBVCCZZZAAAZZZCCVBNmbckd>yfkxxccvcxzljfi;eahklzzxxzlljfi;rakzxvbbnmmmmmm", +"nnbvcxlkhfayw7:OX*39eruiaaaapitq*7tafghjkkkkkhfi;tflcbmMBVVZZZAAAAAAAZZCVBNmnvld>uglxxccvccxlkgi;rahllzxxxxzljfp:rdkxxvbnnnmmmmn", +"nbbcxzkjgair91@*+;5qtyipaaaaapyw*8taggjkllllkjfp:tfzvbmNBVCZZAAAAAASAAZCCVBMnvld>uglcccvvvcxzkgi;eajllzxxxxzljgi;rdkxxvbnnmmmmmm", +"nbvcxlkhdatq3#>,@,7eyuaadddddauw=9uaghklllzllkga:ygzvnMNBVZZAASSSSSSSAAZCVBMmvlf>uglccvvvvcxzkgp:rahllxxxcxzlkfi;rdjzxcbnnmmmmmn", +"nbcxxljgaie5$142#19rupaddffffaie=9udhjklzzzzlkha:ygxbnMBVCZZAASSSSSSSAAZZVBMmvzf>uhzcvvvvvcxxkhp;rajllxxccxzlkfi:rdkzxcbnnnmmmnn", +"bvcxzkhdpt7%4774$20yiaaffggffapr=0idhjkzxzzzzkha>yhxbnNBVCZZASSSSDSSSSAZZCBMmbzf>uhzccvbbvvxzlgp;rdjlzxxcxxzlkgp:rdkxxvbnnnmnnnn", +"vcxzkhday8&60q06%4wuaafgghgggdpr=0ifjjlzxxxxzlja>uhxnmNBVZZASSSDDDDSSSAAZCBNMbzf>ihzvvvbbvvxxkgp:rdjlzxcccxzlkfp;rdkzxcbbnnnnnnb", +"cczljgay9*7wrrw8%5eiadgghhhhgdat-qpgjkzxxccxxlja:uhcnmNVCZAASSDDDDDSSSAAZCVNMbzg,ihzcvbbbvvcxlgp;tajlzxxccxzlkgp;rdjzxcbbbnnnbbv", +"cxzkgdu0*8eyyyr0&6rpdfghhjjhhfat-qpgklzxcccxxzjd>ujcnMNVCZASSSDDDFDDDSSAZCVNMnxg,ihzvvvbbvvcxlga:rdjzzxxcxxzlkfp:rdjzxcvbbbnbbvv", +"xzkhdpw=0ruiiutq*7tpdghjjjjjhgay-qphklzxccccxzja>ujcnMNVCZASSDDDDDDDDSSAZZVNMbzg,ihxvvbbbvvcxlhp:rdjlzxxccxzljfi;rajzzcvvbbbbbvc", +"zkhdpw-qupaaapyw*8yafghkkkkjjgay-wahkzxcccccczkd>ijvmMBVZZASSDDFFFDDDSSAAZVNMnzg,ihxvvbbbbvxxlgp:rdjlzxxcxxzlkfi;rajlzccvvvvvccz", +"khfiw=wiaaaddaue=9uaghjklkkkjhdu;wahkzxcvvvvczkd>ijvmMBCZASSDDDFFFDDDDSAZZVBMnxg,ihxvcbbbbvcxlhp;rajlzxxxxzzljfi;eahllxccvvccczz", +"hfpe-wiadffffapr=9udghjklllkjhdu;wajzzxvvvvccxkf>ikvmMBCZZSSDDDFFFFFDDSSAZVBMnxg,ijxvvbbbbvcxlgp:rdjlzzxxxxzljdi;eahllxxccccxxzk", +"fae-wiafghhggdpr=0idhjkllllkkhdu;eajlzxcvvvvcxkd>pkvmMBCZASSDDFFFFDFDDSAAZVBMnxg,ijxvvbbbbvcxkgp;rajllzxxxzlkjdi;wahklzxxxxxxzkh", +"pr;epdghjjjhhfat=qifhjkllzlkkhfu;eajzzcvvvvvvxkf,pkvmMBCZASSDDFFFFFFDDSSAZVBMnxg,ihxcvvbbbvxxlgp:rajllzxxxzlkjdu-wpgkklzxxzzlkhf", +"q-radhjkkkkjjgay-qifjklzzzzlkjfi;rdjzzcvbbbvvxkf,pkvMNVCZASSDDFFFFFFDDSAZZVNMnxg,ihzvvvbbvvxxkgp;eahklzzzzllkhau-wpgjjlllzlkkhfa", +"-epfhjkllllkjgay-qpgjklzzzzlljfi;rdjzxcvbbbvvckf,pkvmMVCZASSDFFFFFFFDDSSAZVBMnxg,ihzvvbbbvcxzkgi;eahklzzzzlkkhdy-qpfhjkllkkjhfpe", +"tafhkkzzzzlkkhdu;wpgkklzxzzzljfi;rdjzxcvbbbvvxlf,pkvMNVCZASDDDFFFFFDDDSAZCVNMnxg>ihzccvbbvvxzkgp;eahklllzllkjgay-qidhhjkkjhgdae;", +"afhlzzxxxxzlkhdu;wahklzzxxxzljfp;rdkzxvvbbbvvxkf,pkbMNVCZASSDDFFFFFDDDSAACVBMbzg,ihzvvvvvvcxzjfi;eahkkllzllkjfat-0idgghjhhfdpe-r", +"gjkzxxcccxzzljfi;wahklzxxxxzljfp:rdkxxcvbbbvvxlf,pkvMMVCZASDDDFFFFFDDDSAACVNMbzg>uhzccvvvvcxzkfi;eagjjllllkjhfar=9uaffgggfaiw-ea", +"jkzxccccccxzljfi;eahllzxxxxzlkgp;rdkzxvvbbbvvxlf,pkvMNVCZASSDDFFFFFDDDSAZCBNMbzg>ihzccvvvcczlkfu;wagjkkllkkjhfpr=8yaddffdauw-epf", +"klxccvvvvccxzjfi;eahklzxcxxzlkfp;rdkxxvvbbbvvxlf,pkvmNBCZASSDDDFFFDDDSSAZCVNmbzf>igzcccvvcxzljdu-wpfjjkkkkjhgdie*8tpaaaapuq-wpdh", +"zzcvvvbbbvcxzkfi;eajllxxccxxlkgp;tdkxxvvbbbvvxlf,pkvMMBCZASSSDDDFDDDDSSAZCVNmbzf>uglccccvcxzlhdu-qpfhhjkkjhhfaiw*7eiappiy0=wpdhk", +"xcvvbbbbbvcxzkgp;rajlzxxcxxxzkfi;tdkzxvbbbbvvxkf,pkvmMBCZAASDDDDDFDDSSAZZCBMmvlf>uglxxcccxxzkhdy-qidhhjjjjhgfauq*6wyiuyr9*qpdgkz", +"ccvbbnnbbvvxxkgp:rdjlzxxcxxzzkgp:rdkzxvvbbvvvxlf>pkvmMBCZAASSDDDDDDDSSAZCCBMmvld>yflxxcccxzlkhay-qidghhhjhgfday0&5qryrw8*0uahjlx", +"vvbnnnnnnbvxzlgp;rajlzxxccxxzkgp:rdkzxcvbbbvvxkf>ijvmMBVCZASSSDDDDSDSSAZCVBMnvld>yflzzxxxxzlkhay-0uagghhhgfdait9%40eeq7*9yafjlzx", +"vbbnnnnnnbvcxkgp;rajllxxcxxzlkgp;rdkzxcvbbvvcxkd>ijvmMBVCZASSSSSDSSSSAAZCVNMncld>yfkzzxxxzlkjgat=0uaffggggfaair8%27095&8tpfhklxv", +"bbnmmmmnnbvcxlgp;rdjlzxcccxzlkfp;rdkzxcvvvvvcxkd,ijvnmNVCZZSSSSSSSSSAAZCCVNmnvka>tfjzlzzzzlkjfar=9yadfffffdapyw6$,463%6riagkzzcv", +"bnnmmmmnnbvczlgp:rajlzxxxcxzljfi:rdkzxcvvvvcczkd>ijcnmNVCCZAASSSSSSAAAZCVBNmbcka:tdjllzzzlkjhfpr=8tpdddfddapitq5#:1<$4wuafjkzxcb", +"nnnmmmmnnbvcxlgp:rajllzxcxxzlkfi;rajzzccvvvcczjd>ijcnmNVCCZAAAASSSAAAACCVBMnbxka:tdjllllllkjhdpe=8tiaadddapiyr93@-;#29tpdgjlzcvb", +"nnmmmmmmnnvcxlgp:rajlzzxxxxzljfi;rajlzxcvvvcxzjd>ujcnmMBVCZZAAASSAAAZZCVBNMnvxja:rahkklllkjhgaiw*7riaaaaapiutw7yhxbnMNBVCCZZZZZAZZZCVBNMmbczhp;eagjjkjkjhfdayq*5wyuiiiiute071% #18euafhjlxcvvn", +"mnmmmmmnnbvczkgi;eahklzzzzzlkhdu;wahklzxcccxzlha:ygzvnmNBVVCZZZZZZZCCVBBNMnvclgi;wpfhhjjjhgfdpt0&4qtuuuuyteq73-oX*30ruafhklxcvbn", +"nnmmmmmnbbvczkfi;eahkklzzzlkkhdu-wagklzxxxxzzkha:yfzvbmMNBVVCCCZCCCCVVBNMmbvxkfi;widhghhhggdair9%40ettytreq84:O%O-5qyiagjkzxcvbb", +"nnmmmmnnbbcxzkfi;wagkklllzlkkgdu-wpgjklzxxzzlkgp:tflcvnMNNBVVVVCCVVVVBNMmnbczkfu-0udfggggfdaaue8%29wrrrewq84:+=;O:6eupdgjklxcvbb", +"nnmmnmnbbvczljdu-wpgjjllllljjgay-qpgjklzzzzlljfi;rflcvnmMNNBBVVVVVVBBNNmnnvxzjdy-0uaffffffaapyw7$17qewwq084>+;,>@>7eupdgjkzxcvbb", +"nnnnnnnbvvczljdu-qpfjjkklkkjhgat-qifhjklllllkhfi;rdkxcbnmMNBBBBBBBBBNMMmnbczlhat=9yaddddddaputq5$<69qq0974>+:<1,@,8eupdgjkzxcvbb", +"bbnbnbbvvcxzlhdy-qidhhjkkjjhgfpr=0udghjllklkjhdu;eajzxvbnmMMNNNBNNNMMmmnbcxlkgar=8tpaaaaaapuyr94#>5798763:+:233<@<8euadgjkzxccvb", +"bbbbbbvvcczlkhat-0idgghjjjhhgdpr=9yaghjjkkkjhgay-wahlzcvbnmMMMMMMMMMmnnvvczkhfpe*7riaaaappuytw82@:356541:+;24541#,8rupdghklzxccv", +"vvvvbvvccxzkjgat=0yafghhhhhgfaie=8yafghhjjjhgfat-qpgklxcbbnnmmmmmmmmnbbvcxljhdiw&6eyiiiiiuyte071@-1342<-O-146652#,8rupaghjlzzxcv", +"vcvvvccxxzljhfpr=9yadfggggffdauw*7tpddghhhhggdpr=0ifjkzxcvbnnnnnmnnbbvcczlkgfayq&5qtuuuuyyteq95,+=>1<,=O-<356651#,8eupafhjklzxxc", +"xxxxxxxzllkhgdie*7tpaddfffddapy0&6eiaaffffffdaie*9udhjkzxccvvbbbbvvvccxllkhfapt9%30etrtttrwq973:O%-:;&O=,2466651@,7eyiadfhjklzzx", +"zzzzzzllkjhgfayq*6euaaadddaapur9&5wypaaadddaapyq*7tafgjklzzxcxxccxxxzllkjhfapye7$18qeeewwq0964<-o#&*$o&:13566641@>6qtypadghhjkll", +"lllllllkjhgfapy0&4wyippaaaapiyw8%30tuipaaaaapir0&6rpadgjkklzzxxxxzxzlkkjhfaaitq5$,690qqqq98641:&X+#@X$-,2346653<@:5qryiadfghjkkl", +"jjhjjjhggfdapue8%29ryyuiiiuyte05$18wttuuiiiuytw7%4qypadfghhjkkkkkjjjhhgddaputw83@:36888886531>=#.oo.@&;,1334432>+;39wryipadffghh", +"aaaaaaaapiutrw93#,59qweeeeww0961@:480qweereew073#,7qrtuipaaaaddddadaappiytrw084>+*,2333321<>;=$O o#&-:,,<<1<>-O*<579wetyuippaa", +"rrrreeewwq98751;O*>24456655432,-o%:<3455665543<;O*,4689qqweeerrrreeewwq997642<;%X@&---;--=&$#+o. .XO@$&*=---=*$.@=>1356890qqwee", +"::;;;;;;--=**&$@.O#$%&&&&&&&%$@+.o@$%&&&&&&&%%#@.O#%&*=---;;;;;;;;;;--==**&%$#@o .O++++++OooX. .XXoO++++@+Oo X+#$%&**==--;;;", +"pppppiiuuytew061@;369900q099863>+=1578900009974<@;48qwetyuuuiipiiiiuuytrew0864<-o$-:,>>>:;=&#+. O#&=;>,<<<<,:=o&>3680qertyuuii", +"ggggggfddaaiutq6$18wrrtyyttreq83#,60wertyttrrw95$18eyupaaddfffgffffdaaapiyreq84>+*,132211,:=%O.. o$=:,134555642,+;48weyuipaddfff", +"lllllkkjhhgdait9&4qtuipappiiurw6$29eyuiipppiute8%4qupadfghjjjkkkjjjhhgfdaaiyrq71@-1455542<:=#.O+.+=>246789009962#,7wtupadghjjkkk", +"xxcxxxzzlkjgfauw&6euaaaadaaapye9%4qyipaaaaaaait0&6rpadgjjklllllzlllkkjhffaaiye83@:2566543<;%X#%$X$:14690qwwwwq85$10tipdfhjjlzzzx", +"vcvvcccxzlkjgdie*7tpaadfffdaait0&5euaaaddfdaapyq*7tafghjklzzzzxxzzzlkkjhgdaiyr93#:3676542>*o%=-&o%,4780werrrre06%3qyaafhjklzxxcc", +"bbbbbbvvcxzkjfar=9yaffgghgfdaayq*7riadffggffdaue*9yafhklzzxccccccxxzzlkjhgaaur04#>367652<-O*:,>-O=169qertyyyyrw8%5eiafhklzxcvvbb", +"mmmmnnbbbcxzkhay-qudghhhjhhgfaie*8tadfgghhggfdpr=0udhjlzxccvvvvvvvcxxzlkjgdaitq5#>366531-O-<221>+;48qetyuuiiiyr0&6rafhjlxcvvbnnm", +"MMMmMmmnnbcxljdu-qifhhjjkjjhfdpe*9yafghhjjhhgdat=0ifjklxcvvvbbbbvvvcxxlkjhfaptq4#>36641;+;14553,@:50eryippppputq*8yagjlxxvbbnmmM", +"NNNNNMmmnbvczkfu;wpgjjkklkjhgfar=9uagghjjkjhhfat-qpfjkzxcvvbbbnbbbvccxzljhfaiyq4#:2442:+:2567751@,7wryipaaaaapyw*8udhjzxvvnmmMMM", +"NBNBNNMMmnbcxlgi;eahjkklllkjhgat=0idhhjkkkjjhgay-qpgklxcvbbnnnnnbbbvcxzlkhfaptq4#:132:+>36899973#<8eyupaaddaaaue=9ufjlxcvbmmMNNB", +"VVVBBBBNMmnbclhp;rahkllzzzlkjgay-qifhjkllllkjgdy;wahlzxcvbbnnnnnnnbvvxzlkhfaitq4@;<<;+>479qww085$19rupadfffffapr=qpgkzcvnmMNNBBB", +"VVVVVVBNNMmbczja:rajllzzzzzkkhay-qpfjjklzllkjhdu-wahlzcvbbnnmmmnnnbvvczlkhfait93@=:-+>480weeew06%30yiaaffggffdat-qahlzvbmmNNBBVV", +"CCCCCVVBNMmbvxja:tdklzzxxxzlkhdu-wagjjllzzlkkhdu;eajlxcvbnnmnmmnnnbbcczlkhfaur92@**+:380errttrq7%3qupadfgghggfay-wahzxvnmMNBVVVC", +"ZZZZCCVVBNMnbxka:tfkzzxcxxzlkjdu-wagkklzzzzlkhdi;eajzxcbnnmmmmmnmnbbvczlkgdpue7yfkxxxcccxzljfu;wahklzzxzzlljfi;edjzxcbbnmmmmmmmnbvcxzkjgdiyq6:oX=37qrtuuiiuyr9&5epafghjjjjjgdi;rdkxcnmMNVVCCZZ", +"AAAZZZCCVBNmbcld>yflxxccccxzljfi;eahklzzxxzzljfi;rdjzxvbnnmmmmmmnnbvvxzkjfair93* #,60etuiippiut0&7rpdfhjkkkkjhdi;rdlcvnMNBVCCZZZ", +"AAAAAZZCVBNmncld>yglxxcvvvxxzkfi;eajllzxxxxlljfp;rdkxxcbnnnmmmmnnnbvcxljhfayw7>oX*39eruipaaaaptq*7tafghjkkkkkjfi;rflcbmMNVCCZZAA", +"SAASAAZZCVBMnvld>uglxccvvccxzkgi;eahllzxxxxzljfp;rdjzxcbnnmmmmmmnnbcczkjgair91@*+:5qryiaaaaaapyw*8yafgjklllkkjfp:tfzvbmNBVCZZZAS", +"SSSSAAAZCVBMmvlf>ugzccvvvvcxzkgp:rdjllxxcxxzzjgi;rdkxxvbnnmmmmmnnbvcxlkgdayq3#>,@,7eyipaddddaauw*9udghkklzzzljgp:ygzvnMNBVZZAASS", +"SSSSAAAZCCBMmbzf>ugzccvvbvvxzlgp;rajllxxcxxzzkgi:rdkzxvbnnnmmmnnbbcczljgaie5$142#19ripadfffddaie=9udhhklzzzzlkga:ygxbnMBVCZAASSS", +"SDSSSSAZZVBNmbzf>ihzcvvbbvcxxkgp;rdjlzxccxxzlkfi;rdkxxvbnnnmnnnnbvcxzkhdpt7%3774$20yiaaffggffdir=0idhjlzzzzzzkha>yhxbmNBVCZAASSS", +"DDSSSSAAZCBNmbzf,uhzvcvbbvcczlgp:rajlzxxccxzlkfp;rdkzxcbbnnnnnbbvcxlkhfay8&60q06%3wuaafgghgggdpt-0ifjklzxxxxxlha>uhxnmNBVCZAASSD", +"DDDDDSAAZCVNMbzg,ihzvvbbbvvcxlhp:rdjlzxcccxzlkgp;rdjzxcbbbnnnnbvvczljgay9*7wrrw9&5eiadfghhhhgdat-qpfjkzxxccxxljd:uhcnmNBCZAASSDD", +"DDDDDSSAZCVNMbxg,ihzvvvbbbvcxlgp:rajzzxxccxzzkfi;rdjzxcvbbbbnbvvcxlkhai0*8rtuyr0&6rpafghjjjhhfat-qpgklzxcccxxzja>ujcnmBVCZASSSDD", +"DDDDDSSAACVBMbxg,ihxvvbbbbvcxlgp:rdjlzxccxxzljfi;rajzxxvvvbbbvccxzkhdpw=0tuiiut0&7taffhjjkjjhgay-wpgklzcccccxzjd>ijvmMNVCZASSDDD", +"FFDDDSSAZZVNMnzg,ihxvvbbbbvcxlhp:rajlzzxcxxzljfi;rajlzxvvvvvvccxzkhdpw=qypaaapyw*8yafghkkkkjjgdu-wahklxccvvcczjd>ijcmMBVZZASDDDD", +"FFFDDDSAAZVNMnxg,ihzvcbbbbvcxlgp:rdjlzxxcxzzljfi;eajlzxccvvvccxzkhdpw-wiaaaddaue*9uaghjklkkkjgau-wahlzxccvvcczkd>ijvmMBCZASSDDDF", +"FFFDDDSAAZVBMnxg,ijxvvbbbvvcxkgp:rajlzxxxxxzljfi;eahklxxccccxxzkjfpe=wiadffffapr=9udghkklllkjhdu;eajlzxvvvvccxkf>ikvmMBCZZSSDDDF", +"FFFFDDSAZZVBMnxg,ijxcvvbbvvcxlhp;rdjllzxxxzlkjdu;wahklzxxxxxxzkhfar-eiafghhgfdpr=0idhjkllllkkhdu;rajlzxcvvvvcxkd>pjvmMVCZASSDDDF", +"FFFFDDSSAZVBMnxg,ihxvvvbbbvcxlgp:rahllzxxxzlkjdu-wagkklzxxzzlkhfar-epdghjjjhhfat-qifjjklllllkhdi;rajzzcvvvvvvxkf>pkvmNBCZAASDDFF", +"FFFFDDSAAZVBMnxg,ihzvvbbbvvxzkgp;rahklzzxzllkhau-qpgjjlllllkkhfpe-radhjkkkkjhgay-qpfjkkzzzzlkjfi;rajzxcvvbbvvxkf,pkvmNVCZASDDFFF" +}; diff --git a/hacks/images/tunnel1.xpm b/hacks/images/tunnel1.xpm new file mode 100644 index 00000000..ba1e71f7 --- /dev/null +++ b/hacks/images/tunnel1.xpm @@ -0,0 +1,134 @@ +/* XPM */ +static char *texture1[] = { +/* columns rows colors chars-per-pixel */ +"64 64 64 1", +" c #1b0b06", +". c #2a160c", +"X c #2b1c15", +"o c #34180e", +"O c #361d16", +"+ c #280d07", +"@ c #382718", +"# c #2b2416", +"$ c #392925", +"% c #3b3426", +"& c #4a2918", +"* c #472c24", +"= c #483728", +"- c #573729", +"; c #573c36", +": c #493a35", +"> c #643e1c", +", c #4a1b15", +"< c #584738", +"1 c #4e4431", +"2 c #674d38", +"3 c #605c28", +"4 c #595248", +"5 c #5f4a46", +"6 c #655448", +"7 c #675c52", +"8 c #6e4f46", +"9 c #6a6457", +"0 c #766b55", +"q c #797065", +"w c #3c4e24", +"e c #867a6e", +"r c #907155", +"t c #958a76", +"y c #8e8a75", +"u c #b5a27e", +"i c #a59a71", +"p c #9b9787", +"a c #978c81", +"s c #9ca68e", +"d c #a69b88", +"f c #b49c8d", +"g c #a9a286", +"h c #aca693", +"j c #b5ac98", +"k c #bbb499", +"l c #b9ae8d", +"z c #b9b5a7", +"x c #acadac", +"c c #c4ba9a", +"v c #c8b18d", +"b c #c5bba7", +"n c #c3bcb6", +"m c #cac3ab", +"M c #cac8b8", +"N c #d4c5ad", +"B c #d7ccb4", +"V c #d8d3ba", +"C c #e8d8b9", +"Z c #e4da9c", +"A c #d6d5cb", +"S c #e8dcc8", +"D c #f0e9d2", +"F c #f4f4e9", +/* pixels */ +".:&=<5<:::<=<0evnBDSSSVbdaivnbCFj=*47$=:78ti0eetqAbBgbhMNBvldhkh", +"*$@@$oOO@O#:%**:eMzbbMBbfhdhfbBAh=@15:#X%287=-&*r80sDDMcBCmbbkbbkVm", +"5O* X$.$%1<:$..4xzkkkxVVBttdhhhe<;&&&;02<2&&-8esFFSBlmcmzkjmszk", +"*.$@@=##@X@:%#O@9jghbbskBjdadkhhp2*o=@><-<488:5ehFFSBkBmzmbzbszp", +"=@*O.@$=O@#oo&X$9zmkBmkmVMmgpxjxq1. X&;2<<<@2=2raFFFBulBcbcckhhg", +":#XX@#@@o.@X#$$$7kzhcMbmMzziaspp9@$%=X*:1=,*52&8aFFFFCSSCvuccxhh", +"X#X##X#@@&=:+#%@7mBdgbASzAppqeep4%:@=$*---&&<--6eFAFDSDCDCbckAhh", +" .#@@$@%==:60@XX1gkkhmAAnzsaeeasq#@@#$OO=@$=;=@qjAADDCCCDNbjxhxp", +"149900tyfeyuht976@=97eetqaqq9q9999qe0ihkhyghjpilaq7:6evbbfvdtteq", +"*=15<2@@#=@X=4szzMmlVhSCclkNAe=$*228*62&.@#.@", +"1fNNNABvbkcbFCDDi<262:-7;*:$=#=<=7-*4;%", +"3hfjlubBABSMAbuv9X*=15*,<**@@*O19nbzzMSmbjzAbdpd4$@#. ,@-2-2=:->", +"1pdhjhtkbBSNbdph7..@o:5:%::<+.@*4ABAMCzndhxzldhgqX.o,,&2-;*&-&-<", +"1yadgjmBNcvbjpdh7XOO*::%@@,@O.OO0MBVVVBbjznzfhdd9.X#O*<2-,;-2226", +"wyyydhbBANbjsfph7..XO=-1:$OX.+..9MmbVCBkhbhmhjdd5 .o.118-<,*0338", +"wipddjfbBNAzhdpd4X O$*$;4%X++.OX5mBSmSmblimbjhdiq@o@&*22>2,>2>2-", +"&tkdtdjzbMzhsihp7# .O#@:$XX@O.+X6bbBmAzztcjjhhhjy*2<**->*&o-2212", +"%pdtptpzhbhhhxhpq.@X..@%$ X +X.4xghzjbbphtlzjndy@o-=ooo,=*<<2--", +":ggdatddzbjfpaye7 X +$X... .$X4jhhhbpapphdbjzAd=o,Xo o&,&<8<<", +"1hhzjfnvvzaysdye1. $..$ #. X XX;dpbNbhddgtkjghxq=Xoo&#.o+,@13<-", +"%jhlnbMnnhpaddey4 .X #$+ .+X# c #495956", +", c #5b635a", +"< c #586965", +"1 c #675a45", +"2 c #67604b", +"3 c #686857", +"4 c #75654e", +"5 c #776b55", +"6 c #7c7059", +"7 c #797666", +"8 c #6d736b", +"9 c #445e64", +"0 c #74807c", +"q c #7c8882", +"w c #84745d", +"e c #8c765e", +"r c #846a54", +"t c #8a7c65", +"y c #947d65", +"u c #847e74", +"i c #8b826b", +"p c #898675", +"a c #98856b", +"s c #948974", +"d c #9b8c76", +"f c #9c927b", +"g c #a58d75", +"h c #a8957a", +"j c #b4997c", +"k c #a4866b", +"l c #9a9686", +"z c #90948a", +"x c #9ca09c", +"c c #a99984", +"v c #b49e83", +"b c #bc9e83", +"n c #aca08c", +"m c #aaa397", +"M c #b4a38c", +"N c #bca68b", +"B c #bca284", +"V c #baa995", +"C c #bcb29b", +"Z c #b8b3a6", +"A c #c5aa8b", +"S c #c3ad95", +"D c #c9b498", +"F c #d4b99a", +"G c #c8b8a4", +"H c #d4bea4", +"J c #c4bfb0", +"K c #d9c4a9", +"L c #d7c8b4", +"P c #e6cdb0", +"I c #f3e8d1", +"U c #e1d4c3", +/* pixels */ +"XXOOXXXXoXX#XO@#XO#OOO$#O$##$$OOO@:0ip8O$$OOOO$OOOOOOOOX+.+++++O.+XXX+XXX.XXXXXXO+++OX.XXXXX.OXXXX,8-XXXXXXXX.XXX...X.XX.Xoo@X.X", +"OOO#$==>>::,:,<,,,:,,:,:,<8<<8,,:80s00p3:::>==#--$;:-$->$$$$@@$O#$#O#$O@OOOOOO##@+O+OO@OOX.#XXXXO>888;@@O+@XOX+O@#@X@@@@=@#====#", +"XOO$:=@>->-:=;=,::::<8838738838u63706:3,;3,,3,<8338<368833838833,3<3873<8833888<<88<3<883,<<,>,,88783383,,,,,,,,,,,:>:>>>-;>->#O", +"OX@8mJz7:,<:,<833888z7878<877uz8,3%200l0p03070888833<,,<08,23,-83,,,,,,>,$,,:3:,,,,,,:---:::-,33,,33:--:,;:,,,,,3,83383888838<>X", +"<3slcmllllmxmmmmGmVSmVGJCCCSJCx;--,0JFLLKKDDPVDCKKLLKDKGDCCnVCCKfnCZGGCmGCZVJZxmCZlllzlmmzxlzx0:=-,8pxlzl0nlllzxxzpzulzzzcxusuu8", +":,sccllulvcSccGHHSSHSHbGM3-37:;%-;:8fDDSDDFFZHHKKCMKGPKKPKCLLUKFLLHLKLnKKSLScHGSDCGVmLCNVscSs&=+++OlV5lhVnCMGVVVmGGVVcVmmMnSGcuu", +"qslluyscCcvcVSVDcMgclcMASt;3-%8=#%#7Vc4nfMghhndMlhMst6lsn0isis207;fNcawdVCMChsasVSCDnfidMKMhfs@@+@+laKSnDcDhjNccdvallheySMMyccuw", +"ulVulzcyytacttdauycuySVcggGatcdX$-#zKMFslnMediahfhc6clfaf36nipff3iddinnaisitMsf7iwuiMs8dGcdu62@X@@@fNadjdcydhdttlslcvhchyyyyuwuu", +"uwu5zsdhVglswccccMadcdf6tt7DsclX@#$zKhhhagjjjchnNhhViaasfMMnhdhiMdchaNdhh6cMdvhhNsicaicChSdSin-XX@XchggggsnanacccNchslffdlcgluz7", +"wullnycctuhccSdscscehfhjds7ttp6X+@@mSAdjDAhbABcienddDdhDniiaNwgjfiaawdhhlcsaDggcchMapfDVFcssa6XXOXOmVjchMggdccNhcyvcccvcvuglynly", +"cyctsdcsfgyygircwiiinHhMSadn2ipX@$$LNjhhgjDbjheMNDSaaaDwaNjheVaf4gh6hhi1iwhaBhhh6addiwihntiiNt.XXO%nhjjghjhjhfVhMtahfsahcngdgsgs", +"VugyftftgVclhhsccGhnM5nhawr3o58XO@#LadAASAAgghMShNnhjNhgDdhaMiaFAhMFSBSSDaBSjhgAhnjMwiiapliyttX.++:ZBBNvhgcgvMcvccvscccdcglgydly", +"ulttslscMctsudldafyacnihwsM3Vi:O@$@ZhHjjagADgBkjjgjghBaiaahgnhhjveid6adahghkjjkjgaygjc7d7icDS;o.+O8GSjgjaccdchdhhddckihddcfhlugd", +"lylgddtd5tcasdyCditah1MMdnncd&-X@@#ZMDBAMAgkjBAAaDajjaihCgajCADg5iAihhaNhBBhBagjwgaMDscMMnchg;XXX@3GSjhjaggcghtvyhgscccsSylctnsc", +"gnluwgcdfhcmvMvhtclhMjhid&s7c>-X+@@ZLAhghjjgDgjeMaNMMDgh6haMjj5;6ahidjNjrjNAjhyhSgt5a4sVGscat2X.+O,DMgjNghvvgchhshhvvidtacgsdtyd", +"dt6tactfVtdhssdasfansicincfth1;oX@=DDjhDagAjyhjVajjjBahaNhn62hsMDji5hh6iNjgkjkDrghVKNcsNw7ihd3X.+#,nhgdhcdddadpiahghvdhccfcffhvd", +"2sdflhss6dcwtdtsdcMhanwc6iahDn2X@@@GGycggcNgbjjhgvFjaeMAhhaA4udgiadNMgMggyjghBaAjk6*2csstdmcd8Xoo@>SMbggedihMassgcgktcdndaisseud", +"sfcsdiwsncdaasgtcddMlhMMamthh2=XO@@GFbgygbbbgbjkvMaakahgB4dtSMrhVehgcs6HDaihhajhjkaKjaGMKstp53XXX@=GNgygMcjhtghdcf65cdaahhcciufw", +"tdcaiMfwtdsaVatdifdjahCaM6nsdf@O@#XJGcygMgyvahjSSgdhNBNd&aMttrvkiFFcwwV4;1VNkBrgjhNiaM66tut3t%.XX@XVbycjavgNcccdtsfffsddacapadhM", +"diahdhijnatcians6Mi3indadfhiht3O@#@GAyHygdMttbggaavjagggfVdcSMhthi6hPh4npiSahhasa5aha63ivNlvt;X.XOXmgchhvchghagvcthcgdddchhftsg5", +"cisahhldhdidVMhCDnifmfahnMMdhv&XX=%GbFyybaykHvgjgFagnddgDgig65igacVa44Mw5Vy5n76666adaffAHctgg;XXXOXmAhyyehcvaca6bcdidcdstshdniiM", +"6schiwdwntnMwahtawai5anhiiadhj-OX##mFgvbjyADbAgvhhahaaAjg45gChyiahawhhejaAMjh;i5fwsaffwhc1ccl:XX@@Xcgagvchbadywc6yhsth8ldgsaaica", +"wsaddeiafahwaMdiadaMChjCwhnCMh%OXO#GAbcjhSgShvhv6kNhahjtaaANhaNNt5gVkhacaihheNhMsiagNMNMVMstc-XX.#XmgyhchcycctNaMic5cs5cdcydfhid", +"DsisidfceawdcMwadFjn66niShVwth&OX@@HFbccykvgbhvwShaawwi6thwtiMwgNggyjiaacaaaa5hjDjNhawhahh1swXXXX@oMchhhhchvhcwcthdcvtccchnassii", +"ttc5ccauiicjdisict3;sccafnacngtX@@=UHSbcjVbjekyhaat4jFjavgVhNtaceaBawcVgvdMghjahhaghafScVMsfs=XXXOXcMryVaaMyMegcivaicahgistddwss", +"Mt56ligyvhcaaMdatf1lthgch6NdMg5@OX>HbbvyhAjkkDnhaiNDhjhhh6duytdtai4ahadecadwSNcfwdwsy525gtist3.XXXXGcvgcwDMMeMgtftihgtcldfhvdgha", +"tifMtthvsccwcwdvNccsndudycSgajw#@#=HPKyvdajaBaghejasghgakDdthsMtdMidgaaDdnNh3;1wwf6CDnnhh83ty:O XXomgygcBaahtadcdhcdfcdcdcsdyffs", +"6cttn5ctst5ttscdbvhMhcvcccvddNf+@#=JHgSbajgghhBaeAciaBMSttdhatitaihDwa5t1dtntchvhsVi4wMMcvdcf8X.OX@VSgygtdcdcaieasdhssyccchdzydf", +"cifsssfzststcdBNtdffhs6tVgvadA2@X=@GjghgCnhdaakcBjagh5ctMdtdgMNnhhg6ccDhSc4avv6iaVjsfniMscdvgfXXX@ocgyjjhacidlcdhdtcggchhiycscgl", +"tctfifd4afacnNgdDhutcfcpgNdScN2XX#-JSFDdfgagacMaecDggNggecsghaytah6sBSitgwcvhg6cag40i6ai1;uft%XXXOXNDewjyvMSvctstsgtcscgdlcsdhsf", +"mtcsfauhnMcfc6Sau57mthcdcMDaVjc-X#=GHbaacDggwaghDtehcccgetydgwVg7htMedicjNSgcacsfsMcNhhfcGcts5X XOXSbAvghgtdtssdhdclachccahisacl", +"slccfddsatdftdrdlwVcf6ucHcartbdXo@%SjbNVghhcVGehaaVdtiasynMMctsctghcA6Miy5edtMct*wwf0wMhwvcvc&XXXXXnbASyyacdsiwuchyilhayfdccfacg", +"t7fwthasCsiddcft7cw4uwdhpwVlVF5o+@@CSgScgvcjStVhNcjcvMGvVghcafhafSdccMrlcccvCdwhVMgydcgtgc6hc5X.XOolFbycccgydycsttncdtfclcdpfdia", +"clcsVdlcidtptissmcwZsncsdiadteh+@@@cASjgcfvjVeaDacNchcytVcMd5tcncatcshgytdhtcyahctlgaMdac4ss6-.XXOXZbbyegMMguchsvlsycccfstsdciic", +"6gdcdtwttsMhsccffhfiuscMsmmcnjs++@@mgkghhcuVhScMDcfdMtVncastVVjifsccassVcVMchhDgcgcclyysvcScc;..XO@GSyyMyyccccdcs6lgfauscccfcscn", +"ccdsgsdmccsualddhMidncMhflKsdhioXX@nFAjjsdchcsSc73hVvfaChMcmaiMacdstccgauwt1fwdceec6cydcyNyt3-.XXX@VbGuSjgyuvssdccccfstsctltscss", +"snssscgutddtlMcndHhldfnsfi4Mhido.X+fDbjadjVds6&t6ifcddjadcsctvaNcyptw6MawvdVMhtgSccSvvSbNvjc73X.XXXVguMyAbccueccudfdffsclcchsdfd", +"nyyssdlvcccSccdti6fhhAisljVaaD&+.@OfubAje5wdanKVLD6ijnCniGgAFNSANhvSDHjVhHvcMMVDbvNySutd5Mct5;.XXOXmbbevcctGcNycvccccfNcscsdtdsa", +"nlldtutw6wi61afVNi3taictfeeVa5+.XXOps6g5thc6dcyyjdsdhhMNcchvtitwadNidyahNAaaaMaht5t7MvdgVMaal>XXXoXmvygVagcMbcbcidhfpdddfshhfccd", +"8553533323;333;2;&&-&-&;-%;;+o++O#X83o@%%%%@o%2ldafii522&3556tyHtisc6p7s4uii6piw7ydF64s&%;ac;@XXXoXmcVgycllgygldfspttutiuiii0667", +";=%-@@+@X@====%@#@#@@#%#->=%-=XX@#O38+@@@@+#@@+o++++@+@@##@%%+@@+@+%%%@@@@@@@+@@o=X%%:@%#@XoXXX.XXoz42&112=;%@%%&252;;-;-;-%-;;;", +"XXoXooXO@@+X++XX%@###%@#;-#-=XXX@OO8;73%%@%@@=@%+++@@@#@#--@$@#@@X@%#@#%#=#==@@@=X@@XX#%X=@X%#X.XXoz,+X@+oXX+ooo8XXoXXoX..ooXo+X", +"XoX.XXX+oXXXXXXXX+XoX@+oXoXoXXXX#@#@.@o@++@o++o++++++++@@@@@@@+@+%XX++@@@@@+@@+@XX==%XXXXX@OXXoXXOo=%=XoXOXoXX@XoooXXXXXXX+XoXXX", +"..o.oo....o.o.oo...Xooooo.ooooXXOOXooo.Xoooo+oXXo...oooo++Xooo.oXXooooooXXXOoo..oXoXooXXX...o.o.OOo. . . ...o . oo . ... .o", +"o X.........o..o.X.X.XXXXXoX.XXX@X@XXXX.XXXXX..oX.X.OOX+Xo+.......oX.o..XX...XX.X.X o.o.. . ..XXOOX. o .o . o ... . ..", +".....X..XX.+.XXOXXOXXXXOOOOOX#O$$$##$++OX@OO@OXOOOOOXX++OO+OXXOXOXX+XXO.O.X.XoX....XoX..X.X.X.XX.X.o . . o o . ..o.", +"XXX+>>>>>$>9,9,88<,,<<8888888z89X#>8ZUZ0<,-->>>>#--#$$$$$>=$-$$@$@$$@$@#$OOO@$$#OXOOXOXXOXOXOOOXOO$O>,=XoX#o..X..X..OOXO@X##$$#.", +"+X+8038ppppsmmmpmmmlCmVGVKSGSccHfmKSciMKLGcJZmVZZZKZZZZLLZCZZUZGZJmZZZGZZZZZZmxxxmmxxzxzxxzxxq#O#9>xUUUGZxzzzu0u088878888777u7#.", +"XX,Z3sVVMJGgSDPDHLbcGSHDHDDSDPShHDSdcGNSjSDcybyFSbSMytydsgjkhhctw7wMMayyMrgrsyNbFvFPPDhcMVSyyvu=uGcLecclrcbbMDSvSVcmVDMMVGGGMfXX", +"XO8spvNJGvhVHSVcvcVHyLVHDHAKgheShtvyVNDHULFPHSKFAPSMDHLHHDKHckVVPKFPbDLLGLHLiuDcSAaSgHHGPSGHclyGHwccHHHSHHPGHcc7tnc4Vigacygggu%X", +"OX7tgHcdptmlsslncccMyccDcVHaDvmcNztSncVyscPyvKDDbyMycycagvcvaGPBwFMccvc2u1yNgNHDHGvjPbaCyudvGHwwmmSGcgdsltVSHHMhwlyLtVVcdsscv4oo", +"XXzcFyczyhyastdVnycuSbgl4f7amAsScvVceVMsVtdhccgygMVSSdgMSu5djvwNhcs5vCVwGcMwtMaGhHvhjhMnclcMmlMGgJVlwcrllecccbMVSNGcdhMfwcVNs2X.", +"O@VgFgtltDCcVdVitdnnclgcVnSnDGSMMVylmvcwVcsDSgMMhSjcbcvvaVcVNvckcgbSGvghbvcgstcvcvMSNSADNSymyccMGVcyycgAgGVcclsscvcdMvatcgdvt=XX", +"O=GcSccctftttcfVmStylgcliMcwMtaccyyyySccacKcvMhMShddgcbAjtcg6chDcVghdtNgVAvgctSNMavecvAvSScSVcrvrgymgJgccyydcsygcchcddMcs2cgy;XX", +"X-SyvccucdtilccansmccMvMKchdaVchlyGlbvgvhdhuyhMVjdkSDyySccahSyctdgdgVNjNahy5lbDSNraSyASAVNScgVVcgdywGycdytmVyVVngccccf55tDvNw&XX", +"@>Zbvy5yn6pcMsMcacdfcSscwMVDGhhsMccncDSgaNccNHNiasbcDDHcNydMcMhvVGShgyvASGassVAgMhGahHDhySuGMVcgcynVdwygcGSychscdaycuwasVyau2X#X", +"O=cgbydsctmffcddcdfdC4MMMhc4thcNctyyvNaGMiSAhh6cVhftygySBhhcydbhADMNgfSadyNaMgDDec54Mhh1c5uvlruclcaydcSvgSgbjsccHdaChSMctitu3@XX", +"@#lSGvcldsycn6scslMcpChnaMcfccadccgHhMcaMchhtccyaatvDVVh5MGDjvBvA4sDrMhyjgvNVgvrtgch4ec3ucHvchgcswdtVcyCghySaMfvcshaVt6ws6lc6;XX", +"@XsvgdtuivlacsMdMds6hwStwdMhMdMFVcGcCdtfaSvGhSScNcNvgyDyNBkvSjhha7lgcDjhbehSyAthSbSFPFDhUcgSSSSSgaHacscsdNvgdtyccwtf35lcvsftt@X.", +"OXzgbhscdlMMaCitstMgcdhMnMMVwaadcc5cccgGSNhhVtchvGHNhjvAgaGBeAgaHtuytgvStSGyhKckhgDhNjwagrcScgMMvcgNyGySvaahhcceahncccdtstcf5=.X", +"#XpvcrflissdfcincchsMdCVahhaDCMVVvSdydjDSSiSNGjDhaytnSSe4SddSSvcNitdatchkFbghaaLSSjVhhcVStSctVcdctMgdahtahgVg7dMVhattyvcMsccu+X.", +".@zcv6dfdccVMvMVacSVcNcatsadjehhvcwVdaNbijKCkhSAjShyMhhcvAvayaMvNNcHMMjcdycGjASaSHva4jSNadHyMVwyh6scdh4yMdy4yhdsjcSacdtptff65@XX", +"@XuccthcsccsdswccVgiMhaSKLLSiaCdHgKyNujcjggdtDcaFhMVSdighAbSHSyAhhGScSjSaHcjvNHNMdvcSFNvSMyaghwVszVvaMSvjhSjSdcdVatthdgcmssst%XX", +"XXlthhVsfiaccsCaiaMcnfMwngjnMVhhgvlsMMftvGtSwhdNyVjjaGGDSDcMSSADvvbtgaSSNSDAAv5jaagycMgvbGHHNKHgvtVNcdddaiwacivcNchvVcMNttsct@XX", +"O+z6gcwztsVMaacsMfhMetsjPBghCNSGa6VtctmcFdhSNSchAgvNtNhADvg5jhvDtHVNcNgkyg5ucgSjSPSHGtDSgVMdGcyyacywycygNgbyycahgtfdtypsfc5h6%X.", +"XO76VcdtmftdMMDVMahMasVaBFA66hihMGcGcccjMSMgBggcdSSNSvahAADPFcvyAFScVacbghcbHcvShgNyhbGyyMSctycgggkbVyjctyhjhhjMcLwtcMaMhasi6%XX", +"O+pyBtcMi6nnyHvDdaScVMSaAa23iSFDgacttdSLtVhSgvFSvjahvahvyevFNvADvNASaaGcuSvFawDabvcNVyyHGcggAycttccDtdhattthiytcattvMdch6usc3%XX", +"X+pvShta6tcinchtwsnsgNaNh62idnaScyfdhchwDhaNVvhjgNA6GcbaGbAjwhgjvvdhGaagDSFNNcaycbbgMDGyhyHNdgyvSgygatvvcvNNdtytvhc7gidtctdv5-.X", +"X+zKy5ssinchii6t7dsdGhSdaGCgDMhncsVwgNDDgaaStcSDhSSyavNhagjyvwftdgVdyHMySAyhtVgcbgtdhlgbgcb4bSSvg4vStVt1iiSgggVidttcySdvnddu5%X.", +"+XibncMgsavtcvn5picSMgjMVehjM6cDcMyvKLHMhdScatcrda4bShdeFeAbggDgNSSdydySStvgywjgFvaywt4gegbDcc4gVjagGycwcakNMaMdcatcachdddsf3%X.", +"XOpgsctpmcdMhcs7sfLSDMSjhhALhdHhyvcSMrg5tiDBvhdcvhgkFSSPhvjgAbDjPyddbMyaebjaDKguggvSHDMjSMclycuvaAVysckcdahatgidVhDMhMguagdc2+.X", +"XO7af5scycgcMcthdcKDwMNhVKSwSKhNGawwNSMLKKSNMDvhcGaKgkaawbFbgbAagccjHcuSddArDebvSgljcAbMSKgDvybyatwacajhgc4d76aMggctsaMcSsMc3X.X", +"#Xugccc6MMddhssGVLDwifhMhniNhhhDyNNDvvAbddyyAaNhvvSttSSSAKajFMhASycgy5bHcSbysMHMcjaSckFbrNvhNDjnNjDadVvVNvDi5wnaccdfcifcdaa7;+X.", +"XXughdtddhcflcdDNVtjVKgcjjhMDfjhCyaGgVDNMaShHvS4gcglMSFShjAMjDgBgjvgFgbeybjGSrgydHbavStgSgNNccNvycyavNg6MySbhDg5ccicMMdccsnw;O..", +"XXzHatd6VcccaaKDBidMiSVhMCDhhCShcc6tcMacScFFvvvDvNgaKHjgahnhKaehbHbcchScvSHabLAGSgMMSjSgNPcMMSVhyNcvhvdvhjvhhgvVafhadaNVtadu8@..", +"XOubgdtfsdffhGtttdjnhCcSjnhgjgFwcaHLKSgvyNh2aGcgdyFHAkMhBNhAjcVjbycbSFAKNSkyreggSeyHGrbSScaedthnGMgNDhbgvNcMcvctsvcGVcMhddiu2=XX", +".OpSatwSinchScaiVNMGhcNnjDjMnKAhGSSNgSAvLKSnygtSHSyt4vcFMMeiSajNFSjSgAArkHvHGFGvbVScjKFDgcStGLVKdtSGchDcVFcvS5cscfdtfccalca7,O.o", +"XXihw6MisD6hiVcMVcMjKVDdAaNDnjDFbcDNSSjHgldyDSNggggDSbdkFKHFkFAjygFgHSygAycSvAyvggggbccyhGHcasi4tGv62tMttyantsVssccvatscfwci@+..", +"XO0AdacjnaancdfVchVSNMKNMVhidhNaSSvavgGadchVASVvjMbSHkgciawFDjahyHSvdHVFSMvNggdgvccHyVccVNjtVMmhDAstclSvyccgccaccfS6ddfa7cs;-X..", +"XXpNsnDVMcMMMNcShGdGhcBNHDVGPLhKgGdcsGggvgcgSatAKNgMybLdgCnaABhkjkyaMtvDgyFDPHDHgbjPPchDVFvVMa6MKa6PhdVgglVSvcdctcShnDhcMas63X..", +"X#pN1rttsyffstcaVSFhDSnKVhn66iwhScyJChSSPDnDKHADgjPSjSjcDgFKDjKDAbDKMgDPKSNhjihiDFNhaKjhVhgaGLiSafhhFiichiMtdVtmaahcccahwc7t,=o.", +"XOpVultt7u723;1722;;;232266;,;06343542d6a6pt45iwaDfhsasNKVhiMBaiSDjtwtcafdwhei0lBhajniiMjnFShHKKnpDNhCKCaDDMNhNvcMS6kii572;%-%..", +"XXzs7uut7333883>3::,,,:;;--;>,::--8:;-=%-=---=;=--&-&%%&;&&%%&%%-;&&@@=-%;2;%&-%&;&&%-%-;&&&22;&&%2%&&;&%;%&;3;;i127;3533#@+O-.X", +".X85,257,33,,,,3-;;-;-#%-##--@--$==--#,=%-=#----#=-@==#=@=@#$%@%-#=--=@@-#@@#%z-@#$$#-@%@####+XO+@@@@O@@@#@#@@@@+@@o@++X++O+XX..", +"XX8=#===%%%+%%@@@@%@%X@%@@++@@+@@@%@@%@+@@@@+@@%@@+++%@@@@+@+@++@+%+@%@@+@%@@+-.@@@@#@+@+%@%@@++@@@@@++@X@+@OXX%+X+X@++OXXXXX@..", +"OX,@@@XX+O+XXX++X@++@%XX+o+o++++@#++++XX+++++++o+ooXoXoXo+++o+o+ooXo.o@o+++X+++++++.+++++X+X+o+XO+++Oo+ooXo+oXoXoXXXoXoXXXXXoXXX", +"OO$@@XXoXX.OXOOXXOXOXOX@+O@++@OO@@@@@@++@@@@@+@+XO+O+XXX@@+OO++O++OX+.+.OXX++.X..+.+..ooXXX.XXXX..X.......o.oooo.ooo.oXoXX..X.XO", +"$#>0z,@@O#O##@#@O##@##$$#$#$O#@#@@#$@####$#$$$#$$@O@##OX#@$$@O@O@OOO@@OXOOOO@OOOO+O+OOoOXXXOXXXXO.+.......XoXXXX+XXXXXXXX.XXXOXO", +"$87zizp0z7708zzzxzxzzzzzzzxlzxz>++#-zxZl0zz7<8883<3>:>>-9>>:>>-$$$-$$$>9>99>$O$$$$$$#$$O$$$O##OO@OOOOOOOXXX#@###$>=>::-,:::3,8=#", +"z7ZLf5307:833772ttsMu7assfVmcms#+X#,UmZPIIIIIIIIIIIIIIIIIIIPIUUPULULKKLZLLLJJKZmn8pp3,808q0q8<$X+@$$$$O$$>>:>->:>,,,><:9<<<<<>8q", +";sSGLGDDDSvGHHGGDVDBHSKSc22t5;;#O+X:7cyPFFPAFHPHbPDKDNvABDFPFFFPKPHLKPFNAFNDjAAFDBFCGcfjVMtVVcX@@$3ZxcpmmzfucmVZGCCclzcmzl7uzz58", +"4cddyiBNScjAAAAvDFNFHFAjSHNs;3c@@X#3l=vPPKaFANhBAbgAhygBhgBhAgjjhhaa*hgw6i206aiaSh6wtAFAvrMhc8..O+pi3lsia6KPDFSABbbFbSMhgdtudcyl", +"HCtDgNaadaFSggVDjBAgjhNvAcyHHZ2o.#-8d&sDFhshNvNSjbbgajjbjAjAjgkAbkhgjggArBkihhagvgagSgAjwhFa5;.X@#fnw6iKdvFhAavahdaghags7tdzccMG", +"ctcdhMghcSardcg4hatdc6wctsGFgDcX@#XZHSHSgcvbhghgbjBbAjABjAjNgbAjjjjkhjAjjkjkAjhkagjbggjPFBjiH;XXO@fsjnHDDSByaveh25wvta16;:46Vaht", +"disvdi6wVhhNf6ptMhSshnlcSggjhV5-##:PUHPjcvtgvcchvjgNjjhjaahaykkgjkgAjFjjjAjAAkhNhgkAAgADjFkja;.OO@ldjFHhyrtyh4wtccaahdgu-3cSyats", +"cshafdahahNa6vhchatSSsjhaccvvct=##:PbKjhAevDvSgMNhAvkNjngjjahjgAkjjjjjjkjaahkjjjkhjgkejkehhD*,XX@@nbBiwachagchfSjAgkaaNp5Svajttc", +"tt6tacthFhw4itvB0BAihDaBhBABaf2$@@;UKajAADMNajjBMMjNNdvvMjvhvhSSNDgajgjjjdFjjhjhjjhjjjhjAaja*0XO@-Gnyadajhajaa0ahkaaijaahAiaaahi", +"ca7MhejSah606hhABBhf0aFhfMhhAN3-+$$PFPjjaM*fVDDAvjjNvSavjBhjNAvAjjgFFjjBjjkAAjaaajhjjkkDajhAf*X+O%GgghaBi0aaiihhiaajaehaBhajhjha", +"d6aidisai6ahhBhf2iDDFDhA5ahivi0;##3UiaFAjMGCNghnBDDAvbMvAahBFAShBhhMhNhjAjjjjjjhhjAAijhaBAhj0%XX$@CgahMwiijhjajahaaa0kjhjhAhhiah", +"ihhj6chajh0hhaAADBiDhiFf0aBADff*O@;PPPFAKjjhAAVDijSDgFSvjADvggjSDjjhjiDFjjhhaNhFNajhjjAkaiji4%O+O+Jgbi5sijiahgggjhaahhjahi0h4fa6", +"iajhfaDjBhDDhhBh0ahvhFCBBhh0BC*$+=3Pj5hhdhBjfNjBDbjDbHAgNjjvjkBaiaAKNDjgjNjDjjhdaDNNjhADAAh*&-X+@;ChAgbkDihh0hjkaahhhhahaiBBhh0a", +"aMaiMMNaDBh6hAhvaBhi6hhaBFBhAh;%=$,LjjPjjjAANNBBbkSvgAhAhMAgADSddhaahajNAhjhjhFFFNNhjahhjkh-@-XXO-LjDjahjhh2ihhhr0ahihahihah6aij", +"AghjjagNBhhfNvaDBAFvDAhBAAiAaB0%@@&KhjDFDDjACAjjSFDAgDgSjjAhykawLMFhDNAMjhNNdjjFjjjjajDAakh;@@+XO+HhaekiaAja4i0rjjAhhijjNihahfa6", +"jahiighh6ivhhihhDABDFaBFhfKAA0*@@$-PFFjjgghDhASjjejAvAvjNMBggSSca5SghkjhNjhDjhjahhaDihakDh0:20XO@@GhBjDaaaahAkhhkjhiajihaiaaafjj", +"nd5ijfjDjNfsABaahhfhAFAAjK6hh;0O+@-UKjPKNajjCjNNgNvbjvhFhgjgFANDDBKDHDjDjjMhhCjjjjhkjjDAak0;i%XO@@VagjkhgaaihDjaBa40Bii6050haka5", +"jiNNjhhjhh00ejhABfjhhi6Ajhaf366@@@-PkPDjjFPjCNjfSDFyAADjjAkDVjgvSAAAgSBFhNjjjjjjjjhAjhaaaBja0;.+@#mBAaajjnkajjahhwahafhBahBjajBB", +"hNhhhiaa040jAjAAhA6hAFDhBDhN;fN:O@2IKPjhjFjFCjjMShgFFFFDjgFNHVDSywDtDAkgNjjDfjajDjFhjkjhjajaF0o+O@MDhae5iNgjiakjtavhhvawBhhaBh6h", +"Cahijhhh4haha0DABaBDFAaaiaA60JfO@@,PjAAKDhahhCKjSvhvjFAgFgFhVyhtSMFahjhFhjhhiajDajhjjaFAAAaBh&+++@CgadshgahdaifaiaffAwhhBaaii5fa", +"ihdajjhNajjjFAhDaAfAhhDi0iD50i*@O$0PPIFAjhDNKAFCMaASBjgagjDMahjSADvNhjggjfhjjjhkAjjkakjAjhBh6%XX#+MDVhaSkkkkMNjjht0haaaBkihavhBB", +"aaikDjahBAAi0hhBhhhAvihKFFKBwh5X@@6PPjDjjAgCjhNjgShaAghMKvgyhjAhyhhahKDMjjjjFjAFjjajAFhaBjBBj&XXO@VBw5jajgigiakihhB6jahfwhhhaaai", +"NghahiahBA6ihahAhhBfvihahAAAPPfO@@jPAAijjdjhsFhCBkVgMshNjtDvNhdMbLggFvcvhkAjaAjajiAjjhDhjjhi4+.X@+CgyShhagNhajMahhaai0wwih00haaf", +"fadhjjhNaiBBAFBaAAihDAFDjAiBBh%-+%NFjPKKjjCDDjNiwfcDDNsNaNMvMgDchajASvghjCjjjhhjhDhkhjjajhaFa%+X@+mhfi44hgaagj0rBhBtavaaahfAiava", +"Df6hhhajBaiah6ihaiBBBhahBhFhAFi7XOvPFjFBhfhBAfNNCGDhhaMCDKaMgDFCMvcAhhMcgjjjgjjgi6ahFjkhhhBji@.+OOCaaBhDthhhtifhhataa6iahafafaif", +"AaBBaahBhDBAi5iAhhvBhiFBhhFhKhv3++fKBAjFjBDAjDhihADMCjDfhfsGHahacjhvvNVNBANBghghhAjjjaBAhBjh6%XXOOCahaihi6fhhBt66aaaChhaahiBaDhh", +"hBafBhBah6aBBDAahi6fBBhD6vBhhAiO+%0PFFFjDjh0MhhDAHfhhDjpNjMhaCDHSbchhdaakwhaiijBAkABkBjhhBkB**XX@@CvaaAahhhhh6hv0hBfhaaffhiifiBB", +"ihah6ihh6Dfh6hfiAAKKhhaFDhhBFh6-+@;PFFBjahAKhDNhCNfajfjDFNfDjafhVgNSgjASDcggNNjBhaBhahhABhBB0+XX@OAhAh6iaftBfi6hva366ta6A6iihii6", +"ii6ihfihifhfhDBi6hBfBDFhifANhBf*+%2FKjjBBaKDjjhFHMMFMMCjjMJhjKCjeccjNghBhFhBhaedAvaiBhahajAja+XOO+DiahBahaA66Bhf6afafhah6ih6iiih", +"AafhihDfBCaifiiDDAKhDAihhvDCAh*O+X0KKKFDABAhBDNfMhNDjNjhhfhHjfhhvNDASjBHShhBkAhaahjjhBBBAhBa5++.OOCahAaih6a0h6iavaNAhi0faBfaBBfa", +"AiBhFAfBhaiBfCDh6CfCBhDFKi6CBi2;X@%KjDDjABDDNCAjjhKjNDjNCAfFaDhjNaahgSBijhBhNABKFBBAAiahhjjBv%.XOOn5hht64hhBthiBhiaaiaffiaiiiiih", +"6aiffiBBfBfDABiaiBiB0DKDhDNNh*;O+$-APPjNBBFjNFNNNhNDADjNCjjNCjCfhDDSShhjhMBASNhaaBBAhhjjBhjj0++XOOCfBj6vhBBaihhh6fatfiaBBiiiihha", +"fiihihf46hhhfChCChKFDhaBfBKADhf%+@@HFKaNADDANFjACFFHahDDCDjhjhjAjFdjDhjjNDjhaaDhBhAhaaBajBAh2+O+O+Cs0a0ahahwvahifhBAhhvi6ii6fiaf", +"fifiahaBBBvNBANNABBBBDhDFKDAfaf-@%%AFjjFAAjCDDjADjAjjKDjjjFAADCFjjjDhFhjDhjdjFNaFhhAAhABAAh06%+@@+CiAjjhDahhhhavhhai6i6hBvFAhfai", +"6iifCBBAhhhNBhChfCBABAhvAfaAh*3;%-;hDjBAjNjADDjaajjCDjAAFAjFhjjjDjhjMhjNhjkhAhhjaajhBBBaBBjhw;$$%%nfhBaai0aihhaa66i0fiiii66ii6fa", +";36i66i60h6373if6iiiiiifBhf326i--&-0h3sjDDFKNNhjCNjCAHjDjhDkhAjFjDAahjjNADDNFjhjhBABBBBhAAhh5%@---n66tahahhhiiiiiiifaihifi6336ii", +"-*-*73332;3333*;3-;2*-;*-***33-;---03;&*204040242*2i00aihhjjjDjajNDNFNFAjaiiihMFjjBDBAFAAAjB0*2;;2l34s0hh0taf0iifhfi266i6632333;", +"-%@%---*-*%%--%%%%%O+%@+++O+OO@O@OO;&+++++++++%+@%@%@+o+++@@@%%%&&%-&&&%%%+@%&*2562**%;**%%%%%@@@+0;***2***3*;***;;*%*-+%%%*-O%-", +".OX+-OOO++++OO+%+@@@%++@@O+O++O-@$O$@@+@++++O+O++-%++%+++O++@@+@@+++@++++++++O+O++.O+O.+X.OX.+OOOO;+XX+..O+.O+XXXXOOXXX+OX+O@%OO", +"O.O+OOOO.X+OOOOO+OOOO+@@++O+++OO+OO;;-+++.ooX++++++++++o++O++O.+++++++++@@+O++O+O+X+OO++.+.X.XXOOOO+X+OXXXOOXXX.OXXXX.XXOO+@O+OX" +}; diff --git a/hacks/piecewise.c b/hacks/piecewise.c new file mode 100644 index 00000000..9de3bdaa --- /dev/null +++ b/hacks/piecewise.c @@ -0,0 +1,892 @@ +/* piecewise, 21jan2003 + * Geoffrey Irving + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include +#include "screenhack.h" + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION +# include "xdbe.h" +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + +#define X_PI (180 * 64) + +/******** splaying code */ + +typedef struct _tree { + struct _tree *l, *r; /* left and right children */ + /* extra stuff would go here */ + } tree; + +typedef int (*cut)(tree*); /* cut x is <, =, or > 0 given a <, =, or > x for some a */ + +/* Top-down splay routine. Reference: + * "Self-adjusting Binary Search Trees", Sleator and Tarjan, + * JACM Volume 32, No 3, July 1985, pp 652-686. + * See page 668 for specific splay transformations */ + +tree *splay(cut c, tree *t) { + int v, vv; + tree *l, *r; + tree **lr, **rl; + tree *x, *y, *z; + + if (!t) + return 0; + + /* initialization */ + x = t; + l = r = 0; + lr = &l; + rl = &r; + + /* top-down splaying loop */ + for (;;) { + v = c(x); + if (v == 0) + break; /*** success ***/ + else if (v < 0) { + y = x->l; + if (!y) + break; /*** trivial ***/ + else { + vv = c(y); + if (vv == 0) { + *rl = x; /*** zig ***/ + rl = &x->l; + x = y; + break; + } + else if (vv < 0) { + z = y->l; + if (!z) { + *rl = x; /*** zig ***/ + rl = &x->l; + x = y; + break; + } + else { + x->l = y->r; /*** zig-zig ***/ + y->r = x; + *rl = y; + rl = &y->l; + x = z; + } + } + else { /* vv > 0 */ + z = y->r; + if (!z) { + *rl = x; /*** zig ***/ + rl = &x->l; + x = y; + break; + } + else { /*** zig-zag ***/ + *lr = y; + lr = &y->r; + *rl = x; + rl = &x->l; + x = z; + } + } + } + } + else { /* v > 0 */ + y = x->r; + if (!y) + break; /*** trivial ***/ + else { + vv = c(y); + if (vv == 0) { + *lr = x; /*** zig ***/ + lr = &x->r; + x = y; + break; + } + else if (vv > 0) { + z = y->r; + if (!z) { + *lr = x; /*** zig ***/ + lr = &x->r; + x = y; + break; + } + else { + x->r = y->l; /*** zig-zig ***/ + y->l = x; + *lr = y; + lr = &y->r; + x = z; + } + } + else { /* vv < 0 */ + z = y->l; + if (!z) { + *lr = x; /*** zig ***/ + lr = &x->r; + x = y; + break; + } + else { /*** zig-zag ***/ + *rl = y; + rl = &y->l; + *lr = x; + lr = &x->r; + x = z; + } + } + } + } + } + + /* completion */ + *lr = x->l; + x->l = l; + *rl = x->r; + x->r = r; + return x; + } + +tree *splay_min(tree *t) { + tree *r, **rl; + tree *x, *y, *z; + + if (!t) + return 0; + + x = t; + r = 0; + rl = &r; + + for (;;) { + y = x->l; + if (!y) + break; /*** trivial ***/ + else { + z = y->l; + if (!z) { + *rl = x; /*** zig ***/ + rl = &x->l; + x = y; + break; + } + else { + x->l = y->r; /*** zig-zig ***/ + y->r = x; + *rl = y; + rl = &y->l; + x = z; + } + } + } + + x->l = 0; + *rl = x->r; + x->r = r; + return x; + } + +tree *splay_max(tree *t) { + tree *l, **lr; + tree *x, *y, *z; + + if (!t) + return 0; + + x = t; + l = 0; + lr = &l; + + for (;;) { + y = x->r; + if (!y) + break; /*** trivial ***/ + else { + z = y->r; + if (!z) { + *lr = x; /*** zig ***/ + lr = &x->r; + x = y; + break; + } + else { + x->r = y->l; /*** zig-zig ***/ + y->l = x; + *lr = y; + lr = &y->r; + x = z; + } + } + } + + *lr = x->l; + x->l = l; + x->r = 0; + return x; + } + +/******** circles and fringe */ + +struct _fringe; + +typedef struct _circle { + int r; /* radius */ + double x, y; /* position */ + double dx, dy; /* velocity */ + + int visible; /* default visibility */ + struct _fringe *lo, *hi; /* lo and hi fringes */ + + int ni; /* number of intersections */ + int *i; /* sorted intersection list */ + } circle; + +typedef struct _fringe { + struct _fringe *l, *r; /* left and right children for splay trees */ + + circle *c; /* associated circle */ + int side; /* 0 for lo, 1 for hi */ + + int mni; /* size of intersection array */ + int ni; /* number of intersections */ + int *i; /* sorted intersection list */ + } fringe; + +inline double fringe_x(fringe *f, double y) { + double dy, d; + dy = f->c->y - y; + d = sqrt(f->c->r * f->c->r - dy * dy); + return f->side ? f->c->x + d : f->c->x - d; + } + +inline void fringe_add_intersection(fringe *f, double x, double y) { + f->ni++; + if (f->mni < f->ni) { + f->mni += 2; + f->i = realloc(f->i, sizeof(int) * f->mni); + } + f->i[f->ni-1] = rint(atan2(y - f->c->y, x - f->c->x) * X_PI / M_PI); + } + +circle *init_circles(int n, int w, int h) { + int i, r0, dr, speed; + double v, a; + double minradius, maxradius; + fringe *s = malloc(sizeof(fringe) * n * 2); /* never freed */ + circle *c = malloc(sizeof(circle) * n); + + speed = get_integer_resource("speed", "Speed"); + minradius = get_float_resource("minradius", "Float"); + maxradius = get_float_resource("maxradius", "Float"); + if (maxradius < minradius) + maxradius = minradius; + + r0 = ceil(minradius * h); + dr = floor(maxradius * h) - r0 + 1; + + for (i=0;ic = c[i].hi->c = c+i; + c[i].lo->side = 0; + c[i].hi->side = 1; + c[i].lo->mni = c[i].lo->ni = c[i].hi->mni = c[i].hi->ni = 0; + c[i].lo->i = c[i].hi->i = 0; + } + + return c; + } + +/* this is a hack, but I guess that's what I writing anyways */ +void tweak_circle(circle *c) { + c->x += frand(2) - 1; + c->y += frand(1) + 0.1; + } + +void move_circle(circle *c, int w, int h) { + c->x += c->dx; + if (c->x < c->r) { + c->x = c->r; + c->dx = -c->dx; + } + else if (c->x >= w - c->r) { + c->x = w - 1 - c->r; + c->dx = -c->dx; + } + c->y += c->dy; + if (c->y < c->r) { + c->y = c->r; + c->dy = -c->dy; + } + else if (c->y >= h - c->r) { + c->y = h - 1 - c->r; + c->dy = -c->dy; + } + } + +/******** event queue */ + +#define START 0 +#define CROSS 1 +#define FINISH 2 + +typedef struct _event { + struct _event *l, *r; /* left and right children for splay tree */ + + int kind; /* type of event */ + double x, y; /* position */ + fringe *lo, *hi; /* fringes */ + } event; + +static double event_cut_y; + +int event_cut(event *e) { + return event_cut_y == e->y ? 0 : event_cut_y < e->y ? -1 : 1; + } + +void event_insert(event **eq, event *e) { + if (!*eq) { + e->l = e->r = 0; + *eq = e; + } + + event_cut_y = e->y; + *eq = (event*)splay((cut)event_cut, (tree*)*eq); + + if (e->y == (*eq)->y) { + if (!((e->lo == (*eq)->lo && e->hi == (*eq)->hi) || (e->lo == (*eq)->hi && e->hi == (*eq)->lo))) { + e->l = (*eq)->l; + e->r = 0; /* doing this instead of dying might be dangerous */ + (*eq)->l = e; + } + } + else if (e->y < (*eq)->y) { + e->l = (*eq)->l; + e->r = *eq; + (*eq)->l = 0; + *eq = e; + } + else { + e->l = *eq; + e->r = (*eq)->r; + (*eq)->r = 0; + *eq = e; + } + } + +void circle_start_event(event **eq, circle *c) { + event *s; + s = malloc(sizeof(event)); + s->kind = START; + s->x = c->x; + s->y = c->y - c->r; + s->lo = c->lo; + s->hi = c->hi; + event_insert(eq, s); + } + +void circle_finish_event(event **eq, circle *c) { + event *f; + f = malloc(sizeof(event)); + f->kind = FINISH; + f->x = c->x; + f->y = c->y + c->r; + f->lo = c->lo; + f->hi = c->hi; + event_insert(eq, f); + } + +event *event_next(event **eq) { + event *e; + if (!*eq) + return 0; + else { + e = (event*)splay_min((tree*)*eq); + *eq = e->r; + return e; + } + } + +void event_shred(event *e) { + if (e) { + event_shred(e->l); + event_shred(e->r); + free(e); + } + } + +/******** fringe intersection */ + +inline int check_fringe_intersection(double ye, fringe *lo, fringe *hi, double x, double y) { + return ye <= y && ((x < lo->c->x) ^ lo->side) && ((x < hi->c->x) ^ hi->side); + } + +void fringe_intersect(event **eq, double y, fringe *lo, fringe *hi) { + event *e; + double dx, dy, sd, rs, rd, d, sx, sy, rp, sqd; + double x1, y1, x2, y2; + + if (lo->c == hi->c) + return; + + dx = hi->c->x - lo->c->x; + dy = hi->c->y - lo->c->y; + sd = dx * dx + dy * dy; + + if (sd == 0) + return; + + rs = hi->c->r + lo->c->r; + rd = hi->c->r - lo->c->r; + d = (rd * rd - sd) * (sd - rs * rs); + + if (d <= 0) + return; + + sd = 0.5 / sd; + rp = rs * rd; + sqd = sqrt(d); + sx = (lo->c->x + hi->c->x) / 2; + sy = (lo->c->y + hi->c->y) / 2; + x1 = sx + sd * (dy * sqd - dx * rp); + y1 = sy - sd * (dx * sqd + dy * rp); + x2 = sx - sd * (dy * sqd + dx * rp); + y2 = sy + sd * (dx * sqd - dy * rp); + + #define CHECK(xi, yi) (y <= yi && ((xi < lo->c->x) ^ lo->side) && ((xi < hi->c->x) ^ hi->side)) + + #define ADD_CROSS(xi, yi, ilo, ihi) { \ + e = malloc(sizeof(event)); \ + e->kind = CROSS; \ + e->x = xi; e->y = yi; \ + e->lo = ilo; e->hi = ihi; \ + event_insert(eq, e); \ + } + + if (CHECK(x1, y1)) { + if (CHECK(x2, y2)) { + if (y1 < y2) { + ADD_CROSS(x1, y1, lo, hi); + ADD_CROSS(x2, y2, hi, lo); + } + else { + ADD_CROSS(x1, y1, hi, lo); + ADD_CROSS(x2, y2, lo, hi); + } + } + else + ADD_CROSS(x1, y1, lo, hi); + } + else if (CHECK(x2, y2)) + ADD_CROSS(x2, y2, lo, hi); + + return; + } + +/******** fringe trees and event handling */ + +#define PANIC ((fringe*)1) /* by alignment, no fringe should every be 1 */ + +fringe *check_lo(event **eq, double y, fringe *f, fringe *hi) { + if (f) { + f = (fringe*)splay_max((tree*)f); + fringe_intersect(eq, y, f, hi); + } + return f; + } + +fringe *check_hi(event **eq, double y, fringe *lo, fringe *f) { + if (f) { + f = (fringe*)splay_min((tree*)f); + fringe_intersect(eq, y, lo, f); + } + return f; + } + +double fringe_start_cut_x; +double fringe_start_cut_y; + +int fringe_start_cut(fringe *f) { + double x = fringe_x(f, fringe_start_cut_y); + return fringe_start_cut_x == x ? 0 : fringe_start_cut_x < x ? -1 : 1; + } + +fringe *fringe_start(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) { + double sx; + + if (!f) { + circle_finish_event(eq, lo->c); + lo->l = 0; + lo->r = hi; + hi->l = hi->r = 0; + return lo; + } + + fringe_start_cut_x = x; + fringe_start_cut_y = y; + f = (fringe*)splay((cut)fringe_start_cut, (tree*)f); + + sx = fringe_x(f, y); + if (x == sx) { /* time to cheat my way out of handling degeneracies */ + tweak_circle(lo->c); + circle_start_event(eq, lo->c); + return f; + } + else if (x < sx) { + circle_finish_event(eq, lo->c); + f->l = check_lo(eq, y, f->l, lo); + fringe_intersect(eq, y, hi, f); + lo->l = f->l; + lo->r = f; + f->l = hi; + hi->l = hi->r = 0; + return lo; + } + else { + circle_finish_event(eq, lo->c); + fringe_intersect(eq, y, f, lo); + f->r = check_hi(eq, y, hi, f->r); + hi->r = f->r; + hi->l = f; + f->r = lo; + lo->l = lo->r = 0; + return hi; + } + } + +double fringe_double_cut_x; +double fringe_double_cut_y; +fringe *fringe_double_cut_lo; +fringe *fringe_double_cut_hi; + +int fringe_double_cut(fringe *f) { + double x; + if (f == fringe_double_cut_lo || f == fringe_double_cut_hi) + return 0; + x = fringe_x(f, fringe_double_cut_y); + return fringe_double_cut_x == x ? 0 : fringe_double_cut_x < x ? -1 : 1; + } + +int fringe_double_splay(fringe *f, double x, double y, fringe *lo, fringe *hi) { + fringe_double_cut_x = x; + fringe_double_cut_y = y; + fringe_double_cut_lo = lo; + fringe_double_cut_hi = hi; + f = (fringe*)splay((cut)fringe_double_cut, (tree*)f); + + if (f == lo) + return (f->r = (fringe*)splay_min((tree*)f->r)) == hi; + else if (f == hi) + return (f->l = (fringe*)splay_max((tree*)f->l)) == lo; + else + return 0; + } + +fringe *fringe_cross(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) { + fringe *l, *r; + if (!fringe_double_splay(f, x, y, lo, hi)) + return PANIC; + l = check_lo(eq, y, lo->l, hi); + r = check_hi(eq, y, lo, hi->r); + lo->l = hi; + lo->r = r; + hi->l = l; + hi->r = 0; + return lo; + } + +fringe *fringe_finish(event **eq, fringe *f, double x, double y, fringe *lo, fringe *hi) { + if (!fringe_double_splay(f, x, y, lo, hi)) + return PANIC; + else if (!lo->l) + return hi->r; + else if (!hi->r) + return lo->l; + else { + lo->l = (fringe*)splay_max((tree*)lo->l); + hi->r = (fringe*)splay_min((tree*)hi->r); + fringe_intersect(eq, y, lo->l, hi->r); + lo->l->r = hi->r; + hi->r->l = 0; + return lo->l; + } + } + +/******** plane sweep */ + +void sweep(int n, circle *c) { + int i; + event *eq, *e; + fringe *f; + + RESTART: + #define CHECK_PANIC() \ + if (f == PANIC) { \ + free(e); \ + event_shred(eq); \ + for (i=0;ini = c[i].hi->ni = 0; \ + } \ + goto RESTART; \ + } + + eq = 0; + for (i=0;ikind) { + case START: + f = fringe_start(&eq, f, e->x, e->y, e->lo, e->hi); + break; + case CROSS: + f = fringe_cross(&eq, f, e->x, e->y, e->lo, e->hi); + CHECK_PANIC(); + fringe_add_intersection(e->lo, e->x, e->y); + fringe_add_intersection(e->hi, e->x, e->y); + break; + case FINISH: + f = fringe_finish(&eq, f, e->x, e->y, e->lo, e->hi); + CHECK_PANIC(); + break; + } + free(e); + } + } + +/******** circle drawing */ + +void adjust_circle_visibility(circle *c) { + int i, j, n, a; + int *in; + n = c->lo->ni + c->hi->ni; + in = malloc(sizeof(int) * n); + for (i=0;ihi->ni;i++) + in[i] = c->hi->i[i]; + for (i=c->lo->ni-1;i>=0;i--) + in[n-i-1] = c->lo->i[i] > 0 ? c->lo->i[i] : c->lo->i[i] + 2 * X_PI; + c->lo->ni = c->hi->ni = 0; + + i = j = 0; + a = 0; + while (i < n && j < c->ni) /* whee */ + a = (in[i] < c->i[j] ? in[i++] : c->i[j++]) - a; + while (i < n) + a = in[i++] - a; + while (j < c->ni) + a = c->i[j++] - a; + + if (a > X_PI) + c->visible = !c->visible; + free(c->i); + c->ni = n; + c->i = in; + } + +#define ARC_BUFFER_SIZE 256 +int arc_buffer_count = 0; +XArc arc_buffer[ARC_BUFFER_SIZE]; + +void flush_arc_buffer(Display *dpy, Drawable w, GC gc) { + if (arc_buffer_count) { + XDrawArcs(dpy, w, gc, arc_buffer, arc_buffer_count); + arc_buffer_count = 0; + } + } + +void draw_circle(Display *dpy, Drawable w, GC gc, circle *c) { + int i, xi, yi, di; + adjust_circle_visibility(c); + + xi = rint(c->x - c->r); + yi = rint(c->y - c->r); + di = c->r << 1; + + #define ARC(p, a1, a2) { \ + if (((p) & 1) ^ c->visible) { \ + arc_buffer[arc_buffer_count].x = xi; \ + arc_buffer[arc_buffer_count].y = yi; \ + arc_buffer[arc_buffer_count].width = di; \ + arc_buffer[arc_buffer_count].height = di; \ + arc_buffer[arc_buffer_count].angle1 = -(a1); \ + arc_buffer[arc_buffer_count].angle2 = (a1) - (a2); \ + arc_buffer_count++; \ + if (arc_buffer_count == ARC_BUFFER_SIZE) \ + flush_arc_buffer(dpy, w, gc); \ + } \ + } + + if (!c->ni) + ARC(0, 0, 2 * X_PI) + else + ARC(0, c->i[c->ni-1], c->i[0] + 2 * X_PI) + for (i=1;ini;i++) + ARC(i, c->i[i-1], c->i[i]) + } + +/******** toplevel */ + +char *progclass = "Piecewise"; + +char *defaults [] = { + ".background: black", + ".foreground: white", + "*delay: 5000", + "*speed: 15", + "*ncolors: 256", + ".colorspeed: 10", + + ".count: 32", + ".minradius: 0.05", + ".maxradius: 0.2", + + "*doubleBuffer: True", +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION + "*useDBE: True", +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + 0 + }; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-speed", ".speed", XrmoptionSepArg, 0 }, + { "-colorspeed", ".colorspeed", XrmoptionSepArg, 0 }, + + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-minradius", ".minradius", XrmoptionSepArg, 0 }, + { "-maxradius", ".maxradius", XrmoptionSepArg, 0 }, + + { "-db", ".doubleBuffer", XrmoptionNoArg, "True" }, + { "-no-db", ".doubleBuffer", XrmoptionNoArg, "False" }, + { 0, 0, 0, 0 } + }; + +void screenhack(Display *dpy, Window window) { + int i; + Bool dbuf; + XColor *colors; + XGCValues gcv; + GC erase_gc, draw_gc; + XWindowAttributes xgwa; + Pixmap b = 0, ba = 0, bb = 0; /* double-buffering pixmap */ + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION + XdbeBackBuffer backb = 0; +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + + int count, delay, ncolors, colorspeed, color_index, flags, iterations; + int color_iterations; + circle *circles; + + count = get_integer_resource("count", "Integer"); + delay = get_integer_resource("delay", "Integer"); + ncolors = get_integer_resource("ncolors", "Integer"); + colorspeed = get_integer_resource("colorspeed", "Integer"); + dbuf = get_boolean_resource("doubleBuffer", "Boolean"); + + color_iterations = colorspeed ? 100 / colorspeed : 100000; + if (!color_iterations) + color_iterations = 1; + + XGetWindowAttributes(dpy, window, &xgwa); + colors = calloc(sizeof(XColor), ncolors); + + if (get_boolean_resource("mono", "Boolean")) { + MONO: + ncolors = 1; + colors[0].pixel = get_pixel_resource("foreground", "Foreground", dpy, xgwa.colormap); + } + else { + make_color_loop(dpy, xgwa.colormap, 0, 1, 1, 120, 1, 1, 240, 1, 1, colors, &ncolors, True, False); + if (ncolors < 2) + goto MONO; + } + + if (dbuf) { +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION + b = backb = xdbe_get_backbuffer(dpy, window, XdbeUndefined); +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ + + if (!b) { + ba = XCreatePixmap(dpy, window, xgwa.width, xgwa.height,xgwa.depth); + bb = XCreatePixmap(dpy, window, xgwa.width, xgwa.height,xgwa.depth); + b = ba; + } + } + else + b = window; + + /* erasure gc */ + gcv.foreground = get_pixel_resource("background", "Background", dpy, xgwa.colormap); + erase_gc = XCreateGC (dpy, b, GCForeground, &gcv); + + /* drawing gc */ + flags = GCForeground; + color_index = random() % ncolors; + gcv.foreground = colors[color_index].pixel; + draw_gc = XCreateGC(dpy, b, flags, &gcv); + + /* initialize circles */ + circles = init_circles(count, xgwa.width, xgwa.height); + + iterations = 0; + for (;;) { + XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height); + + sweep(count, circles); + for (i=0;i + + * fr.po: Updated French translation. + 2002-06-18 Carlos Perello Marin * INFO, xscreensaver.pot: Updated from 4.0.5 release. diff --git a/po/POTFILES.in b/po/POTFILES.in index 7f7680e7..e7cb3b65 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,4 +1,4 @@ -# Auto-generated: Mon Feb 3 04:06:28 PST 2003 +# Auto-generated: Tue Feb 18 22:47:48 PST 2003 driver/demo-Gtk-conf.c driver/demo-Gtk-support.c driver/demo-Gtk-widgets.c @@ -11,6 +11,7 @@ hacks/config/ant.xml hacks/config/apollonian.xml hacks/config/atlantis.xml hacks/config/attraction.xml +hacks/config/atunnel.xml hacks/config/barcode.xml hacks/config/blaster.xml hacks/config/blitspin.xml @@ -105,6 +106,7 @@ hacks/config/penetrate.xml hacks/config/penrose.xml hacks/config/petri.xml hacks/config/phosphor.xml +hacks/config/piecewise.xml hacks/config/pipes.xml hacks/config/polyominoes.xml hacks/config/popsquares.xml diff --git a/po/fr.po b/po/fr.po index 1bd60392..c9428aa9 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,11 +1,11 @@ # xscreensaver fr.po # Copyright (C) 2002 Free Software Foundation, Inc. # maintainer: Christophe Merlet (RedFox) , 2002. -# Eric Lassauge , 2002. -# http://lassauge.free.fr/ +# Eric Lassauge , 2003. +# http://lassauge.free.fr/xscreensaver/ msgid "" msgstr "" -"Project-Id-Version: xscreensaver 4.06\n" +"Project-Id-Version: xscreensaver 4.07\n" "POT-Creation-Date: 2002-05-10 19:02-0700\n" "PO-Revision-Date: 2002-03-18 09:47+0100\n" "Last-Translator: Eric Lassauge \n" @@ -34,7 +34,7 @@ msgstr "Erreur au chargement du fichier d'image: %s" #: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89 msgid "XScreenSaver" -msgstr "Économiseur d'écran" +msgstr "Économiseur d'écran XScreenSaver" #: driver/demo-Gtk-widgets.c:176 msgid "_File" @@ -64,7 +64,7 @@ msgstr "_Tue le d #: driver/demo-Gtk-widgets.c:231 driver/xscreensaver-demo.glade.h:71 msgid "Tell the running XScreenSaver daemon to exit." -msgstr "Demande au démon XScreenSave actif de se terminer." +msgstr "Demande au démon XScreenSaver actif de se terminer." #: driver/demo-Gtk-widgets.c:235 driver/xscreensaver-demo.glade.h:98 msgid "_Restart Daemon" @@ -144,7 +144,8 @@ msgstr "Aper msgid "" "Demo the selected screen saver in full-screen mode (click the mouse to " "return.)" -msgstr "Démo du mode sélectionné en plein écran (cliquer pour revenir)." +msgstr "" +"Démo de l'économiseur sélectionné en plein écran (cliquer pour revenir)." #: driver/demo-Gtk-widgets.c:486 driver/xscreensaver-demo.glade.h:65 msgid "Settings..." @@ -152,11 +153,11 @@ msgstr "Param #: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17 msgid "Customization and explanation of the selected screen saver." -msgstr "Personnalisation et explications pour le mode sélectionné." +msgstr "Personnalisation et explications pour l'économiseur sélectionné." #: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52 msgid "Mode:" -msgstr "Mode:" +msgstr "Economiseur:" #: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25 msgid "Disable Screen Saver" @@ -164,7 +165,7 @@ msgstr "Inhibe l' #: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9 msgid "Blank Screen Only" -msgstr "Ecran noir maintenant" +msgstr "Ecran noir uniquement" #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56 msgid "Only One Screen Saver" @@ -172,11 +173,11 @@ msgstr "Seulement un #: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60 msgid "Random Screen Saver" -msgstr "Économiseur d'écran au hasard" +msgstr "Économiseur d'écran aléatoire" #: driver/demo-Gtk-widgets.c:565 driver/xscreensaver-demo.glade.h:75 msgid "Use" -msgstr "Utilise" +msgstr "Choisis" #: driver/demo-Gtk-widgets.c:585 driver/xscreensaver-demo.glade.h:63 msgid "Screen Saver" @@ -237,7 +238,7 @@ msgstr "" #: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29 msgid "Display Subprocess Errors" -msgstr "Afficher les erreurs des sous-processus" +msgstr "Afficher les erreurs des économiseurs" #: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87 msgid "" @@ -297,7 +298,7 @@ msgstr "Dur #: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44 msgid "How long it should take for the screen to fade in and out." -msgstr "Combien doit durer les fondus avec le noir." +msgstr "Combien de temps doivent durer les fondus avec le noir." #: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100 msgid "seconds" @@ -344,8 +345,8 @@ msgid "" "Whether the image-manipulating modes should be allowed to operate on an " "image of your desktop." msgstr "" -"Les modes qui manipulent des images sont-ils autorisés à utiliser une image " -"de votre bureau." +"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une " +"image de votre bureau." #: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39 msgid "Grab Desktop Images" @@ -356,8 +357,8 @@ msgid "" "Whether the image-manipulating modes should operate on images captured from " "the system's video input (if there is one)." msgstr "" -"Les modes qui manipulent des images sont-ils autorisés à utiliser une image " -"capturée sur le port d'entrée vidéo du système (s'il y en a un)." +"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une " +"image capturée sur le port d'entrée vidéo du système (s'il y en a un)." #: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40 msgid "Grab Video Frames" @@ -368,12 +369,12 @@ msgid "" "Whether the image-manipulating modes should operate on random images loaded " "from disk." msgstr "" -"Les modes qui manipulent des images sont-ils autorisés à utiliser une image " -"aléatoire depuis le disque dur." +"Les économiseurs qui manipulent des images sont-ils autorisés à utiliser une " +"image aléatoire depuis le disque dur." #: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12 msgid "Choose Random Image:" -msgstr "Choisir une image aléatoireb:" +msgstr "Choisir une image aléatoirement: " #: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73 msgid "The directory from which images will be randomly chosen." @@ -390,7 +391,7 @@ msgstr "Commande avanc #: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90 msgid "XScreenSaver: Mode-Specific Settings" -msgstr "XScreenSaver: paramètres spécifiques des modes" +msgstr "XScreenSaver: paramètres spécifiques des économiseurs" #: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64 msgid "Settings" @@ -464,7 +465,7 @@ msgid "" "it will be used, otherwise, this demo will not be run." msgstr "" "Le type de visuel X que le mode utilisera. Si ce visuel est disponible il " -"sera utilisé, sinon le mode ne sera pas lancé." +"sera utilisé, sinon l'économiseur ne sera pas lancé." #: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16 msgid "Command Line:" @@ -472,7 +473,7 @@ msgstr "Ligne de commande:" #: driver/demo-Gtk-widgets.c:1641 driver/xscreensaver-demo.glade.h:31 msgid "Documentation..." -msgstr "" +msgstr "Documentation ..." #: driver/demo-Gtk-widgets.c:1649 driver/xscreensaver-demo.glade.h:13 msgid "Click here to read the manual for this display mode, if it has one." @@ -488,7 +489,7 @@ msgstr "Editer directement la ligne de commande." #: driver/demo-Gtk-widgets.c:1684 driver/xscreensaver-demo.glade.h:67 msgid "Standard <<" -msgstr "" +msgstr "Standard <<" #: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6 msgid "Back to the graphical configuration options." @@ -505,7 +506,9 @@ msgstr "Annule" #: driver/demo-Gtk.c:511 msgid "For updates, check http://www.jwz.org/xscreensaver/" -msgstr "Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»" +msgstr "" +"Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»\n" +"Traductions par E. LASSAUGE «http://lassauge.free.fr/xscreensaver/»" #: driver/demo-Gtk.c:517 #, c-format @@ -1143,7 +1146,7 @@ msgstr "Eau claire" #: hacks/config/atlantis.xml.h:5 msgid "Flat Background" -msgstr "Arrière-plan plat" +msgstr "Arrière-plan unis" #: hacks/config/atlantis.xml.h:6 msgid "Gradient Background" @@ -1273,7 +1276,7 @@ msgstr "" #: hacks/config/superquadrics.xml.h:4 hacks/config/t3d.xml.h:7 #: hacks/config/twang.xml.h:5 hacks/config/wander.xml.h:8 msgid "High" -msgstr "Haute" +msgstr "Haut(e)" #: hacks/config/attraction.xml.h:11 msgid "Ignore Screen Edges" @@ -1281,7 +1284,7 @@ msgstr "Ignore les bords de l' #: hacks/config/attraction.xml.h:12 msgid "Inward" -msgstr "" +msgstr "Vers l'intérieur" #: hacks/config/attraction.xml.h:14 msgid "" @@ -1329,28 +1332,27 @@ msgstr "Long" #: hacks/config/superquadrics.xml.h:5 hacks/config/t3d.xml.h:8 #: hacks/config/twang.xml.h:7 hacks/config/wander.xml.h:11 msgid "Low" -msgstr "Basse" +msgstr "Bas(se)" #: hacks/config/attraction.xml.h:20 msgid "Orbital Mode" -msgstr "" +msgstr "Mode orbital" #: hacks/config/attraction.xml.h:21 msgid "Outward" -msgstr "" +msgstr "Vers l'extérieur" #: hacks/config/attraction.xml.h:22 msgid "Polygons" -msgstr "" +msgstr "Polygônes" #: hacks/config/attraction.xml.h:23 hacks/config/spotlight.xml.h:3 msgid "Radius" msgstr "Rayon" #: hacks/config/attraction.xml.h:24 -#, fuzzy msgid "Repulsion Threshold" -msgstr "Réactivité" +msgstr "Seuil de répulsion" #: hacks/config/attraction.xml.h:25 hacks/config/braid.xml.h:10 #: hacks/config/cynosure.xml.h:8 hacks/config/drift.xml.h:11 @@ -1430,7 +1432,7 @@ msgstr "" #: hacks/config/blitspin.xml.h:6 msgid "Grab Screen" -msgstr "" +msgstr "Acquisition de l'écran" #: hacks/config/blitspin.xml.h:8 msgid "" @@ -1472,7 +1474,7 @@ msgstr "Vitesse d'animation" #: hacks/config/boxed.xml.h:2 msgid "Boxed" -msgstr "" +msgstr "Avec la boîte" #: hacks/config/boxed.xml.h:3 msgid "" @@ -1516,9 +1518,8 @@ msgid "Line Thickness" msgstr "Epaisseur des lignes" #: hacks/config/braid.xml.h:8 -#, fuzzy msgid "Max Rings" -msgstr "Maximum de lignes" +msgstr "Maximum de cercles" #: hacks/config/bsod.xml.h:1 hacks/config/molecule.xml.h:1 #: hacks/config/vidwhacker.xml.h:1 hacks/config/webcollage.xml.h:1 @@ -1554,44 +1555,44 @@ msgstr "" #: hacks/config/bsod.xml.h:9 msgid "Mac Bomb" -msgstr "" +msgstr "Bombe Mac" #: hacks/config/bsod.xml.h:10 msgid "MacsBug" -msgstr "" +msgstr "MacsBug" #: hacks/config/bsod.xml.h:11 msgid "NCD X Terminal" -msgstr "" +msgstr "Terminal X NCD" #: hacks/config/bsod.xml.h:12 msgid "SCO" -msgstr "" +msgstr "SCO" #: hacks/config/bsod.xml.h:13 msgid "Sad Mac" -msgstr "" +msgstr "Mac triste" #: hacks/config/bsod.xml.h:14 msgid "Solaris" -msgstr "" +msgstr "Solaris" #: hacks/config/bsod.xml.h:15 msgid "Sparc Linux" -msgstr "" +msgstr "Linux Sparc" #: hacks/config/bsod.xml.h:16 #, fuzzy msgid "Windows" -msgstr "Vent" +msgstr "Windows NT" #: hacks/config/bsod.xml.h:17 msgid "Windows 2000" -msgstr "" +msgstr "Windows 2000" #: hacks/config/bsod.xml.h:18 msgid "Windows NT" -msgstr "" +msgstr "Windows NT" #: hacks/config/bubble3d.xml.h:1 msgid "Bubble3D" @@ -1699,25 +1700,24 @@ msgstr "" #: hacks/config/circuit.xml.h:1 msgid "Animates a number of 3D electronic components. Written by Ben Buxton." -msgstr "" +msgstr "Anime des composants électroniques en 3D. Ecris par Ben buxton." #: hacks/config/circuit.xml.h:2 msgid "Circuit" -msgstr "" +msgstr "Circuit" #: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4 #: hacks/config/pulsar.xml.h:2 msgid "Directional Lighting" -msgstr "" +msgstr "Lumière directionnelle" #: hacks/config/circuit.xml.h:5 -#, fuzzy msgid "Flat Coloring" -msgstr "Couleur des zones « mortes »" +msgstr "Couleur à plat" #: hacks/config/circuit.xml.h:6 msgid "Parts" -msgstr "" +msgstr "Eléments" #: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4 msgid "Rotate" @@ -1740,7 +1740,7 @@ msgstr "Boussole" #: hacks/config/interference.xml.h:4 hacks/config/kumppa.xml.h:2 #: hacks/config/nerverot.xml.h:6 hacks/config/pipes.xml.h:4 msgid "Double Buffer" -msgstr "" +msgstr "Tampon double" #: hacks/config/compass.xml.h:6 msgid "" @@ -1873,9 +1873,8 @@ msgid "Display Solid Colors" msgstr "Affiche des couleurs unies" #: hacks/config/cubenetic.xml.h:4 -#, fuzzy msgid "Display Surface Patterns" -msgstr "Afficher les parasites." +msgstr "Afficher les patterns de surface." #: hacks/config/cubenetic.xml.h:5 msgid "Display Wireframe" @@ -2134,7 +2133,7 @@ msgstr " #: hacks/config/discrete.xml.h:1 msgid "Discrete" -msgstr "Discret" +msgstr "Discrète" #: hacks/config/discrete.xml.h:5 msgid "" @@ -2144,11 +2143,11 @@ msgstr "" #: hacks/config/distort.xml.h:1 msgid "Black Hole" -msgstr "" +msgstr "Trou noir" #: hacks/config/distort.xml.h:2 msgid "Bounce" -msgstr "" +msgstr "Rebondis" #: hacks/config/distort.xml.h:3 msgid "Distort" @@ -2222,7 +2221,7 @@ msgstr "Lissajous" #: hacks/config/electricsheep.xml.h:1 msgid "ElectricSheep" -msgstr "Mouton électrique" +msgstr "" #: hacks/config/electricsheep.xml.h:2 msgid "" @@ -2270,7 +2269,7 @@ msgstr "" #: hacks/config/euler2d.xml.h:10 hacks/config/whirlwindwarp.xml.h:5 msgid "Particles" -msgstr "Particules à l'écran" +msgstr "Particules" #: hacks/config/euler2d.xml.h:11 msgid "Power" @@ -2348,7 +2347,7 @@ msgstr "" #: hacks/config/fadeplot.xml.h:3 msgid "FadePlot" -msgstr "Ruban" +msgstr "" #: hacks/config/flag.xml.h:1 msgid "Bitmap for Flag" @@ -2391,7 +2390,7 @@ msgstr "Complexit #: hacks/config/flame.xml.h:8 msgid "Flame" -msgstr "Xflame" +msgstr "Flame" #: hacks/config/flame.xml.h:13 msgid "Number of Fractals" @@ -2556,7 +2555,7 @@ msgstr "" #: hacks/config/gears.xml.h:10 msgid "Three Gear System" -msgstr "" +msgstr "Système à trois roues" #: hacks/config/gflux.xml.h:2 msgid "Checkerboard" @@ -2608,8 +2607,7 @@ msgid "" msgstr "" "Dessine l'animation d'un quasi-feu avec des triangles en 3D dans un paysage " "parsemé d'arbres. Nécessite une machine ayant un support matériel accéléré " -"de OpenGHL pour les textures. Ecris par Eric Lassauge " +"OpenGL pour les textures. Ecris par Eric Lassauge " #: hacks/config/glforestfire.xml.h:5 msgid "Fog" @@ -3366,7 +3364,7 @@ msgstr "Dessine les atomes" #: hacks/config/molecule.xml.h:7 hacks/config/spheremonics.xml.h:2 msgid "Draw Bounding Box" -msgstr "" +msgstr "Dessine la boîte englobante" #: hacks/config/molecule.xml.h:8 msgid "" @@ -3395,7 +3393,7 @@ msgstr "" #: hacks/config/morph3d.xml.h:4 msgid "Morph3D" -msgstr "" +msgstr "Morph 3D" #: hacks/config/mountain.xml.h:3 msgid "" @@ -3569,7 +3567,7 @@ msgstr "La mort arrive" #: hacks/config/petri.xml.h:4 msgid "Diamond" -msgstr "Diamand" +msgstr "Diamant" #: hacks/config/petri.xml.h:6 msgid "Fertility" @@ -3581,7 +3579,7 @@ msgstr "" #: hacks/config/petri.xml.h:13 msgid "Maxium Rate of Death" -msgstr "" +msgstr "Vitesse maximale de décès" #: hacks/config/petri.xml.h:14 msgid "Maxium Rate of Growth" @@ -3631,7 +3629,6 @@ msgid "" msgstr "" #: hacks/config/phosphor.xml.h:1 -#, fuzzy msgid "" "Draws a simulation of an old terminal, with large pixels and long-sustain " "phosphor. It can run any program as a source of the text it displays. " @@ -3715,7 +3712,7 @@ msgstr "" #: hacks/config/pulsar.xml.h:1 msgid "Anti-alias Lines" -msgstr "" +msgstr "Lignes anti-aliasées" #: hacks/config/pulsar.xml.h:3 msgid "" @@ -3875,9 +3872,8 @@ msgid "Reaction/Difusion" msgstr "Réaction/Diffusion" #: hacks/config/rd-bomb.xml.h:16 -#, fuzzy msgid "Seed Radius" -msgstr "Rayon" +msgstr "Rayon de la racine" #: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12 msgid "Tile Size" @@ -3943,9 +3939,8 @@ msgid "Rotation" msgstr "Rotation" #: hacks/config/rocks.xml.h:10 -#, fuzzy msgid "Steering" -msgstr "Démarre" +msgstr "" #: hacks/config/rocks.xml.h:11 msgid "" @@ -4048,6 +4043,9 @@ msgid "" "OpenGL, and a machine with fast hardware support for texture maps. Written " "by Eric Lassauge <lassauge@mail.dotcom.fr>." msgstr "" +"Dessine l'animation de balles texturées qui tournent comme des folles en GL. " +"Nécessite une machine ayant un support matériel accéléré OpenGL pour les " +"textures. Ecris par Eric Lassauge " #: hacks/config/sballs.xml.h:5 msgid "Icosahedron" @@ -4825,11 +4823,11 @@ msgstr "Temps r #: hacks/config/xearth.xml.h:20 msgid "Shaded Image" -msgstr "" +msgstr "Image ombrée" #: hacks/config/xearth.xml.h:21 msgid "Sharp" -msgstr "" +msgstr "Pointu" #: hacks/config/xearth.xml.h:23 msgid "Spacing" @@ -4932,7 +4930,7 @@ msgstr "" #: hacks/config/xmatrix.xml.h:2 msgid "Binary Encoding" -msgstr "Encodag binaire" +msgstr "Encodage binaire" #: hacks/config/xmatrix.xml.h:3 msgid "Expansion Algorithm" @@ -5093,13 +5091,13 @@ msgstr "" #~ msgstr "Choisir _Aléatoirement une image:" #~ msgid "Display Subprocess _Errors" -#~ msgstr "Afficher les _Erreurs des sous-processus" +#~ msgstr "Afficher les _Erreurs des économiseurs" #~ msgid "Display _Splash Screen at Startup" #~ msgstr "Affiche l'écran _Splash au démarrage" #~ msgid "F_ade Duration" -#~ msgstr "Durée de _Fondu" +#~ msgstr "Durée du _Fondu" #~ msgid "Fade from Black When _Unblanking" #~ msgstr "Fondu depuis le noir lors de l'arrêt" @@ -5114,11 +5112,18 @@ msgstr "" #~ msgstr "Acquérir des trames _vidéo" #~ msgid "How long after the screen blanks until a password will be required." -#~ msgstr "Durée avant qu'un mot de passe soit nécessaire." +#~ msgstr "Durée avant qu'un mot de passe soit nécessaire après l'activation." #~ msgid "How long before the screensaver activates." #~ msgstr "Durée avant que le l'économiseur d'écran s'active." +#~ msgid "" +#~ "How long each display mode should run before choosing a new one (in " +#~ "Random mode.)" +#~ msgstr "" +#~ "Combien de temps chaque économiseur doit fonctionner avant le passage à " +#~ "un autre (avec l'option Mode Aléatoire)." + #~ msgid "How long until the monitor goes completely black." #~ msgstr "Durée avant que le moniteur passe au noir." @@ -5145,6 +5150,13 @@ msgstr "" #~ msgid "Sus_pend After" #~ msgstr "Sus_pend après" +#~ msgid "" +#~ "Whether the image-manipulating modes should operate on images captured " +#~ "from the system's video input (if there is one.)" +#~ msgstr "" +#~ "Les modes qui manipulent des images sont-ils autorisés à utiliser une " +#~ "image capturée sur le port d'entrée vidéo du système (s'il y en a un)." + #~ msgid "_Advanced" #~ msgstr "_Avancée" @@ -5169,6 +5181,9 @@ msgstr "" #~ msgid "_Lock Screen After" #~ msgstr "_Blocage de l'écran après" +#~ msgid "_Mode:" +#~ msgstr "_Mode:" + #~ msgid "_Off After" #~ msgstr "Coup_ure après" @@ -5184,6 +5199,9 @@ msgstr "" #~ msgid "_Settings..." #~ msgstr "_Paramètres..." +#~ msgid "_Standard <<" +#~ msgstr "_Standard <<" + #~ msgid "_Verbose Diagnostics" #~ msgstr "Diagnostiques _verbeux" @@ -5205,15 +5223,105 @@ msgstr "" #~ msgid "Arms" #~ msgstr "Bras" +#~ msgid "Rarely" +#~ msgstr "Rarement" + #~ msgid "Tentacles" #~ msgstr "Tentacules" -#~ msgid "90 deg Rotation Speed" +#~ msgid "Turn speed" #~ msgstr "Vitesse de rotation" +#~ msgid "Draw Eyes" +#~ msgstr "Affiche les yeux" + +#~ msgid "" +#~ "Draws an animation of a textured tunnel in GL. Requires OpenGL, and a " +#~ "machine with fast hardware support for texture maps. Written by Eric " +#~ "Lassauge <lassauge@mail.dotcom.fr>." +#~ msgstr "" +#~ "Dessine l'animation d'un tunnel texturé en 3D quasi-hypnotique.Nécessite " +#~ "une machine ayant un support matériel accéléré OpenGL pour les textures. " +#~ "Ecris par Eric Lassauge " + +#~ msgid "Use light" +#~ msgstr "Utiliser les éclairages" + +#~ msgid "Barcode" +#~ msgstr "Code barre" + +#~ msgid "90 deg Rotation Speed" +#~ msgstr "Vitesse de rotation à 90°" + +#~ msgid "Linux" +#~ msgstr "Linux" + +#~ msgid "MacOS X" +#~ msgstr "MacOS X" + +#~ msgid "Windows 3.1" +#~ msgstr "Windows 3.1" + +#~ msgid "Frame Rate" +#~ msgstr "Vitesse d'affichage" + +#~ msgid "Hide Sheep" +#~ msgstr "Cache le mouton" + +#~ msgid "Nickname" +#~ msgstr "Pseudo" + +#~ msgid "Repititions of each Sheep" +#~ msgstr "Répérition de chaque mouton" + +#~ msgid "Standalone" +#~ msgstr "Autonome" + #~ msgid "Endgame" #~ msgstr "Fin de partie" +#~ msgid "Eruption" +#~ msgstr "Eruption" + +#~ msgid "Heat" +#~ msgstr "Chaleur" + +#~ msgid "Inferno" +#~ msgstr "Enfer" + +#~ msgid "Little" +#~ msgstr "Peu" + +#~ msgid "Negative" +#~ msgstr "Négative" + +#~ msgid "Number of Particles" +#~ msgstr "Nombre de particules" + +#~ msgid "Pleasant" +#~ msgstr "Agréable" + +#~ msgid "Positive" +#~ msgstr "Positive" + +#~ msgid "Classic" +#~ msgstr "Classique" + +#~ msgid "Fire" +#~ msgstr "Feux" + +#~ msgid "Insane" +#~ msgstr "Fou" + +#~ msgid "Psychedelic" +#~ msgstr "Psychédilique" + +#~ msgid "RGB" +#~ msgstr "RVB" + +#~ msgid "Water" +#~ msgstr "Eau" + #~ msgid "Delay (Large = low cpu load)" #~ msgstr "Délai (élevé = peu de charge CPU)" @@ -5253,6 +5361,9 @@ msgstr "" #~ msgid "Giant Lavalite" #~ msgstr "Lavalite géante" +#~ msgid "LavaLite" +#~ msgstr "Lavalite" + #~ msgid "Max Blobs" #~ msgstr "Blobs max" @@ -5265,6 +5376,33 @@ msgstr "" #~ msgid "Smooth" #~ msgstr "Lisse" +#~ msgid "Big" +#~ msgstr "Grand" + +#~ msgid "MetaBall Movement" +#~ msgstr "Mouvement des métaballes" + +#~ msgid "MetaBall Radius" +#~ msgstr "Rayon des métaballes" + +#~ msgid "MetaBalls" +#~ msgstr "Métaballes" + +#~ msgid "Number of MetaBalls" +#~ msgstr "Nombre de métaballes" + +#~ msgid "Border" +#~ msgstr "Epaisseur de la bordure" + +#~ msgid "End color" +#~ msgstr "Couleur de fin" + +#~ msgid "Start color" +#~ msgstr "Couleur de début" + +#~ msgid "popsquares" +#~ msgstr "Carrés pops" + #~ msgid "Queens" #~ msgstr "Reines" @@ -5274,5 +5412,23 @@ msgstr "" #~ msgid "90 deg" #~ msgstr "90°" +#~ msgid "Leave a trail" +#~ msgstr "Trainée" + +#~ msgid "Linear" +#~ msgstr "Linéaire" + +#~ msgid "Lissajous" +#~ msgstr "Lissajous" + +#~ msgid "Test" +#~ msgstr "Teste" + +#~ msgid "Use Double Buffering" +#~ msgstr "Utilise un tampon double" + +#~ msgid "Wrap the screen" +#~ msgstr "Enveloppe l'écran" + #~ msgid "Knock Knock" #~ msgstr "Toc toc" diff --git a/setup.com b/setup.com index 96b4ce99..a230ce36 100644 --- a/setup.com +++ b/setup.com @@ -74,6 +74,7 @@ $ penetrate :== $'mydir'penetrate $ penrose :== $'mydir'penrose $ petri :== $'mydir'petri $ phosphor :== $'mydir'phosphor +$ piecewise :== $'mydir'piecewise $ polyominoes :== $'mydir'polyominoes $ popsquares :== $'mydir'popsquares $ pyro :== $'mydir'pyro diff --git a/utils/version.h b/utils/version.h index 25d4030d..beb45ea9 100644 --- a/utils/version.h +++ b/utils/version.h @@ -1,2 +1,2 @@ static const char screensaver_id[] = - "@(#)xscreensaver 4.07 (03-Feb-2003), by Jamie Zawinski (jwz@jwz.org)"; + "@(#)xscreensaver 4.08 (18-Feb-2003), by Jamie Zawinski (jwz@jwz.org)"; diff --git a/utils/visual-gl.c b/utils/visual-gl.c index 054bfaf2..09aee67a 100644 --- a/utils/visual-gl.c +++ b/utils/visual-gl.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1999, 2000 by Jamie Zawinski +/* xscreensaver, Copyright (c) 1999, 2000, 2003 by 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 @@ -43,19 +43,23 @@ get_gl_visual (Screen *screen) # define D GLX_DEPTH_SIZE # define I GLX_BUFFER_SIZE # define DB GLX_DOUBLEBUFFER +# define ST GLX_STENCIL_SIZE int attrs[][20] = { - { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, 0 }, /* rgb double */ - { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, 0 }, - { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, 0 }, - { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, 0 }, /* rgb single */ - { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, 0 }, - { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, 0 }, - { I, 8, D, 8, DB, 0 }, /* cmap double */ - { I, 4, D, 4, DB, 0 }, - { I, 8, D, 8, 0 }, /* cmap single */ - { I, 4, D, 4, 0 }, - { GLX_RGBA, R, 1, G, 1, B, 1, D, 1, 0 } /* monochrome */ + { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, ST,1, 0 }, /* rgb double, stencil */ + { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, ST,1, 0 }, + { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, ST,1, 0 }, + { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, DB, 0 }, /* rgb double */ + { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, DB, 0 }, + { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, DB, 0 }, + { GLX_RGBA, R, 8, G, 8, B, 8, D, 8, 0 }, /* rgb single */ + { GLX_RGBA, R, 4, G, 4, B, 4, D, 4, 0 }, + { GLX_RGBA, R, 2, G, 2, B, 2, D, 2, 0 }, + { I, 8, D, 8, DB, 0 }, /* cmap double */ + { I, 4, D, 4, DB, 0 }, + { I, 8, D, 8, 0 }, /* cmap single */ + { I, 4, D, 4, 0 }, + { GLX_RGBA, R, 1, G, 1, B, 1, D, 1, 0 } /* monochrome */ }; int i; diff --git a/utils/yarandom.c b/utils/yarandom.c index 3d24943e..f12ea952 100644 --- a/utils/yarandom.c +++ b/utils/yarandom.c @@ -1,6 +1,16 @@ /* yarandom.c -- Yet Another Random Number Generator. + * Copyright (c) 1997, 1998, 2003 by 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 + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ - The unportable mess that is rand(), random(), drand48() and friends led me +/* The unportable mess that is rand(), random(), drand48() and friends led me to ask Phil Karlton what the Right Thing to Do was. He responded with this. It is non-cryptographically secure, reasonably random (more so than anything that is in any C library), and very fast. diff --git a/utils/yarandom.h b/utils/yarandom.h index 14a287fa..3a4acbf0 100644 --- a/utils/yarandom.h +++ b/utils/yarandom.h @@ -47,16 +47,16 @@ extern void ya_rand_init (unsigned int); /* Implement frand using GCC's statement-expression extension. */ # define frand(f) \ - ({ double tmp = (((double) random()) / \ - (((double) ((unsigned int)~0)) / ((double) (f)))); \ + ({ double tmp = ((((double) random()) * ((double) (f))) / \ + ((double) ((unsigned int)~0))); \ tmp < 0 ? (-tmp) : tmp; }) #else /* not GCC2 - implement frand using a global variable.*/ static double _frand_tmp_; # define frand(f) \ - (_frand_tmp_ = (((double) random()) / \ - (((double) ((unsigned int)~0)) / ((double) (f)))), \ + (_frand_tmp_ = ((((double) random()) * ((double) (f))) / \ + ((double) ((unsigned int)~0))), \ _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_) #endif /* not GCC2 */ diff --git a/xscreensaver.lsm b/xscreensaver.lsm index d3f62356..00d401cb 100644 --- a/xscreensaver.lsm +++ b/xscreensaver.lsm @@ -1,7 +1,7 @@ Begin3 Title: xscreensaver -Version: 4.07 -Entered-date: 03FEB03 +Version: 4.08 +Entered-date: 18FEB03 Description: A modular screen saver and locker for the X Window System. Highly customizable: allows the use of any program that can draw on the root window as a display mode. @@ -10,16 +10,16 @@ Keywords: screen saver, screen lock, lock, xlock, X11 Author: jwz@jwz.org (Jamie Zawinski) Maintained-by: jwz@jwz.org (Jamie Zawinski) Primary-site: http://www.jwz.org/xscreensaver/ - 3242K xscreensaver-4.07.tar.gz - 62K xscreensaver.README + 3283K xscreensaver-4.08.tar.gz + 63K xscreensaver.README 1K xscreensaver.lsm Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/ - 3242K xscreensaver-4.07.tar.gz - 62K xscreensaver.README + 3283K xscreensaver-4.08.tar.gz + 63K xscreensaver.README 1K xscreensaver.lsm Alternate-site: ftp.x.org /contrib/applications/ - 3242K xscreensaver-4.07.tar.gz - 62K xscreensaver.README + 3283K xscreensaver-4.08.tar.gz + 63K xscreensaver.README 1K xscreensaver.lsm Platforms: Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD, BSDI, SCO, OSF1, Ultrix, VMS. diff --git a/xscreensaver.spec b/xscreensaver.spec index ddf1aa15..549440e7 100644 --- a/xscreensaver.spec +++ b/xscreensaver.spec @@ -1,5 +1,5 @@ %define name xscreensaver -%define version 4.07 +%define version 4.08 %define release 1 %define serial 1 %define x11_prefix /usr/X11R6 -- 2.30.2