@$(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 ; \
============
+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.
+###############################################################################
+#
+# 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.
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 >/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'
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
if test "$have_kerberos5" = yes ; then
# from Matt Knopp <mhat@infocalypse.netlag.com>
# (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 <tjs@psaux.com> for FreeBSD 4.2
PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
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
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
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
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat > conftest.$ac_ext <<EOF
-#line 14530 "configure"
+#line 14663 "configure"
#include "confdefs.h"
#include <GL/gl.h>
#ifndef MESA_MAJOR_VERSION
# 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
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'
warn2 'GLE library at <http://www.linas.org/gle/>. For general'
warn2 'OpenGL info, see <http://www.opengl.org/>.'
+ fi
fi
-# configure.in --- xscreensaver, Copyright (c) 1997-2002 Jamie Zawinski.
+# configure.in --- xscreensaver, Copyright (c) 1997-2003 Jamie Zawinski.
#
AC_PREREQ(2.52)
])
+###############################################################################
+#
+# 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 >/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.
# 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])
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
if test "$have_kerberos5" = yes ; then
# from Matt Knopp <mhat@infocalypse.netlag.com>
# (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 <tjs@psaux.com> for FreeBSD 4.2
PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lcom_err"
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
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
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
# 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
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'
warn2 'GLE library at <http://www.linas.org/gle/>. For general'
warn2 'OpenGL info, see <http://www.opengl.org/>.'
+ fi
fi
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
-datadir = @datadir@
+#datadir = @datadir@
+datadir = $(GNOME_DATADIR)
localedir = $(datadir)/locale
mandir = @mandir@
mansuffix = 1
! 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/
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)" \
@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\
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)\" \
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\
/* demo-Gtk.c --- implements the interactive demo-mode and options dialogs.
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
{
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...)
/* 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
*/
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:
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:
/* 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 <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
#include <string.h>
#include <sys/types.h>
-#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 <kujawa@ultranet.com> for the MacOS X code.
+ */
+#ifdef __APPLE__
+# define HAVE_DARWIN
+#endif
+
+
+#if defined(HAVE_DARWIN)
+# include <Kerberos/Kerberos.h>
+#elif defined(HAVE_KERBEROS5)
# include <kerberosIV/krb.h>
# include <kerberosIV/des.h>
#else /* !HAVE_KERBEROS5 (meaning Kerberos 4) */
#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
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));
/* success */
return True;
+
+# endif /* !HAVE_DARWIN */
}
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;
/* Did we verify successfully? */
return success;
+
+# endif /* !HAVE_DARWIN */
}
#endif /* NO_LOCKING -- whole file */
/* passwd.c --- verifying typed passwords with the OS.
- * xscreensaver, Copyright (c) 1993-2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1993-2003 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
"%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);
}
-/* xscreensaver, Copyright (c) 1998, 2001 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1998, 2001, 2003 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
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";
XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
load_init_file (&si->prefs);
-
}
p->verbose_p = True;
.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
.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
-.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
-.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
-.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
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 */
}
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(),
"\t See the manual for details.\n",
blurb());
}
+
}
exit (1);
lock_initialization (si, &argc, argv);
+ print_lock_failure_banner (si);
if (p->xsync_p) XSynchronize (si->dpy, True);
# endif
}, { "XINERAMA", "Xinerama",
True
+ }, { "Apple-DRI", "Apple-DRI (XDarwin)",
+ True
},
};
.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
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
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
.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.
.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
.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
.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)
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)
(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;
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
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
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
.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
.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
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.
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,
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),
.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),
.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
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.
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 \
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 \
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
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 \
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.
#
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
#include "screenhack.h"
#include <X11/Xutil.h>
+#include <time.h>
+#include <sys/time.h>
+#include <ctype.h>
/* parameters that are user configurable */
/* delay (usec) between iterations */
static int delay;
-static int scroll_p;
-
-
/* non-user-modifiable immutable definitions */
#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;
static Colormap cmap; /* the colormap of the window */
static GC theGC; /* GC for drawing */
+unsigned long fg_pixel;
+static Bool button_down_p;
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 *))
* 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);
}
}
default:
{
- printf("Bad supplement\n");
+ fprintf (stderr, "%s: bad supplement (%d digits)\n",
+ progname, len);
exit(1);
break;
}
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],
}
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);
}
}
default:
{
- printf("Bad barcode\n");
+ fprintf (stderr, "%s: bad barcode (%d digits)\n",
+ progname, digitCount);
exit(1);
}
}
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);
}
+/* 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)
/* 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 */
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 }
};
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)
{
{
oneIteration ();
XSync (dpy, False);
- screenhack_handle_events (dpy);
+ barcode_handle_events (dpy);
usleep (delay);
}
}
[\-window]
[\-root]
[\-delay \fInumber\fP]
+[\-clock]
+[\-clock24]
.SH DESCRIPTION
This draws a random sequence of colorful barcodes scrolling across your
screen.
.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
$ 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
$ 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
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/
--- /dev/null
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="atunnel" _label="Atunnel">
+
+ <command arg="-root"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="20000" default="10000"
+ convert="invert"/>
+
+ <select id="render">
+ <option id="normal" _label="Normal"/>
+ <option id="solid" _label="Untextured" arg-set="-no-texture"/>
+ <option id="wire" _label="Wireframe" arg-set="-wire"/>
+ </select>
+
+ <boolean id="light" _label="Use light" arg-set="-light"/>
+
+ <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+ <_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.
+ </_description>
+</screensaver>
<command arg="-root"/>
+ <select id="mode">
+ <option id="scroll" _label="Scrolling Barcodes"/>
+ <option id="clock12" _label="Barcode Clock (AM/PM)" arg-set="-clock12"/>
+ <option id="clock24" _label="Barcode Clock (24 Hour)" arg-set="-clock24"/>
+ </select>
+
<number id="speed" type="slider" arg="-delay %"
_label="Speed" _low-label="Slow" _high-label="Fast"
low="0" high="20000" default="10000"
effect before, but no screensaver would really be complete without it.
It works best if there's something colorful visible. Warning, if the
effect continues after the screen saver is off, seek medical attention.
-Written by David Wald and Vivek Khera.
+Written by David Wald, Vivek Khera, Jamie Zawinski, and Vince Levey.
</_description>
</screensaver>
low="3" high="200" default="25"/>
<number id="gravity" type="slider" arg="-gravity %"
- _label="Gravity" _low-label="Freefall" _high-label="Jupiter"
+ _label="Gravity" _low-label=" Freefall" _high-label="Jupiter"
low="0.0" high="0.1" default="0.01"/>
<number id="wind" type="slider" arg="-wind %"
_label="Wind" _low-label="Still" _high-label="Hurricane"
low="0.0" high="0.1" default="0.00"/>
- <number id="friction" type="slider" arg="-friction %"
- _label="Friction" _low-label="Glass" _high-label="Sandpaper"
- low="0.0" high="4.0" default="0.8"/>
+ <number id="elasticity" type="slider" arg="-elasticity %"
+ _label="Friction" _low-label="Clay" _high-label="Rubber"
+ low="0.2" high="1.0" default="0.97"/>
<number id="speed" type="slider" arg="-delay %"
_label="Speed" _low-label="Slow" _high-label="Fast"
--- /dev/null
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="piecewise" _label="Piecewise">
+
+ <command arg="-root"/>
+
+ <number id="speed" type="slider" arg="-delay %"
+ _label="Speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="20000" default="5000"
+ convert="invert"/>
+
+ <number id="count" type="spinbutton" arg="-count %"
+ _label="Count" low="4" high="100" default="32"/>
+
+ <number id="colorspeed" type="slider" arg="-colorspeed %"
+ _label="Color shifting speed" _low-label="Slow" _high-label="Fast"
+ low="0" high="100" default="10"/>
+
+ <number id="minradius" type="slider" arg="-minradius %"
+ _label="Minimum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.05"/>
+
+ <number id="maxradius" type="slider" arg="-maxradius %"
+ _label="Maximum radius" _low-label="Small" _high-label="Large"
+ low="0.01" high="0.5" default="0.2"/>
+
+ <boolean id="db" _label="Double Buffer" arg-unset="-no-db"/>
+
+ <_description>
+This draws a bunch of moving circles which switch from visibility to
+invisibility at intersection points. Written by Geoffrey Irving.
+ </_description>
+</screensaver>
<number id="segments" type="slider" arg="-segments %"
_label="Segments" _low-label="Few" _high-label="Many"
- low="10" high="500" default="50"
- convert="invert"/>
+ low="10" high="500" default="50"/>
<number id="spread" type="slider" arg="-spread %"
_label="Density" _low-label="Sparse" _high-label="Dense"
SSystem was once available at <http://www1.las.es/~amil/ssystem/>,
but is now gone. You may still be able to find copies elsewhere.
-SSystem has since evolved into two different programs: OpenUniverse
-(http://openuniverse.sourceforge.net/) and Celestia
-(http://www.shatters.net/celestia/). Sadly, neither of these programs
-work with xscreensaver at all. You are encouraged to nag their authors
-into adding xscreensaver support!
+SSystem has since evolved into Celestia, found at
+<http://www.shatters.net/celestia/>. Sadly, Celestia does not work
+with xscreensaver at all. You are encouraged to nag the authors into
+adding xscreensaver support!
</_description>
</screensaver>
implied warranty.
.SH AUTHOR
Vivek Khera <khera@cs.duke.edu>, 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 <rick@skapunx.net> 05-Apr-1999.
+Modified by Vince Levey <vincel@vincel.org> 25-Oct-2001.
* Ported to X11 and xscreensaver by jwz, 27-Feb-2002.
*
* http://astronomy.swin.edu.au/~pbourke/modelling/fluid/
+ *
+ * Some physics improvements by Steven Barker <steve@blckknght.org>
*/
-/* 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 <math.h>
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. */
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");
{
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);
}
/* 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]))
"*random: True",
"*gravity: 0.01",
"*wind: 0.00",
- "*friction: 0.8",
+ "*elasticity: 0.97",
"*timeScale: 1.0",
"*doFPS: False",
"*shake: True",
{ "-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" },
[\-size \fInumber\fP]
[\-gravity \fInumber\fP]
[\-wind \fInumber\fP]
-[\-friction \fInumber\fP]
+[\-elasticity \fInumber\fP]
[\-delay \fInumber\fP]
[\-nonrandom]
[\-no-shake]
.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.).
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.
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 \
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@
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 \
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
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
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
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
--- /dev/null
+/* -*- 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) <lassauge@mail.dotcom.fr>
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#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
--- /dev/null
+.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 <romka@ut.ee>
+and can be found at http://romka.demonews.com
+
+.SH AUTHOR
+Roman Podobedov <romka@ut.ee>
+Eric Lassauge <lassauge@mail.dotcom.fr>
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;
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) {
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
-#include <malloc.h>
#include <GL/gl.h>
#include <GL/glu.h>
#ifdef HAVE_GLE3
}
}
+#if 0
#ifdef __ppc__
void UpdateSmoke_ScalarFrsqrte(global_info_t *global, flurry_info_t *flurry, SmokeV *s)
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);
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);
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);
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);
}
#endif
+#endif /* 0 */
void DrawSmoke_Scalar(global_info_t *global, flurry_info_t *flurry, SmokeV *s, float brightness)
{
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)
}
#endif
+#endif /* 0 */
# 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"
#ifdef USE_GL
-#include "rotator.h"
-#include "gltrackball.h"
-
static char *preset_str;
static XrmOptionDescRec opts[] = {
#endif
#include <sys/time.h>
-#include <sys/sysctl.h>
#include "flurry.h"
return currentTime() - gTimeCounter;
}
+#if 0
#ifdef __ppc__
static int IsAltiVecAvailable(void)
{
return 0;
}
#endif
+#endif
void delete_flurry_info(flurry_info_t *flurry)
{
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;
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+#if 0
#ifdef __ppc__
global->optMode = OPT_MODE_SCALAR_FRSQRTE;
#else
global->optMode = OPT_MODE_SCALAR_BASE;
#endif
+#endif /* 0 */
}
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);
UpdateSmoke_VectorUnrolled(global, flurry, flurry->s);
break;
#endif
+#endif /* 0 */
+
default:
break;
}
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;
}
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)
{
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;
/* system values */
GLXContext *glx_context;
Window window;
- rotator *rot;
- trackball_state *trackball;
- Bool button_down_p;
int optMode;
float sys_glWidth;
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);
}
{(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"},
};
{
#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();
told=tnew;
- return (ris/(float)CLOCKS_PER_SEC);
+ return (0.0125 + ris/(float)CLOCKS_PER_SEC);
#else
- return 0;
+ return 0.0150;
#endif
}
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);
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);
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);
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);
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
/* grab-ximage.c --- grab the screen to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
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
*/
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++)
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");
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);
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);
}
}
#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");
--- /dev/null
+/* -*- 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) <lassauge@mail.dotcom.fr>
+ * http://lassauge.free.fr/linux.html
+ *
+ * REVISION HISTORY:
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef USE_GL /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#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
--- /dev/null
+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);
--- /dev/null
+/* 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",
+"mnbbvxzljhdaue7<O@O;38qettyyyte8&5wuadfghhhhhgau;eakxcbmmNBVVCCZZZZCCCVVBNMnbxka:ydkzzxxxxzlkjdu;wagkklzzzzlkhfi;rajzzcvnnnmmmmm",
+"nnbvvxzkjgaiyq5:oX=37qetuuiiuyr9&5riafghjjjjjgdu;rdkxcnmMBBVCCZZZZZZZCCVBNMmbcla>yfkzxxcccxzljfu;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*7riaaaaapiutw7<O$+<8eiafhkzxcvb",
+"nmmmmmmnnbvcxkgp;eahllzxxxzlljfi;eajlzxcccccxzja:uhxbnMBVCCZZAAAAAAZZCVVBNmbvzha:rahjjkkkkjgfauw&6euppappiyte04;oX;5qtpdgjlxccbb",
+"nmmmmmmnnnvczkgp;eahklzzxxzlkjfu;eahllxccccxxlha>yhxbnMNBVCCZZZZZAZZZCVBNMmbczhp;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;eajzxcbnnmmmmmnmnbbvczlkgdpue7<O@O;370ertyyyte8&4wuadfghhjhhfay;eakxcbmMNBVVCCZ",
+"ZZZZZZCVVNMmbckd>yfkxxxcccxzljfu;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"
+};
--- /dev/null
+/* 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=-&<qzbbMMVbgzbMmbbh",
+"@$$*@.*;:;=$%$;=evvcBCAbbnABABDb0#@=****1-5<=<==ezAbAASCbbvvMhjx",
+"@*$O.@=:*:*@##=$qkmvNMDbNcCbDSBmq=X@X*::=4&$O,@%ennNBSBbmBmnnvbj",
+"5=***=4;**1@$ #%qvkbmcSSBNNSFDAAt@$$:@&*-=,@@$=:7AAbBvmbmMBANnbk",
+"r-*;*=<=;-1%+ X.7zbjsznbSSVDFFSAa;1<*<<:;2-,-:<$9AAndpsjzSAFBjdj",
+"e*&4-5;<:$*+o# <hhdhjMAFANASSAny02;5-<,-*2-85;*5AABjdjjzAAAmjjh",
+"8*@::;;5*$*@X$:.7pgsyggkSAmNVSnze-;2*,&*.,22685;qznBglbbmzBzcbzh",
+"8*#XO+o1===@@&@@9jjjjkckBbkhkbbMe*O*@*,&&22r8846yASVBBBkkmzcMMBV",
+"7=@.#XO@--6<=-*.<aljhcMVBmchkhhby<-82O1oy3<>*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",
+"<pjygdkkNNZbNNbty#.X+@*5*:*$$$X.9sshgcBSDBSCDVVVe5;;*<0e02*@$1@2",
+"#phpiukVBDDcSlbi0%%o@o$=-*<;X$X 4xxnmskMVVCCCBNCu1=*<;*<;;;,1<:<",
+"%phaetlmBCCCDCcl0#<2%==**:4-X#@$qszmclmVDDCZVmlBg*:$@@=<;;@*<2=2",
+"@tjdahfkNSDNNjule%=*1:1<**%=*% %asxkilVBDCZSljNt.#O&=.*-@&26<,&",
+"<bftdujccBCCNcbvq=@:<7<*&+#X@.#X:phhzlbBNDDSSBNmy=@X*==<=,*511*$",
+"1hbvcNNbCSSSNBZBy184-::=*O@*:%=4qzzzlmlmmDFDFVMMy-@*-2*<:@@*@$@=",
+"<dfnbbNNCCCBmCFCi2>*=15<2@@#=@X=4szzMmlVhSCclkNAe=$*228*62&.@#.@",
+"1fNNNABvbkcbFCDDi<262:-7;*:$=#=<qxzhgzgmtlcmjkkAe=@&:68*282$#O..",
+"<hNCSVBbuuBCSCCCt22=%:;;;,=*4<==9AAMbkmkhshkyphMa=%:*82-*<8;=$$O",
+"=cScSDBvjjbmBDFDy &o%*=::*<12%@#7zAAmhssptptshkcy=541<<-2<<;;%$$",
+"2NSmmDSkjvcBZCFF0.#.OX$$1&*$.O*=9zzzgyqpttdpdjhmy*:<&=111-**-o#@",
+"6kNBcSSbBkjSDDDDt*o.+#O$*@oX+,&@9xxlhattcuighihct<o.o=<88;-<*O.$",
+"0kNbbBMklgbSSSVCto.o .$*:$o@.X+@1czkkhuphthjghuce-1o*1%;85*1%$$#",
+"<dhcbNkjdhnASDCBy1X.X#@OX:#@@, *7kmlhggugytfksllt&@&@=-<O&**@@@X",
+"#gNvvldappxASSVB0@@*.*<@.$O%**1%0glgytdgy0yppivc01%o.@==;-&@%$$.",
+"=<79ee9q4947edtyeqeteeyy09tsyyytq949611<<<9427ry0reqtjhdaaq0eq74",
+"X.@=.O O+O+*<2@3ibcbAzchiglvmmzmew@# @%@@@#%=#12tvBcnAAznddhhpaa",
+"X+$:X@$$O$$<15%oekhczhcftiigBVNme11oo..X%*@==$<8iSCmhhkMhtdjhigs",
+"<*=*+@$:#X-&&%&%0tudytcBhcyjmVAVy:%@# ..+$*:<47ytCBBSBbNkjhvkhhz",
+"#=@oX$oOX+&*.Oo%qhgggyackNvkbNAbt2=X##...@1*,@*5tDSNBNAjdhzpdjjv",
+"#@@.$%*:o @@+o$*9ghgddhdlimbmkSNa%o@#%#O$=&;;=-8eCbcNAmbvcbgiagh",
+"o#.oO==1:$XXO:$-9ddiclkdhllmABMbe=oO+*@o@;::,-82eVdccmgbNSbikjmj",
+"@o#o@@##@X@.X#*<eduhighgiuzkfhphyo@#oo@%Xo%7:<6<enNbcjmbcbVcAABb",
+"<$X,XO**OXooo$*:qhhddetigdhshxxhq,.*@#,Ooo&*:<<-0ABmNbNgjgbkkBSm",
+"#$$+X#@$$oo o$;-7hlpitetsghppahhq*@oo&#X+,**<<<<7hbbDklhlhkVkzhb",
+"=&=*#:@$OoO&*%;:5pcvhatdkmhypgpze..*-:@=&@*&5:=2qABBBzhhuhgmlhyl",
+"6:=@$@***:@-=*-;7kvfdghhzhzpppgh7=%=1-1=-&O@$=%60nNcMmjlvjhhkiyu",
+"4=%%=**&*-*-$.<=6uvvlhkhhxzhhpdy0@.&-*<%-X#o*1:-5blcMmjjuhjjhcgj",
+"7:*@#@*25<22@,*%<uvvlbzkxzhzhypd4@&1<**+o&*#O#$%6mkfjlbkklglkBzh",
+"q41 .*%;222<&**$=ivvhmzmbzzphsjbe=11&&+++@=..X#$1zchbmcmckjzbzMm",
+"%$@ O@:=-561<;1<yyidssajxpsshzmp42--<&@ $%@.@X#2yghjBbNmbzBbxjh",
+"19996yystanjjfrt0<1270q9476q9q49eaeteeyeqe6qeq072w=<2ytt931yr0qq",
+"qxzshjpAAAFSASccq%@=:-$==14%%<+*ebbzzxpddphzxdbd4 #@;<=%@@=+$7O",
+"7shspxMAnAFADBbb9@*:=1X%%41#+5*=axhxAnjjxjnbjday7#.%=-<==&=;*:5X",
+"4xxhznnASDFDSbvk7X=%1@1:152@.*<-qzhxMbnAMxjbVzdp7%#. ,,><=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#<sccBjyislcjgfzh9:O=&11&o&O+.-&2",
+"%pzhxbMkbxnhdhdh9O$XX.## ++.XXO4hbbkhdphzjkzhsja%@=-=:@&-*1&,&=",
+"%fzbMxppxdfapzxhq=:::X#$ O$7dbbzdyahnAhhshp4%#O,;1@=&$=2-1&"
+};
--- /dev/null
+/* XPM */
+static char *texture2[] = {
+/* columns rows colors chars-per-pixel */
+"128 128 72 1",
+" c #1c2a23",
+". c #29352c",
+"X c #2b3c33",
+"o c #2f352b",
+"O c #2c433a",
+"+ c #344034",
+"@ c #38453a",
+"# c #394b45",
+"$ c #364f4a",
+"% c #474a3b",
+"& c #554e3c",
+"* c #645539",
+"= c #444d43",
+"- c #495448",
+"; c #575847",
+": c #545d54",
+"> 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"
+};
--- /dev/null
+/* piecewise, 21jan2003
+ * Geoffrey Irving <irving@caltech.edu>
+ *
+ * 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 <stdarg.h>
+#include <math.h>
+#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;i<n;i++) {
+ c[i].r = r0 + random() % dr;
+ c[i].x = c[i].r + frand(w - 1 - 2 * c[i].r);
+ c[i].y = c[i].r + frand(h - 1 - 2 * c[i].r);
+ c[i].visible = random() & 1;
+
+ c[i].ni = 0;
+ c[i].i = 0;
+
+ a = frand(2 * M_PI);
+ v = (1 + frand(0.5)) * speed / 10.0;
+ c[i].dx = v * cos(a);
+ c[i].dy = v * sin(a);
+
+ c[i].lo = s+i+i;
+ c[i].hi = s+i+i+1;
+ c[i].lo->c = 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;i<n;i++) { \
+ tweak_circle(c+i); \
+ c[i].lo->ni = c[i].hi->ni = 0; \
+ } \
+ goto RESTART; \
+ }
+
+ eq = 0;
+ for (i=0;i<n;i++)
+ circle_start_event(&eq, c+i);
+ f = 0;
+
+ while ((e = event_next(&eq))) {
+ switch (e->kind) {
+ 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;i<c->hi->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;i<c->ni;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<count;i++) {
+ draw_circle(dpy, b, draw_gc, circles+i);
+ move_circle(circles+i, xgwa.width, xgwa.height);
+ }
+ flush_arc_buffer(dpy, b, draw_gc);
+
+ if (++iterations % color_iterations == 0) {
+ color_index = (color_index + 1) % ncolors;
+ XSetForeground(dpy, draw_gc, colors[color_index].pixel);
+ }
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ if (backb) {
+ XdbeSwapInfo info[1];
+ info[0].swap_window = window;
+ info[0].swap_action = XdbeUndefined;
+ XdbeSwapBuffers (dpy, info, 1);
+ }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+ if (dbuf) {
+ XCopyArea (dpy, b, window, erase_gc, 0, 0, xgwa.width, xgwa.height, 0, 0);
+ b = (b == ba ? bb : ba);
+ }
+
+ XSync(dpy, False);
+ screenhack_handle_events(dpy);
+ if (delay)
+ usleep(delay);
+ }
+ }
--- /dev/null
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+piecewise - lots of moving circles intersecting in interesting ways.
+.SH SYNOPSIS
+.B piecewise
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-colorspeed \fInumber\fP]
+[\-minradius \fInumber\fP]
+[\-maxradius \fInumber\fP]
+[\-no-db]
+.SH DESCRIPTION
+This draws a bunch of moving circles which switch from visibility to invisibility
+when they intersect.
+.SH OPTIONS
+.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 \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds. Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-count \fInumber\fP
+Number of circles. Default: 32.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors, only one of which is used at a time. Default: 256.
+.TP 8
+.B \-colorspeed \fInumber\fP
+How fast the color changes (0 - 100). Default: 10.
+.TP 8
+.B \-minradius \fInumber\fP
+Minimum circle radius (as a proportion of screen height). Default: 0.05.
+.TP 8
+.B \-maxradius \fInumber\fP
+Maximum circle radius (as a proportion of screen height). Default: 0.2.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.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 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.
+.SH AUTHOR
+Geoffrey Irving.
+2003-02-12 Eric Lassauge <lassauge@mail.dotcom.fr>
+
+ * fr.po: Updated French translation.
+
2002-06-18 Carlos Perello Marin <carlos@gnome-db.org>
* INFO, xscreensaver.pot: Updated from 4.0.5 release.
-# 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
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
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
# xscreensaver fr.po
# Copyright (C) 2002 Free Software Foundation, Inc.
# maintainer: Christophe Merlet (RedFox) <redfox@eikonex.org>, 2002.
-# Eric Lassauge <lassauge@mail.dotcom.fr>, 2002.
-# http://lassauge.free.fr/
+# Eric Lassauge <lassauge@mail.dotcom.fr>, 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 <lassauge@mail.dotcom.fr>\n"
#: 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"
#: 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"
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..."
#: 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"
#: 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"
#: 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"
#: 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 ""
#: 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"
"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"
"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"
"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."
#: 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"
"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:"
#: 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."
#: 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."
#: 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
#: 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"
#: 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"
#: hacks/config/attraction.xml.h:12
msgid "Inward"
-msgstr ""
+msgstr "Vers l'intérieur"
#: hacks/config/attraction.xml.h:14
msgid ""
#: 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
#: hacks/config/blitspin.xml.h:6
msgid "Grab Screen"
-msgstr ""
+msgstr "Acquisition de l'écran"
#: hacks/config/blitspin.xml.h:8
msgid ""
#: hacks/config/boxed.xml.h:2
msgid "Boxed"
-msgstr ""
+msgstr "Avec la boîte"
#: hacks/config/boxed.xml.h:3
msgid ""
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
#: 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"
#: 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"
#: 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 ""
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"
#: hacks/config/discrete.xml.h:1
msgid "Discrete"
-msgstr "Discret"
+msgstr "Discrète"
#: hacks/config/discrete.xml.h:5
msgid ""
#: 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"
#: hacks/config/electricsheep.xml.h:1
msgid "ElectricSheep"
-msgstr "Mouton électrique"
+msgstr ""
#: hacks/config/electricsheep.xml.h:2
msgid ""
#: 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"
#: hacks/config/fadeplot.xml.h:3
msgid "FadePlot"
-msgstr "Ruban"
+msgstr ""
#: hacks/config/flag.xml.h:1
msgid "Bitmap for Flag"
#: hacks/config/flame.xml.h:8
msgid "Flame"
-msgstr "Xflame"
+msgstr "Flame"
#: hacks/config/flame.xml.h:13
msgid "Number of Fractals"
#: hacks/config/gears.xml.h:10
msgid "Three Gear System"
-msgstr ""
+msgstr "Système à trois roues"
#: hacks/config/gflux.xml.h:2
msgid "Checkerboard"
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 <lassauge@mail.dotcom."
-"fr>"
+"OpenGL pour les textures. Ecris par Eric Lassauge <lassauge@mail.dotcom.fr>"
#: hacks/config/glforestfire.xml.h:5
msgid "Fog"
#: 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 ""
#: hacks/config/morph3d.xml.h:4
msgid "Morph3D"
-msgstr ""
+msgstr "Morph 3D"
#: hacks/config/mountain.xml.h:3
msgid ""
#: hacks/config/petri.xml.h:4
msgid "Diamond"
-msgstr "Diamand"
+msgstr "Diamant"
#: hacks/config/petri.xml.h:6
msgid "Fertility"
#: 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"
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. "
#: hacks/config/pulsar.xml.h:1
msgid "Anti-alias Lines"
-msgstr ""
+msgstr "Lignes anti-aliasées"
#: hacks/config/pulsar.xml.h:3
msgid ""
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"
msgstr "Rotation"
#: hacks/config/rocks.xml.h:10
-#, fuzzy
msgid "Steering"
-msgstr "Démarre"
+msgstr ""
#: hacks/config/rocks.xml.h:11
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 <lassauge@mail.dotcom.fr>"
#: hacks/config/sballs.xml.h:5
msgid "Icosahedron"
#: 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"
#: hacks/config/xmatrix.xml.h:2
msgid "Binary Encoding"
-msgstr "Encodag binaire"
+msgstr "Encodage binaire"
#: hacks/config/xmatrix.xml.h:3
msgid "Expansion Algorithm"
#~ 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"
#~ 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."
#~ 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"
#~ msgid "_Lock Screen After"
#~ msgstr "_Blocage de l'écran après"
+#~ msgid "_Mode:"
+#~ msgstr "_Mode:"
+
#~ msgid "_Off After"
#~ msgstr "Coup_ure après"
#~ msgid "_Settings..."
#~ msgstr "_Paramètres..."
+#~ msgid "_Standard <<"
+#~ msgstr "_Standard <<"
+
#~ msgid "_Verbose Diagnostics"
#~ msgstr "Diagnostiques _verbeux"
#~ 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 <lassauge@mail.dotcom.fr>"
+
+#~ 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)"
#~ msgid "Giant Lavalite"
#~ msgstr "Lavalite géante"
+#~ msgid "LavaLite"
+#~ msgstr "Lavalite"
+
#~ msgid "Max Blobs"
#~ msgstr "Blobs max"
#~ 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"
#~ 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"
$ penrose :== $'mydir'penrose
$ petri :== $'mydir'petri
$ phosphor :== $'mydir'phosphor
+$ piecewise :== $'mydir'piecewise
$ polyominoes :== $'mydir'polyominoes
$ popsquares :== $'mydir'popsquares
$ pyro :== $'mydir'pyro
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)";
-/* xscreensaver, Copyright (c) 1999, 2000 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999, 2000, 2003 by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
# 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;
/* yarandom.c -- Yet Another Random Number Generator.
+ * Copyright (c) 1997, 1998, 2003 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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 <karlton@netscape.com> 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.
/* 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 */
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.
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.
%define name xscreensaver
-%define version 4.07
+%define version 4.08
%define release 1
%define serial 1
%define x11_prefix /usr/X11R6