From f3e0240915ed9f9b3a61781f5c7002d587563fe0 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Mon, 2 Mar 2009 00:42:21 -0500 Subject: [PATCH] ftp://ftp.uni-heidelberg.de/pub/X11/contrib/applications/xscreensaver-2.07.tar.gz -rw-r--r-- 1 zblaxell zblaxell 627973 Feb 27 13:23 xscreensaver-2.07.tar.gz 7b3caf8378ccfdf6bac3845319392a0b4c4b3ff7 xscreensaver-2.07.tar.gz --- INSTALL | 183 + Makefile.in | 73 + README | 270 + README.VMS | 59 + cde.txt | 98 + config.guess | 693 +++ config.h-vms | 251 + config.h.in | 246 + config.sub | 927 +++ configure | 5404 +++++++++++++++++ configure.in | 1179 ++++ driver/.gdbinit | 25 + driver/Makefile.in | 281 + driver/README | 6 + .../XScreenSaver => driver/XScreenSaver.ad.in | 15 +- driver/XScreenSaver_ad.h | 213 + driver/compile_axp.com | 15 + driver/compile_decc.com | 15 + driver/demo.c | 978 +++ driver/dialogs-Xaw.c | 311 + driver/dialogs-Xm.c | 701 +++ driver/dialogs.xd | 569 ++ driver/kpasswd.c | 180 + driver/link_axp.com | 15 + driver/link_decc.com | 15 + driver/lock.c | 723 +++ driver/passwd.c | 238 + driver/stderr.c | 451 ++ driver/subprocs.c | 1084 ++++ driver/timers.c | 633 ++ driver/vms-getpwnam.c | 132 + driver/vms-hpwd.c | 75 + driver/vms-pwd.h | 48 + driver/vms-validate.c | 75 + driver/vms_axp.opt | 5 + driver/vms_axp_12.opt | 5 + driver/vms_decc.opt | 5 + driver/vms_decc_12.opt | 5 + driver/windows.c | 1126 ++++ driver/xscreensaver-command.c | 255 + .../xscreensaver-command.man | 0 driver/xscreensaver.c | 1128 ++++ driver/xscreensaver.h | 368 ++ .../xscreensaver.1 => driver/xscreensaver.man | 0 driver/xset.c | 232 + hacks/.gdbinit | 4 + hacks/Makefile.in | 917 +++ hacks/README | 6 + hacks/attraction.c | 666 ++ .../attraction.1 => hacks/attraction.man | 0 hacks/blitspin.c | 341 ++ .../man.1/blitspin.1 => hacks/blitspin.man | 0 hacks/bob.xbm | 43 + hacks/bouboule.c | 841 +++ .../man.1/bouboule.1 => hacks/bouboule.man | 0 hacks/braid.c | 414 ++ local/man/man.1/braid.1 => hacks/braid.man | 0 hacks/bubbles-samples/blood.bub.gz | Bin 0 -> 19382 bytes hacks/bubbles-samples/blue.bub.gz | Bin 0 -> 20129 bytes hacks/bubbles-samples/jade.bub.gz | Bin 0 -> 20111 bytes hacks/bubbles-sources/blood.pov | 24 + hacks/bubbles-sources/blue.pov | 22 + hacks/bubbles-sources/glass.pov | 27 + hacks/bubbles-sources/jade.pov | 24 + hacks/bubbles-tools/bubblestodefault | 115 + hacks/bubbles-tools/bubblestofile | 107 + hacks/bubbles-tools/xpm2default | 51 + hacks/bubbles.c | 1869 ++++++ hacks/bubbles.h | 214 + .../man/man.1/bubbles.1 => hacks/bubbles.man | 0 hacks/bubbles_default.c | 2127 +++++++ hacks/compile_axp.com | 51 + hacks/compile_decc.com | 51 + hacks/decayscreen.c | 139 + .../decayscreen.1 => hacks/decayscreen.man | 0 hacks/deco.c | 152 + local/man/man.1/deco.1 => hacks/deco.man | 0 hacks/default.xbm | 1686 +++++ hacks/drift.c | 624 ++ local/man/man.1/drift.1 => hacks/drift.man | 0 hacks/fadeplot.c | 177 + hacks/flag.c | 488 ++ local/man/man.1/flag.1 => hacks/flag.man | 0 hacks/flame.c | 401 ++ local/man/man.1/flame.1 => hacks/flame.man | 0 hacks/forest.c | 206 + local/man/man.1/forest.1 => hacks/forest.man | 0 hacks/fract.c | 135 + local/man/man.1/fract.1 => hacks/fract.man | 0 hacks/galaxy.c | 442 ++ local/man/man.1/galaxy.1 => hacks/galaxy.man | 0 hacks/glx/Makefile.in | 333 + hacks/glx/README | 6 + hacks/glx/buildlwo.c | 101 + hacks/glx/buildlwo.h | 24 + hacks/glx/e_textures.h | 1478 +++++ hacks/glx/escher.c | 814 +++ hacks/glx/gears.c | 481 ++ hacks/glx/morph3d.c | 860 +++ hacks/glx/pipeobjs.c | 3267 ++++++++++ hacks/glx/pipes.c | 1008 +++ hacks/glx/rubik.c | 1402 +++++ hacks/glx/s1_1.c | 1058 ++++ hacks/glx/s1_2.c | 1057 ++++ hacks/glx/s1_3.c | 1057 ++++ hacks/glx/s1_4.c | 1057 ++++ hacks/glx/s1_5.c | 1057 ++++ hacks/glx/s1_6.c | 1057 ++++ hacks/glx/s1_b.c | 537 ++ hacks/glx/sproingies.c | 820 +++ hacks/glx/sproingiewrap.c | 227 + hacks/glx/superquadrics.c | 757 +++ hacks/glx/xlock-gl.c | 173 + hacks/goop.c | 534 ++ local/man/man.1/goop.1 => hacks/goop.man | 0 hacks/grav.c | 322 + local/man/man.1/grav.1 => hacks/grav.man | 0 hacks/greynetic.c | 182 + .../man.1/greynetic.1 => hacks/greynetic.man | 0 hacks/halo.c | 450 ++ local/man/man.1/halo.1 => hacks/halo.man | 0 hacks/helix.c | 302 + local/man/man.1/helix.1 => hacks/helix.man | 0 hacks/hopalong.c | 255 + .../man.1/hopalong.1 => hacks/hopalong.man | 0 hacks/hypercube.c | 328 + .../man.1/hypercube.1 => hacks/hypercube.man | 0 hacks/ifs.c | 478 ++ local/man/man.1/ifs.1 => hacks/ifs.man | 0 hacks/imsmap.c | 502 ++ local/man/man.1/imsmap.1 => hacks/imsmap.man | 0 hacks/julia.c | 420 ++ local/man/man.1/julia.1 => hacks/julia.man | 0 hacks/kaleidescope.c | 464 ++ .../kaleidescope.1 => hacks/kaleidescope.man | 0 hacks/laser.c | 319 + local/man/man.1/laser.1 => hacks/laser.man | 0 hacks/lightning.c | 580 ++ .../man.1/lightning.1 => hacks/lightning.man | 0 hacks/link_axp.com | 103 + hacks/link_decc.com | 103 + hacks/lisa.c | 477 ++ local/man/man.1/lisa.1 => hacks/lisa.man | 0 hacks/lmorph.c | 498 ++ local/man/man.1/lmorph.1 => hacks/lmorph.man | 0 hacks/maze.c | 791 +++ local/man/man.1/maze.1 => hacks/maze.man | 0 hacks/moire.c | 193 + local/man/man.1/moire.1 => hacks/moire.man | 0 hacks/munch.c | 256 + local/man/man.1/munch.1 => hacks/munch.man | 0 hacks/noseguy.c | 720 +++ .../man/man.1/noseguy.1 => hacks/noseguy.man | 0 hacks/noses/nose-f1.xbm | 38 + hacks/noses/nose-f1.xpm | 74 + hacks/noses/nose-f2.xbm | 38 + hacks/noses/nose-f2.xpm | 74 + hacks/noses/nose-f3.xbm | 38 + hacks/noses/nose-f3.xpm | 74 + hacks/noses/nose-f4.xbm | 38 + hacks/noses/nose-f4.xpm | 73 + hacks/noses/nose-l1.xbm | 38 + hacks/noses/nose-l1.xpm | 74 + hacks/noses/nose-l2.xbm | 38 + hacks/noses/nose-l2.xpm | 74 + hacks/noses/nose-r1.xbm | 38 + hacks/noses/nose-r1.xpm | 74 + hacks/noses/nose-r2.xbm | 38 + hacks/noses/nose-r2.xpm | 74 + hacks/pedal.c | 380 ++ local/man/man.1/pedal.1 => hacks/pedal.man | 0 hacks/penrose.c | 1267 ++++ .../man/man.1/penrose.1 => hacks/penrose.man | 0 hacks/pyro.c | 248 + local/man/man.1/pyro.1 => hacks/pyro.man | 0 hacks/qix.c | 510 ++ local/man/man.1/qix.1 => hacks/qix.man | 0 hacks/rocks.c | 478 ++ local/man/man.1/rocks.1 => hacks/rocks.man | 0 hacks/rorschach.c | 134 + .../man.1/rorschach.1 => hacks/rorschach.man | 0 hacks/screenhack.c | 325 + hacks/screenhack.h | 98 + hacks/sierpinski.c | 162 + .../sierpinski.1 => hacks/sierpinski.man | 0 hacks/slidescreen.c | 265 + .../slidescreen.1 => hacks/slidescreen.man | 0 hacks/slip.c | 300 + local/man/man.1/slip.1 => hacks/slip.man | 0 hacks/sphere.c | 246 + local/man/man.1/sphere.1 => hacks/sphere.man | 0 hacks/spiral.c | 300 + local/man/man.1/spiral.1 => hacks/spiral.man | 0 hacks/starfish.c | 535 ++ .../man.1/starfish.1 => hacks/starfish.man | 0 hacks/strange.c | 404 ++ .../man/man.1/strange.1 => hacks/strange.man | 0 hacks/swirl.c | 1475 +++++ local/man/man.1/swirl.1 => hacks/swirl.man | 0 hacks/vms_axp.opt | 4 + hacks/vms_axp_12.opt | 4 + hacks/vms_decc.opt | 4 + hacks/vms_decc_12.opt | 4 + hacks/xlock.h | 192 + hacks/xlockmore.c | 353 ++ hacks/xlockmore.h | 149 + hacks/xlockmoreI.h | 91 + hacks/xroger-hack.c | 100 + local/man/man.1/xroger.1 => hacks/xroger.man | 0 install-sh | 250 + local/bin/attraction | Bin 48236 -> 0 bytes local/bin/blitspin | Bin 64652 -> 0 bytes local/bin/bouboule | Bin 46004 -> 0 bytes local/bin/braid | Bin 44364 -> 0 bytes local/bin/bubbles | Bin 87716 -> 0 bytes local/bin/decayscreen | Bin 36172 -> 0 bytes local/bin/deco | Bin 33840 -> 0 bytes local/bin/drift | Bin 45972 -> 0 bytes local/bin/escher | Bin 80280 -> 0 bytes local/bin/flag | Bin 45512 -> 0 bytes local/bin/flame | Bin 41840 -> 0 bytes local/bin/forest | Bin 41144 -> 0 bytes local/bin/fract | Bin 40076 -> 0 bytes local/bin/galaxy | Bin 44368 -> 0 bytes local/bin/gears | Bin 55744 -> 0 bytes local/bin/goop | Bin 40476 -> 0 bytes local/bin/grav | Bin 38440 -> 0 bytes local/bin/greynetic | Bin 25736 -> 0 bytes local/bin/halo | Bin 36980 -> 0 bytes local/bin/helix | Bin 32900 -> 0 bytes local/bin/hopalong | Bin 41540 -> 0 bytes local/bin/hypercube | Bin 38000 -> 0 bytes local/bin/ifs | Bin 45264 -> 0 bytes local/bin/imsmap | Bin 38080 -> 0 bytes local/bin/julia | Bin 45588 -> 0 bytes local/bin/kaleidescope | Bin 32872 -> 0 bytes local/bin/laser | Bin 37356 -> 0 bytes local/bin/lightning | Bin 39652 -> 0 bytes local/bin/lisa | Bin 43792 -> 0 bytes local/bin/lmorph | Bin 35444 -> 0 bytes local/bin/maze | Bin 33988 -> 0 bytes local/bin/moire | Bin 34200 -> 0 bytes local/bin/munch | Bin 37488 -> 0 bytes local/bin/noseguy | Bin 51876 -> 0 bytes local/bin/pedal | Bin 31944 -> 0 bytes local/bin/penrose | Bin 49368 -> 0 bytes local/bin/pipes | Bin 109404 -> 0 bytes local/bin/pyro | Bin 27164 -> 0 bytes local/bin/qix | Bin 33232 -> 0 bytes local/bin/rocks | Bin 34936 -> 0 bytes local/bin/rorschach | Bin 26560 -> 0 bytes local/bin/sierpinski | Bin 36460 -> 0 bytes local/bin/slidescreen | Bin 38696 -> 0 bytes local/bin/slip | Bin 41380 -> 0 bytes local/bin/sphere | Bin 37572 -> 0 bytes local/bin/spiral | Bin 41712 -> 0 bytes local/bin/sproingies | Bin 161604 -> 0 bytes local/bin/starfish | Bin 44512 -> 0 bytes local/bin/strange | Bin 44120 -> 0 bytes local/bin/superquadrics | Bin 55832 -> 0 bytes local/bin/swirl | Bin 46132 -> 0 bytes local/bin/xroger | Bin 29140 -> 0 bytes local/bin/xscreensaver | Bin 118192 -> 0 bytes local/bin/xscreensaver-command | Bin 15828 -> 0 bytes local/man/cat.1/attraction.1 | 264 - local/man/cat.1/blitspin.1 | 132 - local/man/cat.1/bouboule.1 | 132 - local/man/cat.1/braid.1 | 132 - local/man/cat.1/bubbles.1 | 198 - local/man/cat.1/decayscreen.1 | 132 - local/man/cat.1/deco.1 | 132 - local/man/cat.1/drift.1 | 132 - local/man/cat.1/flag.1 | 132 - local/man/cat.1/flame.1 | 132 - local/man/cat.1/forest.1 | 132 - local/man/cat.1/fract.1 | 132 - local/man/cat.1/galaxy.1 | 132 - local/man/cat.1/goop.1 | 132 - local/man/cat.1/grav.1 | 132 - local/man/cat.1/greynetic.1 | 132 - local/man/cat.1/halo.1 | 132 - local/man/cat.1/helix.1 | 132 - local/man/cat.1/hopalong.1 | 132 - local/man/cat.1/hypercube.1 | 132 - local/man/cat.1/ifs.1 | 132 - local/man/cat.1/imsmap.1 | 132 - local/man/cat.1/julia.1 | 132 - local/man/cat.1/kaleidescope.1 | 132 - local/man/cat.1/laser.1 | 132 - local/man/cat.1/lightning.1 | 132 - local/man/cat.1/lisa.1 | 132 - local/man/cat.1/lmorph.1 | 132 - local/man/cat.1/maze.1 | 198 - local/man/cat.1/moire.1 | 132 - local/man/cat.1/munch.1 | 264 - local/man/cat.1/noseguy.1 | 132 - local/man/cat.1/pedal.1 | 132 - local/man/cat.1/penrose.1 | 132 - local/man/cat.1/pyro.1 | 132 - local/man/cat.1/qix.1 | 198 - local/man/cat.1/rocks.1 | 132 - local/man/cat.1/rorschach.1 | 132 - local/man/cat.1/sierpinski.1 | 132 - local/man/cat.1/slidescreen.1 | 132 - local/man/cat.1/slip.1 | 132 - local/man/cat.1/sphere.1 | 132 - local/man/cat.1/spiral.1 | 132 - local/man/cat.1/starfish.1 | 132 - local/man/cat.1/strange.1 | 132 - local/man/cat.1/swirl.1 | 132 - local/man/cat.1/xroger.1 | 132 - local/man/cat.1/xscreensaver-command.1 | 198 - local/man/cat.1/xscreensaver.1 | 990 --- makevms.com | 57 + screenblank.txt | 46 + setup.com | 58 + utils/Makefile.in | 150 + utils/README | 6 + utils/ad2c | 38 + utils/alpha.c | 177 + utils/alpha.h | 32 + utils/colors.c | 681 +++ utils/colors.h | 140 + utils/compile_axp.com | 17 + utils/compile_decc.com | 17 + utils/fade.c | 309 + utils/fade.h | 19 + utils/grabscreen.c | 610 ++ utils/grabscreen.h | 22 + utils/hsv.c | 81 + utils/hsv.h | 27 + utils/overlay.c | 126 + utils/resources.c | 211 + utils/resources.h | 24 + utils/spline.c | 321 + utils/spline.h | 60 + utils/usleep.c | 58 + utils/usleep.h | 20 + utils/utils.h | 22 + utils/version.h | 2 + utils/visual.c | 432 ++ utils/visual.h | 26 + utils/vms-gtod.c | 31 + utils/vms-gtod.h | 85 + utils/vms-strdup.c | 25 + utils/vroot.h | 126 + utils/xmu.c | 168 + utils/xmu.h | 14 + utils/xroger.c | 96 + utils/yarandom.c | 114 + utils/yarandom.h | 52 + 351 files changed, 72249 insertions(+), 7860 deletions(-) create mode 100644 INSTALL create mode 100644 Makefile.in create mode 100644 README create mode 100644 README.VMS create mode 100644 cde.txt create mode 100755 config.guess create mode 100644 config.h-vms create mode 100644 config.h.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 driver/.gdbinit create mode 100644 driver/Makefile.in create mode 100644 driver/README rename lib/X11/app-defaults/XScreenSaver => driver/XScreenSaver.ad.in (97%) create mode 100644 driver/XScreenSaver_ad.h create mode 100644 driver/compile_axp.com create mode 100644 driver/compile_decc.com create mode 100644 driver/demo.c create mode 100644 driver/dialogs-Xaw.c create mode 100644 driver/dialogs-Xm.c create mode 100644 driver/dialogs.xd create mode 100644 driver/kpasswd.c create mode 100644 driver/link_axp.com create mode 100644 driver/link_decc.com create mode 100644 driver/lock.c create mode 100644 driver/passwd.c create mode 100644 driver/stderr.c create mode 100644 driver/subprocs.c create mode 100644 driver/timers.c create mode 100644 driver/vms-getpwnam.c create mode 100644 driver/vms-hpwd.c create mode 100644 driver/vms-pwd.h create mode 100644 driver/vms-validate.c create mode 100644 driver/vms_axp.opt create mode 100644 driver/vms_axp_12.opt create mode 100644 driver/vms_decc.opt create mode 100644 driver/vms_decc_12.opt create mode 100644 driver/windows.c create mode 100644 driver/xscreensaver-command.c rename local/man/man.1/xscreensaver-command.1 => driver/xscreensaver-command.man (100%) create mode 100644 driver/xscreensaver.c create mode 100644 driver/xscreensaver.h rename local/man/man.1/xscreensaver.1 => driver/xscreensaver.man (100%) create mode 100644 driver/xset.c create mode 100644 hacks/.gdbinit create mode 100644 hacks/Makefile.in create mode 100644 hacks/README create mode 100644 hacks/attraction.c rename local/man/man.1/attraction.1 => hacks/attraction.man (100%) create mode 100644 hacks/blitspin.c rename local/man/man.1/blitspin.1 => hacks/blitspin.man (100%) create mode 100644 hacks/bob.xbm create mode 100644 hacks/bouboule.c rename local/man/man.1/bouboule.1 => hacks/bouboule.man (100%) create mode 100644 hacks/braid.c rename local/man/man.1/braid.1 => hacks/braid.man (100%) create mode 100644 hacks/bubbles-samples/blood.bub.gz create mode 100644 hacks/bubbles-samples/blue.bub.gz create mode 100644 hacks/bubbles-samples/jade.bub.gz create mode 100644 hacks/bubbles-sources/blood.pov create mode 100644 hacks/bubbles-sources/blue.pov create mode 100644 hacks/bubbles-sources/glass.pov create mode 100644 hacks/bubbles-sources/jade.pov create mode 100755 hacks/bubbles-tools/bubblestodefault create mode 100755 hacks/bubbles-tools/bubblestofile create mode 100755 hacks/bubbles-tools/xpm2default create mode 100644 hacks/bubbles.c create mode 100644 hacks/bubbles.h rename local/man/man.1/bubbles.1 => hacks/bubbles.man (100%) create mode 100644 hacks/bubbles_default.c create mode 100644 hacks/compile_axp.com create mode 100644 hacks/compile_decc.com create mode 100644 hacks/decayscreen.c rename local/man/man.1/decayscreen.1 => hacks/decayscreen.man (100%) create mode 100644 hacks/deco.c rename local/man/man.1/deco.1 => hacks/deco.man (100%) create mode 100644 hacks/default.xbm create mode 100644 hacks/drift.c rename local/man/man.1/drift.1 => hacks/drift.man (100%) create mode 100644 hacks/fadeplot.c create mode 100644 hacks/flag.c rename local/man/man.1/flag.1 => hacks/flag.man (100%) create mode 100644 hacks/flame.c rename local/man/man.1/flame.1 => hacks/flame.man (100%) create mode 100644 hacks/forest.c rename local/man/man.1/forest.1 => hacks/forest.man (100%) create mode 100644 hacks/fract.c rename local/man/man.1/fract.1 => hacks/fract.man (100%) create mode 100644 hacks/galaxy.c rename local/man/man.1/galaxy.1 => hacks/galaxy.man (100%) create mode 100644 hacks/glx/Makefile.in create mode 100644 hacks/glx/README create mode 100644 hacks/glx/buildlwo.c create mode 100644 hacks/glx/buildlwo.h create mode 100644 hacks/glx/e_textures.h create mode 100644 hacks/glx/escher.c create mode 100644 hacks/glx/gears.c create mode 100644 hacks/glx/morph3d.c create mode 100644 hacks/glx/pipeobjs.c create mode 100644 hacks/glx/pipes.c create mode 100644 hacks/glx/rubik.c create mode 100644 hacks/glx/s1_1.c create mode 100644 hacks/glx/s1_2.c create mode 100644 hacks/glx/s1_3.c create mode 100644 hacks/glx/s1_4.c create mode 100644 hacks/glx/s1_5.c create mode 100644 hacks/glx/s1_6.c create mode 100644 hacks/glx/s1_b.c create mode 100644 hacks/glx/sproingies.c create mode 100644 hacks/glx/sproingiewrap.c create mode 100644 hacks/glx/superquadrics.c create mode 100644 hacks/glx/xlock-gl.c create mode 100644 hacks/goop.c rename local/man/man.1/goop.1 => hacks/goop.man (100%) create mode 100644 hacks/grav.c rename local/man/man.1/grav.1 => hacks/grav.man (100%) create mode 100644 hacks/greynetic.c rename local/man/man.1/greynetic.1 => hacks/greynetic.man (100%) create mode 100644 hacks/halo.c rename local/man/man.1/halo.1 => hacks/halo.man (100%) create mode 100644 hacks/helix.c rename local/man/man.1/helix.1 => hacks/helix.man (100%) create mode 100644 hacks/hopalong.c rename local/man/man.1/hopalong.1 => hacks/hopalong.man (100%) create mode 100644 hacks/hypercube.c rename local/man/man.1/hypercube.1 => hacks/hypercube.man (100%) create mode 100644 hacks/ifs.c rename local/man/man.1/ifs.1 => hacks/ifs.man (100%) create mode 100644 hacks/imsmap.c rename local/man/man.1/imsmap.1 => hacks/imsmap.man (100%) create mode 100644 hacks/julia.c rename local/man/man.1/julia.1 => hacks/julia.man (100%) create mode 100644 hacks/kaleidescope.c rename local/man/man.1/kaleidescope.1 => hacks/kaleidescope.man (100%) create mode 100644 hacks/laser.c rename local/man/man.1/laser.1 => hacks/laser.man (100%) create mode 100644 hacks/lightning.c rename local/man/man.1/lightning.1 => hacks/lightning.man (100%) create mode 100644 hacks/link_axp.com create mode 100644 hacks/link_decc.com create mode 100644 hacks/lisa.c rename local/man/man.1/lisa.1 => hacks/lisa.man (100%) create mode 100644 hacks/lmorph.c rename local/man/man.1/lmorph.1 => hacks/lmorph.man (100%) create mode 100644 hacks/maze.c rename local/man/man.1/maze.1 => hacks/maze.man (100%) create mode 100644 hacks/moire.c rename local/man/man.1/moire.1 => hacks/moire.man (100%) create mode 100644 hacks/munch.c rename local/man/man.1/munch.1 => hacks/munch.man (100%) create mode 100644 hacks/noseguy.c rename local/man/man.1/noseguy.1 => hacks/noseguy.man (100%) create mode 100644 hacks/noses/nose-f1.xbm create mode 100644 hacks/noses/nose-f1.xpm create mode 100644 hacks/noses/nose-f2.xbm create mode 100644 hacks/noses/nose-f2.xpm create mode 100644 hacks/noses/nose-f3.xbm create mode 100644 hacks/noses/nose-f3.xpm create mode 100644 hacks/noses/nose-f4.xbm create mode 100644 hacks/noses/nose-f4.xpm create mode 100644 hacks/noses/nose-l1.xbm create mode 100644 hacks/noses/nose-l1.xpm create mode 100644 hacks/noses/nose-l2.xbm create mode 100644 hacks/noses/nose-l2.xpm create mode 100644 hacks/noses/nose-r1.xbm create mode 100644 hacks/noses/nose-r1.xpm create mode 100644 hacks/noses/nose-r2.xbm create mode 100644 hacks/noses/nose-r2.xpm create mode 100644 hacks/pedal.c rename local/man/man.1/pedal.1 => hacks/pedal.man (100%) create mode 100644 hacks/penrose.c rename local/man/man.1/penrose.1 => hacks/penrose.man (100%) create mode 100644 hacks/pyro.c rename local/man/man.1/pyro.1 => hacks/pyro.man (100%) create mode 100644 hacks/qix.c rename local/man/man.1/qix.1 => hacks/qix.man (100%) create mode 100644 hacks/rocks.c rename local/man/man.1/rocks.1 => hacks/rocks.man (100%) create mode 100644 hacks/rorschach.c rename local/man/man.1/rorschach.1 => hacks/rorschach.man (100%) create mode 100644 hacks/screenhack.c create mode 100644 hacks/screenhack.h create mode 100644 hacks/sierpinski.c rename local/man/man.1/sierpinski.1 => hacks/sierpinski.man (100%) create mode 100644 hacks/slidescreen.c rename local/man/man.1/slidescreen.1 => hacks/slidescreen.man (100%) create mode 100644 hacks/slip.c rename local/man/man.1/slip.1 => hacks/slip.man (100%) create mode 100644 hacks/sphere.c rename local/man/man.1/sphere.1 => hacks/sphere.man (100%) create mode 100644 hacks/spiral.c rename local/man/man.1/spiral.1 => hacks/spiral.man (100%) create mode 100644 hacks/starfish.c rename local/man/man.1/starfish.1 => hacks/starfish.man (100%) create mode 100644 hacks/strange.c rename local/man/man.1/strange.1 => hacks/strange.man (100%) create mode 100644 hacks/swirl.c rename local/man/man.1/swirl.1 => hacks/swirl.man (100%) create mode 100644 hacks/vms_axp.opt create mode 100644 hacks/vms_axp_12.opt create mode 100644 hacks/vms_decc.opt create mode 100644 hacks/vms_decc_12.opt create mode 100644 hacks/xlock.h create mode 100644 hacks/xlockmore.c create mode 100644 hacks/xlockmore.h create mode 100644 hacks/xlockmoreI.h create mode 100644 hacks/xroger-hack.c rename local/man/man.1/xroger.1 => hacks/xroger.man (100%) create mode 100755 install-sh delete mode 100755 local/bin/attraction delete mode 100755 local/bin/blitspin delete mode 100755 local/bin/bouboule delete mode 100755 local/bin/braid delete mode 100755 local/bin/bubbles delete mode 100755 local/bin/decayscreen delete mode 100755 local/bin/deco delete mode 100755 local/bin/drift delete mode 100755 local/bin/escher delete mode 100755 local/bin/flag delete mode 100755 local/bin/flame delete mode 100755 local/bin/forest delete mode 100755 local/bin/fract delete mode 100755 local/bin/galaxy delete mode 100755 local/bin/gears delete mode 100755 local/bin/goop delete mode 100755 local/bin/grav delete mode 100755 local/bin/greynetic delete mode 100755 local/bin/halo delete mode 100755 local/bin/helix delete mode 100755 local/bin/hopalong delete mode 100755 local/bin/hypercube delete mode 100755 local/bin/ifs delete mode 100755 local/bin/imsmap delete mode 100755 local/bin/julia delete mode 100755 local/bin/kaleidescope delete mode 100755 local/bin/laser delete mode 100755 local/bin/lightning delete mode 100755 local/bin/lisa delete mode 100755 local/bin/lmorph delete mode 100755 local/bin/maze delete mode 100755 local/bin/moire delete mode 100755 local/bin/munch delete mode 100755 local/bin/noseguy delete mode 100755 local/bin/pedal delete mode 100755 local/bin/penrose delete mode 100755 local/bin/pipes delete mode 100755 local/bin/pyro delete mode 100755 local/bin/qix delete mode 100755 local/bin/rocks delete mode 100755 local/bin/rorschach delete mode 100755 local/bin/sierpinski delete mode 100755 local/bin/slidescreen delete mode 100755 local/bin/slip delete mode 100755 local/bin/sphere delete mode 100755 local/bin/spiral delete mode 100755 local/bin/sproingies delete mode 100755 local/bin/starfish delete mode 100755 local/bin/strange delete mode 100755 local/bin/superquadrics delete mode 100755 local/bin/swirl delete mode 100755 local/bin/xroger delete mode 100755 local/bin/xscreensaver delete mode 100755 local/bin/xscreensaver-command delete mode 100644 local/man/cat.1/attraction.1 delete mode 100644 local/man/cat.1/blitspin.1 delete mode 100644 local/man/cat.1/bouboule.1 delete mode 100644 local/man/cat.1/braid.1 delete mode 100644 local/man/cat.1/bubbles.1 delete mode 100644 local/man/cat.1/decayscreen.1 delete mode 100644 local/man/cat.1/deco.1 delete mode 100644 local/man/cat.1/drift.1 delete mode 100644 local/man/cat.1/flag.1 delete mode 100644 local/man/cat.1/flame.1 delete mode 100644 local/man/cat.1/forest.1 delete mode 100644 local/man/cat.1/fract.1 delete mode 100644 local/man/cat.1/galaxy.1 delete mode 100644 local/man/cat.1/goop.1 delete mode 100644 local/man/cat.1/grav.1 delete mode 100644 local/man/cat.1/greynetic.1 delete mode 100644 local/man/cat.1/halo.1 delete mode 100644 local/man/cat.1/helix.1 delete mode 100644 local/man/cat.1/hopalong.1 delete mode 100644 local/man/cat.1/hypercube.1 delete mode 100644 local/man/cat.1/ifs.1 delete mode 100644 local/man/cat.1/imsmap.1 delete mode 100644 local/man/cat.1/julia.1 delete mode 100644 local/man/cat.1/kaleidescope.1 delete mode 100644 local/man/cat.1/laser.1 delete mode 100644 local/man/cat.1/lightning.1 delete mode 100644 local/man/cat.1/lisa.1 delete mode 100644 local/man/cat.1/lmorph.1 delete mode 100644 local/man/cat.1/maze.1 delete mode 100644 local/man/cat.1/moire.1 delete mode 100644 local/man/cat.1/munch.1 delete mode 100644 local/man/cat.1/noseguy.1 delete mode 100644 local/man/cat.1/pedal.1 delete mode 100644 local/man/cat.1/penrose.1 delete mode 100644 local/man/cat.1/pyro.1 delete mode 100644 local/man/cat.1/qix.1 delete mode 100644 local/man/cat.1/rocks.1 delete mode 100644 local/man/cat.1/rorschach.1 delete mode 100644 local/man/cat.1/sierpinski.1 delete mode 100644 local/man/cat.1/slidescreen.1 delete mode 100644 local/man/cat.1/slip.1 delete mode 100644 local/man/cat.1/sphere.1 delete mode 100644 local/man/cat.1/spiral.1 delete mode 100644 local/man/cat.1/starfish.1 delete mode 100644 local/man/cat.1/strange.1 delete mode 100644 local/man/cat.1/swirl.1 delete mode 100644 local/man/cat.1/xroger.1 delete mode 100644 local/man/cat.1/xscreensaver-command.1 delete mode 100644 local/man/cat.1/xscreensaver.1 create mode 100644 makevms.com create mode 100644 screenblank.txt create mode 100644 setup.com create mode 100644 utils/Makefile.in create mode 100644 utils/README create mode 100755 utils/ad2c create mode 100644 utils/alpha.c create mode 100644 utils/alpha.h create mode 100644 utils/colors.c create mode 100644 utils/colors.h create mode 100644 utils/compile_axp.com create mode 100644 utils/compile_decc.com create mode 100644 utils/fade.c create mode 100644 utils/fade.h create mode 100644 utils/grabscreen.c create mode 100644 utils/grabscreen.h create mode 100644 utils/hsv.c create mode 100644 utils/hsv.h create mode 100644 utils/overlay.c create mode 100644 utils/resources.c create mode 100644 utils/resources.h create mode 100644 utils/spline.c create mode 100644 utils/spline.h create mode 100644 utils/usleep.c create mode 100644 utils/usleep.h create mode 100644 utils/utils.h create mode 100644 utils/version.h create mode 100644 utils/visual.c create mode 100644 utils/visual.h create mode 100644 utils/vms-gtod.c create mode 100644 utils/vms-gtod.h create mode 100644 utils/vms-strdup.c create mode 100644 utils/vroot.h create mode 100644 utils/xmu.c create mode 100644 utils/xmu.h create mode 100644 utils/xroger.c create mode 100644 utils/yarandom.c create mode 100644 utils/yarandom.h diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..50dbe439 --- /dev/null +++ b/INSTALL @@ -0,0 +1,183 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..50b2d235 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,73 @@ +# Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. +# the `../configure' script generates `Makefile' from this file. + +@SET_MAKE@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +SHELL = /bin/sh +SUBDIRS = utils driver hacks hacks/glx +TARFILES = README README.VMS INSTALL configure configure.in \ + Makefile.in config.h.in config.h-vms install-sh \ + setup.com config.guess config.sub makevms.com \ + screenblank.txt cde.txt +TAR = gtar +COMPRESS = gzip --verbose --best +COMPRESS_EXT = gz +# COMPRESS = compress +# COMPRESS_EXT = Z + +MAKE_SUBDIR = for dir in $(SUBDIRS) ; do ( cd $$dir ; $(MAKE) $@ ) ; done + +all:: + @$(MAKE_SUBDIR) +install: + @$(MAKE_SUBDIR) +install-program: + @$(MAKE_SUBDIR) +install-man: + @$(MAKE_SUBDIR) +install-strip: + @$(MAKE_SUBDIR) +uninstall: + @$(MAKE_SUBDIR) +uninstall-program: + @$(MAKE_SUBDIR) +uninstall-man: + @$(MAKE_SUBDIR) +depend: + @$(MAKE_SUBDIR) +distdepend: + @$(MAKE_SUBDIR) +TAGS: tags +tags: + @$(MAKE_SUBDIR) +clean: + @$(MAKE_SUBDIR) +distclean: clean + -rm -f Makefile config.status config.cache config.log *~ "#"* + @$(MAKE_SUBDIR) + +dist: tar + +# This really makes me sick... +tar: + @$(MAKE) distdepend ; \ + sh config.status ; \ + NAME=`sed -n \ + 's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/xscreensaver-\1/p' utils/version.h` ; \ + rm -f $$NAME ; ln -s . $$NAME ; \ + FILES= ; \ + for subdir in $(SUBDIRS) ; do \ + d=`pwd` ; \ + cd $$subdir ; \ + FILES="$$FILES `$(MAKE) echo_tarfiles \ + | grep -v '^.*make\[' \ + | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \ + ` "; \ + cd $$d ; done ; \ + echo creating tar file $${NAME}.tar.$(COMPRESS_EXT)... ; \ + $(TAR) -vchf - \ + `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` \ + | $(COMPRESS) > $${NAME}.tar.$(COMPRESS_EXT) ; \ + rm $$NAME diff --git a/README b/README new file mode 100644 index 00000000..a8e65ba7 --- /dev/null +++ b/README @@ -0,0 +1,270 @@ + + XScreenSaver + + a screen saver and locker for the X window system + by Jamie Zawinski + +To build on Unix: + + - ./configure + - make + - make install + +The `configure' shell script will attempt to figure out which options are +appropriate for your system, and will create config.h and the various +Makefiles for you. Run `configure --help' to see how to override these +choices, or to specify things like the default installation directory. +The file `INSTALL' gives a general overview of use of these sorts of +configure scripts (those generated by the GNU autoconf system.) +The most important hint is probably this: + + ./configure --includedir=/opt/Motif/include --libdir=/opt/Motif/lib + +To build on VMS, see README.VMS. + + ============ + +The xscreensaver program waits until the keyboard and mouse have been idle +for a period, and then runs a graphics demo chosen at random. It turns off +as soon as there is any mouse or keyboard activity. + +The purpose of xscreensaver is to display pretty pictures on your screen +when it is not in use, in keeping with the philosophy that unattended +monitors should always be doing something interesting, just like they do +in the movies. + +However, xscreensaver can also be used as a screen locker, to prevent +others from using your terminal while your are away. + +The benefit that this program has over the combination of the xlock and +xautolock programs is the ease with which new graphics hacks can be +installed: you don't need to recompile this program to add a new display +mode, you just change some resource settings. Any program which can be +invoked in such a way that it draws on the root window of the screen can +now be used as a screensaver without modification. The programs that +are being run as screensavers don't need to have any special knowledge +about what it means to be a screensaver. + +The XIDLE, MIT-SCREEN-SAVER, and/or SGI SCREEN_SAVER server extensions +will be used if you have them. + +The dialog boxes (for locking and demo-mode) look best using Motif, but +can be configured to use Athena widgets instead. + +Also included are several graphics hacks for use as screensavers. There's +nothing magic about these: they're just programs that draw on the root +window, which are pointed at by the screensaver's default resource settings. + + qix - My own implementation of this, with many more options + than you would have thought qix could have. + helix - Generates spirally "stringart" patterns. + pedal - Draws a different kind of spirally pattern. + rorschach - Random inkblot patterns. + attraction - A bouncing ball demo, or a qix-like demo, or a wild + color-cycling thing, with some odd rules. + greynetic - Random colored/stippled rectangles. + rocks - Flying through an asteroid field. + blitspin - Rotate a bitmap using bitblts. + imsmap - Generates random maps or cloud formations. + hypercube - 2d projection of a hypercube rotating on all four axes. + slidescreen - Divides the screen into a grid and plays a 16-puzzle on it. + decayscreen - A melting effect. + halo - Random circular patterns. + pyro - Fireworks. Looks a lot like the version in xlock. + hopalong - Fractals. I snarfed this code from xlock. + flame - Fractals. Also from xlock. + noseguy - A guy with a big nose wanders around the screen saying + things. I snarfed this code from xnlock. + maze - This is the X maze demo modified to take a -root option + so that it works with xscreensaver. + lmorph - morphing line drawings. + bubbles - condensation forms on your monitor, then pops. + deco - Generates Brady-Bunch-era wall paneling. + moire - Circular interference patterns. + kaleidescope - Groovy, man. + swirl - Swirly color-cycling patterns. + bouboule - Spinning bubbles on a transparent ball. + braid - Draws random color-cycling braids around a circle. + drift - Drifting recursive fractal cosmic flames. + fract - Small, curvy geometric patterns. + galaxy - Spinning, colliding galaxies. + grav - Orbital simulation and/or cloud chamber. + ifs - Spinning, colliding iterated-function-system shapes. + julia - Animated rendition of the Julia set. + laser - Moving radiating lines. + lightning - Crackling fractal lightning bolts. + penrose - Quasiperiodic tilings. + sierpinski - two-dimensional Sierpinski triangle. + slip - Sucks your desktop through a jet engine. + spiral - Circular color-cycling interference patterns. + strange - Animating strange attractors. + flag - A waving flag of an arbitrary bitmap or text. + sphere - draw a bunch of shaded spheres. + forest - grows a fractal forest. + lisa - draws animated full-loop lisajous figures. + goop - Squishy transparent oil-and-bubble images + starfish - Radially-symmetric throbbing colormap-hacking blobs. + munch - The classic 1962-vintage "munching squares" hack. + fadeplot - Draws a swimming ribbon. + escher - Draws some escher-like scenes (GLX only.) + gears - Draws interlocking rotating gears (GLX only.) + morph3d - Draws shiny shape-changing 3d forms (GLX only.) + superquadrics - More shiny shape-changing 3d forms (GLX only.) + pipes - Generates a field of intertwined plumbing (GLX only.) + rubik - Solves a Rubik's Cube (GLX only.) + sproingies - Marble Madness meets Q-Bert (GLX only.) + +All of these will pop up their own window unless given that -root option. +See their man pages for more details. + +Other reasonable things to use as screensavers, if you have them, are + + xdaliclock -root -builtin2 - melting digital clock + xswarm -r 2>&- - swimming sperm + xwave -root - random 3d graphs + xbouncebits - bounce arbitrary bitmaps around + ico -r -p8 -faces -sleep 1 - it's dull, but it's there + xv -root file.gif -quit - they don't all have to animate! + xsplinefun - bouncing splines + xfishtank -c black -d -r 1 - fish (use version 2.0 or later) + xtacy -root - various eye candy + /usr/demos/bin/bongo -wbongo - an SGI GL demo + +You can get all of these from the contrib directory on ftp.x.org. If you +know of (or write) any other interesting programs that can be used as +screensavers, please let me know! + +The latest version of xscreensaver is always available on the web at +http://people.netscape.com/jwz/xscreensaver/. + + -- Jamie Zawinski + + +Changes since 2.06: Minor header tweaks in windows.c and flag.c. + Made multi-architecture (VPATH) builds work properly. + Merged new GL stuff from xlockmore (rubik, morph3d.) + Fixed intermittent crashes in `imsmap' and `munch'. + Added `fadeplot' hack from xlockmore. +Changes since 2.05: Merged in VMS support from Patrick Moreau. +Changes since 2.04: Fixed a MIT-SCREEN-SAVER-related crash, and tweaked + configure to detect the extra-random -Xss library. +Changes since 2.03: HP configure tweaks. Detect and warn about LessTif. + Fixed low-color behavior of `goop', `pyro', `starfish', + `greynetic', `flame', `halo', and `moire'. +Changes since 2.02: Fixed flicker in `pipes'. Fixed 3d in `bouboule'. + Added `munch' hack. + Added basic dependencies to the Makefile.in files. +Changes since 2.01: Fixes for compiling with the MIT saver extension. + Made the yow/fortune program be a configure option. + Various configure tweaks. +Changes since 2.00: Added `goop' and `starfish' hacks. + Added colomap cycling to `halo'. + Made `attraction' use the new colormap allocator. + Added better $PATH diagnostics. + There was a bug in frand! Color selection should be + much improved now. +Changes since 1.34: Converted to use `configure' instead of `imake'. + ANSI C is now required. + Added Kerberos locking support, from Nat Lanza. + Made the stderr text use overlay planes, if possible. + Reworked the xlockmore compatibility stuff again. + Added `gears', `superquadrics', `escher', `pipes', + and `sproingies' hacks (depend on OpenGL.) +Changes since 1.33: Fixed some bugs, made fading be a little smoother. +Changes since 1.32: Made it work with multi-headed displays. + Generalized sub-process management (Unix sucks!) + Added interactive mouse frobbing to Julia. + Added (untested) support for HPUX shadow passwords. + Made normal non-shadow passwords be checked if the + shadow passwords aren't accessible for some reason. +Changes since 1.31: Removed *colorPrograms and *monoPrograms resources: + made it possible to specify the desired visual on a + per-hack basis. + Cleaned up / restructured the driver: no more globals. + Made the Motif and Athena dialogs share more code. + Probably fixed some Athena colormap-installation bugs. + Fixed screen grabbing (cmap) on SGI 12-bit PseudoColor. + Fixed divide-by-zero in bright random colormaps. + Added an improved version of xlock's `flag' hack. + Made unfading work better, and not flicker on SGIs. + Added `sphere', `forest', `lisa' hacks from xlockmore. + Added (untested) support for SunOS Adjunct passwords. +Changes since 1.30: Improved colors and colormap cycling of many hacks. + Cleaned up xlockmore compatibility layer. + Made `blitspin' able to grab an image off the screen. + Ported `swirl' and `bouboule' hacks from xlockmore. + Made the driver more careful about not leaving bits on + the screen, or allowing other windows to raise + themselves: it now re-blanks the screen every so often. + Added `-time' option to `xscreensaver-command'. + Improved SGI screen-grabbing some more: now it can grab + TrueColor screens into PseudoColor windows and have the + colors still come out semi-reasonably. +Changes since 1.29: Made `slidescreen' and `decayscreen' work better on + SGIs when windows of different visuals are present, by + using the XReadDisplay() extension to get a true 24-bit + image out of the frame buffer. + Made `noseguy' be in color, if compiled with XPM. + Ported `braid', `drift', `fract', `galaxy', `grav', + `ifs', `julia', `laser', `lightning', `penrose', + `sierpinski', `slip', `spiral', and `strange' hacks + from xlockmore. + Merged `hopalong' hack with a more recent version. + Added `cde.txt'. +Changes since 1.27: Added `deco', `moire', and `kaleidescope' hacks. + Merged in support for non-Motif locking and demo mode. + Made `blitspin' and `bubbles' work in TrueColor. + Fixed a stupid bug I introduced in `imsmap'. + Added `poly' and `gravity' options to `qix'. +Changes since 1.26: Added support for SGI SCREEN_SAVER extension. + Made `fade' and `unfade' work on 8-bit SGIs. + Made the dialog boxes more Motify. + Added `bubbles' hack. +Changes since 1.25: Added `lmorph' hack. + Added viscosity and mouse-control to attraction. + Fixed possible bad color choices in qix and attraction. + Added ramp-mode to halo. + Added a new RNG, which is faster and more portable + than using the RNG in libc. + Made locking work on SCO. + Various other minor tweaks that I don't remember. +Changes since 1.24: Made it capture the stdout/stderr of its subprocesses + and present them on the screensaver window itself. + Made demo mode work correctly with non-default visuals + and color maps, instead of always using the defaults. + Added -visual argument to all included screenhacks. + Support for the R6 MIT-SCREEN-SAVER server extension. + Made the demo mode list scroll properly. + Added `pedal' hack. +Changes since 1.23: Fixed some private-colormap oddities in slidescreen, + decayscreen, and xroger. Fixed apparent conservation- + of-mass problem in pyro; made the shrapnel round. +Changes since 1.22: Minor tweaks for IRIX5; fixed locking race condition. +Changes since 1.21: Minor tweaks for X11R6. + Fixes for non-default visuals. +Changes since 1.20: Fixed bug in color blitspin; added default image. + Added diagnostics to noseguy. Fixed off-by-one + error in flame. Added some missing casts. +Changes since 1.18: Added `flame' hack. + Fixed a minor Motif dialog text field bug. + Fixed yet another XPointer-not-defined-in-R4 bug. +Changes since 1.17: Added support for shadow password files. + Fixed some Motif-related locking bugs. + Added diagnostics when locking is disabled. + Made blitspin able to use the XPM library. + Added `decayscreen' hack. +Changes since 1.16: Added `halo' hack. +Changes since 1.15: Portability fixes. +Changes since 1.14: Broke the driver up into more source files. + Moved the hacks into their own directory. + Made all `time' parameters accept the 00:00:00 syntax, + so that even the parameters which are normally read as + minutes can be specified in seconds. + Added colormap cycling to `imsmap'. + Made hyper work with K&R compilers. +Changes since 1.13: Added `orbit' option to `attraction' hack. + Added `lock-timeout' option. + Cleaned up options of `maze' hack. +Changes since 1.8: Added demo mode, and locking. + Added `maze' hack. + Added `norotate' option to `rocks' hack. diff --git a/README.VMS b/README.VMS new file mode 100644 index 00000000..262d7dd0 --- /dev/null +++ b/README.VMS @@ -0,0 +1,59 @@ +OpenVMS port of Xscreensavser version 2.05 July 1997 +========================================== + +Xscreensaver distribution can be found in 3 subdirectories: + +[.DRIVER] The Xscreensaver and Xscreensaver-command programs. +[.HACKS] Graphic demos ,can be run either through the xscreensaver program + or standalone. +[.UTILS] A small libraries of various utilities. + +This port has been tested with VAX VMS 6.1 (compiled with DEC 5 5.0 and +Motif 1.2) and AXP VMS 6.2 (compiled with DEC C 5.0 and Motif 1.2-4). + +To rebuild, you need to rebuild [.UTILS] directory first and create the +object library (look at the end of COMPILE*.COM procedure). + +You can now build the [.HACKS] directory and the [.DRIVER] directory. + +A one-step build is now available via the MAKEVMS.COM script. + +WARNING : before building [.HACKS], you may need to correct some of the +DECwindows bitmap files. Some files are bogus !! (they have a long line of +null chars at the end). These files are under +SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory: + +STIPPLE.XBM +HLINES2.XBM +LIGHT_GRAY.XBM +ROOT_WEAVES.XBM +VLINES2.XBM + +These files are all used by Greynetic demo. + +Nota: link procedure automagically select appropriate X and Motif Libraries +(X11R4/Motif 1.1 - X11R5/Motif 1.2). + +The SETUP.COM procedure gives you a definition of all DCL foreign command +symbols needed to run Xscreensaver and all the graphic hacks. You need to +modify this procedure if you install these programs in another directory tree. + +VMS .HLP files are provied for all programms of this distribution. + +You can easily add new graphic demos without recompiling Xscreensaver. You just +need to add them in resource file XSCREENSAVER.DAT. This file (originally +present in [.DRIVER] directory ) can be installed under your SYS$LOGIN +directory for a per-user customization basis. You can also install it under +the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER] +(with (W:RE) protections). The new graphics hack must be run in root-window +mode to be accepted by Xscreensaver. + +The graphic demos are spawn into subprocess created by the system() call (in +the Unix version the execvp() call is used). + +The VMS passord checking programs were picked up in the Xlock distribution. + +Enjoy, + +Patrick MOREAU - CENA/Athis-Mons - FRANCE (pmoreau@cena.dgac.fr) + (moreau_p@decus.decus.fr) diff --git a/cde.txt b/cde.txt new file mode 100644 index 00000000..2a5d2169 --- /dev/null +++ b/cde.txt @@ -0,0 +1,98 @@ +From: moredhel@earthling.net +Subject: Re: Changing Screen Saver in CDE +Message-Id: <862223755.19542@dejanews.com> +Newsgroups: comp.unix.solaris,comp.unix.cde + +> I was wondering how you could add your own screen saver under CDE. I +> don't like the ones included. This is the one that comes up when I lock +> the screen. Also, where are they located? + +The easiest way to do this is to just tell the front panel to run +something else when you click the lock symbol, switch off the "standard" +screen blank/lock, and then start your own in sessionetc. + +Anyway, once you have a screensaver that you want to run instead, you'll +need to add 2 files to ~/.dt/types/, one line to add to +~/.dt/sessions/sessionetc and a change to make to the Style Manager. + +The two files are to change the behaviour of the Lock button in the middle +of the front panel. To change the command run, edit the EXEC_STRING in +the .dt file: + +Xlock.dt: + +###################################################################### +# +# Common Desktop Environment (CDE) +# +# Action and DataType Definition File +# +# Generated by the CreateAction tool +# +# $Revision: 1.0 +# +# $KEY: 3080 +# +###################################################################### +# +# WARNING: +# +# This file was generated by the CDE CreateAction tool. +# If this file is modified by some other tool, such as vi, +# the CreateAction tool will no longer be able to load and +# update this file. For this reason, changes to this file +# should be handled through CreateAction whenever possible. +# +###################################################################### + +ACTION Xlock +{ + LABEL Xlock + TYPE COMMAND + EXEC_STRING xscreensaver-command -lock + ICON Dtkey + WINDOW_TYPE NO_STDIO +} + +----8<---- + +Lock.fp: + +CONTROL Lock +{ + TYPE icon + CONTAINER_NAME Switch + CONTAINER_TYPE SWITCH + POSITION_HINTS 1 + ICON Fplock + LABEL Lock + PUSH_ACTION Xlock + HELP_TOPIC FPOnItemLock + HELP_VOLUME FPanel +} + + +----8<---- + +And the line in sessionetc: + +xscreensaver -lock -lock-timeout 20 -cycle 2 -timeout 3 -install& + +----8<---- + +And the Style Manager change is obvious - switch off the CDE blank and +lock. + +You now have a screensaver and lock program that runs when you log in, +blanks your screen after 3 minutes, locks it after 20, and cycles through +a list of nice graphics every 2. I've also set the resources on mine to +nicely fade in and out, rather than harsh cuts. The really brilliant +thing about xscreensaver is that you can plug in *any* screen-filling +graphics program - xscreensaver handles the blanking and locking, and +controls the running of the graphics. The programs it runs and their +arguements are controlled from the resource file, which comes with it and +needs to be put in /usr/openwin/lib/app-defaults/. + +Clicking the "lock" in the front panel puts it straight into lock mode. + +Hope that's enough to get you going. diff --git a/config.guess b/config.guess new file mode 100755 index 00000000..e9e44559 --- /dev/null +++ b/config.guess @@ -0,0 +1,693 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + alpha:OSF1:*:*) + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'` + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:NetBSD:*:*) + echo m68k-cbm-netbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-cbm-openbsd${UNAME_RELEASE} + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + Pyramid*:OSx*:*:*|MIS*:OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:NetBSD:*:*) + echo m68k-atari-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-atari-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:NetBSD:*:*) + echo m68k-sun-netbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-sun-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:NetBSD:*:*) + echo m68k-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-apple-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >dummy.c + int main (argc, argv) int argc; char **argv; { + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + ${CC-cc} dummy.c -o dummy \ + && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ + -o ${TARGET_BINARY_INTERFACE}x = x ] ; then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[3478]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;; + 9000/8?? ) HP_ARCH=hppa1.0 ;; + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp3[0-9][05]:NetBSD:*:*) + echo m68k-hp-netbsd${UNAME_RELEASE} + exit 0 ;; + hp3[0-9][05]:OpenBSD:*:*) + echo m68k-hp-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:NetBSD:*:*) + echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo i386-pc-cygwin32 + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin32 + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. + ld_help_string=`ld --help 2>&1` + if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then + echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then + echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then + echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then + echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then + echo "powerpc-unknown-linux-gnu" ; exit 0 + elif test "${UNAME_MACHINE}" = "alpha" ; then + echo alpha-unknown-linux-gnu ; exit 0 + elif test "${UNAME_MACHINE}" = "sparc" ; then + echo sparc-unknown-linux-gnu ; exit 0 + else + # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us + # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout. + test ! -d /usr/lib/ldscripts/. \ + && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + # Determine whether the default compiler is a.out or elf + cat >dummy.c </dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 +rm -f dummy.c dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/config.h-vms b/config.h-vms new file mode 100644 index 00000000..d91ebfc4 --- /dev/null +++ b/config.h-vms @@ -0,0 +1,251 @@ +/* This is a config.h file that has been pregenerated (from config.h.in) + * with settings that are correct for VMS. + */ + + + +/* config.h.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. + * + * The best way to set these parameters is by running the included `configure' + * script. That examines your system, and generates `config.h' from + * `config.h.in'. + * + * If something goes very wrong, you can edit `config.h' directly, but beware + * that your changes will be lost if you ever run `configure' again. + */ + +/* ************************************************************************* + CONFIGURING SERVER EXTENSIONS + ************************************************************************* */ + +/* Define this if you have the XReadDisplay extension (I think this is an + SGI-only thing; it's in .) A couple of + the screenhacks will take advantage of this if it's available. + */ +#undef HAVE_READ_DISPLAY_EXTENSION + +/* Define this if you have the XHPDisableReset function (an HP only thing.) + */ +#undef HAVE_XHPDISABLERESET + +/* First, some background: there are three distinct server extensions which + * are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER, + * and SCREEN_SAVER. + * + * The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5 + * contrib tape. This extension lets the client get accurate idle-time + * information from the X server in a potentially more reliable way than by + * simply watching for keyboard and mouse activity. However, the XIDLE + * extension has apparently not been ported to X11R6. + * + * The SCREEN_SAVER extension is found (as far as I know) only in the SGI + * X server, and it exists in all releases since (at least) Irix 5. The + * relevant header file is /usr/include/X11/extensions/XScreenSaver.h. + * + * The similarly-named MIT-SCREEN-SAVER extension came into existence long + * after the SGI SCREEN_SAVER extension was already in use, and resides in + * .../contrib/extensions/screensaver/ on the X11R6 contrib tape. It is + * also found in certain recent X servers built in to NCD X terminals. + * + * The MIT extension does basically the same thing that the XIDLE extension + * does, but there are two things wrong with it: first, because of the way + * the extension was designed, the `fade' option to XScreenSaver will be + * uglier: just before the screen fades out, there will be an unattractive + * flicker to black, because this extension blanks the screen *before* + * telling us that it is time to do so. Second, this extension is known to + * be buggy; on the systems I use, it works, but some people have reported + * X server crashes as a result of using it. XScreenSaver uses this + * extension rather conservatively, because when I tried to use any of its + * more complicated features, I could get it to crash the server at the + * drop of a hat. + * + * In short, the MIT-SCREEN-SAVER extension is a piece of junk. The older + * SGI SCREEN_SAVER extension works great, as does XIDLE. It would be nice + * If those two existed on more systems, that is, would be adopted by the + * X Consortium in favor of their inferior "not-invented-here" entry. + */ + +/* Define this if you have the XIDLE extension installed. If you have the + * XIDLE extension, this is recommended. (You have this extension if the + * file /usr/include/X11/extensions/xidle.h exists.) Turning on this flag + * lets XScreenSaver work better with servers which support this extension; + * but it will still work with servers which do not suport it, so it's a good + * idea to compile in support for it if you can. + */ +#undef HAVE_XIDLE_EXTENSION + +/* Define this if you have the MIT-SCREEN-SAVER extension installed. See the + * caveats about this extension, above. (It's available if the file + * /usr/include/X11/extensions/scrnsaver.h exists.) + */ +#undef HAVE_MIT_SAVER_EXTENSION + +/* Define this if you have the SGI SCREEN_SAVER extension. This is standard + * on Irix systems, and not available elsewhere. + */ +#undef HAVE_SGI_SAVER_EXTENSION + + + +/* ************************************************************************* + CONFIGURING GRAPHICS TOOLKITS + ************************************************************************* */ + +/* Define this if you have Motif. + */ +#define HAVE_MOTIF + +/* Define this if you don't have Motif, but you have Athena (-Xaw). + */ +#undef HAVE_ATHENA + +/* Define this if you have Athena, and the version you have includes the + * XawViewportSetCoordinates function in Viewport.h (some old versions of + * the library didn't have this function.) + */ +#undef HAVE_XawViewportSetCoordinates + +/* Define this if you have the XPM library installed. Some of the demos can + * make use of this if it is available. + */ +#undef HAVE_XPM + +/* Define this if you have the Xmu library. This is standard part of X, and + * if your vendor doesn't ship it, you should report that as a bug. + */ +#define HAVE_XMU + +/* Define this if you have OpenGL. Some of the demos require it, so if you + * don't have it, then those particular demos won't be built. (This won't + * affect the screen saver as a whole.) + */ +#undef HAVE_GL + +/* Define this if you have GL, but it's the MesaGL variant. (The libraries + have different names.) (HAVE_GL should be defined too.) + */ +#undef HAVE_MESA_GL + +/* Some screenhacks like to run an external program to generate random pieces + of text; set this to the one you like ("yow" and "fortune" are the most + likely prospects.) Note that this is just the default; X resources can + be used to override it. + */ +#define ZIPPY_PROGRAM "fortune" + + + +/* ************************************************************************* + CONFIGURING PASSWORD AUTHENTICATION + ************************************************************************* */ + +/* Define this to remove the option of locking the screen at all. + */ +#undef NO_LOCKING + +/* Define this if you want to use Kerberos authentication to lock/unlock the + * screen instead of your local password. This currently uses Kerberos V4, + * but a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS + * string-to-key passwords with this option. This option currently *only* + * works with standard Kerberos des_string_to_key. If your password is an + * AFS password and not a kerberos password, it will not authenticate + * properly. See the comments in driver/kpasswd.c for more information if you + * need it. + */ +#undef HAVE_KERBEROS + + +/* Define this if your system uses `shadow' passwords, that is, the passwords + * live in /etc/shadow instead of /etc/passwd, and one reads them with + * getspnam() instead of getpwnam(). (Note that SCO systems do some random + * other thing; others might as well. See the ifdefs in driver/passwd.c if + * you're having trouble related to reading passwords.) + */ +#undef HAVE_SHADOW_PASSWD + +/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced + Security'', that is, the passwords live in /tcb/files/auth// + instead of in /etc/passwd, and one reads them with getprpwnam() instead + of getpwnam(). + */ +#undef HAVE_ENHANCED_PASSWD + +/* Define this if your system is Solaris with ``adjunct'' passwords (this is + the version where one gets at the passwords with getpwanam() instead of + getpwnam().) I haven't tested this one, let me know if it works. + */ +#undef HAVE_ADJUNCT_PASSWD + +/* Define this if you are running HPUX with so-called ``Secure Passwords'' + (if you have /usr/include/hpsecurity.h, you probably have this.) I + haven't tested this one, let me know if it works. + */ +#undef HAVE_HPUX_PASSWD + + +/* ************************************************************************* + OTHER C ENVIRONMENT JUNK + ************************************************************************* */ + +/* Define this to void* if you're using X11R4 or earlier. */ +#undef XPointer + +/* Define if you have the nice function. */ +#undef HAVE_NICE + +/* Define if you have the setpriority function. */ +#undef HAVE_SETPRIORITY + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `int' if doesn't define. */ +#undef mode_t + +/* Define to `int' if doesn't define. */ +#undef pid_t + +/* Define as the return type of signal handlers (int or void). */ +#define RETSIGTYPE void + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if you have the gettimeofday function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if gettimeofday requires two arguments. */ +#undef GETTIMEOFDAY_TWO_ARGS + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the select function. */ +#undef HAVE_SELECT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getcwd function. */ +#undef HAVE_GETWD + +/* Define if you have the uname function. */ +#undef HAVE_UNAME + +/* Define if you have the fcntl function. */ +#undef HAVE_FCNTL + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H diff --git a/config.h.in b/config.h.in new file mode 100644 index 00000000..8cac343a --- /dev/null +++ b/config.h.in @@ -0,0 +1,246 @@ +/* config.h.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. + * + * The best way to set these parameters is by running the included `configure' + * script. That examines your system, and generates `config.h' from + * `config.h.in'. + * + * If something goes very wrong, you can edit `config.h' directly, but beware + * that your changes will be lost if you ever run `configure' again. + */ + + +/* ************************************************************************* + CONFIGURING SERVER EXTENSIONS + ************************************************************************* */ + +/* Define this if you have the XReadDisplay extension (I think this is an + SGI-only thing; it's in .) A couple of + the screenhacks will take advantage of this if it's available. + */ +#undef HAVE_READ_DISPLAY_EXTENSION + +/* Define this if you have the XHPDisableReset function (an HP only thing.) + */ +#undef HAVE_XHPDISABLERESET + +/* First, some background: there are three distinct server extensions which + * are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER, + * and SCREEN_SAVER. + * + * The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5 + * contrib tape. This extension lets the client get accurate idle-time + * information from the X server in a potentially more reliable way than by + * simply watching for keyboard and mouse activity. However, the XIDLE + * extension has apparently not been ported to X11R6. + * + * The SCREEN_SAVER extension is found (as far as I know) only in the SGI + * X server, and it exists in all releases since (at least) Irix 5. The + * relevant header file is /usr/include/X11/extensions/XScreenSaver.h. + * + * The similarly-named MIT-SCREEN-SAVER extension came into existence long + * after the SGI SCREEN_SAVER extension was already in use, and resides in + * .../contrib/extensions/screensaver/ on the X11R6 contrib tape. It is + * also found in certain recent X servers built in to NCD X terminals. + * + * The MIT extension does basically the same thing that the XIDLE extension + * does, but there are two things wrong with it: first, because of the way + * the extension was designed, the `fade' option to XScreenSaver will be + * uglier: just before the screen fades out, there will be an unattractive + * flicker to black, because this extension blanks the screen *before* + * telling us that it is time to do so. Second, this extension is known to + * be buggy; on the systems I use, it works, but some people have reported + * X server crashes as a result of using it. XScreenSaver uses this + * extension rather conservatively, because when I tried to use any of its + * more complicated features, I could get it to crash the server at the + * drop of a hat. + * + * In short, the MIT-SCREEN-SAVER extension is a piece of junk. The older + * SGI SCREEN_SAVER extension works great, as does XIDLE. It would be nice + * If those two existed on more systems, that is, would be adopted by the + * X Consortium in favor of their inferior "not-invented-here" entry. + */ + +/* Define this if you have the XIDLE extension installed. If you have the + * XIDLE extension, this is recommended. (You have this extension if the + * file /usr/include/X11/extensions/xidle.h exists.) Turning on this flag + * lets XScreenSaver work better with servers which support this extension; + * but it will still work with servers which do not suport it, so it's a good + * idea to compile in support for it if you can. + */ +#undef HAVE_XIDLE_EXTENSION + +/* Define this if you have the MIT-SCREEN-SAVER extension installed. See the + * caveats about this extension, above. (It's available if the file + * /usr/include/X11/extensions/scrnsaver.h exists.) + */ +#undef HAVE_MIT_SAVER_EXTENSION + +/* Define this if you have the SGI SCREEN_SAVER extension. This is standard + * on Irix systems, and not available elsewhere. + */ +#undef HAVE_SGI_SAVER_EXTENSION + + + +/* ************************************************************************* + CONFIGURING GRAPHICS TOOLKITS + ************************************************************************* */ + +/* Define this if you have Motif. + */ +#undef HAVE_MOTIF + +/* Define this if you don't have Motif, but you have Athena (-Xaw). + */ +#undef HAVE_ATHENA + +/* Define this if you have Athena, and the version you have includes the + * XawViewportSetCoordinates function in Viewport.h (some old versions of + * the library didn't have this function.) + */ +#undef HAVE_XawViewportSetCoordinates + +/* Define this if you have the XPM library installed. Some of the demos can + * make use of this if it is available. + */ +#undef HAVE_XPM + +/* Define this if you have the Xmu library. This is standard part of X, and + * if your vendor doesn't ship it, you should report that as a bug. + */ +#undef HAVE_XMU + +/* Define this if you have OpenGL. Some of the demos require it, so if you + * don't have it, then those particular demos won't be built. (This won't + * affect the screen saver as a whole.) + */ +#undef HAVE_GL + +/* Define this if you have GL, but it's the MesaGL variant. (The libraries + have different names.) (HAVE_GL should be defined too.) + */ +#undef HAVE_MESA_GL + +/* Some screenhacks like to run an external program to generate random pieces + of text; set this to the one you like ("yow" and "fortune" are the most + likely prospects.) Note that this is just the default; X resources can + be used to override it. + */ +#define ZIPPY_PROGRAM "fortune" + + + +/* ************************************************************************* + CONFIGURING PASSWORD AUTHENTICATION + ************************************************************************* */ + +/* Define this to remove the option of locking the screen at all. + */ +#undef NO_LOCKING + +/* Define this if you want to use Kerberos authentication to lock/unlock the + * screen instead of your local password. This currently uses Kerberos V4, + * but a V5 server with V4 compatibility will work. WARNING: DO NOT USE AFS + * string-to-key passwords with this option. This option currently *only* + * works with standard Kerberos des_string_to_key. If your password is an + * AFS password and not a kerberos password, it will not authenticate + * properly. See the comments in driver/kpasswd.c for more information if you + * need it. + */ +#undef HAVE_KERBEROS + + +/* Define this if your system uses `shadow' passwords, that is, the passwords + * live in /etc/shadow instead of /etc/passwd, and one reads them with + * getspnam() instead of getpwnam(). (Note that SCO systems do some random + * other thing; others might as well. See the ifdefs in driver/passwd.c if + * you're having trouble related to reading passwords.) + */ +#undef HAVE_SHADOW_PASSWD + +/* Define this if your system is Digital or SCO Unix with so-called ``Enhanced + Security'', that is, the passwords live in /tcb/files/auth// + instead of in /etc/passwd, and one reads them with getprpwnam() instead + of getpwnam(). + */ +#undef HAVE_ENHANCED_PASSWD + +/* Define this if your system is Solaris with ``adjunct'' passwords (this is + the version where one gets at the passwords with getpwanam() instead of + getpwnam().) I haven't tested this one, let me know if it works. + */ +#undef HAVE_ADJUNCT_PASSWD + +/* Define this if you are running HPUX with so-called ``Secure Passwords'' + (if you have /usr/include/hpsecurity.h, you probably have this.) I + haven't tested this one, let me know if it works. + */ +#undef HAVE_HPUX_PASSWD + + +/* ************************************************************************* + OTHER C ENVIRONMENT JUNK + ************************************************************************* */ + +/* Define this to void* if you're using X11R4 or earlier. */ +#undef XPointer + +/* Define if you have the nice function. */ +#undef HAVE_NICE + +/* Define if you have the setpriority function. */ +#undef HAVE_SETPRIORITY + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define to `int' if doesn't define. */ +#undef mode_t + +/* Define to `int' if doesn't define. */ +#undef pid_t + +/* Define as the return type of signal handlers (int or void). */ +#undef RETSIGTYPE + +/* Define to `unsigned' if doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if you have the gettimeofday function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define if gettimeofday requires two arguments. */ +#undef GETTIMEOFDAY_TWO_ARGS + +/* Define if you have the putenv function. */ +#undef HAVE_PUTENV + +/* Define if you have the select function. */ +#undef HAVE_SELECT + +/* Define if you have the getcwd function. */ +#undef HAVE_GETCWD + +/* Define if you have the getcwd function. */ +#undef HAVE_GETWD + +/* Define if you have the uname function. */ +#undef HAVE_UNAME + +/* Define if you have the fcntl function. */ +#undef HAVE_FCNTL + +/* Define if you have the header file. */ +#undef HAVE_UNISTD_H diff --git a/config.sub b/config.sub new file mode 100755 index 00000000..04325249 --- /dev/null +++ b/config.sub @@ -0,0 +1,927 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ + | arme[lb] | pyramid \ + | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \ + | alpha | we32k | ns16k | clipper | i370 | sh \ + | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ + | pdp11 | mips64el | mips64orion | mips64orionel \ + | sparc | sparclet | sparclite | sparc64) + basic_machine=$basic_machine-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[3456]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ + | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ + | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ + | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ + | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* | f301-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigados) + basic_machine=m68k-cbm + os=-amigados + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[3456]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[3456]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[3456]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[3456]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + np1) + basic_machine=np1-gould + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5) + basic_machine=i586-intel + ;; + pentiumpro | p6) + basic_machine=i686-intel + ;; + pentium-* | p5-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + k5) + # We don't have specific support for AMD's K5 yet, so just call it a Pentium + basic_machine=i586-amd + ;; + nexen) + # We don't have specific support for Nexgen yet, so just call it a Pentium + basic_machine=i586-nexgen + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + mips) + basic_machine=mips-mips + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware* | svr4*) + os=-sysv4 + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -linux-gnu* | -uxpv*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -xenix) + os=-xenix + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-ibm) + os=-aix + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigados + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -hpux*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/configure b/configure new file mode 100755 index 00000000..83a5d96a --- /dev/null +++ b/configure @@ -0,0 +1,5404 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.12 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + +Installation options: + + --enable-subdir=DIR Put the demo programs in a subdirectory of \`bindir', + instead of putting them in bindir itself. You can + specify the name of the subdirectory. For example, + --exec-prefix=/usr/local/bin --enable-subdir=demos + would put xscreensaver in /usr/local/bin/, and would + put the demos in /usr/local/bin/demos/. Note that if + you do this, you must make sure that the directory + is on your \$PATH before xscreensaver is started: the + directory name is not hardcoded into the program. + This merely sets the default installation location. + + --disable-subdir Just put the demos in \`bindir' (this is the default.) +" +ac_help="$ac_help + --with-x use the X Window System" +ac_help="$ac_help + +Server options: + + --with-sgi-ext Include support for the SGI SCREEN_SAVER + server extension, if possible (this is the default). + --without-sgi-ext Do not compile in support for this extension." +ac_help="$ac_help + --with-mit-ext Include support for the MIT-SCREEN-SAVER + server extension, if possible (this is the default). + --without-mit-ext Do not compile in support for this extension." +ac_help="$ac_help + --with-xidle-ext Include support for the XIDLE server extension, + if possible (this is the default). + --without-xidle-ext Do not compile in support for this extension." +ac_help="$ac_help + +Toolkit options: + + --with-motif Use the Motif toolkit for the user interface, + if possible (this is the default). + --without-motif Do not use Motif." +ac_help="$ac_help + --with-athena Use the Athena toolkit for the user interface, if + possible (this is the default if Motif isn't used.) + --without-athena Do not use Athena." +ac_help="$ac_help + +Demo options: + + --with-xpm Include support for XPM files in some demos, + if possible (this is the default). + --without-xpm Do not compile in support for XPM files." +ac_help="$ac_help + --with-gl Build those demos which depend on OpenGL, + if possible (this is the default). + --without-gl Do not build the OpenGL demos." +ac_help="$ac_help + --with-readdisplay Include support for the XReadDisplay server + extension if possible (this is the default). + --without-readdisplay Do not compile in support for this extension." +ac_help="$ac_help + --with-zippy=PROGRAM Some demos are able to run an external program and + display its text; this names the program to use by + default (though it can be overridden with X + resources.) If you don't specify this, the default + is to use \"yow\" from the Emacs distribution (if you + have it) or else to use \"fortune\"." +ac_help="$ac_help + +Locking options: + + --enable-locking Compile in support for locking the display + (this is the default.) + --disable-locking Do not allow locking at all." +ac_help="$ac_help + + --with-kerberos Include support for Kerberos authentication, + if possible (this is the default.) + --without-kerberos Do not compile in support for Kerberos." +ac_help="$ac_help + --with-shadow Include support for shadow password authentication, + if possible (this is the default, if no Kerberos.) + --without-shadow Do not compile in support for shadow passwords. +" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.12" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=driver/subprocs.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + +# Make sure we can run config.sub. +if $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:633: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`$ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`$ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:657: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:686: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + ac_prog_rejected=no + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:734: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:768: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:773: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:797: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-O2" + fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" +fi + + +if test -z "$GCC"; then + echo $ac_n "checking how to request ANSI compilation""... $ac_c" 1>&6 +echo "configure:827: checking how to request ANSI compilation" >&5 + case "$host" in + *-hpux*) + echo "$ac_t""HPUX: adding -Ae" 1>&6 + CC="$CC -Ae" + ;; + *-aix*) + echo "$ac_t""AIX: adding -qlanglvl=ansi -qhalt=e" 1>&6 + CC="$CC -qlanglvl=ansi -qhalt=e" + ;; + *) + echo "$ac_t""no idea" 1>&6 + ;; + esac +fi + + +echo $ac_n "checking whether the compiler works on ANSI C""... $ac_c" 1>&6 +echo "configure:845: checking whether the compiler works on ANSI C" >&5 +if test "$cross_compiling" = yes; then + { echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; } +else + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + echo "$ac_t""yes" 1>&6 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + echo "$ac_t""no" 1>&6 + { echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; } +fi +rm -fr conftest* +fi + + +case "$host" in + *-irix*) + if test -n "$GCC"; then + echo "$ac_t""Turning on gcc compiler warnings." 1>&6 + CC="$CC -Wall -Wstrict-prototypes -Wnested-externs -Wno-format" + else + # not gcc + echo "$ac_t""Turning on SGI compiler warnings." 1>&6 + CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3" + fi + ;; +esac + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:883: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:904: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:921: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:954: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + for ac_prog in ginstall installbsd scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + # OSF/1 installbsd also uses dspmsg, but is usable. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:1004: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1032: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1086: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:1107: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <&6 +echo "configure:1148: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1161: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1252: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1266: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 +echo "configure:1287: checking for sys/wait.h that is POSIX.1 compatible" >&5 +if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif +int main() { +int s; +wait (&s); +s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; +; return 0; } +EOF +if { (eval echo configure:1308: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_sys_wait_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_sys_wait_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 +if test $ac_cv_header_sys_wait_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_SYS_WAIT_H 1 +EOF + +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:1333: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:1346: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:1371: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:1412: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + + +echo $ac_n "checking for mode_t""... $ac_c" 1>&6 +echo "configure:1455: checking for mode_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_mode_t=yes +else + rm -rf conftest* + ac_cv_type_mode_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_mode_t" 1>&6 +if test $ac_cv_type_mode_t = no; then + cat >> confdefs.h <<\EOF +#define mode_t int +EOF + +fi + +echo $ac_n "checking for pid_t""... $ac_c" 1>&6 +echo "configure:1488: checking for pid_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_pid_t=yes +else + rm -rf conftest* + ac_cv_type_pid_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_pid_t" 1>&6 +if test $ac_cv_type_pid_t = no; then + cat >> confdefs.h <<\EOF +#define pid_t int +EOF + +fi + +echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 +echo "configure:1521: checking return type of signal handlers" >&5 +if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifdef signal +#undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int main() { +int i; +; return 0; } +EOF +if { (eval echo configure:1543: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_type_signal=void +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_type_signal=int +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_type_signal" 1>&6 +cat >> confdefs.h <&6 +echo "configure:1562: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#if STDC_HEADERS +#include +#include +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + + + +echo $ac_n "checking how to call gettimeofday""... $ac_c" 1>&6 +echo "configure:1597: checking how to call gettimeofday" >&5 +if eval "test \"`echo '$''{'ac_cv_gettimeofday_args'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < + #include +int main() { +struct timeval tv; gettimeofday(&tv); +; return 0; } +EOF +if { (eval echo configure:1610: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_gettimeofday_args=1 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + cat > conftest.$ac_ext < + #include +int main() { +struct timeval tv; struct timezone tzp; + gettimeofday(&tv, &tzp); +; return 0; } +EOF +if { (eval echo configure:1627: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_gettimeofday_args=2 +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_gettimeofday_args=0 +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_gettimeofday_args=$ac_gettimeofday_args +fi + +ac_gettimeofday_args=$ac_cv_gettimeofday_args +if test $ac_gettimeofday_args = 1 ; then + cat >> confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + + echo "$ac_t""one argument" 1>&6 +elif test $ac_gettimeofday_args = 2 ; then + cat >> confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + + cat >> confdefs.h <<\EOF +#define GETTIMEOFDAY_TWO_ARGS 1 +EOF + + echo "$ac_t""two arguments" 1>&6 +else + echo "$ac_t""unknown" 1>&6 +fi + + +for ac_func in select fcntl uname nice setpriority getcwd getwd putenv +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1667: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +for ac_hdr in unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1723: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + + + +# Check whether --enable-subdir or --disable-subdir was given. +if test "${enable_subdir+set}" = set; then + enableval="$enable_subdir" + enable_subdir="$enableval" +else + enable_subdir=no +fi + +if test x"$enable_subdir" = xno; then + HACKDIR='$(bindir)' +elif test x"$enable_subdir" = xyes -o x"$enable_subdir" = x ; then + echo "error: must be a subdirectory name: --enable-subdir=$enable_subdir" + exit 1 +else + HACKDIR='$(bindir)/'$enable_subdir +fi + + +# If we find X, set shell vars x_includes and x_libraries to the +# paths, otherwise set no_x=yes. +# Uses ac_ vars as temps to allow command line to override cache and checks. +# --without-x overrides everything else, but does not touch the cache. +echo $ac_n "checking for X""... $ac_c" 1>&6 +echo "configure:1785: checking for X" >&5 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + : +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else +if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=NO ac_x_libraries=NO +rm -fr conftestdir +if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case "$ac_im_incroot" in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; + esac + case "$ac_im_usrlibdir" in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; + esac + fi + cd .. + rm -fr conftestdir +fi + +if test "$ac_x_includes" = NO; then + # Guess where to find include files, by looking for this one X11 .h file. + test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h + + # First, try using that file with no special directory specified. +cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1852: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + # Look for the header file in a standard set of common directories. +# Check X11 before X11Rn because it is often a symlink to the current release. + for ac_dir in \ + /usr/X11/include \ + /usr/X11R6/include \ + /usr/X11R5/include \ + /usr/X11R4/include \ + \ + /usr/include/X11 \ + /usr/include/X11R6 \ + /usr/include/X11R5 \ + /usr/include/X11R4 \ + \ + /usr/local/X11/include \ + /usr/local/X11R6/include \ + /usr/local/X11R5/include \ + /usr/local/X11R4/include \ + \ + /usr/local/include/X11 \ + /usr/local/include/X11R6 \ + /usr/local/include/X11R5 \ + /usr/local/include/X11R4 \ + \ + /usr/X386/include \ + /usr/x386/include \ + /usr/XFree86/include/X11 \ + \ + /usr/include \ + /usr/local/include \ + /usr/unsupported/include \ + /usr/athena/include \ + /usr/local/x11r5/include \ + /usr/lpp/Xamples/include \ + \ + /usr/openwin/include \ + /usr/openwin/share/include \ + ; \ + do + if test -r "$ac_dir/$x_direct_test_include"; then + ac_x_includes=$ac_dir + break + fi + done +fi +rm -f conftest* +fi # $ac_x_includes = NO + +if test "$ac_x_libraries" = NO; then + # Check for the libraries. + + test -z "$x_direct_test_library" && x_direct_test_library=Xt + test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc + + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS="$LIBS" + LIBS="-l$x_direct_test_library $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + LIBS="$ac_save_LIBS" +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + LIBS="$ac_save_LIBS" +# First see if replacing the include by lib works. +# Check X11 before X11Rn because it is often a symlink to the current release. +for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ + /usr/X11/lib \ + /usr/X11R6/lib \ + /usr/X11R5/lib \ + /usr/X11R4/lib \ + \ + /usr/lib/X11 \ + /usr/lib/X11R6 \ + /usr/lib/X11R5 \ + /usr/lib/X11R4 \ + \ + /usr/local/X11/lib \ + /usr/local/X11R6/lib \ + /usr/local/X11R5/lib \ + /usr/local/X11R4/lib \ + \ + /usr/local/lib/X11 \ + /usr/local/lib/X11R6 \ + /usr/local/lib/X11R5 \ + /usr/local/lib/X11R4 \ + \ + /usr/X386/lib \ + /usr/x386/lib \ + /usr/XFree86/lib/X11 \ + \ + /usr/lib \ + /usr/local/lib \ + /usr/unsupported/lib \ + /usr/athena/lib \ + /usr/local/x11r5/lib \ + /usr/lpp/Xamples/lib \ + /lib/usr/lib/X11 \ + \ + /usr/openwin/lib \ + /usr/openwin/share/lib \ + ; \ +do + for ac_extension in a so sl; do + if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest* +fi # $ac_x_libraries = NO + +if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$ac_t""$have_x" 1>&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + cat >> confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case "`(uname -sr) 2>/dev/null`" in + "SunOS 5"*) + echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 +echo "configure:2034: checking whether -R must be followed by a space" >&5 + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + ac_R_nospace=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_nospace=no +fi +rm -f conftest* + if test $ac_R_nospace = yes; then + echo "$ac_t""no" 1>&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + ac_R_space=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_R_space=no +fi +rm -f conftest* + if test $ac_R_space = yes; then + echo "$ac_t""yes" 1>&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$ac_t""neither works" 1>&6 + fi + fi + LIBS="$ac_xsave_LIBS" + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And karl@cs.umb.edu says + # the Alpha needs dnet_stub (dnet does not exist). + echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 +echo "configure:2099: checking for dnet_ntoa in -ldnet" >&5 +ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 +echo "configure:2140: checking for dnet_ntoa in -ldnet_stub" >&5 +ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldnet_stub $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to dickey@clark.net. + echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 +echo "configure:2188: checking for gethostbyname" >&5 +if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +gethostbyname(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2216: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_gethostbyname=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_gethostbyname=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_gethostbyname = no; then + echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 +echo "configure:2237: checking for gethostbyname in -lnsl" >&5 +ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lnsl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says simon@lia.di.epfl.ch: it contains + # gethostby* variants that don't use the nameserver (or something). + # -lsocket must be given before -lnsl if both are needed. + # We assume that if connect needs -lnsl, so does gethostbyname. + echo $ac_n "checking for connect""... $ac_c" 1>&6 +echo "configure:2286: checking for connect" >&5 +if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +connect(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_connect=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_connect=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_connect = no; then + echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 +echo "configure:2335: checking for connect in -lsocket" >&5 +ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. + echo $ac_n "checking for remove""... $ac_c" 1>&6 +echo "configure:2378: checking for remove" >&5 +if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +remove(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_remove=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_remove=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_remove = no; then + echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 +echo "configure:2427: checking for remove in -lposix" >&5 +ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lposix $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo $ac_n "checking for shmat""... $ac_c" 1>&6 +echo "configure:2470: checking for shmat" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +shmat(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2498: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_shmat=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shmat=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + + if test $ac_cv_func_shmat = no; then + echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 +echo "configure:2519: checking for shmat in -lipc" >&5 +ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lipc $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS="$LDFLAGS" + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. + echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 +echo "configure:2571: checking for IceConnectionNumber in -lICE" >&5 +ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lICE $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +else + echo "$ac_t""no" 1>&6 +fi + + LDFLAGS="$ac_save_LDFLAGS" + +fi + + +# Try and find the app-defaults directory. +# It sucks that autoconf doesn't do this already... +# + + + + + + + + + echo $ac_n "checking for X app-defaults directory""... $ac_c" 1>&6 +echo "configure:2627: checking for X app-defaults directory" >&5 +if eval "test \"`echo '$''{'ac_cv_x_app_defaults'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + rm -fr conftestdir + if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_x_app_defaults="${XAPPLOADDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which'd confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + fi + cd .. + rm -fr conftestdir + fi + # Look for the directory under a standard set of common directories. + # Check X11 before X11Rn because it's often a symlink to the current release. + for ac_dir in \ + /usr/X11/lib/app-defaults \ + /usr/X11R6/lib/app-defaults \ + /usr/X11R6/lib/X11/app-defaults \ + /usr/X11R5/lib/app-defaults \ + /usr/X11R5/lib/X11/app-defaults \ + /usr/X11R4/lib/app-defaults \ + /usr/X11R4/lib/X11/app-defaults \ + \ + /usr/lib/X11/app-defaults \ + /usr/lib/X11R6/app-defaults \ + /usr/lib/X11R5/app-defaults \ + /usr/lib/X11R4/app-defaults \ + \ + /usr/local/X11/lib/app-defaults \ + /usr/local/X11R6/lib/app-defaults \ + /usr/local/X11R5/lib/app-defaults \ + /usr/local/X11R4/lib/app-defaults \ + \ + /usr/local/lib/X11/app-defaults \ + /usr/local/lib/X11R6/app-defaults \ + /usr/local/lib/X11R6/X11/app-defaults \ + /usr/local/lib/X11R5/app-defaults \ + /usr/local/lib/X11R5/X11/app-defaults \ + /usr/local/lib/X11R4/app-defaults \ + /usr/local/lib/X11R4/X11/app-defaults \ + \ + /usr/X386/lib/X11/app-defaults \ + /usr/x386/lib/X11/app-defaults \ + /usr/XFree86/lib/X11/app-defaults \ + \ + /usr/lib/X11/app-defaults \ + /usr/local/lib/X11/app-defaults \ + /usr/unsupported/lib/X11/app-defaults \ + /usr/athena/lib/X11/app-defaults \ + /usr/local/x11r5/lib/X11/app-defaults \ + /usr/lpp/Xamples/lib/X11/app-defaults \ + /lib/usr/lib/X11/app-defaults \ + \ + /usr/openwin/lib/app-defaults \ + /usr/openwin/lib/X11/app-defaults \ + /usr/openwin/share/lib/app-defaults \ + /usr/openwin/share/lib/X11/app-defaults \ + \ + /X11R6/lib/app-defaults \ + /X11R5/lib/app-defaults \ + /X11R4/lib/app-defaults \ + ; \ + do + if test -d "$ac_dir"; then + ac_x_app_defaults=$ac_dir + break + fi + done + + if test x"$ac_x_app_defaults" = x; then + ac_cv_x_app_defaults="/usr/lib/X11/app-defaults" + else + # Record where we found app-defaults for the cache. + ac_cv_x_app_defaults="$ac_x_app_defaults" + fi +fi + +echo "$ac_t""$ac_cv_x_app_defaults" 1>&6 + eval ac_x_app_defaults="$ac_cv_x_app_defaults" + +APPDEFAULTS=$ac_x_app_defaults + + +# Like AC_CHECK_HEADER, but it uses the already-computed -I directories. +# + + +# Like AC_EGREP_HEADER, but it uses the already-computed -I directories. +# + + +# Like AC_TRY_COMPILE, but it uses the already-computed -I directories. +# + + + +# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories. +# Use this sparingly; it probably doesn't work very well on X programs. +# + + + + + +# check for the HP XHPDisableReset server extension headers. +# + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "XHPDisableReset" >/dev/null 2>&1; then + rm -rf conftest* + cat >> confdefs.h <<\EOF +#define HAVE_XHPDISABLERESET 1 +EOF + + SAVER_LIBS="-lXhp11 $SAVER_LIBS" +fi +rm -f conftest* + + CPPFLAGS="$ac_save_CPPFLAGS" + + +# Check for the availability of the XPointer typedef, and define it otherwise. +# +echo $ac_n "checking for XPointer""... $ac_c" 1>&6 +echo "configure:2769: checking for XPointer" >&5 +if eval "test \"`echo '$''{'ac_cv_xpointer'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +int main() { +XPointer foo = (XPointer) 0; +; return 0; } +EOF +if { (eval echo configure:2787: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_xpointer=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_xpointer=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_xpointer" 1>&6 +if test $ac_cv_xpointer != yes; then + cat >> confdefs.h <<\EOF +#define XPointer char* +EOF + +fi + + +case "$host" in + *-hpux*) + # Thanks for not making xmkmf find this by default, you losers. + if test -d /usr/lib/Motif1.2 ; then + X_CFLAGS="-I/usr/include/Motif1.2 $X_CFLAGS" + X_LIBS="-L/usr/lib/Motif1.2 $X_LIBS" + elif test -d /usr/lib/Motif1.1 ; then + X_CFLAGS="-I/usr/include/Motif1.1 $X_CFLAGS" + X_LIBS="-L/usr/lib/Motif1.1 $X_LIBS" + fi + + # This too. You losers. + if test -d /usr/contrib/X11R6/include ; then + X_CFLAGS="-I/usr/contrib/X11R6/include $X_CFLAGS" + X_LIBS="-L/usr/contrib/X11R6/lib $X_LIBS" + elif test -d /usr/contrib/X11R5/include ; then + X_CFLAGS="-I/usr/contrib/X11R5/include $X_CFLAGS" + X_LIBS="-L/usr/contrib/X11R5/lib $X_LIBS" + fi + + ;; + *-solaris*) + # Same to you, pinheads. (Is this really the standard location now? + # What happened to the joke that this kind of thing went in /opt?) + if test -f /usr/dt/include/Xm/Xm.h ; then + X_CFLAGS="$X_CFLAGS -I/usr/dt/include" + X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib" + + # Some versions of Slowlaris Motif require -lgen. But not all. Why? + echo $ac_n "checking for regcmp in -lgen""... $ac_c" 1>&6 +echo "configure:2839: checking for regcmp in -lgen" >&5 +ac_lib_var=`echo gen'_'regcmp | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lgen $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + X_LIBS="$X_LIBS -lgen" +else + echo "$ac_t""no" 1>&6 +fi + + fi + ;; +esac + + + +# Check for Xmu (some fucked up vendors don't ship it...) +# +have_xmu=no + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/Xmu/Error.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/Xmu/Error.h""... $ac_c" 1>&6 +echo "configure:2895: checking for X11/Xmu/Error.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2905: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_xmu=yes +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +if test $have_xmu = no ; then + XMU_SRCS='$(UTILS_SRC)/xmu.c' + XMU_OBJS='$(UTILS_BIN)/xmu.o' +else + XMU_SRCS='' + XMU_OBJS='' + SAVER_LIBS="-lXmu $SAVER_LIBS" + HACK_LIBS="-lXmu $HACK_LIBS" + cat >> confdefs.h <<\EOF +#define HAVE_XMU 1 +EOF + +fi + + +# See comp.windows.x FAQ question 124 about _get_wmShellWidgetClass on 4.1.x. +# The right fix is to get OpenWindows 3.0 patches 100512-02 and 100573-03. +# +if test $have_xmu = yes ; then + case "$host" in + *-sunos4*) + echo $ac_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug""... $ac_c" 1>&6 +echo "configure:2949: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5 +if eval "test \"`echo '$''{'ac_cv_sunos_xmu_bug'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$x_libraries" ; then + LDFLAGS="$LDFLAGS -L$x_libraries" + fi + # Note: this trick never works! (Generally.) + # We're only getting away with using AC_TRY_LINK + # with X libraries because we know it's SunOS. + LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + ac_cv_sunos_xmu_bug=no +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_sunos_xmu_bug=yes +fi +rm -f conftest* + LDFLAGS="$ac_save_LDFLAGS" +fi + +echo "$ac_t""$ac_cv_sunos_xmu_bug" 1>&6 + if test $ac_cv_sunos_xmu_bug = yes ; then + echo $ac_n "checking whether the compiler understands -static""... $ac_c" 1>&6 +echo "configure:2985: checking whether the compiler understands -static" >&5 +if eval "test \"`echo '$''{'ac_cv_ld_static'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -static" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + ac_cv_ld_static=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_ld_static=no +fi +rm -f conftest* + LDFLAGS="$ac_save_LDFLAGS" +fi + +echo "$ac_t""$ac_cv_ld_static" 1>&6 + if test $ac_cv_ld_static = yes ; then + LDFLAGS="$LDFLAGS -static" + else + LDFLAGS="$LDFLAGS -Bstatic" + fi + fi + ;; + esac +fi + + +# Check for the SGI SCREEN_SAVER server extension header. +# +have_sgi=no +with_sgi_req=unspecified +# Check whether --with-sgi-ext or --without-sgi-ext was given. +if test "${with_sgi_ext+set}" = set; then + withval="$with_sgi_ext" + with_sgi="$withval"; with_sgi_req="$withval" +else + with_sgi=yes +fi + +if test $with_sgi = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/extensions/XScreenSaver.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/extensions/XScreenSaver.h""... $ac_c" 1>&6 +echo "configure:3045: checking for X11/extensions/XScreenSaver.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3055: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_sgi=yes + cat >> confdefs.h <<\EOF +#define HAVE_SGI_SAVER_EXTENSION 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + +elif test $with_sgi != no; then + echo "error: must be yes or no: --with-sgi-ext=$with_sgi" + exit 1 +fi + +# Check for the MIT-SCREEN-SAVER server extension header, +# unless the SGI extension has already been found. +# +have_mit=no +with_mit_req=unspecified +# Check whether --with-mit-ext or --without-mit-ext was given. +if test "${with_mit_ext+set}" = set; then + withval="$with_mit_ext" + with_mit="$withval"; with_mit_req="$withval" +else + with_mit=yes +fi + +if test $have_sgi != yes; then + if test $with_mit = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/extensions/scrnsaver.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/extensions/scrnsaver.h""... $ac_c" 1>&6 +echo "configure:3110: checking for X11/extensions/scrnsaver.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3120: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_mit=yes +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + + # Now check to see if it's really in the library; XF86Free-3.3 ships + # scrnsaver.h, but doesn't include the code in libXext.a, the idiots! + # + if test $have_mit = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS -L$x_libraries" + echo $ac_n "checking for XScreenSaverRegister in -lXext""... $ac_c" 1>&6 +echo "configure:3162: checking for XScreenSaverRegister in -lXext" >&5 +ac_lib_var=`echo Xext'_'XScreenSaverRegister | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lXext -lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo Xext | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +have_mit=no +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + + if test $have_mit = no; then + # Fuck! Looks like XF86Free-3.3 actually puts it in XExExt instead + # of in Xext. Thank you master, may I have another. + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS -L$x_libraries" + echo $ac_n "checking for XScreenSaverRegister in -lXExExt""... $ac_c" 1>&6 +echo "configure:3230: checking for XScreenSaverRegister in -lXExExt" >&5 +ac_lib_var=`echo XExExt'_'XScreenSaverRegister | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lXExExt -lX11 -lXext -lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + fi + + if test $have_mit = no; then + # Double fuck! Looks like some versions of XFree86 (whichever version + # it is that comes with RedHat Linux 2.0 -- I can't find a version + # number) put this garbage in Xss instead of Xext. Thank you master, + # may I have another. + + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS -L$x_libraries" + echo $ac_n "checking for XScreenSaverRegister in -lXss""... $ac_c" 1>&6 +echo "configure:3293: checking for XScreenSaverRegister in -lXss" >&5 +ac_lib_var=`echo Xss'_'XScreenSaverRegister | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lXss -lX11 -lXext -lm $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS" + fi + + if test $have_mit = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MIT_SAVER_EXTENSION 1 +EOF + + fi + + fi + + elif test $with_mit != no; then + echo "error: must be yes or no: --with-mit-ext=$with_mit" + exit 1 + fi +fi + + +# Check for the XIDLE server extension header, +# +have_xidle=no +with_xidle_req=unspecified +# Check whether --with-xidle-ext or --without-xidle-ext was given. +if test "${with_xidle_ext+set}" = set; then + withval="$with_xidle_ext" + with_xidle="$withval"; with_xidle_req="$withval" +else + with_xidle=yes +fi + +if test $with_xidle = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/extensions/xidle.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/extensions/xidle.h""... $ac_c" 1>&6 +echo "configure:3373: checking for X11/extensions/xidle.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_xidle=yes + cat >> confdefs.h <<\EOF +#define HAVE_XIDLE_EXTENSION 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +elif test $with_xidle != no; then + echo "error: must be yes or no: --with-xidle-ext=$with_xidle" + exit 1 +fi + + +# Check for Motif and Athena --with and --without arguments. +# +have_motif=no +have_athena=no +with_motif_req=unspecified +with_athena_req=unspecified + +# Check whether --with-motif or --without-motif was given. +if test "${with_motif+set}" = set; then + withval="$with_motif" + with_motif="$withval"; with_motif_req="$withval" +else + with_motif=no +fi + + +# Check whether --with-athena or --without-athena was given. +if test "${with_athena+set}" = set; then + withval="$with_athena" + with_athena="$withval"; with_athena_req="$withval" +else + with_athena=no +fi + + +if test $with_motif != yes -a $with_motif != no ; then + echo "error: must be yes or no: --with-motif=$with_motif" + exit 1 +fi + +if test $with_athena != yes -a $with_athena != no ; then + echo "error: must be yes or no: --with-athena=$with_athena" + exit 1 +fi + + +# Saying --without-motif is the same as saying --with-athena. +if test $with_motif_req = no ; then + with_athena_req=yes + with_athena=yes +fi + +# Saying --without-athena is the same as saying --with-motif. +if test $with_athena_req = no ; then + with_motif_req=yes + with_motif=yes +fi + +# Check for Motif and Athena headers. + +check_motif() { + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6 +echo "configure:3474: checking for Xm/Xm.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3484: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_motif=yes + cat >> confdefs.h <<\EOF +#define HAVE_MOTIF 1 +EOF + + SAVER_LIBS="-lXm $SAVER_LIBS" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +} + +check_athena() { + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/Xaw/Dialog.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/Xaw/Dialog.h""... $ac_c" 1>&6 +echo "configure:3522: checking for X11/Xaw/Dialog.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3532: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_athena=yes + cat >> confdefs.h <<\EOF +#define HAVE_ATHENA 1 +EOF + + SAVER_LIBS="-lXaw $SAVER_LIBS" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +} + + +# If they asked for both motif and athena, check motif then athena. +# If they asked for only motif, check motif then athena. +# If they asked for only athena, check athena then motif. +# If they asked for neither, check motif then athena. + +if test $with_motif = yes; then + # asked for both, or for motif only + check_motif + if test $have_motif = yes; then + with_athena=no + with_athena_req=no + else + check_athena + fi + +elif test $with_athena = yes; then + # asked for athena only + check_athena + if test $have_athena = yes; then + with_motif=no + else + check_motif + fi + +else + # asked for neither + check_motif + if test $have_motif = yes; then + with_athena=no + else + check_athena + fi + +fi + + +# If we have Athena, check whether it's a version that includes +# XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.) +if test $have_athena = yes ; then + echo $ac_n "checking for XawViewportSetCoordinates in Viewport.h""... $ac_c" 1>&6 +echo "configure:3602: checking for XawViewportSetCoordinates in Viewport.h" >&5 +if eval "test \"`echo '$''{'ac_cv_have_XawViewportSetCoordinates'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_have_XawViewportSetCoordinates=no + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "XawViewportSetCoordinates" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_have_XawViewportSetCoordinates=yes +fi +rm -f conftest* + + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_have_XawViewportSetCoordinates" 1>&6 + if test $ac_cv_have_XawViewportSetCoordinates = yes ; then + cat >> confdefs.h <<\EOF +#define HAVE_XawViewportSetCoordinates 1 +EOF + + fi +fi + + +# If we have Motif, check whether it's really LessTif. +# +if test $have_motif = yes ; then + echo $ac_n "checking whether Motif is really LessTif""... $ac_c" 1>&6 +echo "configure:3642: checking whether Motif is really LessTif" >&5 +if eval "test \"`echo '$''{'ac_cv_have_lesstif'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +int main() { +long vers = LesstifVersion; +; return 0; } +EOF +if { (eval echo configure:3660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_have_lesstif=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_have_lesstif=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_have_lesstif" 1>&6 + have_lesstif=$ac_cv_have_lesstif +fi + + +# check for XPM header. +# +have_xpm=no +with_xpm_req=unspecified +# Check whether --with-xpm or --without-xpm was given. +if test "${with_xpm+set}" = set; then + withval="$with_xpm" + with_xpm="$withval"; with_xpm_req="$withval" +else + with_xpm=yes +fi + +if test $with_xpm = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6 +echo "configure:3699: checking for X11/xpm.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3709: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_xpm=yes + cat >> confdefs.h <<\EOF +#define HAVE_XPM 1 +EOF + + XPM_LIBS="-lXpm" +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +elif test $with_xpm != no; then + echo "error: must be yes or no: --with-xpm=$with_xpm" + exit 1 +fi + + +# check for the GL header +# +have_gl=no +with_gl_req=unspecified +# Check whether --with-gl or --without-gl was given. +if test "${with_gl+set}" = set; then + withval="$with_gl" + with_gl="$withval"; with_gl_req="$withval" +else + with_gl=yes +fi + + +if test $with_gl = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6 +echo "configure:3764: checking for GL/gl.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_gl=yes +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + if test $have_gl = yes ; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "GL/glx.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for GL/glx.h""... $ac_c" 1>&6 +echo "configure:3805: checking for GL/glx.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_gl=yes +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" + fi + + # If we have the headers, try and figure out which vendor it's from. + # + if test $have_gl = yes ; then + + cat >> confdefs.h <<\EOF +#define HAVE_GL 1 +EOF + + have_mesa_gl=no + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "Mesa" >/dev/null 2>&1; then + rm -rf conftest* + have_mesa_gl=yes +fi +rm -f conftest* + + CPPFLAGS="$ac_save_CPPFLAGS" + if test $have_mesa_gl = no ; then + GL_LIBS="-lGL -lGLU" + else + cat >> confdefs.h <<\EOF +#define HAVE_MESA_GL 1 +EOF + + GL_LIBS="-lMesaGL -lMesaGLU" + fi + fi + +elif test $with_gl != no; then + echo "error: must be yes or no: --with-gl=$with_gl" + exit 1 +fi + + +# check for SGI XReadDisplay server extension header. +# +have_readdisplay=no +with_readdisplay_req=unspecified +# Check whether --with-readdisplay or --without-readdisplay was given. +if test "${with_readdisplay+set}" = set; then + withval="$with_readdisplay" + with_readdisplay="$withval"; with_readdisplay_req="$withval" +else + with_readdisplay=yes +fi + +if test $with_readdisplay = yes; then + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + ac_safe=`echo "X11/extensions/readdisplay.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for X11/extensions/readdisplay.h""... $ac_c" 1>&6 +echo "configure:3905: checking for X11/extensions/readdisplay.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3915: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_READ_DISPLAY_EXTENSION 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + + CPPFLAGS="$ac_save_CPPFLAGS" +elif test $with_readdisplay != no; then + echo "error: must be yes or no: --with-readdisplay=$with_readdisplay" + exit 1 +fi + + + +# Try to find a program to generate random text. +# +# Zippy is funnier than the idiocy generally spat out by `fortune', +# so try to find that, by invoking Emacs and asking it where its +# libexec directory is ("yow" lives in there.) +# +# If that doesn't work, see if fortune, zippy, or yow are on $PATH, +# and if so, use them. +# +# If that doesn't work, look in /usr/games, and if it's there, use +# the full pathname. +# +with_zippy="" +# Check whether --with-zippy or --without-zippy was given. +if test "${with_zippy+set}" = set; then + withval="$with_zippy" + with_zippy="$withval" +fi + + +if test "$with_zippy" = no || test "$with_zippy" = yes ; then + $with_zippy="" +fi + +if test -n "$with_zippy" ; then + ac_cv_zippy_program="$with_zippy" + +elif test -n "$ac_cv_zippy_program"; then + echo "$ac_t""checking for zippy... (cached) $ac_cv_zippy_program" 1>&6 + +else + + for ac_prog in emacs +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:3984: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_emacs_exe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$emacs_exe"; then + ac_cv_prog_emacs_exe="$emacs_exe" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_emacs_exe="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +emacs_exe="$ac_cv_prog_emacs_exe" +if test -n "$emacs_exe"; then + echo "$ac_t""$emacs_exe" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$emacs_exe" && break +done + + for ac_prog in xemacs +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:4017: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_xemacs_exe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$xemacs_exe"; then + ac_cv_prog_xemacs_exe="$xemacs_exe" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_xemacs_exe="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +xemacs_exe="$ac_cv_prog_xemacs_exe" +if test -n "$xemacs_exe"; then + echo "$ac_t""$xemacs_exe" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$xemacs_exe" && break +done + + + ac_cv_zippy_program="" + eargs='-batch -q -nw --eval' + + if test -n "$emacs_exe" ; then + echo $ac_n "checking for emacs yow""... $ac_c" 1>&6 +echo "configure:4051: checking for emacs yow" >&5 + # + # get emacs to tell us where the libexec directory is. + # + dir=`$emacs_exe $eargs '(princ (concat exec-directory "\n"))' \ + 2>/dev/null | tail -1` + dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'` + # + # try running libexec/yow and see if it exits without error. + # + if test x"$dir" != x -a -x $dir/yow ; then + if $dir/yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/yow" + echo "$ac_t""$ac_cv_zippy_program" 1>&6 + else + echo "$ac_t""no" 1>&6 + fi + fi + fi + + if test -z "$ac_cv_zippy_program" ; then + echo $ac_n "checking for xemacs yow""... $ac_c" 1>&6 +echo "configure:4073: checking for xemacs yow" >&5 + if test -n "$xemacs_exe" ; then + # + # get xemacs to tell us where the libexec directory is. + # + dir=`$xemacs_exe $eargs '(princ (concat exec-directory "\n"))' \ + 2>/dev/null | tail -1` + dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'` + # + # try running libexec/yow and see if it exits without error. + # + if test x"$dir" != x -a -x $dir/yow ; then + if $dir/yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/yow" + echo "$ac_t""$ac_cv_zippy_program" 1>&6 + else + # + # in some xemacs installations, the pathname of the yow.lines file + # isn't hardcoded into the yow executable, and must be passed on + # the command line. See if it's in libexec/../etc/. + + # M4 sucks!! + + dir_up=`echo "$dir" | sed 's@/[^/]*$@@'` + + + yow="yow -f $dir_up/etc/yow.lines" + if $dir/$yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/$yow" + echo "$ac_t""$ac_cv_zippy_program" 1>&6 + else + echo "$ac_t""no" 1>&6 + fi + fi + fi + fi + fi + + # if that didn't work, try for some other programs... + if test -z "$ac_cv_zippy_program" ; then + fortune='' + for ac_prog in fortune zippy yow +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:4119: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_fortune'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$fortune"; then + ac_cv_prog_fortune="$fortune" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_fortune="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +fortune="$ac_cv_prog_fortune" +if test -n "$fortune"; then + echo "$ac_t""$fortune" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$fortune" && break +done + + # if that didn't work, try for those programs in /usr/games... + if test -z "$fortune" ; then + for ac_prog in fortune zippy yow +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:4154: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_fortune'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$fortune" in + /*) + ac_cv_path_fortune="$fortune" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in /usr/games:/usr/local/games$ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_fortune="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +fortune="$ac_cv_path_fortune" +if test -n "$fortune"; then + echo "$ac_t""$fortune" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$fortune" && break +done +test -n "$fortune" || fortune="fortune" + + fi + fi +fi + +if test -z "$ac_cv_zippy_program" ; then + ac_cv_zippy_program=fortune +fi + +cat >> confdefs.h <&6 +echo "configure:4233: checking for Kerberos" >&5 +if eval "test \"`echo '$''{'ac_cv_kerberos'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < +int main() { + +; return 0; } +EOF +if { (eval echo configure:4251: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_kerberos=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_kerberos=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_kerberos" 1>&6 + if test $ac_cv_kerberos = yes ; then + have_kerberos=yes + cat >> confdefs.h <<\EOF +#define HAVE_KERBEROS 1 +EOF + + PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lnsl -lsocket" + fi + elif test $with_kerberos != no; then + echo "error: must be yes or no: --with-kerberos=$with_kerberos" + exit 1 + fi + + # Next, check for the nine billion variants of shadow passwords... + + passwd_cruft_done=no + # Check whether --with-shadow or --without-shadow was given. +if test "${with_shadow+set}" = set; then + withval="$with_shadow" + with_shadow="$withval"; with_shadow_req="$withval" +else + with_shadow=yes +fi + + if test $with_shadow = no; then + passwd_cruft_done=yes + elif test $with_shadow != yes; then + echo "error: must be yes or no: --with-shadow=$with_shadow" + exit 1 + fi + + + # Sun's "adjunct" passwords. + # + if test $passwd_cruft_done = no ; then + echo $ac_n "checking for Sun-style shadow passwords""... $ac_c" 1>&6 +echo "configure:4301: checking for Sun-style shadow passwords" >&5 +if eval "test \"`echo '$''{'ac_cv_sun_adjunct'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < + #include + #include + #include + #include + #include +int main() { +struct passwd_adjunct *p = getpwanam("nobody"); + const char *pw = p->pwa_passwd; +; return 0; } +EOF +if { (eval echo configure:4325: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sun_adjunct=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_sun_adjunct=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_sun_adjunct" 1>&6 + if test $ac_cv_sun_adjunct = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + cat >> confdefs.h <<\EOF +#define HAVE_ADJUNCT_PASSWD 1 +EOF + + fi + fi + + # DEC and SCO so-called "enhanced" security. + # + if test $passwd_cruft_done = no ; then + echo $ac_n "checking for DEC-style shadow passwords""... $ac_c" 1>&6 +echo "configure:4354: checking for DEC-style shadow passwords" >&5 +if eval "test \"`echo '$''{'ac_cv_enhanced_passwd'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < + #include + #include + #include + #include + #include +int main() { +struct pr_passwd *p; + const char *pw; + set_auth_parameters(0, 0); + check_auth_parameters(); + p = getprpwnam("nobody"); + pw = p->ufld.fd_encrypt; +; return 0; } +EOF +if { (eval echo configure:4382: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_enhanced_passwd=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_enhanced_passwd=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_enhanced_passwd" 1>&6 + if test $ac_cv_enhanced_passwd = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + cat >> confdefs.h <<\EOF +#define HAVE_ENHANCED_PASSWD 1 +EOF + + + # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx) + # (I'm told it needs -lcurses too, but I don't understand why.) + echo $ac_n "checking for getprpwnam in -lprot""... $ac_c" 1>&6 +echo "configure:4408: checking for getprpwnam in -lprot" >&5 +ac_lib_var=`echo prot'_'getprpwnam | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lprot -lx $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx" +else + echo "$ac_t""no" 1>&6 +# On DEC, getprpwnam() is in -lsecurity + echo $ac_n "checking for getprpwnam in -lsecurity""... $ac_c" 1>&6 +echo "configure:4447: checking for getprpwnam in -lsecurity" >&5 +ac_lib_var=`echo security'_'getprpwnam | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsecurity $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PASSWD_LIBS="$PASSWD_LIBS -lsecurity" +else + echo "$ac_t""no" 1>&6 +fi + +fi + + fi + fi + + # HP's entry in the "Not Invented Here" Sweepstakes. + # + if test $passwd_cruft_done = no ; then + echo $ac_n "checking for HP-style shadow passwords""... $ac_c" 1>&6 +echo "configure:4495: checking for HP-style shadow passwords" >&5 +if eval "test \"`echo '$''{'ac_cv_hpux_passwd'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < + #include + #include + #include + #include + #include +int main() { +struct s_passwd *p = getspwnam("nobody"); + const char *pw = p->pw_passwd; +; return 0; } +EOF +if { (eval echo configure:4519: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_hpux_passwd=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_hpux_passwd=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_hpux_passwd" 1>&6 + if test $ac_cv_hpux_passwd = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + cat >> confdefs.h <<\EOF +#define HAVE_HPUX_PASSWD 1 +EOF + + + # on HPUX, bigcrypt is in -lsec + echo $ac_n "checking for bigcrypt in -lsec""... $ac_c" 1>&6 +echo "configure:4544: checking for bigcrypt in -lsec" >&5 +ac_lib_var=`echo sec'_'bigcrypt | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lsec $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + PASSWD_LIBS="$PASSWD_LIBS -lsec" +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + + # Traditional (ha!) shadow passwords. + # + if test $passwd_cruft_done = no ; then + echo $ac_n "checking for generic shadow passwords""... $ac_c" 1>&6 +echo "configure:4590: checking for generic shadow passwords" >&5 +if eval "test \"`echo '$''{'ac_cv_shadow'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + cat > conftest.$ac_ext < + #include + #include + #include + #include +int main() { +struct spwd *p = getspnam("nobody"); + const char *pw = p->sp_pwdp; +; return 0; } +EOF +if { (eval echo configure:4613: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_shadow=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_shadow=no +fi +rm -f conftest* + CPPFLAGS="$ac_save_CPPFLAGS" +fi + +echo "$ac_t""$ac_cv_shadow" 1>&6 + if test $ac_cv_shadow = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + cat >> confdefs.h <<\EOF +#define HAVE_SHADOW_PASSWD 1 +EOF + + + # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc. + have_getspnam=no + echo $ac_n "checking for getspnam in -lc""... $ac_c" 1>&6 +echo "configure:4639: checking for getspnam in -lc" >&5 +ac_lib_var=`echo c'_'getspnam | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lc $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_getspnam=yes +else + echo "$ac_t""no" 1>&6 +fi + + if test $have_getspnam = no ; then + echo $ac_n "checking for getspnam in -lgen""... $ac_c" 1>&6 +echo "configure:4680: checking for getspnam in -lgen" >&5 +ac_lib_var=`echo gen'_'getspnam | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lgen $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen" +else + echo "$ac_t""no" 1>&6 +fi + + fi + fi + fi + + # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc. + have_crypt=no + echo $ac_n "checking for crypt in -lc""... $ac_c" 1>&6 +echo "configure:4726: checking for crypt in -lc" >&5 +ac_lib_var=`echo c'_'crypt | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lc $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_crypt=yes +else + echo "$ac_t""no" 1>&6 +fi + + if test $have_crypt = no ; then + echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6 +echo "configure:4767: checking for crypt in -lcrypt" >&5 +ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lcrypt $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt" +else + echo "$ac_t""no" 1>&6 +fi + + fi + + + # Most of the above shadow mechanisms will have set need_setuid to yes, + # if they were found. But, on some systems, we need setuid even when + # using plain old vanilla passwords. + # + if test $need_setuid = no ; then + case "$host" in + *-hpux* | *-aix* | *-netbsd* ) + need_setuid=yes + ;; + esac + fi + +elif test $enable_locking = no; then + cat >> confdefs.h <<\EOF +#define NO_LOCKING 1 +EOF + +else + echo "error: must be yes or no: --enable-locking=$enable_locking" + exit 1 +fi + + + +if test \! -z "$includedir" ; then + INCLUDES="-I$includedir" +fi + +if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" +fi + + +##### should have options to override the DEPEND crap, I guess... +DEPEND=makedepend +DEPEND_FLAGS= +DEPEND_DEFINES= + + + +# Done testing things -- now substitute in some stuff for the Makefiles. +# +if test $have_motif = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_MOTIF 1 +EOF + + DIALOG_SRCS='$(MOTIF_SRCS)' + DIALOG_OBJS='$(MOTIF_OBJS)' +elif test $have_athena = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_ATHENA 1 +EOF + + DIALOG_SRCS='$(ATHENA_SRCS)' + DIALOG_OBJS='$(ATHENA_OBJS)' +else + DIALOG_SRCS='' + DIALOG_OBJS='' +fi + +if test $have_kerberos = yes; then + PASSWD_SRCS='$(KERBEROS_SRCS)' + PASSWD_OBJS='$(KERBEROS_OBJS)' +else + PASSWD_SRCS='$(PWENT_SRCS)' + PASSWD_OBJS='$(PWENT_OBJS)' +fi + +if test $enable_locking = yes; then + LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)' + LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)' +else + LOCK_SRCS='' + LOCK_OBJS='' +fi + +if test $need_setuid = yes; then + NEED_SETUID=yes + INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)' +else + NEED_SETUID=no + INSTALL_SETUID='$(INSTALL_PROGRAM)' +fi + +tab=' ' +if test $have_gl = yes; then + GL_EXES='$(GL_EXES)' + GL_KLUDGE_1=${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}' \' + GL_KLUDGE_2=${tab} +else + GL_KLUDGE_1=${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}'\n' + GL_KLUDGE_2='!'${tab} +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Print some warnings before emitting the Makefiles. +# +warning=no +warnsep=' #################################################################' +warn() { + if test $warning = no ; then + echo '' ; echo "$warnsep" ; echo '' + warning=yes + fi + echo " Warning:" $* +} + +warn2() { + echo " " $* +} + +if test $with_sgi_req = yes -a $have_sgi = no ; then + warn 'The SGI saver extension was requested, but was not found.' +fi + +if test $with_mit_req = yes -a $have_mit = no ; then + warn 'The MIT saver extension was requested, but was not found.' +fi + +if test $with_xidle_req = yes -a $have_xidle = no ; then + warn 'The XIdle extension was requested, but was not found.' +fi + +if test $have_motif = no -a $have_athena = no ; then + warn "Neither Motif nor Athena widgets seem to be available;" + warn2 "one or the other is required." + +elif test $with_motif_req = yes -a $have_motif = no ; then + warn "Use of Motif was requested, but it wasn't found;" + warn2 "Athena will be used instead." + +elif test $with_athena_req = yes -a $have_athena = no ; then + warn "Use of Athena was requested, but it wasn't found;" + warn2 "Motif will be used instead." +fi + +if test $have_motif = yes -a $have_lesstif = yes ; then + warn "Motif is being used, but it appears to actually be LessTif." + warn2 "XScreenSaver has been reported to have problems with some" + warn2 "versions of LessTif (notably 0.79). You might want to use" + warn2 "Athena instead." +fi + +if test $with_xpm_req = yes -a $have_xpm = no ; then + warn 'Use of XPM was requested, but it was not found.' +fi + +if test $with_gl_req = yes -a $have_gl = no ; then + warn 'Use of GL was requested, but it was not found.' +fi + +if test $with_readdisplay_req = yes -a $have_readdisplay = no ; then + warn 'Use of XReadDisplay was requested, but it was not found.' +fi + +if test $with_kerberos_req = yes -a $have_kerberos = no ; then + warn 'Use of Kerberos was requested, but it was not found.' +fi + +if test $with_shadow_req = yes -a $have_shadow = no ; then + warn 'Use of shadow passwords was requested, but they were not found.' +fi + +if test $warning = yes; then + echo '' ; echo "$warnsep" ; echo '' +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.12" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile + utils/Makefile + driver/Makefile + hacks/Makefile + hacks/glx/Makefile + driver/XScreenSaver.ad config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@SET_MAKE@%$SET_MAKE%g +s%@X_CFLAGS@%$X_CFLAGS%g +s%@X_PRE_LIBS@%$X_PRE_LIBS%g +s%@X_LIBS@%$X_LIBS%g +s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g +s%@emacs_exe@%$emacs_exe%g +s%@xemacs_exe@%$xemacs_exe%g +s%@fortune@%$fortune%g +s%@INCLUDES@%$INCLUDES%g +s%@SAVER_LIBS@%$SAVER_LIBS%g +s%@HACK_LIBS@%$HACK_LIBS%g +s%@XPM_LIBS@%$XPM_LIBS%g +s%@GL_LIBS@%$GL_LIBS%g +s%@PASSWD_LIBS@%$PASSWD_LIBS%g +s%@INSTALL_SETUID@%$INSTALL_SETUID%g +s%@NEED_SETUID@%$NEED_SETUID%g +s%@DIALOG_SRCS@%$DIALOG_SRCS%g +s%@DIALOG_OBJS@%$DIALOG_OBJS%g +s%@PASSWD_SRCS@%$PASSWD_SRCS%g +s%@PASSWD_OBJS@%$PASSWD_OBJS%g +s%@XMU_SRCS@%$XMU_SRCS%g +s%@XMU_OBJS@%$XMU_OBJS%g +s%@LOCK_SRCS@%$LOCK_SRCS%g +s%@LOCK_OBJS@%$LOCK_OBJS%g +s%@GL_EXES@%$GL_EXES%g +s%@GL_KLUDGE_1@%$GL_KLUDGE_1%g +s%@GL_KLUDGE_2@%$GL_KLUDGE_2%g +s%@HACKDIR@%$HACKDIR%g +s%@APPDEFAULTS@%$APPDEFAULTS%g +s%@DEPEND@%$DEPEND%g +s%@DEPEND_FLAGS@%$DEPEND_FLAGS%g +s%@DEPEND_DEFINES@%$DEPEND_DEFINES%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..51cefe54 --- /dev/null +++ b/configure.in @@ -0,0 +1,1179 @@ +# configure.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. +# + +AC_INIT(driver/subprocs.c) +AC_CONFIG_HEADER(config.h) +AC_CANONICAL_HOST + +AC_PROG_CC + +if test -z "$GCC"; then + AC_MSG_CHECKING(how to request ANSI compilation) + case "$host" in + *-hpux*) + AC_MSG_RESULT(HPUX: adding -Ae) + CC="$CC -Ae" + ;; + *-aix*) + AC_MSG_RESULT(AIX: adding -qlanglvl=ansi -qhalt=e) + CC="$CC -qlanglvl=ansi -qhalt=e" + ;; + *) + AC_MSG_RESULT(no idea) + ;; + esac +fi + + +AC_MSG_CHECKING([whether the compiler works on ANSI C]) +AC_TRY_RUN([ main(int ac, char **av) { return 0; } ], + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.), + AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.)) + +case "$host" in + *-irix*) + if test -n "$GCC"; then + AC_MSG_RESULT(Turning on gcc compiler warnings.) + CC="$CC -Wall -Wstrict-prototypes -Wnested-externs -Wno-format" + else + # not gcc + AC_MSG_RESULT(Turning on SGI compiler warnings.) + CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3" + fi + ;; +esac + + +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_MAKE_SET + +AC_C_CONST +AC_C_INLINE + +AC_HEADER_STDC +AC_HEADER_TIME +AC_HEADER_SYS_WAIT +AC_HEADER_DIRENT + +AC_TYPE_MODE_T +AC_TYPE_PID_T +AC_TYPE_SIGNAL +AC_TYPE_SIZE_T + + +AC_MSG_CHECKING(how to call gettimeofday) +AC_CACHE_VAL(ac_cv_gettimeofday_args, + [AC_TRY_COMPILE([#include + #include ], + [struct timeval tv; gettimeofday(&tv);], + [ac_gettimeofday_args=1], + [AC_TRY_COMPILE([#include + #include ], + [struct timeval tv; struct timezone tzp; + gettimeofday(&tv, &tzp);], + [ac_gettimeofday_args=2], + [ac_gettimeofday_args=0])]) + ac_cv_gettimeofday_args=$ac_gettimeofday_args]) +ac_gettimeofday_args=$ac_cv_gettimeofday_args +if test $ac_gettimeofday_args = 1 ; then + AC_DEFINE(HAVE_GETTIMEOFDAY) + AC_MSG_RESULT(one argument) +elif test $ac_gettimeofday_args = 2 ; then + AC_DEFINE(HAVE_GETTIMEOFDAY) + AC_DEFINE(GETTIMEOFDAY_TWO_ARGS) + AC_MSG_RESULT(two arguments) +else + AC_MSG_RESULT(unknown) +fi + + +AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv) +AC_CHECK_HEADERS(unistd.h) + +dnl /usr/local/src/ssh-1.2.17/putenv.c -- AC_REPLACE_FUNCS(putenv) + + +AC_ARG_ENABLE(subdir,[ +Installation options: + + --enable-subdir=DIR Put the demo programs in a subdirectory of \`bindir', + instead of putting them in bindir itself. You can + specify the name of the subdirectory. For example, + --exec-prefix=/usr/local/bin --enable-subdir=demos + would put xscreensaver in /usr/local/bin/, and would + put the demos in /usr/local/bin/demos/. Note that if + you do this, you must make sure that the directory + is on your \$PATH before xscreensaver is started: the + directory name is not hardcoded into the program. + This merely sets the default installation location. + + --disable-subdir Just put the demos in \`bindir' (this is the default.) +], + [enable_subdir="$enableval"],[enable_subdir=no]) +if test x"$enable_subdir" = xno; then + HACKDIR='$(bindir)' +elif test x"$enable_subdir" = xyes -o x"$enable_subdir" = x ; then + echo "error: must be a subdirectory name: --enable-subdir=$enable_subdir" + exit 1 +else + HACKDIR='$(bindir)/'$enable_subdir +fi + + +AC_PATH_XTRA + +# Try and find the app-defaults directory. +# It sucks that autoconf doesn't do this already... +# +AC_DEFUN(AC_PATH_X_APP_DEFAULTS_XMKMF, + [ + rm -fr conftestdir + if mkdir conftestdir; then + cd conftestdir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat > Imakefile <<'EOF' +acfindx: + @echo 'ac_x_app_defaults="${XAPPLOADDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which'd confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + fi + cd .. + rm -fr conftestdir + fi]) + +AC_DEFUN(AC_PATH_X_APP_DEFAULTS_DIRECT, +[ # Look for the directory under a standard set of common directories. + # Check X11 before X11Rn because it's often a symlink to the current release. + for ac_dir in \ + /usr/X11/lib/app-defaults \ + /usr/X11R6/lib/app-defaults \ + /usr/X11R6/lib/X11/app-defaults \ + /usr/X11R5/lib/app-defaults \ + /usr/X11R5/lib/X11/app-defaults \ + /usr/X11R4/lib/app-defaults \ + /usr/X11R4/lib/X11/app-defaults \ + \ + /usr/lib/X11/app-defaults \ + /usr/lib/X11R6/app-defaults \ + /usr/lib/X11R5/app-defaults \ + /usr/lib/X11R4/app-defaults \ + \ + /usr/local/X11/lib/app-defaults \ + /usr/local/X11R6/lib/app-defaults \ + /usr/local/X11R5/lib/app-defaults \ + /usr/local/X11R4/lib/app-defaults \ + \ + /usr/local/lib/X11/app-defaults \ + /usr/local/lib/X11R6/app-defaults \ + /usr/local/lib/X11R6/X11/app-defaults \ + /usr/local/lib/X11R5/app-defaults \ + /usr/local/lib/X11R5/X11/app-defaults \ + /usr/local/lib/X11R4/app-defaults \ + /usr/local/lib/X11R4/X11/app-defaults \ + \ + /usr/X386/lib/X11/app-defaults \ + /usr/x386/lib/X11/app-defaults \ + /usr/XFree86/lib/X11/app-defaults \ + \ + /usr/lib/X11/app-defaults \ + /usr/local/lib/X11/app-defaults \ + /usr/unsupported/lib/X11/app-defaults \ + /usr/athena/lib/X11/app-defaults \ + /usr/local/x11r5/lib/X11/app-defaults \ + /usr/lpp/Xamples/lib/X11/app-defaults \ + /lib/usr/lib/X11/app-defaults \ + \ + /usr/openwin/lib/app-defaults \ + /usr/openwin/lib/X11/app-defaults \ + /usr/openwin/share/lib/app-defaults \ + /usr/openwin/share/lib/X11/app-defaults \ + \ + /X11R6/lib/app-defaults \ + /X11R5/lib/app-defaults \ + /X11R4/lib/app-defaults \ + ; \ + do + if test -d "$ac_dir"; then + ac_x_app_defaults=$ac_dir + break + fi + done +]) + + +AC_DEFUN(AC_PATH_X_APP_DEFAULTS, + [AC_REQUIRE_CPP() + AC_CACHE_CHECK([for X app-defaults directory], ac_cv_x_app_defaults, + [AC_PATH_X_APP_DEFAULTS_XMKMF + AC_PATH_X_APP_DEFAULTS_DIRECT + if test x"$ac_x_app_defaults" = x; then + ac_cv_x_app_defaults="/usr/lib/X11/app-defaults" + else + # Record where we found app-defaults for the cache. + ac_cv_x_app_defaults="$ac_x_app_defaults" + fi]) + eval ac_x_app_defaults="$ac_cv_x_app_defaults"]) + +AC_PATH_X_APP_DEFAULTS + +APPDEFAULTS=$ac_x_app_defaults + + +# Like AC_CHECK_HEADER, but it uses the already-computed -I directories. +# +AC_DEFUN(AC_CHECK_X_HEADER, [ + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + AC_CHECK_HEADER([$1], [$2]) + CPPFLAGS="$ac_save_CPPFLAGS"]) + +# Like AC_EGREP_HEADER, but it uses the already-computed -I directories. +# +AC_DEFUN(AC_EGREP_X_HEADER, [ + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + AC_EGREP_HEADER([$1], [$2], [$3], [$4]) + CPPFLAGS="$ac_save_CPPFLAGS"]) + +# Like AC_TRY_COMPILE, but it uses the already-computed -I directories. +# +AC_DEFUN(AC_TRY_X_COMPILE, [ + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + AC_TRY_COMPILE([$1], [$2], [$3], [$4]) + CPPFLAGS="$ac_save_CPPFLAGS"]) + + +# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories. +# Use this sparingly; it probably doesn't work very well on X programs. +# +AC_DEFUN(AC_CHECK_X_LIB, [ + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS -L$x_libraries" + AC_CHECK_LIB([$1], [$2], [$3], [$4], [$5]) + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS"]) + + + + +# check for the HP XHPDisableReset server extension headers. +# +AC_EGREP_X_HEADER(XHPDisableReset, X11/XHPlib.h, + [AC_DEFINE(HAVE_XHPDISABLERESET) + SAVER_LIBS="-lXhp11 $SAVER_LIBS"]) + + +# Check for the availability of the XPointer typedef, and define it otherwise. +# +AC_CACHE_CHECK([for XPointer], ac_cv_xpointer, + [AC_TRY_X_COMPILE([#include ], + [XPointer foo = (XPointer) 0;], + [ac_cv_xpointer=yes], + [ac_cv_xpointer=no])]) +if test $ac_cv_xpointer != yes; then + AC_DEFINE(XPointer,[char*]) +fi + + +case "$host" in + *-hpux*) + # Thanks for not making xmkmf find this by default, you losers. + if test -d /usr/lib/Motif1.2 ; then + X_CFLAGS="-I/usr/include/Motif1.2 $X_CFLAGS" + X_LIBS="-L/usr/lib/Motif1.2 $X_LIBS" + elif test -d /usr/lib/Motif1.1 ; then + X_CFLAGS="-I/usr/include/Motif1.1 $X_CFLAGS" + X_LIBS="-L/usr/lib/Motif1.1 $X_LIBS" + fi + + # This too. You losers. + if test -d /usr/contrib/X11R6/include ; then + X_CFLAGS="-I/usr/contrib/X11R6/include $X_CFLAGS" + X_LIBS="-L/usr/contrib/X11R6/lib $X_LIBS" + elif test -d /usr/contrib/X11R5/include ; then + X_CFLAGS="-I/usr/contrib/X11R5/include $X_CFLAGS" + X_LIBS="-L/usr/contrib/X11R5/lib $X_LIBS" + fi + + ;; + *-solaris*) + # Same to you, pinheads. (Is this really the standard location now? + # What happened to the joke that this kind of thing went in /opt?) + if test -f /usr/dt/include/Xm/Xm.h ; then + X_CFLAGS="$X_CFLAGS -I/usr/dt/include" + X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib" + + # Some versions of Slowlaris Motif require -lgen. But not all. Why? + AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"]) + fi + ;; +esac + + + +# Check for Xmu (some fucked up vendors don't ship it...) +# +have_xmu=no +AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes]) +if test $have_xmu = no ; then + XMU_SRCS='$(UTILS_SRC)/xmu.c' + XMU_OBJS='$(UTILS_BIN)/xmu.o' +else + XMU_SRCS='' + XMU_OBJS='' + SAVER_LIBS="-lXmu $SAVER_LIBS" + HACK_LIBS="-lXmu $HACK_LIBS" + AC_DEFINE(HAVE_XMU) +fi + + +# See comp.windows.x FAQ question 124 about _get_wmShellWidgetClass on 4.1.x. +# The right fix is to get OpenWindows 3.0 patches 100512-02 and 100573-03. +# +if test $have_xmu = yes ; then + case "$host" in + *-sunos4*) + AC_CACHE_CHECK([for the SunOS 4.1.x _get_wmShellWidgetClass bug], + ac_cv_sunos_xmu_bug, + [ac_save_LDFLAGS="$LDFLAGS" + if test \! -z "$x_libraries" ; then + LDFLAGS="$LDFLAGS -L$x_libraries" + fi + # Note: this trick never works! (Generally.) + # We're only getting away with using AC_TRY_LINK + # with X libraries because we know it's SunOS. + LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm" + AC_TRY_LINK(,, + [ac_cv_sunos_xmu_bug=no], + [ac_cv_sunos_xmu_bug=yes]) + LDFLAGS="$ac_save_LDFLAGS"]) + if test $ac_cv_sunos_xmu_bug = yes ; then + AC_CACHE_CHECK([whether the compiler understands -static], + ac_cv_ld_static, + [ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -static" + AC_TRY_LINK(,,[ac_cv_ld_static=yes],[ac_cv_ld_static=no]) + LDFLAGS="$ac_save_LDFLAGS"]) + if test $ac_cv_ld_static = yes ; then + LDFLAGS="$LDFLAGS -static" + else + LDFLAGS="$LDFLAGS -Bstatic" + fi + fi + ;; + esac +fi + + +# Check for the SGI SCREEN_SAVER server extension header. +# +have_sgi=no +with_sgi_req=unspecified +AC_ARG_WITH(sgi-ext,[ +Server options: + + --with-sgi-ext Include support for the SGI SCREEN_SAVER + server extension, if possible (this is the default). + --without-sgi-ext Do not compile in support for this extension.], + [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes]) +if test $with_sgi = yes; then + AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h, + [have_sgi=yes + AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)]) + +elif test $with_sgi != no; then + echo "error: must be yes or no: --with-sgi-ext=$with_sgi" + exit 1 +fi + +# Check for the MIT-SCREEN-SAVER server extension header, +# unless the SGI extension has already been found. +# +have_mit=no +with_mit_req=unspecified +AC_ARG_WITH(mit-ext, +[ --with-mit-ext Include support for the MIT-SCREEN-SAVER + server extension, if possible (this is the default). + --without-mit-ext Do not compile in support for this extension.], + [with_mit="$withval"; with_mit_req="$withval"],[with_mit=yes]) +if test $have_sgi != yes; then + if test $with_mit = yes; then + AC_CHECK_X_HEADER(X11/extensions/scrnsaver.h, [have_mit=yes]) + + # Now check to see if it's really in the library; XF86Free-3.3 ships + # scrnsaver.h, but doesn't include the code in libXext.a, the idiots! + # + if test $have_mit = yes; then + AC_CHECK_X_LIB(Xext, XScreenSaverRegister, [], [have_mit=no], -lm) + + if test $have_mit = no; then + # Fuck! Looks like XF86Free-3.3 actually puts it in XExExt instead + # of in Xext. Thank you master, may I have another. + AC_CHECK_X_LIB(XExExt, XScreenSaverRegister, + [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"], + [], -lX11 -lXext -lm) + fi + + if test $have_mit = no; then + # Double fuck! Looks like some versions of XFree86 (whichever version + # it is that comes with RedHat Linux 2.0 -- I can't find a version + # number) put this garbage in Xss instead of Xext. Thank you master, + # may I have another. + AC_CHECK_X_LIB(Xss, XScreenSaverRegister, + [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"], + [], -lX11 -lXext -lm) + fi + + if test $have_mit = yes; then + AC_DEFINE(HAVE_MIT_SAVER_EXTENSION) + fi + + fi + + elif test $with_mit != no; then + echo "error: must be yes or no: --with-mit-ext=$with_mit" + exit 1 + fi +fi + + +# Check for the XIDLE server extension header, +# +have_xidle=no +with_xidle_req=unspecified +AC_ARG_WITH(xidle-ext, +[ --with-xidle-ext Include support for the XIDLE server extension, + if possible (this is the default). + --without-xidle-ext Do not compile in support for this extension.], + [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes]) +if test $with_xidle = yes; then + AC_CHECK_X_HEADER(X11/extensions/xidle.h, + [have_xidle=yes + AC_DEFINE(HAVE_XIDLE_EXTENSION)]) +elif test $with_xidle != no; then + echo "error: must be yes or no: --with-xidle-ext=$with_xidle" + exit 1 +fi + + +# Check for Motif and Athena --with and --without arguments. +# +have_motif=no +have_athena=no +with_motif_req=unspecified +with_athena_req=unspecified + +AC_ARG_WITH(motif,[ +Toolkit options: + + --with-motif Use the Motif toolkit for the user interface, + if possible (this is the default). + --without-motif Do not use Motif.], + [with_motif="$withval"; with_motif_req="$withval"],[with_motif=no]) + +AC_ARG_WITH(athena, +[ --with-athena Use the Athena toolkit for the user interface, if + possible (this is the default if Motif isn't used.) + --without-athena Do not use Athena.], + [with_athena="$withval"; with_athena_req="$withval"],[with_athena=no]) + +if test $with_motif != yes -a $with_motif != no ; then + echo "error: must be yes or no: --with-motif=$with_motif" + exit 1 +fi + +if test $with_athena != yes -a $with_athena != no ; then + echo "error: must be yes or no: --with-athena=$with_athena" + exit 1 +fi + + +# Saying --without-motif is the same as saying --with-athena. +if test $with_motif_req = no ; then + with_athena_req=yes + with_athena=yes +fi + +# Saying --without-athena is the same as saying --with-motif. +if test $with_athena_req = no ; then + with_motif_req=yes + with_motif=yes +fi + +# Check for Motif and Athena headers. + +check_motif() { + AC_CHECK_X_HEADER(Xm/Xm.h, + [have_motif=yes + AC_DEFINE(HAVE_MOTIF) + SAVER_LIBS="-lXm $SAVER_LIBS"]) +} + +check_athena() { + AC_CHECK_X_HEADER(X11/Xaw/Dialog.h, + [have_athena=yes + AC_DEFINE(HAVE_ATHENA) + SAVER_LIBS="-lXaw $SAVER_LIBS"]) +} + + +# If they asked for both motif and athena, check motif then athena. +# If they asked for only motif, check motif then athena. +# If they asked for only athena, check athena then motif. +# If they asked for neither, check motif then athena. + +if test $with_motif = yes; then + # asked for both, or for motif only + check_motif + if test $have_motif = yes; then + with_athena=no + with_athena_req=no + else + check_athena + fi + +elif test $with_athena = yes; then + # asked for athena only + check_athena + if test $have_athena = yes; then + with_motif=no + else + check_motif + fi + +else + # asked for neither + check_motif + if test $have_motif = yes; then + with_athena=no + else + check_athena + fi + +fi + + +# If we have Athena, check whether it's a version that includes +# XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.) +if test $have_athena = yes ; then + AC_CACHE_CHECK([for XawViewportSetCoordinates in Viewport.h], + ac_cv_have_XawViewportSetCoordinates, + [ac_cv_have_XawViewportSetCoordinates=no + AC_EGREP_X_HEADER(XawViewportSetCoordinates, + X11/Xaw/Viewport.h, + ac_cv_have_XawViewportSetCoordinates=yes)]) + if test $ac_cv_have_XawViewportSetCoordinates = yes ; then + AC_DEFINE(HAVE_XawViewportSetCoordinates) + fi +fi + + +# If we have Motif, check whether it's really LessTif. +# +if test $have_motif = yes ; then + AC_CACHE_CHECK([whether Motif is really LessTif], + ac_cv_have_lesstif, + [AC_TRY_X_COMPILE([#include ], + [long vers = LesstifVersion;], + [ac_cv_have_lesstif=yes], + [ac_cv_have_lesstif=no])]) + have_lesstif=$ac_cv_have_lesstif +fi + + +# check for XPM header. +# +have_xpm=no +with_xpm_req=unspecified +AC_ARG_WITH(xpm,[ +Demo options: + + --with-xpm Include support for XPM files in some demos, + if possible (this is the default). + --without-xpm Do not compile in support for XPM files.], + [with_xpm="$withval"; with_xpm_req="$withval"],[with_xpm=yes]) +if test $with_xpm = yes; then + AC_CHECK_X_HEADER(X11/xpm.h, + [have_xpm=yes + AC_DEFINE(HAVE_XPM) + XPM_LIBS="-lXpm"]) +elif test $with_xpm != no; then + echo "error: must be yes or no: --with-xpm=$with_xpm" + exit 1 +fi + + +# check for the GL header +# +have_gl=no +with_gl_req=unspecified +AC_ARG_WITH(gl, +[ --with-gl Build those demos which depend on OpenGL, + if possible (this is the default). + --without-gl Do not build the OpenGL demos.], + [with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes]) + +if test $with_gl = yes; then + AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no) + if test $have_gl = yes ; then + AC_CHECK_X_HEADER(GL/glx.h, have_gl=yes, have_gl=no) + fi + + # If we have the headers, try and figure out which vendor it's from. + # + if test $have_gl = yes ; then + + AC_DEFINE(HAVE_GL) + have_mesa_gl=no + AC_EGREP_X_HEADER(Mesa, GL/glx.h, [have_mesa_gl=yes]) + if test $have_mesa_gl = no ; then + GL_LIBS="-lGL -lGLU" + else + AC_DEFINE(HAVE_MESA_GL) + GL_LIBS="-lMesaGL -lMesaGLU" + fi + fi + +elif test $with_gl != no; then + echo "error: must be yes or no: --with-gl=$with_gl" + exit 1 +fi + + +# check for SGI XReadDisplay server extension header. +# +have_readdisplay=no +with_readdisplay_req=unspecified +AC_ARG_WITH(readdisplay, +[ --with-readdisplay Include support for the XReadDisplay server + extension if possible (this is the default). + --without-readdisplay Do not compile in support for this extension.], + [with_readdisplay="$withval"; with_readdisplay_req="$withval"], + [with_readdisplay=yes]) +if test $with_readdisplay = yes; then + AC_CHECK_X_HEADER(X11/extensions/readdisplay.h, + AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION)) +elif test $with_readdisplay != no; then + echo "error: must be yes or no: --with-readdisplay=$with_readdisplay" + exit 1 +fi + + + +# Try to find a program to generate random text. +# +# Zippy is funnier than the idiocy generally spat out by `fortune', +# so try to find that, by invoking Emacs and asking it where its +# libexec directory is ("yow" lives in there.) +# +# If that doesn't work, see if fortune, zippy, or yow are on $PATH, +# and if so, use them. +# +# If that doesn't work, look in /usr/games, and if it's there, use +# the full pathname. +# +with_zippy="" +AC_ARG_WITH(zippy, +[ --with-zippy=PROGRAM Some demos are able to run an external program and + display its text; this names the program to use by + default (though it can be overridden with X + resources.) If you don't specify this, the default + is to use \"yow\" from the Emacs distribution (if you + have it) or else to use \"fortune\".], + [with_zippy="$withval"]) + +if test "$with_zippy" = no || test "$with_zippy" = yes ; then + $with_zippy="" +fi + +if test -n "$with_zippy" ; then + ac_cv_zippy_program="$with_zippy" + +elif test -n "$ac_cv_zippy_program"; then + AC_MSG_RESULT([checking for zippy... (cached) $ac_cv_zippy_program]) + +else + + AC_CHECK_PROGS(emacs_exe, emacs) + AC_CHECK_PROGS(xemacs_exe, xemacs) + + ac_cv_zippy_program="" + eargs='-batch -q -nw --eval' + + if test -n "$emacs_exe" ; then + AC_MSG_CHECKING([for emacs yow]) + # + # get emacs to tell us where the libexec directory is. + # + dir=`$emacs_exe $eargs '(princ (concat exec-directory "\n"))' \ + 2>/dev/null | tail -1` + dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'` + # + # try running libexec/yow and see if it exits without error. + # + if test x"$dir" != x -a -x $dir/yow ; then + if $dir/yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/yow" + AC_MSG_RESULT($ac_cv_zippy_program) + else + AC_MSG_RESULT(no) + fi + fi + fi + + if test -z "$ac_cv_zippy_program" ; then + AC_MSG_CHECKING([for xemacs yow]) + if test -n "$xemacs_exe" ; then + # + # get xemacs to tell us where the libexec directory is. + # + dir=`$xemacs_exe $eargs '(princ (concat exec-directory "\n"))' \ + 2>/dev/null | tail -1` + dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'` + # + # try running libexec/yow and see if it exits without error. + # + if test x"$dir" != x -a -x $dir/yow ; then + if $dir/yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/yow" + AC_MSG_RESULT($ac_cv_zippy_program) + else + # + # in some xemacs installations, the pathname of the yow.lines file + # isn't hardcoded into the yow executable, and must be passed on + # the command line. See if it's in libexec/../etc/. + + # M4 sucks!! + changequote(X,Y) + dir_up=`echo "$dir" | sed 's@/[^/]*$@@'` + changequote([,]) + + yow="yow -f $dir_up/etc/yow.lines" + if $dir/$yow >&- 2>&- ; then + ac_cv_zippy_program="$dir/$yow" + AC_MSG_RESULT($ac_cv_zippy_program) + else + AC_MSG_RESULT(no) + fi + fi + fi + fi + fi + + # if that didn't work, try for some other programs... + if test -z "$ac_cv_zippy_program" ; then + fortune='' + AC_CHECK_PROGS(fortune, [fortune zippy yow]) + # if that didn't work, try for those programs in /usr/games... + if test -z "$fortune" ; then + AC_PATH_PROGS(fortune, [fortune zippy yow], fortune, + /usr/games:/usr/local/games) + fi + fi +fi + +if test -z "$ac_cv_zippy_program" ; then + ac_cv_zippy_program=fortune +fi + +AC_DEFINE_UNQUOTED(ZIPPY_PROGRAM, "$ac_cv_zippy_program") + + + + +# Allow locking to be disabled at compile-time. +# +have_locking=yes +have_kerberos=no +with_kerberos_req=unspecified +have_shadow=no +with_shadow_req=unspecified +need_setuid=no + +AC_ARG_ENABLE(locking,[ +Locking options: + + --enable-locking Compile in support for locking the display + (this is the default.) + --disable-locking Do not allow locking at all.], + [enable_locking="$enableval"],[enable_locking=yes]) +if test $enable_locking = yes; then + + # Check for Kerberos. + # + AC_ARG_WITH(kerberos, [ + --with-kerberos Include support for Kerberos authentication, + if possible (this is the default.) + --without-kerberos Do not compile in support for Kerberos.], + [with_kerberos="$withval"; with_kerberos_req="$withval"],[with_kerberos=yes]) + if test $with_kerberos = yes; then + AC_CACHE_CHECK([for Kerberos], ac_cv_kerberos, + [AC_TRY_X_COMPILE([#include ],, + [ac_cv_kerberos=yes], + [ac_cv_kerberos=no])]) + if test $ac_cv_kerberos = yes ; then + have_kerberos=yes + AC_DEFINE(HAVE_KERBEROS) + PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes -lnsl -lsocket" + fi + elif test $with_kerberos != no; then + echo "error: must be yes or no: --with-kerberos=$with_kerberos" + exit 1 + fi + + # Next, check for the nine billion variants of shadow passwords... + + passwd_cruft_done=no + AC_ARG_WITH(shadow, +[ --with-shadow Include support for shadow password authentication, + if possible (this is the default, if no Kerberos.) + --without-shadow Do not compile in support for shadow passwords. +], + [with_shadow="$withval"; with_shadow_req="$withval"],[with_shadow=yes]) + if test $with_shadow = no; then + passwd_cruft_done=yes + elif test $with_shadow != yes; then + echo "error: must be yes or no: --with-shadow=$with_shadow" + exit 1 + fi + + + # Sun's "adjunct" passwords. + # + if test $passwd_cruft_done = no ; then + AC_CACHE_CHECK([for Sun-style shadow passwords], ac_cv_sun_adjunct, + [AC_TRY_X_COMPILE([#include + #include + #include + #include + #include + #include ], + [struct passwd_adjunct *p = getpwanam("nobody"); + const char *pw = p->pwa_passwd;], + [ac_cv_sun_adjunct=yes], + [ac_cv_sun_adjunct=no])]) + if test $ac_cv_sun_adjunct = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + AC_DEFINE(HAVE_ADJUNCT_PASSWD) + fi + fi + + # DEC and SCO so-called "enhanced" security. + # + if test $passwd_cruft_done = no ; then + AC_CACHE_CHECK([for DEC-style shadow passwords], ac_cv_enhanced_passwd, + [AC_TRY_X_COMPILE([#include + #include + #include + #include + #include + #include ], + [struct pr_passwd *p; + const char *pw; + set_auth_parameters(0, 0); + check_auth_parameters(); + p = getprpwnam("nobody"); + pw = p->ufld.fd_encrypt;], + [ac_cv_enhanced_passwd=yes], + [ac_cv_enhanced_passwd=no])]) + if test $ac_cv_enhanced_passwd = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + AC_DEFINE(HAVE_ENHANCED_PASSWD) + + # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx) + # (I'm told it needs -lcurses too, but I don't understand why.) + AC_CHECK_LIB(prot, getprpwnam, + [PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"], + [# On DEC, getprpwnam() is in -lsecurity + AC_CHECK_LIB(security, getprpwnam, + [PASSWD_LIBS="$PASSWD_LIBS -lsecurity"])], + [-lx]) + fi + fi + + # HP's entry in the "Not Invented Here" Sweepstakes. + # + if test $passwd_cruft_done = no ; then + AC_CACHE_CHECK([for HP-style shadow passwords], ac_cv_hpux_passwd, + [AC_TRY_X_COMPILE([#include + #include + #include + #include + #include + #include ], + [struct s_passwd *p = getspwnam("nobody"); + const char *pw = p->pw_passwd;], + [ac_cv_hpux_passwd=yes], + [ac_cv_hpux_passwd=no])]) + if test $ac_cv_hpux_passwd = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + AC_DEFINE(HAVE_HPUX_PASSWD) + + # on HPUX, bigcrypt is in -lsec + AC_CHECK_LIB(sec, bigcrypt, [PASSWD_LIBS="$PASSWD_LIBS -lsec"]) + fi + fi + + # Traditional (ha!) shadow passwords. + # + if test $passwd_cruft_done = no ; then + AC_CACHE_CHECK([for generic shadow passwords], ac_cv_shadow, + [AC_TRY_X_COMPILE([#include + #include + #include + #include + #include ], + [struct spwd *p = getspnam("nobody"); + const char *pw = p->sp_pwdp;], + [ac_cv_shadow=yes], + [ac_cv_shadow=no])]) + if test $ac_cv_shadow = yes; then + have_shadow=yes + need_setuid=yes + passwd_cruft_done=yes + AC_DEFINE(HAVE_SHADOW_PASSWD) + + # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc. + have_getspnam=no + AC_CHECK_LIB(c, getspnam, [have_getspnam=yes]) + if test $have_getspnam = no ; then + AC_CHECK_LIB(gen, getspnam, + [have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"]) + fi + fi + fi + + # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc. + have_crypt=no + AC_CHECK_LIB(c, crypt, [have_crypt=yes]) + if test $have_crypt = no ; then + AC_CHECK_LIB(crypt, crypt, + [have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"]) + fi + + + # Most of the above shadow mechanisms will have set need_setuid to yes, + # if they were found. But, on some systems, we need setuid even when + # using plain old vanilla passwords. + # + if test $need_setuid = no ; then + case "$host" in + *-hpux* | *-aix* | *-netbsd* ) + need_setuid=yes + ;; + esac + fi + +elif test $enable_locking = no; then + AC_DEFINE(NO_LOCKING) +else + echo "error: must be yes or no: --enable-locking=$enable_locking" + exit 1 +fi + + + +if test \! -z "$includedir" ; then + INCLUDES="-I$includedir" +fi + +if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" +fi + + +##### should have options to override the DEPEND crap, I guess... +DEPEND=makedepend +DEPEND_FLAGS= +DEPEND_DEFINES= + + + +# Done testing things -- now substitute in some stuff for the Makefiles. +# +if test $have_motif = yes; then + AC_DEFINE(HAVE_MOTIF) + DIALOG_SRCS='$(MOTIF_SRCS)' + DIALOG_OBJS='$(MOTIF_OBJS)' +elif test $have_athena = yes; then + AC_DEFINE(HAVE_ATHENA) + DIALOG_SRCS='$(ATHENA_SRCS)' + DIALOG_OBJS='$(ATHENA_OBJS)' +else + DIALOG_SRCS='' + DIALOG_OBJS='' +fi + +if test $have_kerberos = yes; then + PASSWD_SRCS='$(KERBEROS_SRCS)' + PASSWD_OBJS='$(KERBEROS_OBJS)' +else + PASSWD_SRCS='$(PWENT_SRCS)' + PASSWD_OBJS='$(PWENT_OBJS)' +fi + +if test $enable_locking = yes; then + LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)' + LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)' +else + LOCK_SRCS='' + LOCK_OBJS='' +fi + +if test $need_setuid = yes; then + NEED_SETUID=yes + INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)' +else + NEED_SETUID=no + INSTALL_SETUID='$(INSTALL_PROGRAM)' +fi + +tab=' ' +if test $have_gl = yes; then + GL_EXES='$(GL_EXES)' + GL_KLUDGE_1=${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}' \' + GL_KLUDGE_2=${tab} +else + GL_KLUDGE_1=${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}${tab}'\n' + GL_KLUDGE_2='!'${tab} +fi + +AC_SUBST(INCLUDES) + +AC_SUBST(SAVER_LIBS) +AC_SUBST(HACK_LIBS) +AC_SUBST(XPM_LIBS) +AC_SUBST(GL_LIBS) +AC_SUBST(PASSWD_LIBS) +AC_SUBST(INSTALL_SETUID) +AC_SUBST(NEED_SETUID) + +AC_SUBST(DIALOG_SRCS) +AC_SUBST(DIALOG_OBJS) +AC_SUBST(PASSWD_SRCS) +AC_SUBST(PASSWD_OBJS) +AC_SUBST(XMU_SRCS) +AC_SUBST(XMU_OBJS) +AC_SUBST(LOCK_SRCS) +AC_SUBST(LOCK_OBJS) +AC_SUBST(GL_EXES) +AC_SUBST(GL_KLUDGE_1) +AC_SUBST(GL_KLUDGE_2) +AC_SUBST(HACKDIR) +AC_SUBST(APPDEFAULTS) + +AC_SUBST(DEPEND) +AC_SUBST(DEPEND_FLAGS) +AC_SUBST(DEPEND_DEFINES) + +# Print some warnings before emitting the Makefiles. +# +warning=no +warnsep=' #################################################################' +warn() { + if test $warning = no ; then + echo '' ; echo "$warnsep" ; echo '' + warning=yes + fi + echo " Warning:" $* +} + +warn2() { + echo " " $* +} + +if test $with_sgi_req = yes -a $have_sgi = no ; then + warn 'The SGI saver extension was requested, but was not found.' +fi + +if test $with_mit_req = yes -a $have_mit = no ; then + warn 'The MIT saver extension was requested, but was not found.' +fi + +if test $with_xidle_req = yes -a $have_xidle = no ; then + warn 'The XIdle extension was requested, but was not found.' +fi + +if test $have_motif = no -a $have_athena = no ; then + warn "Neither Motif nor Athena widgets seem to be available;" + warn2 "one or the other is required." + +elif test $with_motif_req = yes -a $have_motif = no ; then + warn "Use of Motif was requested, but it wasn't found;" + warn2 "Athena will be used instead." + +elif test $with_athena_req = yes -a $have_athena = no ; then + warn "Use of Athena was requested, but it wasn't found;" + warn2 "Motif will be used instead." +fi + +if test $have_motif = yes -a $have_lesstif = yes ; then + warn "Motif is being used, but it appears to actually be LessTif." + warn2 "XScreenSaver has been reported to have problems with some" + warn2 "versions of LessTif (notably 0.79). You might want to use" + warn2 "Athena instead." +fi + +if test $with_xpm_req = yes -a $have_xpm = no ; then + warn 'Use of XPM was requested, but it was not found.' +fi + +if test $with_gl_req = yes -a $have_gl = no ; then + warn 'Use of GL was requested, but it was not found.' +fi + +if test $with_readdisplay_req = yes -a $have_readdisplay = no ; then + warn 'Use of XReadDisplay was requested, but it was not found.' +fi + +if test $with_kerberos_req = yes -a $have_kerberos = no ; then + warn 'Use of Kerberos was requested, but it was not found.' +fi + +if test $with_shadow_req = yes -a $have_shadow = no ; then + warn 'Use of shadow passwords was requested, but they were not found.' +fi + +if test $warning = yes; then + echo '' ; echo "$warnsep" ; echo '' +fi + + +AC_OUTPUT(Makefile + utils/Makefile + driver/Makefile + hacks/Makefile + hacks/glx/Makefile + driver/XScreenSaver.ad) diff --git a/driver/.gdbinit b/driver/.gdbinit new file mode 100644 index 00000000..cb7d98ab --- /dev/null +++ b/driver/.gdbinit @@ -0,0 +1,25 @@ +# If you're debugging xscreensaver and you are running a virtual root window +# manager, you'd better let the process handle these signals: it remaps the +# virtual root window when they arrive. If you don't do this, your window +# manager will be hosed. +# +# Also, gdb copes badly with breakpoints in functions that are called on the +# other side of a fork(). The Trace/BPT traps cause the spawned process to +# die. +# +#handle 1 pass nostop +#handle 3 pass nostop +#handle 4 pass nostop +#handle 6 pass nostop +#handle 7 pass nostop +#handle 8 pass nostop +#handle 9 pass nostop +#handle 10 pass nostop +#handle 11 pass nostop +#handle 12 pass nostop +#handle 13 pass nostop +#handle 15 pass nostop +#handle 19 pass nostop +b exit +set args -debug +#b purify_stop_here diff --git a/driver/Makefile.in b/driver/Makefile.in new file mode 100644 index 00000000..2bf4b091 --- /dev/null +++ b/driver/Makefile.in @@ -0,0 +1,281 @@ +# driver/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. +# the `../configure' script generates `driver/Makefile' from this file. + +@SET_MAKE@ +.SUFFIXES: +.SUFFIXES: .c .o + +srcdir = @srcdir@ +VPATH = @srcdir@ + +install_prefix = +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +mandir = @mandir@ +man1dir = $(mandir)/man1 +mansuffix = 1 + +CC = @CC@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +DEFS = @DEFS@ +LIBS = @LIBS@ + +DEPEND = @DEPEND@ +DEPEND_FLAGS = @DEPEND_FLAGS@ +DEPEND_DEFINES = @DEPEND_DEFINES@ + +SHELL = /bin/sh +INSTALL = @INSTALL@ +SUID_FLAGS = -o root -m 4755 +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SETUID = @INSTALL_SETUID@ +INSTALL_DATA = @INSTALL_DATA@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ + +XLIBS = $(X_LIBS) $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) + +AD_DIR = @APPDEFAULTS@ + +UTILS_SRC = $(srcdir)/../utils +UTILS_BIN = ../utils + +INCLUDES = -I. -I$(srcdir) -I$(srcdir)/.. -I$(UTILS_SRC) @INCLUDES@ + +PASSWD_LIBS = @PASSWD_LIBS@ +MOTIF_SRCS = dialogs-Xm.c +MOTIF_OBJS = dialogs-Xm.o + +ATHENA_SRCS = dialogs-Xaw.c +ATHENA_OBJS = dialogs-Xaw.o + +PWENT_SRCS = passwd.c +PWENT_OBJS = passwd.o + +KERBEROS_SRCS = kpasswd.c +KERBEROS_OBJS = kpasswd.o + +LOCK_SRCS_1 = lock.c +LOCK_OBJS_1 = lock.o + +DIALOG_SRCS = @DIALOG_SRCS@ +DIALOG_OBJS = @DIALOG_OBJS@ +PASSWD_SRCS = @PASSWD_SRCS@ +PASSWD_OBJS = @PASSWD_OBJS@ +LOCK_SRCS = @LOCK_SRCS@ +LOCK_OBJS = @LOCK_OBJS@ + +UTIL_SRCS = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \ + $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \ + $(UTILS_SRC)/visual.c $(UTILS_SRC)/xroger.c \ + $(UTILS_SRC)/yarandom.c @XMU_SRCS@ +UTIL_OBJS = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \ + $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \ + $(UTILS_BIN)/visual.o $(UTILS_BIN)/xroger.o \ + $(UTILS_BIN)/yarandom.o @XMU_OBJS@ + +SAVER_SRCS_1 = demo.c stderr.c subprocs.c timers.c windows.c \ + xscreensaver.c xset.c +SAVER_OBJS_1 = demo.o stderr.o subprocs.o timers.o windows.o \ + xscreensaver.o xset.o + +SAVER_SRCS = $(SAVER_SRCS_1) $(DIALOG_SRCS) $(LOCK_SRCS) $(UTIL_SRCS) +SAVER_OBJS = $(SAVER_OBJS_1) $(DIALOG_OBJS) $(LOCK_OBJS) $(UTIL_OBJS) +SAVER_LIBS = @SAVER_LIBS@ -lXt $(XLIBS) $(PASSWD_LIBS) $(LIBS) + +CMD_SRCS = xscreensaver-command.c +CMD_OBJS = xscreensaver-command.o +CMD_LIBS = $(XLIBS) $(LIBS) + +EXES = xscreensaver xscreensaver-command + +HDRS = XScreenSaver_ad.h xscreensaver.h +MEN = xscreensaver.man xscreensaver-command.man +EXTRAS = README Makefile.in XScreenSaver.ad.in dialogs.xd .gdbinit +VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \ + vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \ + vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt + +TARFILES = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \ + $(MOTIF_SRCS) $(ATHENA_SRCS) $(PWENT_SRCS) $(KERBEROS_SRCS) \ + $(LOCK_SRCS_1) $(CMD_SRCS) $(HDRS) $(MEN) + + +all: $(EXES) + +install: install-program install-ad install-man +uninstall: uninstall-program uninstall-ad uninstall-man + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ + INSTALL_SETUID='$(INSTALL_SETUID) -s' \ + install + +install-program: + @inst="$(INSTALL_PROGRAM)" ; \ + if [ @NEED_SETUID@ = yes ]; then \ + me="`whoami`" ; \ + if [ "$$me" = root ]; then \ + inst="$(INSTALL_SETUID)" ; \ + else \ + e=echo ; \ + $$e "" ;\ + $$e " Warning: xscreensaver has been compiled with support for shadow" ;\ + $$e " passwords. If your system actually uses shadow passwords," ;\ + $$e " then xscreensaver must be installed as a setuid root" ;\ + $$e " program in order for locking to work. To do this, you" ;\ + $$e " must run 'make install' as 'root', not as '$$me'." ;\ + $$e "" ;\ + $$e " For now, xscreensaver will be installed non-setuid, which" ;\ + $$e " means that locking may not work." ;\ + $$e "" ;\ + fi ; \ + fi ; \ + echo $$inst xscreensaver $(bindir)/xscreensaver ; \ + $$inst xscreensaver $(bindir)/xscreensaver + $(INSTALL_PROGRAM) xscreensaver-command $(bindir)/xscreensaver-command + +install-ad: + $(INSTALL_DATA) XScreenSaver.ad $(AD_DIR)/XScreenSaver + +install-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + done + +uninstall-program: + @for program in $(EXES); do \ + echo rm -f $(bindir)/$$program ; \ + rm -f $(bindir)/$$program ; \ + done + +uninstall-ad: + rm -f $(AD_DIR)/XScreenSaver + +uninstall-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo rm -f $(man1dir)/$$instname ; \ + rm -f $(man1dir)/$$instname ; \ + done + +clean: + -rm -f *.o a.out core $(EXES) XScreenSaver_ad.h + +distclean: clean + -rm -f Makefile XScreenSaver.ad *~ "#"* + +# Adds all current dependencies to Makefile +depend: XScreenSaver_ad.h + $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \ + $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SAVER_SRCS_1) $(CMD_SRCS) + +# Adds some dependencies to Makefile.in -- not totally accurate, but pretty +# close. This excludes dependencies on files in /usr/include, etc. It tries +# to include only dependencies on files which are themselves a part of this +# package. +distdepend: XScreenSaver_ad.h + @echo updating dependencies in `pwd`/Makefile.in... ; \ + $(DEPEND) -w 0 -f - \ + -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SAVER_SRCS_1) $(CMD_SRCS) | \ + ( \ + awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \ + sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \ + -e 's@\.\./utils@$$(UTILS_SRC)@g' \ + -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' \ + -e 's@$$.*\(XScreenSaver_ad\)@\1@g' ; \ + echo '' \ + ) > /tmp/distdepend.$$$$ && \ + mv Makefile.in Makefile.in.bak && \ + mv /tmp/distdepend.$$$$ Makefile.in + +TAGS: tags +tags: + find $(srcdir) -name '*.[chly]' -print | xargs etags -a + +echo_tarfiles: + @$(MAKE) XScreenSaver_ad.h 2>&1 >&- /dev/null + @echo $(TARFILES) + + +# Rules for noticing when the objects from the utils directory are out of +# date with respect to their sources, and going and building them according +# to the rules in their own Makefile... +# +$(UTILS_BIN)/fade.o: $(UTILS_SRC)/fade.c +$(UTILS_BIN)/overlay.o: $(UTILS_SRC)/overlay.c +$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c +$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c +$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c +$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c +$(UTILS_BIN)/xroger.o: $(UTILS_SRC)/xroger.c +$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c + +$(UTIL_OBJS): + cd $(UTILS_BIN) ; \ + $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +# How we build object files in this directory. +.c.o: + $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $< + + +# How we build the default app-defaults file into the program. +# +XScreenSaver_ad.h: XScreenSaver.ad + $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver.ad > $@ + +# The executables linked in this directory. +# +xscreensaver: $(SAVER_OBJS) + $(CC) $(LDFLAGS) -o $@ $(SAVER_OBJS) $(SAVER_LIBS) + +xscreensaver-command: $(CMD_OBJS) + $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS) + + +############################################################################## +# +# DO NOT DELETE: updated by make distdepend + +demo.o: $(srcdir)/../config.h +demo.o: $(srcdir)/xscreensaver.h +demo.o: $(UTILS_SRC)/resources.h +stderr.o: $(srcdir)/../config.h +stderr.o: $(srcdir)/xscreensaver.h +stderr.o: $(UTILS_SRC)/resources.h +stderr.o: $(UTILS_SRC)/visual.h +subprocs.o: $(srcdir)/../config.h +subprocs.o: $(srcdir)/xscreensaver.h +subprocs.o: $(UTILS_SRC)/yarandom.h +timers.o: $(srcdir)/../config.h +timers.o: $(srcdir)/xscreensaver.h +windows.o: $(srcdir)/../config.h +windows.o: $(srcdir)/xscreensaver.h +windows.o: $(UTILS_SRC)/visual.h +windows.o: $(UTILS_SRC)/fade.h +xscreensaver.o: $(srcdir)/../config.h +xscreensaver.o: $(srcdir)/xscreensaver.h +xscreensaver.o: $(UTILS_SRC)/version.h +xscreensaver.o: $(UTILS_SRC)/yarandom.h +xscreensaver.o: $(UTILS_SRC)/resources.h +xscreensaver.o: $(UTILS_SRC)/visual.h +xscreensaver.o: XScreenSaver_ad.h +xset.o: $(srcdir)/../config.h +xset.o: $(srcdir)/xscreensaver.h +xscreensaver-command.o: $(srcdir)/../config.h +xscreensaver-command.o: $(UTILS_SRC)/version.h + diff --git a/driver/README b/driver/README new file mode 100644 index 00000000..df64793b --- /dev/null +++ b/driver/README @@ -0,0 +1,6 @@ + +This directory contains the source for xscreensaver and xscreensaver-command, +the screensaver driver, and the program for externally controlling it. Some +stuff from the ../utils/ directory is used here as well. + +If you have compilation problems, check the parameters in ../config.h. diff --git a/lib/X11/app-defaults/XScreenSaver b/driver/XScreenSaver.ad.in similarity index 97% rename from lib/X11/app-defaults/XScreenSaver rename to driver/XScreenSaver.ad.in index dd4fc63e..83081960 100644 --- a/lib/X11/app-defaults/XScreenSaver +++ b/driver/XScreenSaver.ad.in @@ -103,6 +103,7 @@ starfish -root \n\ starfish -root -blob \n\ munch -root \n\ + fadeplot -root \n\ \ mono: rocks -root \n\ color: rocks -root -fg darksalmon \n\ @@ -118,12 +119,14 @@ PseudoColor: qix -root -count 4 -solid -transparent \n\ PseudoColor: qix -root -count 5 -solid -transparent -linear \ -segments 250 -size 100 \n\ - \ - gears -root \n\ - superquadrics -root \n\ - escher -root \n\ - pipes -root \n\ - sproingies -root \n +@GL_KLUDGE_1@ +@GL_KLUDGE_2@ gears -root \n\ +@GL_KLUDGE_2@ superquadrics -root \n\ +@GL_KLUDGE_2@ morph3d -root \n\ +@GL_KLUDGE_2@ escher -root \n\ +@GL_KLUDGE_2@ pipes -root \n\ +@GL_KLUDGE_2@ sproingies -root \n\ +@GL_KLUDGE_2@ rubik -root \n ! A few of the hacks require OpenGL, and will only be built if you have it. diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h new file mode 100644 index 00000000..1c31b5f3 --- /dev/null +++ b/driver/XScreenSaver_ad.h @@ -0,0 +1,213 @@ +"*timeout: 10", +"*cycle: 10", +"*lockTimeout: 0", +"*passwdTimeout: 30", +"*nice: 10", +"*lock: False", +"*verbose: False", +"*fade: True", +"*unfade: False", +"*fadeSeconds: 3", +"*fadeTicks: 20", +"*captureStderr: True", +"*captureStdout: True", +"*textForeground: Yellow", +"*textBackground: Black", +"*overlayStderr: True", +"*font: *-medium-r-*-140-*-m-*", +"*installColormap: True", +"*programs: qix -root \\n\ + qix -root -solid -delay 0 -segments 100 \\n\ + qix -root -linear -count 10 -size 100 -segments 200 \\n\ + attraction -root -mode balls \\n\ + attraction -root -mode lines -points 3 -segments 200 \\n\ + attraction -root -mode splines -segments 300 \\n\ + attraction -root -mode lines -radius 300 \ + -orbit -vmult 0.5 \\n\ + pyro -root \\n\ + helix -root \\n\ + pedal -root \\n\ + rorschach -root -offset 7 \\n\ + hopalong -root \\n\ + greynetic -root \\n\ + xroger -root \\n\ + imsmap -root \\n\ + slidescreen -root \\n\ + decayscreen -root \\n\ + hypercube -root \\n\ + halo -root \\n\ + maze -root \\n\ + noseguy -root \\n\ + flame -root \\n\ + lmorph -root \\n\ + deco -root \\n\ + moire -root \\n\ + kaleidescope -root \\n\ + lightning -root \\n\ + strange -root \\n\ + fract -root \\n\ + spiral -root \\n\ + laser -root \\n\ + grav -root \\n\ + grav -root -trail -decay \\n\ + drift -root \\n\ + ifs -root \\n\ + julia -root \\n\ + penrose -root \\n\ + sierpinski -root \\n\ + braid -root \\n\ + galaxy -root \\n\ + slip -root \\n\ + bouboule -root \\n\ + swirl -root \\n\ + flag -root \\n\ + sphere -root \\n\ + forest -root \\n\ + lisa -root \\n\ + goop -root \\n\ + starfish -root \\n\ + starfish -root -blob \\n\ + munch -root \\n\ + fadeplot -root \\n\ + \ + mono: rocks -root \\n\ + color: rocks -root -fg darksalmon \\n\ + \ + mono: qix -root -linear -count 5 -size 200 -spread 30 \ + -segments 75 -solid -xor \\n\ + \ + color: attraction -root -mode polygons \\n\ + color: attraction -root -mode filled-splines -segments 0 \\n\ + color: attraction -root -glow -points 10 \\n\ + color: bubbles -root \\n\ + \ + PseudoColor: qix -root -count 4 -solid -transparent \\n\ + PseudoColor: qix -root -count 5 -solid -transparent -linear \ + -segments 250 -size 100 \\n\ + \ + gears -root \\n\ + superquadrics -root \\n\ + morph3d -root \\n\ + escher -root \\n\ + pipes -root \\n\ + sproingies -root \\n\ + rubik -root \\n", +" ", +"*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1", +"*passwdDialog*fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1", +"*XmList.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*XmTextField.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*passwdDialog.passwdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*XmDialogShell*foreground: black", +"*XmDialogShell*background: gray90", +"*XmDialogShell*XmTextField.foreground: black", +"*XmDialogShell*XmTextField.background: white", +"*XmDialogShell*demoList.foreground: black", +"*XmDialogShell*demoList.background: white", +"*XmDialogShell*rogerLabel.foreground: red3", +"*XmDialogShell*rogerLabel.background: white", +"*XmDialogShell.title: XScreenSaver", +"*allowShellResize: True", +"*autoUnmanage: False", +"*demoDialog.maxWidth: 600", +"*label1.labelString: XScreenSaver %s", +"*label1.label: XScreenSaver %s", +"*label2.labelString: Copyright © 1991-1997 by Jamie Zawinski ", +"*label2.label: Copyright © 1991-1997 by Jamie Zawinski ", +"*demoList.visibleItemCount: 10", +"*demoList.automaticSelection: True", +"*next.labelString: Run Next", +"*prev.labelString: Run Previous", +"*edit.labelString: Edit Parameters", +"*done.labelString: Exit Demo Mode", +"*restart.labelString: Reinitialize", +"*resourcesLabel.labelString: XScreenSaver Parameters", +"*timeoutLabel.labelString: Saver Timeout", +"*cycleLabel.labelString: Cycle Timeout", +"*fadeSecondsLabel.labelString: Fade Duration", +"*fadeTicksLabel.labelString: Fade Ticks", +"*lockLabel.labelString: Lock Timeout", +"*passwdLabel.labelString: Password Timeout", +"*resourcesForm*XmTextField.columns: 8", +"*verboseToggle.labelString: Verbose", +"*cmapToggle.labelString: Install Colormap", +"*fadeToggle.labelString: Fade Colormap", +"*unfadeToggle.labelString: Unfade Colormap", +"*lockToggle.labelString: Require Password", +"*resourcesDone.labelString: Done", +"*resourcesCancel.labelString: Cancel", +"*passwdDialog.title: Password", +"*passwdLabel1.labelString: XScreenSaver %s", +"*passwdLabel2.labelString: This display is locked.", +"*passwdLabel3.labelString: Please type %s's password to unlock it.", +"*passwdDone.labelString: Done", +"*passwdCancel.labelString: Cancel", +"*passwdLabel1.alignment: ALIGNMENT_BEGINNING", +"*passwdLabel2.alignment: ALIGNMENT_BEGINNING", +"*passwdLabel3.alignment: ALIGNMENT_BEGINNING", +"*rogerLabel.width: 150", +"*demo_dialog*font: *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1", +"*resources_dialog*font: *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1", +"*passwd_dialog*font: *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1", +"*demo_dialog*label1.font: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1", +"*resources_dialog*label1.font: *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1", +"*demo_dialog*List.font: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*passwd_dialog*passwd_form.value*font: *nil*", +"*demo_dialog*foreground: black", +"*demo_dialog*background: gray90", +"*demo_dialog*List.background: white", +"*demo_dialog*Scrollbar.background: gray85", +"*demo_dialog*Command.background: gray85", +"*resources_dialog*foreground: black", +"*resources_dialog*background: gray90", +"*resources_dialog*Command.background: gray85", +"*resources_dialog*Toggle.background: gray85", +"*resources_dialog*Text*background: white", +"*resources_dialog*Dialog.value.translations: #override\\n\ + Return: beginning-of-line()\\n", +"*passwd_dialog*foreground: black", +"*passwd_dialog*background: gray90", +"*passwd_dialog*Text*background: white", +"*demo_dialog*viewport.width: 400", +"*demo_dialog*viewport.height: 200", +"*Form.borderWidth: 0", +"*Box.borderWidth: 0", +"*Label.borderWidth: 0", +"*resources_dialog*Dialog.borderWidth: 0", +"*demo_dialog*next.label: Run Next", +"*demo_dialog*prev.label: Run Previous", +"*demo_dialog*edit.label: Edit Parameters", +"*demo_dialog*done.label: Exit Demo Mode", +"*demo_dialog*restart.label: Reinitialize", +"*resources_dialog*timeout.label: Saver Timeout:", +"*resources_dialog*cycle.label: Cycle Timeout:", +"*resources_dialog*fade.label: Fade Duration:", +"*resources_dialog*ticks.label: Fade Ticks:", +"*resources_dialog*lockTime.label: Lock Timeout:", +"*resources_dialog*passwdTime.label: Password Timeout:", +"*resources_dialog*label1.label: XScreenSaver Parameters", +"*resources_dialog*buttonbox.verbose.label: Verbose", +"*resources_dialog*buttonbox.cmap.label: Install Colormap", +"*resources_dialog*buttonbox.fade.label: Fade Colormap", +"*resources_dialog*buttonbox.unfade.label: Unfade Colormap", +"*resources_dialog*buttonbox.lock.label: Require Password", +"*resources_dialog*done.label: Done", +"*resources_dialog*cancel.label: Cancel", +"*passwd_dialog*label1.label: XScreenSaver %s", +"*passwd_dialog*label2.label: This display is locked.", +"*passwd_dialog*label3.label: Please type %s's password to unlock it.", +"*passwd_dialog*ok.label: Done", +"*passwd_dialog*cancel.label: Cancel", +"*passwd_dialog*passwd_form*label.label: Enter password:", +"*passwd_dialog*Dialog.label: Enter password:", +"*passwd_dialog*passwd_form*Text.width: 200", +"*passwd_dialog*roger.width: 150", +"*passwd_dialog*roger.height: 150", +"*passwd_dialog*roger.foreground: red3", +"*passwd_dialog*roger.background: white", +"*passwd_dialog*roger.borderWidth: 1", +"*pointerPollTime: 5", +"*initialDelay: 30", +"*windowCreationTimeout: 30", +"*bourneShell: /bin/sh", diff --git a/driver/compile_axp.com b/driver/compile_axp.com new file mode 100644 index 00000000..d6ed0e8a --- /dev/null +++ b/driver/compile_axp.com @@ -0,0 +1,15 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C +$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C diff --git a/driver/compile_decc.com b/driver/compile_decc.com new file mode 100644 index 00000000..d6ed0e8a --- /dev/null +++ b/driver/compile_decc.com @@ -0,0 +1,15 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C +$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C diff --git a/driver/demo.c b/driver/demo.c new file mode 100644 index 00000000..a0ae2dab --- /dev/null +++ b/driver/demo.c @@ -0,0 +1,978 @@ +/* demo.c --- implements the interactive demo-mode and options dialogs. + * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#ifdef HAVE_MOTIF +# include +# include +# include +# include + +#else /* HAVE_ATHENA */ + /* Athena demo code contributed by Jon A. Christopher */ + /* Copyright 1997, with the same permissions as above. */ +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif /* HAVE_ATHENA */ + +#include "xscreensaver.h" +#include "resources.h" /* for parse_time() */ +#include +#include +#include + +static void demo_mode_hack (saver_info *si, char *); +static void demo_mode_done (saver_info *si); + +extern Widget demo_dialog; +extern Widget label1; +extern Widget text_line; +extern Widget demo_form; +extern Widget demo_list; +extern Widget next, prev, done, restart, edit; + +extern Widget resources_dialog; +extern Widget resources_form; +extern Widget res_done, res_cancel; +extern Widget timeout_text, cycle_text, fade_text, ticks_text; +extern Widget lock_time_text, passwd_time_text; +extern Widget verbose_toggle, cmap_toggle, fade_toggle, unfade_toggle, + lock_toggle; + + +#ifdef HAVE_MOTIF + +# define set_toggle_button_state(toggle,state) \ + XmToggleButtonSetState ((toggle), (state), True) +# define set_text_string(text_widget,string) \ + XmTextSetString ((text_widget), (string)) +# define add_button_callback(button,cb,arg) \ + XtAddCallback ((button), XmNactivateCallback, (cb), (arg)) +# define add_toggle_callback(button,cb,arg) \ + XtAddCallback ((button), XmNvalueChangedCallback, (cb), (arg)) +# define add_text_callback add_toggle_callback + +#else /* HAVE_ATHENA */ + +# define set_toggle_button_state(toggle,state) \ + XtVaSetValues((toggle), XtNstate, (state), 0) +# define set_text_string(text_widget,string) \ + XtVaSetValues ((text_widget), XtNvalue, (string), 0) +# define add_button_callback(button,cb,arg) \ + XtAddCallback ((button), XtNcallback, (cb), (arg)) +# define add_toggle_callback add_button_callback +# define add_text_callback(b,c,a) ERROR! + +#endif /* HAVE_ATHENA */ + + +#define disable_widget(widget) \ + XtVaSetValues((widget), XtNsensitive, False, 0) + + +static char * +get_text_string (Widget text_widget) +{ +#ifdef HAVE_MOTIF + return XmTextGetString (text_widget); +#else /* HAVE_ATHENA */ + char *string = 0; + XtVaGetValues (text_widget, XtNvalue, &string, 0); + return string; +#endif /* HAVE_ATHENA */ +} + +static char * +get_label_string (Widget label_widget) +{ +#ifdef HAVE_MOTIF + char *label = 0; + XmString xm_label = 0; + XtVaGetValues (label_widget, XmNlabelString, &xm_label, 0); + if (!xm_label) + return 0; + XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label); + return label; +#else /* HAVE_ATHENA */ + char *label = 0; + XtVaGetValues (label_widget, XtNlabel, &label, 0); + return (label ? strdup(label) : 0); +#endif /* HAVE_ATHENA */ +} + + +static void +set_label_string (Widget label_widget, char *string) +{ +#ifdef HAVE_MOTIF + XmString xm_string = XmStringCreate (string, XmSTRING_DEFAULT_CHARSET); + XtVaSetValues (label_widget, XmNlabelString, xm_string, 0); + XmStringFree (xm_string); +#else /* HAVE_ATHENA */ + XtVaSetValues (label_widget, XtNlabel, string, 0); +#endif /* HAVE_ATHENA */ +} + + +void +format_into_label (Widget label, const char *arg) +{ + char *text = get_label_string (label); + char *buf = (char *) malloc ((text ? strlen(text) : 100) + strlen(arg) + 10); + + if (!text || !strcmp (text, XtName (label))) + strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY"); + else + sprintf (buf, text, arg); + + set_label_string (label, buf); + free (buf); + XtFree (text); +} + + +void +steal_focus_and_colormap (Widget dialog) +{ + Display *dpy = XtDisplay (dialog); + Window window = XtWindow (dialog); + Colormap cmap = 0; + XSetInputFocus (dpy, window, RevertToParent, CurrentTime); + + XtVaGetValues (dialog, XtNcolormap, &cmap, 0); + if (cmap) + XInstallColormap (dpy, cmap); +} + +static void +raise_screenhack_dialog (void) +{ + XMapRaised (XtDisplay (demo_dialog), XtWindow (demo_dialog)); + if (resources_dialog) + XMapRaised (XtDisplay (resources_dialog), XtWindow (resources_dialog)); + steal_focus_and_colormap (resources_dialog ? resources_dialog : demo_dialog); +} + +static void +destroy_screenhack_dialogs (saver_info *si) +{ + saver_screen_info *ssi = si->default_screen; + + if (demo_dialog) XtDestroyWidget (demo_dialog); + if (resources_dialog) XtDestroyWidget (resources_dialog); + demo_dialog = resources_dialog = 0; + + if (ssi->demo_cmap && + ssi->demo_cmap != ssi->cmap && + ssi->demo_cmap != DefaultColormapOfScreen (ssi->screen)) + { + XFreeColormap (si->dpy, ssi->demo_cmap); + ssi->demo_cmap = 0; + } + + /* Since we installed our colormap to display the dialogs properly, put + the old one back, so that the screensaver_window is now displayed + properly. */ + if (ssi->cmap) + XInstallColormap (si->dpy, ssi->cmap); +} + +#ifdef HAVE_MOTIF + +static void +text_cb (Widget text_widget, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + char *line; + line = get_text_string (text_widget); + demo_mode_hack (si, line); +} + +#endif /* HAVE_MOTIF */ + + +static void +select_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + +#ifdef HAVE_ATHENA + XawListReturnStruct *item = (XawListReturnStruct*)call_data; + demo_mode_hack (si, item->string); +#else /* HAVE_MOTIF */ + XmListCallbackStruct *lcb = (XmListCallbackStruct *) call_data; + char *string = 0; + if (lcb->item) + XmStringGetLtoR (lcb->item, XmSTRING_DEFAULT_CHARSET, &string); + set_text_string (text_line, (string ? string : "")); + if (lcb->reason == XmCR_DEFAULT_ACTION && string) + demo_mode_hack (si, string); + if (string) + XtFree (string); +#endif /* HAVE_MOTIF */ + steal_focus_and_colormap (demo_dialog); +} + + +#if 0 /* configure does this now */ +#ifdef HAVE_ATHENA +# if !defined(_Viewport_h) + /* The R4 Athena libs don't have this function. I don't know the right + way to tell, but I note that the R5 version of Viewport.h defines + _XawViewport_h, while the R4 version defines _Viewport_h. So we'll + try and key off of that... */ +# define HAVE_XawViewportSetCoordinates +# endif +#endif /* HAVE_ATHENA */ +#endif /* 0 */ + + +/* Why this behavior isn't automatic in *either* toolkit, I'll never know. + */ +static void +ensure_selected_item_visible (Widget list) +{ +#ifdef HAVE_MOTIF + int *pos_list = 0; + int pos_count = 0; + if (XmListGetSelectedPos (list, &pos_list, &pos_count) && pos_count > 0) + { + int top = -2; + int visible = 0; + XtVaGetValues (list, + XmNtopItemPosition, &top, + XmNvisibleItemCount, &visible, + 0); + if (pos_list[0] >= top + visible) + { + int pos = pos_list[0] - visible + 1; + if (pos < 0) pos = 0; + XmListSetPos (list, pos); + } + else if (pos_list[0] < top) + { + XmListSetPos (list, pos_list[0]); + } + } + if (pos_list) + XtFree ((char *) pos_list); + +#else /* HAVE_ATHENA */ +# ifdef HAVE_XawViewportSetCoordinates + + int margin = 16; /* should be line height or something. */ + int count = 0; + int pos; + Dimension list_h = 0, vp_h = 0; + Dimension top_margin = 4; /* I don't know where this value comes from */ + Position vp_x = 0, vp_y = 0, current_y; + double cratio; + Widget viewport = XtParent(demo_list); + Widget sb = (viewport ? XtNameToWidget(viewport, "*vertical") : 0); + float sb_top = 0, sb_size = 0; + XawListReturnStruct *current = XawListShowCurrent(demo_list); + if (!current || !sb) return; + + XtVaGetValues(demo_list, + XtNnumberStrings, &count, + XtNheight, &list_h, + 0); + if (count < 2 || list_h < 10) return; + + XtVaGetValues(viewport, XtNheight, &vp_h, XtNx, &vp_x, XtNy, &vp_y, 0); + if (vp_h < 10) return; + + XtVaGetValues(sb, XtNtopOfThumb, &sb_top, XtNshown, &sb_size, 0); + if (sb_size <= 0) return; + + pos = current->list_index; + cratio = ((double) pos) / ((double) count); + current_y = (cratio * list_h); + + if (cratio < sb_top || + cratio > sb_top + sb_size) + { + if (cratio < sb_top) + current_y -= (vp_h - margin - margin); + else + current_y -= margin; + + if ((long)current_y >= (long) list_h) + current_y = (Position) ((long)list_h - (long)vp_h); + + if ((long)current_y < (long)top_margin) + current_y = (Position)top_margin; + + XawViewportSetCoordinates (viewport, vp_x, current_y); + } +# endif /* HAVE_XawViewportSetCoordinates */ +#endif /* HAVE_ATHENA */ +} + + +static void +next_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + +#ifdef HAVE_ATHENA + int cnt; + XawListReturnStruct *current = XawListShowCurrent(demo_list); + if (current->list_index == XAW_LIST_NONE) + XawListHighlight(demo_list,1); + else + { + XtVaGetValues(demo_list, + XtNnumberStrings, &cnt, + NULL); + if (current->list_index + 1 < cnt) + { + current->list_index++; + XawListHighlight(demo_list, current->list_index); + } + } + + ensure_selected_item_visible (demo_list); + current = XawListShowCurrent(demo_list); + demo_mode_hack (si, current->string); + +#else /* HAVE_MOTIF */ + + int *pos_list; + int pos_count; + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + XmListSelectPos (demo_list, 1, True); + else + { + int pos = pos_list [0]; + XmListSelectPos (demo_list, pos + 1, True); + XtFree ((char *) pos_list); + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + abort (); + if (pos_list [0] == pos) + XmListSelectPos (demo_list, 1, True); + XtFree ((char *) pos_list); + } + ensure_selected_item_visible (demo_list); + demo_mode_hack (si, get_text_string (text_line)); + +#endif /* HAVE_MOTIF */ +} + + +static void +prev_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + +#ifdef HAVE_ATHENA + XawListReturnStruct *current=XawListShowCurrent(demo_list); + if (current->list_index == XAW_LIST_NONE) + XawListHighlight(demo_list,1); + else + { + if (current->list_index>=1) + { + current->list_index--; + XawListHighlight(demo_list, current->list_index); + } + } + + ensure_selected_item_visible (demo_list); + current = XawListShowCurrent(demo_list); + demo_mode_hack (si, current->string); + +#else /* HAVE_MOTIF */ + + int *pos_list; + int pos_count; + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + XmListSelectPos (demo_list, 0, True); + else + { + XmListSelectPos (demo_list, pos_list [0] - 1, True); + XtFree ((char *) pos_list); + } + ensure_selected_item_visible (demo_list); + demo_mode_hack (si, get_text_string (text_line)); + +#endif /* HAVE_MOTIF */ +} + + +static void pop_resources_dialog (saver_info *si); +static void make_resources_dialog (saver_info *si, Widget parent); + +static void +edit_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + saver_screen_info *ssi = si->default_screen; + Widget parent = ssi->toplevel_shell; + if (! resources_dialog) + make_resources_dialog (si, parent); + pop_resources_dialog (si); +} + +static void +done_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + demo_mode_done (si); +} + + +static void +restart_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + demo_mode_restart_process (si); +} + +void +pop_up_dialog_box (Widget dialog, Widget form, int where) +{ + /* I'm sure this is the wrong way to pop up a dialog box, but I can't + figure out how else to do it. + + It's important that the screensaver dialogs not get decorated or + otherwise reparented by the window manager, because they need to be + children of the *real* root window, not the WM's virtual root, in + order for us to guarentee that they are visible above the screensaver + window itself. + */ + Arg av [100]; + int ac = 0; + Dimension sw, sh, x, y, w, h; + +#ifdef HAVE_ATHENA + XtRealizeWidget (dialog); +#else /* HAVE_MOTIF */ + /* Motif likes us to realize the *child* of the shell... */ + XtRealizeWidget (form); +#endif /* HAVE_MOTIF */ + + sw = WidthOfScreen (XtScreen (dialog)); + sh = HeightOfScreen (XtScreen (dialog)); + ac = 0; + XtSetArg (av [ac], XtNwidth, &w); ac++; + XtSetArg (av [ac], XtNheight, &h); ac++; + XtGetValues (form, av, ac); + +#ifdef DEBUG + if (where >= 69) + { + where -= 69; + sw = (sw * 7) / 12; + } +#endif + + switch (where) + { + case 0: /* center it in the top-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 - h; + break; + case 1: /* center it in the bottom-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 + (sh/2) - h; + break; + case 2: /* center it on the screen */ + x = (sw + w) / 2 - w; + y = (sh + h) / 2 - h; + break; + default: + abort (); + } + if (x + w > sw) x = sw - w; + if (y + h > sh) y = sh - h; + ac = 0; + XtSetArg (av [ac], XtNx, x); ac++; + XtSetArg (av [ac], XtNy, y); ac++; + XtSetArg (av [ac], XtNoverrideRedirect, True); ac++; + +#ifdef HAVE_MOTIF + XtSetArg (av [ac], XmNdefaultPosition, False); ac++; +#endif /* HAVE_MOTIF */ + + XtSetValues (dialog, av, ac); + XtSetValues (form, av, ac); + +#ifdef HAVE_ATHENA + XtPopup (dialog, XtGrabNone); +#else /* HAVE_MOTIF */ + XtManageChild (form); +#endif /* HAVE_MOTIF */ + + steal_focus_and_colormap (dialog); +} + + +static void +make_screenhack_dialog (saver_info *si) +{ + saver_screen_info *ssi = si->default_screen; + Widget parent = ssi->toplevel_shell; + char **hacks = si->prefs.screenhacks; + + if (ssi->demo_cmap && + ssi->demo_cmap != ssi->cmap && + ssi->demo_cmap != DefaultColormapOfScreen (ssi->screen)) + { + XFreeColormap (si->dpy, ssi->demo_cmap); + ssi->demo_cmap = 0; + } + + if (ssi->default_visual == DefaultVisualOfScreen (ssi->screen)) + ssi->demo_cmap = DefaultColormapOfScreen (ssi->screen); + else + ssi->demo_cmap = XCreateColormap (si->dpy, + RootWindowOfScreen (ssi->screen), + ssi->default_visual, AllocNone); + + create_demo_dialog (parent, ssi->default_visual, ssi->demo_cmap); + format_into_label (label1, si->version); + + add_button_callback (next, next_cb, (XtPointer) si); + add_button_callback (prev, prev_cb, (XtPointer) si); + add_button_callback (done, done_cb, (XtPointer) si); + add_button_callback (restart, restart_cb, (XtPointer) si); + add_button_callback (edit, edit_cb, (XtPointer) si); + +#ifdef HAVE_MOTIF + XtAddCallback (demo_list, XmNbrowseSelectionCallback, + select_cb, (XtPointer) si); + XtAddCallback (demo_list, XmNdefaultActionCallback, + select_cb, (XtPointer) si); + XtAddCallback (text_line, XmNactivateCallback, text_cb, (XtPointer) si); + + for (; *hacks; hacks++) + { + XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET); + XmListAddItem (demo_list, xmstr, 0); + XmStringFree (xmstr); + } + +#else /* HAVE_ATHENA */ + + XtVaSetValues (demo_list, + XtNlist, hacks, + XtNnumberStrings, si->prefs.screenhacks_count, + 0); + XtAddCallback (demo_list, XtNcallback, select_cb, si); + +#endif /* HAVE_ATHENA */ + + pop_up_dialog_box(demo_dialog, demo_form, +#ifdef DEBUG + (si->prefs.debug_p ? 69 : 0) + +#endif + 0); +} + + +/* the Screensaver Parameters dialog */ + +static struct resources { + int timeout, cycle, secs, ticks, lock_time, passwd_time; + int verb, cmap, fade, unfade, lock_p; +} res; + + +static void +hack_time_cb (Display *dpy, char *line, int *store, Bool sec_p) +{ + if (*line) + { + int value; + value = parse_time (line, sec_p, True); + if (value < 0) + /*XBell (dpy, 0)*/; + else + *store = value; + } +} + +static void +res_sec_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + hack_time_cb (XtDisplay (button), get_text_string (button), + (int *) client_data, True); +} + +static void +res_min_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + hack_time_cb (XtDisplay (button), get_text_string (button), + (int *) client_data, False); +} + +static void +res_int_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + char *line = get_text_string (button); + int *store = (int *) client_data; + unsigned int value; + char c; + if (! *line) + ; + else if (sscanf (line, "%u%c", &value, &c) != 1) + XBell (XtDisplay (button), 0); + else + *store = value; +} + +static void +res_bool_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + int *store = (int *) client_data; +#ifdef HAVE_MOTIF + *store = ((XmToggleButtonCallbackStruct *) call_data)->set; +#else /* HAVE_ATHENA */ + Boolean state = FALSE; + XtVaGetValues (button, XtNstate, &state, NULL); + *store = state; +#endif /* HAVE_ATHENA */ +} + +static void +res_cancel_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + XtDestroyWidget (resources_dialog); + resources_dialog = 0; + raise_screenhack_dialog (); +} + + +static void +res_done_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + saver_info *si = (saver_info *) client_data; + saver_preferences *p = &si->prefs; + + res_cancel_cb (button, client_data, call_data); + +#ifdef HAVE_ATHENA + /* Check all text widgets, since we don't have callbacks for these. */ + res_min_cb (timeout_text, (XtPointer) &res.timeout, NULL); + res_min_cb (cycle_text, (XtPointer) &res.cycle, NULL); + res_sec_cb (fade_text, (XtPointer) &res.secs, NULL); + res_int_cb (ticks_text, (XtPointer) &res.ticks, NULL); + res_min_cb (lock_time_text, (XtPointer) &res.lock_time, NULL); + res_sec_cb (passwd_time_text, (XtPointer) &res.passwd_time, NULL); +#endif /* HAVE_ATHENA */ + + /* Throttle the timeouts to minimum sane values. */ + if (res.timeout < 5) res.timeout = 5; + if (res.cycle < 2) res.cycle = 2; + if (res.passwd_time < 10) res.passwd_time = 10; + + p->timeout = res.timeout * 1000; + p->cycle = res.cycle * 1000; + p->lock_timeout = res.lock_time * 1000; +#ifndef NO_LOCKING + p->passwd_timeout = res.passwd_time * 1000; +#endif + p->fade_seconds = res.secs; + p->fade_ticks = res.ticks; + p->verbose_p = res.verb; + p->install_cmap_p = res.cmap; + p->fade_p = res.fade; + p->unfade_p = res.unfade; + p->lock_p = res.lock_p; + +#ifdef DEBUG + if (p->debug_p && p->verbose_p) + fprintf (stderr, "%s: parameters changed:\n\ + timeout: %d\n\tcycle: %d\n\tlock: %d\n\tpasswd: %d\n\ + fade: %d\n\tfade: %d\n\tverbose: %d\n\tinstall: %d\n\ + fade: %d\n\tunfade: %d\n\tlock: %d\n", + progname, p->timeout, p->cycle, p->lock_timeout, +# ifdef NO_LOCKING + 0, +# else + p->passwd_timeout, +# endif + p->fade_seconds, p->fade_ticks, p->verbose_p, p->install_cmap_p, + p->fade_p, p->unfade_p, p->lock_p); +#endif /* DEBUG */ + +#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION) + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + { + /* Need to set the server timeout to the new one the user has picked. + */ + int server_timeout, server_interval, prefer_blank, allow_exp; + XGetScreenSaver (si->dpy, &server_timeout, &server_interval, + &prefer_blank, &allow_exp); + if (server_timeout != (p->timeout / 1000)) + { + server_timeout = (p->timeout / 1000); + if (p->verbose_p) + fprintf (stderr, + "%s: configuring server for saver timeout of %d seconds.\n", + progname, server_timeout); + /* Leave all other parameters the same. */ + XSetScreenSaver (si->dpy, server_timeout, server_interval, + prefer_blank, allow_exp); + } + } +#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */ +} + + +static void +make_resources_dialog (saver_info *si, Widget parent) +{ + saver_screen_info *ssi = si->default_screen; + + if (ssi->demo_cmap && + ssi->demo_cmap != ssi->cmap && + ssi->demo_cmap != DefaultColormapOfScreen (ssi->screen)) + { + XFreeColormap (si->dpy, ssi->demo_cmap); + ssi->demo_cmap = 0; + } + + if (ssi->default_visual == DefaultVisualOfScreen (ssi->screen)) + ssi->demo_cmap = DefaultColormapOfScreen (ssi->screen); + else + ssi->demo_cmap = XCreateColormap (si->dpy, + RootWindowOfScreen (ssi->screen), + ssi->default_visual, AllocNone); + + create_resources_dialog (parent, ssi->default_visual, ssi->demo_cmap); + + add_button_callback (res_done, res_done_cb, (XtPointer) si); + add_button_callback (res_cancel, res_cancel_cb, (XtPointer) si); + +#define CB(widget,type,slot) \ + add_text_callback ((widget), (type), (XtPointer) (slot)) +#define CBT(widget,type,slot) \ + add_toggle_callback ((widget), (type), (XtPointer) (slot)) + +#ifdef HAVE_MOTIF + /* When using Athena widgets, we can't set callbacks for these, + so we'll check them all if "done" gets pressed. + */ + CB (timeout_text, res_min_cb, &res.timeout); + CB (cycle_text, res_min_cb, &res.cycle); + CB (fade_text, res_sec_cb, &res.secs); + CB (ticks_text, res_int_cb, &res.ticks); + CB (lock_time_text, res_min_cb, &res.lock_time); + CB (passwd_time_text, res_sec_cb, &res.passwd_time); +#endif /* HAVE_MOTIF */ + + CBT (verbose_toggle, res_bool_cb, &res.verb); + CBT (cmap_toggle, res_bool_cb, &res.cmap); + CBT (fade_toggle, res_bool_cb, &res.fade); + CBT (unfade_toggle, res_bool_cb, &res.unfade); + CBT (lock_toggle, res_bool_cb, &res.lock_p); +#undef CB +#undef CBT + + if (si->locking_disabled_p) + { + disable_widget (passwd_time_text); + disable_widget (lock_time_text); + disable_widget (lock_toggle); + } + if (CellsOfScreen (XtScreen (parent)) <= 2) + { + disable_widget (fade_text); + disable_widget (ticks_text); + disable_widget (cmap_toggle); + disable_widget (fade_toggle); + disable_widget (unfade_toggle); + } +} + + +static void +fmt_time (char *buf, unsigned int s, int min_p) +{ + unsigned int h = 0, m = 0; + if (s >= 60) + { + m += (s / 60); + s %= 60; + } + if (m >= 60) + { + h += (m / 60); + m %= 60; + } +/* + if (min_p && h == 0 && s == 0) + sprintf (buf, "%u", m); + else if (!min_p && h == 0 && m == 0) + sprintf (buf, "%u", s); + else + if (h == 0) + sprintf (buf, "%u:%02u", m, s); + else +*/ + sprintf (buf, "%u:%02u:%02u", h, m, s); +} + +static void +pop_resources_dialog (saver_info *si) +{ + saver_preferences *p = &si->prefs; + char buf [100]; + + res.timeout = p->timeout / 1000; + res.cycle = p->cycle / 1000; + res.lock_time = p->lock_timeout / 1000; +#ifndef NO_LOCKING + res.passwd_time = p->passwd_timeout / 1000; +#endif + res.secs = p->fade_seconds; + res.ticks = p->fade_ticks; + res.verb = p->verbose_p; + res.cmap = p->install_cmap_p; + res.fade = p->fade_p; + res.unfade = p->unfade_p; + res.lock_p = (p->lock_p && !si->locking_disabled_p); + + fmt_time (buf, res.timeout, 1); set_text_string (timeout_text, buf); + fmt_time (buf, res.cycle, 1); set_text_string (cycle_text, buf); + fmt_time (buf, res.lock_time, 1); set_text_string (lock_time_text, buf); + fmt_time (buf, res.passwd_time, 0); set_text_string (passwd_time_text, buf); + fmt_time (buf, res.secs, 0); set_text_string (fade_text, buf); + sprintf (buf, "%u", res.ticks); set_text_string (ticks_text, buf); + + set_toggle_button_state (verbose_toggle, res.verb); + set_toggle_button_state (cmap_toggle, res.cmap); + set_toggle_button_state (fade_toggle, res.fade); + set_toggle_button_state (unfade_toggle, res.unfade); + set_toggle_button_state (lock_toggle, res.lock_p); + + pop_up_dialog_box (resources_dialog, resources_form, +#ifdef DEBUG + (si->prefs.debug_p ? 69 : 0) + +#endif + 1); +} + + +/* The main demo-mode command loop. + */ + +void +demo_mode (saver_info *si) +{ + saver_preferences *p = &si->prefs; + si->dbox_up_p = True; + initialize_screensaver_window (si); + raise_window (si, True, False, False); + make_screenhack_dialog (si); + while (si->demo_mode_p) + { + XEvent event; + XtAppNextEvent (si->app, &event); + switch (event.xany.type) + { + case 0: /* synthetic "timeout" event */ + break; + + case ClientMessage: + handle_clientmessage (si, &event, False); + break; + + case CreateNotify: + if (!p->use_xidle_extension && + !p->use_mit_saver_extension && + !p->use_sgi_saver_extension) + { + start_notice_events_timer (si, event.xcreatewindow.window); +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", + progname, + (unsigned int) event.xcreatewindow.window, + p->notice_events_timeout); +#endif /* DEBUG_TIMERS */ + } + break; + + case ButtonPress: + case ButtonRelease: + if (!XtWindowToWidget (si->dpy, event.xbutton.window)) + raise_screenhack_dialog (); + /* fall through */ + + default: +#ifdef HAVE_MIT_SAVER_EXTENSION + if (event.type == si->mit_saver_ext_event_number) + { + /* Get the "real" server window(s) out of the way as soon + as possible. */ + int i = 0; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->server_mit_saver_window && + window_exists_p (si->dpy, ssi->server_mit_saver_window)) + XUnmapWindow (si->dpy, ssi->server_mit_saver_window); + } + } + else +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + XtDispatchEvent (&event); + break; + } + } + destroy_screenhack_dialogs (si); + initialize_screensaver_window (si); + + si->demo_mode_p = True; /* kludge to inhibit unfade... */ + unblank_screen (si); + si->demo_mode_p = False; +} + +static void +demo_mode_hack (saver_info *si, char *hack) +{ + if (! si->demo_mode_p) abort (); + kill_screenhack (si); + if (! si->demo_hack) + blank_screen (si); + si->demo_hack = hack; + spawn_screenhack (si, False); + /* raise_screenhack_dialog(); */ +} + +static void +demo_mode_done (saver_info *si) +{ + kill_screenhack (si); + if (si->demo_hack) + unblank_screen (si); + si->demo_mode_p = False; + si->dbox_up_p = False; + si->demo_hack = 0; +} diff --git a/driver/dialogs-Xaw.c b/driver/dialogs-Xaw.c new file mode 100644 index 00000000..17938136 --- /dev/null +++ b/driver/dialogs-Xaw.c @@ -0,0 +1,311 @@ +/* dialogs-Xaw.c --- Athena widgets for demo, options, and password dialogs. + * xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * Most of this code contributed by Jon A. Christopher + * Copyright 1997, with the same permissions as above. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "visual.h" /* for visual_depth() */ + +Widget passwd_dialog; +Widget passwd_form; +Widget roger_label; +Widget passwd_label1; +Widget passwd_label3; +/*Widget passwd_text;*/ +/*Widget passwd_done;*/ +/*Widget passwd_cancel;*/ + +Widget resources_dialog; +Widget resources_form; +Widget timeout_text; +Widget cycle_text; +Widget fade_text; +Widget ticks_text; +Widget lock_time_text; +Widget passwd_time_text; +Widget verbose_toggle; +Widget cmap_toggle; +Widget fade_toggle; +Widget unfade_toggle; +Widget lock_toggle; +Widget res_done; +Widget res_cancel; + +Widget demo_dialog; +Widget demo_form; +Widget label1; +/*Widget label2;*/ +/*Widget text_area;*/ +Widget demo_list; +Widget text_line; +/*Widget vline;*/ +Widget next; +Widget prev; +Widget edit; +Widget done; +Widget restart; +/*Widget spacer;*/ + + +static Widget buttonbox, textbox, okbox; + + +void +create_passwd_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Widget box, passwd_label2; + int depth = visual_depth(XtScreen(parent), visual); + + passwd_dialog = + XtVaCreatePopupShell("passwd_dialog", transientShellWidgetClass, parent, + XtNtitle, NULL, + XtNoverrideRedirect, TRUE, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + box = XtVaCreateManagedWidget("box", formWidgetClass, passwd_dialog, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNtop, XtChainTop, + XtNbottom, XtChainBottom, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + roger_label = XtVaCreateManagedWidget("roger", labelWidgetClass, box, + XtNlabel, "", + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNtop, XtChainTop, + NULL); + + passwd_label1 = XtVaCreateManagedWidget("label1", labelWidgetClass, box, + XtNfromHoriz, roger_label, + XtNright, XtChainRight, + XtNtop, XtChainTop, + NULL); + passwd_label2 = XtVaCreateManagedWidget("label2", labelWidgetClass, box, + XtNfromHoriz, roger_label, + XtNright, XtChainRight, + XtNfromVert, passwd_label1, + NULL); + passwd_label3 = XtVaCreateManagedWidget("label3", labelWidgetClass, box, + XtNfromHoriz, roger_label, + XtNright, XtChainRight, + XtNfromVert, passwd_label2, + NULL); + + passwd_form = + XtVaCreateManagedWidget("passwd_form", dialogWidgetClass, box, + XtNfromHoriz, roger_label, + XtNright, XtChainRight, + XtNfromVert, passwd_label3, + NULL); +} + + +void +create_resources_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Widget rlabel; + int depth = visual_depth(XtScreen(parent), visual); + + resources_dialog = + XtVaCreatePopupShell("resources_dialog", transientShellWidgetClass, parent, + XtNtitle, NULL, + XtNoverrideRedirect, TRUE, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + resources_form = + XtVaCreateManagedWidget("resources_form", formWidgetClass, + resources_dialog, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + rlabel = XtVaCreateManagedWidget("label1", labelWidgetClass, resources_form, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNtop, XtChainTop, + NULL); + + textbox= + XtVaCreateManagedWidget("textbox", formWidgetClass, resources_form, + XtNleft, XtChainLeft, + XtNfromVert, rlabel, + NULL); + okbox= + XtVaCreateManagedWidget("textbox", boxWidgetClass, resources_form, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNfromVert, textbox, + XtNorientation, XtorientHorizontal, + NULL); + timeout_text= + XtVaCreateManagedWidget("timeout", dialogWidgetClass, textbox, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNtop, XtChainTop, + NULL); + cycle_text= + XtVaCreateManagedWidget("cycle", dialogWidgetClass, textbox, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNfromVert, timeout_text, + NULL); + fade_text= + XtVaCreateManagedWidget("fade", dialogWidgetClass, textbox, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNfromVert, cycle_text, + NULL); + + ticks_text = + XtVaCreateManagedWidget("ticks", dialogWidgetClass, textbox, + XtNtop, XtChainTop, + XtNright, XtChainRight, + XtNfromHoriz, timeout_text, + NULL); + + lock_time_text = + XtVaCreateManagedWidget("lockTime", dialogWidgetClass, textbox, + XtNfromVert, ticks_text, + XtNright, XtChainRight, + XtNfromHoriz, cycle_text, + NULL); + + passwd_time_text = + XtVaCreateManagedWidget("passwdTime", dialogWidgetClass, textbox, + XtNfromVert, lock_time_text, + XtNright, XtChainRight, + XtNfromHoriz, fade_text, + NULL); + + buttonbox= + XtVaCreateManagedWidget("buttonbox", boxWidgetClass, resources_form, + XtNfromVert, rlabel, + XtNfromHoriz, textbox, + XtNright, XtChainRight, + XtNorientation, XtorientVertical, + NULL); + verbose_toggle = + XtVaCreateManagedWidget("verbose", toggleWidgetClass, buttonbox, + NULL); + cmap_toggle = + XtVaCreateManagedWidget("cmap", toggleWidgetClass, buttonbox, + NULL); + fade_toggle = + XtVaCreateManagedWidget("fade", toggleWidgetClass, buttonbox, + NULL); + unfade_toggle = + XtVaCreateManagedWidget("unfade", toggleWidgetClass, buttonbox, + NULL); + lock_toggle = + XtVaCreateManagedWidget("lock", toggleWidgetClass, buttonbox, + NULL); + + + res_done = XtVaCreateManagedWidget("done", commandWidgetClass, okbox, + NULL); + res_cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, okbox, + NULL); +} + +void +create_demo_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Widget subform, box, viewport, label2; + int depth = visual_depth(XtScreen(parent), visual); + + demo_dialog = + XtVaCreatePopupShell("demo_dialog", transientShellWidgetClass, parent, + XtNtitle, NULL, + XtNoverrideRedirect, TRUE, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + demo_form = + XtVaCreateManagedWidget("demo_form", formWidgetClass, demo_dialog, + XtNvisual, visual, + XtNcolormap, colormap, + XtNdepth, depth, + NULL); + + label1 = XtVaCreateManagedWidget("label1", labelWidgetClass, demo_form, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNtop, XtChainTop, + NULL); + + label2 = XtVaCreateManagedWidget("label2", labelWidgetClass, demo_form, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNfromVert, label1, + NULL); + + subform= + XtVaCreateManagedWidget("subform", formWidgetClass, demo_form, + XtNleft, XtChainLeft, + XtNright, XtChainRight, + XtNfromVert, label2, + XtNbottom, XtChainBottom, + NULL); + viewport= + XtVaCreateManagedWidget("viewport", viewportWidgetClass, subform, + XtNallowVert, TRUE, + XtNallowHoriz, TRUE, + XtNforceBars, TRUE, + NULL); + + demo_list = XtVaCreateManagedWidget("demo_list", listWidgetClass, viewport, + XtNverticalList, TRUE, + XtNdefaultColumns, 1, + NULL); + box= + XtVaCreateManagedWidget("box", boxWidgetClass, demo_form, + XtNfromHoriz, subform, + XtNfromVert, label2, + XtNbottom, XtChainBottom, + XtNright, XtChainRight, + NULL); + prev = XtVaCreateManagedWidget("prev", commandWidgetClass, box, NULL); + next = XtVaCreateManagedWidget("next", commandWidgetClass, box, NULL); + edit = XtVaCreateManagedWidget("edit", commandWidgetClass, box, NULL); + restart = XtVaCreateManagedWidget("restart", commandWidgetClass, box, NULL); + done = XtVaCreateManagedWidget("done", commandWidgetClass, box, NULL); +} diff --git a/driver/dialogs-Xm.c b/driver/dialogs-Xm.c new file mode 100644 index 00000000..0daa7b35 --- /dev/null +++ b/driver/dialogs-Xm.c @@ -0,0 +1,701 @@ +/* dialogs-Xm.c --- Motif widgets for demo, options, and password dialogs. + * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* The code in this file started off its life as the output of XDesigner, + but I've since hacked it by hand... It's a mess, avert your eyes. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "visual.h" /* for visual_depth() */ + +Widget passwd_dialog; +Widget passwd_form; +Widget roger_label; +Widget passwd_label1; +Widget passwd_label3; +Widget passwd_text; +Widget passwd_done; +Widget passwd_cancel; + +Widget resources_dialog; +Widget resources_form; +Widget timeout_text; +Widget cycle_text; +Widget fade_text; +Widget ticks_text; +Widget lock_time_text; +Widget passwd_time_text; +Widget verbose_toggle; +Widget cmap_toggle; +Widget fade_toggle; +Widget unfade_toggle; +Widget lock_toggle; +Widget res_done; +Widget res_cancel; + +Widget demo_dialog; +Widget demo_form; +Widget label1; +Widget label2; +Widget text_area; +Widget demo_list; +Widget text_line; +Widget vline; +Widget next; +Widget prev; +Widget edit; +Widget done; +Widget restart; +Widget spacer; + + +void +create_passwd_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Widget shell; + Widget form1; + Widget roger; + Widget dialog; + Widget form2; + Widget label1, label2, label3; + Widget text; + Widget ok, cancel; + Widget w; + Arg al[64]; + int ac = 0; + + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, colormap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth(XtScreen(parent), visual)); ac++; + + shell = XmCreateDialogShell (parent, "passwdDialog", al, ac); + + form1 = XmCreateForm (shell, "form", 0, 0); + + roger = XmCreateDrawnButton (form1, "rogerLabel", 0, 0); + + dialog = XmCreateSelectionBox (form1, "passwdForm", al, ac); + + form2 = XmCreateForm ( dialog, "form", 0, 0); + label1 = XmCreateLabel ( form2, "passwdLabel1", 0, 0); + label2 = XmCreateLabel ( form2, "passwdLabel2", 0, 0); + label3 = XmCreateLabel ( form2, "passwdLabel3", 0, 0); + + text = XmSelectionBoxGetChild (dialog, XmDIALOG_TEXT); + ok = XmSelectionBoxGetChild (dialog, XmDIALOG_OK_BUTTON); + cancel = XmSelectionBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON); + + w = XmSelectionBoxGetChild (dialog, XmDIALOG_LIST_LABEL); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (dialog, XmDIALOG_LIST); + if (w) XtUnmanageChild (XtParent(w)); + w = XmSelectionBoxGetChild (dialog, XmDIALOG_SELECTION_LABEL); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (dialog, XmDIALOG_SEPARATOR); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (dialog, XmDIALOG_APPLY_BUTTON); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (dialog, XmDIALOG_HELP_BUTTON); + if (w) XtUnmanageChild (w); + + XtVaSetValues(label1, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_NONE, + 0); + XtVaSetValues(label2, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, label1, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_NONE, + 0); + XtVaSetValues(label3, + XmNtopAttachment, XmATTACH_WIDGET, + XmNtopWidget, label2, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + 0); + + XtVaSetValues(roger, + XmNsensitive, FALSE, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_NONE, + XmNbottomAttachment, XmATTACH_FORM, + 0); + XtVaSetValues(dialog, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_WIDGET, + XmNleftWidget, roger, + XmNrightAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + 0); + + XtManageChild(label1); + XtManageChild(label2); + XtManageChild(label3); + + XtManageChild(form2); + XtManageChild(text); + XtManageChild(ok); + XtManageChild(cancel); + + XtManageChild(roger); + XtManageChild(dialog); + + { + Dimension width = 0, height = 0; + XtRealizeWidget(form1); + XtVaGetValues(roger, XmNwidth, &width, XmNheight, &height, 0); + if (width == height) + ; + else if (width > height) + XtVaSetValues(roger, XmNwidth, width, XmNheight, width, 0); + else + XtVaSetValues(roger, XmNwidth, height, XmNheight, height, 0); + } + + passwd_dialog = shell; + passwd_form = form1; + roger_label = roger; + passwd_label1 = label1; + passwd_label3 = label3; + passwd_text = text; + passwd_done = ok; + passwd_cancel = cancel; +} + + + +void +create_resources_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Widget children[22]; /* Children to manage */ + Arg al[64]; /* Arg List */ + register int ac = 0; /* Arg Count */ + Widget widget12; + Widget widget13; + Widget widget14; + Widget widget15; + Widget widget16; + Widget widget17; + Widget widget18; + Widget widget48; + Widget widget29; + + Widget real_dialog; + Widget w; + + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, colormap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth(XtScreen(parent), visual)); ac++; + + real_dialog = XmCreatePromptDialog (parent, "resourcesForm", al, ac); + resources_dialog = XtParent(real_dialog); + + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SEPARATOR); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SELECTION_LABEL); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_HELP_BUTTON); + if (w) XtUnmanageChild (w); + + ac = 0; + XtSetArg (al [ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNrightAttachment, XmATTACH_FORM); ac++; + resources_form = XmCreateForm (real_dialog, "form", al, ac); + XtManageChild (resources_form); + + ac = 0; + + widget12 = XmCreateLabel ( resources_form, "resourcesLabel", al, ac ); + widget13 = XmCreateSeparator ( resources_form, "separator", al, ac ); + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget14 = XmCreateLabel ( resources_form, "timeoutLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget15 = XmCreateLabel ( resources_form, "cycleLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget16 = XmCreateLabel ( resources_form, "fadeSecondsLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget17 = XmCreateLabel ( resources_form, "fadeTicksLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget18 = XmCreateLabel ( resources_form, "lockLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget48 = XmCreateLabel ( resources_form, "passwdLabel", al, ac ); + ac = 0; + timeout_text = XmCreateTextField ( resources_form, "timeoutText", al, ac ); + cycle_text = XmCreateTextField ( resources_form, "cycleText", al, ac ); + fade_text = XmCreateTextField ( resources_form, "fadeSecondsText", al, ac ); + ticks_text = XmCreateTextField ( resources_form, "fadeTicksText", al, ac ); + lock_time_text = XmCreateTextField ( resources_form, "passwdText", al, ac ); + passwd_time_text = XmCreateTextField ( resources_form, "lockText", al, ac ); + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + verbose_toggle = XmCreateToggleButton ( resources_form, "verboseToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + cmap_toggle = XmCreateToggleButton ( resources_form, "cmapToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + fade_toggle = XmCreateToggleButton ( resources_form, "fadeToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + unfade_toggle = XmCreateToggleButton ( resources_form, "unfadeToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + lock_toggle = XmCreateToggleButton ( resources_form, "lockToggle", al, ac ); + ac = 0; + widget29 = XmCreateSeparator ( resources_form, "separator", al, ac ); + + res_done = XmSelectionBoxGetChild (real_dialog, XmDIALOG_OK_BUTTON); + res_cancel = XmSelectionBoxGetChild (real_dialog, XmDIALOG_CANCEL_BUTTON); + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( widget12,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget12); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 0); ac++; + XtSetValues ( widget13,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, timeout_text); ac++; + XtSetValues ( widget14,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, cycle_text); ac++; + XtSetValues ( widget15,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, fade_text); ac++; + XtSetValues ( widget16,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, ticks_text); ac++; + XtSetValues ( widget17,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 19); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, lock_time_text); ac++; + XtSetValues ( widget18,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, passwd_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, passwd_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 14); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, passwd_time_text); ac++; + XtSetValues ( widget48,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 141); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( timeout_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( cycle_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( fade_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, fade_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( ticks_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( lock_time_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( passwd_time_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( verbose_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, verbose_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( cmap_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, cmap_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( fade_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, fade_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( unfade_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, unfade_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( lock_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, passwd_time_text); ac++; + + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetValues ( widget29,al, ac ); + ac = 0; + + + + ac = 0; + children[ac++] = widget12; + children[ac++] = widget13; + children[ac++] = widget14; + children[ac++] = widget15; + children[ac++] = widget16; + children[ac++] = widget17; + children[ac++] = widget18; + children[ac++] = widget48; + children[ac++] = timeout_text; + children[ac++] = cycle_text; + children[ac++] = fade_text; + children[ac++] = ticks_text; + children[ac++] = lock_time_text; + children[ac++] = passwd_time_text; + children[ac++] = verbose_toggle; + children[ac++] = cmap_toggle; + children[ac++] = fade_toggle; + children[ac++] = unfade_toggle; + children[ac++] = lock_toggle; + children[ac++] = widget29; + + XtManageChildren(children, ac); + ac = 0; + + resources_form = real_dialog; +} + + +void +create_demo_dialog(Widget parent, Visual *visual, Colormap colormap) +{ + Arg al[64]; /* Arg List */ + register int ac = 0; /* Arg Count */ + + Widget real_dialog; + Widget w; + + + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, colormap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth(XtScreen(parent), visual)); ac++; + + + real_dialog = XmCreatePromptDialog (parent, "demoForm", al, ac); + demo_dialog = XtParent(real_dialog); + + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SEPARATOR); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SELECTION_LABEL); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_OK_BUTTON); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_CANCEL_BUTTON); + if (w) XtUnmanageChild (w); + w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_HELP_BUTTON); + if (w) XtUnmanageChild (w); + + ac = 0; + XtSetArg (al [ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg (al [ac], XmNrightAttachment, XmATTACH_FORM); ac++; + demo_form = XmCreateForm (real_dialog, "form", al, ac); + XtManageChild (demo_form); + + label1 = XmCreateLabel ( demo_form, "label1", al, ac ); + label2 = XmCreateLabel ( demo_form, "label2", al, ac ); + demo_list = XmCreateScrolledList ( demo_form, "demoList", al, ac ); + text_area = XtParent ( demo_list ); + + ac = 0; + text_line = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT); + XtManageChild(text_line); + + /* #### ARRGH! This is apparently the only way to make hitting return in + the text field not *ALSO* activate the most-recently-selected button! + + This has the unfortunate side effect of making the buttons not be + keyboard-traversable, but that's less bad than not being able to try + out new switches by typing them into the text field. + + XmSelectionBox(3M) says in the "Additional Behavior" section: + KActivate: + Calls the activate callbacks for the button with + the keyboard focus. [... ] In a List widget or + single-line Text widget, the List or Text action + associated with KActivate is called before the + SelectionBox actions associated with KActivate." + + So they take it as a given that when running activateCallback on a single- + line Text widget, you'll also want to run activateCallback on whatever the + currently-focussed button is as well! Morons! Villains! Shitheads! + + (Perhaps there's some way to override XmSelectionBox's KActivate behavior. + I doubt it, but if there is, I don't know it.) + */ + ac = 0; + XtSetArg(al[ac], XmNtraversalOn, False); ac++; + + next = XmCreatePushButton ( real_dialog, "next", al, ac ); + prev = XmCreatePushButton ( real_dialog, "prev", al, ac ); + edit = XmCreatePushButton ( real_dialog, "edit", al, ac ); + done = XmCreatePushButton ( real_dialog, "done", al, ac ); + restart = XmCreatePushButton ( real_dialog, "restart", al, ac ); + XtManageChild(next); + XtManageChild(prev); + XtManageChild(edit); + XtManageChild(done); + XtManageChild(restart); + + ac = 0; + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 5); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( label1,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, label1); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( label2,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, label2); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( text_area,al, ac ); + + XtManageChild(demo_list); + XtManageChild(label1); + XtManageChild(label2); + + demo_form = real_dialog; +} diff --git a/driver/dialogs.xd b/driver/dialogs.xd new file mode 100644 index 00000000..ad1f6da0 --- /dev/null +++ b/driver/dialogs.xd @@ -0,0 +1,569 @@ +module 'XScreenSaver' +applicationName = 'XScreenSaver'; +generateNameC = 'dialogs.c'; +generateNameUIL = ''; +generateNameResDB = 'dialogs.ad'; +generateUidFile = ''; +generateMask = 1507557; +useMask = 1; +value +object 'passwd_dialog' : XmDialogShell { + arguments { + name = 'passwdDialog'; + XmNtitle= 'XScreenSaver'; + XmNallowShellResize= true; + }; +object 'passwd_form' : XmForm { + arguments { + name = 'passwdForm'; + XmNautoUnmanage= false; + }; +object 'roger_label' : XmDrawnButton { + arguments { + name = 'rogerLabel'; + XmNwidth= 150; + }; +}; +object 'passwd_label1' : XmLabel { + arguments { + name = 'passwdLabel1'; + XmNlabelString= 'XScreenSaver %s'; + XmNalignment= 0; + }; +}; +object '' : XmLabel { + arguments { + name = 'passwdLabel2'; + XmNlabelString= 'This display is locked.'; + XmNalignment= 0; + }; +}; +object 'passwd_label3' : XmLabel { + arguments { + name = 'passwdLabel3'; + XmNlabelString= 'Please type %s\'s password to unlock it.'; + XmNalignment= 0; + }; +}; +object 'passwd_text' : XmTextField { + arguments { + name = 'passwdText'; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object 'passwd_done' : XmPushButton { + arguments { + name = 'passwdDone'; + XmNlabelString= 'Done'; + }; +}; +object 'passwd_cancel' : XmPushButton { + arguments { + name = 'passwdCancel'; + XmNlabelString= 'Cancel'; + }; +}; + attachments { + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 3 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 4 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 30; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 5 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 6 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 0; + XmNleftAttachment = 3 1 0; + XmNbottomAttachment = 3 7 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 7 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + }; +}; +}; +object 'resources_dialog' : XmDialogShell { + arguments { + name = 'resourcesDialog'; + XmNtitle= 'XScreenSaver'; + XmNallowShellResize= true; + }; +object 'resources_form' : XmForm { + arguments { + name = 'resourcesForm'; + XmNautoUnmanage= false; + }; +object '' : XmLabel { + arguments { + name = 'resourcesLabel'; + XmNlabelString= 'XScreenSaver Parameters'; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object '' : XmLabel { + arguments { + name = 'timeoutLabel'; + XmNlabelString= 'Timeout Minutes'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'cycleLabel'; + XmNlabelString= 'Cycle Seconds'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'fadeSecondsLabel'; + XmNlabelString= 'Fade Seconds'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'fadeTicksLabel'; + XmNlabelString= 'Fade Ticks'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'lockLabel'; + XmNlabelString= 'Lock Timeout'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'passwdLabel'; + XmNlabelString= 'Password Timeout'; + XmNalignment= * 2; + }; +}; +object 'timeout_text' : XmTextField { + arguments { + name = 'timeoutText'; + XmNcolumns= 5; + }; +}; +object 'cycle_text' : XmTextField { + arguments { + name = 'cycleText'; + XmNcolumns= 5; + }; +}; +object 'fade_text' : XmTextField { + arguments { + name = 'fadeSecondsText'; + XmNcolumns= 5; + }; +}; +object 'ticks_text' : XmTextField { + arguments { + name = 'fadeTicksText'; + XmNcolumns= 5; + }; +}; +object 'lock_time_text' : XmTextField { + arguments { + name = 'passwdText'; + XmNcolumns= 5; + }; +}; +object 'passwd_time_text' : XmTextField { + arguments { + name = 'lockText'; + XmNcolumns= 5; + }; +}; +object 'verbose_toggle' : XmToggleButton { + arguments { + name = 'verboseToggle'; + XmNlabelString= 'Verbose'; + XmNalignment= * 0; + }; +}; +object 'cmap_toggle' : XmToggleButton { + arguments { + name = 'cmapToggle'; + XmNlabelString= 'Install Colormap'; + XmNalignment= * 0; + }; +}; +object 'fade_toggle' : XmToggleButton { + arguments { + name = 'fadeToggle'; + XmNlabelString= 'Fade Colormap'; + XmNalignment= * 0; + }; +}; +object 'unfade_toggle' : XmToggleButton { + arguments { + name = 'unfadeToggle'; + XmNlabelString= 'Unfade Colormap'; + XmNalignment= * 0; + }; +}; +object 'lock_toggle' : XmToggleButton { + arguments { + name = 'lockToggle'; + XmNlabelString= 'Require Password'; + XmNalignment= * 0; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object 'res_done' : XmPushButton { + arguments { + name = 'resourcesDone'; + XmNlabelString= 'Done'; + }; +}; +object 'res_cancel' : XmPushButton { + arguments { + name = 'resourcesCancel'; + XmNlabelString= 'Cancel'; + }; +}; + attachments { + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 0; + XmNleftAttachment = 1 0 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 1 4; + }; + attachment { + XmNrightAttachment = 3 9 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 9; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 3 10 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 10 0; + XmNtopAttachment = 4 10 0; + }; + attachment { + XmNrightAttachment = 3 11 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 11 0; + XmNtopAttachment = 4 11 0; + }; + attachment { + XmNrightAttachment = 3 12 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 12 0; + XmNtopAttachment = 4 12 0; + }; + attachment { + XmNrightAttachment = 3 13 4; + XmNleftAttachment = 1 0 19; + XmNbottomAttachment = 4 13 0; + XmNtopAttachment = 4 13 0; + }; + attachment { + XmNrightAttachment = 3 14 4; + XmNleftAttachment = 1 0 14; + XmNbottomAttachment = 4 14 0; + XmNtopAttachment = 4 14 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 141; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 9 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 9 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 10 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 10 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 11 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 11 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 12 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 12 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 13 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 13 4; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 3 9 20; + XmNbottomAttachment = 4 9 0; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 15 0; + XmNbottomAttachment = 4 10 0; + XmNtopAttachment = 4 10 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 16 0; + XmNbottomAttachment = 4 11 0; + XmNtopAttachment = 4 11 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 17 0; + XmNbottomAttachment = 4 12 0; + XmNtopAttachment = 4 12 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 18 0; + XmNbottomAttachment = 4 13 0; + XmNtopAttachment = 4 13 0; + }; + attachment { + XmNrightAttachment = 1 0; + XmNleftAttachment = 1 0; + XmNbottomAttachment = 3 21 4; + XmNtopAttachment = 3 14 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 21 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + }; +}; +}; +object 'demo_dialog' : XmDialogShell { + arguments { + name = 'demoDialog'; + XmNtitle= 'XScreenSaver'; + XmNmaxWidth= 500; + XmNallowShellResize= true; + }; +object 'demo_form' : XmForm { + arguments { + name = 'demoForm'; + XmNautoUnmanage= false; + }; +object 'label1' : XmLabel { + arguments { + name = 'label1'; + XmNlabelString= 'XScreenSaver %s'; + }; +}; +object 'label2' : XmLabel { + arguments { + name = 'label2'; + XmNlabelString= 'Copyright © 1991-1994 by Jamie Zawinski '; + }; +}; +object 'text_area' : XmScrolledList { + arguments { + name = 'textArea'; + }; +object '' : XmScrollBar { + arguments { + name = 'ListhScrollBar'; + }; +}; +object '' : XmScrollBar { + arguments { + name = 'ListvScrollBar'; + }; +}; +object 'demo_list' : XmList { + arguments { + name = 'demoList'; + XmNvisibleItemCount= 10; + XmNautomaticSelection= true; + XmNlistSizePolicy= 2; + }; +}; +}; +object 'text_line' : XmTextField { + arguments { + name = 'textLine'; + }; +}; +object 'vline' : XmSeparator { + arguments { + name = 'vline'; + }; +}; +object 'next' : XmPushButton { + arguments { + name = 'next'; + XmNlabelString= 'Run Next'; + }; +}; +object 'prev' : XmPushButton { + arguments { + name = 'prev'; + XmNlabelString= 'Run Previous'; + }; +}; +object 'edit' : XmPushButton { + arguments { + name = 'edit'; + XmNlabelString= 'Edit Parameters'; + }; +}; +object 'done' : XmPushButton { + arguments { + name = 'done'; + XmNlabelString= 'Exit Demo Mode'; + }; +}; +object 'restart' : XmPushButton { + arguments { + name = 'restart'; + XmNlabelString= 'Restart Screen Saver'; + }; +}; +object 'spacer' : XmLabel { + arguments { + name = 'spacer'; + XmNlabelString= * ' '; + }; +}; + attachments { + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 1 0 5; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 1 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 4 4; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 5 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 6 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 3; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 6 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 6 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 7 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 7 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 8 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 8 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 9 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 9 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 10 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 10 0; + }; + }; +}; +}; +end module; diff --git a/driver/kpasswd.c b/driver/kpasswd.c new file mode 100644 index 00000000..ee115213 --- /dev/null +++ b/driver/kpasswd.c @@ -0,0 +1,180 @@ +/* kpasswd.c --- verify kerberos passwords. + * written by Nat Lanza (magus@cs.cmu.edu) for + * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef NO_LOCKING /* whole file */ + +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include +#include +#include + +#if !defined(VMS) && !defined(HAVE_ADJUNCT_PASSWD) +# include +#endif + + +#ifdef __bsdi__ +# include +# if _BSDI_VERSION >= 199608 +# define BSD_AUTH +# endif +#endif /* __bsdi__ */ + +/* blargh */ +#undef Bool +#undef True +#undef False +#define Bool int +#define True 1 +#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; + + +/* Called at startup to grab user, instance, and realm information + from the user's ticketfile (remember, name.inst@realm). Since we're + using tf_get_pname(), this should work even if your kerberos username + isn't the same as your local username. We grab the ticket at startup + time so that even if your ticketfile dies while the screen's locked + we'll still have the information to unlock it. + + Problems: the password dialog currently displays local username, so if + you have some non-standard name/instance when you run xscreensaver, + you'll need to remember what it was when unlocking, or else you lose. + + Also, we use des_string_to_key(), so if you have an AFS password + (encrypted with ka_StringToKey()), you'll lose. Get a kerberos password; + it isn't that hard. + + Like the original lock_init, we return false if something went wrong. + We don't use the arguments we're given, though. + */ +Bool +lock_init (int argc, char **argv) +{ + int k_errno; + + memset(name, 0, sizeof(name)); + memset(inst, 0, sizeof(inst)); + + /* find out where the user's keeping his tickets. + squirrel it away for later use. */ + tk_file = tkt_string(); + + /* open ticket file or die trying. */ + if ((k_errno = tf_init(tk_file, R_TKT_FIL))) { + return False; + } + + /* same with principal and instance names */ + if ((k_errno = tf_get_pname(name)) || + (k_errno = tf_get_pinst(inst))) { + return False; + } + + /* close the ticketfile to release the lock on it. */ + tf_close(); + + /* figure out what realm we're authenticated to. this ought + to be the local realm, but it pays to be sure. */ + if ((k_errno = krb_get_tf_realm(tk_file, realm))) { + return False; + } + + /* last-minute sanity check on what we got. */ + if ((strlen(name)+strlen(inst)+strlen(realm)+3) > + (REALM_SZ + ANAME_SZ + INST_SZ + 3)) { + return False; + } + + /* success */ + return True; +} + + +/* des_string_to_key() wants this. If C didn't suck, we could have an + anonymous function do this. Even a local one. But it does, so here + we are. Calling it ive_got_your_local_function_right_here_buddy() + would have been rude. + */ +static int +key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key) +{ + memcpy(key, passwd, sizeof(des_cblock)); + return (0); +} + +/* Called to see if the user's typed password is valid. We do this by asking + the kerberos server for a ticket and checking to see if it gave us one. + We need to move the ticketfile first, or otherwise we end up updating the + user's tkfile with new tickets. This would break services like zephyr that + like to stay authenticated, and it would screw with AFS authentication at + some sites. So, we do a quick, painful hack with a tmpfile. + */ +Bool +passwd_valid_p (const char *typed_passwd) +{ + C_Block mitkey; + Bool success; + char *newtkfile; + + /* temporarily switch to a new ticketfile. + I'm not using tmpnam() because it isn't entirely portable. + this could probably be fixed with autoconf. */ + newtkfile = malloc(80 * sizeof(char)); + memset(newtkfile, 0, sizeof(newtkfile)); + + sprintf(newtkfile, "/tmp/xscrn-%i", getpid()); + + krb_set_tkt_string(newtkfile); + + /* encrypt the typed password. if you have an AFS password instead + of a kerberos one, you lose *right here*. If you want to use AFS + passwords, you can use ka_StringToKey() instead. As always, ymmv. */ + des_string_to_key(typed_passwd, mitkey); + + if (krb_get_in_tkt(name, inst, realm, "krbtgt", realm, DEFAULT_TKT_LIFE, + key_to_key, NULL, mitkey) != 0) { + success = False; + } else { + success = True; + } + + /* quickly block out the tempfile and password to prevent snooping, + then restore the old ticketfile and cleean up a bit. */ + + dest_tkt(); + krb_set_tkt_string(tk_file); + free(newtkfile); + memset(mitkey, 0, sizeof(mitkey)); + + + /* Did we verify successfully? */ + return success; +} + +#endif /* NO_LOCKING -- whole file */ diff --git a/driver/link_axp.com b/driver/link_axp.com new file mode 100644 index 00000000..a1418927 --- /dev/null +++ b/driver/link_axp.com @@ -0,0 +1,15 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link xscreensaver-command,vms_axp_12.opt/opt +$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - + windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link xscreensaver-command,vms_axp.opt/opt +$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - + windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp.opt/opt +$ endif diff --git a/driver/link_decc.com b/driver/link_decc.com new file mode 100644 index 00000000..d1de0d0a --- /dev/null +++ b/driver/link_decc.com @@ -0,0 +1,15 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link xscreensaver-command,vms_decc_12.opt/opt +$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - + windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link xscreensaver-command,vms_decc.opt/opt +$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, - + windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc.opt/opt +$ endif diff --git a/driver/lock.c b/driver/lock.c new file mode 100644 index 00000000..b4246c91 --- /dev/null +++ b/driver/lock.c @@ -0,0 +1,723 @@ +/* lock.c --- handling the password dialog for locking-mode. + * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Athena locking code contributed by Jon A. Christopher */ +/* Copyright 1997, with the same permissions as above. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef NO_LOCKING /* whole file */ + +#include +#include +#include "xscreensaver.h" + +#ifndef VMS +# include +#else /* VMS */ +extern char *getenv(const char *name); +extern int validate_user(char *name, char *password); +static char * user_vms; +#endif /* VMS */ + + +#ifdef HAVE_ATHENA + +# include +# include +# include +# include +# include + +static void passwd_done_cb (Widget, XtPointer, XtPointer); +static XtActionsRec actionsList[] = +{ + {"passwdentered", (XtActionProc) passwd_done_cb}, +}; + +static char Translations[] = +"\ +Return: passwdentered()\ +"; + +#else /* HAVE_MOTIF */ + +# include +# include +# include + +#endif /* HAVE_MOTIF */ + +extern Widget passwd_dialog; +extern Widget passwd_form; +extern Widget roger_label; +extern Widget passwd_label1; +extern Widget passwd_label3; +extern Widget passwd_cancel; + +#ifdef HAVE_MOTIF +extern Widget passwd_text; +extern Widget passwd_done; +#else /* HAVE_ATHENA */ +static Widget passwd_text = 0; /* gag... */ +static Widget passwd_done = 0; +#endif /* HAVE_ATHENA */ + + + +static enum { pw_read, pw_ok, pw_fail, pw_cancel, pw_time } passwd_state; +#define PASSWDLEN 80 +static char typed_passwd [PASSWDLEN]; + + +#if defined(HAVE_ATHENA) || (XmVersion >= 1002) + /* The `destroy' bug apears to be fixed as of Motif 1.2.1, but + the `verify-callback' bug is still present. */ +# define DESTROY_WORKS +#endif + +static void +passwd_cancel_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + passwd_state = pw_cancel; +} + +static void +passwd_done_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + if (passwd_state != pw_read) return; /* already done */ +#ifndef VMS + +# ifdef HAVE_ATHENA + strncpy(typed_passwd, XawDialogGetValueString(passwd_form), PASSWDLEN); +# endif /* HAVE_ATHENA */ + if (passwd_valid_p (typed_passwd)) + passwd_state = pw_ok; + else + passwd_state = pw_fail; + +#else /* VMS */ + user_vms = getenv("USER"); + if (validate_user(user_vms,typed_passwd) == 1) + passwd_state = pw_ok; + else + passwd_state = pw_fail; +#endif /* VMS */ +} + +#if defined(HAVE_MOTIF) && defined(VERIFY_CALLBACK_WORKS) + + /* It looks to me like adding any modifyVerify callback causes + Motif 1.1.4 to free the the TextF_Value() twice. I can't see + the bug in the Motif source, but Purify complains, even if + check_passwd_cb() is a no-op. + + Update: Motif 1.2.1 also loses, but in a different way: it + writes beyond the end of a malloc'ed block in ModifyVerify(). + Probably this block is the text field's text. + */ + +static void +check_passwd_cb (Widget button, XtPointer client_data, XtPointer call_data) +{ + XmTextVerifyCallbackStruct *vcb = (XmTextVerifyCallbackStruct *) call_data; + + if (passwd_state != pw_read) + return; + else if (vcb->reason == XmCR_ACTIVATE) + { + passwd_done_cb (0, 0, 0); + } + else if (vcb->text->length > 1) /* don't allow "paste" operations */ + { + vcb->doit = False; + } + else if (vcb->text->ptr != 0) + { + int i; + strncat (typed_passwd, vcb->text->ptr, vcb->text->length); + typed_passwd [vcb->endPos + vcb->text->length] = 0; + for (i = 0; i < vcb->text->length; i++) + vcb->text->ptr [i] = '*'; + } +} + +# else /* HAVE_ATHENA || !VERIFY_CALLBACK_WORKS */ + +static void keypress (Widget w, XEvent *event, String *av, Cardinal *ac); +static void backspace (Widget w, XEvent *event, String *av, Cardinal *ac); +static void kill_line (Widget w, XEvent *event, String *av, Cardinal *ac); +static void done (Widget w, XEvent *event, String *av, Cardinal *ac); + +static XtActionsRec actions[] = {{"keypress", keypress}, + {"backspace", backspace}, + {"kill_line", kill_line}, + {"done", done} + }; + +# ifdef HAVE_MOTIF +# if 0 /* oh fuck, why doesn't this work? */ +static char translations[] = "\ +BackSpace: backspace()\n\ +Delete: backspace()\n\ +CtrlH: backspace()\n\ +CtrlU: kill_line()\n\ +CtrlX: kill_line()\n\ +CtrlJ: done()\n\ +CtrlM: done()\n\ +: keypress()\n\ +"; +# else /* !0 */ +static char translations[] = ":keypress()"; +# endif /* !0 */ +# endif /* HAVE_MOTIF */ + + +static void +text_field_set_string (Widget widget, char *text, int position) +{ +#ifdef HAVE_MOTIF + XmTextFieldSetString (widget, text); + XmTextFieldSetInsertionPosition (widget, position); + +#else /* HAVE_ATHENA */ + char *buf; + int end_pos; + + XawTextBlock block; + block.firstPos = 0; + block.length = strlen (text); + block.ptr = text; + block.format = 0; + if (block.length == 0) + { + buf = XawDialogGetValueString(passwd_form); + if (buf) + end_pos = strlen(buf); + else + end_pos = -1; + } + XawTextReplace (widget, 0, end_pos, &block); + XawTextSetInsertionPoint (widget, position); +#endif /* HAVE_ATHENA */ +} + + +static void +keypress (Widget w, XEvent *event, String *argv, Cardinal *argc) +{ + int i, j; + char s [sizeof (typed_passwd)]; + int size = XLookupString ((XKeyEvent *) event, s, sizeof (s), 0, 0); + if (size != 1) return; + + /* hack because I can't get translations to dance to my tune... */ + if (*s == '\010') { backspace (w, event, argv, argc); return; } + if (*s == '\177') { backspace (w, event, argv, argc); return; } + if (*s == '\025') { kill_line (w, event, argv, argc); return; } + if (*s == '\030') { kill_line (w, event, argv, argc); return; } + if (*s == '\012') { done (w, event, argv, argc); return; } + if (*s == '\015') { done (w, event, argv, argc); return; } + + i = j = strlen (typed_passwd); + typed_passwd [i] = *s; + s [++i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +backspace (Widget w, XEvent *event, String *argv, Cardinal *argc) +{ + char s [sizeof (typed_passwd)]; + int i = strlen (typed_passwd); + int j = i; + if (i == 0) + return; + typed_passwd [--i] = 0; + s [i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +kill_line (Widget w, XEvent *event, String *argv, Cardinal *argc) +{ + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); +} + +static void +done (Widget w, XEvent *event, String *argv, Cardinal *argc) +{ + passwd_done_cb (w, 0, 0); +} + +#endif /* HAVE_ATHENA || !VERIFY_CALLBACK_WORKS */ + + +extern void skull (Display *, Window, GC, GC, int, int, int, int); + +static void +roger (Widget button, XtPointer client_data, XtPointer call_data) +{ + Display *dpy = XtDisplay (button); + Screen *screen = XtScreen (button); + Window window = XtWindow (button); + Arg av [10]; + int ac = 0; + XGCValues gcv; + Colormap cmap; + GC draw_gc, erase_gc; + unsigned int fg, bg; + int x, y, size; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + if (xgwa.width > xgwa.height) size = xgwa.height; + else size = xgwa.width; + if (size > 40) size -= 30; + x = (xgwa.width - size) / 2; + y = (xgwa.height - size) / 2; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (button, av, ac); + /* if it's black on white, swap it cause it looks better (hack hack) */ + if (fg == BlackPixelOfScreen (screen) && bg == WhitePixelOfScreen (screen)) + fg = WhitePixelOfScreen (screen), bg = BlackPixelOfScreen (screen); + gcv.foreground = bg; + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = fg; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + XFillRectangle (dpy, window, erase_gc, 0, 0, xgwa.width, xgwa.height); + skull (dpy, window, draw_gc, erase_gc, x, y, size, size); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); +} + +static void +make_passwd_dialog (saver_info *si) +{ + char *username = 0; + saver_screen_info *ssi = si->default_screen; + Widget parent = ssi->toplevel_shell; + + if (ssi->demo_cmap && + ssi->demo_cmap != ssi->cmap && + ssi->demo_cmap != DefaultColormapOfScreen (ssi->screen)) + { + XFreeColormap (si->dpy, ssi->demo_cmap); + ssi->demo_cmap = 0; + } + + if (ssi->default_visual == DefaultVisualOfScreen (ssi->screen)) + ssi->demo_cmap = DefaultColormapOfScreen (ssi->screen); + else + ssi->demo_cmap = XCreateColormap (si->dpy, + RootWindowOfScreen (ssi->screen), + ssi->default_visual, AllocNone); + + create_passwd_dialog (parent, ssi->default_visual, ssi->demo_cmap); + +#ifdef HAVE_ATHENA + + XtVaSetValues(passwd_form, XtNvalue, typed_passwd, 0); + + XawDialogAddButton(passwd_form,"ok", passwd_done_cb, 0); + XawDialogAddButton(passwd_form,"cancel", passwd_cancel_cb, 0); + passwd_done = XtNameToWidget(passwd_form,"ok"); + passwd_text = XtNameToWidget(passwd_form,"value"); + + XtAppAddActions(XtWidgetToApplicationContext(passwd_text), + actionsList, XtNumber(actionsList)); + XtOverrideTranslations(passwd_text, XtParseTranslationTable(Translations)); + +#else /* HAVE_MOTIF */ + + XtAddCallback (passwd_done, XmNactivateCallback, passwd_done_cb, 0); + XtAddCallback (passwd_cancel, XmNactivateCallback, passwd_cancel_cb, 0); + XtAddCallback (roger_label, XmNexposeCallback, roger, 0); + +# ifdef VERIFY_CALLBACK_WORKS + XtAddCallback (passwd_text, XmNmodifyVerifyCallback, check_passwd_cb, 0); + XtAddCallback (passwd_text, XmNactivateCallback, check_passwd_cb, 0); +# else + XtAddCallback (passwd_text, XmNactivateCallback, passwd_done_cb, 0); + XtOverrideTranslations (passwd_text, XtParseTranslationTable (translations)); +# endif + +# if defined(HAVE_MOTIF) && (XmVersion >= 1002) + /* The focus stuff changed around; this didn't exist in 1.1.5. */ + XtVaSetValues (passwd_form, XmNinitialFocus, passwd_text, 0); +# endif + + /* Another random thing necessary in 1.2.1 but not 1.1.5... */ + XtVaSetValues (roger_label, XmNborderWidth, 2, 0); + +#endif /* HAVE_MOTIF */ + +#ifndef VMS + { + struct passwd *pw = getpwuid (getuid ()); + username = pw->pw_name; + } +#else /* VMS -- from "R.S.Niranjan" who says + that on OpenVMS 6.1, using `struct passwd' crashes... */ + username = getenv("USER"); +#endif /* VMS */ + + format_into_label (passwd_label1, si->version); + format_into_label (passwd_label3, (username ? username : "???")); +} + +static int passwd_idle_timer_tick; +static XtIntervalId passwd_idle_id; + +static void +passwd_idle_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; + + Display *dpy = XtDisplay (passwd_form); +#ifdef HAVE_ATHENA + Window window = XtWindow (passwd_form); +#else /* MOTIF */ + Window window = XtWindow (XtParent(passwd_done)); +#endif /* MOTIF */ + static Dimension x, y, d, s, ss; + static GC gc = 0; + int max = p->passwd_timeout / 1000; + + idle_timer ((XtPointer) si, id); + + if (passwd_idle_timer_tick == max) /* first time */ + { + XGCValues gcv; +#ifdef HAVE_MOTIF + unsigned long fg, bg, ts, bs; + Dimension w = 0, h = 0; + XtVaGetValues(XtParent(passwd_done), + XmNwidth, &w, + 0); + XtVaGetValues(passwd_done, + XmNheight, &h, + XmNy, &y, + XtNforeground, &fg, + XtNbackground, &bg, + XmNtopShadowColor, &ts, + XmNbottomShadowColor, &bs, + 0); + + if (ts != bg && ts != fg) + fg = ts; + if (bs != bg && bs != fg) + fg = bs; + + d = h / 2; + if (d & 1) d++; + + x = (w / 2); + + x -= d/2; + y += d/2; + +#else /* HAVE_ATHENA */ + + Arg av [100]; + int ac = 0; + unsigned long fg, bg; + XtSetArg (av [ac], XtNheight, &d); ac++; + XtGetValues (passwd_done, av, ac); + ac = 0; + XtSetArg (av [ac], XtNwidth, &x); ac++; + XtSetArg (av [ac], XtNheight, &y); ac++; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (passwd_form, av, ac); + x -= d; + y -= d; + d -= 4; + +#endif /* HAVE_ATHENA */ + + gcv.foreground = fg; + if (gc) XFreeGC (dpy, gc); + gc = XCreateGC (dpy, window, GCForeground, &gcv); + s = 360*64 / (passwd_idle_timer_tick - 1); + ss = 90*64; + XFillArc (dpy, window, gc, x, y, d, d, 0, 360*64); + XSetForeground (dpy, gc, bg); + x += 1; + y += 1; + d -= 2; + } + + if (--passwd_idle_timer_tick) + { + passwd_idle_id = XtAppAddTimeOut (si->app, 1000, passwd_idle_timer, + (XtPointer) si); + XFillArc (dpy, window, gc, x, y, d, d, ss, s); + ss += s; + } +} + +#ifdef HAVE_ATHENA + +void +pop_up_athena_dialog_box (Widget parent, Widget focus, Widget dialog, + Widget form, int where) +{ + /* modified from demo.c */ + /* I'm sure this is the wrong way to pop up a dialog box, but I can't + figure out how else to do it. + + It's important that the screensaver dialogs not get decorated or + otherwise reparented by the window manager, because they need to be + children of the *real* root window, not the WM's virtual root, in + order for us to guarentee that they are visible above the screensaver + window itself. + */ + Arg av [100]; + int ac = 0; + Dimension sw, sh, x, y, w, h; + + XtRealizeWidget(dialog); + sw = WidthOfScreen (XtScreen (dialog)); + sh = HeightOfScreen (XtScreen (dialog)); + ac = 0; + XtSetArg (av [ac], XtNwidth, &w); ac++; + XtSetArg (av [ac], XtNheight, &h); ac++; + XtGetValues (form, av, ac); + switch (where) + { + case 0: /* center it in the top-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 - h; + break; + case 1: /* center it in the bottom-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 + (sh/2) - h; + break; + case 2: /* center it on the screen */ + x = (sw + w) / 2 - w; + y = (sh + h) / 2 - h; + break; + default: + abort (); + } + if (x + w > sw) x = sw - w; + if (y + h > sh) y = sh - h; + ac = 0; + XtVaSetValues(dialog, + XtNx, x, + XtNy, y, + NULL); + XtVaSetValues(form, + XtNx, x, + XtNy, y, + NULL); + XtPopup(dialog,XtGrabNone); + steal_focus_and_colormap (focus); +} + +static void +passwd_set_label (char *buf, int len) +{ + Widget label; + if (!passwd_text) + return; + label=XtNameToWidget(XtParent(passwd_text),"*label"); + XtVaSetValues(label, + XtNlabel, buf, + NULL); +} +#endif /* HAVE_ATHENA */ + +static Bool +pop_passwd_dialog (saver_info *si) +{ + saver_preferences *p = &si->prefs; + saver_screen_info *ssi = si->default_screen; + Widget parent = ssi->toplevel_shell; + Display *dpy = XtDisplay (passwd_dialog); + Window focus; + int revert_to; + int i; + + typed_passwd [0] = 0; + passwd_state = pw_read; + text_field_set_string (passwd_text, "", 0); + + /* In case one of the hacks has unmapped it temporarily... + Get that sucker on stage now! */ + for (i = 0; i < si->nscreens; i++) + XMapRaised(si->dpy, si->screens[i].screensaver_window); + + XGetInputFocus (dpy, &focus, &revert_to); +#if defined(HAVE_MOTIF) && !defined(DESTROY_WORKS) + /* This fucker blows up if we destroy the widget. I can't figure + out why. The second destroy phase dereferences freed memory... + So we just keep it around; but unrealizing or unmanaging it + doesn't work right either, so we hack the window directly. FMH. + */ + if (XtWindow (passwd_form)) + XMapRaised (dpy, XtWindow (passwd_dialog)); +#endif + +#ifdef HAVE_ATHENA + pop_up_athena_dialog_box (parent, passwd_text, passwd_dialog, + passwd_form, 2); +#else + pop_up_dialog_box (passwd_dialog, passwd_form, +#ifdef DEBUG + (si->prefs.debug_p ? 69 : 0) + +#endif + 2); + XtManageChild (passwd_form); +#endif + +#if defined(HAVE_MOTIF) && (XmVersion < 1002) + /* The focus stuff changed around; this causes problems in 1.2.1 + but is necessary in 1.1.5. */ + XmProcessTraversal (passwd_text, XmTRAVERSE_CURRENT); +#endif + + passwd_idle_timer_tick = p->passwd_timeout / 1000; + passwd_idle_id = XtAppAddTimeOut (si->app, 1000, passwd_idle_timer, + (XtPointer) si); + +#ifdef HAVE_ATHENA + if (roger_label) + roger(roger_label, 0, 0); +#endif /* HAVE_ATHENA */ + +#ifdef DEBUG + if (!si->prefs.debug_p) +#endif + XGrabServer (dpy); /* ############ DANGER! */ + + /* this call to ungrab used to be in main_loop() - see comment in + xscreensaver.c around line 857. */ + ungrab_keyboard_and_mouse (si->dpy); + + while (passwd_state == pw_read) + { + XEvent event; + XtAppNextEvent (si->app, &event); + /* wait for timer event */ + if (event.xany.type == 0 && passwd_idle_timer_tick == 0) + passwd_state = pw_time; + XtDispatchEvent (&event); + } + XUngrabServer (dpy); + XSync (dpy, False); /* ###### (danger over) */ + + if (passwd_state != pw_time) + XtRemoveTimeOut (passwd_idle_id); + + if (passwd_state != pw_ok) + { + char *lose; + switch (passwd_state) + { + case pw_time: lose = "Timed out!"; break; + case pw_fail: lose = "Sorry!"; break; + case pw_cancel: lose = 0; break; + default: abort (); + } +#ifdef HAVE_MOTIF + XmProcessTraversal (passwd_cancel, 0); /* turn off I-beam */ +#endif + if (lose) + { +#ifdef HAVE_ATHENA + /* show the message */ + passwd_set_label(lose,strlen(lose)+1); + + /* and clear the password line */ + memset(typed_passwd, 0, PASSWDLEN); + text_field_set_string (passwd_text, "", 0); +#else + text_field_set_string (passwd_text, lose, strlen (lose) + 1); +#endif + passwd_idle_timer_tick = 1; + passwd_idle_id = XtAppAddTimeOut (si->app, 3000, passwd_idle_timer, + (XtPointer) si); + while (1) + { + XEvent event; + XtAppNextEvent (si->app, &event); + if (event.xany.type == 0 && /* wait for timer event */ + passwd_idle_timer_tick == 0) + break; + XtDispatchEvent (&event); + } + } + } + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); + XtSetKeyboardFocus (parent, None); + +#ifdef DESTROY_WORKS + XtDestroyWidget (passwd_dialog); + passwd_dialog = 0; +#else + XUnmapWindow (XtDisplay (passwd_dialog), XtWindow (passwd_dialog)); +#endif + { + XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); + /* I don't understand why this doesn't refocus on the old selected + window when MWM is running in click-to-type mode. The value of + `focus' seems to be correct. */ + XSetInputFocus (dpy, focus, revert_to, CurrentTime); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + /* Since we installed our colormap to display the dialog properly, put + the old one back, so that the screensaver_window is now displayed + properly. */ + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->cmap) + XInstallColormap (si->dpy, ssi->cmap); + } + + return (passwd_state == pw_ok ? True : False); +} + +Bool +unlock_p (saver_info *si) +{ + static Bool initted = False; + if (! initted) + { +#ifndef VERIFY_CALLBACK_WORKS + XtAppAddActions (si->app, actions, XtNumber (actions)); +#endif + passwd_dialog = 0; + initted = True; + } + if (! passwd_dialog) + make_passwd_dialog (si); + return pop_passwd_dialog (si); +} + +#endif /* !NO_LOCKING -- whole file */ diff --git a/driver/passwd.c b/driver/passwd.c new file mode 100644 index 00000000..c8e6f56f --- /dev/null +++ b/driver/passwd.c @@ -0,0 +1,238 @@ +/* passwd.c --- verifying typed passwords with the OS. + * xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifndef NO_LOCKING /* whole file */ + +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include +#ifndef VMS +# include +#else /* VMS */ +# include "vms-pwd.h" +#endif /* VMS */ + + +#ifdef __bsdi__ +# include +# if _BSDI_VERSION >= 199608 +# define BSD_AUTH +# endif +#endif /* __bsdi__ */ + + +#if defined(HAVE_SHADOW_PASSWD) /* passwds live in /etc/shadow */ + +# include +# define PWTYPE struct spwd * +# define PWPSLOT sp_pwdp +# define GETPW getspnam + +#elif defined(HAVE_ENHANCED_PASSWD) /* passwds live in /tcb/files/auth/ */ + /* M.Matsumoto */ +# include +# include + +# define PWTYPE struct pr_passwd * +# define PWPSLOT ufld.fd_encrypt +# define GETPW getprpwnam + +#elif defined(HAVE_ADJUNCT_PASSWD) + +# include +# include +# include + +# define PRTYPE passwd_adjunct * +# define PWPSLOT pwa_passwd +# define GETPW getpwanam + +#elif defined(HAVE_HPUX_PASSWD) + +# include +# include + +# define PRTYPE struct s_passwd * +# define PWPSLOT pw_passwd +# define GETPW getspwnam +# define crypt bigcrypt + +#endif + + +/* blargh */ +#undef Bool +#undef True +#undef False +#define Bool int +#define True 1 +#define False 0 + + +extern char *progname; + +static char *encrypted_root_passwd = 0; +static char *encrypted_user_passwd = 0; + +#ifdef VMS +# define ROOT "SYSTEM" +#else +# define ROOT "root" +#endif + + + +#ifndef VMS + +static char * +user_name (void) +{ + /* I think that just checking $USER here is not the best idea. */ + + const char *u = 0; + + /* It has been reported that getlogin() returns the wrong user id on some + very old SGI systems... And I've seen it return the string "rlogin" + sometimes! Screw it, using getpwuid() should be enough... + */ +/* u = (char *) getlogin (); + */ + + /* getlogin() fails if not attached to a terminal; in that case, use + getpwuid(). (Note that in this case, we're not doing shadow stuff, since + all we're interested in is the name, not the password. So that should + still work. Right?) */ + if (!u || !*u) + { + struct passwd *p = getpwuid (getuid ()); + u = (p ? p->pw_name : 0); + } + + return (u ? strdup(u) : 0); +} + +#else /* VMS */ + +static char * +user_name (void) +{ + char *u = getenv("USER"); + return (u ? strdup(u) : 0); +} + +#endif /* VMS */ + + +static Bool +passwd_known_p (const char *pw) +{ + return (pw && + pw[0] != '*' && /* This would be sensible... */ + strlen(pw) > 4); /* ...but this is what Solaris does. */ +} + + +static char * +get_encrypted_passwd(const char *user) +{ + if (user && *user) + { +#ifdef PWTYPE + { /* First check the shadow passwords. */ + PWTYPE p = GETPW((char *) user); + if (p && passwd_known_p (p->PWPSLOT)) + return strdup(p->PWPSLOT); + } +#endif + { /* Check non-shadow passwords too. */ + struct passwd *p = getpwnam(user); + if (p && passwd_known_p (p->pw_passwd)) + return strdup(p->pw_passwd); + } + } + + fprintf (stderr, "%s: couldn't get password of \"%s\"\n", + progname, (user ? user : "(null)")); + + return 0; +} + + + +/* This has to be called before we've changed our effective user ID, + because it might need priveleges to get at the encrypted passwords. + Returns false if we weren't able to get any passwords, and therefore, + locking isn't possible. (It will also have written to stderr.) + */ + +#ifndef VMS + +Bool +lock_init (int argc, char **argv) +{ + char *u; + +#ifdef HAVE_ENHANCED_PASSWD + set_auth_parameters(argc, argv); + check_auth_parameters(); +#endif /* HAVE_DEC_ENHANCED */ + + u = user_name(); + encrypted_user_passwd = get_encrypted_passwd(u); + encrypted_root_passwd = get_encrypted_passwd(ROOT); + if (u) free (u); + + if (encrypted_user_passwd) + return True; + else + return False; +} + + +/* This can be called at any time, and says whether the typed password + belongs to either the logged in user (real uid, not effective); or + to root. + */ +Bool +passwd_valid_p (const char *typed_passwd) +{ + if (encrypted_user_passwd && + !strcmp ((char *) crypt (typed_passwd, encrypted_user_passwd), + encrypted_user_passwd)) + return True; + + /* do not allow root to have a null password. */ + else if (typed_passwd[0] && + encrypted_root_passwd && + !strcmp ((char *) crypt (typed_passwd, encrypted_root_passwd), + encrypted_root_passwd)) + return True; + + else + return False; +} + +#else /* VMS */ +Bool lock_init (int argc, char **argv) { return True; } +#endif /* VMS */ + + +#endif /* NO_LOCKING -- whole file */ diff --git a/driver/stderr.c b/driver/stderr.c new file mode 100644 index 00000000..1a7bcb66 --- /dev/null +++ b/driver/stderr.c @@ -0,0 +1,451 @@ +/* stderr.c --- capturing stdout/stderr output onto the screensaver window. + * xscreensaver, Copyright (c) 1991-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* stderr hackery - Why Unix Sucks, reason number 32767. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_FCNTL +# include +#endif + +#include + +#include "xscreensaver.h" +#include "resources.h" +#include "visual.h" + +FILE *real_stderr = 0; +FILE *real_stdout = 0; + + +/* It's ok for these to be global, since they refer to the one and only + stderr stream, not to a particular screen or window or visual. + */ +static char stderr_buffer [4096]; +static char *stderr_tail = 0; +static time_t stderr_last_read = 0; + +static void make_stderr_overlay_window (saver_screen_info *); + + +void +reset_stderr (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + +#ifdef DEBUG + if (si->prefs.debug_p) + fprintf ((real_stderr ? real_stderr : stderr), + "%s: resetting stderr\n", progname); +#endif + + ssi->stderr_text_x = 0; + ssi->stderr_text_y = 0; + + if (ssi->stderr_gc) + XFreeGC (si->dpy, ssi->stderr_gc); + ssi->stderr_gc = 0; + + if (ssi->stderr_overlay_window) + XDestroyWindow(si->dpy, ssi->stderr_overlay_window); + ssi->stderr_overlay_window = 0; + + if (ssi->stderr_cmap) + XFreeColormap(si->dpy, ssi->stderr_cmap); + ssi->stderr_cmap = 0; +} + +void +clear_stderr (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + ssi->stderr_text_x = 0; + ssi->stderr_text_y = 0; + if (ssi->stderr_overlay_window) + XClearWindow (si->dpy, ssi->stderr_overlay_window); +} + + +static void +print_stderr_1 (saver_screen_info *ssi, char *string) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + Display *dpy = si->dpy; + Screen *screen = ssi->screen; + Window window = (ssi->stderr_overlay_window ? + ssi->stderr_overlay_window : + ssi->screensaver_window); + int h_border = 20; + int v_border = 20; + char *head = string; + char *tail; + + /* In verbose mode, copy it to stderr as well. */ + if (p->verbose_p) + fprintf (real_stderr, "%s", string); + + if (! ssi->stderr_font) + { + char *font_name = get_string_resource ("font", "Font"); + if (!font_name) font_name = "fixed"; + ssi->stderr_font = XLoadQueryFont (dpy, font_name); + if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed"); + ssi->stderr_line_height = (ssi->stderr_font->ascent + + ssi->stderr_font->descent); + } + + if (! ssi->stderr_gc) + { + XGCValues gcv; + Pixel fg, bg; + Colormap cmap = ssi->cmap; + + if (!ssi->stderr_overlay_window && + get_boolean_resource("overlayStderr", "Boolean")) + { + make_stderr_overlay_window (ssi); + if (ssi->stderr_overlay_window) + window = ssi->stderr_overlay_window; + if (ssi->stderr_cmap) + cmap = ssi->stderr_cmap; + } + + fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + gcv.font = ssi->stderr_font->fid; + gcv.foreground = fg; + gcv.background = bg; + ssi->stderr_gc = XCreateGC (dpy, window, + (GCFont | GCForeground | GCBackground), + &gcv); + } + + + if (ssi->stderr_cmap) + XInstallColormap(si->dpy, ssi->stderr_cmap); + + for (tail = string; *tail; tail++) + { + if (*tail == '\n' || *tail == '\r') + { + int maxy = HeightOfScreen (screen) - v_border - v_border; + if (tail != head) + XDrawImageString (dpy, window, ssi->stderr_gc, + ssi->stderr_text_x + h_border, + ssi->stderr_text_y + v_border + + ssi->stderr_font->ascent, + head, tail - head); + ssi->stderr_text_x = 0; + ssi->stderr_text_y += ssi->stderr_line_height; + head = tail + 1; + if (*tail == '\r' && *head == '\n') + head++, tail++; + + if (ssi->stderr_text_y > maxy - ssi->stderr_line_height) + { +#if 0 + ssi->stderr_text_y = 0; +#else + int offset = ssi->stderr_line_height * 5; + XCopyArea (dpy, window, window, ssi->stderr_gc, + 0, v_border + offset, + WidthOfScreen (screen), + (HeightOfScreen (screen) - v_border - v_border + - offset), + 0, v_border); + XClearArea (dpy, window, + 0, HeightOfScreen (screen) - v_border - offset, + WidthOfScreen (screen), offset, False); + ssi->stderr_text_y -= offset; +#endif + } + } + } + if (tail != head) + { + int direction, ascent, descent; + XCharStruct overall; + XDrawImageString (dpy, window, ssi->stderr_gc, + ssi->stderr_text_x + h_border, + ssi->stderr_text_y + v_border + + ssi->stderr_font->ascent, + head, tail - head); + XTextExtents (ssi->stderr_font, tail, tail - head, + &direction, &ascent, &descent, &overall); + ssi->stderr_text_x += overall.width; + } +} + +static void +make_stderr_overlay_window (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + unsigned long transparent_pixel = 0; + Visual *visual = get_overlay_visual (ssi->screen, &transparent_pixel); + if (visual) + { + int depth = visual_depth (ssi->screen, visual); + XSetWindowAttributes attrs; + unsigned long attrmask; + +#ifdef DEBUG + if (si->prefs.debug_p) + fprintf(real_stderr, + "%s: using overlay visual 0x%0x for stderr text layer.\n", + progname, (int) XVisualIDFromVisual (visual)); +#endif /* DEBUG */ + + ssi->stderr_cmap = XCreateColormap(si->dpy, + RootWindowOfScreen(ssi->screen), + visual, AllocNone); + + attrmask = (CWColormap | CWBackPixel | CWBackingPixel | CWBorderPixel | + CWBackingStore | CWSaveUnder); + attrs.colormap = ssi->stderr_cmap; + attrs.background_pixel = transparent_pixel; + attrs.backing_pixel = transparent_pixel; + attrs.border_pixel = transparent_pixel; + attrs.backing_store = NotUseful; + attrs.save_under = False; + + ssi->stderr_overlay_window = + XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0, + WidthOfScreen(ssi->screen), HeightOfScreen(ssi->screen), + 0, depth, InputOutput, visual, attrmask, &attrs); + XMapRaised(si->dpy, ssi->stderr_overlay_window); + } +} + + +static void +print_stderr (saver_info *si, char *string) +{ + saver_preferences *p = &si->prefs; + int i; + + /* In verbose mode, copy it to stderr as well. */ + if (p->verbose_p) + fprintf (real_stderr, "%s", string); + + for (i = 0; i < si->nscreens; i++) + print_stderr_1 (&si->screens[i], string); +} + + +static void +stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + char *s = stderr_buffer; + if (*s) + { + /* If too much data was printed, then something has gone haywire, + so truncate it. */ + char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n"; + int max = sizeof (stderr_buffer) - strlen (trailer) - 5; + if (strlen (s) > max) + strcpy (s + max, trailer); + /* Now show the user. */ + print_stderr (si, s); + } + + stderr_tail = stderr_buffer; + si->stderr_popup_timer = 0; +} + + +static void +stderr_callback (XtPointer closure, int *fd, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + char *s; + int left; + int size; + int read_this_time = 0; + + if (stderr_tail == 0) + stderr_tail = stderr_buffer; + + left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer)); + + s = stderr_tail; + *s = 0; + + /* Read as much data from the fd as we can, up to our buffer size. */ + if (left > 0) + { + while ((size = read (*fd, (void *) s, left)) > 0) + { + left -= size; + s += size; + read_this_time += size; + } + *s = 0; + } + else + { + char buf2 [1024]; + /* The buffer is full; flush the rest of it. */ + while (read (*fd, (void *) buf2, sizeof (buf2)) > 0) + ; + } + + stderr_tail = s; + stderr_last_read = time ((time_t *) 0); + + /* Now we have read some data that we would like to put up in a dialog + box. But more data may still be coming in - so don't pop up the + dialog right now, but instead, start a timer that will pop it up + a second from now. Should more data come in in the meantime, we + will be called again, and will reset that timer again. So the + dialog will only pop up when a second has elapsed with no new data + being written to stderr. + + However, if the buffer is full (meaning lots of data has been written) + then we don't reset the timer. + */ + if (read_this_time > 0) + { + if (si->stderr_popup_timer) + XtRemoveTimeOut (si->stderr_popup_timer); + + si->stderr_popup_timer = + XtAppAddTimeOut (si->app, 1 * 1000, stderr_popup_timer_fn, + (XtPointer) si); + } +} + +void +initialize_stderr (saver_info *si) +{ + static Boolean done = False; + int fds [2]; + int in, out; + int new_stdout, new_stderr; + int stdout_fd = 1; + int stderr_fd = 2; + int flags = 0; + Boolean stderr_dialog_p, stdout_dialog_p; + + if (done) return; + done = True; + + stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean"); + stdout_dialog_p = get_boolean_resource ("captureStdout", "Boolean"); + + if (!stderr_dialog_p && !stdout_dialog_p) + return; + + real_stderr = stderr; + real_stdout = stdout; + + if (pipe (fds)) + { + perror ("error creating pipe:"); + return; + } + + in = fds [0]; + out = fds [1]; + +# ifdef HAVE_FCNTL + +# if defined(O_NONBLOCK) + flags = O_NONBLOCK; +# elif defined(O_NDELAY) + flags = O_NDELAY; +# else + ERROR!! neither O_NONBLOCK nor O_NDELAY are defined. +# endif + + /* Set both sides of the pipe to nonblocking - this is so that + our reads (in stderr_callback) will terminate, and so that + out writes (in the client programs) will silently fail when + the pipe is full, instead of hosing the program. */ + if (fcntl (in, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } + if (fcntl (out, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } + +# endif /* !HAVE_FCNTL */ + + if (stderr_dialog_p) + { + FILE *new_stderr_file; + new_stderr = dup (stderr_fd); + if (new_stderr < 0) + { + perror ("could not dup() a stderr:"); + return; + } + if (! (new_stderr_file = fdopen (new_stderr, "w"))) + { + perror ("could not fdopen() the new stderr:"); + return; + } + real_stderr = new_stderr_file; + + close (stderr_fd); + if (dup2 (out, stderr_fd) < 0) + { + perror ("could not dup() a new stderr:"); + return; + } + } + + if (stdout_dialog_p) + { + FILE *new_stdout_file; + new_stdout = dup (stdout_fd); + if (new_stdout < 0) + { + perror ("could not dup() a stdout:"); + return; + } + if (! (new_stdout_file = fdopen (new_stdout, "w"))) + { + perror ("could not fdopen() the new stdout:"); + return; + } + real_stdout = new_stdout_file; + + close (stdout_fd); + if (dup2 (out, stdout_fd) < 0) + { + perror ("could not dup() a new stdout:"); + return; + } + } + + XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback, + (XtPointer) si); +} diff --git a/driver/subprocs.c b/driver/subprocs.c new file mode 100644 index 00000000..50dd82b8 --- /dev/null +++ b/driver/subprocs.c @@ -0,0 +1,1084 @@ +/* subprocs.c --- choosing, spawning, and killing screenhacks. + * xscreensaver, Copyright (c) 1991, 1992, 1993, 1995, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include /* not used for much... */ + +#ifndef ESRCH +#include +#endif + +#include /* sys/resource.h needs this for timeval */ + +#ifndef VMS + +# include /* for setpriority() and PRIO_PROCESS */ +# include /* for waitpid() and associated macros */ + +#else /* VMS */ + +# if __DECC_VER >= 50200000 +# include +# endif + +# include +# include /* for close */ +# include /* for getpid */ +# define pid_t int +# define fork vfork + +#endif /* VMS */ + +#include /* for the signal names */ + +#ifndef NO_SETUID +#include /* for getpwnam() and struct passwd */ +#include /* for getgrgid() and struct group */ +#endif /* NO_SETUID */ + +#if !defined(SIGCHLD) && defined(SIGCLD) +#define SIGCHLD SIGCLD +#endif + +#ifdef HAVE_PUTENV +extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */ +#endif +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ + +/* This file doesn't need the Xt headers, so stub these types out... */ +#undef XtPointer +#define XtAppContext void* +#define XrmDatabase void* +#define XtIntervalId void* +#define XtPointer void* +#define Widget void* + +#include "xscreensaver.h" +#include "yarandom.h" + + +extern saver_info *global_si_kludge; /* I hate C so much... */ + +static void hack_environment (saver_screen_info *ssi); + + +static void +nice_subproc (int nice_level) +{ + if (nice_level == 0) + return; + +#if defined(HAVE_NICE) + { + int old_nice = nice (0); + int n = nice_level - old_nice; + errno = 0; + if (nice (n) == -1 && errno != 0) + { + char buf [512]; + sprintf (buf, "%s: nice(%d) failed", progname, n); + perror (buf); + } + } +#elif defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS) + if (setpriority (PRIO_PROCESS, getpid(), nice_level) != 0) + { + char buf [512]; + sprintf (buf, "%s: setpriority(PRIO_PROCESS, %lu, %d) failed", + progname, (unsigned long) getpid(), nice_level); + perror (buf); + } +#else + fprintf (stderr, + "%s: don't know how to change process priority on this system.\n", + progname); + +#endif +} + + +#ifndef VMS + +static void +exec_simple_command (const char *command) +{ + char *av[1024]; + int ac = 0; + char *token = strtok (strdup(command), " \t"); + while (token) + { + av[ac++] = token; + token = strtok(0, " \t"); + } + av[ac] = 0; + + execvp (av[0], av); /* shouldn't return. */ + + { + char buf [512]; + sprintf (buf, "%s: could not execute \"%s\"", progname, av[0]); + perror (buf); + + if (errno == ENOENT && + (token = getenv("PATH"))) + { +# ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 2048 +# endif +# endif + char path[PATH_MAX]; + fprintf (stderr, "\n"); + *path = 0; +# if defined(HAVE_GETCWD) + getcwd (path, sizeof(path)); +# elif defined(HAVE_GETWD) + getwd (path); +# endif + if (*path) + fprintf (stderr, " Current directory is: %s\n", path); + fprintf (stderr, " PATH is:\n"); + token = strtok (strdup(token), ":"); + while (token) + { + fprintf (stderr, " %s\n", token); + token = strtok(0, ":"); + } + fprintf (stderr, "\n"); + } + } + fflush(stderr); + fflush(stdout); + exit (1); /* Note that this only exits a child fork. */ +} + + +static void +exec_complex_command (const char *shell, const char *command) +{ + char *av[5]; + int ac = 0; + char *command2 = (char *) malloc (strlen (command) + 6); + memcpy (command2, "exec ", 5); + memcpy (command2 + 5, command, strlen (command) + 1); + + /* Invoke the shell as "/bin/sh -c 'exec prog -arg -arg ...'" */ + av [ac++] = (char *) shell; + av [ac++] = "-c"; + av [ac++] = command2; + av [ac] = 0; + + execvp (av[0], av); /* shouldn't return. */ + + { + char buf [512]; + sprintf (buf, "%s: execvp(\"%s\") failed", progname, av[0]); + perror (buf); + fflush(stderr); + fflush(stdout); + exit (1); /* Note that this only exits a child fork. */ + } +} + +#else /* VMS */ + +static void +exec_vms_command (const char *command) +{ + system (command); + fflush (stderr); + fflush (stdout); + exit (1); /* Note that this only exits a child fork. */ +} + +#endif /* !VMS */ + + +static void +exec_screenhack (saver_info *si, const char *command) +{ + /* I don't believe what a sorry excuse for an operating system UNIX is! + + - I want to spawn a process. + - I want to know it's pid so that I can kill it. + - I would like to receive a message when it dies of natural causes. + - I want the spawned process to have user-specified arguments. + + If shell metacharacters are present (wildcards, backquotes, etc), the + only way to parse those arguments is to run a shell to do the parsing + for you. + + And the only way to know the pid of the process is to fork() and exec() + it in the spawned side of the fork. + + But if you're running a shell to parse your arguments, this gives you + the pid of the *shell*, not the pid of the *process* that you're + actually interested in, which is an *inferior* of the shell. This also + means that the SIGCHLD you get applies to the shell, not its inferior. + (Why isn't that sufficient? I don't remember any more, but it turns + out that it isn't.) + + So, the only solution, when metacharacters are present, is to force the + shell to exec() its inferior. What a fucking hack! We prepend "exec " + to the command string, and hope it doesn't contain unquoted semicolons + or ampersands (we don't search for them, because we don't want to + prohibit their use in quoted strings (messages, for example) and parsing + out the various quote characters is too much of a pain.) + + (Actually, Clint Wong points out that process groups + might be used to take care of this problem; this may be worth considering + some day, except that, 1: this code works now, so why fix it, and 2: from + what I've seen in Emacs, dealing with process groups isn't especially + portable.) + */ + saver_preferences *p = &si->prefs; + +#ifndef VMS + Bool hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\""); + + if (p->verbose_p) + printf ("%s: spawning \"%s\" in pid %lu%s.\n", + progname, command, (unsigned long) getpid (), + (hairy_p ? " (via shell)" : "")); + + if (hairy_p) + /* If it contains any shell metacharacters, do it the hard way, + and fork a shell to parse the arguments for us. */ + exec_complex_command (p->shell, command); + else + /* Otherwise, we can just exec the program directly. */ + exec_simple_command (command); + +#else /* VMS */ + if (p->verbose_p) + printf ("%s: spawning \"%s\" in pid %lu.\n", progname, command, getpid()); + exec_vms_command (command); +#endif /* VMS */ + + abort(); /* that shouldn't have returned. */ +} + + + +/* Management of child processes, and de-zombification. + */ + +enum job_status { + job_running, /* the process is still alive */ + job_stopped, /* we have sent it a STOP signal */ + job_killed, /* we have sent it a TERM signal */ + job_dead /* we have wait()ed for it, and it's dead -- this state only + occurs so that we can avoid calling free() from a signal + handler. Shortly after going into this state, the list + element will be removed. */ +}; + +struct screenhack_job { + char *name; + pid_t pid; + enum job_status status; + struct screenhack_job *next; +}; + +static struct screenhack_job *jobs = 0; + +#ifdef DEBUG +static void +show_job_list (void) +{ + struct screenhack_job *job; + fprintf(stderr, "%s: job list:\n", progname); + for (job = jobs; job; job = job->next) + fprintf (stderr, " %5ld: (%s) %s\n", + (long) job->pid, + (job->status == job_running ? "running" : + job->status == job_stopped ? "stopped" : + job->status == job_killed ? " killed" : + job->status == job_dead ? " dead" : " ???"), + job->name); + fprintf (stderr, "\n"); +} +#endif + + +static void clean_job_list (void); + +static struct screenhack_job * +make_job (pid_t pid, const char *cmd) +{ + struct screenhack_job *job = (struct screenhack_job *) malloc (sizeof(*job)); + + static char name [1024]; + const char *in = cmd; + char *out = name; + + clean_job_list(); + + while (isspace(*in)) in++; /* skip whitespace */ + while (!isspace(*in) && *in != ':') + *out++ = *in++; /* snarf first token */ + while (isspace(*in)) in++; /* skip whitespace */ + if (*in == ':') /* token was a visual name; skip it. */ + { + in++; + out = name; + while (isspace(*in)) in++; /* skip whitespace */ + while (!isspace(*in)) *out++ = *in++; /* snarf first token */ + } + *out = 0; + + job->name = strdup(name); + job->pid = pid; + job->status = job_running; + job->next = jobs; + jobs = job; + + return jobs; +} + + +static void +free_job (struct screenhack_job *job) +{ + if (!job) + return; + else if (job == jobs) + jobs = jobs->next; + else + { + struct screenhack_job *job2, *prev; + for (prev = 0, job2 = jobs; + job2; + prev = job2, job2 = job2->next) + if (job2 == job) + { + prev->next = job->next; + break; + } + } + free(job->name); + free(job); +} + + +/* Cleans out dead jobs from the jobs list -- this must only be called + from the main thread, not from a signal handler. + */ +static void +clean_job_list (void) +{ + struct screenhack_job *job, *prev, *next; + for (prev = 0, job = jobs, next = (job ? job->next : 0); + job; + prev = job, job = next, next = (job ? job->next : 0)) + { + if (job->status == job_dead) + { + if (prev) + prev->next = next; + free_job (job); + job = prev; + } + } +} + + +static struct screenhack_job * +find_job (pid_t pid) +{ + struct screenhack_job *job; + for (job = jobs; job; job = job->next) + if (job->pid == pid) + return job; + return 0; +} + +static void await_dying_children (saver_info *si); +#ifndef VMS +static void describe_dead_child (saver_info *, pid_t, int wait_status); +#endif + + +/* Semaphore to temporarily turn the SIGCHLD handler into a no-op. */ +static int block_sigchld_handler = 0; + +static int +kill_job (saver_info *si, pid_t pid, int signal) +{ + saver_preferences *p = &si->prefs; + struct screenhack_job *job; + int status = -1; + + clean_job_list(); + + if (block_sigchld_handler) + /* This function should not be called from the signal handler. */ + abort(); + + block_sigchld_handler++; /* we control the horizontal... */ + + job = find_job (pid); + if (!job || + !job->pid || + job->status == job_killed) + { + if (p->verbose_p) + fprintf (stderr, "%s: no child %ld to signal!\n", + progname, (long) pid); + goto DONE; + } + + switch (signal) { + case SIGTERM: job->status = job_killed; break; +#ifdef SIGSTOP + /* #### there must be a way to do this on VMS... */ + case SIGSTOP: job->status = job_stopped; break; + case SIGCONT: job->status = job_running; break; +#endif /* SIGSTOP */ + default: abort(); + } + +#ifdef SIGSTOP + if (p->verbose_p) + fprintf (stderr, "%s: %s pid %lu.\n", progname, + (signal == SIGTERM ? "killing" : + signal == SIGSTOP ? "suspending" : + signal == SIGCONT ? "resuming" : "signalling"), + (unsigned long) job->pid); +#else /* !SIGSTOP */ + if (p->verbose_p) + fprintf (stderr, "%s: %s pid %lu.\n", progname, "killing", + (unsigned long) job->pid); +#endif /* !SIGSTOP */ + + status = kill (job->pid, signal); + + if (p->verbose_p && status < 0) + { + if (errno == ESRCH) + fprintf (stderr, "%s: child process %lu (%s) was already dead.\n", + progname, job->pid, job->name); + else + { + char buf [1024]; + sprintf (buf, "%s: couldn't kill child process %lu (%s)", + progname, job->pid, job->name); + perror (buf); + } + } + + await_dying_children (si); + + DONE: + block_sigchld_handler--; + if (block_sigchld_handler < 0) + abort(); + + clean_job_list(); + return status; +} + + +#ifdef SIGCHLD +static RETSIGTYPE +sigchld_handler (int sig) +{ + saver_info *si = global_si_kludge; /* I hate C so much... */ + +#ifdef DEBUG + if (si->prefs.debug_p) + fprintf(stderr, "%s: got SIGCHLD%s\n", progname, + (block_sigchld_handler ? " (blocked)" : "")); +#endif + + if (block_sigchld_handler < 0) + abort(); + else if (block_sigchld_handler == 0) + { + block_sigchld_handler++; + await_dying_children (si); + block_sigchld_handler--; + } + + init_sigchld(); +} +#endif + + +#ifndef VMS +static void +await_dying_children (saver_info *si) +{ + while (1) + { + int wait_status = 0; + pid_t kid; + + errno = 0; + kid = waitpid (-1, &wait_status, WNOHANG|WUNTRACED); +#ifdef DEBUG + if (si->prefs.debug_p) + if (kid < 0 && errno) + fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", progname, + (long) kid, errno); + else + fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", progname, (long) kid); +#endif + + /* 0 means no more children to reap. + -1 means error -- except "interrupted system call" isn't a "real" + error, so if we get that, we should just try again. */ + if (kid == 0 || + (kid < 0 && errno != EINTR)) + break; + + describe_dead_child (si, kid, wait_status); + } +} + + +static void +describe_dead_child (saver_info *si, pid_t kid, int wait_status) +{ + int i; + saver_preferences *p = &si->prefs; + struct screenhack_job *job = find_job (kid); + const char *name = job ? job->name : ""; + + if (WIFEXITED (wait_status)) + { + int exit_status = WEXITSTATUS (wait_status); + + /* Treat exit code as a signed 8-bit quantity. */ + if (exit_status & 0x80) exit_status |= ~0xFF; + + /* One might assume that exiting with non-0 means something went wrong. + But that loser xswarm exits with the code that it was killed with, so + it *always* exits abnormally. Treat abnormal exits as "normal" (don't + mention them) if we've just killed the subprocess. But mention them + if they happen on their own. + */ + if (!job || + (exit_status != 0 && + (p->verbose_p || job->status != job_killed))) + fprintf (stderr, + "%s: child pid %lu (%s) exited abnormally (code %d).\n", + progname, (unsigned long) kid, name, exit_status); + else if (p->verbose_p) + printf ("%s: child pid %lu (%s) exited normally.\n", + progname, (unsigned long) kid, name); + + if (job) + job->status = job_dead; + } + else if (WIFSIGNALED (wait_status)) + { + if (p->verbose_p || + !job || + job->status != job_killed || + WTERMSIG (wait_status) != SIGTERM) + fprintf (stderr, "%s: child pid %lu (%s) terminated with %s.\n", + progname, (unsigned long) kid, name, + signal_name (WTERMSIG(wait_status))); + + if (job) + job->status = job_dead; + } + else if (WIFSTOPPED (wait_status)) + { + if (p->verbose_p) + fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n", + progname, (unsigned long) kid, name, + signal_name (WSTOPSIG (wait_status))); + + if (job) + job->status = job_stopped; + } + else + { + fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!", + progname, (unsigned long) kid, name); + if (job) + job->status = job_dead; + } + + /* Clear out the pid so that screenhack_running_p() knows it's dead. + */ + if (!job || job->status == job_dead) + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (kid == ssi->pid) + ssi->pid = 0; + } +} + +#else /* VMS */ +static void await_dying_children (saver_info *si) { return; } +#endif /* VMS */ + + +void +init_sigchld (void) +{ +#ifdef SIGCHLD + if (((long) signal (SIGCHLD, sigchld_handler)) == -1L) + { + char buf [255]; + sprintf (buf, "%s: couldn't catch SIGCHLD", progname); + perror (buf); + } +#endif +} + + + + + +static Bool +select_visual_of_hack (saver_screen_info *ssi, const char *hack) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + Bool selected; + static char vis [1024]; + const char *in = hack; + char *out = vis; + while (isspace(*in)) in++; /* skip whitespace */ + while (!isspace(*in) && *in != ':') + *out++ = *in++; /* snarf first token */ + while (isspace(*in)) in++; /* skip whitespace */ + *out = 0; + + if (*in == ':') + selected = select_visual(ssi, vis); + else + selected = select_visual(ssi, 0); + + if (!selected && (p->verbose_p || si->demo_mode_p)) + { + if (*in == ':') in++; + while (isspace(*in)) in++; + fprintf (stderr, + (si->demo_mode_p + ? "%s: warning, no \"%s\" visual for \"%s\".\n" + : "%s: no \"%s\" visual; skipping \"%s\".\n"), + progname, (vis ? vis : "???"), in); + } + + return selected; +} + + +static void +spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + raise_window (si, first_time_p, True, False); + XFlush (si->dpy); + + if (p->screenhacks_count || si->demo_mode_p) + { + char *hack; + pid_t forked; + char buf [255]; + int new_hack; + + if (si->demo_mode_p) + { + hack = si->demo_hack; + + /* Ignore visual-selection failure if in demo mode. */ + (void) select_visual_of_hack (ssi, hack); + } + else + { + int retry_count = 0; + + AGAIN: + if (p->screenhacks_count == 1) + new_hack = 0; + else if (si->next_mode_p == 1) + new_hack = (ssi->current_hack + 1) % p->screenhacks_count; + else if (si->next_mode_p == 2) + new_hack = ((ssi->current_hack + p->screenhacks_count - 1) + % p->screenhacks_count); + else + while ((new_hack = random () % p->screenhacks_count) + == ssi->current_hack) + ; + ssi->current_hack = new_hack; + hack = p->screenhacks[ssi->current_hack]; + + if (!select_visual_of_hack (ssi, hack)) + { + if (++retry_count > (p->screenhacks_count*4)) + { + /* Uh, oops. Odds are, there are no suitable visuals, + and we're looping. Give up. (This is totally lame, + what we should do is make a list of suitable hacks at + the beginning, then only loop over them.) + */ + if (p->verbose_p) + fprintf(stderr, + "%s: no suitable visuals for these programs.\n", + progname); + return; + } + else + goto AGAIN; + } + } + si->next_mode_p = 0; + + + /* If there's a visual description on the front of the command, nuke it. + */ + { + char *in = hack; + while (isspace(*in)) in++; /* skip whitespace */ + hack = in; + while (!isspace(*in) && *in != ':') in++; /* snarf first token */ + while (isspace(*in)) in++; /* skip whitespace */ + if (*in == ':') + { + in++; + while (isspace(*in)) in++; + hack = in; + } + } + + switch ((int) (forked = fork ())) + { + case -1: + sprintf (buf, "%s: couldn't fork", progname); + perror (buf); + restore_real_vroot (si); + saver_exit (si, 1); + + case 0: + close (ConnectionNumber (si->dpy)); /* close display fd */ + nice_subproc (p->nice_inferior); /* change process priority */ + hack_environment (ssi); /* set $DISPLAY */ + exec_screenhack (si, hack); /* this does not return */ + abort(); + break; + + default: + ssi->pid = forked; + (void) make_job (forked, hack); + break; + } + } +} + + +void +spawn_screenhack (saver_info *si, Bool first_time_p) +{ + int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + spawn_screenhack_1 (ssi, first_time_p); + } +} + + +void +kill_screenhack (saver_info *si) +{ + int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->pid) + kill_job (si, ssi->pid, SIGTERM); + ssi->pid = 0; + } +} + + +void +suspend_screenhack (saver_info *si, Bool suspend_p) +{ +#ifdef SIGSTOP /* older VMS doesn't have it... */ + int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->pid) + kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT)); + } +#endif /* SIGSTOP */ +} + + +/* Called when we're exiting abnormally, to kill off the subproc. */ +void +emergency_kill_subproc (saver_info *si) +{ + int i; +#ifdef SIGCHLD + signal (SIGCHLD, SIG_IGN); +#endif + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->pid) + { + kill_job (si, ssi->pid, SIGTERM); + ssi->pid = 0; + } + } +} + +Bool +screenhack_running_p (saver_info *si) +{ + Bool result = True; + int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (!ssi->pid) + result = False; + } + return result; +} + + +/* Restarting the xscreensaver process from scratch. */ + +static char **saved_argv; + +void +save_argv (int argc, char **argv) +{ + saved_argv = (char **) malloc ((argc + 2) * sizeof (char *)); + saved_argv [argc] = 0; + while (argc--) + { + int i = strlen (argv [argc]) + 1; + saved_argv [argc] = (char *) malloc (i); + memcpy (saved_argv [argc], argv [argc], i); + } +} + +void +restart_process (saver_info *si) +{ + fflush (real_stdout); + fflush (real_stderr); + execvp (saved_argv [0], saved_argv); /* shouldn't return */ + { + char buf [512]; + sprintf (buf, "%s: could not restart process", progname); + perror(buf); + fflush(stderr); + } +} + +/* Like restart_process(), but ensures that when it restarts, + it comes up in demo-mode. */ +void +demo_mode_restart_process (saver_info *si) +{ + int i; + for (i = 0; saved_argv [i]; i++); + /* add the -demo switch; save_argv() left room for this. */ + saved_argv [i] = "-demo"; + saved_argv [i+1] = 0; + restart_process (si); /* shouldn't return */ + saved_argv [i] = 0; + XBell(si->dpy, 0); +} + +static void +hack_environment (saver_screen_info *ssi) +{ + /* Store $DISPLAY into the environment, so that the $DISPLAY variable that + the spawned processes inherit is correct. First, it must be on the same + host and display as the value of -display passed in on our command line + (which is not necessarily the same as what our $DISPLAY variable is.) + Second, the screen number in the $DISPLAY passed to the subprocess should + be the screen on which this particular hack is running -- not the display + specification which the driver itself is using, since the driver ignores + its screen number and manages all existing screens. + */ + saver_info *si = ssi->global; + const char *odpy = DisplayString (si->dpy); + char *ndpy = (char *) malloc(strlen(odpy) + 20); + int screen_number; + char *s; + + for (screen_number = 0; screen_number < si->nscreens; screen_number++) + if (ssi == &si->screens[screen_number]) + break; + if (screen_number >= si->nscreens) abort(); + + strcpy (ndpy, "DISPLAY="); + s = ndpy + strlen(ndpy); + strcpy (s, odpy); + + while (*s && *s != ':') s++; /* skip to colon */ + while (*s == ':') s++; /* skip over colons */ + while (isdigit(*s)) s++; /* skip over dpy number */ + while (*s == '.') s++; /* skip over dot */ + if (s[-1] != '.') *s++ = '.'; /* put on a dot */ + sprintf(s, "%d", screen_number); /* put on screen number */ + + /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems + any more, right? It's not Posix, but everyone seems to have it. */ +#ifdef HAVE_PUTENV + if (putenv (ndpy)) + abort (); +#endif /* HAVE_PUTENV */ +} + + +/* Change the uid/gid of the screensaver process, so that it is safe for it + to run setuid root (which it needs to do on some systems to read the + encrypted passwords from the passwd file.) + + hack_uid() is run before opening the X connection, so that XAuth works. + hack_uid_warn() is called after the connection is opened and the command + line arguments are parsed, so that the messages from hack_uid() get + printed after we know whether we're in `verbose' mode. + */ + +#ifndef NO_SETUID + +static int hack_uid_errno; +static char hack_uid_buf [255], *hack_uid_error; + +void +hack_uid (saver_info *si) +{ + + /* If we've been run as setuid or setgid to someone else (most likely root) + turn off the extra permissions so that random user-specified programs + don't get special privileges. (On some systems it might be necessary + to install this as setuid root in order to read the passwd file to + implement lock-mode...) + */ + setgid (getgid ()); + setuid (getuid ()); + + hack_uid_errno = 0; + hack_uid_error = 0; + + /* If we're being run as root (as from xdm) then switch the user id + to something safe. */ + if (getuid () == 0) + { + struct passwd *p; + /* Locking can't work when running as root, because we have no way of + knowing what the user id of the logged in user is (so we don't know + whose password to prompt for.) + */ + si->locking_disabled_p = True; + si->nolock_reason = "running as root"; + p = getpwnam ("nobody"); + if (! p) p = getpwnam ("daemon"); + if (! p) p = getpwnam ("bin"); + if (! p) p = getpwnam ("sys"); + if (! p) + { + hack_uid_error = "couldn't find safe uid; running as root."; + hack_uid_errno = -1; + } + else + { + struct group *g = getgrgid (p->pw_gid); + hack_uid_error = hack_uid_buf; + sprintf (hack_uid_error, "changing uid/gid to %s/%s (%ld/%ld).", + p->pw_name, (g ? g->gr_name : "???"), + (long) p->pw_uid, (long) p->pw_gid); + + /* Change the gid to be a safe one. If we can't do that, then + print a warning. We change the gid before the uid so that we + change the gid while still root. */ + if (setgid (p->pw_gid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set gid to %s (%ld)", + (g ? g->gr_name : "???"), (long) p->pw_gid); + } + + /* Now change the uid to be a safe one. */ + if (setuid (p->pw_uid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set uid to %s (%ld)", + p->pw_name, (long) p->pw_uid); + } + } + } +#ifndef NO_LOCKING + else /* disable locking if already being run as "someone else" */ + { + struct passwd *p = getpwuid (getuid ()); + if (!p || + !strcmp (p->pw_name, "root") || + !strcmp (p->pw_name, "nobody") || + !strcmp (p->pw_name, "daemon") || + !strcmp (p->pw_name, "bin") || + !strcmp (p->pw_name, "sys")) + { + si->locking_disabled_p = True; + si->nolock_reason = hack_uid_buf; + sprintf (si->nolock_reason, "running as %s", p->pw_name); + } + } +#endif /* NO_LOCKING */ +} + +void +hack_uid_warn (saver_info *si) +{ + saver_preferences *p = &si->prefs; + + if (! hack_uid_error) + ; + else if (hack_uid_errno == 0) + { + if (p->verbose_p) + printf ("%s: %s\n", progname, hack_uid_error); + } + else + { + char buf [255]; + sprintf (buf, "%s: %s", progname, hack_uid_error); + if (hack_uid_errno == -1) + fprintf (stderr, "%s\n", buf); + else + { + errno = hack_uid_errno; + perror (buf); + } + } +} + +#endif /* !NO_SETUID */ diff --git a/driver/timers.c b/driver/timers.c new file mode 100644 index 00000000..92aa4b93 --- /dev/null +++ b/driver/timers.c @@ -0,0 +1,633 @@ +/* timers.c --- detecting when the user is idle, and other timer-related tasks. + * xscreensaver, Copyright (c) 1991-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* #define DEBUG_TIMERS */ + +#include +#include +#include +#include +#ifdef HAVE_XMU +# ifndef VMS +# include +# else /* VMS */ +# include +# endif /* VMS */ +# else /* !HAVE_XMU */ +# include "xmu.h" +#endif /* !HAVE_XMU */ + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_MIT_SAVER_EXTENSION +#include +#endif /* HAVE_MIT_SAVER_EXTENSION */ + +#ifdef HAVE_SGI_SAVER_EXTENSION +#include +#endif /* HAVE_SGI_SAVER_EXTENSION */ + +#ifdef HAVE_XHPDISABLERESET +# include + extern Bool hp_locked_p; /* from windows.c */ +#endif /* HAVE_XHPDISABLERESET */ + +#include "xscreensaver.h" + + +void +idle_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + + /* What an amazingly shitty design. Not only does Xt execute timeout + events from XtAppNextEvent() instead of from XtDispatchEvent(), but + there is no way to tell Xt to block until there is an X event OR a + timeout happens. Once your timeout proc is called, XtAppNextEvent() + still won't return until a "real" X event comes in. + + So this function pushes a stupid, gratuitous, unnecessary event back + on the event queue to force XtAppNextEvent to return Right Fucking Now. + When the code in sleep_until_idle() sees an event of type XAnyEvent, + which the server never generates, it knows that a timeout has occurred. + */ + XEvent fake_event; + fake_event.type = 0; /* XAnyEvent type, ignored. */ + fake_event.xany.display = si->dpy; + fake_event.xany.window = 0; + XPutBackEvent (si->dpy, &fake_event); +} + + +static void +notice_events (saver_info *si, Window window, Bool top_p) +{ + saver_preferences *p = &si->prefs; + XWindowAttributes attrs; + unsigned long events; + Window root, parent, *kids; + unsigned int nkids; + + if (XtWindowToWidget (si->dpy, window)) + /* If it's one of ours, don't mess up its event mask. */ + return; + + if (!XQueryTree (si->dpy, window, &root, &parent, &kids, &nkids)) + return; + if (window == root) + top_p = False; + + XGetWindowAttributes (si->dpy, window, &attrs); + events = ((attrs.all_event_masks | attrs.do_not_propagate_mask) + & KeyPressMask); + + /* Select for SubstructureNotify on all windows. + Select for KeyPress on all windows that already have it selected. + Do we need to select for ButtonRelease? I don't think so. + */ + XSelectInput (si->dpy, window, SubstructureNotifyMask | events); + + if (top_p && p->verbose_p && (events & KeyPressMask)) + { + /* Only mention one window per tree (hack hack). */ + printf ("%s: selected KeyPress on 0x%lX\n", progname, + (unsigned long) window); + top_p = False; + } + + if (kids) + { + while (nkids) + notice_events (si, kids [--nkids], top_p); + XFree ((char *) kids); + } +} + + +int +BadWindow_ehandler (Display *dpy, XErrorEvent *error) +{ + /* When we notice a window being created, we spawn a timer that waits + 30 seconds or so, and then selects events on that window. This error + handler is used so that we can cope with the fact that the window + may have been destroyed <30 seconds after it was created. + */ + if (error->error_code == BadWindow || + error->error_code == BadMatch || + error->error_code == BadDrawable) + return 0; + else + return saver_ehandler (dpy, error); +} + + +struct notice_events_timer_arg { + saver_info *si; + Window w; +}; + +static void +notice_events_timer (XtPointer closure, XtIntervalId *id) +{ + struct notice_events_timer_arg *arg = + (struct notice_events_timer_arg *) closure; + + XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); + + saver_info *si = arg->si; + Window window = arg->w; + + free(arg); + notice_events (si, window, True); + XSync (si->dpy, False); + XSetErrorHandler (old_handler); +} + +void +start_notice_events_timer (saver_info *si, Window w) +{ + saver_preferences *p = &si->prefs; + struct notice_events_timer_arg *arg = + (struct notice_events_timer_arg *) malloc(sizeof(*arg)); + arg->si = si; + arg->w = w; + XtAppAddTimeOut (si->app, p->notice_events_timeout, notice_events_timer, + (XtPointer) arg); +} + + +/* When the screensaver is active, this timer will periodically change + the running program. + */ +void +cycle_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; + Time how_long = p->cycle; + if (si->dbox_up_p) + { + if (p->verbose_p) + printf ("%s: dbox up; delaying hack change.\n", progname); + how_long = 30000; /* 30 secs */ + } + else + { + if (p->verbose_p) + printf ("%s: changing graphics hacks.\n", progname); + kill_screenhack (si); + spawn_screenhack (si, False); + } + si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer, + (XtPointer) si); + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: starting cycle_timer (%ld, %ld)\n", + progname, how_long, si->cycle_id); +#endif +} + + +void +activate_lock_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; + + if (p->verbose_p) + printf ("%s: timed out; activating lock\n", progname); + si->locked_p = True; + +#ifdef HAVE_XHPDISABLERESET + if (!hp_locked_p) + { + XHPDisableReset (si->dpy); /* turn off C-Sh-Reset */ + hp_locked_p = True; + } +#endif +} + + +/* Call this when user activity (or "simulated" activity) has been noticed. + */ +static void +reset_timers (saver_info *si) +{ + saver_preferences *p = &si->prefs; + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + return; + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: killing idle_timer (%ld, %ld)\n", + progname, p->timeout, si->timer_id); +#endif + XtRemoveTimeOut (si->timer_id); + si->timer_id = XtAppAddTimeOut (si->app, p->timeout, idle_timer, + (XtPointer) si); + if (si->cycle_id) abort (); + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: restarting idle_timer (%ld, %ld)\n", + progname, p->timeout, si->timer_id); +#endif + + si->last_activity_time = time ((time_t *) 0); +} + +/* When we aren't using a server extension, this timer is used to periodically + wake up and poll the mouse position, which is possibly more reliable than + selecting motion events on every window. + */ +static void +check_pointer_timer (XtPointer closure, XtIntervalId *id) +{ + int i; + saver_info *si = (saver_info *) closure; + saver_preferences *p = &si->prefs; + Bool active_p = False; + + if (p->use_xidle_extension || + p->use_mit_saver_extension || + p->use_sgi_saver_extension) + abort (); + + si->check_pointer_timer_id = + XtAppAddTimeOut (si->app, p->pointer_timeout, check_pointer_timer, + (XtPointer) si); + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + + XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child, + &root_x, &root_y, &x, &y, &mask); + + if (root_x == ssi->poll_mouse_last_root_x && + root_y == ssi->poll_mouse_last_root_y && + child == ssi->poll_mouse_last_child && + mask == ssi->poll_mouse_last_mask) + continue; + + active_p = True; + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + if (root_x == ssi->poll_mouse_last_root_x && + root_y == ssi->poll_mouse_last_root_y && + child == ssi->poll_mouse_last_child) + printf ("%s: modifiers changed at %s on screen %d.\n", + progname, timestring(), i); + else + printf ("%s: pointer moved at %s on screen %d.\n", + progname, timestring(), i); +#endif + + si->last_activity_screen = ssi; + ssi->poll_mouse_last_root_x = root_x; + ssi->poll_mouse_last_root_y = root_y; + ssi->poll_mouse_last_child = child; + ssi->poll_mouse_last_mask = mask; + } + + if (active_p) + reset_timers (si); +} + + +void +sleep_until_idle (saver_info *si, Bool until_idle_p) +{ + saver_preferences *p = &si->prefs; + XEvent event; + + if (until_idle_p) + { + if (!p->use_mit_saver_extension && !p->use_sgi_saver_extension) + { + /* Wake up periodically to ask the server if we are idle. */ + si->timer_id = XtAppAddTimeOut (si->app, p->timeout, idle_timer, + (XtPointer) si); +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, p->timeout, si->timer_id); +#endif + } + + if (!p->use_xidle_extension && + !p->use_mit_saver_extension && + !p->use_sgi_saver_extension) + /* start polling the mouse position */ + check_pointer_timer ((XtPointer) si, 0); + } + + while (1) + { + XtAppNextEvent (si->app, &event); + + switch (event.xany.type) { + case 0: /* our synthetic "timeout" event has been signalled */ + if (until_idle_p) + { + Time idle; +#ifdef HAVE_XIDLE_EXTENSION + if (p->use_xidle_extension) + { + if (! XGetIdleTime (si->dpy, &idle)) + { + fprintf (stderr, "%s: XGetIdleTime() failed.\n", progname); + saver_exit (si, 1); + } + } + else +#endif /* HAVE_XIDLE_EXTENSION */ +#ifdef HAVE_MIT_SAVER_EXTENSION + if (p->use_mit_saver_extension) + { + /* We don't need to do anything in this case - the synthetic + event isn't necessary, as we get sent specific events + to wake us up. */ + idle = 0; + } + else +#endif /* HAVE_MIT_SAVER_EXTENSION */ +#ifdef HAVE_SGI_SAVER_EXTENSION + if (p->use_sgi_saver_extension) + { + /* We don't need to do anything in this case - the synthetic + event isn't necessary, as we get sent specific events + to wake us up. */ + idle = 0; + } + else +#endif /* HAVE_SGI_SAVER_EXTENSION */ + { + idle = 1000 * (si->last_activity_time - time ((time_t *) 0)); + } + + if (idle >= p->timeout) + goto DONE; + else if (!p->use_mit_saver_extension && + !p->use_sgi_saver_extension) + { + si->timer_id = XtAppAddTimeOut (si->app, p->timeout - idle, + idle_timer, (XtPointer) si); +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, p->timeout - idle, si->timer_id); +#endif /* DEBUG_TIMERS */ + } + } + break; + + case ClientMessage: + if (handle_clientmessage (si, &event, until_idle_p)) + goto DONE; + break; + + case CreateNotify: + if (!p->use_xidle_extension && + !p->use_mit_saver_extension && + !p->use_sgi_saver_extension) + { + start_notice_events_timer (si, event.xcreatewindow.window); +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", + progname, + (unsigned int) event.xcreatewindow.window, + p->notice_events_timeout); +#endif /* DEBUG_TIMERS */ + } + break; + + case KeyPress: + case KeyRelease: + case ButtonPress: + case ButtonRelease: + case MotionNotify: + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + { + if (event.xany.type == MotionNotify) + printf ("%s: MotionNotify at %s\n", progname, timestring ()); + else if (event.xany.type == KeyPress) + printf ("%s: KeyPress seen on 0x%X at %s\n", progname, + (unsigned int) event.xkey.window, timestring ()); + } +#endif + + /* We got a user event */ + if (!until_idle_p) + goto DONE; + else + reset_timers (si); + break; + + default: + +#ifdef HAVE_MIT_SAVER_EXTENSION + if (event.type == si->mit_saver_ext_event_number) + { + XScreenSaverNotifyEvent *sevent = + (XScreenSaverNotifyEvent *) &event; + if (sevent->state == ScreenSaverOn) + { +# ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: ScreenSaverOn event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + + /* Get the "real" server window(s) out of the way as soon + as possible. */ + int i = 0; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->server_mit_saver_window && + window_exists_p (si->dpy, + ssi->server_mit_saver_window)) + XUnmapWindow (si->dpy, ssi->server_mit_saver_window); + } + + if (sevent->kind != ScreenSaverExternal) + { +# ifdef DEBUG_TIMERS + fprintf (stderr, + "%s: ScreenSaverOn event wasn't of type External!\n", + progname); +# endif /* DEBUG_TIMERS */ + } + + if (until_idle_p) + goto DONE; + } + else if (sevent->state == ScreenSaverOff) + { +# ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: ScreenSaverOff event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + if (!until_idle_p) + goto DONE; + } +# ifdef DEBUG_TIMERS + else if (p->verbose_p) + printf ("%s: unknown MIT-SCREEN-SAVER event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + } + else + +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + +#ifdef HAVE_SGI_SAVER_EXTENSION + if (event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart)) + { +# ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: ScreenSaverStart event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + + if (until_idle_p) + goto DONE; + } + else if (event.type == (si->sgi_saver_ext_event_number + + ScreenSaverEnd)) + { +# ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: ScreenSaverEnd event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + if (!until_idle_p) + goto DONE; + } + else +#endif /* HAVE_SGI_SAVER_EXTENSION */ + + XtDispatchEvent (&event); + } + } + DONE: + + + /* If there's a user event on the queue, swallow it. + If we're using a server extension, and the user becomes active, we + get the extension event before the user event -- so the keypress or + motion or whatever is still on the queue. This makes "unfade" not + work, because it sees that event, and bugs out. (This problem + doesn't exhibit itself without an extension, because in that case, + there's only one event generated by user activity, not two.) + */ + XCheckMaskEvent (si->dpy, (KeyPressMask|ButtonPressMask|PointerMotionMask), + &event); + + + if (si->check_pointer_timer_id) + { + XtRemoveTimeOut (si->check_pointer_timer_id); + si->check_pointer_timer_id = 0; + } + if (si->timer_id) + { + XtRemoveTimeOut (si->timer_id); + si->timer_id = 0; + } + + if (until_idle_p && si->cycle_id) + abort (); + + return; +} + + +/* This timer goes off every few minutes, whether the user is idle or not, + to try and clean up anything that has gone wrong. + + It calls disable_builtin_screensaver() so that if xset has been used, + or some other program (like xlock) has messed with the XSetScreenSaver() + settings, they will be set back to sensible values (if a server extension + is in use, messing with xlock can cause xscreensaver to never get a wakeup + event, and could cause monitor power-saving to occur, and all manner of + heinousness.) + + If the screen is currently blanked, it raises the window, in case some + other window has been mapped on top of it. + + If the screen is currently blanked, and there is no hack running, it + clears the window, in case there is an error message printed on it (we + don't want the error message to burn in.) + */ + +static void +watchdog_timer (XtPointer closure, XtIntervalId *id) +{ + saver_info *si = (saver_info *) closure; + if (!si->demo_mode_p) + { + disable_builtin_screensaver (si, False); + if (si->screen_blanked_p) + { + Bool running_p = screenhack_running_p(si); +#ifdef DEBUG_TIMERS + if (si->prefs.verbose_p) + printf ("%s: watchdog timer raising %sscreen.\n", + progname, (running_p ? "" : "and clearing ")); +#endif + raise_window (si, True, True, running_p); + } + } +} + + +void +reset_watchdog_timer (saver_info *si, Bool on_p) +{ + saver_preferences *p = &si->prefs; + + if (si->watchdog_id) + { + XtRemoveTimeOut (si->watchdog_id); + si->watchdog_id = 0; + } + + if (on_p && p->watchdog_timeout) + { + si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout, + watchdog_timer, (XtPointer) si); + +#ifdef DEBUG_TIMERS + if (p->verbose_p) + printf ("%s: restarting watchdog_timer (%ld, %ld)\n", + progname, p->watchdog_timeout, si->watchdog_id); +#endif + } +} diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c new file mode 100644 index 00000000..9408bb54 --- /dev/null +++ b/driver/vms-getpwnam.c @@ -0,0 +1,132 @@ +/* + * getpwnam(name) - retrieves a UAF entry + * + * Author: Patrick L. Mahan + * Location: TGV, Inc + * Date: 15-Nov-1991 + * + * Purpose: Provides emulation for the UNIX getpwname routine. + * + * Modification History + * + * Date | Who | Version | Reason + * ------------+-----------+---------------+--------------------------- + * 15-Nov-1991 | PLM | 1.0 | First Write + */ + +#define PASSWDROUTINES + +#include +#include +#include +#include +#include +#include +#include "vms-pwd.h" + +struct uic { + unsigned short uid; + unsigned short gid; +}; + +#define TEST(ptr, str) { if (ptr == NULL) { \ + fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \ + str); \ + return ((struct passwd *)(NULL)); \ + } } + +struct passwd *getpwnam(name) +char *name; +{ + int istatus; + int UserNameLen; + int UserOwnerLen; + int UserDeviceLen; + int UserDirLen; + static char UserName[13]; + static char UserOwner[32]; + static char UserDevice[32]; + static char UserDir[64]; + char *cptr, *sptr; + unsigned long int UserPwd[2]; + unsigned short int UserSalt; + unsigned long int UserEncrypt; + struct uic UicValue; + struct passwd *entry; + + struct dsc$descriptor_s VMSNAME = + {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name}; + + struct itmlist3 { + unsigned short int length; + unsigned short int item; + unsigned long int addr; + unsigned long int retaddr; + } ItemList[] = { + {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen}, + {8, UAI$_PWD, (unsigned long)&UserPwd, 0}, + {4, UAI$_UIC, (unsigned long)&UicValue, 0}, + {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen}, + {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen}, + {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen}, + {2, UAI$_SALT, (unsigned long)&UserSalt, 0}, + {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0}, + {0, 0, 0, 0} + }; + + UserNameLen = 0; + istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0); + + if (!(istatus & 1)) { +#ifdef DEBUG + lib$signal(istatus); +#endif /* DEBUG */ + fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n", + name); + fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus); + return ((struct passwd *)NULL); + } + + entry = (struct passwd *) calloc (1, sizeof(struct passwd)); + TEST(entry, "PASSWD_ENTRY"); + + entry->pw_uid = UicValue.uid; + entry->pw_gid = UicValue.gid; + entry->pw_salt = UserSalt; + entry->pw_encrypt = UserEncrypt; + + sptr = UserName; + cptr = calloc (UserNameLen+1, sizeof(char)); + TEST(cptr, "USERNAME"); + strncpy (cptr, sptr, UserNameLen); + cptr[UserNameLen] = '\0'; + entry->pw_name = cptr; + + cptr = calloc(8, sizeof(char)); + TEST(cptr, "PASSWORD"); + memcpy(cptr, UserPwd, 8); + entry->pw_passwd = cptr; + + sptr = UserOwner; sptr++; + cptr = calloc ((int)UserOwner[0]+1, sizeof(char)); + TEST(cptr, "FULLNAME"); + strncpy (cptr, sptr, (int)UserOwner[0]); + cptr[(int)UserOwner[0]] = '\0'; + entry->pw_gecos = cptr; + + cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char)); + TEST(cptr, "HOME"); + sptr = UserDevice; sptr++; + strncpy (cptr, sptr, (int)UserDevice[0]); + sptr = UserDir; sptr++; + strncat (cptr, sptr, (int)UserDir[0]); + cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0'; + entry->pw_dir = cptr; + + cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char)); + TEST(cptr,"SHELL"); + strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE"); + entry->pw_shell = cptr; + + return (entry); +} diff --git a/driver/vms-hpwd.c b/driver/vms-hpwd.c new file mode 100644 index 00000000..707e3ea5 --- /dev/null +++ b/driver/vms-hpwd.c @@ -0,0 +1,75 @@ +/* + * VAX/VMS Password hashing routines: + * + * uses the System Service SYS$HASH_PASSWORD + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + */ + +#include +#include +#include +#include +/* + * Hashing routine + */ +hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt) +char *output_buf; +char *input_buf; +int input_length; +char *username; +int encryption_type; +unsigned short salt; +{ + struct dsc$descriptor_s password; + struct dsc$descriptor_s user; + + /* + * Check the VMS Version. If this is V5.4 or later, then + * we can use the new system service SYS$HASH_PASSWORD. Else + * fail and return garbage. + */ + + static char VMS_Version[32]; + struct { + unsigned short int Size; + unsigned short int Code; + char *Buffer; + unsigned short int *Resultant_Size; + } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0}; + struct {int Size; char *Ptr;} Descr1; + + /* + * Get the information + */ + sys$getsyiw(0,0,0,Item_List,0,0,0); + /* + * Call the old routine if this isn't V5.4 or later... + */ +#ifndef __DECC + if ((VMS_Version[1] < '5') || + ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) { + printf("Unsupported OS version\n"); + return(1); + } +#endif /* !__DECC */ + /* + * Call the SYS$HASH_PASSWORD system service... + */ + password.dsc$b_dtype = DSC$K_DTYPE_T; + password.dsc$b_class = DSC$K_CLASS_S; + password.dsc$w_length = input_length; + password.dsc$a_pointer = input_buf; + user.dsc$b_dtype = DSC$K_DTYPE_T; + user.dsc$b_class = DSC$K_CLASS_S; + user.dsc$w_length = strlen(username); + user.dsc$a_pointer = username; + sys$hash_password (&password, encryption_type, salt, &user, output_buf); +} diff --git a/driver/vms-pwd.h b/driver/vms-pwd.h new file mode 100644 index 00000000..6cb73d3e --- /dev/null +++ b/driver/vms-pwd.h @@ -0,0 +1,48 @@ +/* @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1 */ + +#ifndef __pwd_h +#define __pwd_h + +#ifdef vax11c +#include +#else +#include +#endif /* vax11c */ + +#ifdef PASSWDROUTINES +#define EXTERN +#else +#define EXTERN extern +#endif /* PASSWDROUTINES */ + +struct passwd { + char *pw_name; + char *pw_passwd; + int pw_uid; + int pw_gid; + short pw_salt; + int pw_encrypt; + char *pw_age; + char *pw_comment; + char *pw_gecos; + char *pw_dir; + char *pw_shell; +}; + + +#ifndef _POSIX_SOURCE +extern struct passwd *getpwent(); + +struct comment { + char *c_dept; + char *c_name; + char *c_acct; + char *c_bin; +}; + +#endif + +EXTERN struct passwd *getpwuid(/* uid_t uid */); +EXTERN struct passwd *getpwnam(/* char *name */); + +#endif /* !__pwd_h */ diff --git a/driver/vms-validate.c b/driver/vms-validate.c new file mode 100644 index 00000000..8f7141d6 --- /dev/null +++ b/driver/vms-validate.c @@ -0,0 +1,75 @@ +/* + * validate a password for a user + * + * 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. + */ + +/* + * Includes + */ +#include +#include +#include + +#include "vms-pwd.h" +int hash_vms_password(char *output_buf,char *input_buf,int input_length, + char *username,int encryption_type,unsigned short salt); + +/* + * + * Validate a VMS UserName/Password pair. + * + */ + +int validate_user(name,password) +char *name; +char *password; +{ + char password_buf[64]; + char username_buf[31]; + char encrypt_buf[8]; + register int i; + register char *cp,*cp1; + struct passwd *user_entry; + + /* + * Get the users UAF entry + */ + user_entry = getpwnam(name); + + /* + * If user_entry == NULL then we got a bad error + * return -1 to indicate a bad error + */ + if (user_entry == NULL) return (-1); + + /* + * Uppercase the password + */ + cp = password; + cp1 = password_buf; + while (*cp) + if (islower(*cp)) + *cp1++ = toupper(*cp++); + else + *cp1++ = *cp++; + /* + * Get the length of the password + */ + i = strlen(password); + /* + * Encrypt the password + */ + hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name, + user_entry->pw_encrypt, user_entry->pw_salt); + if (memcmp(encrypt_buf,user_entry->pw_passwd,8) == 0) + return(1); + else return(0); +} + diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt new file mode 100644 index 00000000..04d465df --- /dev/null +++ b/driver/vms_axp.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt new file mode 100644 index 00000000..25dd1f18 --- /dev/null +++ b/driver/vms_axp_12.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt new file mode 100644 index 00000000..65bec033 --- /dev/null +++ b/driver/vms_decc.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt new file mode 100644 index 00000000..fdd9a802 --- /dev/null +++ b/driver/vms_decc_12.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/windows.c b/driver/windows.c new file mode 100644 index 00000000..7dabe9f1 --- /dev/null +++ b/driver/windows.c @@ -0,0 +1,1126 @@ +/* windows.c --- turning the screen black; dealing with visuals, virtual roots. + * xscreensaver, Copyright (c) 1991-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef VMS +# include /* for getpid() */ +# include "vms-gtod.h" /* for gettimeofday() */ +# if !defined(HAVE_UNAME) && (__VMS_VER >= 70000000) +# define HAVE_UNAME 1 +# endif /* !HAVE_UNAME */ +#endif /* VMS */ + +# ifdef HAVE_UNAME +# include /* for uname() */ +# endif /* HAVE_UNAME */ + +#include +#include /* for CARD32 */ +#include +#include /* for XSetClassHint() */ +#include +#include /* for time() */ +#include /* for the signal names */ + +#ifdef HAVE_MIT_SAVER_EXTENSION +# include +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + +#ifdef HAVE_XHPDISABLERESET +# include + + /* Calls to XHPDisableReset and XHPEnableReset must be balanced, + or BadAccess errors occur. (Ok for this to be global, since it + affects the whole machine, not just the current screen.) */ + Bool hp_locked_p = False; + +#endif /* HAVE_XHPDISABLERESET */ + + +/* This file doesn't need the Xt headers, so stub these types out... */ +#undef XtPointer +#define XtAppContext void* +#define XrmDatabase void* +#define XtIntervalId void* +#define XtPointer void* +#define Widget void* + +#include "xscreensaver.h" +#include "visual.h" +#include "fade.h" + +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ + +Atom XA_VROOT, XA_XSETROOT_ID; +Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; +Atom XA_SCREENSAVER_TIME; + + +extern saver_info *global_si_kludge; /* I hate C so much... */ + + +static void store_activate_time (saver_info *si, Bool use_last_p); + +#define ALL_POINTER_EVENTS \ + (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \ + LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \ + Button1MotionMask | Button2MotionMask | Button3MotionMask | \ + Button4MotionMask | Button5MotionMask | ButtonMotionMask) + +/* I don't really understand Sync vs Async, but these seem to work... */ +#define grab_kbd(dpy,win) \ + XGrabKeyboard ((dpy), (win), True, GrabModeSync, GrabModeAsync, CurrentTime) +#define grab_mouse(dpy,win,cursor) \ + XGrabPointer ((dpy), (win), True, ALL_POINTER_EVENTS, \ + GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime) + +void +grab_keyboard_and_mouse (Display *dpy, Window window, Cursor cursor) +{ + Status status; + XSync (dpy, False); + + status = grab_kbd (dpy, window); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_kbd (dpy, window); + if (status != GrabSuccess) + fprintf (stderr, "%s: couldn't grab keyboard! (%d)\n", + progname, status); + } + status = grab_mouse (dpy, window, cursor); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_mouse (dpy, window, cursor); + if (status != GrabSuccess) + fprintf (stderr, "%s: couldn't grab pointer! (%d)\n", + progname, status); + } +} + +void +ungrab_keyboard_and_mouse (Display *dpy) +{ + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); +} + + +void +ensure_no_screensaver_running (Display *dpy, Screen *screen) +{ + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler); + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + + if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &version) + == Success + && type != None) + { + char *id; + if (!XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &id) + == Success + || type == None) + id = "???"; + + fprintf (stderr, + "%s: already running on display %s (window 0x%x)\n from process %s.\n", + progname, DisplayString (dpy), (int) kids [i], id); + exit (1); + } + } + + if (kids) XFree ((char *) kids); + XSync (dpy, False); + XSetErrorHandler (old_handler); +} + + + +/* Virtual-root hackery */ + +#ifdef _VROOT_H_ +ERROR! You must not include vroot.h in this file. +#endif + +static void +store_vroot_property (Display *dpy, Window win, Window value) +{ +#if 0 + if (p->verbose_p) + fprintf (stderr, + "%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", progname, + win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???"))), + value, + (value == screensaver_window ? "ScreenSaver" : + (value == real_vroot ? "VRoot" : + (value == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &value, 1); +} + +static void +remove_vroot_property (Display *dpy, Window win) +{ +#if 0 + if (p->verbose_p) + fprintf (stderr, "%s: removing XA_VROOT from 0x%x (%s)\n", progname, win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XDeleteProperty (dpy, win, XA_VROOT); +} + + +static void +kill_xsetroot_data (Display *dpy, Window window, Bool verbose_p) +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + Pixmap *dataP = 0; + + /* If the user has been using xv or xsetroot as a screensaver (to display + an image on the screensaver window, as a kind of slideshow) then the + pixmap and its associated color cells have been put in RetainPermanent + CloseDown mode. Since we're not destroying the xscreensaver window, + but merely unmapping it, we need to free these resources or those + colormap cells will stay allocated while the screensaver is off. (We + could just delete the screensaver window and recreate it later, but + that could cause other problems.) This code does an atomic read-and- + delete of the _XSETROOT_ID property, and if it held a pixmap, then we + cause the RetainPermanent resources of the client which created it + (and which no longer exists) to be freed. + */ + if (XGetWindowProperty (dpy, window, XA_XSETROOT_ID, 0, 1, + True, AnyPropertyType, &type, &format, &nitems, + &bytesafter, (unsigned char **) &dataP) + == Success + && type != None) + { + if (dataP && *dataP && type == XA_PIXMAP && format == 32 && + nitems == 1 && bytesafter == 0) + { + if (verbose_p) + printf ("%s: destroying xsetroot data (0x%lX).\n", + progname, *dataP); + XKillClient (dpy, *dataP); + } + else + fprintf (stderr, "%s: deleted unrecognised _XSETROOT_ID property: \n\ + %lu, %lu; type: %lu, format: %d, nitems: %lu, bytesafter %ld\n", + progname, (unsigned long) dataP, (dataP ? *dataP : 0), type, + format, nitems, bytesafter); + } +} + + +static void handle_signals (saver_info *si, Bool on_p); + +static void +save_real_vroot (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + Display *dpy = si->dpy; + Screen *screen = ssi->screen; + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + + ssi->real_vroot = 0; + ssi->real_vroot_value = 0; + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + Window *vrootP = 0; + + if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &vrootP) + != Success) + continue; + if (! vrootP) + continue; + if (ssi->real_vroot) + { + if (*vrootP == ssi->screensaver_window) abort (); + fprintf (stderr, + "%s: more than one virtual root window found (0x%x and 0x%x).\n", + progname, (int) ssi->real_vroot, (int) kids [i]); + exit (1); + } + ssi->real_vroot = kids [i]; + ssi->real_vroot_value = *vrootP; + } + + if (ssi->real_vroot) + { + handle_signals (si, True); + remove_vroot_property (si->dpy, ssi->real_vroot); + XSync (dpy, False); + } + + XFree ((char *) kids); +} + + +static Bool +restore_real_vroot_2 (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + if (p->verbose_p && ssi->real_vroot) + printf ("%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n", + progname, (unsigned long) ssi->real_vroot); + remove_vroot_property (si->dpy, ssi->screensaver_window); + if (ssi->real_vroot) + { + store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value); + ssi->real_vroot = 0; + ssi->real_vroot_value = 0; + /* make sure the property change gets there before this process + terminates! We might be doing this because we have intercepted + SIGTERM or something. */ + XSync (si->dpy, False); + return True; + } + return False; +} + +static Bool +restore_real_vroot_1 (saver_info *si) +{ + int i; + Bool did_any = False; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (restore_real_vroot_2 (ssi)) + did_any = True; + } + return did_any; +} + +void +restore_real_vroot (saver_info *si) +{ + if (restore_real_vroot_1 (si)) + handle_signals (si, False); +} + + +/* Signal hackery to ensure that the vroot doesn't get left in an + inconsistent state + */ + +const char * +signal_name(int signal) +{ + switch (signal) { + case SIGHUP: return "SIGHUP"; + case SIGINT: return "SIGINT"; + case SIGQUIT: return "SIGQUIT"; + case SIGILL: return "SIGILL"; + case SIGTRAP: return "SIGTRAP"; +#ifdef SIGABRT + case SIGABRT: return "SIGABRT"; +#endif + case SIGFPE: return "SIGFPE"; + case SIGKILL: return "SIGKILL"; + case SIGBUS: return "SIGBUS"; + case SIGSEGV: return "SIGSEGV"; + case SIGPIPE: return "SIGPIPE"; + case SIGALRM: return "SIGALRM"; + case SIGTERM: return "SIGTERM"; +#ifdef SIGSTOP + case SIGSTOP: return "SIGSTOP"; +#endif +#ifdef SIGCONT + case SIGCONT: return "SIGCONT"; +#endif +#ifdef SIGUSR1 + case SIGUSR1: return "SIGUSR1"; +#endif +#ifdef SIGUSR2 + case SIGUSR2: return "SIGUSR2"; +#endif +#ifdef SIGEMT + case SIGEMT: return "SIGEMT"; +#endif +#ifdef SIGSYS + case SIGSYS: return "SIGSYS"; +#endif +#ifdef SIGCHLD + case SIGCHLD: return "SIGCHLD"; +#endif +#ifdef SIGPWR + case SIGPWR: return "SIGPWR"; +#endif +#ifdef SIGWINCH + case SIGWINCH: return "SIGWINCH"; +#endif +#ifdef SIGURG + case SIGURG: return "SIGURG"; +#endif +#ifdef SIGIO + case SIGIO: return "SIGIO"; +#endif +#ifdef SIGVTALRM + case SIGVTALRM: return "SIGVTALRM"; +#endif +#ifdef SIGXCPU + case SIGXCPU: return "SIGXCPU"; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: return "SIGXFSZ"; +#endif +#ifdef SIGDANGER + case SIGDANGER: return "SIGDANGER"; +#endif + default: + { + static char buf[50]; + sprintf(buf, "signal %d\n", signal); + return buf; + } + } +} + + + +static RETSIGTYPE +restore_real_vroot_handler (int sig) +{ + saver_info *si = global_si_kludge; /* I hate C so much... */ + + signal (sig, SIG_DFL); + if (restore_real_vroot_1 (si)) + fprintf (real_stderr, "\n%s: %s intercepted, vroot restored.\n", + progname, signal_name(sig)); + kill (getpid (), sig); +} + +static void +catch_signal (saver_info *si, int sig, Bool on_p) +{ + if (! on_p) + signal (sig, SIG_DFL); + else + { + if (((long) signal (sig, restore_real_vroot_handler)) == -1L) + { + char buf [255]; + sprintf (buf, "%s: couldn't catch %s", progname, signal_name(sig)); + perror (buf); + saver_exit (si, 1); + } + } +} + +static void +handle_signals (saver_info *si, Bool on_p) +{ +#if 0 + if (on_p) printf ("handling signals\n"); + else printf ("unhandling signals\n"); +#endif + + catch_signal (si, SIGHUP, on_p); + catch_signal (si, SIGINT, on_p); + catch_signal (si, SIGQUIT, on_p); + catch_signal (si, SIGILL, on_p); + catch_signal (si, SIGTRAP, on_p); + catch_signal (si, SIGIOT, on_p); + catch_signal (si, SIGABRT, on_p); +#ifdef SIGEMT + catch_signal (si, SIGEMT, on_p); +#endif + catch_signal (si, SIGFPE, on_p); + catch_signal (si, SIGBUS, on_p); + catch_signal (si, SIGSEGV, on_p); +#ifdef SIGSYS + catch_signal (si, SIGSYS, on_p); +#endif + catch_signal (si, SIGTERM, on_p); +#ifdef SIGXCPU + catch_signal (si, SIGXCPU, on_p); +#endif +#ifdef SIGXFSZ + catch_signal (si, SIGXFSZ, on_p); +#endif +#ifdef SIGDANGER + catch_signal (si, SIGDANGER, on_p); +#endif +} + +void +saver_exit (saver_info *si, int status) +{ + saver_preferences *p = &si->prefs; + static Bool exiting = False; + Bool vrs; + + if (exiting) + exit(status); + + exiting = True; + + vrs = restore_real_vroot_1 (si); + emergency_kill_subproc (si); + + if (vrs && (p->verbose_p || status != 0)) + fprintf (real_stderr, "%s: vroot restored, exiting.\n", progname); + else if (p->verbose_p) + fprintf (real_stderr, "%s: no vroot to restore; exiting.\n", progname); + + fflush(real_stdout); + +#ifdef VMS /* on VMS, 1 is the "normal" exit code instead of 0. */ + if (status == 0) status = 1; + else if (status == 1) status = -1; +#endif + +#ifdef DEBUG + if (si->prefs.debug_p) + /* Do this to drop a core file, so that we can get a stack trace. */ + abort(); +#endif + + exit (status); +} + + +/* Managing the actual screensaver window */ + +Bool +window_exists_p (Display *dpy, Window window) +{ + XErrorHandler old_handler; + XWindowAttributes xgwa; + xgwa.screen = 0; + old_handler = XSetErrorHandler (BadWindow_ehandler); + XGetWindowAttributes (dpy, window, &xgwa); + XSync (dpy, False); + XSetErrorHandler (old_handler); + return (xgwa.screen != 0); +} + +static void +initialize_screensaver_window_1 (saver_screen_info *ssi) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + + /* This resets the screensaver window as fully as possible, since there's + no way of knowing what some random client may have done to us in the + meantime. We could just destroy and recreate the window, but that has + its own set of problems... + */ + XColor black; + XClassHint class_hints; + XSetWindowAttributes attrs; + unsigned long attrmask; + int width = WidthOfScreen (ssi->screen); + int height = HeightOfScreen (ssi->screen); + char id [2048]; + static Bool printed_visual_info = False; /* only print the message once. */ + + black.red = black.green = black.blue = 0; + + if (ssi->cmap == DefaultColormapOfScreen (ssi->screen)) + ssi->cmap = 0; + + if (p->install_cmap_p || + ssi->current_visual != DefaultVisualOfScreen (ssi->screen)) + { + if (! ssi->cmap) + { + ssi->cmap = XCreateColormap (si->dpy, RootWindowOfScreen (ssi->screen), + ssi->current_visual, AllocNone); + if (! XAllocColor (si->dpy, ssi->cmap, &black)) abort (); + ssi->black_pixel = black.pixel; + } + } + else + { + if (ssi->cmap) + { + XFreeColors (si->dpy, ssi->cmap, &ssi->black_pixel, 1, 0); + if (ssi->cmap != ssi->demo_cmap) + XFreeColormap (si->dpy, ssi->cmap); + } + ssi->cmap = DefaultColormapOfScreen (ssi->screen); + ssi->black_pixel = BlackPixelOfScreen (ssi->screen); + } + +#if 0 + if (cmap2) + { + XFreeColormap (si->dpy, cmap2); + cmap2 = 0; + } + + if (p->fade_p) + { + cmap2 = copy_colormap (si->screen, ssi->current_visual, ssi->cmap, 0); + if (! cmap2) + p->fade_p = p->unfade_p = 0; + } +#endif + + attrmask = (CWOverrideRedirect | CWEventMask | CWBackingStore | CWColormap | + CWBackPixel | CWBackingPixel | CWBorderPixel); + attrs.override_redirect = True; + + /* When use_mit_saver_extension or use_sgi_saver_extension is true, we won't + actually be reading these events during normal operation; but we still + need to see Button events for demo-mode to work properly. + */ + attrs.event_mask = (KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask); + + attrs.backing_store = NotUseful; + attrs.colormap = ssi->cmap; + attrs.background_pixel = ssi->black_pixel; + attrs.backing_pixel = ssi->black_pixel; + attrs.border_pixel = ssi->black_pixel; + +#ifdef DEBUG + if (p->debug_p) width = width / 2; +#endif /* DEBUG */ + + if (!p->verbose_p || printed_visual_info) + ; + else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen)) + { + fprintf (stderr, "%s: using default visual ", progname); + describe_visual (stderr, ssi->screen, ssi->current_visual); + } + else + { + fprintf (stderr, "%s: using visual: ", progname); + describe_visual (stderr, ssi->screen, ssi->current_visual); + fprintf (stderr, "%s: default visual: ", progname); + describe_visual (stderr, ssi->screen, + DefaultVisualOfScreen (ssi->screen)); + } + printed_visual_info = True; + +#ifdef HAVE_MIT_SAVER_EXTENSION + if (p->use_mit_saver_extension) + { + XScreenSaverInfo *info; + Window root = RootWindowOfScreen (ssi->screen); + +#if 0 + /* This call sets the server screensaver timeouts to what we think + they should be (based on the resources and args xscreensaver was + started with.) It's important that we do this to sync back up + with the server - if we have turned on prematurely, as by an + ACTIVATE ClientMessage, then the server may decide to activate + the screensaver while it's already active. That's ok for us, + since we would know to ignore that ScreenSaverActivate event, + but a side effect of this would be that the server would map its + saver window (which we then hide again right away) meaning that + the bits currently on the screen get blown away. Ugly. */ + + /* #### Ok, that doesn't work - when we tell the server that the + screensaver is "off" it sends us a Deactivate event, which is + sensible... but causes the saver to never come on. Hmm. */ + disable_builtin_screensaver (si, True); +#endif /* 0 */ + +#if 0 + /* #### The MIT-SCREEN-SAVER extension gives us access to the + window that the server itself uses for saving the screen. + However, using this window in any way, in particular, calling + XScreenSaverSetAttributes() as below, tends to make the X server + crash. So fuck it, let's try and get along without using it... + + It's also inconvenient to use this window because it doesn't + always exist (though the ID is constant.) So to use this + window, we'd have to reimplement the ACTIVATE ClientMessage to + tell the *server* to tell *us* to turn on, to cause the window + to get created at the right time. Gag. */ + XScreenSaverSetAttributes (si->dpy, root, + 0, 0, width, height, 0, + current_depth, InputOutput, visual, + attrmask, &attrs); + XSync (si->dpy, False); +#endif /* 0 */ + + info = XScreenSaverAllocInfo (); + XScreenSaverQueryInfo (si->dpy, root, info); + ssi->server_mit_saver_window = info->window; + if (! ssi->server_mit_saver_window) abort (); + XFree (info); + } +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + if (ssi->screensaver_window) + { + XWindowChanges changes; + unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth; + changes.x = 0; + changes.y = 0; + changes.width = width; + changes.height = height; + changes.border_width = 0; + + XConfigureWindow (si->dpy, ssi->screensaver_window, + changesmask, &changes); + XChangeWindowAttributes (si->dpy, ssi->screensaver_window, + attrmask, &attrs); + } + else + { + ssi->screensaver_window = + XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen), 0, 0, + width, height, 0, ssi->current_depth, InputOutput, + ssi->current_visual, attrmask, &attrs); + reset_stderr (ssi); + store_activate_time(si, True); + if (p->verbose_p) + fprintf (stderr, "%s: saver window is 0x%lx.\n", + progname, (unsigned long) ssi->screensaver_window); + } + +#ifdef HAVE_MIT_SAVER_EXTENSION + if (!p->use_mit_saver_extension || + window_exists_p (si->dpy, ssi->screensaver_window)) + /* When using the MIT-SCREEN-SAVER extension, the window pointed to + by screensaver_window only exists while the saver is active. + So we must be careful to only try and manipulate it while it + exists... + (#### The above comment would be true if the MIT extension actually + worked, but it's not true today -- see `server_mit_saver_window'.) + */ +#endif /* HAVE_MIT_SAVER_EXTENSION */ + { + class_hints.res_name = progname; + class_hints.res_class = progclass; + XSetClassHint (si->dpy, ssi->screensaver_window, &class_hints); + XStoreName (si->dpy, ssi->screensaver_window, "screensaver"); + XChangeProperty (si->dpy, ssi->screensaver_window, + XA_SCREENSAVER_VERSION, + XA_STRING, 8, PropModeReplace, + (unsigned char *) si->version, + strlen (si->version)); + + sprintf (id, "%lu on host ", (unsigned long) getpid ()); + +# if defined(HAVE_UNAME) + { + struct utsname uts; + if (uname (&uts) < 0) + strcat (id, "???"); + else + strcat (id, uts.nodename); + } +# elif defined(VMS) + strcat (id, getenv("SYS$NODE")); +# else /* !HAVE_UNAME && !VMS */ + strcat (id, "???"); +# endif /* !HAVE_UNAME && !VMS */ + + XChangeProperty (si->dpy, ssi->screensaver_window, + XA_SCREENSAVER_ID, XA_STRING, + 8, PropModeReplace, (unsigned char *) id, strlen (id)); + + if (!ssi->cursor) + { + Pixmap bit; + bit = XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window, + "\000", 1, 1, + BlackPixelOfScreen (ssi->screen), + BlackPixelOfScreen (ssi->screen), + 1); + ssi->cursor = XCreatePixmapCursor (si->dpy, bit, bit, &black, &black, + 0, 0); + XFreePixmap (si->dpy, bit); + } + + XSetWindowBackground (si->dpy, ssi->screensaver_window, + ssi->black_pixel); + if (si->demo_mode_p) + XUndefineCursor (si->dpy, ssi->screensaver_window); + else + XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor); + } +} + +void +initialize_screensaver_window (saver_info *si) +{ + int i; + for (i = 0; i < si->nscreens; i++) + initialize_screensaver_window_1 (&si->screens[i]); +} + + +void +raise_window (saver_info *si, + Bool inhibit_fade, Bool between_hacks_p, Bool dont_clear) +{ + saver_preferences *p = &si->prefs; + int i; + + initialize_screensaver_window (si); + reset_watchdog_timer (si, True); + + if (p->fade_p && !inhibit_fade && !si->demo_mode_p) + { + int grabbed = -1; + Colormap *current_maps = (Colormap *) + calloc(sizeof(Colormap), si->nscreens); + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + current_maps[i] = (between_hacks_p + ? ssi->cmap + : DefaultColormapOfScreen (ssi->screen)); + } + + if (p->verbose_p) fprintf (stderr, "%s: fading... ", progname); + + XGrabServer (si->dpy); + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + + /* grab and blacken mouse on the root window (saver not mapped yet) + */ + if (grabbed != GrabSuccess) + grabbed = grab_mouse (si->dpy, ssi->screensaver_window, + (si->demo_mode_p ? 0 : ssi->cursor)); + + if (!dont_clear || ssi->stderr_overlay_window) + /* Do this before the fade, since the stderr cmap won't fade + even if we uninstall it (beats me...) */ + clear_stderr (ssi); + } + + fade_screens (si->dpy, current_maps, p->fade_seconds, p->fade_ticks, + True); + + if (p->verbose_p) fprintf (stderr, "fading done.\n"); + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (!dont_clear) + XClearWindow (si->dpy, ssi->screensaver_window); + XMapRaised (si->dpy, ssi->screensaver_window); + +#ifdef HAVE_MIT_SAVER_EXTENSION + if (ssi->server_mit_saver_window && + window_exists_p (si->dpy, ssi->server_mit_saver_window)) + XUnmapWindow (si->dpy, ssi->server_mit_saver_window); +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + /* Once the saver window is up, restore the colormap. + (The "black" pixels of the two colormaps are compatible.) */ + if (ssi->cmap) + XInstallColormap (si->dpy, ssi->cmap); + } + + if (grabbed == GrabSuccess) + XUngrabPointer (si->dpy, CurrentTime); + XUngrabServer (si->dpy); + } + else + { + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (!dont_clear) + XClearWindow (si->dpy, ssi->screensaver_window); + if (!dont_clear || ssi->stderr_overlay_window) + clear_stderr (ssi); + XMapRaised (si->dpy, ssi->screensaver_window); +#ifdef HAVE_MIT_SAVER_EXTENSION + if (ssi->server_mit_saver_window && + window_exists_p (si->dpy, ssi->server_mit_saver_window)) + XUnmapWindow (si->dpy, ssi->server_mit_saver_window); +#endif /* HAVE_MIT_SAVER_EXTENSION */ + } + } + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->cmap) + XInstallColormap (si->dpy, ssi->cmap); + } +} + +void +blank_screen (saver_info *si) +{ + int i; + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + + save_real_vroot (ssi); + store_vroot_property (si->dpy, + ssi->screensaver_window, + ssi->screensaver_window); + } + store_activate_time (si, True); + raise_window (si, False, False, False); + /* #### */ + grab_keyboard_and_mouse (si->dpy, si->screens[0].screensaver_window, + (si->demo_mode_p ? 0 : si->screens[0].cursor)); +#ifdef HAVE_XHPDISABLERESET + if (si->locked_p && !hp_locked_p) + { + XHPDisableReset (si->dpy); /* turn off C-Sh-Reset */ + hp_locked_p = True; + } +#endif + + si->screen_blanked_p = True; +} + +void +unblank_screen (saver_info *si) +{ + saver_preferences *p = &si->prefs; + int i, j; + + store_activate_time (si, True); + reset_watchdog_timer (si, False); + + if (p->unfade_p && !si->demo_mode_p) + { + int grabbed = -1; + int extra_cmaps = 4; + int ncmaps = si->nscreens * (extra_cmaps + 1); + Colormap *cmaps = (Colormap *) calloc(sizeof(Colormap), ncmaps); + + if (p->verbose_p) fprintf (stderr, "%s: unfading... ", progname); + + /* Fake out SGI's multi-colormap hardware; see utils/fade.c + for an explanation. */ + for (i = 0; i < ncmaps; i += (extra_cmaps + 1)) + for (j = 0; j < (extra_cmaps + 1); j++) + { + cmaps[i+j] = XCreateColormap (si->dpy, + RootWindow (si->dpy, i), + DefaultVisual(si->dpy, i), + AllocAll); + if (cmaps[i+j]) + { + blacken_colormap (ScreenOfDisplay(si->dpy, i), cmaps[i+j]); + XInstallColormap (si->dpy, cmaps[i+j]); + } + } + + XGrabServer (si->dpy); + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (grabbed != GrabSuccess) + grabbed = grab_mouse (si->dpy, RootWindowOfScreen (ssi->screen), + 0); + XUnmapWindow (si->dpy, ssi->screensaver_window); + clear_stderr (ssi); + } + XUngrabServer (si->dpy); + + fade_screens (si->dpy, 0, p->fade_seconds, p->fade_ticks, False); + + for (i = 0; i < ncmaps; i++) + if (cmaps[i]) XFreeColormap (si->dpy, cmaps[i]); + free (cmaps); + + if (p->verbose_p) fprintf (stderr, "unfading done.\n"); + if (grabbed == GrabSuccess) + XUngrabPointer (si->dpy, CurrentTime); + } + else + { + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->cmap) + { + Colormap c = DefaultColormapOfScreen (ssi->screen); + /* avoid technicolor */ + XClearWindow (si->dpy, ssi->screensaver_window); + if (c) XInstallColormap (si->dpy, c); + } + XUnmapWindow (si->dpy, ssi->screensaver_window); + } + } + + + /* If the focus window does has a non-default colormap, then install + that colormap as well. (On SGIs, this will cause both the root map + and the focus map to be installed simultaniously. It'd be nice to + pick up the other colormaps that had been installed, too; perhaps + XListInstalledColormaps could be used for that?) + */ + { + Window focus = 0; + int revert_to; + XGetInputFocus (si->dpy, &focus, &revert_to); + if (focus && focus != PointerRoot && focus != None) + { + XWindowAttributes xgwa; + xgwa.colormap = 0; + XGetWindowAttributes (si->dpy, focus, &xgwa); + if (xgwa.colormap && + xgwa.colormap != DefaultColormapOfScreen (xgwa.screen)) + XInstallColormap (si->dpy, xgwa.colormap); + } + } + + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p); + } + + ungrab_keyboard_and_mouse (si->dpy); + restore_real_vroot (si); + +#ifdef HAVE_XHPDISABLERESET + if (hp_locked_p) + { + XHPEnableReset (si->dpy); /* turn C-Sh-Reset back on */ + hp_locked_p = False; + } +#endif + + si->screen_blanked_p = False; +} + + +static void +store_activate_time (saver_info *si, Bool use_last_p) +{ + static time_t last_time = 0; + time_t now = ((use_last_p && last_time) ? last_time : time ((time_t) 0)); + CARD32 now32 = (CARD32) now; + int i; + last_time = now; + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (!ssi->screensaver_window) continue; + XChangeProperty (si->dpy, ssi->screensaver_window, XA_SCREENSAVER_TIME, + XA_INTEGER, 32, PropModeReplace, + (unsigned char *) &now32, 1); + } +} + + +Bool +select_visual (saver_screen_info *ssi, const char *visual_name) +{ + saver_info *si = ssi->global; + saver_preferences *p = &si->prefs; + Visual *new_v; + Bool got_it; + + if (visual_name && *visual_name) + new_v = get_visual (ssi->screen, visual_name, True, False); + else + new_v = ssi->default_visual; + + got_it = !!new_v; + + if (new_v && ssi->current_visual != new_v) + { + Colormap old_c = ssi->cmap; + Window old_w = ssi->screensaver_window; + + if (p->verbose_p) + { +#if 0 + fprintf (stderr, "%s: switching visuals\tfrom: ", progname); + describe_visual (stderr, ssi->screen, ssi->current_visual); + fprintf (stderr, "\t\t\t\tto: "); + describe_visual (stderr, ssi->screen, new_v); +#else + fprintf (stderr, "%s: switching to visual ", progname); + describe_visual (stderr, ssi->screen, new_v); +#endif + } + + reset_stderr (ssi); + ssi->current_visual = new_v; + ssi->current_depth = visual_depth(ssi->screen, new_v); + ssi->cmap = 0; + ssi->screensaver_window = 0; + + initialize_screensaver_window_1 (ssi); + raise_window (si, True, True, False); + store_vroot_property (si->dpy, + ssi->screensaver_window, ssi->screensaver_window); + store_activate_time (si, False); + + XDestroyWindow (si->dpy, old_w); + if (old_c && + old_c != DefaultColormapOfScreen (ssi->screen) && + old_c != ssi->demo_cmap) + XFreeColormap (si->dpy, old_c); + } + + return got_it; +} diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c new file mode 100644 index 00000000..09ae5a01 --- /dev/null +++ b/driver/xscreensaver-command.c @@ -0,0 +1,255 @@ +/* xscreensaver-command, Copyright (c) 1991-1997 + * by Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include /* for CARD32 */ +#include +#include +#include /* for XGetClassHint() */ +#include +#include + +#include "version.h" + +#ifdef _VROOT_H_ +ERROR! you must not include vroot.h in this file +#endif + +static char *screensaver_version; +static char *usage = "usage: %s -\n\ +\n\ + This program provides external control of a running xscreensaver process.\n\ + Version %s, copyright (c) 1991-1997 Jamie Zawinski .\n\ +\n\ + -demo Enter interactive demo mode.\n\ + -deactivate Turns off the screensaver if it is on, as user input would.\n\ + -activate Turns it on as if the user had been idle for long enough.\n\ + -cycle Stops the current hack and runs a new one.\n\ + -next Like either -activate or -cycle, depending on which is more\n\ + appropriate, except that the screenhack that will be run is\n\ + the next one in the list of hacks, instead of a randomly-\n\ + chosen one. This option is good for looking at a demo of\n\ + each of the hacks in place.\n\ + -prev Like -next, but goes in the other direction.\n\ + -exit Causes the screensaver process to exit. It should be ok to\n\ + just kill the process (NOT with -9!) but this is a slightly\n\ + easier way.\n\ + -restart Causes the screensaver process to exit and then restart with\n\ + the same command line arguments. This is a good way of \n\ + causing the screensaver to re-read the resource database.\n\ + -lock Same as -activate, but with immediate locking.\n\ + -version Prints the version of XScreenSaver that is running.\n\ + -time Prints the time at which the screensaver turned on.\n\ +\n\ + See the man page for more details.\n\ + For updates, check http://people.netscape.com/jwz/xscreensaver/\n\ +\n"; + +static Window +find_screensaver_window (Display *dpy, char *progname, char **version) +{ + int i; + Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + Window root2, parent, *kids; + unsigned int nkids; + + if (version) *version = 0; + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + if (! (kids && nkids)) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *v; + + if (XGetWindowProperty (dpy, kids[i], + XInternAtom (dpy, "_SCREENSAVER_VERSION", False), + 0, 200, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &v) + == Success + && type != None) + { + if (version) + *version = v; + return kids[i]; + } + } + fprintf (stderr, "%s: no screensaver is running on display %s\n", progname, + DisplayString (dpy)); + exit (1); +} + + +#define USAGE() \ + { fprintf (stderr, usage, argv[0], screensaver_version); exit (1); } + +int +main (int argc, char **argv) +{ + Display *dpy; + Window window; + int i; + int query = 0; +#define Q_version 1 +#define Q_time 2 + char *message = 0, *dpyname = 0; + char *v = 0; + + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + for (i = 1; i < argc; i++) + { + char *s = argv [i]; + int L = strlen (s); + if (L < 2) USAGE (); + if (!strncmp (s, "-display", L)) dpyname = argv [++i]; + else if (message) USAGE () + else if (!strncmp (s, "-activate", L)) message = "ACTIVATE"; + else if (!strncmp (s, "-deactivate", L)) message = "DEACTIVATE"; + else if (!strncmp (s, "-cycle", L)) message = "CYCLE"; + else if (!strncmp (s, "-next", L)) message = "NEXT"; + else if (!strncmp (s, "-prev", L)) message = "PREV"; + else if (!strncmp (s, "-exit", L)) message = "EXIT"; + else if (!strncmp (s, "-restart", L)) message = "RESTART"; + else if (!strncmp (s, "-demo", L)) message = "DEMO"; + else if (!strncmp (s, "-lock", L)) message = "LOCK"; + else if (!strncmp (s, "-version", L)) query = Q_version; + else if (!strncmp (s, "-time", L)) query = Q_time; + else USAGE (); + } + if (!message && !query) USAGE (); + if (!dpyname) dpyname = (char *) getenv ("DISPLAY"); + dpy = XOpenDisplay (dpyname); + if (!dpy) + { + fprintf (stderr, "%s: can't open display %s\n", argv[0], + (dpyname ? dpyname : "(null)")); + exit (1); + } + window = find_screensaver_window (dpy, argv[0], &v); + + if (message) + { + XEvent event; + event.xany.type = ClientMessage; + event.xclient.display = dpy; + event.xclient.window = window; + event.xclient.message_type = XInternAtom (dpy, "SCREENSAVER", False); + event.xclient.format = 32; + event.xclient.data.l[0] = (long) XInternAtom (dpy, message, False); + if (! XSendEvent (dpy, window, False, 0L, &event)) + { + fprintf (stderr, "%s: XSendEvent(dpy, 0x%x ...) failed.\n", argv [0], + (unsigned int) window); + exit (1); + } + } + else if (query) + { + XClassHint hint; + memset (&hint, 0, sizeof(hint)); + if (!v || !*v) + { + fprintf (stderr, "%s: version property not set on window 0x%x?\n", + argv [0], (unsigned int) window); + exit (1); + } + + XGetClassHint(dpy, window, &hint); + if (!hint.res_class) + { + fprintf (stderr, "%s: class hints not set on window 0x%x?\n", + argv [0], (unsigned int) window); + exit (1); + } + + fprintf (stdout, "%s %s", hint.res_class, v); + + if (query != Q_time) + { + fprintf (stdout, "\n"); + } + else + { + Atom type; + int format; + unsigned long nitems, bytesafter; + unsigned char *data = 0; + XWindowAttributes xgwa; + Bool active_p = False; + + xgwa.map_state = IsViewable; + XGetWindowAttributes (dpy, window, &xgwa); + + if (XGetWindowProperty (dpy, window, + XInternAtom (dpy, "__SWM_VROOT", False), + 0, 0, False, XA_WINDOW, + &type, &format, &nitems, &bytesafter, + &data) + == Success + && type != None) + active_p = True; + + if (data) free (data); + data = 0; + + if (XGetWindowProperty (dpy, window, + XInternAtom (dpy, "_SCREENSAVER_TIME",False), + 0, 1, False, XA_INTEGER, + &type, &format, &nitems, &bytesafter, + &data) + == Success + && type == XA_INTEGER + && data) + { + CARD32 time32 = *((CARD32 *)data); + time_t tt = (time_t) time32; + + if (active_p) + fprintf (stdout, ": active since "); + else + fprintf (stdout, ": inactive since "); + fprintf (stdout, "%s", ctime(&tt)); + if (data) free (data); + } + else + { + if (data) free (data); + fprintf (stdout, "\n"); + fflush (stdout); + fprintf (stderr, "%s: no time on window 0x%x (%s %s).\n", + argv[0], (unsigned int) window, + hint.res_class, (v ? v : "???")); + exit (1); + } + } + } + + XSync (dpy, 0); + fflush (stdout); + fflush (stderr); + exit (0); +} diff --git a/local/man/man.1/xscreensaver-command.1 b/driver/xscreensaver-command.man similarity index 100% rename from local/man/man.1/xscreensaver-command.1 rename to driver/xscreensaver-command.man diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c new file mode 100644 index 00000000..0d5796b8 --- /dev/null +++ b/driver/xscreensaver.c @@ -0,0 +1,1128 @@ +/* xscreensaver, Copyright (c) 1991-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* ======================================================================== + * First we wait until the keyboard and mouse become idle for the specified + * amount of time. We do this in one of three different ways: periodically + * checking with the XIdle server extension; selecting key and mouse events + * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension + * to send us a "you are idle" event. + * + * Then, we map a full screen black window (or, in the case of the + * MIT-SCREEN-SAVER extension, use the one it gave us.) + * + * We place a __SWM_VROOT property on this window, so that newly-started + * clients will think that this window is a "virtual root" window. + * + * If there is an existing "virtual root" window (one that already had + * an __SWM_VROOT property) then we remove that property from that window. + * Otherwise, clients would see that window (the real virtual root) instead + * of ours (the impostor.) + * + * Then we pick a random program to run, and start it. Two assumptions + * are made about this program: that it has been specified with whatever + * command-line options are necessary to make it run on the root window; + * and that it has been compiled with vroot.h, so that it is able to find + * the root window when a virtual-root window manager (or this program) is + * running. + * + * Then, we wait for keyboard or mouse events to be generated on the window. + * When they are, we kill the inferior process, unmap the window, and restore + * the __SWM_VROOT property to the real virtual root window if there was one. + * + * While we are waiting, we also set up timers so that, after a certain + * amount of time has passed, we can start a different screenhack. We do + * this by killing the running child process with SIGTERM, and then starting + * a new one in the same way. + * + * If there was a real virtual root, meaning that we removed the __SWM_VROOT + * property from it, meaning we must (absolutely must) restore it before we + * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM, + * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it + * is not generally safe to call them from signal handlers; however, this + * program spends most of its time waiting, so the window of opportunity + * when code could be called reentrantly is fairly small; and also, the worst + * that could happen is that the call would fail. If we've gotten one of + * these signals, then we're on our way out anyway. If we didn't restore the + * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note + * that this means that, if you're using a virtual-root window manager, you + * can really fuck up the world by killing this process with "kill -9". + * + * This program accepts ClientMessages of type SCREENSAVER; these messages + * may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the + * screensaver on or off now, regardless of the idleness of the user, + * and a few other things. The included "xscreensaver_command" program + * sends these messsages. + * + * If we don't have the XIdle, MIT-SCREEN-SAVER, or SGI SCREEN_SAVER + * extensions, then we do the XAutoLock trick: notice every window that + * gets created, and wait 30 seconds or so until its creating process has + * settled down, and then select KeyPress events on those windows which + * already select for KeyPress events. It's important that we not select + * KeyPress on windows which don't select them, because that would + * interfere with event propagation. This will break if any program + * changes its event mask to contain KeyRelease or PointerMotion more than + * 30 seconds after creating the window, but that's probably pretty rare. + * + * The reason that we can't select KeyPresses on windows that don't have + * them already is that, when dispatching a KeyPress event, X finds the + * lowest (leafmost) window in the hierarchy on which *any* client selects + * for KeyPress, and sends the event to that window. This means that if a + * client had a window with subwindows, and expected to receive KeyPress + * events on the parent window instead of the subwindows, then that client + * would malfunction if some other client selected KeyPress events on the + * subwindows. It is an incredible misdesign that one client can make + * another client malfunction in this way. + * + * To detect mouse motion, we periodically wake up and poll the mouse + * position and button/modifier state, and notice when something has + * changed. We make this check every five seconds by default, and since the + * screensaver timeout has a granularity of one minute, this makes the + * chance of a false positive very small. We could detect mouse motion in + * the same way as keyboard activity, but that would suffer from the same + * "client changing event mask" problem that the KeyPress events hack does. + * I think polling is more reliable. + * + * None of this crap happens if we're using one of the extensions, so install + * one of them if the description above sounds just too flaky to live. It + * is, but those are your choices. + * + * A third idle-detection option could be implemented (but is not): when + * running on the console display ($DISPLAY is `localhost`:0) and we're on a + * machine where /dev/tty and /dev/mouse have reasonable last-modification + * times, we could just stat() those. But the incremental benefit of + * implementing this is really small, so forget I said anything. + * + * Debugging hints: + * - Have a second terminal handy. + * - Be careful where you set your breakpoints, you don't want this to + * stop under the debugger with the keyboard grabbed or the blackout + * window exposed. + * - If you run your debugger under XEmacs, try M-ESC (x-grab-keyboard) + * to keep your emacs window alive even when xscreensaver has grabbed. + * - Go read the code related to -DDEBUG. + * - You probably can't set breakpoints in functions that are called on + * the other side of a call to fork() -- if your clients are dying + * with signal 5, Trace/BPT Trap, you're losing in this way. + * - If you aren't using a server extension, don't leave this stopped + * under the debugger for very long, or the X input buffer will get + * huge because of the keypress events it's selecting for. This can + * make your X server wedge with "no more input buffers." + * + * ======================================================================== */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_XMU +# ifndef VMS +# include +# else /* !VMS */ +# include +# endif /* !VMS */ +#else /* !HAVE_XMU */ +# include "xmu.h" +#endif /* !HAVE_XMU */ + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#include "xscreensaver.h" +#include "version.h" +#include "yarandom.h" +#include "resources.h" +#include "visual.h" + +saver_info *global_si_kludge = 0; /* I hate C so much... */ + +char *progname = 0; +char *progclass = 0; +XrmDatabase db = 0; + + +static Atom XA_SCREENSAVER; +static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK; + + +static XrmOptionDescRec options [] = { + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionSepArg, 0 }, + { "-idelay", ".initialDelay", XrmoptionSepArg, 0 }, + { "-nice", ".nice", XrmoptionSepArg, 0 }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-lock-timeout", ".lockTimeout", XrmoptionSepArg, 0 }, + { "-install", ".installColormap", XrmoptionNoArg, "on" }, + { "-no-install", ".installColormap", XrmoptionNoArg, "off" }, + { "-verbose", ".verbose", XrmoptionNoArg, "on" }, + { "-silent", ".verbose", XrmoptionNoArg, "off" }, + { "-xidle-extension", ".xidleExtension", XrmoptionNoArg, "on" }, + { "-no-xidle-extension", ".xidleExtension", XrmoptionNoArg, "off" }, + { "-mit-extension", ".mitSaverExtension",XrmoptionNoArg, "on" }, + { "-no-mit-extension", ".mitSaverExtension",XrmoptionNoArg, "off" }, + { "-sgi-extension", ".sgiSaverExtension",XrmoptionNoArg, "on" }, + { "-no-sgi-extension", ".sgiSaverExtension",XrmoptionNoArg, "off" }, + { "-lock", ".lock", XrmoptionNoArg, "on" }, + { "-no-lock", ".lock", XrmoptionNoArg, "off" } +}; + +static char *defaults[] = { +#include "XScreenSaver_ad.h" + 0 +}; + +static void +do_help (saver_info *si) +{ + printf ("\ +xscreensaver %s, copyright (c) 1991-1997 by Jamie Zawinski \n\ +The standard Xt command-line options are accepted; other options include:\n\ +\n\ + -timeout When the screensaver should activate.\n\ + -cycle How long to let each hack run.\n\ + -idelay How long to sleep before startup.\n\ + -visual Which X visual to run on.\n\ + -demo Enter interactive demo mode on startup.\n\ + -install Install a private colormap.\n\ + -no-install Don't.\n\ + -verbose Be loud.\n\ + -silent Don't.\n\ + -xidle-extension Use the R5 XIdle server extension.\n\ + -no-xidle-extension Don't.\n\ + -mit-extension Use the R6 MIT_SCREEN_SAVER server extension.\n\ + -no-mit-extension Don't.\n\ + -sgi-extension Use the SGI SCREEN-SAVER server extension.\n\ + -no-sgi-extension Don't.\n\ + -lock Require a password before deactivating.\n\ + -no-lock Don't.\n\ + -lock-timeout Grace period before locking; default 0.\n\ + -help This message.\n\ +\n\ +Use the `xscreensaver-command' program to control a running screensaver.\n\ +\n\ +The *programs resource controls which graphics demos will be launched by the\n\ +screensaver. See the man page for more details. For updates, check\n\ +http://people.netscape.com/jwz/xscreensaver/\n\n", + si->version); + +#ifdef NO_LOCKING + printf ("Support for locking was not enabled at compile-time.\n"); +#endif +#ifdef NO_DEMO_MODE + printf ("Support for demo mode was not enabled at compile-time.\n"); +#endif +#if !defined(HAVE_XIDLE_EXTENSION) && !defined(HAVE_MIT_SAVER_EXTENSION) && !defined(HAVE_SGI_SAVER_EXTENSION) + printf ("Support for the XIDLE, SCREEN_SAVER, and MIT-SCREEN-SAVER server\ + extensions\nwas not enabled at compile-time.\n"); +#endif /* !HAVE_XIDLE_EXTENSION && !HAVE_MIT_SAVER_EXTENSION && !HAVE_SGI_SAVER_EXTENSION */ + + fflush (stdout); + exit (1); +} + + +static char * +reformat_hack(const char *hack) +{ + int i; + const char *in = hack; + int indent = 13; + char *h2 = (char *) malloc(strlen(in) + indent + 2); + char *out = h2; + + while (isspace(*in)) in++; /* skip whitespace */ + while (!isspace(*in) && *in != ':') + *out++ = *in++; /* snarf first token */ + while (isspace(*in)) in++; /* skip whitespace */ + + if (*in == ':') + *out++ = *in++; /* copy colon */ + else + { + in = hack; + out = h2; /* reset to beginning */ + } + + *out = 0; + + while (isspace(*in)) in++; /* skip whitespace */ + for (i = strlen(h2); i < indent; i++) /* indent */ + *out++ = ' '; + + while (*in) *out++ = *in++; /* copy rest of line */ + *out = 0; + + return h2; +} + + +static void +get_screenhacks (saver_info *si) +{ + saver_preferences *p = &si->prefs; + int i = 0; + int hacks_size = 60; + int size; + char *d; + + d = get_string_resource ("monoPrograms", "MonoPrograms"); + if (d && !*d) { free(d); d = 0; } + if (!d) + d = get_string_resource ("colorPrograms", "ColorPrograms"); + if (d && !*d) { free(d); d = 0; } + + if (d) + { + fprintf (stderr, + "%s: the `monoPrograms' and `colorPrograms' resources are obsolete;\n\ + see the manual for details.\n", progname); + free(d); + } + + d = get_string_resource ("programs", "Programs"); + + size = strlen (d); + p->screenhacks = (char **) malloc (sizeof (char *) * hacks_size); + p->screenhacks_count = 0; + + while (i < size) + { + int end, start = i; + if (d[i] == ' ' || d[i] == '\t' || d[i] == '\n' || d[i] == 0) + { + i++; + continue; + } + if (hacks_size <= p->screenhacks_count) + p->screenhacks = (char **) realloc (p->screenhacks, + (hacks_size = hacks_size * 2) * + sizeof (char *)); + p->screenhacks [p->screenhacks_count++] = d + i; + while (d[i] != 0 && d[i] != '\n') + i++; + end = i; + while (i > start && (d[i-1] == ' ' || d[i-1] == '\t')) + i--; + d[i] = 0; + i = end + 1; + } + + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + for (i = 0; i < p->screenhacks_count; i++) + { + char *s = p->screenhacks [i]; + char *s2; + int L = strlen (s); + int j, k; + for (j = 0; j < L; j++) + { + switch (s[j]) + { + case '\'': case '"': case '`': case '\\': + goto DONE; + case '\t': + s[j] = ' '; + case ' ': + k = 0; + for (s2 = s+j+1; *s2 == ' ' || *s2 == '\t'; s2++) + k++; + if (k > 0) + for (s2 = s + j + 1; *s2; s2++) + s2 [0] = s2 [k]; + break; + } + } + DONE: + p->screenhacks[i] = reformat_hack(s); /* mallocs */ + } + + if (p->screenhacks_count) + { + /* Shrink down the screenhacks array to be only as big as it needs to. + This doesn't really matter at all. */ + p->screenhacks = (char **) + realloc (p->screenhacks, ((p->screenhacks_count + 1) * + sizeof(char *))); + p->screenhacks [p->screenhacks_count] = 0; + } + else + { + free (p->screenhacks); + p->screenhacks = 0; + } +} + + +static void +get_resources (saver_info *si) +{ + char *s; + saver_preferences *p = &si->prefs; + + p->verbose_p = get_boolean_resource ("verbose", "Boolean"); + p->lock_p = get_boolean_resource ("lock", "Boolean"); + p->fade_p = get_boolean_resource ("fade", "Boolean"); + p->unfade_p = get_boolean_resource ("unfade", "Boolean"); + p->fade_seconds = get_seconds_resource ("fadeSeconds", "Time"); + p->fade_ticks = get_integer_resource ("fadeTicks", "Integer"); + p->install_cmap_p = get_boolean_resource ("installColormap", "Boolean"); + p->nice_inferior = get_integer_resource ("nice", "Nice"); + + p->initial_delay = get_seconds_resource ("initialDelay", "Time"); + p->timeout = 1000 * get_minutes_resource ("timeout", "Time"); + p->lock_timeout = 1000 * get_minutes_resource ("lockTimeout", "Time"); + p->cycle = 1000 * get_minutes_resource ("cycle", "Time"); + +#ifndef NO_LOCKING + p->passwd_timeout = 1000 * get_seconds_resource ("passwdTimeout", "Time"); +#endif + + p->pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time"); + p->notice_events_timeout = 1000*get_seconds_resource("windowCreationTimeout", + "Time"); + p->shell = get_string_resource ("bourneShell", "BourneShell"); + + + /* don't set use_xidle_extension unless it is explicitly specified */ + if ((s = get_string_resource ("xidleExtension", "Boolean"))) + p->use_xidle_extension = get_boolean_resource ("xidleExtension","Boolean"); + else +#ifdef HAVE_XIDLE_EXTENSION /* pick a default */ + p->use_xidle_extension = True; /* if we have it, use it */ +#else /* !HAVE_XIDLE_EXTENSION */ + p->use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + if (s) free (s); + + /* don't set use_mit_extension unless it is explicitly specified */ + if ((s = get_string_resource ("mitSaverExtension", "Boolean"))) + p->use_mit_saver_extension = get_boolean_resource ("mitSaverExtension", + "Boolean"); + else +#ifdef HAVE_MIT_SAVER_EXTENSION /* pick a default */ + p->use_mit_saver_extension = False; /* Default false, because it sucks */ +#else /* !HAVE_MIT_SAVER_EXTENSION */ + p->use_mit_saver_extension = False; +#endif /* !HAVE_MIT_SAVER_EXTENSION */ + if (s) free (s); + + + /* don't set use_mit_extension unless it is explicitly specified */ + if ((s = get_string_resource ("sgiSaverExtension", "Boolean"))) + p->use_sgi_saver_extension = get_boolean_resource ("sgiSaverExtension", + "Boolean"); + else +#ifdef HAVE_SGI_SAVER_EXTENSION /* pick a default */ + p->use_sgi_saver_extension = True; /* if we have it, use it */ +#else /* !HAVE_SGI_SAVER_EXTENSION */ + p->use_sgi_saver_extension = False; +#endif /* !HAVE_SGI_SAVER_EXTENSION */ + if (s) free (s); + + + /* Throttle the various timeouts to reasonable values. + */ +#ifndef NO_LOCKING + if (p->passwd_timeout == 0) p->passwd_timeout = 30000; /* 30 secs */ +#endif + if (p->timeout < 10000) p->timeout = 10000; /* 10 secs */ + if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000; /* 2 secs */ + if (p->pointer_timeout == 0) p->pointer_timeout = 5000; /* 5 secs */ + if (p->notice_events_timeout == 0) + p->notice_events_timeout = 10000; /* 10 secs */ + if (p->fade_seconds == 0 || p->fade_ticks == 0) + p->fade_p = False; + if (! p->fade_p) p->unfade_p = False; + + p->watchdog_timeout = p->cycle; + if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000; /* 30 secs */ + if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /* 1 hr */ + +#ifdef NO_LOCKING + si->locking_disabled_p = True; + si->nolock_reason = "not compiled with locking support"; + if (p->lock_p) + { + p->lock_p = False; + fprintf (stderr, "%s: not compiled with support for locking.\n", + progname); + } +#else /* ! NO_LOCKING */ + if (p->lock_p && si->locking_disabled_p) + { + fprintf (stderr, "%s: locking is disabled (%s).\n", progname, + si->nolock_reason); + p->lock_p = False; + } +#endif /* ! NO_LOCKING */ + + get_screenhacks (si); + +#ifdef DEBUG + if (p->debug_p) + { + XSynchronize(si->dpy, True); + p->verbose_p = True; + p->initial_delay = 0; + } +#endif /* DEBUG */ +} + + +char * +timestring (void) +{ + time_t now = time ((time_t *) 0); + char *str = (char *) ctime (&now); + char *nl = (char *) strchr (str, '\n'); + if (nl) *nl = 0; /* take off that dang newline */ + return str; +} + +static void initialize (saver_info *si, int argc, char **argv); +static void main_loop (saver_info *si); + +int +main (int argc, char **argv) +{ + saver_info si; + memset(&si, 0, sizeof(si)); + global_si_kludge = &si; /* I hate C so much... */ + initialize (&si, argc, argv); + main_loop (&si); /* doesn't return */ + return 0; +} + + +int +saver_ehandler (Display *dpy, XErrorEvent *error) +{ + saver_info *si = global_si_kludge; /* I hate C so much... */ + + fprintf (real_stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) + saver_exit (si, -1); + else + fprintf (real_stderr, " (nonfatal.)\n"); + return 0; +} + +static void +initialize_connection (saver_info *si, int argc, char **argv) +{ + int i; + Widget toplevel_shell = XtAppInitialize (&si->app, progclass, + options, XtNumber (options), + &argc, argv, defaults, 0, 0); + + si->dpy = XtDisplay (toplevel_shell); + si->db = XtDatabase (si->dpy); + XtGetApplicationNameAndClass (si->dpy, &progname, &progclass); + + db = si->db; /* resources.c needs this */ + + if (argc == 2 && !strcmp (argv[1], "-help")) + do_help (si); +#ifdef DEBUG + else if (argc == 2 && !strcmp (argv[1], "-debug")) + si->prefs.debug_p = True; /* no resource for this one, out of paranoia. */ +#endif /* DEBUG */ + else if (argc > 1) + { + fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]); + exit (1); + } + get_resources (si); +#ifndef NO_SETUID + hack_uid_warn (si); +#endif /* NO_SETUID */ + XA_VROOT = XInternAtom (si->dpy, "__SWM_VROOT", False); + XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False); + XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False); + XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False); + XA_SCREENSAVER_TIME = XInternAtom (si->dpy, "_SCREENSAVER_TIME", False); + XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False); + XA_ACTIVATE = XInternAtom (si->dpy, "ACTIVATE", False); + XA_DEACTIVATE = XInternAtom (si->dpy, "DEACTIVATE", False); + XA_RESTART = XInternAtom (si->dpy, "RESTART", False); + XA_CYCLE = XInternAtom (si->dpy, "CYCLE", False); + XA_NEXT = XInternAtom (si->dpy, "NEXT", False); + XA_PREV = XInternAtom (si->dpy, "PREV", False); + XA_EXIT = XInternAtom (si->dpy, "EXIT", False); + XA_DEMO = XInternAtom (si->dpy, "DEMO", False); + XA_LOCK = XInternAtom (si->dpy, "LOCK", False); + + si->nscreens = ScreenCount(si->dpy); + si->screens = (saver_screen_info *) + calloc(sizeof(saver_screen_info), si->nscreens); + + si->default_screen = &si->screens[DefaultScreen(si->dpy)]; + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + ssi->global = si; + ssi->screen = ScreenOfDisplay (si->dpy, i); + + /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */ + ssi->default_visual = + get_visual_resource (ssi->screen, "visualID", "VisualID", False); + + ssi->current_visual = ssi->default_visual; + ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual); + + if (ssi == si->default_screen) + /* Since this is the default screen, use the one already created. */ + ssi->toplevel_shell = toplevel_shell; + else + /* Otherwise, each screen must have its own unmapped root widget. */ + ssi->toplevel_shell = + XtVaAppCreateShell(progname, progclass, applicationShellWidgetClass, + si->dpy, + XtNscreen, ssi->screen, + XtNvisual, ssi->current_visual, + XtNdepth, visual_depth(ssi->screen, + ssi->current_visual), + 0); + } +} + + +static void +initialize (saver_info *si, int argc, char **argv) +{ + int i; + saver_preferences *p = &si->prefs; + Bool initial_demo_mode_p = False; + si->version = (char *) malloc (5); + memcpy (si->version, screensaver_id + 17, 4); + si->version [4] = 0; + progname = argv[0]; /* reset later; this is for the benefit of lock_init() */ + +#ifdef NO_LOCKING + si->locking_disabled_p = True; + si->nolock_reason = "not compiled with locking support"; +#else + si->locking_disabled_p = False; + +#ifdef SCO + set_auth_parameters(argc, argv); +#endif + + if (! lock_init (argc, argv)) /* before hack_uid() for proper permissions */ + { + si->locking_disabled_p = True; + si->nolock_reason = "error getting password"; + } +#endif + +#ifndef NO_SETUID + hack_uid (si); +#endif + + progclass = "XScreenSaver"; + + /* remove -demo switch before saving argv */ + for (i = 1; i < argc; i++) + while (!strcmp ("-demo", argv [i])) + { + int j; + initial_demo_mode_p = True; + for (j = i; j < argc; j++) + argv [j] = argv [j+1]; + argv [j] = 0; + argc--; + if (argc <= i) break; + } + save_argv (argc, argv); + initialize_connection (si, argc, argv); + + if (p->verbose_p) + printf ("\ +%s %s, copyright (c) 1991-1997 by Jamie Zawinski \n\ + pid = %d.\n", progname, si->version, (int) getpid ()); + + + for (i = 0; i < si->nscreens; i++) + ensure_no_screensaver_running (si->dpy, si->screens[i].screen); + + si->demo_mode_p = initial_demo_mode_p; + srandom ((int) time ((time_t *) 0)); + + if (p->use_sgi_saver_extension) + { +#ifdef HAVE_SGI_SAVER_EXTENSION + if (! query_sgi_saver_extension (si)) + { + fprintf (stderr, + "%s: display %s does not support the SGI SCREEN_SAVER extension.\n", + progname, DisplayString (si->dpy)); + p->use_sgi_saver_extension = False; + } + else if (p->use_mit_saver_extension) + { + fprintf (stderr, "%s: SGI SCREEN_SAVER extension used instead\ + of MIT-SCREEN-SAVER extension.\n", + progname); + p->use_mit_saver_extension = False; + } + else if (p->use_xidle_extension) + { + fprintf (stderr, + "%s: SGI SCREEN_SAVER extension used instead of XIDLE extension.\n", + progname); + p->use_xidle_extension = False; + } +#else /* !HAVE_MIT_SAVER_EXTENSION */ + fprintf (stderr, + "%s: not compiled with support for the SGI SCREEN_SAVER extension.\n", + progname); + p->use_sgi_saver_extension = False; +#endif /* !HAVE_SGI_SAVER_EXTENSION */ + } + + if (p->use_mit_saver_extension) + { +#ifdef HAVE_MIT_SAVER_EXTENSION + if (! query_mit_saver_extension (si)) + { + fprintf (stderr, + "%s: display %s does not support the MIT-SCREEN-SAVER extension.\n", + progname, DisplayString (si->dpy)); + p->use_mit_saver_extension = False; + } + else if (p->use_xidle_extension) + { + fprintf (stderr, + "%s: MIT-SCREEN-SAVER extension used instead of XIDLE extension.\n", + progname); + p->use_xidle_extension = False; + } +#else /* !HAVE_MIT_SAVER_EXTENSION */ + fprintf (stderr, + "%s: not compiled with support for the MIT-SCREEN-SAVER extension.\n", + progname); + p->use_mit_saver_extension = False; +#endif /* !HAVE_MIT_SAVER_EXTENSION */ + } + + if (p->use_xidle_extension) + { +#ifdef HAVE_XIDLE_EXTENSION + int first_event, first_error; + if (! XidleQueryExtension (si->dpy, &first_event, &first_error)) + { + fprintf (stderr, + "%s: display %s does not support the XIdle extension.\n", + progname, DisplayString (si->dpy)); + p->use_xidle_extension = False; + } +#else /* !HAVE_XIDLE_EXTENSION */ + fprintf (stderr, "%s: not compiled with support for XIdle.\n", + progname); + p->use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + } + + /* Call this only after having probed for presence of desired extension. */ + initialize_screensaver_window (si); + + init_sigchld (); + + disable_builtin_screensaver (si, True); + + if (p->verbose_p && p->use_mit_saver_extension) + fprintf (stderr, "%s: using MIT-SCREEN-SAVER server extension.\n", + progname); + if (p->verbose_p && p->use_sgi_saver_extension) + fprintf (stderr, "%s: using SGI SCREEN_SAVER server extension.\n", + progname); + if (p->verbose_p && p->use_xidle_extension) + fprintf (stderr, "%s: using XIdle server extension.\n", + progname); + + initialize_stderr (si); + XSetErrorHandler (saver_ehandler); + + if (initial_demo_mode_p) + /* If the user wants demo mode, don't wait around before doing it. */ + p->initial_delay = 0; + + if (!p->use_xidle_extension && + !p->use_mit_saver_extension && + !p->use_sgi_saver_extension) + { + if (p->initial_delay) + { + if (p->verbose_p) + { + printf ("%s: waiting for %d second%s...", progname, + (int) p->initial_delay, + (p->initial_delay == 1 ? "" : "s")); + fflush (stdout); + } + sleep (p->initial_delay); + if (p->verbose_p) + printf (" done.\n"); + } + if (p->verbose_p) + { + printf ("%s: selecting events on extant windows...", progname); + fflush (stdout); + } + + /* Select events on the root windows of every screen. This also selects + for window creation events, so that new subwindows will be noticed. + */ + for (i = 0; i < si->nscreens; i++) + start_notice_events_timer (si, + RootWindowOfScreen (si->screens[i].screen)); + + if (p->verbose_p) + printf (" done.\n"); + } +} + +static void +main_loop (saver_info *si) +{ + saver_preferences *p = &si->prefs; + while (1) + { + if (! si->demo_mode_p) + sleep_until_idle (si, True); + +#ifndef NO_DEMO_MODE + if (si->demo_mode_p) + demo_mode (si); + else +#endif + { + if (p->verbose_p) + printf ("%s: user is idle; waking up at %s.\n", progname, + timestring()); + blank_screen (si); + spawn_screenhack (si, True); + if (p->cycle) + si->cycle_id = XtAppAddTimeOut (si->app, p->cycle, cycle_timer, + (XtPointer) si); + +#ifndef NO_LOCKING + if (p->lock_p && p->lock_timeout == 0) + si->locked_p = True; + if (p->lock_p && !si->locked_p) + /* locked_p might be true already because of ClientMessage */ + si->lock_id = XtAppAddTimeOut (si->app, p->lock_timeout, + activate_lock_timer, + (XtPointer) si); +#endif + + PASSWD_INVALID: + + sleep_until_idle (si, False); /* until not idle */ + +#ifndef NO_LOCKING + if (si->locked_p) + { + Bool val; + if (si->locking_disabled_p) abort (); + si->dbox_up_p = True; + + /* We used to ungrab the keyboard here, before calling unlock_p() + to pop up the dialog box. This left the keyboard ungrabbed + for a small window, during an insecure state. Bennett Todd + was seeing the bahavior that, when the load was high, he could + actually get characters through to a shell under the saver + window (he accidentally typed his password there...) + + So the ungrab has been moved down into pop_passwd_dialog() + just after the server is grabbed, closing this window + entirely. + */ + /* ungrab_keyboard_and_mouse (); */ + + { + saver_screen_info *ssi = si->default_screen; + suspend_screenhack (si, True); + XUndefineCursor (si->dpy, ssi->screensaver_window); + if (p->verbose_p) + printf ("%s: prompting for password.\n", progname); + val = unlock_p (si); + if (p->verbose_p && val == False) + printf ("%s: password incorrect!\n", progname); + si->dbox_up_p = False; + XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor); + suspend_screenhack (si, False); + + /* I think this grab is now redundant, but it shouldn't hurt. + */ + if (!si->demo_mode_p) + grab_keyboard_and_mouse (si->dpy, ssi->screensaver_window, + ssi->cursor); + } + + if (! val) + goto PASSWD_INVALID; + si->locked_p = False; + } +#endif + unblank_screen (si); + kill_screenhack (si); + if (si->cycle_id) + { + XtRemoveTimeOut (si->cycle_id); + si->cycle_id = 0; + } +#ifndef NO_LOCKING + if (si->lock_id) + { + XtRemoveTimeOut (si->lock_id); + si->lock_id = 0; + } +#endif + if (p->verbose_p) + printf ("%s: user is active; going to sleep at %s.\n", progname, + timestring ()); + } + } +} + + + +Bool +handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p) +{ + saver_preferences *p = &si->prefs; + Atom type = 0; + if (event->xclient.message_type != XA_SCREENSAVER) + { + char *str; + str = XGetAtomName (si->dpy, event->xclient.message_type); + fprintf (stderr, "%s: unrecognised ClientMessage type %s received\n", + progname, (str ? str : "(null)")); + if (str) XFree (str); + return False; + } + if (event->xclient.format != 32) + { + fprintf (stderr, "%s: ClientMessage of format %d received, not 32\n", + progname, event->xclient.format); + return False; + } + + type = event->xclient.data.l[0]; + if (type == XA_ACTIVATE) + { + if (until_idle_p) + { + if (p->verbose_p) + printf ("%s: ACTIVATE ClientMessage received.\n", progname); + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + { + XForceScreenSaver (si->dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: ClientMessage ACTIVATE received while already active.\n", + progname); + } + else if (type == XA_DEACTIVATE) + { + if (! until_idle_p) + { + if (p->verbose_p) + printf ("%s: DEACTIVATE ClientMessage received.\n", progname); + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + { + XForceScreenSaver (si->dpy, ScreenSaverReset); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: ClientMessage DEACTIVATE received while inactive.\n", + progname); + } + else if (type == XA_CYCLE) + { + if (! until_idle_p) + { + if (p->verbose_p) + printf ("%s: CYCLE ClientMessage received.\n", progname); + if (si->cycle_id) + XtRemoveTimeOut (si->cycle_id); + si->cycle_id = 0; + cycle_timer ((XtPointer) si, 0); + return False; + } + fprintf (stderr, "%s: ClientMessage CYCLE received while inactive.\n", + progname); + } + else if (type == XA_NEXT || type == XA_PREV) + { + if (p->verbose_p) + printf ("%s: %s ClientMessage received.\n", progname, + (type == XA_NEXT ? "NEXT" : "PREV")); + si->next_mode_p = 1 + (type == XA_PREV); + + if (! until_idle_p) + { + if (si->cycle_id) + XtRemoveTimeOut (si->cycle_id); + si->cycle_id = 0; + cycle_timer ((XtPointer) si, 0); + } + else + return True; + } + else if (type == XA_EXIT) + { + /* Ignore EXIT message if the screen is locked. */ + if (until_idle_p || !si->locked_p) + { + if (p->verbose_p) + printf ("%s: EXIT ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (si); + kill_screenhack (si); + XSync (si->dpy, False); + } + saver_exit (si, 0); + } + else + fprintf (stderr, "%s: EXIT ClientMessage received while locked.\n", + progname); + } + else if (type == XA_RESTART) + { + /* The RESTART message works whether the screensaver is active or not, + unless the screen is locked, in which case it doesn't work. + */ + if (until_idle_p || !si->locked_p) + { + if (p->verbose_p) + printf ("%s: RESTART ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (si); + kill_screenhack (si); + XSync (si->dpy, False); + } + + /* make sure error message shows up before exit. */ + if (real_stderr && stderr != real_stderr) + dup2 (fileno(real_stderr), fileno(stderr)); + + restart_process (si); + exit (1); /* shouldn't get here; but if restarting didn't work, + make this command be the same as EXIT. */ + } + else + fprintf(stderr, "%s: RESTART ClientMessage received while locked.\n", + progname); + } + else if (type == XA_DEMO) + { +#ifdef NO_DEMO_MODE + fprintf (stderr, "%s: not compiled with support for DEMO mode\n", + progname); +#else + if (until_idle_p) + { + if (p->verbose_p) + printf ("%s: DEMO ClientMessage received.\n", progname); + si->demo_mode_p = True; + return True; + } + fprintf (stderr, + "%s: DEMO ClientMessage received while active.\n", progname); +#endif + } + else if (type == XA_LOCK) + { +#ifdef NO_LOCKING + fprintf (stderr, "%s: not compiled with support for LOCK mode\n", + progname); +#else + if (si->locking_disabled_p) + fprintf (stderr, + "%s: LOCK ClientMessage received, but locking is disabled.\n", + progname); + else if (si->locked_p) + fprintf (stderr, + "%s: LOCK ClientMessage received while already locked.\n", + progname); + else + { + si->locked_p = True; + if (p->verbose_p) + printf ("%s: LOCK ClientMessage received;%s locking.\n", + progname, until_idle_p ? " activating and" : ""); + + if (si->lock_id) /* we're doing it now, so lose the timeout */ + { + XtRemoveTimeOut (si->lock_id); + si->lock_id = 0; + } + + if (until_idle_p) + { + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + { + XForceScreenSaver (si->dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + } +#endif + } + else + { + char *str; + str = (type ? XGetAtomName(si->dpy, type) : 0); + if (str) + fprintf (stderr, + "%s: unrecognised screensaver ClientMessage %s received\n", + progname, str); + else + fprintf (stderr, + "%s: unrecognised screensaver ClientMessage 0x%x received\n", + progname, (unsigned int) event->xclient.data.l[0]); + if (str) XFree (str); + } + return False; +} diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h new file mode 100644 index 00000000..6dba82a6 --- /dev/null +++ b/driver/xscreensaver.h @@ -0,0 +1,368 @@ +/* xscreensaver, Copyright (c) 1993-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifndef __XSCREENSAVER_H__ +#define __XSCREENSAVER_H__ + +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include + +extern char *progname; +extern char *progclass; + +typedef struct saver_preferences saver_preferences; +typedef struct saver_info saver_info; +typedef struct saver_screen_info saver_screen_info; + + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + + + +/* This structure holds all the user-specified parameters, read from the + command line, the resource database, or entered through a dialog box. + */ +struct saver_preferences { + Bool verbose_p; + Bool lock_p; /* whether to lock as well as save */ + + Bool debug_p; + Bool fade_p; /* whether to fade to black */ + Bool unfade_p; /* whether to fade from black */ + int fade_seconds; /* how long that should take */ + int fade_ticks; /* how many ticks should be used */ + + Bool install_cmap_p; /* whether we should use our own colormap + when using the screen's default visual. */ + + char **screenhacks; /* the programs to run */ + int screenhacks_count; + + int nice_inferior; /* nice value for subprocs */ + + int initial_delay; /* how long to sleep after launch */ + Time timeout; /* how much idle time before activation */ + Time lock_timeout; /* how long after activation locking starts */ + Time cycle; /* how long each hack should run */ +#ifndef NO_LOCKING + Time passwd_timeout; /* how much time before pw dialog goes down */ +#endif + Time pointer_timeout; /* how often to check mouse position */ + Time notice_events_timeout; /* how long after window creation to select */ + Time watchdog_timeout; /* how often to re-raise and re-blank screen */ + + Bool use_xidle_extension; /* which extension to use, if possible */ + Bool use_mit_saver_extension; + Bool use_sgi_saver_extension; + + char *shell; /* where to find /bin/sh */ + +}; + + +/* This structure holds all the data that applies to the program as a whole, + or to the non-screen-specific parts of the display connection. + */ +struct saver_info { + char *version; + saver_preferences prefs; + + int nscreens; + saver_screen_info *screens; + saver_screen_info *default_screen; /* ...on which dialogs will appear. */ + + /* ======================================================================= + global connection info + ======================================================================= */ + + XtAppContext app; + Display *dpy; + XrmDatabase db; + + /* ======================================================================= + server extension info + ======================================================================= */ + +# ifdef HAVE_MIT_SAVER_EXTENSION + int mit_saver_ext_event_number; + int mit_saver_ext_error_number; +# endif +# ifdef HAVE_SGI_SAVER_EXTENSION + int sgi_saver_ext_event_number; + int sgi_saver_ext_error_number; +# endif + + + /* ======================================================================= + blanking + ======================================================================= */ + + Bool screen_blanked_p; /* Whether the saver is currently active. */ + + + /* ======================================================================= + locking + ======================================================================= */ + + Bool locking_disabled_p; /* Sometimes locking is impossible. */ + char *nolock_reason; /* This is why. */ + Bool locked_p; /* Whether the screen is currently locked. */ + Bool dbox_up_p; /* Whether the demo-mode or passwd dialogs + are currently visible */ + + + /* ======================================================================= + demoing + ======================================================================= */ + + Bool demo_mode_p; /* Whether demo-mode is active */ + char *demo_hack; /* The hack that has been selected from the + dialog box, which should be run next. */ + + + /* ======================================================================= + timers + ======================================================================= */ + + XtIntervalId lock_id; /* Timer to implement `prefs.lock_timeout' */ + XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */ + XtIntervalId timer_id; /* Timer to implement `prefs.timeout' */ + XtIntervalId watchdog_id; /* Timer to implement `prefs.watchdog */ + XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */ + + time_t last_activity_time; /* Used only when no server exts. */ + saver_screen_info *last_activity_screen; + + + /* ======================================================================= + remote control + ======================================================================= */ + + int next_mode_p; /* Set to 1 if the NEXT ClientMessage has just + been received; set to 2 if PREV has just + been received. (#### This is nasty.) */ + + /* ======================================================================= + subprocs + ======================================================================= */ + + XtIntervalId stderr_popup_timer; + +}; + + +/* This structure holds all the data that applies to the screen-specific parts + of the display connection; if the display has multiple screens, there will + be one of these for each screen. + */ +struct saver_screen_info { + saver_info *global; + + Screen *screen; + Widget toplevel_shell; + + /* ======================================================================= + blanking + ======================================================================= */ + + Window screensaver_window; /* The window that will impersonate the root, + when the screensaver activates. Note that + the window stored here may change, as we + destroy and recreate it on different + visuals. */ + Colormap cmap; /* The colormap that goes with the window. */ + Visual *current_visual; /* The visual of the window. */ + Visual *default_visual; /* visual to use when none other specified */ + int current_depth; /* How deep the visual (and the window) are. */ + + Window real_vroot; /* The original virtual-root window. */ + Window real_vroot_value; /* What was in the __SWM_VROOT property. */ + + Cursor cursor; /* A blank cursor that goes with the + real root window. */ + unsigned long black_pixel; /* Black, allocated from `cmap'. */ + +# ifdef HAVE_MIT_SAVER_EXTENSION + Window server_mit_saver_window; +# endif + + + /* ======================================================================= + demoing + ======================================================================= */ + + Colormap demo_cmap; /* The colormap that goes with the dialogs: + this might be the same as `cmap' so care + must be taken not to free it while it's + still in use. */ + + /* ======================================================================= + timers + ======================================================================= */ + + int poll_mouse_last_root_x; /* Used only when no server exts. */ + int poll_mouse_last_root_y; + Window poll_mouse_last_child; + unsigned int poll_mouse_last_mask; + + + /* ======================================================================= + subprocs + ======================================================================= */ + + int current_hack; /* Index into `prefs.screenhacks' */ + pid_t pid; + + int stderr_text_x; + int stderr_text_y; + int stderr_line_height; + XFontStruct *stderr_font; + GC stderr_gc; + Window stderr_overlay_window; /* Used if the server has overlay planes */ + Colormap stderr_cmap; +}; + + + + +/* ======================================================================= + server extensions and virtual roots + ======================================================================= */ + +extern void restore_real_vroot (saver_info *si); +extern void disable_builtin_screensaver (saver_info *si, Bool turn_off_p); +extern void ensure_no_screensaver_running (Display *, Screen *); + +#ifdef HAVE_MIT_SAVER_EXTENSION +extern Bool query_mit_saver_extension (saver_info *); +#endif +#ifdef HAVE_SGI_SAVER_EXTENSION +extern Bool query_sgi_saver_extension (saver_info *); +#endif + + +/* ======================================================================= + blanking + ======================================================================= */ + +extern void initialize_screensaver_window (saver_info *si); +extern void raise_window (saver_info *si, + Bool inhibit_fade, Bool between_hacks_p, + Bool dont_clear); +extern void blank_screen (saver_info *si); +extern void unblank_screen (saver_info *si); +extern void grab_keyboard_and_mouse (Display *, Window, Cursor); +extern void ungrab_keyboard_and_mouse (Display *dpy); + +/* ======================================================================= + locking + ======================================================================= */ + +#ifndef NO_LOCKING +extern Bool unlock_p (saver_info *si); +extern create_passwd_dialog (Widget, Visual *, Colormap); +extern Bool lock_init (int argc, char **argv); +extern Bool passwd_valid_p (const char *typed_passwd); +#endif + +/* ======================================================================= + demoing + ======================================================================= */ + +#ifndef NO_DEMO_MODE +extern void demo_mode (saver_info *si); +extern void demo_mode_restart_process (saver_info *si); +extern create_demo_dialog (Widget, Visual *, Colormap); +extern create_resources_dialog (Widget, Visual *, Colormap); +#endif + +#if !defined(NO_LOCKING) || !defined(NO_DEMO_MODE) +extern void pop_up_dialog_box (Widget dialog, Widget form, int where); +extern void format_into_label (Widget label, const char *arg); +extern void steal_focus_and_colormap (Widget dialog); +#endif + +/* ======================================================================= + timers + ======================================================================= */ + +extern void start_notice_events_timer (saver_info *, Window); +extern void cycle_timer (XtPointer si, XtIntervalId *id); +extern void activate_lock_timer (XtPointer si, XtIntervalId *id); +extern void reset_watchdog_timer (saver_info *si, Bool on_p); +extern void idle_timer (XtPointer si, XtIntervalId *id); +extern void sleep_until_idle (saver_info *si, Bool until_idle_p); + +/* ======================================================================= + remote control + ======================================================================= */ + +extern Bool handle_clientmessage (saver_info *, XEvent *, Bool); + +/* ======================================================================= + subprocs + ======================================================================= */ + +extern void init_sigchld (void); +extern void spawn_screenhack (saver_info *si, Bool first_time_p); +extern void kill_screenhack (saver_info *si); +extern void suspend_screenhack (saver_info *si, Bool suspend_p); +extern Bool screenhack_running_p (saver_info *si); +extern void emergency_kill_subproc (saver_info *si); +extern Bool select_visual (saver_screen_info *ssi, const char *visual_name); +extern const char *signal_name (int signal); + +/* ======================================================================= + subprocs security + ======================================================================= */ + +#ifdef NO_SETUID +# define hack_uid() +# define hack_uid_warn() +#else /* !NO_SETUID */ + extern void hack_uid (saver_info *si); + extern void hack_uid_warn (saver_info *si); +#endif /* NO_SETUID */ + +/* ======================================================================= + subprocs diagnostics + ======================================================================= */ + +extern FILE *real_stderr; +extern FILE *real_stdout; +extern void initialize_stderr (saver_info *si); +extern void reset_stderr (saver_screen_info *ssi); +extern void clear_stderr (saver_screen_info *ssi); + +/* ======================================================================= + misc + ======================================================================= */ + +extern void save_argv (int argc, char **argv); +extern void saver_exit (saver_info *si, int status); +extern void restart_process (saver_info *si); + +extern int saver_ehandler (Display *dpy, XErrorEvent *error); +extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error); +extern Bool window_exists_p (Display *dpy, Window window); +extern char *timestring (void); + +extern Atom XA_VROOT, XA_XSETROOT_ID; +extern Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; +extern Atom XA_SCREENSAVER_TIME; + +#endif /* __XSCREENSAVER_H__ */ diff --git a/local/man/man.1/xscreensaver.1 b/driver/xscreensaver.man similarity index 100% rename from local/man/man.1/xscreensaver.1 rename to driver/xscreensaver.man diff --git a/driver/xset.c b/driver/xset.c new file mode 100644 index 00000000..cd2aa38c --- /dev/null +++ b/driver/xset.c @@ -0,0 +1,232 @@ +/* xset.c --- interacting with server extensions and the builtin screensaver. + * xscreensaver, Copyright (c) 1991-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +/* This file doesn't need the Xt headers, so stub these types out... */ +#undef XtPointer +#define XtAppContext void* +#define XrmDatabase void* +#define XtIntervalId void* +#define XtPointer void* +#define Widget void* + +#include "xscreensaver.h" + + +/* MIT SCREEN-SAVER server extension hackery. + */ + +#ifdef HAVE_MIT_SAVER_EXTENSION + +# include + +Bool +query_mit_saver_extension (saver_info *si) +{ + return XScreenSaverQueryExtension (si->dpy, + &si->mit_saver_ext_event_number, + &si->mit_saver_ext_error_number); +} + +static int +ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) +{ + return 0; +} + +static void +init_mit_saver_extension (saver_info *si) +{ + int i; + Pixmap *blank_pix = (Pixmap *) calloc (sizeof(Pixmap), si->nscreens); + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + XID kill_id = 0; + Atom kill_type = 0; + Window root = RootWindowOfScreen (ssi->screen); + blank_pix[i] = XCreatePixmap (si->dpy, root, 1, 1, 1); + + /* Kill off the old MIT-SCREEN-SAVER client if there is one. + This tends to generate X errors, though (possibly due to a bug + in the server extension itself?) so just ignore errors here. */ + if (XScreenSaverGetRegistered (si->dpy, + XScreenNumberOfScreen (ssi->screen), + &kill_id, &kill_type) + && kill_id != blank_pix[i]) + { + XErrorHandler old_handler = + XSetErrorHandler (ignore_all_errors_ehandler); + XKillClient (si->dpy, kill_id); + XSync (si->dpy, False); + XSetErrorHandler (old_handler); + } + XScreenSaverSelectInput (si->dpy, root, ScreenSaverNotifyMask); + XScreenSaverRegister (si->dpy, + XScreenNumberOfScreen (ssi->screen), + (XID) blank_pix[i], XA_PIXMAP); + } + free(blank_pix); +} +#endif /* HAVE_MIT_SAVER_EXTENSION */ + + +/* SGI SCREEN_SAVER server extension hackery. + */ + +#ifdef HAVE_SGI_SAVER_EXTENSION + +# include + +Bool +query_sgi_saver_extension (saver_info *si) +{ + return XScreenSaverQueryExtension (si->dpy, + &si->sgi_saver_ext_event_number, + &si->sgi_saver_ext_error_number); +} + +static void +init_sgi_saver_extension (saver_info *si) +{ + saver_preferences *p = &si->prefs; + int i; + if (si->screen_blanked_p) + /* If you mess with this while the server thinks it's active, + the server crashes. */ + return; + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + XScreenSaverDisable (si->dpy, XScreenNumberOfScreen(ssi->screen)); + if (! XScreenSaverEnable (si->dpy, XScreenNumberOfScreen(ssi->screen))) + { + fprintf (stderr, + "%s: SGI SCREEN_SAVER extension exists, but can't be initialized;\n\ + perhaps some other screensaver program is already running?\n", + progname); + p->use_sgi_saver_extension = False; + return; + } + } +} + +#endif /* HAVE_SGI_SAVER_EXTENSION */ + + +/* Figuring out what the appropriate XSetScreenSaver() paramters are + (one wouldn't expect this to be rocket science.) + */ + +void +disable_builtin_screensaver (saver_info *si, Bool turn_off_p) +{ + saver_preferences *p = &si->prefs; + int current_server_timeout, current_server_interval; + int current_prefer_blank, current_allow_exp; + int desired_server_timeout, desired_server_interval; + int desired_prefer_blank, desired_allow_exp; + + XGetScreenSaver (si->dpy, ¤t_server_timeout, ¤t_server_interval, + ¤t_prefer_blank, ¤t_allow_exp); + + desired_server_timeout = current_server_timeout; + desired_server_interval = current_server_interval; + desired_prefer_blank = current_prefer_blank; + desired_allow_exp = current_allow_exp; + + /* On SGIs, if interval is non-zero, it is the number of seconds after + screen saving starts at which the monitor should be powered down. + Obviously I don't want that, so make sure it's 0. + + Power saving is disabled if DontPreferBlanking, but in that case, + we don't get extension events either. So we can't turn it off that way. + */ + desired_server_interval = 0; + + /* I suspect (but am not sure) that DontAllowExposures might have + something to do with powering off the monitor as well. */ + desired_allow_exp = AllowExposures; + +#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION) + if (p->use_mit_saver_extension || p->use_sgi_saver_extension) + { + desired_server_timeout = (p->timeout / 1000); + + /* The SGI extension won't give us events unless blanking is on. + I think (unsure right now) that the MIT extension is the opposite. */ + if (p->use_sgi_saver_extension) + desired_prefer_blank = PreferBlanking; + else + desired_prefer_blank = DontPreferBlanking; + } + else +#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */ + { + desired_server_timeout = 0; + } + + if (desired_server_timeout != current_server_timeout || + desired_server_interval != current_server_interval || + desired_prefer_blank != current_prefer_blank || + desired_allow_exp != current_allow_exp) + { + if (desired_server_timeout == 0) + printf ("%s%sisabling server builtin screensaver.\n\ + You can re-enable it with \"xset s on\".\n", + (p->verbose_p ? "" : progname), + (p->verbose_p ? "\n\tD" : ": d")); + + if (p->verbose_p) + fprintf (stderr, "%s: (xset s %d %d %s %s)\n", progname, + desired_server_timeout, desired_server_interval, + (desired_prefer_blank ? "blank" : "noblank"), + (desired_allow_exp ? "noexpose" : "expose")); + + XSetScreenSaver (si->dpy, + desired_server_timeout, desired_server_interval, + desired_prefer_blank, desired_allow_exp); + XSync(si->dpy, False); + } + + +#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION) + { + static Bool extension_initted = False; + if (!extension_initted) + { + extension_initted = True; +# ifdef HAVE_MIT_SAVER_EXTENSION + if (p->use_mit_saver_extension) init_mit_saver_extension(si); +# endif +# ifdef HAVE_SGI_SAVER_EXTENSION + if (p->use_sgi_saver_extension) init_sgi_saver_extension(si); +# endif + } + } +#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */ + + if (turn_off_p) + /* Turn off the server builtin saver if it is now running. */ + XForceScreenSaver (si->dpy, ScreenSaverReset); +} diff --git a/hacks/.gdbinit b/hacks/.gdbinit new file mode 100644 index 00000000..78a72360 --- /dev/null +++ b/hacks/.gdbinit @@ -0,0 +1,4 @@ +set args -geom =600x480+0+0 -sync +b screenhack_ehandler +b exit +b abort diff --git a/hacks/Makefile.in b/hacks/Makefile.in new file mode 100644 index 00000000..8efdb451 --- /dev/null +++ b/hacks/Makefile.in @@ -0,0 +1,917 @@ +# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. +# the `../configure' script generates `hacks/Makefile' from this file. + +@SET_MAKE@ +.SUFFIXES: +.SUFFIXES: .c .o + +srcdir = @srcdir@ +VPATH = @srcdir@ + +install_prefix = +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +mandir = @mandir@ +man1dir = $(mandir)/man1 +mansuffix = 1 + +CC = @CC@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +DEFS = -DSTANDALONE @DEFS@ +LIBS = @LIBS@ + +DEPEND = @DEPEND@ +DEPEND_FLAGS = @DEPEND_FLAGS@ +DEPEND_DEFINES = @DEPEND_DEFINES@ + +SHELL = /bin/sh +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +HACKDIR = @HACKDIR@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ + +HACK_PRE = $(LIBS) $(X_LIBS) $(X_PRE_LIBS) +HACK_POST = -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm +HACK_LIBS = $(HACK_PRE) @HACK_LIBS@ $(HACK_POST) +XPM_LIBS = $(HACK_PRE) @XPM_LIBS@ @HACK_LIBS@ $(HACK_POST) +XLOCK_LIBS = $(HACK_LIBS) + +UTILS_SRC = $(srcdir)/../utils +UTILS_BIN = ../utils + +INCLUDES = -I$(srcdir) -I$(srcdir)/.. -I$(UTILS_SRC) @INCLUDES@ + +UTIL_SRCS = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \ + $(UTILS_SRC)/grabscreen.c $(UTILS_SRC)/hsv.c \ + $(UTILS_SRC)/resources.c $(UTILS_SRC)/spline.c \ + $(UTILS_SRC)/usleep.c $(UTILS_SRC)/visual.c \ + $(UTILS_SRC)/xroger.c $(UTILS_SRC)/yarandom.c +UTIL_OBJS = $(UTILS_SRC)/alpha.o $(UTILS_SRC)/colors.o \ + $(UTILS_SRC)/grabscreen.o $(UTILS_SRC)/hsv.o \ + $(UTILS_SRC)/resources.o $(UTILS_SRC)/spline.o \ + $(UTILS_SRC)/usleep.o $(UTILS_SRC)/visual.o \ + $(UTILS_SRC)/xroger.o $(UTILS_SRC)/yarandom.o + +SRCS = attraction.c blitspin.c bouboule.c braid.c bubbles.c \ + bubbles_default.c decayscreen.c deco.c drift.c flag.c \ + flame.c forest.c fract.c galaxy.c grav.c greynetic.c \ + halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \ + julia.c kaleidescope.c laser.c lightning.c lisa.c lmorph.c \ + maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \ + rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \ + slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \ + xroger-hack.c goop.c starfish.c munch.c fadeplot.c + +OBJS = attraction.o blitspin.o bouboule.o braid.o bubbles.o \ + bubbles_default.o decayscreen.o deco.o drift.o flag.o \ + flame.o forest.o fract.o galaxy.o grav.o greynetic.o \ + halo.o helix.o hopalong.o hypercube.o ifs.o imsmap.o \ + julia.o kaleidescope.o laser.o lightning.o lisa.o lmorph.o \ + maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \ + rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \ + slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \ + xroger-hack.o goop.o starfish.o munch.o fadeplot.o + +EXES = attraction blitspin bouboule braid bubbles decayscreen deco \ + drift flag flame forest fract galaxy grav greynetic halo \ + helix hopalong hypercube ifs imsmap julia kaleidescope \ + laser lightning lisa lmorph maze moire noseguy pedal \ + penrose pyro qix rocks rorschach sierpinski slidescreen \ + slip sphere spiral strange swirl xroger goop starfish munch \ + fadeplot + +HACK_OBJS_1 = $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o @XMU_OBJS@ +HACK_OBJS = screenhack.o $(HACK_OBJS_1) +XLOCK_OBJS = screenhack-xlock.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1) +COLOR_OBJS = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o +GRAB_OBJS = $(UTILS_BIN)/grabscreen.o $(COLOR_OBJS) + +HDRS = bubbles.h screenhack.h xlockmore.h xlockmoreI.h +MEN = attraction.man blitspin.man bouboule.man braid.man \ + bubbles.man decayscreen.man deco.man drift.man flag.man \ + flame.man forest.man fract.man galaxy.man grav.man \ + greynetic.man halo.man helix.man hopalong.man hypercube.man \ + ifs.man imsmap.man julia.man kaleidescope.man laser.man \ + lightning.man lisa.man lmorph.man maze.man moire.man \ + noseguy.man pedal.man penrose.man pyro.man qix.man \ + rocks.man rorschach.man sierpinski.man slidescreen.man \ + slip.man sphere.man spiral.man strange.man swirl.man \ + xroger.man goop.man starfish.man munch.man +STAR = * +EXTRAS = README Makefile.in xlock.h default.xbm bob.xbm .gdbinit \ + noses/nose-$(STAR).xbm noses/nose-$(STAR).xpm \ + bubbles-tools/bubbles$(STAR) \ + bubbles-tools/xpm$(STAR) \ + bubbles-sources/$(STAR).pov \ + bubbles-samples/$(STAR).bub.gz + +VMSFILES = compile_axp.com compile_decc.com link_axp.com link_decc.com \ + vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt + +TARFILES = $(SRCS) $(HDRS) $(MEN) $(EXTRAS) $(VMSFILES) + + +all: $(EXES) + +install: install-program install-man +uninstall: uninstall-program uninstall-man + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install + +install-program: + @for program in $(EXES); do \ + echo $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ; \ + $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ; \ + done + +install-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + done + +uninstall-program: + @for program in $(EXES); do \ + echo rm -f $(HACKDIR)/$$program ; \ + rm -f $(HACKDIR)/$$program ; \ + done + +uninstall-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo rm -f $(man1dir)/$$instname ; \ + rm -f $(man1dir)/$$instname ; \ + done + +clean: + -rm -f *.o a.out core $(EXES) + +distclean: clean + -rm -f Makefile *~ "#"* + +# Adds all current dependencies to Makefile +depend: + $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \ + $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SRCS) + +# Adds some dependencies to Makefile.in -- not totally accurate, but pretty +# close. This excludes dependencies on files in /usr/include, etc. It tries +# to include only dependencies on files which are themselves a part of this +# package. +distdepend: + @echo updating dependencies in `pwd`/Makefile.in... ; \ + $(DEPEND) -w 0 -f - \ + -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SRCS) | \ + ( \ + awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \ + sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \ + -e 's@\.\./utils@$$(UTILS_SRC)@g' \ + -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' ; \ + echo '' \ + ) > /tmp/distdepend.$$$$ && \ + mv Makefile.in Makefile.in.bak && \ + mv /tmp/distdepend.$$$$ Makefile.in + +TAGS: tags +tags: + find $(srcdir) -name '*.[chly]' -print | xargs etags -a + +echo_tarfiles: + @echo $(TARFILES) + + +# Rules for noticing when the objects from the utils directory are out of +# date with respect to their sources, and going and building them according +# to the rules in their own Makefile... +# +$(UTILS_BIN)/alpha.o: $(UTILS_SRC)/alpha.c +$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c +$(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c +$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c +$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c +$(UTILS_BIN)/spline.o: $(UTILS_SRC)/spline.c +$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c +$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c +$(UTILS_BIN)/xmu.o: $(UTILS_SRC)/xmu.c +$(UTILS_BIN)/xroger.o: $(UTILS_SRC)/xroger.c +$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c + +$(UTIL_OBJS): + cd $(UTILS_BIN) ; \ + $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +# How we build object files in this directory. +.c.o: + $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $< + +# Some hacks use a slightly-differently-compiled variant of this file. +# This is how to make the the other .o file from it. +# +screenhack-xlock.o: screenhack.c + $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \ + -DXLOCKMORE $(srcdir)/screenhack.c + +# Some abbreviations to keep the lines short... +ALP = $(HSV) $(UTILS_BIN)/alpha.o +HSV = $(UTILS_BIN)/hsv.o +SPL = $(UTILS_BIN)/spline.o +XROG = $(UTILS_BIN)/xroger.o +GRAB = $(UTILS_BIN)/grabscreen.o +COL = $(COLOR_OBJS) + +CC_HACK = $(CC) $(LDFLAGS) + + +# The rules for those hacks which follow the `screenhack.c' API. +# If make wasn't such an utter abomination, these could all be combined +# into one rule, but we don't live in such a perfect world. The $< rule +# is pretty much useless in the face of more than one dependency, as far +# as I can tell. +# +attraction: $(HACK_OBJS) attraction.o $(COL) $(SPL) + $(CC_HACK) -o $@ $(HACK_OBJS) attraction.o $(COL) $(SPL) $(HACK_LIBS) + +blitspin: $(HACK_OBJS) blitspin.o $(GRAB_OBJS) + $(CC_HACK) -o $@ $(HACK_OBJS) blitspin.o $(GRAB_OBJS) $(XPM_LIBS) + +bubbles: $(HACK_OBJS) bubbles.o bubbles_default.o + $(CC_HACK) -o $@ $(HACK_OBJS) bubbles.o bubbles_default.o $(XPM_LIBS) + +decayscreen: $(HACK_OBJS) decayscreen.o $(GRAB_OBJS) + $(CC_HACK) -o $@ $(HACK_OBJS) decayscreen.o $(GRAB_OBJS) $(HACK_LIBS) + +deco: $(HACK_OBJS) deco.o $(COL) + $(CC_HACK) -o $@ $(HACK_OBJS) deco.o $(COL) $(HACK_LIBS) + +flame: $(HACK_OBJS) flame.o $(COL) + $(CC_HACK) -o $@ $(HACK_OBJS) flame.o $(COL) $(HACK_LIBS) + +greynetic: $(HACK_OBJS) greynetic.o + $(CC_HACK) -o $@ $(HACK_OBJS) greynetic.o $(HACK_LIBS) + +halo: $(HACK_OBJS) halo.o $(COL) + $(CC_HACK) -o $@ $(HACK_OBJS) halo.o $(COL) $(HACK_LIBS) + +helix: $(HACK_OBJS) helix.o $(HSV) + $(CC_HACK) -o $@ $(HACK_OBJS) helix.o $(HSV) $(HACK_LIBS) + +hypercube: $(HACK_OBJS) hypercube.o + $(CC_HACK) -o $@ $(HACK_OBJS) hypercube.o $(HACK_LIBS) + +imsmap: $(HACK_OBJS) imsmap.o $(COL) + $(CC_HACK) -o $@ $(HACK_OBJS) imsmap.o $(COL) $(HACK_LIBS) + +kaleidescope: $(HACK_OBJS) kaleidescope.o + $(CC_HACK) -o $@ $(HACK_OBJS) kaleidescope.o $(HACK_LIBS) + +lmorph: $(HACK_OBJS) lmorph.o + $(CC_HACK) -o $@ $(HACK_OBJS) lmorph.o $(HACK_LIBS) + +maze: $(HACK_OBJS) maze.o $(UTILS_BIN)/xroger.o + $(CC_HACK) -o $@ $(HACK_OBJS) maze.o $(UTILS_BIN)/xroger.o $(HACK_LIBS) + +moire: $(HACK_OBJS) moire.o $(COL) + $(CC_HACK) -o $@ $(HACK_OBJS) moire.o $(COL) $(HACK_LIBS) + +noseguy: $(HACK_OBJS) noseguy.o + $(CC_HACK) -o $@ $(HACK_OBJS) noseguy.o $(XPM_LIBS) + +pedal: $(HACK_OBJS) pedal.o $(HSV) + $(CC_HACK) -o $@ $(HACK_OBJS) pedal.o $(HSV) $(HACK_LIBS) + +pyro: $(HACK_OBJS) pyro.o $(HSV) + $(CC_HACK) -o $@ $(HACK_OBJS) pyro.o $(HSV) $(HACK_LIBS) + +qix: $(HACK_OBJS) qix.o $(ALP) + $(CC_HACK) -o $@ $(HACK_OBJS) qix.o $(ALP) $(HACK_LIBS) + +rocks: $(HACK_OBJS) rocks.o + $(CC_HACK) -o $@ $(HACK_OBJS) rocks.o $(HACK_LIBS) + +rorschach: $(HACK_OBJS) rorschach.o $(HSV) + $(CC_HACK) -o $@ $(HACK_OBJS) rorschach.o $(HSV) $(HACK_LIBS) + +slidescreen: $(HACK_OBJS) slidescreen.o $(GRAB_OBJS) + $(CC_HACK) -o $@ $(HACK_OBJS) slidescreen.o $(GRAB_OBJS) $(HACK_LIBS) + +xroger: $(HACK_OBJS) xroger-hack.o $(HSV) $(XROG) + $(CC_HACK) -o $@ $(HACK_OBJS) xroger-hack.o $(HSV) $(XROG) $(HACK_LIBS) + +goop: $(HACK_OBJS) goop.o $(ALP) $(SPL) + $(CC_HACK) -o $@ $(HACK_OBJS) goop.o $(ALP) $(SPL) $(HACK_LIBS) + +starfish: $(HACK_OBJS) starfish.o $(COL) $(SPL) + $(CC_HACK) -o $@ $(HACK_OBJS) starfish.o $(COL) $(SPL) $(HACK_LIBS) + +munch: $(HACK_OBJS) munch.o $(COL) $(SPL) + $(CC_HACK) -o $@ $(HACK_OBJS) munch.o $(COL) $(SPL) $(HACK_LIBS) + + +# The rules for those hacks which follow the `xlockmore' API. +# + +bouboule: bouboule.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +braid: braid.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +drift: drift.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +flag: flag.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +forest: forest.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +fract: fract.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +galaxy: galaxy.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +grav: grav.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +hopalong: hopalong.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +ifs: ifs.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +julia: julia.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +laser: laser.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +lightning: lightning.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +lisa: lisa.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +penrose: penrose.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +sierpinski: sierpinski.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +slip: slip.o $(XLOCK_OBJS) $(GRAB) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(GRAB) $(HACK_LIBS) + +sphere: sphere.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +spiral: spiral.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +strange: strange.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +swirl: swirl.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + +fadeplot: fadeplot.o $(XLOCK_OBJS) + $(CC_HACK) -o $@ $@.o $(XLOCK_OBJS) $(HACK_LIBS) + + +############################################################################## +# +# DO NOT DELETE: updated by make distdepend + +attraction.o: $(srcdir)/screenhack.h +attraction.o: $(srcdir)/../config.h +attraction.o: $(UTILS_SRC)/yarandom.h +attraction.o: $(UTILS_SRC)/usleep.h +attraction.o: $(UTILS_SRC)/resources.h +attraction.o: $(UTILS_SRC)/hsv.h +attraction.o: $(UTILS_SRC)/colors.h +attraction.o: $(UTILS_SRC)/grabscreen.h +attraction.o: $(UTILS_SRC)/visual.h +attraction.o: $(UTILS_SRC)/spline.h +blitspin.o: $(srcdir)/screenhack.h +blitspin.o: $(srcdir)/../config.h +blitspin.o: $(UTILS_SRC)/yarandom.h +blitspin.o: $(UTILS_SRC)/usleep.h +blitspin.o: $(UTILS_SRC)/resources.h +blitspin.o: $(UTILS_SRC)/hsv.h +blitspin.o: $(UTILS_SRC)/colors.h +blitspin.o: $(UTILS_SRC)/grabscreen.h +blitspin.o: $(UTILS_SRC)/visual.h +blitspin.o: $(srcdir)/default.xbm +bouboule.o: $(srcdir)/xlockmore.h +bouboule.o: $(srcdir)/../config.h +bouboule.o: $(srcdir)/xlockmoreI.h +bouboule.o: $(srcdir)/screenhack.h +bouboule.o: $(UTILS_SRC)/yarandom.h +bouboule.o: $(UTILS_SRC)/usleep.h +bouboule.o: $(UTILS_SRC)/resources.h +bouboule.o: $(UTILS_SRC)/hsv.h +bouboule.o: $(UTILS_SRC)/colors.h +bouboule.o: $(UTILS_SRC)/grabscreen.h +bouboule.o: $(UTILS_SRC)/visual.h +braid.o: $(srcdir)/xlockmore.h +braid.o: $(srcdir)/../config.h +braid.o: $(srcdir)/xlockmoreI.h +braid.o: $(srcdir)/screenhack.h +braid.o: $(UTILS_SRC)/yarandom.h +braid.o: $(UTILS_SRC)/usleep.h +braid.o: $(UTILS_SRC)/resources.h +braid.o: $(UTILS_SRC)/hsv.h +braid.o: $(UTILS_SRC)/colors.h +braid.o: $(UTILS_SRC)/grabscreen.h +braid.o: $(UTILS_SRC)/visual.h +bubbles.o: $(srcdir)/screenhack.h +bubbles.o: $(srcdir)/../config.h +bubbles.o: $(UTILS_SRC)/yarandom.h +bubbles.o: $(UTILS_SRC)/usleep.h +bubbles.o: $(UTILS_SRC)/resources.h +bubbles.o: $(UTILS_SRC)/hsv.h +bubbles.o: $(UTILS_SRC)/colors.h +bubbles.o: $(UTILS_SRC)/grabscreen.h +bubbles.o: $(UTILS_SRC)/visual.h +bubbles.o: $(srcdir)/bubbles.h +bubbles_default.o: $(srcdir)/../config.h +bubbles_default.o: $(srcdir)/bubbles.h +decayscreen.o: $(srcdir)/screenhack.h +decayscreen.o: $(srcdir)/../config.h +decayscreen.o: $(UTILS_SRC)/yarandom.h +decayscreen.o: $(UTILS_SRC)/usleep.h +decayscreen.o: $(UTILS_SRC)/resources.h +decayscreen.o: $(UTILS_SRC)/hsv.h +decayscreen.o: $(UTILS_SRC)/colors.h +decayscreen.o: $(UTILS_SRC)/grabscreen.h +decayscreen.o: $(UTILS_SRC)/visual.h +deco.o: $(srcdir)/screenhack.h +deco.o: $(srcdir)/../config.h +deco.o: $(UTILS_SRC)/yarandom.h +deco.o: $(UTILS_SRC)/usleep.h +deco.o: $(UTILS_SRC)/resources.h +deco.o: $(UTILS_SRC)/hsv.h +deco.o: $(UTILS_SRC)/colors.h +deco.o: $(UTILS_SRC)/grabscreen.h +deco.o: $(UTILS_SRC)/visual.h +drift.o: $(srcdir)/xlockmore.h +drift.o: $(srcdir)/../config.h +drift.o: $(srcdir)/xlockmoreI.h +drift.o: $(srcdir)/screenhack.h +drift.o: $(UTILS_SRC)/yarandom.h +drift.o: $(UTILS_SRC)/usleep.h +drift.o: $(UTILS_SRC)/resources.h +drift.o: $(UTILS_SRC)/hsv.h +drift.o: $(UTILS_SRC)/colors.h +drift.o: $(UTILS_SRC)/grabscreen.h +drift.o: $(UTILS_SRC)/visual.h +flag.o: $(srcdir)/xlockmore.h +flag.o: $(srcdir)/../config.h +flag.o: $(srcdir)/xlockmoreI.h +flag.o: $(srcdir)/screenhack.h +flag.o: $(UTILS_SRC)/yarandom.h +flag.o: $(UTILS_SRC)/usleep.h +flag.o: $(UTILS_SRC)/resources.h +flag.o: $(UTILS_SRC)/hsv.h +flag.o: $(UTILS_SRC)/colors.h +flag.o: $(UTILS_SRC)/grabscreen.h +flag.o: $(UTILS_SRC)/visual.h +flag.o: $(srcdir)/bob.xbm +flame.o: $(srcdir)/screenhack.h +flame.o: $(srcdir)/../config.h +flame.o: $(UTILS_SRC)/yarandom.h +flame.o: $(UTILS_SRC)/usleep.h +flame.o: $(UTILS_SRC)/resources.h +flame.o: $(UTILS_SRC)/hsv.h +flame.o: $(UTILS_SRC)/colors.h +flame.o: $(UTILS_SRC)/grabscreen.h +flame.o: $(UTILS_SRC)/visual.h +forest.o: $(srcdir)/xlockmore.h +forest.o: $(srcdir)/../config.h +forest.o: $(srcdir)/xlockmoreI.h +forest.o: $(srcdir)/screenhack.h +forest.o: $(UTILS_SRC)/yarandom.h +forest.o: $(UTILS_SRC)/usleep.h +forest.o: $(UTILS_SRC)/resources.h +forest.o: $(UTILS_SRC)/hsv.h +forest.o: $(UTILS_SRC)/colors.h +forest.o: $(UTILS_SRC)/grabscreen.h +forest.o: $(UTILS_SRC)/visual.h +fract.o: $(srcdir)/xlockmore.h +fract.o: $(srcdir)/../config.h +fract.o: $(srcdir)/xlockmoreI.h +fract.o: $(srcdir)/screenhack.h +fract.o: $(UTILS_SRC)/yarandom.h +fract.o: $(UTILS_SRC)/usleep.h +fract.o: $(UTILS_SRC)/resources.h +fract.o: $(UTILS_SRC)/hsv.h +fract.o: $(UTILS_SRC)/colors.h +fract.o: $(UTILS_SRC)/grabscreen.h +fract.o: $(UTILS_SRC)/visual.h +galaxy.o: $(srcdir)/xlockmore.h +galaxy.o: $(srcdir)/../config.h +galaxy.o: $(srcdir)/xlockmoreI.h +galaxy.o: $(srcdir)/screenhack.h +galaxy.o: $(UTILS_SRC)/yarandom.h +galaxy.o: $(UTILS_SRC)/usleep.h +galaxy.o: $(UTILS_SRC)/resources.h +galaxy.o: $(UTILS_SRC)/hsv.h +galaxy.o: $(UTILS_SRC)/colors.h +galaxy.o: $(UTILS_SRC)/grabscreen.h +galaxy.o: $(UTILS_SRC)/visual.h +grav.o: $(srcdir)/xlockmore.h +grav.o: $(srcdir)/../config.h +grav.o: $(srcdir)/xlockmoreI.h +grav.o: $(srcdir)/screenhack.h +grav.o: $(UTILS_SRC)/yarandom.h +grav.o: $(UTILS_SRC)/usleep.h +grav.o: $(UTILS_SRC)/resources.h +grav.o: $(UTILS_SRC)/hsv.h +grav.o: $(UTILS_SRC)/colors.h +grav.o: $(UTILS_SRC)/grabscreen.h +grav.o: $(UTILS_SRC)/visual.h +greynetic.o: $(srcdir)/screenhack.h +greynetic.o: $(srcdir)/../config.h +greynetic.o: $(UTILS_SRC)/yarandom.h +greynetic.o: $(UTILS_SRC)/usleep.h +greynetic.o: $(UTILS_SRC)/resources.h +greynetic.o: $(UTILS_SRC)/hsv.h +greynetic.o: $(UTILS_SRC)/colors.h +greynetic.o: $(UTILS_SRC)/grabscreen.h +greynetic.o: $(UTILS_SRC)/visual.h +halo.o: $(srcdir)/screenhack.h +halo.o: $(srcdir)/../config.h +halo.o: $(UTILS_SRC)/yarandom.h +halo.o: $(UTILS_SRC)/usleep.h +halo.o: $(UTILS_SRC)/resources.h +halo.o: $(UTILS_SRC)/hsv.h +halo.o: $(UTILS_SRC)/colors.h +halo.o: $(UTILS_SRC)/grabscreen.h +halo.o: $(UTILS_SRC)/visual.h +helix.o: $(srcdir)/screenhack.h +helix.o: $(srcdir)/../config.h +helix.o: $(UTILS_SRC)/yarandom.h +helix.o: $(UTILS_SRC)/usleep.h +helix.o: $(UTILS_SRC)/resources.h +helix.o: $(UTILS_SRC)/hsv.h +helix.o: $(UTILS_SRC)/colors.h +helix.o: $(UTILS_SRC)/grabscreen.h +helix.o: $(UTILS_SRC)/visual.h +hopalong.o: $(srcdir)/xlockmore.h +hopalong.o: $(srcdir)/../config.h +hopalong.o: $(srcdir)/xlockmoreI.h +hopalong.o: $(srcdir)/screenhack.h +hopalong.o: $(UTILS_SRC)/yarandom.h +hopalong.o: $(UTILS_SRC)/usleep.h +hopalong.o: $(UTILS_SRC)/resources.h +hopalong.o: $(UTILS_SRC)/hsv.h +hopalong.o: $(UTILS_SRC)/colors.h +hopalong.o: $(UTILS_SRC)/grabscreen.h +hopalong.o: $(UTILS_SRC)/visual.h +hypercube.o: $(srcdir)/screenhack.h +hypercube.o: $(srcdir)/../config.h +hypercube.o: $(UTILS_SRC)/yarandom.h +hypercube.o: $(UTILS_SRC)/usleep.h +hypercube.o: $(UTILS_SRC)/resources.h +hypercube.o: $(UTILS_SRC)/hsv.h +hypercube.o: $(UTILS_SRC)/colors.h +hypercube.o: $(UTILS_SRC)/grabscreen.h +hypercube.o: $(UTILS_SRC)/visual.h +ifs.o: $(srcdir)/xlockmore.h +ifs.o: $(srcdir)/../config.h +ifs.o: $(srcdir)/xlockmoreI.h +ifs.o: $(srcdir)/screenhack.h +ifs.o: $(UTILS_SRC)/yarandom.h +ifs.o: $(UTILS_SRC)/usleep.h +ifs.o: $(UTILS_SRC)/resources.h +ifs.o: $(UTILS_SRC)/hsv.h +ifs.o: $(UTILS_SRC)/colors.h +ifs.o: $(UTILS_SRC)/grabscreen.h +ifs.o: $(UTILS_SRC)/visual.h +imsmap.o: $(srcdir)/screenhack.h +imsmap.o: $(srcdir)/../config.h +imsmap.o: $(UTILS_SRC)/yarandom.h +imsmap.o: $(UTILS_SRC)/usleep.h +imsmap.o: $(UTILS_SRC)/resources.h +imsmap.o: $(UTILS_SRC)/hsv.h +imsmap.o: $(UTILS_SRC)/colors.h +imsmap.o: $(UTILS_SRC)/grabscreen.h +imsmap.o: $(UTILS_SRC)/visual.h +julia.o: $(srcdir)/xlockmore.h +julia.o: $(srcdir)/../config.h +julia.o: $(srcdir)/xlockmoreI.h +julia.o: $(srcdir)/screenhack.h +julia.o: $(UTILS_SRC)/yarandom.h +julia.o: $(UTILS_SRC)/usleep.h +julia.o: $(UTILS_SRC)/resources.h +julia.o: $(UTILS_SRC)/hsv.h +julia.o: $(UTILS_SRC)/colors.h +julia.o: $(UTILS_SRC)/grabscreen.h +julia.o: $(UTILS_SRC)/visual.h +kaleidescope.o: $(UTILS_SRC)/spline.h +kaleidescope.o: $(srcdir)/screenhack.h +kaleidescope.o: $(srcdir)/../config.h +kaleidescope.o: $(UTILS_SRC)/yarandom.h +kaleidescope.o: $(UTILS_SRC)/usleep.h +kaleidescope.o: $(UTILS_SRC)/resources.h +kaleidescope.o: $(UTILS_SRC)/hsv.h +kaleidescope.o: $(UTILS_SRC)/colors.h +kaleidescope.o: $(UTILS_SRC)/grabscreen.h +kaleidescope.o: $(UTILS_SRC)/visual.h +laser.o: $(srcdir)/xlockmore.h +laser.o: $(srcdir)/../config.h +laser.o: $(srcdir)/xlockmoreI.h +laser.o: $(srcdir)/screenhack.h +laser.o: $(UTILS_SRC)/yarandom.h +laser.o: $(UTILS_SRC)/usleep.h +laser.o: $(UTILS_SRC)/resources.h +laser.o: $(UTILS_SRC)/hsv.h +laser.o: $(UTILS_SRC)/colors.h +laser.o: $(UTILS_SRC)/grabscreen.h +laser.o: $(UTILS_SRC)/visual.h +lightning.o: $(srcdir)/xlockmore.h +lightning.o: $(srcdir)/../config.h +lightning.o: $(srcdir)/xlockmoreI.h +lightning.o: $(srcdir)/screenhack.h +lightning.o: $(UTILS_SRC)/yarandom.h +lightning.o: $(UTILS_SRC)/usleep.h +lightning.o: $(UTILS_SRC)/resources.h +lightning.o: $(UTILS_SRC)/hsv.h +lightning.o: $(UTILS_SRC)/colors.h +lightning.o: $(UTILS_SRC)/grabscreen.h +lightning.o: $(UTILS_SRC)/visual.h +lisa.o: $(srcdir)/xlockmore.h +lisa.o: $(srcdir)/../config.h +lisa.o: $(srcdir)/xlockmoreI.h +lisa.o: $(srcdir)/screenhack.h +lisa.o: $(UTILS_SRC)/yarandom.h +lisa.o: $(UTILS_SRC)/usleep.h +lisa.o: $(UTILS_SRC)/resources.h +lisa.o: $(UTILS_SRC)/hsv.h +lisa.o: $(UTILS_SRC)/colors.h +lisa.o: $(UTILS_SRC)/grabscreen.h +lisa.o: $(UTILS_SRC)/visual.h +lmorph.o: $(srcdir)/screenhack.h +lmorph.o: $(srcdir)/../config.h +lmorph.o: $(UTILS_SRC)/yarandom.h +lmorph.o: $(UTILS_SRC)/usleep.h +lmorph.o: $(UTILS_SRC)/resources.h +lmorph.o: $(UTILS_SRC)/hsv.h +lmorph.o: $(UTILS_SRC)/colors.h +lmorph.o: $(UTILS_SRC)/grabscreen.h +lmorph.o: $(UTILS_SRC)/visual.h +maze.o: $(srcdir)/screenhack.h +maze.o: $(srcdir)/../config.h +maze.o: $(UTILS_SRC)/yarandom.h +maze.o: $(UTILS_SRC)/usleep.h +maze.o: $(UTILS_SRC)/resources.h +maze.o: $(UTILS_SRC)/hsv.h +maze.o: $(UTILS_SRC)/colors.h +maze.o: $(UTILS_SRC)/grabscreen.h +maze.o: $(UTILS_SRC)/visual.h +moire.o: $(srcdir)/screenhack.h +moire.o: $(srcdir)/../config.h +moire.o: $(UTILS_SRC)/yarandom.h +moire.o: $(UTILS_SRC)/usleep.h +moire.o: $(UTILS_SRC)/resources.h +moire.o: $(UTILS_SRC)/hsv.h +moire.o: $(UTILS_SRC)/colors.h +moire.o: $(UTILS_SRC)/grabscreen.h +moire.o: $(UTILS_SRC)/visual.h +noseguy.o: $(srcdir)/screenhack.h +noseguy.o: $(srcdir)/../config.h +noseguy.o: $(UTILS_SRC)/yarandom.h +noseguy.o: $(UTILS_SRC)/usleep.h +noseguy.o: $(UTILS_SRC)/resources.h +noseguy.o: $(UTILS_SRC)/hsv.h +noseguy.o: $(UTILS_SRC)/colors.h +noseguy.o: $(UTILS_SRC)/grabscreen.h +noseguy.o: $(UTILS_SRC)/visual.h +noseguy.o: $(srcdir)/noses/nose-f1.xpm +noseguy.o: $(srcdir)/noses/nose-f2.xpm +noseguy.o: $(srcdir)/noses/nose-f3.xpm +noseguy.o: $(srcdir)/noses/nose-f4.xpm +noseguy.o: $(srcdir)/noses/nose-l1.xpm +noseguy.o: $(srcdir)/noses/nose-l2.xpm +noseguy.o: $(srcdir)/noses/nose-r1.xpm +noseguy.o: $(srcdir)/noses/nose-r2.xpm +pedal.o: $(srcdir)/screenhack.h +pedal.o: $(srcdir)/../config.h +pedal.o: $(UTILS_SRC)/yarandom.h +pedal.o: $(UTILS_SRC)/usleep.h +pedal.o: $(UTILS_SRC)/resources.h +pedal.o: $(UTILS_SRC)/hsv.h +pedal.o: $(UTILS_SRC)/colors.h +pedal.o: $(UTILS_SRC)/grabscreen.h +pedal.o: $(UTILS_SRC)/visual.h +penrose.o: $(srcdir)/xlockmore.h +penrose.o: $(srcdir)/../config.h +penrose.o: $(srcdir)/xlockmoreI.h +penrose.o: $(srcdir)/screenhack.h +penrose.o: $(UTILS_SRC)/yarandom.h +penrose.o: $(UTILS_SRC)/usleep.h +penrose.o: $(UTILS_SRC)/resources.h +penrose.o: $(UTILS_SRC)/hsv.h +penrose.o: $(UTILS_SRC)/colors.h +penrose.o: $(UTILS_SRC)/grabscreen.h +penrose.o: $(UTILS_SRC)/visual.h +pyro.o: $(srcdir)/screenhack.h +pyro.o: $(srcdir)/../config.h +pyro.o: $(UTILS_SRC)/yarandom.h +pyro.o: $(UTILS_SRC)/usleep.h +pyro.o: $(UTILS_SRC)/resources.h +pyro.o: $(UTILS_SRC)/hsv.h +pyro.o: $(UTILS_SRC)/colors.h +pyro.o: $(UTILS_SRC)/grabscreen.h +pyro.o: $(UTILS_SRC)/visual.h +qix.o: $(srcdir)/screenhack.h +qix.o: $(srcdir)/../config.h +qix.o: $(UTILS_SRC)/yarandom.h +qix.o: $(UTILS_SRC)/usleep.h +qix.o: $(UTILS_SRC)/resources.h +qix.o: $(UTILS_SRC)/hsv.h +qix.o: $(UTILS_SRC)/colors.h +qix.o: $(UTILS_SRC)/grabscreen.h +qix.o: $(UTILS_SRC)/visual.h +qix.o: $(UTILS_SRC)/alpha.h +rocks.o: $(srcdir)/screenhack.h +rocks.o: $(srcdir)/../config.h +rocks.o: $(UTILS_SRC)/yarandom.h +rocks.o: $(UTILS_SRC)/usleep.h +rocks.o: $(UTILS_SRC)/resources.h +rocks.o: $(UTILS_SRC)/hsv.h +rocks.o: $(UTILS_SRC)/colors.h +rocks.o: $(UTILS_SRC)/grabscreen.h +rocks.o: $(UTILS_SRC)/visual.h +rorschach.o: $(srcdir)/screenhack.h +rorschach.o: $(srcdir)/../config.h +rorschach.o: $(UTILS_SRC)/yarandom.h +rorschach.o: $(UTILS_SRC)/usleep.h +rorschach.o: $(UTILS_SRC)/resources.h +rorschach.o: $(UTILS_SRC)/hsv.h +rorschach.o: $(UTILS_SRC)/colors.h +rorschach.o: $(UTILS_SRC)/grabscreen.h +rorschach.o: $(UTILS_SRC)/visual.h +screenhack.o: $(UTILS_SRC)/xmu.h +screenhack.o: $(srcdir)/screenhack.h +screenhack.o: $(srcdir)/../config.h +screenhack.o: $(UTILS_SRC)/yarandom.h +screenhack.o: $(UTILS_SRC)/usleep.h +screenhack.o: $(UTILS_SRC)/resources.h +screenhack.o: $(UTILS_SRC)/hsv.h +screenhack.o: $(UTILS_SRC)/colors.h +screenhack.o: $(UTILS_SRC)/grabscreen.h +screenhack.o: $(UTILS_SRC)/visual.h +screenhack.o: $(UTILS_SRC)/version.h +screenhack.o: $(UTILS_SRC)/vroot.h +sierpinski.o: $(srcdir)/xlockmore.h +sierpinski.o: $(srcdir)/../config.h +sierpinski.o: $(srcdir)/xlockmoreI.h +sierpinski.o: $(srcdir)/screenhack.h +sierpinski.o: $(UTILS_SRC)/yarandom.h +sierpinski.o: $(UTILS_SRC)/usleep.h +sierpinski.o: $(UTILS_SRC)/resources.h +sierpinski.o: $(UTILS_SRC)/hsv.h +sierpinski.o: $(UTILS_SRC)/colors.h +sierpinski.o: $(UTILS_SRC)/grabscreen.h +sierpinski.o: $(UTILS_SRC)/visual.h +slidescreen.o: $(srcdir)/screenhack.h +slidescreen.o: $(srcdir)/../config.h +slidescreen.o: $(UTILS_SRC)/yarandom.h +slidescreen.o: $(UTILS_SRC)/usleep.h +slidescreen.o: $(UTILS_SRC)/resources.h +slidescreen.o: $(UTILS_SRC)/hsv.h +slidescreen.o: $(UTILS_SRC)/colors.h +slidescreen.o: $(UTILS_SRC)/grabscreen.h +slidescreen.o: $(UTILS_SRC)/visual.h +slip.o: $(srcdir)/xlockmore.h +slip.o: $(srcdir)/../config.h +slip.o: $(srcdir)/xlockmoreI.h +slip.o: $(srcdir)/screenhack.h +slip.o: $(UTILS_SRC)/yarandom.h +slip.o: $(UTILS_SRC)/usleep.h +slip.o: $(UTILS_SRC)/resources.h +slip.o: $(UTILS_SRC)/hsv.h +slip.o: $(UTILS_SRC)/colors.h +slip.o: $(UTILS_SRC)/grabscreen.h +slip.o: $(UTILS_SRC)/visual.h +sphere.o: $(srcdir)/xlockmore.h +sphere.o: $(srcdir)/../config.h +sphere.o: $(srcdir)/xlockmoreI.h +sphere.o: $(srcdir)/screenhack.h +sphere.o: $(UTILS_SRC)/yarandom.h +sphere.o: $(UTILS_SRC)/usleep.h +sphere.o: $(UTILS_SRC)/resources.h +sphere.o: $(UTILS_SRC)/hsv.h +sphere.o: $(UTILS_SRC)/colors.h +sphere.o: $(UTILS_SRC)/grabscreen.h +sphere.o: $(UTILS_SRC)/visual.h +spiral.o: $(srcdir)/xlockmore.h +spiral.o: $(srcdir)/../config.h +spiral.o: $(srcdir)/xlockmoreI.h +spiral.o: $(srcdir)/screenhack.h +spiral.o: $(UTILS_SRC)/yarandom.h +spiral.o: $(UTILS_SRC)/usleep.h +spiral.o: $(UTILS_SRC)/resources.h +spiral.o: $(UTILS_SRC)/hsv.h +spiral.o: $(UTILS_SRC)/colors.h +spiral.o: $(UTILS_SRC)/grabscreen.h +spiral.o: $(UTILS_SRC)/visual.h +strange.o: $(srcdir)/xlockmore.h +strange.o: $(srcdir)/../config.h +strange.o: $(srcdir)/xlockmoreI.h +strange.o: $(srcdir)/screenhack.h +strange.o: $(UTILS_SRC)/yarandom.h +strange.o: $(UTILS_SRC)/usleep.h +strange.o: $(UTILS_SRC)/resources.h +strange.o: $(UTILS_SRC)/hsv.h +strange.o: $(UTILS_SRC)/colors.h +strange.o: $(UTILS_SRC)/grabscreen.h +strange.o: $(UTILS_SRC)/visual.h +swirl.o: $(srcdir)/xlockmore.h +swirl.o: $(srcdir)/../config.h +swirl.o: $(srcdir)/xlockmoreI.h +swirl.o: $(srcdir)/screenhack.h +swirl.o: $(UTILS_SRC)/yarandom.h +swirl.o: $(UTILS_SRC)/usleep.h +swirl.o: $(UTILS_SRC)/resources.h +swirl.o: $(UTILS_SRC)/hsv.h +swirl.o: $(UTILS_SRC)/colors.h +swirl.o: $(UTILS_SRC)/grabscreen.h +swirl.o: $(UTILS_SRC)/visual.h +xlockmore.o: $(srcdir)/screenhack.h +xlockmore.o: $(srcdir)/../config.h +xlockmore.o: $(UTILS_SRC)/yarandom.h +xlockmore.o: $(UTILS_SRC)/usleep.h +xlockmore.o: $(UTILS_SRC)/resources.h +xlockmore.o: $(UTILS_SRC)/hsv.h +xlockmore.o: $(UTILS_SRC)/colors.h +xlockmore.o: $(UTILS_SRC)/grabscreen.h +xlockmore.o: $(UTILS_SRC)/visual.h +xlockmore.o: $(srcdir)/xlockmoreI.h +xroger-hack.o: $(srcdir)/screenhack.h +xroger-hack.o: $(srcdir)/../config.h +xroger-hack.o: $(UTILS_SRC)/yarandom.h +xroger-hack.o: $(UTILS_SRC)/usleep.h +xroger-hack.o: $(UTILS_SRC)/resources.h +xroger-hack.o: $(UTILS_SRC)/hsv.h +xroger-hack.o: $(UTILS_SRC)/colors.h +xroger-hack.o: $(UTILS_SRC)/grabscreen.h +xroger-hack.o: $(UTILS_SRC)/visual.h +goop.o: $(srcdir)/screenhack.h +goop.o: $(srcdir)/../config.h +goop.o: $(UTILS_SRC)/yarandom.h +goop.o: $(UTILS_SRC)/usleep.h +goop.o: $(UTILS_SRC)/resources.h +goop.o: $(UTILS_SRC)/hsv.h +goop.o: $(UTILS_SRC)/colors.h +goop.o: $(UTILS_SRC)/grabscreen.h +goop.o: $(UTILS_SRC)/visual.h +goop.o: $(UTILS_SRC)/spline.h +goop.o: $(UTILS_SRC)/alpha.h +starfish.o: $(srcdir)/screenhack.h +starfish.o: $(srcdir)/../config.h +starfish.o: $(UTILS_SRC)/yarandom.h +starfish.o: $(UTILS_SRC)/usleep.h +starfish.o: $(UTILS_SRC)/resources.h +starfish.o: $(UTILS_SRC)/hsv.h +starfish.o: $(UTILS_SRC)/colors.h +starfish.o: $(UTILS_SRC)/grabscreen.h +starfish.o: $(UTILS_SRC)/visual.h +starfish.o: $(UTILS_SRC)/spline.h +munch.o: $(srcdir)/screenhack.h +munch.o: $(srcdir)/../config.h +munch.o: $(UTILS_SRC)/yarandom.h +munch.o: $(UTILS_SRC)/usleep.h +munch.o: $(UTILS_SRC)/resources.h +munch.o: $(UTILS_SRC)/hsv.h +munch.o: $(UTILS_SRC)/colors.h +munch.o: $(UTILS_SRC)/grabscreen.h +munch.o: $(UTILS_SRC)/visual.h +fadeplot.o: $(srcdir)/xlockmore.h +fadeplot.o: $(srcdir)/../config.h +fadeplot.o: $(srcdir)/xlockmoreI.h +fadeplot.o: $(srcdir)/screenhack.h +fadeplot.o: $(UTILS_SRC)/yarandom.h +fadeplot.o: $(UTILS_SRC)/usleep.h +fadeplot.o: $(UTILS_SRC)/resources.h +fadeplot.o: $(UTILS_SRC)/hsv.h +fadeplot.o: $(UTILS_SRC)/colors.h +fadeplot.o: $(UTILS_SRC)/grabscreen.h +fadeplot.o: $(UTILS_SRC)/visual.h + diff --git a/hacks/README b/hacks/README new file mode 100644 index 00000000..34e687ea --- /dev/null +++ b/hacks/README @@ -0,0 +1,6 @@ + +This directory contains various graphics hacks. These are independent from +the xscreensaver program (in the ../driver/ directory) but some of them use +the utility functions found in the ../utils/ directory. + +If you have compilation problems, check the parameters in ../config.h. diff --git a/hacks/attraction.c b/hacks/attraction.c new file mode 100644 index 00000000..42930046 --- /dev/null +++ b/hacks/attraction.c @@ -0,0 +1,666 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda + a little like the strong and weak electromagnetic forces. Derived from + a Lispm screensaver by John Pezaris . Mouse control and + viscosity added by "Philip Edward Cutone, III" . + + John sez: + + The simulation started out as a purely accurate gravitational simulation, + but, with constant simulation step size, I quickly realized the field being + simulated while grossly gravitational was, in fact, non-conservative. It + also had the rather annoying behavior of dealing very badly with colliding + orbs. Therefore, I implemented a negative-gravity region (with two + thresholds; as I read your code, you only implemented one) to prevent orbs + from every coming too close together, and added a viscosity factor if the + speed of any orb got too fast. This provides a nice stable system with + interesting behavior. + + I had experimented with a number of fields including the van der Waals + force (very interesting orbiting behavior) and 1/r^3 gravity (not as + interesting as 1/r^2). An even normal viscosity (rather than the + thresholded version to bleed excess energy) is also not interesting. + The 1/r^2, -1/r^2, -10/r^2 thresholds proved not only robust but also + interesting -- the orbs never collided and the threshold viscosity fixed + the non-conservational problem. + + Philip sez: + > An even normal viscosity (rather than the thresholded version to + > bleed excess energy) is also not interesting. + + unless you make about 200 points.... set the viscosity to about .8 + and drag the mouse through it. it makes a nice wave which travels + through the field. + + And (always the troublemaker) Joe Keane sez: + + Despite what John sez, the field being simulated is always conservative. + The real problem is that it uses a simple hack, computing acceleration + *based only on the starting position*, instead of a real differential + equation solver. Thus you'll always have energy coming out of nowhere, + although it's most blatant when balls get close together. If it were + done right, you wouldn't need viscosity or artificial limits on how + close the balls can get. + */ + +#include +#include +#include "screenhack.h" +#include "spline.h" + +struct ball { + double x, y; + double vx, vy; + double dx, dy; + double mass; + int size; + int pixel_index; + int hue; +}; + +static struct ball *balls; +static int npoints; +static int threshold; +static int delay; +static int global_size; +static int segments; +static Bool glow_p; +static Bool orbit_p; +static XPoint *point_stack; +static int point_stack_size, point_stack_fp; +static XColor *colors; +static int ncolors; +static int fg_index; +static int color_shift; + +/*flip mods for mouse interaction*/ +static Bool mouse_p; +int mouse_x, mouse_y, mouse_mass, root_x, root_y; +static double viscosity; + +static enum object_mode { + ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode, + tail_mode +} mode; + +static GC draw_gc, erase_gc; + +#define MAX_SIZE 16 + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) + +static void +init_balls (Display *dpy, Window window) +{ + int i; + XWindowAttributes xgwa; + XGCValues gcv; + int xlim, ylim, midx, midy, r, vx, vy; + double th; + Colormap cmap; + char *mode_str; + XGetWindowAttributes (dpy, window, &xgwa); + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + midx = xlim/2; + midy = ylim/2; + r = get_integer_resource ("radius", "Integer"); + if (r <= 0 || r > min (xlim/2, ylim/2)) + r = min (xlim/2, ylim/2) - 50; + vx = get_integer_resource ("vx", "Integer"); + vy = get_integer_resource ("vy", "Integer"); + npoints = get_integer_resource ("points", "Integer"); + if (npoints < 1) + npoints = 3 + (random () % 5); + balls = (struct ball *) malloc (npoints * sizeof (struct ball)); + segments = get_integer_resource ("segments", "Integer"); + if (segments < 0) segments = 1; + threshold = get_integer_resource ("threshold", "Integer"); + if (threshold < 0) threshold = 0; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + global_size = get_integer_resource ("size", "Integer"); + if (global_size < 0) global_size = 0; + glow_p = get_boolean_resource ("glow", "Boolean"); + orbit_p = get_boolean_resource ("orbit", "Boolean"); + color_shift = get_integer_resource ("colorShift", "Integer"); + if (color_shift <= 0) color_shift = 5; + + /*flip mods for mouse interaction*/ + mouse_p = get_boolean_resource ("mouse", "Boolean"); + mouse_mass = get_integer_resource ("mouseSize", "Integer"); + mouse_mass = mouse_mass * mouse_mass *10; + + viscosity = get_float_resource ("viscosity", "Float"); + + mode_str = get_string_resource ("mode", "Mode"); + if (! mode_str) mode = ball_mode; + else if (!strcmp (mode_str, "balls")) mode = ball_mode; + else if (!strcmp (mode_str, "lines")) mode = line_mode; + else if (!strcmp (mode_str, "polygons")) mode = polygon_mode; + else if (!strcmp (mode_str, "tails")) mode = tail_mode; + else if (!strcmp (mode_str, "splines")) mode = spline_mode; + else if (!strcmp (mode_str, "filled-splines")) mode = spline_filled_mode; + else { + fprintf (stderr, + "%s: mode must be balls, lines, tails, polygons, splines, or\n\ + filled-splines, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + if (mode != ball_mode && mode != tail_mode) glow_p = False; + + if (mode == polygon_mode && npoints < 3) + mode = line_mode; + + ncolors = get_integer_resource ("colors", "Colors"); + if (ncolors < 2) ncolors = 2; + if (ncolors <= 2) mono_p = True; + colors = 0; + + if (!mono_p) + { + fg_index = 0; + switch (mode) + { + case ball_mode: + if (glow_p) + { + int H = random() % 360; + double S1 = 0.25; + double S2 = 1.00; + double V = frand(0.25) + 0.75; + colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1)); + make_color_ramp (dpy, cmap, H, S1, V, H, S2, V, colors, &ncolors, + False, True, False); + } + else + { + ncolors = npoints; + colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1)); + make_random_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, True, False, True); + } + break; + case line_mode: + case polygon_mode: + case spline_mode: + case spline_filled_mode: + case tail_mode: + colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1)); + make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, False, True); + break; + default: + abort (); + } + } + + if (!mono_p && ncolors <= 2) + { + if (colors) free (colors); + colors = 0; + mono_p = True; + } + + if (mode != ball_mode) + { + int size = (segments ? segments : 1); + point_stack_size = size * (npoints + 1); + point_stack = (XPoint *) calloc (point_stack_size, sizeof (XPoint)); + point_stack_fp = 0; + } + + gcv.line_width = (mode == tail_mode + ? (global_size ? global_size : (MAX_SIZE * 2 / 3)) + : 1); + gcv.cap_style = (mode == tail_mode ? CapRound : CapButt); + + if (mono_p) + gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap); + else + gcv.foreground = colors[fg_index].pixel; + draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv); + + gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv); + + +#define rand_size() min (MAX_SIZE, 8 + (random () % (MAX_SIZE - 9))) + + if (orbit_p && !global_size) + /* To orbit, all objects must be the same mass, or the math gets + really hairy... */ + global_size = rand_size (); + + th = frand (M_PI+M_PI); + for (i = 0; i < npoints; i++) + { + int new_size = (global_size ? global_size : rand_size ()); + balls [i].dx = 0; + balls [i].dy = 0; + balls [i].size = new_size; + balls [i].mass = (new_size * new_size * 10); + balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / npoints) + th); + balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / npoints) + th); + if (! orbit_p) + { + balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0); + balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0); + } + if (mono_p || mode != ball_mode) + balls [i].pixel_index = -1; + else if (glow_p) + balls [i].pixel_index = 0; + else + balls [i].pixel_index = random() % ncolors; + } + + if (orbit_p) + { + double a = 0; + double v; + double v_mult = get_float_resource ("vMult", "Float"); + if (v_mult == 0.0) v_mult = 1.0; + + for (i = 1; i < npoints; i++) + { + double _2ipi_n = (2 * i * M_PI / npoints); + double x = r * cos (_2ipi_n); + double y = r * sin (_2ipi_n); + double distx = r - x; + double dist2 = (distx * distx) + (y * y); + double dist = sqrt (dist2); + double a1 = ((balls[i].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0) * + (distx / dist)); + a += a1; + } + if (a < 0.0) + { + fprintf (stderr, "%s: domain error: forces on balls too great\n", + progname); + exit (-1); + } + v = sqrt (a * r) * v_mult; + for (i = 0; i < npoints; i++) + { + double k = ((2 * i * M_PI / npoints) + th); + balls [i].vx = -v * sin (k); + balls [i].vy = v * cos (k); + } + } + + if (mono_p) glow_p = False; + XClearWindow (dpy, window); +} + +static void +compute_force (int i, double *dx_ret, double *dy_ret) +{ + int j; + double x_dist, y_dist, dist, dist2; + *dx_ret = 0; + *dy_ret = 0; + for (j = 0; j < npoints; j++) + { + if (i == j) continue; + x_dist = balls [j].x - balls [i].x; + y_dist = balls [j].y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + double new_acc = ((balls[j].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + double new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } + + if (mouse_p) + { + x_dist = mouse_x - balls [i].x; + y_dist = mouse_y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + double new_acc = ((mouse_mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + double new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } +} + +static void +run_balls (Display *dpy, Window window) +{ + int last_point_stack_fp = point_stack_fp; + static int tick = 500, xlim, ylim; + static Colormap cmap; + int i; + + /*flip mods for mouse interaction*/ + Window root1, child1; + unsigned int mask; + if (mouse_p) + { + XQueryPointer(dpy, window, &root1, &child1, + &root_x, &root_y, &mouse_x, &mouse_y, &mask); + } + + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + + /* compute the force of attraction/repulsion among all balls */ + for (i = 0; i < npoints; i++) + compute_force (i, &balls[i].dx, &balls[i].dy); + + /* move the balls according to the forces now in effect */ + for (i = 0; i < npoints; i++) + { + double old_x = balls[i].x; + double old_y = balls[i].y; + double new_x, new_y; + int size = balls[i].size; + balls[i].vx += balls[i].dx; + balls[i].vy += balls[i].dy; + + /* don't let them get too fast: impose a terminal velocity + (actually, make the medium have friction) */ + if (balls[i].vx > 10) + { + balls[i].vx *= 0.9; + balls[i].dx = 0; + } + else if (viscosity != 1) + { + balls[i].vx *= viscosity; + } + + if (balls[i].vy > 10) + { + balls[i].vy *= 0.9; + balls[i].dy = 0; + } + else if (viscosity != 1) + { + balls[i].vy *= viscosity; + } + + balls[i].x += balls[i].vx; + balls[i].y += balls[i].vy; + + /* bounce off the walls */ + if (balls[i].x >= (xlim - balls[i].size)) + { + balls[i].x = (xlim - balls[i].size - 1); + if (balls[i].vx > 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y >= (ylim - balls[i].size)) + { + balls[i].y = (ylim - balls[i].size - 1); + if (balls[i].vy > 0) + balls[i].vy = -balls[i].vy; + } + if (balls[i].x <= 0) + { + balls[i].x = 0; + if (balls[i].vx < 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y <= 0) + { + balls[i].y = 0; + if (balls[i].vy < 0) + balls[i].vy = -balls[i].vy; + } + + new_x = balls[i].x; + new_y = balls[i].y; + + if (!mono_p) + { + if (mode == ball_mode) + { + if (glow_p) + { + /* make color saturation be related to particle + acceleration. */ + double limit = 0.5; + double s, fraction; + double vx = balls [i].dx; + double vy = balls [i].dy; + if (vx < 0) vx = -vx; + if (vy < 0) vy = -vy; + fraction = vx + vy; + if (fraction > limit) fraction = limit; + + s = 1 - (fraction / limit); + balls[i].pixel_index = (ncolors * s); + } + XSetForeground (dpy, draw_gc, + colors[balls[i].pixel_index].pixel); + } + } + + if (mode == ball_mode) + { + XFillArc (dpy, window, erase_gc, (int) old_x, (int) old_y, + size, size, 0, 360*64); + XFillArc (dpy, window, draw_gc, (int) new_x, (int) new_y, + size, size, 0, 360*64); + } + else + { + point_stack [point_stack_fp].x = new_x; + point_stack [point_stack_fp].y = new_y; + point_stack_fp++; + } + } + + /* draw the lines or polygons after computing all points */ + if (mode != ball_mode) + { + point_stack [point_stack_fp].x = balls [0].x; /* close the polygon */ + point_stack [point_stack_fp].y = balls [0].y; + point_stack_fp++; + if (point_stack_fp == point_stack_size) + point_stack_fp = 0; + else if (point_stack_fp > point_stack_size) /* better be aligned */ + abort (); + if (!mono_p) + { + static int tick = 0; + if (tick++ == color_shift) + { + tick = 0; + fg_index = (fg_index + 1) % ncolors; + XSetForeground (dpy, draw_gc, colors[fg_index].pixel); + } + } + } + + switch (mode) + { + case ball_mode: + break; + case line_mode: + if (segments > 0) + XDrawLines (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, CoordModeOrigin); + XDrawLines (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, CoordModeOrigin); + break; + case polygon_mode: + if (segments > 0) + XFillPolygon (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + XFillPolygon (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + break; + case tail_mode: + { + for (i = 0; i < npoints; i++) + { + int index = point_stack_fp + i; + int next_index = (index + (npoints + 1)) % point_stack_size; + XDrawLine (dpy, window, erase_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + + index = last_point_stack_fp + i; + next_index = (index - (npoints + 1)) % point_stack_size; + if (next_index < 0) next_index += point_stack_size; + if (point_stack [next_index].x == 0 && + point_stack [next_index].y == 0) + continue; + XDrawLine (dpy, window, draw_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + } + } + break; + case spline_mode: + case spline_filled_mode: + { + static spline *s = 0; + if (! s) s = make_spline (npoints); + if (segments > 0) + { + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [point_stack_fp + i].x; + s->control_y [i] = point_stack [point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, erase_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, erase_gc, s->points, s->n_points, + CoordModeOrigin); + } + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [last_point_stack_fp + i].x; + s->control_y [i] = point_stack [last_point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, draw_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, draw_gc, s->points, s->n_points, + CoordModeOrigin); + } + break; + default: + abort (); + } + + XSync (dpy, True); +} + + +char *progclass = "Attraction"; + +char *defaults [] = { + "Attraction.background: black", /* to placate SGI */ + "Attraction.foreground: white", + "*mode: balls", + "*points: 0", + "*size: 0", + "*colors: 200", + "*threshold: 100", + "*delay: 10000", + "*glow: false", + "*mouseSize: 10", + "*mouse: false", + "*viscosity: 1", + "*orbit: false", + "*colorShift: 3", + "*segments: 500", + "*vMult: 0.9", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-colors", ".colors", XrmoptionSepArg, 0 }, + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-color-shift", ".colorShift", XrmoptionSepArg, 0 }, + { "-threshold", ".threshold", XrmoptionSepArg, 0 }, + { "-segments", ".segments", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-size", ".size", XrmoptionSepArg, 0 }, + { "-radius", ".radius", XrmoptionSepArg, 0 }, + { "-vx", ".vx", XrmoptionSepArg, 0 }, + { "-vy", ".vy", XrmoptionSepArg, 0 }, + { "-vmult", ".vMult", XrmoptionSepArg, 0 }, + { "-mouse-size", ".mouseSize", XrmoptionSepArg, 0 }, + { "-mouse", ".mouse", XrmoptionNoArg, "true" }, + { "-nomouse", ".mouse", XrmoptionNoArg, "false" }, + { "-viscosity", ".viscosity", XrmoptionSepArg, 0 }, + { "-glow", ".glow", XrmoptionNoArg, "true" }, + { "-noglow", ".glow", XrmoptionNoArg, "false" }, + { "-orbit", ".orbit", XrmoptionNoArg, "true" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_balls (dpy, window); + while (1) + { + run_balls (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/attraction.1 b/hacks/attraction.man similarity index 100% rename from local/man/man.1/attraction.1 rename to hacks/attraction.man diff --git a/hacks/blitspin.c b/hacks/blitspin.c new file mode 100644 index 00000000..0f2256cc --- /dev/null +++ b/hacks/blitspin.c @@ -0,0 +1,341 @@ +/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Rotate a bitmap using using bitblts. + The bitmap must be square, and must be a power of 2 in size. + This was translated from SmallTalk code which appeared in the + August 1981 issue of Byte magazine. + + The input bitmap may be non-square, it is padded and centered + with the background color. Another way would be to subdivide + the bitmap into square components and rotate them independently + (and preferably in parallel), but I don't think that would be as + interesting looking. + + It's too bad almost nothing uses blitter hardware these days, + or this might actually win. + */ + +#include "screenhack.h" +#include + +#ifdef HAVE_XPM +# include +# ifndef PIXEL_ALREADY_TYPEDEFED +# define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */ +# endif +#endif + +#ifdef HAVE_XMU +# ifndef VMS +# include +#else /* VMS */ +# include +# endif /* VMS */ +#endif + +#include "default.xbm" + +static Display *dpy; +static Window window; +static unsigned int size; +static Pixmap self, temp, mask; +static GC SET, CLR, CPY, IOR, AND, XOR; +static GC gc; +static int delay, delay2; +static Pixmap bitmap; +static int depth; +static unsigned int fg, bg; + +static void display (Pixmap); + +#define copy_all_to(from, xoff, yoff, to, gc) \ + XCopyArea (dpy, (from), (to), (gc), 0, 0, \ + size-(xoff), size-(yoff), (xoff), (yoff)) + +#define copy_all_from(to, xoff, yoff, from, gc) \ + XCopyArea (dpy, (from), (to), (gc), (xoff), (yoff), \ + size-(xoff), size-(yoff), 0, 0) + +static void +rotate (void) +{ + int qwad; /* fuckin' C, man... who needs namespaces? */ + XFillRectangle (dpy, mask, CLR, 0, 0, size, size); + XFillRectangle (dpy, mask, SET, 0, 0, size>>1, size>>1); + for (qwad = size>>1; qwad > 0; qwad>>=1) + { + if (delay) usleep (delay); + copy_all_to (mask, 0, 0, temp, CPY); /* 1 */ + copy_all_to (mask, 0, qwad, temp, IOR); /* 2 */ + copy_all_to (self, 0, 0, temp, AND); /* 3 */ + copy_all_to (temp, 0, 0, self, XOR); /* 4 */ + copy_all_from (temp, qwad, 0, self, XOR); /* 5 */ + copy_all_from (self, qwad, 0, self, IOR); /* 6 */ + copy_all_to (temp, qwad, 0, self, XOR); /* 7 */ + copy_all_to (self, 0, 0, temp, CPY); /* 8 */ + copy_all_from (temp, qwad, qwad, self, XOR); /* 9 */ + copy_all_to (mask, 0, 0, temp, AND); /* A */ + copy_all_to (temp, 0, 0, self, XOR); /* B */ + copy_all_to (temp, qwad, qwad, self, XOR); /* C */ + copy_all_from (mask, qwad>>1, qwad>>1, mask, AND); /* D */ + copy_all_to (mask, qwad, 0, mask, IOR); /* E */ + copy_all_to (mask, 0, qwad, mask, IOR); /* F */ + display (self); + } +} + +static void +read_bitmap (char *bitmap_name, int *widthP, int *heightP) +{ +#ifdef HAVE_XPM + XWindowAttributes xgwa; + XpmAttributes xpmattrs; + int result; + xpmattrs.valuemask = 0; + bitmap = 0; + + XGetWindowAttributes (dpy, window, &xgwa); + +# ifdef XpmCloseness + xpmattrs.valuemask |= XpmCloseness; + xpmattrs.closeness = 40000; +# endif +# ifdef XpmVisual + xpmattrs.valuemask |= XpmVisual; + xpmattrs.visual = xgwa.visual; +# endif +# ifdef XpmDepth + xpmattrs.valuemask |= XpmDepth; + xpmattrs.depth = xgwa.depth; +# endif +# ifdef XpmColormap + xpmattrs.valuemask |= XpmColormap; + xpmattrs.colormap = xgwa.colormap; +# endif + + result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0, + &xpmattrs); + switch (result) + { + case XpmColorError: + fprintf (stderr, "%s: warning: xpm color substitution performed\n", + progname); + /* fall through */ + case XpmSuccess: + *widthP = xpmattrs.width; + *heightP = xpmattrs.height; + break; + case XpmFileInvalid: + case XpmOpenFailed: + bitmap = 0; + break; + case XpmColorFailed: + fprintf (stderr, "%s: xpm: color allocation failed\n", progname); + exit (-1); + case XpmNoMemory: + fprintf (stderr, "%s: xpm: out of memory\n", progname); + exit (-1); + default: + fprintf (stderr, "%s: xpm: unknown error code %d\n", progname, result); + exit (-1); + } + if (! bitmap) +#endif + +#ifdef HAVE_XMU + { + int xh, yh; + Pixmap b2; + bitmap = XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy), bitmap_name, + 0, 0, widthP, heightP, &xh, &yh); + if (! bitmap) + { + fprintf (stderr, "%s: couldn't find bitmap %s\n", progname, + bitmap_name); + exit (1); + } + b2 = XmuCreatePixmapFromBitmap (dpy, window, bitmap, *widthP, *heightP, + depth, fg, bg); + XFreePixmap (dpy, bitmap); + bitmap = b2; + } +#else /* !XMU */ + { + fprintf (stderr, + "%s: your vendor doesn't ship the standard Xmu library.\n", + progname); + fprintf (stderr, "\tWe can't load XBM files without it.\n"); + exit (1); + } +#endif /* !XMU */ +} + + +static Pixmap +read_screen (Display *dpy, Window window, int *widthP, int *heightP) +{ + Pixmap p; + XWindowAttributes xgwa; + XGCValues gcv; + GC gc; + XGetWindowAttributes (dpy, window, &xgwa); + *widthP = xgwa.width; + *heightP = xgwa.height; + + grab_screen_image(xgwa.screen, window); + p = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth); + gcv.function = GXcopy; + gc = XCreateGC (dpy, window, GCFunction, &gcv); + XCopyArea (dpy, window, p, gc, 0, 0, xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + + + /* Reset this... */ + XSetWindowBackground (dpy, window, + get_pixel_resource ("background", "Background", + dpy, xgwa.colormap)); + XClearWindow (dpy, window); + + return p; +} + + +static void +init (void) +{ + XWindowAttributes xgwa; + Colormap cmap; + XGCValues gcv; + int width, height; + unsigned int real_size; + char *bitmap_name; + int i; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + depth = xgwa.depth; + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer"); + if (delay < 0) delay = 0; + if (delay2 < 0) delay2 = 0; + bitmap_name = get_string_resource ("bitmap", "Bitmap"); + if (! bitmap_name || !*bitmap_name) + bitmap_name = "(default)"; + + if (!strcmp (bitmap_name, "(default)")) + { + width = logo_width; + height = logo_height; + bitmap = XCreatePixmapFromBitmapData (dpy, window, (char *) logo_bits, + width, height, fg, bg, depth); + } + else if (!strcmp (bitmap_name, "(screen)")) + { + bitmap = read_screen (dpy, window, &width, &height); + } + else + { + read_bitmap (bitmap_name, &width, &height); + } + + real_size = (width > height) ? width : height; + + size = real_size; + /* semi-sleazy way of doing (setq size (expt 2 (ceiling (log size 2)))). */ + for (i = 31; i > 0; i--) + if (size & (1<>i)<<(i+1); + self = XCreatePixmap (dpy, window, size, size, depth); + temp = XCreatePixmap (dpy, window, size, size, depth); + mask = XCreatePixmap (dpy, window, size, size, depth); + gcv.foreground = (depth == 1 ? 1 : (~0)); + gcv.function=GXset; SET = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXclear;CLR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXcopy; CPY = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXor; IOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXand; AND = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXxor; XOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + + gcv.foreground = gcv.background = bg; + gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + /* Clear self to the background color (not to 0, which CLR does.) */ + XFillRectangle (dpy, self, gc, 0, 0, size, size); + XSetForeground (dpy, gc, fg); + + XCopyArea (dpy, bitmap, self, CPY, 0, 0, width, height, + (size - width)>>1, (size - height)>>1); +} + +static void +display (Pixmap pixmap) +{ + XWindowAttributes xgwa; + static int last_w = 0, last_h = 0; + XGetWindowAttributes (dpy, window, &xgwa); + if (xgwa.width != last_w || xgwa.height != last_h) + { + XClearWindow (dpy, window); + last_w = xgwa.width; + last_h = xgwa.height; + } +#ifdef HAVE_XPM + if (depth != 1) + XCopyArea (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1); + else +#endif + XCopyPlane (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1, 1); +/* + XDrawRectangle (dpy, window, gc, + ((xgwa.width-size)>>1)-1, ((xgwa.height-size)>>1)-1, + size+2, size+2); +*/ + XSync (dpy, True); +} + + +char *progclass = "BlitSpin"; + +char *defaults [] = { + "BlitSpin.background: black", /* to placate SGI */ + "BlitSpin.foreground: white", + "*delay: 500000", + "*delay2: 500000", + "*bitmap: (default)", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-bitmap", ".bitmap", XrmoptionSepArg, 0 }, + { "-grab-screen", ".bitmap", XrmoptionNoArg, "(screen)" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *d, Window w) +{ + dpy = d; + window = w; + init (); + while (1) + { + rotate (); + if (delay2) usleep (delay2); + } +} diff --git a/local/man/man.1/blitspin.1 b/hacks/blitspin.man similarity index 100% rename from local/man/man.1/blitspin.1 rename to hacks/blitspin.man diff --git a/hacks/bob.xbm b/hacks/bob.xbm new file mode 100644 index 00000000..f44adda4 --- /dev/null +++ b/hacks/bob.xbm @@ -0,0 +1,43 @@ +#define bob_width 61 +#define bob_height 75 +static unsigned char bob_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x07,0x00, + 0x00,0x00,0x00,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xfb, + 0x00,0x00,0x00,0xc0,0xff,0xcf,0x9f,0xd1,0x03,0x00,0x00,0xf0,0x7f,0x8c,0x33, + 0x91,0x07,0x00,0x00,0xf8,0xa7,0x18,0x27,0xb1,0x06,0x00,0x00,0xfc,0x47,0x31, + 0x4e,0xa6,0x0e,0x00,0x00,0xfe,0x4f,0x21,0x4c,0xae,0x3d,0x00,0x00,0xff,0xdf, + 0x23,0x8d,0xbe,0x7d,0x00,0x80,0xff,0xff,0x67,0xbd,0xfe,0xff,0x01,0x80,0xff, + 0xff,0x7f,0xbf,0xff,0xff,0x03,0xc0,0xff,0xff,0xff,0xbf,0xff,0xf8,0x07,0xc0, + 0xff,0xff,0xff,0xbf,0x3f,0xf8,0x07,0xc0,0xff,0xff,0xff,0xff,0x07,0xf8,0x0f, + 0xc0,0xff,0xff,0xff,0x3f,0x00,0xf8,0x0f,0xe0,0x7f,0x00,0xf8,0x07,0x00,0xf0, + 0x0f,0xe0,0x3f,0x00,0x00,0x00,0x00,0xf0,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00, + 0xf0,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xf4,0x07,0xe0,0x3f,0x00,0x00,0x00, + 0x00,0xe4,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe4,0x07,0xe0,0x3f,0x00,0x00, + 0x00,0x00,0xe6,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe7,0x07,0xe0,0x3f,0x00, + 0x00,0x00,0x00,0xe6,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe6,0x07,0xe0,0x3f, + 0x00,0x00,0x00,0x00,0xe6,0x07,0xc0,0x3f,0x00,0x00,0x00,0x78,0xf6,0x07,0xa0, + 0xbf,0xff,0x00,0x00,0xff,0xf7,0x07,0x70,0x9f,0xff,0x01,0x80,0xff,0xef,0x07, + 0xf0,0x1c,0x80,0x03,0xe0,0x01,0xef,0x07,0xf0,0x1f,0xbe,0x07,0xf0,0x3f,0xee, + 0x07,0xe0,0x9d,0x83,0x1f,0xf8,0xe1,0xdc,0x07,0xe0,0xc1,0x7f,0x1f,0xfc,0xff, + 0xc8,0x07,0xe0,0xc1,0x69,0x1e,0x7e,0xca,0xc0,0x03,0xe0,0x81,0xb8,0x1f,0xc0, + 0x0e,0xc0,0x03,0xe0,0x01,0xc0,0x1b,0xc0,0xcf,0xc1,0x03,0xc0,0x03,0xf7,0x11, + 0x00,0x7f,0xc0,0x03,0xc0,0x03,0x7c,0x18,0x00,0x1c,0xc0,0x02,0xc0,0x02,0x30, + 0x08,0x00,0x00,0x40,0x03,0x40,0x03,0x00,0x08,0x00,0x00,0x40,0x02,0x40,0x13, + 0x00,0x0c,0x00,0x00,0x60,0x02,0x40,0x12,0x00,0x0e,0x00,0x00,0xc0,0x03,0x80, + 0x33,0x80,0x0e,0x00,0x00,0xa8,0x01,0x00,0x33,0x40,0x0f,0xa0,0x03,0x2c,0x00, + 0x00,0x74,0x30,0x0f,0x38,0x07,0x2e,0x00,0x00,0x74,0x98,0x1f,0x1e,0x1e,0x2f, + 0x00,0x00,0xfc,0x8f,0xff,0x0f,0xfc,0x2f,0x00,0x00,0xf8,0xe3,0xff,0x03,0xf8, + 0x2f,0x00,0x00,0xf8,0xfd,0xff,0x81,0xff,0x3f,0x00,0x00,0xb8,0xf9,0x1f,0xf8, + 0x0f,0x1e,0x00,0x00,0x30,0xf1,0xf0,0x0f,0x03,0x0e,0x00,0x00,0x30,0xf1,0x01, + 0x80,0x01,0x0f,0x00,0x00,0x20,0xf1,0xf7,0xff,0x00,0x07,0x00,0x00,0x60,0xe3, + 0x01,0x60,0x80,0x07,0x00,0x00,0x60,0xc3,0xef,0x3f,0x80,0x03,0x00,0x00,0x40, + 0xc2,0xff,0x0f,0xc0,0x03,0x00,0x00,0xc0,0xe6,0x1f,0x00,0xc0,0x01,0x00,0x00, + 0x80,0xf4,0xfe,0x3f,0xe0,0x00,0x00,0x00,0x80,0x79,0xfe,0x1f,0xe0,0x00,0x00, + 0xc0,0x01,0x3d,0x3e,0x00,0x70,0x00,0x00,0x30,0x06,0x3e,0x0f,0x00,0x38,0x00, + 0x00,0xc8,0x8c,0x1f,0x07,0x00,0x38,0x00,0x00,0xf4,0xcc,0x8f,0x07,0x00,0x1c, + 0x00,0x00,0x72,0xee,0xf7,0x07,0x00,0x0e,0x00,0x00,0x02,0xff,0xe3,0x07,0x00, + 0x07,0x00,0x00,0x32,0xfe,0xc1,0xff,0x8f,0x03,0x00,0x00,0x3e,0xfe,0x80,0xff, + 0xff,0x01,0x00,0x00,0x7e,0x7c,0x00,0x00,0x7e,0x00,0x00,0x00,0x7c,0x3c,0x00, + 0x00,0x00,0x00,0x00,0x00,0xfc,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x1c, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, + 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; diff --git a/hacks/bouboule.c b/hacks/bouboule.c new file mode 100644 index 00000000..4f6e8ecb --- /dev/null +++ b/hacks/bouboule.c @@ -0,0 +1,841 @@ +/* -*- Mode: C; tab-width: 4 -*- + Ported from xlockmore 4.03a12 to be a standalone program and thus usable + with xscreensaver by Jamie Zawinski on 15-May-97. + + Original copyright notice from xlock.c: + + * Copyright (c) 1988-91 by Patrick J. Naughton. + * + * 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. + */ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)bouboule.c 4.00 97/01/01 xlockmore"; + +#endif + +/*- + * bouboule.c (bouboule mode for xlockmore) + * + * Sort of starfield for xlockmore. I found that making a starfield for + * a 3D engine and thought it could be a nice lock mode. For a real starfield, + * I only scale the sort of sphere you see to the whole sky and clip the stars + * to the camera screen. + * + * Code Copyright 1996 by Jeremie PETIT (petit@eurecom.fr, jpetit@essi.fr) + * + * Use: batchcount is the number of stars. + * cycles is the maximum size for a star + * + * 15-May-97: jwz@netscape.com: turned into a standalone program. + * 04-Sep-96: Added 3d support (Henrik Theiling, theiling@coli-uni-sb.de) + * 20-Feb-96: Added tests so that already malloced objects are not + * malloced twice, thanks to the report from + * 01-Feb-96: Patched by Jouk Jansen for VMS + * Patched by for TrueColor displays + * 30-Jan-96: Wrote all that I wanted to. + * + * DONE: Build up a XArc list and Draw everything once with XFillArcs + * That idea came from looking at swarm code. + * DONE: Add an old arcs list for erasing. + * DONE: Make center of starfield SinVariable. + * DONE: Add some random in the sinvary() function. + * DONE: check time for erasing the stars with the two methods and use the + * better one. Note that sometimes the time difference between + * beginning of erasing and its end is negative! I check this, and + * do not use this result when it occurs. If all values are negative, + * the erasing will continue being done in the currently tested mode. + * DONE: Allow stars size customization. + * DONE: Make sizey be no less than half sizex or no bigger than twice sizex. + * + * IDEA: A simple check can be performed to know which stars are "behind" + * and which are "in front". So is possible to very simply change + * the drawing mode for these two sorts of stars. BUT: this would lead + * to a rewrite of the XArc list code because drawing should be done + * in two steps: "behind" stars then "in front" stars. Also, what could + * be the difference between the rendering of these two types of stars? + * IDEA: Calculate the distance of each star to the "viewer" and render the + * star accordingly to this distance. Same remarks as for previous + * ideas can be pointed out. This would even lead to reget the old stars + * drawing code, that has been replaced by the XFillArcs. On another + * hand, this would allow particular stars (own color, shape...), as + * far as they would be individually drawn. One should be careful to + * draw them according to their distance, that is not drawing a far + * star after a close one. + */ + +#ifdef STANDALONE +# define PROGCLASS "Bouboule" +# define HACK_INIT init_bouboule +# define HACK_DRAW draw_bouboule +# define bouboule_opts xlockmore_opts +# define DEFAULTS "*count: 100 \n" \ + "*size: 15 \n" \ + "*delay: 5000 \n" \ + "*ncolors: 64 \n" \ + "*use3d: False \n" \ + "*delta3d: 1.5 \n" \ + "*right3d: red \n" \ + "*left3d: blue \n" \ + "*both3d: magenta \n" \ + "*none3d: black \n" + +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt bouboule_opts = { + 0, NULL, 0, NULL, NULL }; + +#define USEOLDXARCS 1 /* If 1, we use old xarcs list for erasing. + * else we just roughly erase the window. + * This mainly depends on the number of stars, + * because when they are many, it is faster to + * erase the whole window than to erase each star + */ + +#if HAVE_GETTIMEOFDAY +#define ADAPT_ERASE 1 /* If 1, then we try ADAPT_CHECKS black XFillArcs, + * and after, ADAPT_CHECKS XFillRectangle. + * We check which method seems better, knowing that + * XFillArcs is generally visually better. So we + * consider that XFillArcs is still better if its time + * is about XFillRectangle * ADAPT_ARC_PREFERED + * We need gettimeofday + * for this... Does it exist on other systems ? Do we + * have to use another function for others ? + * This value overrides USEOLDXARCS. + */ + +#ifdef USE_XVMSUTILS +# if 0 +# include "../xvmsutils/unix_time.h" +# else +# include +# endif +#endif + +#include + +#define ADAPT_CHECKS 50 +#define ADAPT_ARC_PREFERED 150 /* Maybe the value that is the most important + * for adapting to a system */ +#endif + +#define dtor(x) (((x) * M_PI) / 180.0) /* Degrees to radians */ + +#define MINSTARS 1 +#define MINSIZE 1 +/* jwz: I think slower color changes look better */ +#define COLOR_CHANGES 50 /* How often we change colors (1 = always) + * This value should be tuned accordingly to + * the number of stars */ +#define MAX_SIZEX_SIZEY 2. /* This controls whether the sphere can be very + * very large and have a small height (or the + * opposite) or no. */ + +#define THETACANRAND 80 /* percentage of changes for the speed of + * change of the 3 theta values */ +#define SIZECANRAND 80 /* percentage of changes for the speed of + * change of the sizex and sizey values */ +#define POSCANRAND 80 /* percentage of changes for the speed of + * change of the x and y values */ +/* Note that these XXXCANRAND values can be 0, that is no rand acceleration * + variation. */ + +#define VARRANDALPHA (NRAND((int) (M_PI * 1000.0))/1000.0) +#define VARRANDSTEP (M_PI/(NRAND(100)+100.0)) +#define VARRANDMIN (-70.0) +#define VARRANDMAX 70.0 + +#define MINZVAL 100 /* stars can come this close */ +#define SCREENZ 2000 /* this is where the screen is */ +#define MAXZVAL 10000 /* stars can go this far away */ + +#define GETZDIFF(z) ((MI_DELTA3D(mi))*20.0*(1.0-(SCREENZ)/(z+1000))) +#define MAXDIFF MAX(-GETZDIFF(MINZVAL),GETZDIFF(MAXZVAL)) + +/* These values are the variation parameters of the acceleration variation * + of the SinVariables that are randomized. */ + +/******************************/ +typedef struct SinVariableStruct +/******************************/ +{ + double alpha; /* + * Alpha is the current state of the sinvariable + * alpha should be initialized to a value between + * 0.0 and 2 * M_PI + */ + double step; /* + * Speed of evolution of alpha. It should be a reasonable + * fraction of 2 * M_PI. This value directly influence + * the variable speed of variation. + */ + double minimum; /* Minimum value for the variable */ + double maximum; /* Maximum value for the variable */ + double value; /* Current value */ + int mayrand; /* Flag for knowing whether some randomization can be + * applied to the variable */ + struct SinVariableStruct *varrand; /* Evolving Variable: the variation of + * alpha */ +} SinVariable; + +/***********************/ +typedef struct StarStruct +/***********************/ +{ + double x, y, z; /* Position of the star */ + short size; /* Try to guess */ +} Star; + +/****************************/ +typedef struct StarFieldStruct +/****************************/ +{ + short width, height; /* width and height of the starfield window */ + short max_star_size; /* Maximum radius for stars. stars radius will + * vary from 1 to MAX_STAR_SIZE */ + SinVariable x; /* Evolving variables: */ + SinVariable y; /* Center of the field on the screen */ + SinVariable z; + SinVariable sizex; /* Evolving variable: half width of the field */ + SinVariable sizey; /* Evolving variable: half height of the field */ + SinVariable thetax; /* Evolving Variables: */ + SinVariable thetay; /* rotation angles of the starfield */ + SinVariable thetaz; /* around x, y and z local axis */ + Star *star; /* List of stars */ + XArc *xarc; /* Current List of arcs */ + XArc *xarcleft; /* additional list for the left arcs */ +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + XArc *oldxarc; /* Old list of arcs */ + XArc *oldxarcleft; +#endif + unsigned long color; /* Current color of the starfield */ + int colorp; /* Pointer to color of the starfield */ + int NbStars; /* Number of stars */ + short colorchange; /* Counter for the color change */ +#if (ADAPT_ERASE == 1) + short hasbeenchecked; + long rect_time; + long xarc_time; +#endif +} StarField; + +static StarField *starfield = NULL; + +/*********/ +static void +sinvary(SinVariable * v) +/*********/ + +{ + v->value = v->minimum + + (v->maximum - v->minimum) * (sin(v->alpha) + 1.0) / 2.0; + + if (v->mayrand == 0) + v->alpha += v->step; + else { + int vaval = NRAND(100); + + if (vaval <= v->mayrand) + sinvary(v->varrand); + v->alpha += (100.0 + (v->varrand->value)) * v->step / 100.0; + } + + if (v->alpha > 2 * M_PI) + v->alpha -= 2 * M_PI; +} + +/*************************************************/ +static void +sininit(SinVariable * v, + double alpha, double step, double minimum, double maximum, + short int mayrand) +{ + v->alpha = alpha; + v->step = step; + v->minimum = minimum; + v->maximum = maximum; + v->mayrand = mayrand; + if (mayrand != 0) { + if (v->varrand == NULL) + v->varrand = (SinVariable *) calloc(1, sizeof (SinVariable)); + sininit(v->varrand, + VARRANDALPHA, + VARRANDSTEP, + VARRANDMIN, + VARRANDMAX, + 0); + sinvary(v->varrand); + } + /* We calculate the values at least once for initialization */ + sinvary(v); +} + +static void +sinfree(SinVariable * point) +{ + SinVariable *temp, *next; + + next = point->varrand; + while (next) { + temp = next; + next = temp->varrand; + (void) free((void *) temp); + } +} + +/***************/ +void +init_bouboule(ModeInfo * mi) +/***************/ + +/*- + * The stars init part was first inspirated from the net3d game starfield + * code. But net3d starfield is not really 3d starfield, and I needed real 3d, + * so only remains the net3d starfield initialization main idea, that is + * the stars distribution on a sphere (theta and omega computing) + */ +{ + StarField *sp; + int size = MI_SIZE(mi); + int i; + double theta, omega; + + if (starfield == NULL) { + if ((starfield = (StarField *) calloc(MI_NUM_SCREENS(mi), + sizeof (StarField))) == NULL) + return; + } + sp = &starfield[MI_SCREEN(mi)]; + + sp->width = MI_WIN_WIDTH(mi); + sp->height = MI_WIN_HEIGHT(mi); + + /* use the right `black' pixel values: */ + if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) { + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi)); + XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), + 0, 0, sp->width, sp->height); + } else + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + + if (size < -MINSIZE) + sp->max_star_size = NRAND(-size - MINSIZE + 1) + MINSIZE; + else if (size < MINSIZE) + sp->max_star_size = MINSIZE; + else + sp->max_star_size = size; + + sp->NbStars = MI_BATCHCOUNT(mi); + if (sp->NbStars < -MINSTARS) { + if (sp->star) { + (void) free((void *) sp->star); + sp->star = NULL; + } + if (sp->xarc) { + (void) free((void *) sp->xarc); + sp->xarc = NULL; + } + if (sp->xarcleft) { + (void) free((void *) sp->xarcleft); + sp->xarcleft = NULL; + } +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + if (sp->oldxarc) { + (void) free((void *) sp->oldxarc); + sp->oldxarc = NULL; + } + if (sp->oldxarcleft) { + (void) free((void *) sp->oldxarcleft); + sp->oldxarcleft = NULL; + } +#endif + sp->NbStars = NRAND(-sp->NbStars - MINSTARS + 1) + MINSTARS; + } else if (sp->NbStars < MINSTARS) + sp->NbStars = MINSTARS; + + /* We get memory for lists of objects */ + if (sp->star == NULL) + sp->star = (Star *) malloc(sp->NbStars * sizeof (Star)); + if (sp->xarc == NULL) + sp->xarc = (XArc *) malloc(sp->NbStars * sizeof (XArc)); + if (MI_WIN_IS_USE3D(mi) && sp->xarcleft == NULL) + sp->xarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc)); +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + if (sp->oldxarc == NULL) + sp->oldxarc = (XArc *) malloc(sp->NbStars * sizeof (XArc)); + if (MI_WIN_IS_USE3D(mi) && sp->oldxarcleft == NULL) + sp->oldxarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc)); +#endif + + { + /* We initialize evolving variables */ + sininit(&sp->x, + NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0), + ((double) sp->width) / 4.0, + 3.0 * ((double) sp->width) / 4.0, + POSCANRAND); + sininit(&sp->y, + NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0), + ((double) sp->height) / 4.0, + 3.0 * ((double) sp->height) / 4.0, + POSCANRAND); + + /* for z, we have to ensure that the bouboule does not get behind */ + /* the eyes of the viewer. His/Her eyes are at 0. Because the */ + /* bouboule uses the x-radius for the z-radius, too, we have to */ + /* use the x-values. */ + sininit(&sp->z, + NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0), + ((double) sp->width / 2.0 + MINZVAL), + ((double) sp->width / 2.0 + MAXZVAL), + POSCANRAND); + + + sininit(&sp->sizex, + NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0), + MIN(((double) sp->width) - sp->x.value, + sp->x.value) / 5.0, + MIN(((double) sp->width) - sp->x.value, + sp->x.value), + SIZECANRAND); + + sininit(&sp->sizey, + NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0), + MAX(sp->sizex.value / MAX_SIZEX_SIZEY, + sp->sizey.maximum / 5.0), + MIN(sp->sizex.value * MAX_SIZEX_SIZEY, + MIN(((double) sp->height) - + sp->y.value, + sp->y.value)), + SIZECANRAND); + + sininit(&sp->thetax, + NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0), + -M_PI, M_PI, + THETACANRAND); + sininit(&sp->thetay, + NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0), + -M_PI, M_PI, + THETACANRAND); + sininit(&sp->thetaz, + NRAND(3142) / 1000.0, M_PI / (NRAND(400) + 400.0), + -M_PI, M_PI, + THETACANRAND); + } + for (i = 0; i < sp->NbStars; i++) { + Star *star; + XArc *arc = NULL, *arcleft = NULL; +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + XArc *oarc = NULL, *oarcleft = NULL; +#endif + + star = &(sp->star[i]); + arc = &(sp->xarc[i]); + if (MI_WIN_IS_USE3D(mi)) + arcleft = &(sp->xarcleft[i]); +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + oarc = &(sp->oldxarc[i]); + if (MI_WIN_IS_USE3D(mi)) + oarcleft = &(sp->oldxarcleft[i]); +#endif + /* Elevation and bearing of the star */ + theta = dtor((NRAND(1800)) / 10.0 - 90.0); + omega = dtor((NRAND(3600)) / 10.0 - 180.0); + + /* Stars coordinates in a 3D space */ + star->x = cos(theta) * sin(omega); + star->y = sin(omega) * sin(theta); + star->z = cos(omega); + + /* We set the stars size */ + star->size = NRAND(2 * sp->max_star_size); + if (star->size < sp->max_star_size) + star->size = 0; + else + star->size -= sp->max_star_size; + + /* We set default values for the XArc lists elements */ + arc->x = arc->y = 0; + if (MI_WIN_IS_USE3D(mi)) { + arcleft->x = arcleft->y = 0; + } +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + oarc->x = oarc->y = 0; + if (MI_WIN_IS_USE3D(mi)) { + oarcleft->x = oarcleft->y = 0; + } +#endif + arc->width = 2 + star->size; + arc->height = 2 + star->size; + if (MI_WIN_IS_USE3D(mi)) { + arcleft->width = 2 + star->size; + arcleft->height = 2 + star->size; + } +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + oarc->width = 2 + star->size; + oarc->height = 2 + star->size; + if (MI_WIN_IS_USE3D(mi)) { + oarcleft->width = 2 + star->size; + oarcleft->height = 2 + star->size; + } +#endif + + arc->angle1 = 0; + arc->angle2 = 360 * 64; + if (MI_WIN_IS_USE3D(mi)) { + arcleft->angle1 = 0; + arcleft->angle2 = 360 * 64; + } +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + oarc->angle1 = 0; + oarc->angle2 = 360 * 64; /* ie. we draw whole disks: + * from 0 to 360 degrees */ + if (MI_WIN_IS_USE3D(mi)) { + oarcleft->angle1 = 0; + oarcleft->angle2 = 360 * 64; + } +#endif + } + + if (MI_NPIXELS(mi) > 2) + sp->colorp = NRAND(MI_NPIXELS(mi)); + /* We set up the starfield color */ + if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2) + sp->color = MI_PIXEL(mi, sp->colorp); + else + sp->color = MI_WIN_WHITE_PIXEL(mi); + +#if (ADAPT_ERASE == 1) + /* We initialize the adaptation code for screen erasing */ + sp->hasbeenchecked = ADAPT_CHECKS * 2; + sp->rect_time = 0; + sp->xarc_time = 0; +#endif +} + +/****************/ +void +draw_bouboule(ModeInfo * mi) +/****************/ + +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + StarField *sp = &starfield[MI_SCREEN(mi)]; + int i, diff = 0; + double CX, CY, CZ, SX, SY, SZ; + Star *star; + XArc *arc = NULL, *arcleft = NULL; + +#if (ADAPT_ERASE == 1) + struct timeval tv1; + struct timeval tv2; + +#endif + +#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1)) + short x_1, y_1, x_2, y_2; + + /* bounding rectangle around the old starfield, + * for erasing with the smallest rectangle + * instead of filling the whole screen */ + int maxdiff = 0; /* maximal distance between left and right */ + + /* star in 3d mode, otherwise 0 */ +#endif + +#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1)) + if (MI_WIN_IS_USE3D(mi)) { + maxdiff = (int) MAXDIFF; + } + x_1 = (int) sp->x.value - (int) sp->sizex.value - + sp->max_star_size - maxdiff; + y_1 = (int) sp->y.value - (int) sp->sizey.value - + sp->max_star_size; + x_2 = 2 * ((int) sp->sizex.value + sp->max_star_size + maxdiff); + y_2 = 2 * ((int) sp->sizey.value + sp->max_star_size); +#endif + /* We make variables vary. */ + sinvary(&sp->thetax); + sinvary(&sp->thetay); + sinvary(&sp->thetaz); + + sinvary(&sp->x); + sinvary(&sp->y); + if (MI_WIN_IS_USE3D(mi)) + sinvary(&sp->z); + + /* A little trick to prevent the bouboule from being + * bigger than the screen */ + sp->sizex.maximum = + MIN(((double) sp->width) - sp->x.value, + sp->x.value); + sp->sizex.minimum = sp->sizex.maximum / 3.0; + + /* Another trick to make the ball not too flat */ + sp->sizey.minimum = + MAX(sp->sizex.value / MAX_SIZEX_SIZEY, + sp->sizey.maximum / 3.0); + sp->sizey.maximum = + MIN(sp->sizex.value * MAX_SIZEX_SIZEY, + MIN(((double) sp->height) - sp->y.value, + sp->y.value)); + + sinvary(&sp->sizex); + sinvary(&sp->sizey); + + /* + * We calculate the rotation matrix values. We just make the + * rotation on the fly, without using a matrix. + * Star positions are recorded as unit vectors pointing in various + * directions. We just make them all rotate. + */ + CX = cos(sp->thetax.value); + SX = sin(sp->thetax.value); + CY = cos(sp->thetay.value); + SY = sin(sp->thetay.value); + CZ = cos(sp->thetaz.value); + SZ = sin(sp->thetaz.value); + + for (i = 0; i < sp->NbStars; i++) { + star = &(sp->star[i]); + arc = &(sp->xarc[i]); + if (MI_WIN_IS_USE3D(mi)) { + arcleft = &(sp->xarcleft[i]); + /* to help the eyes, the starfield is always as wide as */ + /* deep, so .sizex.value can be used. */ + diff = (int) GETZDIFF(sp->sizex.value * + ((SY * CX) * star->x + (SX) * star->y + + (CX * CY) * star->z) + sp->z.value); + } + arc->x = (short) ((sp->sizex.value * + ((CY * CZ - SX * SY * SZ) * star->x + + (-CX * SZ) * star->y + + (SY * CZ + SZ * SX * CY) * star->z) + + sp->x.value)); + arc->y = (short) ((sp->sizey.value * + ((CY * SZ + SX * SY * CZ) * star->x + + (CX * CZ) * star->y + + (SY * SZ - SX * CY * CZ) * star->z) + + sp->y.value)); + + if (MI_WIN_IS_USE3D(mi)) { + arcleft->x = (short) ((sp->sizex.value * + ((CY * CZ - SX * SY * SZ) * star->x + + (-CX * SZ) * star->y + + (SY * CZ + SZ * SX * CY) * star->z) + + sp->x.value)); + arcleft->y = (short) ((sp->sizey.value * + ((CY * SZ + SX * SY * CZ) * star->x + + (CX * CZ) * star->y + + (SY * SZ - SX * CY * CZ) * star->z) + + sp->y.value)); + arc->x += diff; + arcleft->x -= diff; + } + if (star->size != 0) { + arc->x -= star->size; + arc->y -= star->size; + if (MI_WIN_IS_USE3D(mi)) { + arcleft->x -= star->size; + arcleft->y -= star->size; + } + } + } + + /* First, we erase the previous starfield */ + if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) + XSetForeground(display, gc, MI_NONE_COLOR(mi)); + else + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + +#if (ADAPT_ERASE == 1) + if (sp->hasbeenchecked == 0) { + /* We just calculate which method is the faster and eventually free + * the oldxarc list */ + if (sp->xarc_time > + ADAPT_ARC_PREFERED * sp->rect_time) { + sp->hasbeenchecked = -2; /* XFillRectangle mode */ + (void) free((void *) sp->oldxarc); + sp->oldxarc = NULL; + if (MI_WIN_IS_USE3D(mi)) { + (void) free((void *) sp->oldxarcleft); + sp->oldxarcleft = NULL; + } + } else { + sp->hasbeenchecked = -1; /* XFillArcs mode */ + } + } + if (sp->hasbeenchecked == -2) { + /* Erasing is done with XFillRectangle */ + XFillRectangle(display, window, gc, + x_1, y_1, x_2, y_2); + } else if (sp->hasbeenchecked == -1) { + /* Erasing is done with XFillArcs */ + XFillArcs(display, window, gc, + sp->oldxarc, sp->NbStars); + if (MI_WIN_IS_USE3D(mi)) + XFillArcs(display, window, gc, + sp->oldxarcleft, sp->NbStars); + } else { + long usec; + + if (sp->hasbeenchecked > ADAPT_CHECKS) { +#ifdef GETTIMEOFDAY_TWO_ARGS + (void) gettimeofday(&tv1, NULL); +#else + (void) gettimeofday(&tv1); +#endif + XFillRectangle(display, window, gc, + x_1, y_1, x_2, y_2); +#ifdef GETTIMEOFDAY_TWO_ARGS + (void) gettimeofday(&tv2, NULL); +#else + (void) gettimeofday(&tv2); +#endif + usec = (tv2.tv_sec - tv1.tv_sec) * 1000000; + if (usec + tv2.tv_usec - tv1.tv_usec > 0) { + sp->rect_time += usec + tv2.tv_usec - tv1.tv_usec; + sp->hasbeenchecked--; + } + } else { +#ifdef GETTIMEOFDAY_TWO_ARGS + (void) gettimeofday(&tv1, NULL); +#else + (void) gettimeofday(&tv1); +#endif + XFillArcs(display, window, gc, + sp->oldxarc, sp->NbStars); + if (MI_WIN_IS_USE3D(mi)) + XFillArcs(display, window, gc, + sp->oldxarcleft, sp->NbStars); +#ifdef GETTIMEOFDAY_TWO_ARGS + (void) gettimeofday(&tv2, NULL); +#else + (void) gettimeofday(&tv2); +#endif + usec = (tv2.tv_sec - tv1.tv_sec) * 1000000; + if (usec + tv2.tv_usec - tv1.tv_usec > 0) { + sp->xarc_time += usec + tv2.tv_usec - tv1.tv_usec; + sp->hasbeenchecked--; + } + } + } +#else +#if (USEOLDXARCS == 1) + XFillArcs(display, window, gc, + sp->oldxarc, sp->NbStars); + if (MI_WIN_IS_USE3D(mi)) + XFillArcs(display, window, gc, + sp->oldxarcleft, sp->NbStars); +#else + XFillRectangle(display, window, gc, + x_1, y_1, x_2, y_2); +#endif +#endif + + /* Then we draw the new one */ + if (MI_WIN_IS_USE3D(mi)) { + if (MI_WIN_IS_INSTALL(mi)) + XSetFunction(display, gc, GXor); + XSetForeground(display, gc, MI_RIGHT_COLOR(mi)); + XFillArcs(display, window, gc, sp->xarc, sp->NbStars); + XSetForeground(display, gc, MI_LEFT_COLOR(mi)); + XFillArcs(display, window, gc, sp->xarcleft, sp->NbStars); + if (MI_WIN_IS_INSTALL(mi)) + XSetFunction(display, gc, GXcopy); + } else { + XSetForeground(display, gc, sp->color); + XFillArcs(display, window, gc, sp->xarc, sp->NbStars); + } + +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) +#if (ADAPT_ERASE == 1) + if (sp->hasbeenchecked >= -1) { + arc = sp->xarc; + sp->xarc = sp->oldxarc; + sp->oldxarc = arc; + if (MI_WIN_IS_USE3D(mi)) { + arcleft = sp->xarcleft; + sp->xarcleft = sp->oldxarcleft; + sp->oldxarcleft = arcleft; + } + } +#else + arc = sp->xarc; + sp->xarc = sp->oldxarc; + sp->oldxarc = arc; + if (MI_WIN_IS_USE3D(mi)) { + arcleft = sp->xarcleft; + sp->xarcleft = sp->oldxarcleft; + sp->oldxarcleft = arcleft; + } +#endif +#endif + + /* We set up the color for the next drawing */ + if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2 && + (++sp->colorchange >= COLOR_CHANGES)) { + sp->colorchange = 0; + if (++sp->colorp >= MI_NPIXELS(mi)) + sp->colorp = 0; + sp->color = MI_PIXEL(mi, sp->colorp); + } +} + +void +release_bouboule(ModeInfo * mi) +{ + if (starfield != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + StarField *sp = &starfield[screen]; + + if (sp->star) + (void) free((void *) sp->star); + if (sp->xarc) + (void) free((void *) sp->xarc); + if (sp->xarcleft) + (void) free((void *) sp->xarcleft); +#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1)) + if (sp->oldxarc) + (void) free((void *) sp->oldxarc); + if (sp->oldxarcleft) + (void) free((void *) sp->oldxarcleft); +#endif + sinfree(&(sp->x)); + sinfree(&(sp->y)); + sinfree(&(sp->z)); + sinfree(&(sp->sizex)); + sinfree(&(sp->sizey)); + sinfree(&(sp->thetax)); + sinfree(&(sp->thetay)); + sinfree(&(sp->thetaz)); + } + (void) free((void *) starfield); + starfield = NULL; + } +} + +void +refresh_bouboule(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/bouboule.1 b/hacks/bouboule.man similarity index 100% rename from local/man/man.1/bouboule.1 rename to hacks/bouboule.man diff --git a/hacks/braid.c b/hacks/braid.c new file mode 100644 index 00000000..e6d0cf30 --- /dev/null +++ b/hacks/braid.c @@ -0,0 +1,414 @@ +/* -*- Mode: C; tab-width: 4 -*- + * braid --- draws random color-cyling rotating braids around a circle. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)braid.c 4.00 97/01/01 xlockmore"; +#endif + +/* + * Copyright (c) 1995 by John Neil. + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 01-Sep-95: color knotted components differently, J. Neil. + * 29-Aug-95: Written. John Neil + */ + +#ifdef STANDALONE +# define PROGCLASS "Braid" +# define HACK_INIT init_braid +# define HACK_DRAW draw_braid +# define braid_opts xlockmore_opts +# define DEFAULTS "*count: 15 \n" \ + "*cycles: 100 \n" \ + "*delay: 1000 \n" \ + "*ncolors: 64 \n" +# define UNIFORM_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt braid_opts = { + 0, NULL, 0, NULL, NULL }; + + +#if defined( COLORROUND ) && defined( COLORCOMP ) +#undef COLORROUND +#undef COLORCOMP +#endif + +#if !defined( COLORROUND ) && !defined( COLORCOMP ) +#if 0 +/* to color in a circular pattern use COLORROUND */ +#define COLORROUND +#else +/* to color by component use COLORCOMP */ +#define COLORCOMP +#endif +#endif + +#define MAXLENGTH 50 /* the maximum length of a braid word */ +#define MINLENGTH 8 /* the minimum length of a braid word */ +#define MAXSTRANDS 15 /* the maximum number of strands in the braid */ +#define MINSTRANDS 3 /* the minimum number of strands in the braid */ +#define SPINRATE 12.0 /* the rate at which the colors spin */ + +#define INTRAND(min,max) (NRAND((max+1)-(min))+(min)) +#define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min))) + +typedef struct { + int braidword[MAXLENGTH]; + int components[MAXSTRANDS]; + int startcomp[MAXLENGTH][MAXSTRANDS]; + int nstrands; + int braidlength; + float startcolor; + int center_x; + int center_y; + float min_radius; + float max_radius; + float top, bottom, left, right; + int age; + int color_direction; +} braidtype; + +static braidtype *braids = NULL; + +static int +applyword(braidtype * braid, int string, int position) +{ + int i, c; + + c = string; + for (i = position; i < braid->braidlength; i++) { + if (c == ABS(braid->braidword[i])) + c--; + else if (c == ABS(braid->braidword[i]) - 1) + c++; + } + for (i = 0; i < position; i++) { + if (c == ABS(braid->braidword[i])) + c--; + else if (c == ABS(braid->braidword[i]) - 1) + c++; + } + return c; +} + +#if 0 +static int +applywordto(braidtype * braid, int string, int position) +{ + int i, c; + + c = string; + for (i = 0; i < position; i++) { + if (c == ABS(braid->braidword[i])) { + c--; + } else if (c == ABS(braid->braidword[i]) - 1) { + c++; + } + } + return c; +} +#endif + +static int +applywordbackto(braidtype * braid, int string, int position) +{ + int i, c; + + c = string; + for (i = position - 1; i >= 0; i--) { + if (c == ABS(braid->braidword[i])) { + c--; + } else if (c == ABS(braid->braidword[i]) - 1) { + c++; + } + } + return c; +} + +void +init_braid(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + braidtype *braid; + int used[MAXSTRANDS]; + int i, count, comp, c; + float min_length; + + if (braids == NULL) { + if ((braids = (braidtype *) calloc(MI_NUM_SCREENS(mi), + sizeof (braidtype))) == NULL) + return; + } + braid = &braids[MI_SCREEN(mi)]; + + braid->center_x = MI_WIN_WIDTH(mi) / 2; + braid->center_y = MI_WIN_HEIGHT(mi) / 2; + braid->age = 0; + + /* jwz: go in the other direction sometimes. */ + braid->color_direction = ((LRAND() & 1) ? 1 : -1); + + XClearWindow(display, MI_WINDOW(mi)); + + min_length = (braid->center_x > braid->center_y) ? + braid->center_y : braid->center_x; + braid->min_radius = min_length * 0.30; + braid->max_radius = min_length * 0.90; + + if (MI_BATCHCOUNT(mi) < MINSTRANDS) + braid->nstrands = MINSTRANDS; + else + braid->nstrands = INTRAND(MINSTRANDS, + MAX(MIN(MIN(MAXSTRANDS, MI_BATCHCOUNT(mi)), + (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS)); + braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH, braid->nstrands * 6)); + + for (i = 0; i < braid->braidlength; i++) { + braid->braidword[i] = + INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); + if (i > 0) + while (braid->braidword[i] == -braid->braidword[i - 1]) + braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); + } + + while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1]) + braid->braidword[braid->braidlength - 1] = + INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); + + do { + (void) memset((char *) used, 0, sizeof (used)); + count = 0; + for (i = 0; i < braid->braidlength; i++) + used[ABS(braid->braidword[i])]++; + for (i = 0; i < braid->nstrands; i++) + count += (used[i] > 0) ? 1 : 0; + if (count < braid->nstrands - 1) { + braid->braidword[braid->braidlength] = + INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); + while (braid->braidword[braid->braidlength] == + -braid->braidword[braid->braidlength - 1] && + braid->braidword[0] == -braid->braidword[braid->braidlength]) + braid->braidword[braid->braidlength] = + INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3); + braid->braidlength++; + } + } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH); + + braid->startcolor = (MI_NPIXELS(mi) > 2) ? + (float) NRAND(MI_NPIXELS(mi)) : 0.0; + /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound, + JoinRound); */ + + (void) memset((char *) braid->components, 0, sizeof (braid->components)); + c = 1; + comp = 0; + braid->components[0] = 1; + do { + i = comp; + do { + i = applyword(braid, i, 0); + braid->components[i] = braid->components[comp]; + } while (i != comp); + count = 0; + for (i = 0; i < braid->nstrands; i++) + if (braid->components[i] == 0) + count++; + if (count > 0) { + for (comp = 0; braid->components[comp] != 0; comp++); + braid->components[comp] = ++c; + } + } while (count > 0); + + for (i = 0; i < braid->nstrands; i++) + if (!(braid->components[i] & 1)) + braid->components[i] *= -1; +} + +void +draw_braid(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + braidtype *braid = &braids[MI_SCREEN(mi)]; + float num_points, t_inc; + float theta, psi; + float t, r_diff; + int i, s; + float x_1, y_1, x_2, y_2, r1, r2; + float color, color_use = 0.0, color_inc; + + num_points = 500.0; + theta = (2.0 * M_PI) / (float) (braid->braidlength); + t_inc = (2.0 * M_PI) / num_points; + color_inc = (float) MI_NPIXELS(mi) / num_points; + color_inc *= braid->color_direction; + + braid->startcolor += SPINRATE * color_inc; + if (braid->startcolor >= MI_NPIXELS(mi)) + braid->startcolor = 0.0; + + r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands); + + color = braid->startcolor; + psi = 0.0; + for (i = 0; i < braid->braidlength; i++) { + psi += theta; + for (t = 0.0; t < theta; t += t_inc) { +#ifdef COLORROUND + color += color_inc; + if (color >= (float) (MI_NPIXELS(mi))) + color = 0.0; + color_use = color; +#endif + for (s = 0; s < braid->nstrands; s++) { + if (ABS(braid->braidword[i]) == s) + continue; + if (ABS(braid->braidword[i]) - 1 == s) { + /* crosSINFg */ +#ifdef COLORCOMP + if (MI_NPIXELS(mi) > 2) { + color_use = color + SPINRATE * + braid->components[applywordbackto(braid, s, i)] + + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); + while (color_use >= (float) MI_NPIXELS(mi)) + color_use -= (float) MI_NPIXELS(mi); + while (color_use < 0.0) + color_use += (float) MI_NPIXELS(mi); + } +#endif +#ifdef COLORROUND + if (MI_NPIXELS(mi) > 2) { + color_use += SPINRATE * color_inc; + while (color_use >= (float) (MI_NPIXELS(mi))) + color_use -= (float) MI_NPIXELS(mi); + } +#endif + r1 = braid->min_radius + r_diff * (float) (s); + r2 = braid->min_radius + r_diff * (float) (s + 1); + if (braid->braidword[i] > 0 || + (FABSF(t - theta / 2.0) > theta / 7.0)) { + x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 + + 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) * + COSF(t + psi) + braid->center_x; + y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 + + 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) * + SINF(t + psi) + braid->center_y; + x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 + + 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) * + COSF(t + t_inc + psi) + braid->center_x; + y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 + + 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) * + SINF(t + t_inc + psi) + braid->center_y; + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); + else + XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + + XDrawLine(display, window, MI_GC(mi), + (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); + } +#ifdef COLORCOMP + if (MI_NPIXELS(mi) > 2) { + color_use = color + SPINRATE * + braid->components[applywordbackto(braid, s + 1, i)] + + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); + while (color_use >= (float) MI_NPIXELS(mi)) + color_use -= (float) MI_NPIXELS(mi); + while (color_use < 0.0) + color_use += (float) MI_NPIXELS(mi); + } +#endif + if (braid->braidword[i] < 0 || + (FABSF(t - theta / 2.0) > theta / 7.0)) { + x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 + + 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) * + COSF(t + psi) + braid->center_x; + y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 + + 0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) * + SINF(t + psi) + braid->center_y; + x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 + + 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) * + COSF(t + t_inc + psi) + braid->center_x; + y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 + + 0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) * + SINF(t + t_inc + psi) + braid->center_y; + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); + else + XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + + XDrawLine(display, window, MI_GC(mi), + (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); + } + } else { + /* no crosSINFg */ +#ifdef COLORCOMP + if (MI_NPIXELS(mi) > 2) { + color_use = color + SPINRATE * + braid->components[applywordbackto(braid, s, i)] + + (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi); + while (color_use >= (float) MI_NPIXELS(mi)) + color_use -= (float) MI_NPIXELS(mi); + while (color_use < 0.0) + color_use += (float) MI_NPIXELS(mi); + } +#endif +#ifdef COLORROUND + if (MI_NPIXELS(mi) > 2) { + color_use += SPINRATE * color_inc; + while (color_use >= (float) MI_NPIXELS(mi)) + color_use -= (float) MI_NPIXELS(mi); + } +#endif + r1 = braid->min_radius + r_diff * (float) (s); + x_1 = r1 * COSF(t + psi) + braid->center_x; + y_1 = r1 * SINF(t + psi) + braid->center_y; + x_2 = r1 * COSF(t + t_inc + psi) + braid->center_x; + y_2 = r1 * SINF(t + t_inc + psi) + braid->center_y; + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use)); + else + XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + + XDrawLine(display, window, MI_GC(mi), + (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2)); + } + } + } + } + + if (++braid->age > MI_CYCLES(mi)) + init_braid(mi); +} + +void +release_braid(ModeInfo * mi) +{ + if (braids != NULL) { + (void) free((void *) braids); + braids = NULL; + } +} + +void +refresh_braid(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/braid.1 b/hacks/braid.man similarity index 100% rename from local/man/man.1/braid.1 rename to hacks/braid.man diff --git a/hacks/bubbles-samples/blood.bub.gz b/hacks/bubbles-samples/blood.bub.gz new file mode 100644 index 0000000000000000000000000000000000000000..b98e8558c5c7d380ed6cd29e1386a2df6472fe76 GIT binary patch literal 19382 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 literal 0 HcmV?d00001 diff --git a/hacks/bubbles-samples/blue.bub.gz b/hacks/bubbles-samples/blue.bub.gz new file mode 100644 index 0000000000000000000000000000000000000000..f656079c92accc6d18b10aa56744804e7e932e5f GIT binary patch literal 20129 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 literal 0 HcmV?d00001 diff --git a/hacks/bubbles-samples/jade.bub.gz b/hacks/bubbles-samples/jade.bub.gz new file mode 100644 index 0000000000000000000000000000000000000000..48424f080bffe443a6fb42add6bb7c4d98f1312a GIT binary patch literal 20111 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 x=zCv6B>S7U+{_AgyAT8}CB007Z2Z!iD= literal 0 HcmV?d00001 diff --git a/hacks/bubbles-sources/blood.pov b/hacks/bubbles-sources/blood.pov new file mode 100644 index 00000000..8166f4ea --- /dev/null +++ b/hacks/bubbles-sources/blood.pov @@ -0,0 +1,24 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" + +/* The following make the field of view as wide as it is high + * Thus, you should have the -W and -H command line options + * equal to each other. */ +camera { + location <5.8, 0, 0> + up <0, 1, 0> + right <1, 0, 0> + look_at <0, 0, 0> +} + +sphere { + <0,0,0>, 2.5 + texture { Blood_Marble + scale <2, 2, 2> + rotate <0, 20, 0> } + finish { Dull } +} + +light_source {<6, 1, 0> color White} +/* light_source {<6.1, 1, 0> color White} */ diff --git a/hacks/bubbles-sources/blue.pov b/hacks/bubbles-sources/blue.pov new file mode 100644 index 00000000..86d1ff8d --- /dev/null +++ b/hacks/bubbles-sources/blue.pov @@ -0,0 +1,22 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" + +/* The following make the field of view as wide as it is high + * Thus, you should have the -W and -H command line options + * equal to each other. */ +camera { + location <5.8, 0, 0> + up <0, 1, 0> + right <1, 0, 0> + look_at <0, 0, 0> +} + +sphere { + <0,0,0>, 2.5 + texture { Blue_Agate + scale <0.7, 0.7, 0.7> } + finish { phong 1 } +} + +light_source {<6, 1, 0> color White} diff --git a/hacks/bubbles-sources/glass.pov b/hacks/bubbles-sources/glass.pov new file mode 100644 index 00000000..c1897714 --- /dev/null +++ b/hacks/bubbles-sources/glass.pov @@ -0,0 +1,27 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" + +/* The following make the field of view as wide as it is high + * Thus, you should have the -W and -H command line options + * equal to each other. */ +camera { + location <5.8, 0, 0> + up <0, 1, 0> + right <1, 0, 0> + look_at <0, 0, 0> +} + +sphere { + <0,0,0>, 2.5 + texture { Glass + scale <0.7, 0.7, 0.7> + rotate y*clock + normal {bumps 0.4 scale 0.1} + finish { Shiny } +# finish { phong 0.4 } + } +} + +light_source {<6, 7, 0> color White} +light_source {<6.1, 1, 0> color Blue} diff --git a/hacks/bubbles-sources/jade.pov b/hacks/bubbles-sources/jade.pov new file mode 100644 index 00000000..7c1cb023 --- /dev/null +++ b/hacks/bubbles-sources/jade.pov @@ -0,0 +1,24 @@ +#include "colors.inc" +#include "shapes.inc" +#include "textures.inc" + +/* The following make the field of view as wide as it is high + * Thus, you should have the -W and -H command line options + * equal to each other. */ +camera { + location <5.8, 0, 0> + up <0, 1, 0> + right <1, 0, 0> + look_at <0, 0, 0> +} + +sphere { + <0,0,0>, 2.5 + texture { Jade + scale <0.7, 0.7, 0.7> + rotate y*clock } + finish { phong 0.4 } +} + +light_source {<6, 1, 0> color White} +light_source {<6.1, 1, 0> color White} diff --git a/hacks/bubbles-tools/bubblestodefault b/hacks/bubbles-tools/bubblestodefault new file mode 100755 index 00000000..3ad718b8 --- /dev/null +++ b/hacks/bubbles-tools/bubblestodefault @@ -0,0 +1,115 @@ +#!/usr/bin/perl +# +# $Id: bubblestodefault,v 1.1 1996/09/08 01:35:51 jwz Exp $ +# +#---------------------------------------------------------------------------- +# Copyright (C) 1995-1996 James Macnicol +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +#----------------------------------------------------------------------------- +# +# Contact me (J.Macnicol@student.anu.edu.au) if you have problems. +# +# [ The moral of this story is use a version of rm which safely backs up +# files when you delete them in case you do something stupid like +# "rm * xpm" which trashed all the scripts in this directory so I had +# to write them again. Grrrrrr..... ] +# +#----------------------------------------------------------------------------- +# +# This script takes a set of XPM files (from povbubbles, for example) +# whose names are listed in file with extension .names (of same format +# as output by povbubbles) and puts them together into a file which can +# be used in place of the source file bubbles_default.c which comes with +# bubbles/xscreensaver. +# +# To use it, provide as an argument the base-name of the .names file, +# i.e. if you ran povbubbles on the file foo.pov by typing "povbubbles foo" +# then this created a file "foo.names" so you can now make a new +# bubbles_default.c by typing "bubblestodefault foo". +# + +sub die_help { + print STDERR "Usage: $0 [-help] base-name\n"; + print STDERR " -help gives this message.\n"; + print STDERR " base-name is the name of the file used to generate\n"; + print STDERR " the XPM files, e.g. if you invoked povbubbles with\n"; + print STDERR " \"povbubbles foo\"\n"; + print STDERR " then you should invoke $0 with\n"; + die(" \"$0 foo\"\n"); +} + +sub die_usage { + die "Usage: $0 [-help] base-name\n"; +} + +$infile = undef; + +# Process command line arguments +while ($op = shift) { + if ($op eq "-help") { + &die_help; + } else { + $infile = $op; + # Ignore further arguments + break; + } +} +if ($infile eq undef) { + &die_usage; +} + +$namesfile = $infile . ".names"; + +if (! -f $namesfile) { + die("File list $namesfile doesn't exist\n"); +} + +if (-f "bubbles_default.c") { + print "Backing up bubbles_default.c...\n"; + system("mv -f bubbles_default.c bubbles_default.c.bak"); +} + +open(OUT, ">bubbles_default.c") || die("Couldn't open bubbles_default.c\n"); +print OUT "#include \n"; +print OUT "#include \"bubbles.h\"\n"; +print OUT "\n"; +print OUT "#ifndef NO_DEFAULT_BUBBLE\n"; +print OUT "\n"; + +open(NAMES, $namesfile) || die ("Couldn't open $namesfile\n"); +$numbubbles = 0; +while () { + if (/\s*(\S+)\:(\S+)\s*/) { + $filename = $1; + $xpmname = $2; + $xpmlist = $xpmlist . $xpmname . ", "; + open(CAT, $filename) || die("Couldn't open file $filename listed in\ +$namesfile\n"); + while () { + print OUT; + } + close(CAT); + $numbubbles++; + } else { + print STDERR "Can't understand the line \"$_\"\n"; + print STDERR " in $namesfile. Ignoring...\n"; + } +} +print OUT "char **default_bubbles[] = {$xpmlist"; +print OUT "(char **)0};\n"; +print OUT "\n"; +print OUT "int num_default_bubbles = $numbubbles;\n"; +print OUT "\n"; +print OUT "#endif /* NO_DEFAULT_BUBBLE */\n"; + +close(NAMES); +close(OUT); diff --git a/hacks/bubbles-tools/bubblestofile b/hacks/bubbles-tools/bubblestofile new file mode 100755 index 00000000..4eaf5c9b --- /dev/null +++ b/hacks/bubbles-tools/bubblestofile @@ -0,0 +1,107 @@ +#!/usr/bin/perl +# +# $Id: bubblestofile,v 1.1 1996/09/08 01:35:52 jwz Exp $ +# +#---------------------------------------------------------------------------- +# Copyright (C) 1995-1996 James Macnicol +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +#----------------------------------------------------------------------------- +# +# Contact me (J.Macnicol@student.anu.edu.au) if you have problems. +# +# [ The moral of this story is use a version of rm which safely backs up +# files when you delete them in case you do something stupid like +# "rm * xpm" which trashed all the scripts in this directory so I had +# to write them again. Grrrrrr..... ] +# +#----------------------------------------------------------------------------- +# +# This script takes a set of XPM files (from povbubbles, for example) +# whose names are listed in file with extension .names (of same format +# as output by povbubbles) and puts them together into a file which can +# loaded with the -file option or place in a directory suitable for +# use with the -directory option to bubbles. Note that neither of these +# options are available if you have just compiled bubbles as provided. +# You must edit bubbles.h to enable these. Files generated by this script +# have by default the extension ".bub". +# +# To use it, provide as an argument the base-name of the .names file, +# i.e. if you ran povbubbles on the file foo.pov by typing "povbubbles foo" +# then this created a file "foo.names" so you can now make the loadable file +# "foo.bub" by typing "bubblestofile foo". +# + +sub die_help { + print STDERR "Usage: $0 [-help] base-name\n"; + print STDERR " -help\n"; + print STDERR " gives this message.\n"; + print STDERR " base-name is the name of the file used to generate\n"; + print STDERR " the XPM files, e.g. if you invoked povbubbles with\n"; + print STDERR " \"povbubbles foo\"\n"; + print STDERR " then you should invoke $0 with\n"; + die(" \"$0 foo\"\n"); +} + +sub die_usage { + die "Usage: $0 [-help] base-name\n"; +} + +$infile = undef; + +# Process command line arguments +while ($op = shift) { + if ($op eq "-help") { + &die_help; + } else { + $infile = $op; + # Ignore further arguments + break; + } +} +if ($infile eq undef) { + &die_usage; +} + +$namesfile = $infile . ".names"; +$outfile = $infile . ".bub"; + +if (! -f $namesfile) { + die("File list $namesfile doesn't exist\n"); +} + +if (-f $outfile) { + print "Backing up $outfile\n"; + system("mv -f $outfile $outfile.bak"); +} + +open(OUT, ">$outfile") || die("Couldn't open $outfile\n"); +open(NAMES, $namesfile) || die ("Couldn't open $namesfile\n"); +$numbubbles = 0; +while () { + if (/\s*(\S+)\:(\S+)\s*/) { + $filename = $1; + $xpmname = $2; + open(CAT, $filename) || die("Couldn't open file $filename listed in\ +$namesfile\n"); + while () { + print OUT; + } + close(CAT); + } else { + print STDERR "Can't understand the line \"$_\"\n"; + print STDERR " in $namesfile. Ignoring...\n"; + } +} +close(NAMES); +close(OUT); + + diff --git a/hacks/bubbles-tools/xpm2default b/hacks/bubbles-tools/xpm2default new file mode 100755 index 00000000..b4236089 --- /dev/null +++ b/hacks/bubbles-tools/xpm2default @@ -0,0 +1,51 @@ +#!/usr/bin/perl +#---------------------------------------------------------------------------- +# Copyright (C) 1995-1996 James Macnicol +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 1, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +#----------------------------------------------------------------------------- +# +# Prints to the stdout a file suitable for use as bubbles_default.c for the +# bubbles screensaver (i.e. the default bubble which is compiled into the +# executable). A list of XPMs is expected as input, e.g. output from the +# pov2xpm script in this directory. +# +# Remember to change the path to your perl executable at the top of the +# script if it is wrong. +# +# Examples of usage: +# +# pov2xpm sample.pov | xpm2default > bubbles_default.c +# +# A new set of bubbles is first created with pov2xpm then passed to this +# script which places the C wrapper around the data and finally dumps the +# output into bubbles_default.c. +# +# xpm2default < sample.xpm > bubbles_default.c +# +# Same as the previous example except the XPM data came from a file rather +# than a pipe. +# +$numargs = @ARGV; +print "#include \"bubbles.h\"\n"; +print "\n"; +print "#ifndef NO_DEFAULT_BUBBLE\n"; +print "\n"; +print "char *default_ball_data[] = {\n"; +while () { + chop; + s/"/\\"/g; + print "\"$_\",\n"; +} +print "(char *)0\n"; +print "};\n"; +print "\n"; +print "#endif\n"; diff --git a/hacks/bubbles.c b/hacks/bubbles.c new file mode 100644 index 00000000..5dffd2a2 --- /dev/null +++ b/hacks/bubbles.c @@ -0,0 +1,1869 @@ +/* bubbles.c - frying pan / soft drink in a glass simulation */ + +/*$Id: bubbles.c,v 1.8 1997/07/26 19:16:33 jwz Exp $*/ + +/* + * Copyright (C) 1995-1996 James Macnicol + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/* + * I got my original inspiration for this by looking at the bottom of a + * frying pan while something was cooking and watching the little bubbles + * coming off the bottom of the pan as the oil was boiling joining together + * to form bigger bubbles and finally to *pop* and disappear. I had some + * time on my hands so I wrote this little xscreensaver module to imitate + * it. Now that it's done it reminds me more of the bubbles you get in + * a glass of fizzy soft drink..... + * + * The problem seemed to be that the position/size etc. of all the bubbles + * on the screen had to be remembered and searched through to find when + * bubbles hit each other and combined. To do this more efficiently, the + * window/screen is divided up into a square mesh of side length mesh_length + * and separate lists of bubbles contained in each cell of the mesh are + * kept. Only the cells in the immediate vicinity of the bubble in question + * are searched. This should make things more efficient although the whole + * thing seems to use up too much CPU, but then I'm using an ancient PC so + * perhaps it's not surprising . + * (Six months after I wrote the above I now have a Pentium with PCI graphics + * and things are _much_ nicer.) + * + * Author: James Macnicol + * Internet E-mail : J.Macnicol@student.anu.edu.au + */ + +#include +#include "screenhack.h" +#include "bubbles.h" + +#ifdef BUBBLES_IO +# include +# include +# include +#endif /* BUBBLES_IO */ + +#include +#include +#include +#include +#include + +#ifndef VMS +# include +#else /* VMS */ +# if __DECC_VER >= 50200000 +# include +# endif +#endif /* VMS */ + +#ifdef HAVE_UNISTD_H +# include +#endif +#include "yarandom.h" + +#ifdef HAVE_XPM +#include +#endif + +/* + * Public variables + */ + +#ifndef NO_DEFAULT_BUBBLE +extern int num_default_bubbles; +extern char **default_bubbles[]; +#endif /* NO_DEFAULT_BUBBLE */ + +char *progclass = "Bubbles"; + +char *defaults [] = { + "*background: black", + "*foreground: white", + "*simple: false", + "*broken: false", + "*delay: 2000", +#ifdef BUBBLES_IO + "*file: (default)", + "*directory: (default)", +#endif /* BUBBLES_IO */ + "*quiet: false", + "*nodelay: false", + "*3D: false", + "*geometry: 400x300", + 0 +}; + +XrmOptionDescRec options [] = { + { "-simple", ".simple", XrmoptionNoArg, "true" }, +#ifdef HAVE_XPM + { "-broken", ".broken", XrmoptionNoArg, "true" }, +#endif /* HAVE_XPM */ + { "-quiet", ".quiet", XrmoptionNoArg, "true" }, + { "-nodelay", ".nodelay", XrmoptionNoArg, "true" }, + { "-3D", ".3D", XrmoptionNoArg, "true" }, +#ifdef BUBBLES_IO + { "-file", ".file", XrmoptionSepArg, 0 }, + { "-directory", ".directory", XrmoptionSepArg, 0 }, +#endif /* BUBBLES_IO */ + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +/* + * Private variables + */ + +static Bubble **mesh; +static int mesh_length; +static int mesh_width; +static int mesh_height; +static int mesh_cells; + +static int **adjacent_list; + +static int screen_width; +static int screen_height; +static int screen_depth; +static unsigned int default_fg_pixel, default_bg_pixel; +/* + * I know it's not elegant to save this stuff in global variables + * but we need it for the signal handler. + */ +static Display *defdsp; +static Window defwin; +static Colormap defcmap; +static Visual *defvisual; + +/* For simple mode only */ +static int bubble_min_radius; +static int bubble_max_radius; +static long *bubble_areas; +static GC draw_gc, erase_gc; + +#ifdef HAVE_XPM +static int num_bubble_pixmaps; +static Bubble_Step **step_pixmaps; +#ifdef BUBBLES_IO +static char *pixmap_file; +#endif /* BUBBLES_IO */ +static int use_default_bubble; +#endif /* HAVE_XPM */ + +/* Options stuff */ +#ifdef HAVE_XPM +static Bool simple = False; +#else +static Bool simple = True; +#endif +static Bool broken = False; +static Bool quiet = False; +static Bool threed = False; +static int delay; + +/* + * To prevent forward references, some stuff is up here + */ + +static long +calc_bubble_area(int r) +/* Calculate the area of a bubble of radius r */ +{ +#ifdef DEBUG + printf("%d %g\n", r, + 10.0 * PI * (double)r * (double)r * (double)r); +#endif /* DEBUG */ + if (threed) + return (long)(10.0 * PI * (double)r * (double)r * (double)r); + else + return (long)(10.0 * PI * (double)r * (double)r); +} + +static void * +xmalloc(size_t size) +/* Safe malloc */ +{ + void *ret; + + if ((ret = malloc(size)) == NULL) { + fprintf(stderr, "%s: out of memory\n", progname); + exit(1); + } + return ret; +} + +#ifdef DEBUG +static void +die_bad_bubble(Bubble *bb) +/* This is for use with GDB */ +{ + fprintf(stderr, "Bad bubble detected at 0x%x!\n", (int)bb); + exit(1); +} +#endif + +static int +null_bubble(Bubble *bb) +/* Returns true if the pointer passed is NULL. If not then this checks to +see if the bubble is valid (i.e. the (x,y) position is valid and the magic +number is set correctly. This only a sanity check for debugging and is +turned off if DEBUG isn't set. */ +{ + if (bb == (Bubble *)NULL) + return 1; +#ifdef DEBUG + if ((bb->cell_index < 0) || (bb->cell_index > mesh_cells)) { + fprintf(stderr, "cell_index = %d\n", bb->cell_index); + die_bad_bubble(bb); + } + if (bb->magic != BUBBLE_MAGIC) { + fprintf(stderr, "Magic = %d\n", bb->magic); + die_bad_bubble(bb); + } + if (simple) { + if ((bb->x < 0) || (bb->x > screen_width) || + (bb->y < 0) || (bb->y > screen_height) || + (bb->radius < bubble_min_radius) || (bb->radius > + bubble_max_radius)) { + fprintf(stderr, + "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n", + bb->radius, bb->x, bb->y, bb->magic, bb->cell_index); + die_bad_bubble(bb); + } +#ifdef HAVE_XPM + } else { + if ((bb->x < 0) || (bb->x > screen_width) || + (bb->y < 0) || (bb->y > screen_height) || + (bb->radius < step_pixmaps[0]->radius) || + (bb->radius > step_pixmaps[num_bubble_pixmaps-1]->radius)) { + fprintf(stderr, + "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n", + bb->radius, bb->x, bb->y, bb->magic, bb->cell_index); + die_bad_bubble(bb); + } +#endif /* HAVE_XPM */ + } +#endif /* DEBUG */ + return 0; +} + +#ifdef DEBUG +static void +print_bubble_list(Bubble *bb) +/* Print list of where all the bubbles are. For debugging purposes only. */ +{ + if (! null_bubble(bb)) { + printf(" (%d, %d) %d\n", bb->x, bb->y, bb->radius); + print_bubble_list(bb->next); + } +} +#endif /* DEBUG */ + +static void +add_bubble_to_list(Bubble **list, Bubble *bb) +/* Take a pointer to a list of bubbles and stick bb at the head of the + list. */ +{ + Bubble *head = *list; + + if (null_bubble(head)) { + bb->prev = (Bubble *)NULL; + bb->next = (Bubble *)NULL; + } else { + bb->next = head; + bb->prev = (Bubble *)NULL; + head->prev = bb; + } + *list = bb; +} + + +/* + * Mesh stuff + */ + + +static void +init_mesh (void) +/* Setup the mesh of bubbles */ +{ + int i; + + mesh = (Bubble **)xmalloc(mesh_cells * sizeof(Bubble *)); + for (i = 0; i < mesh_cells; i++) + mesh[i] = (Bubble *)NULL; +} + +static int +cell_to_mesh(int x, int y) +/* convert cell coordinates to mesh index */ +{ +#ifdef DEBUG + if ((x < 0) || (y < 0)) { + fprintf(stderr, "cell_to_mesh: x = %d, y = %d\n", x, y); + exit(1); + } +#endif + return ((mesh_width * y) + x); +} + +static void +mesh_to_cell(int mi, int *cx, int *cy) +/* convert mesh index into cell coordinates */ +{ + *cx = mi % mesh_width; + *cy = mi / mesh_width; +} + +static int +pixel_to_mesh(int x, int y) +/* convert screen coordinates into mesh index */ +{ + return cell_to_mesh((x / mesh_length), (y / mesh_length)); +} + +static int +verify_mesh_index(int x, int y) +/* check to see if (x,y) is in the mesh */ +{ + if ((x < 0) || (y < 0) || (x >= mesh_width) || (y >= mesh_height)) + return (-1); + return (cell_to_mesh(x, y)); +} + +#ifdef DEBUG +static void +print_adjacents(int *adj) +/* Print a list of the cells calculated above. For debugging only. */ +{ + int i; + + printf("("); + for (i = 0; i < 8; i++) + printf("%d ", adj[i]); + printf(")\n"); +} +#endif /* DEBUG */ + +static void +add_to_mesh(Bubble *bb) +/* Add the given bubble to the mesh by sticking it on the front of the +list. bb is already allocated so no need to malloc() anything, just +adjust pointers. */ +{ +#ifdef DEBUG + if (null_bubble(bb)) { + fprintf(stderr, "Bad bubble passed to add_to_mesh()!\n"); + exit(1); + } +#endif /* DEBUG */ + + add_bubble_to_list(&mesh[bb->cell_index], bb); +} + +#ifdef DEBUG +static void +print_mesh (void) +/* Print the contents of the mesh */ +{ + int i; + + for (i = 0; i < mesh_cells; i++) { + if (! null_bubble(mesh[i])) { + printf("Mesh cell %d\n", i); + print_bubble_list(mesh[i]); + } + } +} + +static void +valid_mesh (void) +/* Check to see if the mesh is Okay. For debugging only. */ +{ + int i; + Bubble *b; + + for (i = 0; i < mesh_cells; i++) { + b = mesh[i]; + while (! null_bubble(b)) + b = b->next; + } +} + +static int +total_bubbles (void) +/* Count how many bubbles there are in total. For debugging only. */ +{ + int rv = 0; + int i; + Bubble *b; + + for (i = 0; i < mesh_cells; i++) { + b = mesh[i]; + while (! null_bubble(b)) { + rv++; + b = b->next; + } + } + + return rv; +} +#endif /* DEBUG */ + +static void +calculate_adjacent_list (void) +/* Calculate the list of cells adjacent to a particular cell for use + later. */ +{ + int i; + int ix, iy; + + adjacent_list = (int **)xmalloc(mesh_cells * sizeof(int *)); + for (i = 0; i < mesh_cells; i++) { + adjacent_list[i] = (int *)xmalloc(9 * sizeof(int)); + mesh_to_cell(i, &ix, &iy); + adjacent_list[i][0] = verify_mesh_index(--ix, --iy); + adjacent_list[i][1] = verify_mesh_index(++ix, iy); + adjacent_list[i][2] = verify_mesh_index(++ix, iy); + adjacent_list[i][3] = verify_mesh_index(ix, ++iy); + adjacent_list[i][4] = verify_mesh_index(ix, ++iy); + adjacent_list[i][5] = verify_mesh_index(--ix, iy); + adjacent_list[i][6] = verify_mesh_index(--ix, iy); + adjacent_list[i][7] = verify_mesh_index(ix, --iy); + adjacent_list[i][8] = i; + } +} + +static void +adjust_areas (void) +/* Adjust areas of bubbles so we don't get overflow in weighted_mean() */ +{ + double maxvalue; + long maxarea; + long factor; + int i; + +#ifdef HAVE_XPM + if (simple) + maxarea = bubble_areas[bubble_max_radius+1]; + else + maxarea = step_pixmaps[num_bubble_pixmaps]->area; +#else + maxarea = bubble_areas[bubble_max_radius+1]; +#endif /* HAVE_XPM */ + maxvalue = (double)screen_width * 2.0 * (double)maxarea; + factor = (long)ceil(maxvalue / (double)LONG_MAX); + if (factor > 1) { + /* Overflow will occur in weighted_mean(). We must divide areas + each by factor so it will never do so. */ +#ifdef HAVE_XPM + if (simple) { + for (i = bubble_min_radius; i <= bubble_max_radius+1; i++) { + bubble_areas[i] /= factor; + if (bubble_areas[i] == 0) + bubble_areas[i] = 1; + } + } else { + for (i = 0; i <= num_bubble_pixmaps; i++) { +#ifdef DEBUG + printf("area = %ld", step_pixmaps[i]->area); +#endif /* DEBUG */ + step_pixmaps[i]->area /= factor; + if (step_pixmaps[i]->area == 0) + step_pixmaps[i]->area = 1; +#ifdef DEBUG + printf("-> %ld\n", step_pixmaps[i]->area); +#endif /* DEBUG */ + } + } +#else + for (i = bubble_min_radius; i <= bubble_max_radius+1; i++) { + bubble_areas[i] /= factor; + if (bubble_areas[i] == 0) + bubble_areas[i] = 1; + } +#endif /* HAVE_XPM */ + } +#ifdef DEBUG + printf("maxarea = %ld\n", maxarea); + printf("maxvalue = %g\n", maxvalue); + printf("LONG_MAX = %ld\n", LONG_MAX); + printf("factor = %ld\n", factor); +#endif /* DEBUG */ +} + +/* + * Bubbles stuff + */ + +static Bubble * +new_bubble (void) +/* Add a new bubble at some random position on the screen of the smallest +size. */ +{ + Bubble *rv = (Bubble *)xmalloc(sizeof(Bubble)); + + /* Can't use null_bubble() here since magic number hasn't been set */ + if (rv == (Bubble *)NULL) { + fprintf(stderr, "Ran out of memory!\n"); + exit(1); + } + + if (simple) { + rv->radius = bubble_min_radius; + rv->area = bubble_areas[bubble_min_radius]; +#ifdef HAVE_XPM + } else { + rv->step = 0; + rv->radius = step_pixmaps[0]->radius; + rv->area = step_pixmaps[0]->area; +#endif /* HAVE_XPM */ + } + rv->visible = 0; + rv->magic = BUBBLE_MAGIC; + rv->x = ya_random() % screen_width; + rv->y = ya_random() % screen_height; + rv->cell_index = pixel_to_mesh(rv->x, rv->y); + + return rv; +} + +static void +show_bubble(Bubble *bb) +/* paint the bubble on the screen */ +{ + if (null_bubble(bb)) { + fprintf(stderr, "NULL bubble passed to show_bubble\n"); + exit(1); + } + + if (! bb->visible) { + bb->visible = 1; + + if (simple) { + XDrawArc(defdsp, defwin, draw_gc, (bb->x - bb->radius), + (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0, + 360*64); + } else { +#ifdef HAVE_XPM + XSetClipOrigin(defdsp, step_pixmaps[bb->step]->draw_gc, + (bb->x - bb->radius), + (bb->y - bb->radius)); + + XCopyArea(defdsp, step_pixmaps[bb->step]->ball, defwin, + step_pixmaps[bb->step]->draw_gc, + 0, 0, (bb->radius * 2), + (bb->radius * 2), + (bb->x - bb->radius), + (bb->y - bb->radius)); +#endif /* HAVE_XPM */ + } + } +} + +static void +hide_bubble(Bubble *bb) +/* erase the bubble */ +{ + if (null_bubble(bb)) { + fprintf(stderr, "NULL bubble passed to hide_bubble\n"); + exit(1); + } + + if (bb->visible) { + bb->visible = 0; + + if (simple) { + XDrawArc(defdsp, defwin, erase_gc, (bb->x - bb->radius), + (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0, + 360*64); + } else { +#ifdef HAVE_XPM + if (! broken) { + XSetClipOrigin(defdsp, step_pixmaps[bb->step]->erase_gc, + (bb->x - bb->radius), (bb->y - bb->radius)); + + XFillRectangle(defdsp, defwin, step_pixmaps[bb->step]->erase_gc, + (bb->x - bb->radius), + (bb->y - bb->radius), + (bb->radius * 2), + (bb->radius * 2)); + } +#endif /* HAVE_XPM */ + } + } +} + +static void +delete_bubble_in_mesh(Bubble *bb, int keep_bubble) +/* Delete an individual bubble, adjusting list of bubbles around it. + If keep_bubble is true then the bubble isn't actually deleted. We + use this to allow bubbles to change mesh cells without reallocating, + (it needs this when two bubbles collide and the centre position is + recalculated, and this may stray over a mesh boundary). */ +{ + if ((!null_bubble(bb->prev)) && (!null_bubble(bb->next))) { + bb->prev->next = bb->next; + bb->next->prev = bb->prev; + } else if ((!null_bubble(bb->prev)) && + (null_bubble(bb->next))) { + bb->prev->next = (Bubble *)NULL; + bb->next = mesh[bb->cell_index]; + } else if ((null_bubble(bb->prev)) && + (!null_bubble(bb->next))) { + bb->next->prev = (Bubble *)NULL; + mesh[bb->cell_index] = bb->next; + bb->next = mesh[bb->cell_index]; + } else { + /* Only item on list */ + mesh[bb->cell_index] = (Bubble *)NULL; + } + if (! keep_bubble) + free(bb); +} + +static unsigned long +ulongsqrint(int x) +/* Saves ugly inline code */ +{ + return ((unsigned long)x * (unsigned long)x); +} + +static Bubble * +get_closest_bubble(Bubble *bb) +/* Find the closest bubble touching the this bubble, NULL if none are + touching. */ +{ + Bubble *rv = (Bubble *)NULL; + Bubble *tmp; + unsigned long separation2, touchdist2; + int dx, dy; + unsigned long closest2 = ULONG_MAX; + int i; + +#ifdef DEBUG + if (null_bubble(bb)) { + fprintf(stderr, "NULL pointer 0x%x passed to get_closest_bubble()!", + (int)bb); + exit(1); + } +#endif /* DEBUG */ + + for (i = 0; i < 9; i++) { + /* There is a bug here where bb->cell_index is negaitve.. */ +#ifdef DEBUG + if ((bb->cell_index < 0) || (bb->cell_index >= mesh_cells)) { + fprintf(stderr, "bb->cell_index = %d\n", bb->cell_index); + exit(1); + } +#endif /* DEBUG */ +/* printf("%d,", bb->cell_index); */ + if (adjacent_list[bb->cell_index][i] != -1) { + tmp = mesh[adjacent_list[bb->cell_index][i]]; + while (! null_bubble(tmp)) { + if (tmp != bb) { + dx = tmp->x - bb->x; + dy = tmp->y - bb->y; + separation2 = ulongsqrint(dx) + ulongsqrint(dy); + /* Add extra leeway so circles _never_ overlap */ + touchdist2 = ulongsqrint(tmp->radius + bb->radius + 2); + if ((separation2 <= touchdist2) && (separation2 < + closest2)) { + rv = tmp; + closest2 = separation2; + } + } + tmp = tmp->next; + } + } + } + + return rv; +} + +#ifdef DEBUG +static void +ldr_barf (void) +{ +} +#endif /* DEBUG */ + +static long +long_div_round(long num, long dem) +{ + long divvie, moddo; + +#ifdef DEBUG + if ((num < 0) || (dem < 0)) { + fprintf(stderr, "long_div_round: %ld, %ld\n", num, dem); + ldr_barf(); + exit(1); + } +#endif /* DEBUG */ + + divvie = num / dem; + moddo = num % dem; + if (moddo > (dem / 2)) + ++divvie; + +#ifdef DEBUG + if ((divvie < 0) || (moddo < 0)) { + fprintf(stderr, "long_div_round: %ld, %ld\n", divvie, moddo); + ldr_barf(); + exit(1); + } +#endif /* DEBUG */ + + return divvie; +} + +static int +weighted_mean(int n1, int n2, long w1, long w2) +/* Mean of n1 and n2 respectively weighted by weights w1 and w2. */ +{ +#ifdef DEBUG + if ((w1 <= 0) || (w2 <= 0)) { + fprintf(stderr, + "Bad weights passed to weighted_mean() - (%d, %d, %ld, %ld)!\n", + n1, n2, w1, w2); + exit(1); + } +#endif /* DEBUG */ + return ((int)long_div_round((long)n1 * w1 + (long)n2 * w2, + w1 + w2)); +} + +static int +bubble_eat(Bubble *diner, Bubble *food) +/* The diner eats the food. Returns true (1) if the diner still exists */ +{ + int i; + int newmi; + +#ifdef DEBUG + if ((null_bubble(diner)) || (null_bubble(food))) { + fprintf(stderr, "Bad bubbles passed to bubble_eat()!\n"); + exit(1); + } +#endif /* DEBUG */ + + /* We hide the diner even in the case that it doesn't grow so that + if the food overlaps its boundary it is replaced. This could + probably be solved by letting bubbles eat others which are close + but not quite touching. It's probably worth it, too, since we + would then not have to redraw bubbles which don't change in + size. */ + + hide_bubble(diner); + hide_bubble(food); + diner->x = weighted_mean(diner->x, food->x, diner->area, food->area); + diner->y = weighted_mean(diner->y, food->y, diner->area, food->area); + newmi = pixel_to_mesh(diner->x, diner->y); + diner->area += food->area; + delete_bubble_in_mesh(food, DELETE_BUBBLE); + + if ((simple) && (diner->area > bubble_areas[bubble_max_radius])) { + delete_bubble_in_mesh(diner, DELETE_BUBBLE); + return 0; + } +#ifdef HAVE_XPM + if ((! simple) && (diner->area > + step_pixmaps[num_bubble_pixmaps]->area)) { + delete_bubble_in_mesh(diner, DELETE_BUBBLE); + return 0; + } +#endif /* HAVE_XPM */ + + if (simple) { + if (diner->area > bubble_areas[diner->radius + 1]) { + /* Move the bubble to a new radius */ + i = diner->radius; + while (diner->area > bubble_areas[i+1]) + ++i; + diner->radius = i; + } + show_bubble(diner); +#ifdef HAVE_XPM + } else { + if (diner->area > step_pixmaps[diner->step+1]->area) { + i = diner->step; + while (diner->area > step_pixmaps[i+1]->area) + ++i; + diner->step = i; + diner->radius = step_pixmaps[diner->step]->radius; + } + show_bubble(diner); +#endif /* HAVE_XPM */ + } + + /* Now adjust locations and cells if need be */ + if (newmi != diner->cell_index) { + delete_bubble_in_mesh(diner, KEEP_BUBBLE); + diner->cell_index = newmi; + add_to_mesh(diner); + } + + return 1; +} + +static int +merge_bubbles(Bubble *b1, Bubble *b2) +/* These two bubbles merge into one. If the first one wins out return +1 else return 2. If there is no winner (it explodes) then return 0 */ +{ + int b1size, b2size; + + b1size = b1->area; + b2size = b2->area; + +#ifdef DEBUG + if ((null_bubble(b1) || null_bubble(b2))) { + fprintf(stderr, "NULL bubble passed to merge_bubbles()!\n"); + exit(1); + } +#endif /* DEBUG */ + + if (b1 == b2) { + hide_bubble(b1); + delete_bubble_in_mesh(b1, DELETE_BUBBLE); + return 0; + } + + if (b1size > b2size) { + switch (bubble_eat(b1, b2)) { + case 0: + return 0; + break; + case 1: + return 1; + break; + default: + break; + } + } else if (b1size < b2size) { + switch (bubble_eat(b2, b1)) { + case 0: + return 0; + break; + case 1: + return 2; + break; + default: + break; + } + } else { + if ((ya_random() % 2) == 0) { + switch (bubble_eat(b1, b2)) { + case 0: + return 0; + break; + case 1: + return 1; + break; + default: + break; + } + } else { + switch (bubble_eat(b2, b1)) { + case 0: + return 0; + break; + case 1: + return 2; + break; + default: + break; + } + } + } + fprintf(stderr, "An error occurred in merge_bubbles()\n"); + exit(1); +} + +static void +insert_new_bubble(Bubble *tmp) +/* Calculates which bubbles are eaten when a new bubble tmp is + inserted. This is called recursively in case when a bubble grows + it eats others. Careful to pick out disappearing bubbles. */ +{ + Bubble *nextbub; + Bubble *touch; + +#ifdef DEBUG + if (null_bubble(tmp)) { + fprintf(stderr, "Bad bubble passed to insert_new_bubble()!\n"); + exit(1); + } +#endif /* DEBUG */ + + nextbub = tmp; + touch = get_closest_bubble(nextbub); + while (! null_bubble(touch)) { + switch (merge_bubbles(nextbub, touch)) { + case 2: + /* touch ate nextbub and survived */ + nextbub = touch; + break; + case 1: + /* nextbub ate touch and survived */ + break; + case 0: + /* somebody ate someone else but they exploded */ + nextbub = (Bubble *)NULL; + break; + default: + /* something went wrong */ + fprintf(stderr, "Error occurred in insert_new_bubble()\n"); + exit(1); + } + /* Check to see if there are any other bubbles still in the area + and if we need to do this all over again for them. */ + if (! null_bubble(nextbub)) + touch = get_closest_bubble(nextbub); + else + touch = (Bubble *)NULL; + } +} + +#ifdef DEBUG +static int +get_length_of_bubble_list(Bubble *bb) +{ + Bubble *tmp = bb; + int rv = 0; + + while (! null_bubble(tmp)) { + rv++; + tmp = tmp->next; + } + + return rv; +} +#endif /* DEBUG */ + +/* + * Pixmap stuff used regardless of whether file I/O is available. Must + * still check for XPM, though! + */ + +#ifdef HAVE_XPM + +static void +free_pixmaps (void) +/* Free resources associated with XPM */ +{ + int i; + +#ifdef DEBUG + if (simple) { + fprintf(stderr, "free_pixmaps() called in simple mode\n"); + exit(1); + } + printf("free_pixmaps()\n"); +#endif /* DEBUG */ + + for(i = 0; i < (num_bubble_pixmaps - 1); i++) { + XFreePixmap(defdsp, step_pixmaps[i]->ball); + XFreePixmap(defdsp, step_pixmaps[i]->shape_mask); + XFreeGC(defdsp, step_pixmaps[i]->draw_gc); + XFreeGC(defdsp, step_pixmaps[i]->erase_gc); + XFreeColors(defdsp, defcmap, step_pixmaps[i]->xpmattrs.pixels, + step_pixmaps[i]->xpmattrs.npixels, 0); + XpmFreeAttributes(&step_pixmaps[i]->xpmattrs); + } +} + +static void +onintr(int a) +/* This gets called when SIGINT or SIGTERM is received */ +{ + free_pixmaps(); + exit(0); +} + +#ifdef DEBUG +static void +onsegv(int a) +/* Called when SEGV detected. Hmmmmm.... */ +{ + fflush(stdout); + fprintf(stderr, "SEGV detected! : %d\n", a); + exit(1); +} +#endif /* DEBUG */ + + +/* + * Pixmaps without file I/O (but do have XPM) + */ + +static void +pixmap_sort(Bubble_Step **head, int numelems) +/* Couldn't get qsort to work right with this so I wrote my own. This puts +the numelems length array with first element at head into order of radius. +*/ +{ + Bubble_Step tmp; + Bubble_Step *least = 0; + int minradius = INT_MAX; + int i; + + for (i = 0; i < numelems; i++) { + if (head[i]->radius < minradius) { + least = head[i]; + minradius = head[i]->radius; + } + } + if (*head != least) { + memcpy(&tmp, least, sizeof(Bubble_Step)); + memcpy(least, *head, sizeof(Bubble_Step)); + memcpy(*head, &tmp, sizeof(Bubble_Step)); + } + + if (numelems > 2) + pixmap_sort(&head[1], numelems-1); +} + +static int +extrapolate(int i1, int i2) +{ + return (i2 + (i2 - i1)); +} + +static void +make_pixmap_array(Bubble_Step *list) +/* From a linked list of bubbles construct the array step_pixmaps */ +{ + Bubble_Step *tmp = list; + int ind; +#ifdef DEBUG + int prevrad = -1; +#endif + + if (list == (Bubble_Step *)NULL) { + fprintf(stderr, "NULL list passed to make_pixmap_array\n"); + exit(1); + } + + num_bubble_pixmaps = 1; + while(tmp->next != (Bubble_Step *)NULL) { + tmp = tmp->next; + ++num_bubble_pixmaps; + } + + if (num_bubble_pixmaps < 2) { + fprintf(stderr, "Must be at least two bubbles in file\n"); + exit(1); + } + + step_pixmaps = (Bubble_Step **)xmalloc((num_bubble_pixmaps + 1) * + sizeof(Bubble_Step *)); + + /* Copy them blindly into the array for sorting. */ + ind = 0; + tmp = list; + do { + step_pixmaps[ind++] = tmp; + tmp = tmp->next; + } while(tmp != (Bubble_Step *)NULL); + + /* We make another bubble beyond the ones with pixmaps so that the final + bubble hangs around and doesn't pop immediately. It's radius and area + are found by extrapolating from the largest two bubbles with pixmaps. */ + + step_pixmaps[num_bubble_pixmaps] = + (Bubble_Step *)xmalloc(sizeof(Bubble_Step)); + step_pixmaps[num_bubble_pixmaps]->radius = INT_MAX; + + pixmap_sort(step_pixmaps, (num_bubble_pixmaps + 1)); + +#ifdef DEBUG + if (step_pixmaps[num_bubble_pixmaps]->radius != INT_MAX) { + fprintf(stderr, "pixmap_sort() screwed up make_pixmap_array\n"); + } +#endif /* DEBUG */ + + step_pixmaps[num_bubble_pixmaps]->radius = + extrapolate(step_pixmaps[num_bubble_pixmaps-2]->radius, + step_pixmaps[num_bubble_pixmaps-1]->radius); + step_pixmaps[num_bubble_pixmaps]->area = + calc_bubble_area(step_pixmaps[num_bubble_pixmaps]->radius); + + +#ifdef DEBUG + /* Now check for correct order */ + for (ind = 0; ind < num_bubble_pixmaps; ind++) { + if (prevrad > 0) { + if (step_pixmaps[ind]->radius < prevrad) { + fprintf(stderr, "Pixmaps not in ascending order of radius\n"); + exit(1); + } + } + prevrad = step_pixmaps[ind]->radius; + } +#endif /* DEBUG */ +} + +#ifndef NO_DEFAULT_BUBBLE +static void +make_pixmap_from_default(char **pixmap_data, Bubble_Step *bl) +/* Read pixmap data which has been compiled into the program and a pointer + to which has been passed. + + This is virtually copied verbatim from make_pixmap_from_file() above and +changes made to either should be propagated onwards! */ +{ + int result; + XGCValues gcv; + +#ifdef DEBUG + if (pixmap_data == (char **)0) { + fprintf(stderr, "make_pixmap_from_default(): NULL passed\n"); + exit(1); + } +#endif + + if (bl == (Bubble_Step *)NULL) { + fprintf(stderr, "NULL pointer passed to make_pixmap()\n"); + exit(1); + } + + bl->xpmattrs.valuemask = 0; + +#ifdef XpmCloseness + bl->xpmattrs.valuemask |= XpmCloseness; + bl->xpmattrs.closeness = 40000; +#endif +#ifdef XpmVisual + bl->xpmattrs.valuemask |= XpmVisual; + bl->xpmattrs.visual = defvisual; +#endif +#ifdef XpmDepth + bl->xpmattrs.valuemask |= XpmDepth; + bl->xpmattrs.depth = screen_depth; +#endif +#ifdef XpmColormap + bl->xpmattrs.valuemask |= XpmColormap; + bl->xpmattrs.colormap = defcmap; +#endif + + + /* This is the only line which is different from make_pixmap_from_file() */ + result = XpmCreatePixmapFromData(defdsp, defwin, pixmap_data, &bl->ball, + &bl->shape_mask, &bl->xpmattrs); + + switch(result) { + case XpmColorError: + fprintf(stderr, "xpm: color substitution performed\n"); + /* fall through */ + case XpmSuccess: + bl->radius = MAX(bl->xpmattrs.width, bl->xpmattrs.height) / 2; + bl->area = calc_bubble_area(bl->radius); + break; + case XpmColorFailed: + fprintf(stderr, "xpm: color allocation failed\n"); + exit(1); + case XpmNoMemory: + fprintf(stderr, "xpm: out of memory\n"); + exit(1); + default: + fprintf(stderr, "xpm: unknown error code %d\n", result); + exit(1); + } + + gcv.plane_mask = AllPlanes; + gcv.foreground = default_fg_pixel; + gcv.function = GXcopy; + bl->draw_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv); + XSetClipMask(defdsp, bl->draw_gc, bl->shape_mask); + + gcv.foreground = default_bg_pixel; + gcv.function = GXcopy; + bl->erase_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv); + XSetClipMask(defdsp, bl->erase_gc, bl->shape_mask); +} + +static void +default_to_pixmaps (void) +/* Make pixmaps out of default ball data stored in bubbles_default.c */ +{ + int i; + Bubble_Step *pixmap_list = (Bubble_Step *)NULL; + Bubble_Step *newpix, *tmppix; + char **pixpt; + + /* Make sure pixmaps are freed when program is terminated */ + /* This is when I hit ^C */ + if (signal(SIGINT, SIG_IGN) != SIG_IGN) + signal(SIGINT, onintr); + /* xscreensaver sends SIGTERM */ + if (signal(SIGTERM, SIG_IGN) != SIG_IGN) + signal(SIGTERM, onintr); +#ifdef DEBUG + if (signal(SIGSEGV, SIG_IGN) != SIG_IGN) { + printf("Setting signal handler for SIGSEGV\n"); + signal(SIGSEGV, onsegv); + } else { + printf("Didn't set signal hanlder for SIGSEGV\n"); + } +#endif /* DEBUG */ + + for (i = 0; i < num_default_bubbles; i++) { + pixpt = default_bubbles[i]; + newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step)); + make_pixmap_from_default(pixpt, newpix); + /* Now add to list */ + if (pixmap_list == (Bubble_Step *)NULL) { + pixmap_list = newpix; + } else { + tmppix = pixmap_list; + while (tmppix->next != (Bubble_Step *)NULL) + tmppix = tmppix->next; + tmppix->next = newpix; + } + newpix->next = (Bubble_Step *)NULL; + } + + /* Finally construct step_pixmaps[] */ + make_pixmap_array(pixmap_list); +} + +#endif /* NO_DEFAULT_BUBBLE */ + +#endif /* HAVE_XPM */ + +/* + * File I/O stuff + */ + +#ifdef BUBBLES_IO + +static DIR * +my_opendir(char *name) +/* Like opendir() but checks for things so we don't have to do it multiple +times in the code. */ +{ + DIR *rv; + + if (name == (char *)NULL) { + fprintf(stderr, "NULL directory name\n"); + return (DIR *)NULL; + } + + if ((rv = opendir(name)) == NULL) { + perror(name); + return (DIR *)NULL; + } + + return rv; +} + +static int +regular_file(char *name) +/* Check to see if we can use the named file. This was broken under Linux +1.3.45 but seems to be okay under 1.3.54. The parameter "name" was being +trashed if the file didn't exist. Yeah, I know 1.3.x are development +kernels.... +*/ +{ + int fd; + + if ((fd = open(name, O_RDONLY)) == -1) { + perror(name); + return 0; + } else { + close(fd); + return 1; + } +} + +static char * +get_random_name(char *dir) +/* Pick an appropriate file at random out of the files in the directory dir */ +{ + STRUCT_DIRENT *dp; + DIR *dfd; + int numentries = 0; + int entnum; + int x; + char buf[PATH_BUF_SIZE]; + char *rv; + + if ((dfd = my_opendir(dir)) == (DIR *)NULL) + return (char *)NULL; + + while ((dp = readdir(dfd)) != NULL) { + if ((strcmp(DIRENT_NAME, ".") == 0) || (strcmp(DIRENT_NAME, "..") == 0)) + continue; + if ((strlen(dir)+strlen(DIRENT_NAME)+2) > 1024) { + fprintf(stderr, "name %s/%s too long\n", dir, DIRENT_NAME); + continue; + } + if (sprintf(buf, "%s/%s", dir, DIRENT_NAME) > (PATH_BUF_SIZE-1)) { + fprintf(stderr, "path buffer overflowed in get_random_name()\n"); + continue; + } + if (regular_file(buf)) + ++numentries; + } + closedir(dfd); + if (numentries == 0) { + fprintf(stderr, "No suitable files found in %s\n", dir); + return (char *)NULL; + } + entnum = ya_random() % numentries; + x = 0; + + if ((dfd = my_opendir(dir)) == (DIR *)NULL) + return (char *)NULL; + while ((dp = readdir(dfd)) != NULL) { + if ((strcmp(DIRENT_NAME, ".") == 0) || (strcmp(DIRENT_NAME, "..") == 0)) + continue; + if ((strlen(dir)+strlen(DIRENT_NAME)+2) > 1024) { + /* We warned about this previously */ + continue; + } + if (sprintf(buf, "%s/%s", dir, DIRENT_NAME) > (PATH_BUF_SIZE-1)) { + fprintf(stderr, "path buffer overflowed in get_random_name()\n"); + continue; + } + if (regular_file(buf)) { + if (x == entnum) { + rv = (char *)xmalloc(1024 * sizeof(char)); + strcpy(rv, buf); + closedir(dfd); + return rv; + } + ++x; + } + } + /* We've screwed up if we reach here - someone must have deleted all the + files while we were counting them... */ + fprintf(stderr, "get_random_name(): Oops!\n"); + exit(1); +} + +static int +read_line(int fd, char **buf, int bufsize) +/* A line is read from fd until a '\n' is found or EOF is reached. (*buf) +is initially of length bufsize and is extended by bufsize chars if need +be (for as many times as it takes). */ +{ + char x; + int pos = 0; + int size = bufsize; + int rv; + char *newbuf; + + while (1) { + rv = read(fd, &x, 1); + if (rv == -1) { + perror("read_line(): "); + return IO_ERROR; + } else if (rv == 0) { + (*buf)[pos] = '\0'; + return EOF_REACHED; + } else if (x == '\n') { + (*buf)[pos] = '\0'; + return LINE_READ; + } else { + (*buf)[pos++] = x; + if (pos == (size - 1)) { + /* We've come to the end of the space */ + newbuf = (char *)xmalloc((size+bufsize) * sizeof(char)); + strncpy(newbuf, *buf, (size - 1)); + free(*buf); + *buf = newbuf; + size += bufsize; + } + } + } +} + +static int +create_temp_file(char **name) +/* Create a temporary file in /tmp and return a filedescriptor to it */ +{ + int rv; + + if (*name != (char *)NULL) + free(*name); + + if ((*name = tempnam("/tmp", "abxdfes")) == (char *)NULL) { + fprintf(stderr, "Couldn't make new temporary file\n"); + exit(1); + } +/* printf("Temp file created : %s\n", *name); */ + if ((rv = creat(*name, 0644)) == -1) { + fprintf(stderr, "Couldn't open temporary file\n"); + exit(1); + } + + return rv; +} + + +#ifdef BUBBLES_IO +static void +make_pixmap_from_file(char *fname, Bubble_Step *bl) +/* Read the pixmap in file fname into structure bl which must already + be allocated. */ +{ + int result; + XGCValues gcv; + + if (bl == (Bubble_Step *)NULL) { + fprintf(stderr, "NULL pointer passed to make_pixmap()\n"); + exit(1); + } + + bl->xpmattrs.closeness = 40000; + bl->xpmattrs.valuemask = XpmColormap | XpmCloseness; + bl->xpmattrs.colormap = defcmap; + + result = XpmReadFileToPixmap(defdsp, defwin, fname, &bl->ball, + &bl->shape_mask, &bl->xpmattrs); + + switch(result) { + case XpmColorError: + fprintf(stderr, "xpm: color substitution performed\n"); + /* fall through */ + case XpmSuccess: + bl->radius = MAX(bl->xpmattrs.width, bl->xpmattrs.height) / 2; + bl->area = calc_bubble_area(bl->radius); + break; + case XpmColorFailed: + fprintf(stderr, "xpm: color allocation failed\n"); + exit(1); + case XpmNoMemory: + fprintf(stderr, "xpm: out of memory\n"); + exit(1); + default: + fprintf(stderr, "xpm: unknown error code %d\n", result); + exit(1); + } + + gcv.plane_mask = AllPlanes; + gcv.foreground = default_fg_pixel; + gcv.function = GXcopy; + bl->draw_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv); + XSetClipMask(defdsp, bl->draw_gc, bl->shape_mask); + + gcv.foreground = default_bg_pixel; + gcv.function = GXcopy; + bl->erase_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv); + XSetClipMask(defdsp, bl->erase_gc, bl->shape_mask); +} +#endif /* BUBBLES_IO */ + +static void +read_file_to_pixmaps(char *fname) +/* Read the pixmaps contained in the file fname into memory. THESE SHOULD +BE UNCOMPRESSED AND READY TO GO! */ +{ + int fd, tmpfd=0, rv; + int inxpm = 0; + int xpmseen = 0; + char *buf = (char *)NULL; + char *tmpname = (char *)NULL; + Bubble_Step *pixmap_list = (Bubble_Step *)NULL; + Bubble_Step *newpix, *tmppix; + + /* We first create a linked list of pixmaps before allocating + memory for the array */ + + if ((fd = open(fname, O_RDONLY)) == -1) { + fprintf(stderr, "Couldn't open %s\n", fname); + exit(1); + } + + /* Make sure pixmaps are freed when program is terminated */ + /* This is when I hit ^C */ + if (signal(SIGINT, SIG_IGN) != SIG_IGN) + signal(SIGINT, onintr); + /* xscreensaver sends SIGTERM */ + if (signal(SIGTERM, SIG_IGN) != SIG_IGN) + signal(SIGTERM, onintr); +#ifdef DEBUG + if (signal(SIGSEGV, SIGN_IGN) != SIG_IGN) + signal(SIGSEGV, onsegv); +#endif /* DEBUG */ + + while (1) { + if (inxpm == 2) + break; + + buf = (char *)malloc(READ_LINE_BUF_SIZE * sizeof(char)); + + switch ((rv = read_line(fd, &buf, READ_LINE_BUF_SIZE))) { + case IO_ERROR: + fprintf(stderr, "An I/O error occurred\n"); + exit(1); + case EOF_REACHED: + if (inxpm) { + fprintf(stderr, "EOF occurred inside an XPM block\n"); + exit(1); + } else + inxpm = 2; + break; + case LINE_READ: + if (inxpm) { + if (strncmp("};", buf, 2) == 0) { + inxpm = 0; + write(tmpfd, buf, strlen(buf)); + write(tmpfd, "\n", 1); + close(tmpfd); + /* Now process the tmpfile */ + newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step)); + make_pixmap_from_file(tmpname, newpix); + /* Now add to list */ + if (pixmap_list == (Bubble_Step *)NULL) { + pixmap_list = newpix; + } else { + tmppix = pixmap_list; + while (tmppix->next != (Bubble_Step *)NULL) + tmppix = tmppix->next; + tmppix->next = newpix; + } + newpix->next = (Bubble_Step *)NULL; + unlink(tmpname); + } else { + write(tmpfd, buf, strlen(buf)); + write(tmpfd, "\n", 1); + } + } else { + if (strncmp("/* XPM */", buf, 9) == 0) { + tmpfd = create_temp_file(&tmpname); +/* This proves XPM's performance is kinda pathetic */ +#ifdef DEBUG + printf("New XPM detected : %s, fd=%d\n", tmpname, tmpfd); +#endif /* DEBUG */ + inxpm = 1; + xpmseen = 1; + } + write(tmpfd, buf, strlen(buf)); + write(tmpfd, "\n", 1); + } + break; + default: + fprintf(stderr, "read_line returned unknown code %d\n", rv); + exit(1); + } + + free(buf); + } + + close(fd); + if (buf != (char *)NULL) + free(buf); + if (tmpname != (char *)NULL) + free(tmpname); + + if (! xpmseen) { + fprintf(stderr, "There was no XPM data in the file %s\n", fname); + exit(1); + } + + /* Finally construct step_pixmaps[] */ + make_pixmap_array(pixmap_list); +} + +static void +shell_exec(char *command) +/* Forks a shell to execute "command" then waits for command to finish */ +{ + int pid, status, wval; + + switch(pid=fork()) { + case 0: + if (execlp(BOURNESH, BOURNESH, "-c", command, (char *)NULL) == -1) { + fprintf(stderr, "Couldn't exec shell %s\n", BOURNESH); + exit(1); + } + /* fall through if execlp() fails */ + case -1: + /* Couldn't fork */ + perror(progname); + exit(1); + default: + while ((wval = wait(&status)) != pid) + if (wval == -1) { + perror(progname); + exit(1); + } + } +} + +static void +uncompress_file(char *current, char *namebuf) +/* If the file current is compressed (i.e. its name ends in .gz or .Z, +no check is made to see if it is actually a compressed file...) then a +new temporary file is created for it and it is decompressed into there, +returning the name of the file to namebuf, else current is returned in +namebuf */ +{ + int fd; + char *tname = (char *)NULL; + char argbuf[COMMAND_BUF_SIZE]; + + if (((strlen(current) >=4) && + (strncmp(¤t[strlen(current)-3], ".gz", 3) == 0)) || + ((strlen(current) >=3) && + (strncmp(¤t[strlen(current)-2], ".Z", 2) == 0))) { + fd = create_temp_file(&tname); + /* close immediately but don't unlink so we should have a zero length + file in /tmp which we can append to */ + close(fd); + if (sprintf(argbuf, "%s -dc %s > %s", GZIP, current, tname) > + (COMMAND_BUF_SIZE-1)) { + fprintf(stderr, "command buffer overflowed in uncompress_file()\n"); + exit(1); + } + shell_exec(argbuf); + strcpy(namebuf, tname); + } else { + strcpy(namebuf, current); + } + return; +} + +#endif /* BUBBLES_IO */ + +/* + * Main stuff + */ + + +static void +get_resources(Display *dpy, Window window) +/* Get the appropriate X resources and warn about any inconsistencies. */ +{ + Bool nodelay; +#ifdef BUBBLES_IO +#ifdef HAVE_XPM + char *dirname; +#else + char *foo, *bar; +#endif /* HAVE_XPM */ +#endif /* BUBBLES_IO */ + + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + + threed = get_boolean_resource("3D", "Boolean"); + quiet = get_boolean_resource("quiet", "Boolean"); + simple = get_boolean_resource("simple", "Boolean"); + /* Forbid rendered bubbles on monochrome displays */ + if ((mono_p) && (! simple)) { + if (! quiet) + fprintf(stderr, + "Rendered bubbles not supported on monochrome displays\n"); + simple = True; + } + delay = get_integer_resource("delay", "Integer"); + nodelay = get_boolean_resource("nodelay", "Boolean"); + if (nodelay) + delay = 0; + if (delay < 0) + delay = 0; + + default_fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, + cmap); + default_bg_pixel = get_pixel_resource ("background", "Background", dpy, + cmap); + + if (simple) { + /* This is easy */ + broken = get_boolean_resource("broken", "Boolean"); + if (broken) + if (! quiet) + fprintf(stderr, "-broken not available in simple mode\n"); + } else { +#ifndef HAVE_XPM + simple = 1; +#else + broken = get_boolean_resource("broken", "Boolean"); +#ifdef BUBBLES_IO + pixmap_file = get_string_resource("file", "File"); + dirname = get_string_resource("directory", "Directory"); +#ifdef NO_DEFAULT_BUBBLE + /* Must specify -file or -directory if no default bubble compiled in */ + if (strcmp(pixmap_file, "(default)") != 0) { + } else if (strcmp(dirname, "(default)") != 0) { + if ((pixmap_file = get_random_name(dirname)) == (char *)NULL) { + /* Die if we can't open directory - make it consistent with -file + when it fails, rather than falling back to default. */ + exit(1); + } + } else { + fprintf(stderr, + "No default bubble compiled in - use -file or -directory\n"); + exit(1); + } +#else + if (strcmp(pixmap_file, "(default)") != 0) { + } else if (strcmp(dirname, "(default)") != 0) { + if ((pixmap_file = get_random_name(dirname)) == (char *)NULL) { + exit(1); + } + } else { + /* Use default bubble */ + use_default_bubble = 1; + } +#endif /* NO_DEFAULT_BUBBLE */ +#else + use_default_bubble = 1; +#endif /* BUBBLES_IO */ +#endif /* HAVE_XPM */ + } +} + +static void +init_bubbles (Display *dpy, Window window) +{ + XGCValues gcv; + XWindowAttributes xgwa; + int i; +#ifdef BUBBLES_IO + char uncompressed[1024]; +#endif /* BUBBLES_IO */ + + defdsp = dpy; + defwin = window; + + ya_rand_init(0); + + get_resources(dpy, window); + + XGetWindowAttributes (dpy, window, &xgwa); + +#ifdef DEBUG + printf("sizof(int) on this platform is %d\n", sizeof(int)); + printf("sizof(long) on this platform is %d\n", sizeof(long)); +#endif /* DEBUG */ + + screen_width = xgwa.width; + screen_height = xgwa.height; + screen_depth = xgwa.depth; + defcmap = xgwa.colormap; + defvisual = xgwa.visual; + + if (simple) { + /* These are pretty much plucked out of the air */ + bubble_min_radius = (int)(0.006*(double)(MIN(screen_width, + screen_height))); + bubble_max_radius = (int)(0.045*(double)(MIN(screen_width, + screen_height))); + /* Some trivial values */ + if (bubble_min_radius < 1) + bubble_min_radius = 1; + if (bubble_max_radius <= bubble_min_radius) + bubble_max_radius = bubble_min_radius + 1; + + mesh_length = (2 * bubble_max_radius) + 3; + + /* store area of each bubble of certain radius as number of 1/10s of + a pixel area. PI is defined in */ + bubble_areas = (long *)xmalloc((bubble_max_radius + 2) * sizeof(int)); + for (i = 0; i < bubble_min_radius; i++) + bubble_areas[i] = 0; + for (i = bubble_min_radius; i <= (bubble_max_radius+1); i++) + bubble_areas[i] = calc_bubble_area(i); + + mesh_length = (2 * bubble_max_radius) + 3; + } else { +#ifndef HAVE_XPM + fprintf(stderr, + "Bug: simple mode code not set but HAVE_XPM not defined\n"); + exit(1); +#else + /* Make sure all #ifdef sort of things have been taken care of in + get_resources(). */ + if (use_default_bubble) { +#ifdef NO_DEFAULT_BUBBLE + fprintf(stderr, + "Bug: use_default_bubble and NO_DEFAULT_BUBBLE both defined\n"); + exit(1); +#else + default_to_pixmaps(); +#endif /* NO_DEFAULT_BUBBLE */ + + /* Set mesh length */ + mesh_length = (2 * step_pixmaps[num_bubble_pixmaps-1]->radius) + 3; + } else { +#ifdef BUBBLES_IO + if (! regular_file(pixmap_file)) { + /* perror() in regular_file printed error message */ + exit(1); + } + uncompress_file(pixmap_file, uncompressed); + read_file_to_pixmaps(uncompressed); + if (strcmp(pixmap_file, uncompressed)) + unlink(uncompressed); + + mesh_length = (2 * step_pixmaps[num_bubble_pixmaps-1]->radius) + 3; +#else + fprintf(stderr, + "Bug: use_default_bubble is not defined yet I/O is not compiled in\n"); + exit(1); +#endif /* BUBBLES_IO */ + } +#endif /* HAVE_XPM */ + + /* Am I missing something in here??? */ + } + + mesh_width = (screen_width / mesh_length) + 1; + mesh_height = (screen_height / mesh_length) + 1; + mesh_cells = mesh_width * mesh_height; + init_mesh(); + + calculate_adjacent_list(); + + adjust_areas(); + + /* Graphics contexts for simple mode */ + if (simple) { + gcv.foreground = default_fg_pixel; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = default_bg_pixel; + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + } + + XClearWindow (dpy, window); +} + +static void +bubbles (Display *dpy, Window window) +{ + Bubble *tmp; + + tmp = new_bubble(); + add_to_mesh(tmp); + insert_new_bubble(tmp); + + XSync (dpy, True); +} + + +void +screenhack (Display *dpy, Window window) +{ + init_bubbles (dpy, window); + while (1) { + bubbles (dpy, window); + if (delay) + usleep(delay); + } +} + diff --git a/hacks/bubbles.h b/hacks/bubbles.h new file mode 100644 index 00000000..89935f45 --- /dev/null +++ b/hacks/bubbles.h @@ -0,0 +1,214 @@ +/* bubbles.h - definitions for bubbles screensaver */ + +/* $Id: bubbles.h,v 1.2 1997/05/19 03:26:05 jwz Exp $ */ + +#ifndef _BUBBLES_H_ +#define _BUBBLES_H_ + +#ifdef HAVE_XPM +#include +#endif + +/*************************************************************************** + * Options you might like to change to affect the program's behaviour * + ***************************************************************************/ + +/* + * Uncommenting the following will enable support for reading bubbles from + * files (using the -file and -directory options to bubbles). This is + * disabled by default since such operations are inherently non-portable + * and we want the program to compile on as many systems as possible. + * + * If you uncomment this and you figure out how to get it working, please + * let me (J.Macnicol@student.anu.edu.au) know. Diffs against the standard + * distribution would be appreciated. Possible sources of problems are + * dirent and possibly the use of tmpnam(). + */ + +/* #define BUBBLES_IO */ + +/* + * The following only makes sense if BUBBLES_IO above is defined. + * + * Uncomment the following if you always want to use the -file or + * -directory options on the command line and never to use a default bubble + * compiled into the program. This way you would save memory and disk space + * since if you do use -file or -directory only one bubble will be loaded + * into memory at any one time (and remember the default bubble is really + * uncompressed, unlike bubbles in files which can be compressed). This + * is disabled by default only so people running the program for the first + * time with no knowldege of the command line options don't get error + * messages ;) + * + * NOTE: You will still need to have a bubbles_default.c file, else the + * build sequence will fail. Well constructed bubbles_default.c files + * have #ifdef's which simply exclude everything else in the file at + * compile time. The bubblestodefault script does this. + */ + +/* #define NO_DEFAULT_BUBBLE */ + +/* + * This turns on any debugging messages and sanity checks. Hopefully you + * won't need this :) It slows things down a bit, too. + * + * NOTE: If you uncomment this you will get some messages about unused + * functions when you compile. You can ignore these - they refer to + * convenient checking routines which simply aren't called but are left + * in case someone wants to use them. + */ + +/* #define DEBUG */ + +/*************************************************************************** + * Things you might need to change to get things working right * + ***************************************************************************/ + +/* + * Name of the gzip binary. You shouldn't need to change this unless it's + * not in your PATH when the program is run, in which case you will need to + * substitute the full path here. Keep the double quotes else things won't + * compile! + */ + +#define GZIP "gzip" + +/* + * Likewise for the Bourne shell. + */ + +#define BOURNESH "sh" + +/* + * The name of the directory entry structure is different under Linux + * (under which this code is being developed) than other systems. The case + * alternate form here is that given in Kernighan & Ritchie's C book (which + * must be authoratitive, no?) + * + * 04/07/96 : People will have to hack this to get it working on some + * systems. I believe it doesn't work on SGI, for example. + */ + +#ifdef _POSIX_SOURCE +#define STRUCT_DIRENT struct dirent +#else +#define STRUCT_DIRENT Dirent +#endif + +/* + * The naming of fields in struct dirent also seems to differ from system to + * system. This may have to be extended to make things truly portable. + * What we want here is the name field from a dirent struct pointed to + * by "dp". + * + * 04/07/96 : See above. This may need to be changed too. + */ + +#ifdef _POSIX_SOURCE +#define DIRENT_NAME dp->d_name +#else +#define DIRENT_NAME dp->name +#endif + +/* I don't know why this isn't defined. */ +#ifdef linux +/* apparently it is defined in recent linuxes. who knows. */ +/*extern char *tempnam(char *, char *);*/ +#endif + +/**************************************************************************** + * Buffer lengths and things you probably won't need to touch * + ****************************************************************************/ + +/* Maximum length of a full path name we can deal with */ +#define PATH_BUF_SIZE 1024 + +/* Size of string passed to shell as command */ +#define COMMAND_BUF_SIZE 2500 + +/* Size increments for read_line() buffers */ +#define READ_LINE_BUF_SIZE 24 + +/**************************************************************************** + * End of options * + ****************************************************************************/ + +/* Some machines define M_PI and not PI. If they don't define either, use +own own. Really, the accuracy of this is _not_ very important. */ +#ifndef PI +# define PI M_PI +# ifndef M_PI +# define M_PI 3.1415926535 +# endif +#endif + +/* for delete_bubble_in_mesh() */ +#define DELETE_BUBBLE 0 +#define KEEP_BUBBLE 1 + +/* Status codes for read_line */ +#define LINE_READ 0 +#define EOF_REACHED 1 +#define IO_ERROR 2 + +/* + * Magic number for Bubble struct, in case it's trashed when debugging code + * (which happened to me often.... :( + */ + +#define BUBBLE_MAGIC 5674 + +/* Useful macros */ +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define MIN(A, B) ((A) < (B) ? (A) : (B)) + +/* How we represent bubbles */ +struct bub { + int radius; + int step; /* for rendered bubbles */ + long area; + int x; + int y; + int magic; + int cell_index; + int visible; + struct bub *next; + struct bub *prev; +}; + +typedef struct bub Bubble; + +/* + * How we represent pixmaps of rendered bubbles. Because the range of radii + * available may not be continuous, we call each a step (for the lack of a + * better name...) + */ + +#ifdef HAVE_XPM +struct bub_step { + int radius; + long area; + Pixmap ball, shape_mask; + GC draw_gc, erase_gc; + XpmAttributes xpmattrs; + struct bub_step *next; +}; + +typedef struct bub_step Bubble_Step; +#endif /* HAVE_XPM */ + +/* Make sure default bubble isn't compiled when we don't have XPM +Disable file I/O code too. */ +#ifndef HAVE_XPM +# define NO_DEFAULT_BUBBLE +# undef BUBBLES_IO +#endif /* HAVE_XPM */ + +/* Make sure default bubble is compiled in when we have XPM and no file I/O */ +#ifdef HAVE_XPM +# ifndef BUBBLES_IO +# undef NO_DEFAULT_BUBBLE +# endif /* BUBBLES_IO */ +#endif /* HAVE_XPM */ + +#endif /* _BUBBLES_H_ */ diff --git a/local/man/man.1/bubbles.1 b/hacks/bubbles.man similarity index 100% rename from local/man/man.1/bubbles.1 rename to hacks/bubbles.man diff --git a/hacks/bubbles_default.c b/hacks/bubbles_default.c new file mode 100644 index 00000000..172abd1f --- /dev/null +++ b/hacks/bubbles_default.c @@ -0,0 +1,2127 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "bubbles.h" + +#ifndef NO_DEFAULT_BUBBLE + +/* XPM */ +static char *glass1[] = { +/* width height ncolors chars_per_pixel */ +"10 10 61 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #29293F", +"`c c #2C2C63", +"`d c #353579", +"`e c #242447", +"`f c #222245", +"`g c #25253E", +"`h c #1C1C3F", +"`i c #2B2B47", +"`j c #252544", +"`k c #222251", +"`l c #323264", +"`m c #212146", +"`n c #37374B", +"`o c #22223D", +"`p c #252536", +"`q c #232337", +"`r c #34346C", +"`s c #303068", +"`t c #26264A", +"`u c #5D5D97", +"`v c #363674", +"`w c #2C2C6A", +"`x c #2E2E5B", +"`y c #242451", +"`z c #343464", +"a` c #3C3C6F", +"aa c #353572", +"ab c #38386B", +"ac c #242454", +"ad c #181831", +"ae c #28285B", +"af c #37377A", +"ag c #20203F", +"ah c #26265C", +"ai c #4C4C60", +"aj c #383874", +"ak c #333379", +"al c #444458", +"am c #272756", +"an c #32326E", +"ao c #30306C", +"ap c #40407F", +"aq c #292944", +"ar c #212150", +"as c #323271", +"at c #2D2D76", +"au c #21213F", +"av c #25255A", +"aw c #35356D", +"ax c #313169", +"ay c #2C2C6E", +"az c #18182C", +"b` c #232344", +"ba c #292961", +"bb c #202037", +"bc c #1C1C33", +"bd c #242452", +"be c #45456F", +"bf c #242455", +/* pixels */ +"``````aibebebeal````", +"`````n`zaw`ua``l`n``", +"```i`xab`wasaj`r`x`q", +"``auaean`daf`vao`c`t", +"```haxahayatakbaaeb`", +"``adbfav`wapao`sam`m", +"``azagaracaaae`k`fbc", +"````bb`ybd`aar`e`o``", +"```````paq`j`b`g````", +"````````````````````" +}; +/* XPM */ +static char *glass2[] = { +/* width height ncolors chars_per_pixel */ +"12 12 75 2", +/* colors */ +"`` c None", +"`a c #25254C", +"`b c #23234A", +"`c c #212148", +"`d c #2E2E62", +"`e c #29293F", +"`f c #272754", +"`g c #414188", +"`h c #20202C", +"`i c #2E2E68", +"`j c #242447", +"`k c #25253E", +"`l c #B9B9ED", +"`m c #6767A3", +"`n c #2B2B47", +"`o c #29295C", +"`p c #252544", +"`q c #29295F", +"`r c #1F1F3E", +"`s c #2F2F68", +"`t c #2D2D66", +"`u c #30305F", +"`v c #4C4C6D", +"`w c #2B2B53", +"`x c #2F2F6E", +"`y c #34346C", +"`z c #3B3B55", +"a` c #303068", +"aa c #2C2C64", +"ab c #26264A", +"ac c #5D5D97", +"ad c #363674", +"ae c #3C3C66", +"af c #252556", +"ag c #30306E", +"ah c #3E3E54", +"ai c #2C2C6A", +"aj c #4C4C68", +"ak c #20204A", +"al c #2E2E5B", +"am c #343464", +"an c #16162C", +"ao c #292938", +"ap c #333384", +"aq c #3C3C6F", +"ar c #1E1E37", +"as c #38386B", +"at c #242454", +"au c #31316E", +"av c #181831", +"aw c #232349", +"ax c #272739", +"ay c #23234C", +"az c #37377A", +"b` c #1E1E3D", +"ba c #313174", +"bb c #3C3C78", +"bc c #383874", +"bd c #1B1B33", +"be c #40407F", +"bf c #292944", +"bg c #212150", +"bh c #2D2D76", +"bi c #191937", +"bj c #313169", +"bk c #22224D", +"bl c #18182C", +"bm c #2D2D65", +"bn c #232344", +"bo c #292961", +"bp c #27275F", +"bq c #242452", +"br c #484868", +"bs c #262657", +"bt c #242455", +/* pixels */ +"`````````vajajajbr``````", +"````ahaeae`yacasaq`zah``", +"`````w`f`dagacbb`y`u`u``", +"```naybm`i`mbabcaaamawar", +"``bf`ua`adbpaz`gai`ial`j", +"``bnbgbjaz`xbhapboaa`uav", +"``b`aybtbcaube`x`s`tbqbd", +"``anbiakafbb`l`i`q`o`rbl", +"`````rakbkaf`wbsay`c`k``", +"````ao`pay`aatab`bar`h``", +"````````ax`e`n`kax``````", +"````````````````````````" +}; +/* XPM */ +static char *glass3[] = { +/* width height ncolors chars_per_pixel */ +"14 14 90 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #383858", +"`c c #2E2E62", +"`d c #292967", +"`e c #3535A1", +"`f c #272751", +"`g c #23234D", +"`h c #29293F", +"`i c #353579", +"`j c #272754", +"`k c #20202C", +"`l c #2E2E3D", +"`m c #242447", +"`n c #25253E", +"`o c #3E3E67", +"`p c #1C1C3F", +"`q c #6767A3", +"`r c #2B2B47", +"`s c #29295C", +"`t c #2B2B61", +"`u c #29295F", +"`v c #1F1F3E", +"`w c #2F2F68", +"`x c #2D2D66", +"`y c #222251", +"`z c #2D2D69", +"a` c #33335B", +"aa c #37374B", +"ab c #22223D", +"ac c #28285A", +"ad c #2B2B53", +"ae c #2C2C36", +"af c #424266", +"ag c #232337", +"ah c #525265", +"ai c #32326A", +"aj c #1B1B2F", +"ak c #303068", +"al c #232351", +"am c #363674", +"an c #3C3C66", +"ao c #252556", +"ap c #27275B", +"aq c #363663", +"ar c #4C4C68", +"as c #2E2E5B", +"at c #29294C", +"au c #27274A", +"av c #252548", +"aw c #16162C", +"ax c #292938", +"ay c #353572", +"az c #38386B", +"b` c #4C4C85", +"ba c #2F2F83", +"bb c #20203F", +"bc c #313174", +"bd c #333379", +"be c #444458", +"bf c #272756", +"bg c #47477C", +"bh c #32326E", +"bi c #1B1B33", +"bj c #30306C", +"bk c #40407F", +"bl c #23233E", +"bm c #141422", +"bn c #343473", +"bo c #2D2D76", +"bp c #2E2E6D", +"bq c #40406E", +"br c #21213F", +"bs c #8080BA", +"bt c #25255A", +"bu c #1B1B39", +"bv c #35356D", +"bw c #262651", +"bx c #18182C", +"by c #373786", +"bz c #2B2B63", +"c` c #202037", +"ca c #1C1C33", +"cb c #242452", +"cc c #484868", +"cd c #1F1F43", +"ce c #2C2C5D", +"cf c #3535DD", +"cg c #262657", +"ch c #242455", +/* pixels */ +"``````````arccaharcc````````", +"``````bea``obqbqbqanafaa````", +"`````ladaqbv`qbsbgai`ca``b``", +"````a`a`asaib`bhb`bhakasau``", +"``c``j`c`d`dbd`eb`am`wce`aca", +"``bxasaobt`ibdbycf`iay`u`abx", +"``bl`a`t`ubnbdbocfbcbt`cbwbu", +"``bi`fch`sbhbkbabp`z`u`w`gaj", +"``bm`a`a`u`xbjaibgbzcgbf`paw", +"````agbralazap`t`ucbacbbaj``", +"`````kbrcdcbcbcgbw`y`vab`k``", +"``````axbrauatav`r`m`n`n````", +"``````````ax`h`r`nae````````", +"````````````````````````````" +}; +/* XPM */ +static char *glass4[] = { +/* width height ncolors chars_per_pixel */ +"20 20 151 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #29293F", +"`j c #2C2C63", +"`k c #2A2A61", +"`l c #33334C", +"`m c #353579", +"`n c #272754", +"`o c #20202C", +"`p c #2E2E3D", +"`q c #2E2E68", +"`r c #242447", +"`s c #2C2C66", +"`t c #222245", +"`u c #181824", +"`v c #25253E", +"`w c #B9B9ED", +"`x c #1C1C3F", +"`y c #6767A3", +"`z c #2B2B47", +"a` c #272743", +"aa c #222248", +"ab c #292931", +"ac c #29295C", +"ad c #1D1D39", +"ae c #252544", +"af c #2B2B61", +"ag c #29295F", +"ah c #1F1F3E", +"ai c #2F2F68", +"aj c #2D2D66", +"ak c #30305F", +"al c #2C2C5B", +"am c #11111C", +"an c #262655", +"ao c #31316D", +"ap c #4C4C6D", +"aq c #222251", +"ar c #323264", +"as c #43436E", +"at c #212146", +"au c #37374B", +"av c #22223D", +"aw c #252536", +"ax c #1D1D42", +"ay c #2A2A5C", +"az c #28285A", +"b` c #2B2B53", +"ba c #333372", +"bb c #2F2F6E", +"bc c #2B2B3F", +"bd c #2C2C36", +"be c #232337", +"bf c #34346C", +"bg c #525265", +"bh c #32326A", +"bi c #303068", +"bj c #21214C", +"bk c #2C2C64", +"bl c #292957", +"bm c #232351", +"bn c #26264A", +"bo c #2F2F60", +"bp c #5D5D97", +"bq c #363674", +"br c #3C3C66", +"bs c #252556", +"bt c #30306E", +"bu c #414178", +"bv c #2C2C6A", +"bw c #20204A", +"bx c #2E2E5B", +"by c #29294C", +"bz c #242451", +"c` c #27274A", +"ca c #343464", +"cb c #4F4F64", +"cc c #252548", +"cd c #292938", +"ce c #333384", +"cf c #3C3C6F", +"cg c #353572", +"ch c #1E1E37", +"ci c #38386B", +"cj c #414156", +"ck c #242454", +"cl c #181831", +"cm c #232349", +"cn c #272739", +"co c #4C4C85", +"cp c #2F2F83", +"cq c #28285B", +"cr c #36366C", +"cs c #48486D", +"ct c #23234C", +"cu c #37377A", +"cv c #20203F", +"cw c #26265C", +"cx c #313174", +"cy c #4C4C60", +"cz c #27273F", +"d` c #3C3C78", +"da c #48485C", +"db c #383874", +"dc c #333379", +"dd c #444458", +"de c #272756", +"df c #32326E", +"dg c #1B1B33", +"dh c #1E1E2C", +"di c #30306C", +"dj c #40407F", +"dk c #292944", +"dl c #212150", +"dm c #141422", +"dn c #323271", +"do c #2D2D76", +"dp c #2E2E6D", +"dq c #21213F", +"dr c #8080BA", +"ds c #23232D", +"dt c #25255A", +"du c #35356D", +"dv c #191937", +"dw c #262651", +"dx c #313169", +"dy c #2C2C6E", +"dz c #22224D", +"e` c #18182C", +"ea c #373786", +"eb c #232344", +"ec c #2B2B63", +"ed c #292961", +"ee c #202037", +"ef c #1C1C33", +"eg c #242452", +"eh c #45456F", +"ei c #535380", +"ej c #1F1F43", +"ek c #2C2C5D", +"el c #3535DD", +"em c #262657", +"en c #393963", +"eo c #242455", +/* pixels */ +"``````````````cycyapbgcbcybg````````````", +"``````````dacycsehcsehapehcsddcj````````", +"````````au`cenbraseicibucicibrendd``````", +"``````auau`ccacidudrbpdrcfcrarakau`p````", +"`````p`lbx`nbhbfdxcobpcodjdu`sakalb`bd``", +"`````zbybxbocicgbvbbdn`ydbdfbfekbxbybe``", +"``dh`r`rbl`faidydndn`hd`dnbtecafakdwah`o", +"``dhdqejcqajdfcg`meacu`hbqdfdibi`jblbndh", +"``ch`rbxemaidudnbq`geldcbqdbdn`jafbxbnav", +"``dm`x`bdxdxcwbqdycpdocxdcbvedbkcqalebdg", +"```uccctdzbsag`qbqdpeacxbtaidiagekdwcvdm", +"``dmcl`xeoandtdfbv`wdjcediecbiaydectatch", +"``amdvcm`xaf`kagaodi`qdbbaecanazejdvdv`u", +"````e``xcvandlcqckdtcgagcq`qaqay`tbjef``", +"````dsclaxbwdzdebsckb`acegbjeg`eaaadds``", +"``````eeeeejbzanegdw`abmdl`b`rcnavaw````", +"````````eeczbc`b`dby`dbya``eae`iaw``````", +"``````````bdawa`dkc`aeae`i`i`vab````````", +"``````````````bd`pcdcdbdcdbd````````````", +"````````````````````````````````````````" +}; +/* XPM */ +static char *glass5[] = { +/* width height ncolors chars_per_pixel */ +"24 24 164 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #272754", +"`p c #414188", +"`q c #20202C", +"`r c #2E2E3D", +"`s c #1C1C28", +"`t c #2E2E68", +"`u c #242447", +"`v c #2C2C66", +"`w c #181824", +"`x c #25253E", +"`y c #161622", +"`z c #B9B9ED", +"a` c #3E3E67", +"aa c #1C1C3F", +"ab c #6767A3", +"ac c #2B2B47", +"ad c #222248", +"ae c #292931", +"af c #29295C", +"ag c #252544", +"ah c #1E1E47", +"ai c #2B2B61", +"aj c #29295F", +"ak c #1F1F3E", +"al c #2F2F68", +"am c #2D2D66", +"an c #30305F", +"ao c #2C2C5B", +"ap c #11111C", +"aq c #262655", +"ar c #31316D", +"as c #4C4C6D", +"at c #323264", +"au c #2D2D69", +"av c #33335B", +"aw c #212146", +"ax c #37374B", +"ay c #22223D", +"az c #252536", +"b` c #1D1D42", +"ba c #28285A", +"bb c #2B2B53", +"bc c #333372", +"bd c #2F2F6E", +"be c #2C2C36", +"bf c #424266", +"bg c #232337", +"bh c #2F2FB0", +"bi c #34346C", +"bj c #525265", +"bk c #32326A", +"bl c #1B1B2F", +"bm c #3B3B55", +"bn c #303068", +"bo c #21214C", +"bp c #2C2C64", +"bq c #292957", +"br c #26264A", +"bs c #202044", +"bt c #5D5D97", +"bu c #2B2B5C", +"bv c #363674", +"bw c #3C3C66", +"bx c #252556", +"by c #30306E", +"bz c #3E3E54", +"c` c #2C2C6A", +"ca c #25252E", +"cb c #27275B", +"cc c #363663", +"cd c #4C4C68", +"ce c #20204A", +"cf c #2E2E5B", +"cg c #29294C", +"ch c #242451", +"ci c #27274A", +"cj c #343464", +"ck c #252548", +"cl c #16162C", +"cm c #292938", +"cn c #333384", +"co c #3C3C6F", +"cp c #353572", +"cq c #1E1E37", +"cr c #38386B", +"cs c #414156", +"ct c #242454", +"cu c #31316E", +"cv c #181831", +"cw c #232349", +"cx c #272739", +"cy c #4C4C85", +"cz c #2F2F83", +"d` c #28285B", +"da c #292952", +"db c #48486D", +"dc c #23234C", +"dd c #37377A", +"de c #1E1E3D", +"df c #26265C", +"dg c #313174", +"dh c #4C4C60", +"di c #27273F", +"dj c #3C3C78", +"dk c #48485C", +"dl c white", +"dm c #383874", +"dn c #333379", +"do c #444458", +"dp c #272756", +"dq c #1B1B33", +"dr c #1E1E2C", +"ds c #30306C", +"dt c #40407F", +"du c #292944", +"dv c #212150", +"dw c #23233E", +"dx c #343473", +"dy c #323271", +"dz c #2D2D76", +"e` c #2E2E6D", +"ea c #40406E", +"eb c #21213F", +"ec c #8080BA", +"ed c #23232D", +"ee c #25255A", +"ef c #35356D", +"eg c #191937", +"eh c #262651", +"ei c #313169", +"ej c #2C2C6E", +"ek c #22224D", +"el c #18182C", +"em c #373786", +"en c #2D2D65", +"eo c #232344", +"ep c #2B2B63", +"eq c #292961", +"er c #27275F", +"es c #1C1C33", +"et c #242452", +"eu c #45456F", +"ev c #484868", +"ew c #1F1F43", +"ex c #2C2C5D", +"ey c #3535DD", +"ez c #262657", +"f` c #393963", +"fa c #242455", +/* pixels */ +"``````````````````dkdhbjbjbjbjdh````````````````", +"``````````````csasascdevcdascddbevdh````````````", +"``````````dodobfa`dbeubfeueueacrbfbfcsax````````", +"````````bzcsbwf`bwcrbicobteccratcof`bmbzbz``````", +"```````n`navavanefcjbibt`zcrcobicratccf``nax````", +"``````acbbao`oat`fambycobtdldjbkbialan`can`n````", +"````dicg`icj`fbi`fefdyauarabbybiefbnaicfbbcg`x``", +"````ac`udcbqenbk`tdyabczdgdxdmdtbpcpcjeicwcgcq``", +"```wdq`acfaiefcpe`bydn`hcyeydmc`ambcef`fcf`u`y`s", +"```ydudaandfbnaubvdgerbhdd`h`pdyc`cu`tezcf`b`ubl", +"``elad`abqezbndmdsbccncnczeydnbvdmdxamep`fcgcv`w", +"```weoetdv`leidfdd`gbddzdzdncncneqeebpexan`ucvap", +"``elcwdaexehd`epaubd`hdz`hcz`gdycucueeba`oekcl`w", +"``eldebsdcbxfaeedmejcuemdtcnbdbyalafambuet`bdq`w", +"```yclakboce`fbx`mcper`veccyauei`mbncbaqdpdaesap", +"````clakegbsceetbxdsdjdt`zbt`tctajdvafahakayel``", +"````eldqdeebetboenepetezbnbxencb`lbaeteoaabldr``", +"``````blakb`ceetekambxctbbafezctdcbo`eew`xcq````", +"``````ed`qakbsawekchchchetd``jboceaddwcxesed````", +"````````cmazag`xdcek`bchctetbrci`deocqbg`q``````", +"```````````qbgayckaybr`uacek`beo`x`xazca````````", +"``````````````aecxdi`kagacag`xcxcxcm````````````", +"``````````````````ca`rcmbebebeae````````````````", +"````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass6[] = { +/* width height ncolors chars_per_pixel */ +"30 30 181 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #3535A1", +"`h c #23234D", +"`i c #29293F", +"`j c #2C2C63", +"`k c #2A2A61", +"`l c #33334C", +"`m c #353579", +"`n c #272754", +"`o c #20202C", +"`p c #2E2E3D", +"`q c #1C1C28", +"`r c #2E2E68", +"`s c #242447", +"`t c #2C2C66", +"`u c #222245", +"`v c #181824", +"`w c #25253E", +"`x c #161622", +"`y c #B9B9ED", +"`z c #3E3E67", +"a` c #1C1C3F", +"aa c #6767A3", +"ab c #2B2B47", +"ac c #272743", +"ad c #292931", +"ae c #29295C", +"af c #1D1D39", +"ag c #252544", +"ah c #1E1E47", +"ai c #2B2B61", +"aj c #29295F", +"ak c #1F1F3E", +"al c #2F2F68", +"am c #2D2D66", +"an c #30305F", +"ao c #2C2C5B", +"ap c #11111C", +"aq c #262655", +"ar c #31316D", +"as c #4C4C6D", +"at c #222251", +"au c #323264", +"av c #2D2D69", +"aw c #33335B", +"ax c #43436E", +"ay c #2B2B67", +"az c #212146", +"b` c #37374B", +"ba c #22223D", +"bb c #252536", +"bc c #1D1D42", +"bd c #28285A", +"be c #2B2B53", +"bf c #333372", +"bg c #2F2F6E", +"bh c #2C2C36", +"bi c #424266", +"bj c #232337", +"bk c #2F2FB0", +"bl c #34346C", +"bm c #525265", +"bn c #32326A", +"bo c #1B1B2F", +"bp c #3B3B55", +"bq c #303068", +"br c #21214C", +"bs c #2C2C64", +"bt c #292957", +"bu c #232351", +"bv c #26264A", +"bw c #2F2F60", +"bx c #202044", +"by c #5D5D97", +"bz c #2B2B5C", +"c` c #363674", +"ca c #3C3C66", +"cb c #252556", +"cc c #30306E", +"cd c #3E3E54", +"ce c #414178", +"cf c #2C2C6A", +"cg c #2F2F4F", +"ch c #25252E", +"ci c #27275B", +"cj c #363663", +"ck c #4C4C68", +"cl c #20204A", +"cm c #2E2E5B", +"cn c #29294C", +"co c #242451", +"cp c #27274A", +"cq c #343464", +"cr c #4F4F64", +"cs c #252548", +"ct c #16162C", +"cu c #292938", +"cv c #333384", +"cw c #3C3C6F", +"cx c #353572", +"cy c #1E1E37", +"cz c #38386B", +"d` c #414156", +"da c #242454", +"db c #31316E", +"dc c #181831", +"dd c #232349", +"de c #272739", +"df c #393979", +"dg c #4C4C85", +"dh c #2F2F83", +"di c #28285B", +"dj c #292952", +"dk c #36366C", +"dl c #48486D", +"dm c #23234C", +"dn c #37377A", +"do c #20203F", +"dp c #1E1E3D", +"dq c #26265C", +"dr c #313174", +"ds c #4C4C60", +"dt c #27273F", +"du c #3C3C78", +"dv c #48485C", +"dw c white", +"dx c #383874", +"dy c #333379", +"dz c #444458", +"e` c #272756", +"ea c #47477C", +"eb c #32326E", +"ec c #1E1E2C", +"ed c #30306C", +"ee c #40407F", +"ef c #292944", +"eg c #212150", +"eh c #23233E", +"ei c #141422", +"ej c #343473", +"ek c #323271", +"el c #2D2D76", +"em c #2E2E6D", +"en c #40406E", +"eo c #21213F", +"ep c #272731", +"eq c #8080BA", +"er c #23232D", +"es c #25255A", +"et c #1B1B39", +"eu c #35356D", +"ev c #191937", +"ew c #262651", +"ex c #313169", +"ey c #2C2C6E", +"ez c #22224D", +"f` c #18182C", +"fa c #373786", +"fb c #2D2D65", +"fc c #232344", +"fd c #2B2B63", +"fe c #292961", +"ff c #27275F", +"fg c #202037", +"fh c #1C1C33", +"fi c #242452", +"fj c #45456F", +"fk c #484868", +"fl c #535380", +"fm c #1F1F43", +"fn c #2C2C5D", +"fo c #353573", +"fp c #262657", +"fq c #393963", +"fr c #242455", +/* pixels */ +"````````````````````````bmbmbmbmbmbmbm``````````````````````", +"``````````````````dscrasasascrckasasasfkckbm````````````````", +"````````````````dsdsdzbifjfjfjfjaxaxfjfjckdzdv``````````````", +"````````````d`dvfqdzenfkfjencaendlaxaxcabibi`zdvb```````````", +"``````````cd`zaw`cfqcacaceflczbydg`zencjcwca`cbpbpcd````````", +"````````d`cdb``cawcqczdkeubycwbyczdwcwczcqaucaawb`b`b```````", +"````````b``lcmcqaoczaublbndgeqdfeqczdgbn`jcmanfnawcg`l``````", +"``````cu`w`wcmcmcqblardxeu`yceareqdueualbleuexdjcmbeba`p````", +"````chabcg`acmbwbqczaiebcfdfdgekeqdudxebcxblbncmcm`ababjer``", +"`````o`aeodmaobdalbn`rcfdf`mdhdrdyeaejdubscxffbwbwdd`b`w`q``", +"````fhbadjcmbq`jcxcxekemeydr`gdy`geeekek`t`rexe`e``ndjdcdc``", +"```q`veocnbtdialbleb`rfo`medfadnelbkc`bffeedeufn`jcmfmbvfg`x", +"``ecbo`sbze`feaeayexavbgej`gbkdyeydhdudnemdbfdal`kfna``udc`v", +"```xeieodjbtfpexfbc`avekbg`gbkelfa`g`gdxcxcfdxamfpbtcpfcdoap", +"```vcya`btegex`kbldqdncfeycvdyelcv`gdycvfefeebaedianfmfcdc`q", +"``fhcyetahfncobdbs`tbncfdybgcf`gdhcfavavav`tfraifnbtbteteoei", +"```xdpaz`bbtcl`fesfbedfdekelbkdhaaavbgcf`jfe`fesbwez`bbxdcei", +"```xfhdcbx`hfratbresfdedcfee`meedffded`t`tbqdiaee``nazazdcap", +"`````vdp`sew`bbqaifpfpdbbsccdxdfekbyee`j`jdialbzfidmazafct``", +"`````vbodpevbcaqbdatcb`tfdamar`ydg`taicbaje`dadaahaketevbo``", +"`````qf`bjakdobdezegfbaidacibncxdgbddiajalatfibz`ubccyfh`q``", +"``````chbjbcbcfmbdaediatcbfpfpajfpdaesfpbudmco`h`eewfhf`````", +"`````````ocydp`waz`e`baqfiesfpdjfpfiaidacpewah`wafdpbb``````", +"````````chfgfgfmddcofibdfi`bfi`ada`hegbu`h`seodtbafhec``````", +"``````````cuepdo`wefdmfidd`b`hdae``bbvcn`dagakbabj`o````````", +"````````````erbbdeefcsefcpabezcp`habef`sbx`wehbber``````````", +"````````````````chbbba`ief`iacagabef`i`wba`wcu``````````````", +"``````````````````chbb`p`p`w`w`pcu`p`icucuch````````````````", +"````````````````````````adadcudeepadbh``````````````````````", +"````````````````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass7[] = { +/* width height ncolors chars_per_pixel */ +"36 36 187 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #353579", +"`p c #272754", +"`q c #414188", +"`r c #20202C", +"`s c #2E2E3D", +"`t c #1C1C28", +"`u c #2E2E68", +"`v c #242447", +"`w c #2C2C66", +"`x c #222245", +"`y c #181824", +"`z c #25253E", +"a` c #161622", +"aa c #B9B9ED", +"ab c #3E3E67", +"ac c #1C1C3F", +"ad c #6767A3", +"ae c #2B2B47", +"af c #272743", +"ag c #222248", +"ah c #292931", +"ai c #29295C", +"aj c #1D1D39", +"ak c #252544", +"al c #1E1E47", +"am c #2B2B61", +"an c #29295F", +"ao c #1F1F3E", +"ap c #2F2F68", +"aq c #2D2D66", +"ar c #30305F", +"as c #2C2C5B", +"at c #11111C", +"au c #262655", +"av c #31316D", +"aw c #4C4C6D", +"ax c #222251", +"ay c #323264", +"az c #2D2D69", +"b` c #33335B", +"ba c #43436E", +"bb c #2B2B67", +"bc c #212146", +"bd c #37374B", +"be c #22223D", +"bf c #252536", +"bg c #1D1D42", +"bh c #2A2A5C", +"bi c #28285A", +"bj c #2B2B53", +"bk c #333372", +"bl c #2F2F6E", +"bm c #2B2B3F", +"bn c #2C2C36", +"bo c #424266", +"bp c #232337", +"bq c #2F2FB0", +"br c #34346C", +"bs c #525265", +"bt c #32326A", +"bu c #1B1B2F", +"bv c #3B3B55", +"bw c #303068", +"bx c #21214C", +"by c #2C2C64", +"bz c #292957", +"c` c #232351", +"ca c #26264A", +"cb c #2F2F60", +"cc c #202044", +"cd c #5D5D97", +"ce c #2B2B5C", +"cf c #363674", +"cg c #3C3C66", +"ch c #252556", +"ci c #30306E", +"cj c #3E3E54", +"ck c #414178", +"cl c #2C2C6A", +"cm c #2F2F4F", +"cn c #25252E", +"co c #27275B", +"cp c #363663", +"cq c #4C4C68", +"cr c #20204A", +"cs c #2E2E5B", +"ct c #29294C", +"cu c #242451", +"cv c #27274A", +"cw c #343464", +"cx c #4F4F64", +"cy c #252548", +"cz c #16162C", +"d` c #292938", +"da c #333384", +"db c #3C3C6F", +"dc c #353572", +"dd c #1E1E37", +"de c #38386B", +"df c #414156", +"dg c #242454", +"dh c #31316E", +"di c #181831", +"dj c #232349", +"dk c #272739", +"dl c #393979", +"dm c #4C4C85", +"dn c #2F2F83", +"do c #28285B", +"dp c #292952", +"dq c #48486D", +"dr c #23234C", +"ds c #37377A", +"dt c #1E1E3D", +"du c #26265C", +"dv c #313174", +"dw c #4C4C60", +"dx c #27273F", +"dy c #3C3C78", +"dz c #48485C", +"e` c white", +"ea c #383874", +"eb c #333379", +"ec c #444458", +"ed c #272756", +"ee c #47477C", +"ef c #32326E", +"eg c #1B1B33", +"eh c #1E1E2C", +"ei c #30306C", +"ej c #40407F", +"ek c #292944", +"el c #212150", +"em c #23233E", +"en c #141422", +"eo c #343473", +"ep c #323271", +"eq c #2D2D76", +"er c #2E2E6D", +"es c #40406E", +"et c #21213F", +"eu c #272731", +"ev c #8080BA", +"ew c #23232D", +"ex c #25255A", +"ey c #1B1B39", +"ez c #35356D", +"f` c #191937", +"fa c #262651", +"fb c #313169", +"fc c #2C2C6E", +"fd c #22224D", +"fe c #18182C", +"ff c #373786", +"fg c #2D2D65", +"fh c #232344", +"fi c #2B2B63", +"fj c #292961", +"fk c #27275F", +"fl c #202037", +"fm c #1C1C33", +"fn c #242452", +"fo c #45456F", +"fp c #484868", +"fq c #535380", +"fr c #1F1F43", +"fs c #2C2C5D", +"ft c #3535DD", +"fu c #353573", +"fv c #262657", +"fw c #393963", +"fx c #242455", +/* pixels */ +"````````````````````````````````bsbsbsdwbs``````````````````````````````", +"````````````````````````dwbsdwcqcxbscqdwcqcxdzcxbs``````````````````````", +"````````````````````fpcxawcqawcqawawcqawfocqcqawfpcqcx``````````````````", +"``````````````````ececfpfpbofodqdqdqesbababadqfobafpeccj````````````````", +"``````````````dfeccjabcgesbobaabadcgabbaeefobaesbob`cgdfcjcj````````````", +"````````````cjdfbvcgfwfwcgcgesbrevdbcdeeesdedbfwdbcgcpbvbvdfcj``````````", +"``````````bdbvbvcg`ccpcwdecwayckcdeecddydcbrezdecpayfwb`ar`ncjbd````````", +"```````````saecmcscpcscwbwaqayeaevfqdyckbtdefbcpeicscbcscpb`cmae````````", +"`````````scvbjcmar`pcsfb`fbt`fcidmdecdcdefdyezaqbraz`farasasarek`s``````", +"``````bnaecmdjayb`fscsbwaqfbbwdyaacddheacdfudbfbbrbtfbaqbzcsdpafcmcn````", +"```````s`zbj`basfs`fbr`f`wdcepeqcfcdfue`dmdvcdbkbkbrfb`fbwbjcaaect`z````", +"`````taeaoccdrcsfdfgbwbr`ubb`oadebdndvebe`eadsejbyavfgcwbtcsdjbjaeddbf``", +"````eudidjbzdp`pbzbwbbefeperfjdabldadada`qcfdveofi`wfb`fay`ped`aeteg`k``", +"`````yflfadpcsfs`lbrdcav`wcfeoepdsda`qbqebdydsepfiaveabwbz`maybc`abufe``", +"````fmek`aararaiambwbyefcfcfbqfkeqejds`gft`qeofuclfkbw`ubibtcs`bcv`vfe``", +"```ydi`v`xdpbzamaxaqfkavererbkfffcfc`hdaeqdscffudcclbkfgapanayaodpczeg`t", +"``atbpao`adpbzdo`mfgbtepereperfcbqft`g`hffbqbkdlfucleiaqfbdg`bctfrfmfea`", +"```yetfh`xdpelfbfsfbaz`mdsci`gblffdneqftebda`hdafjfjfgbybwdgardr`xdia`at", +"``ateheycccredfsaxfgcibbeffjejdafc`g`heqblfjepclazazap`wfscbbz`jacfrflat", +"``atczey`v`afsacfsdgco`lbb`gebffereqft`qffdaer`wfgfifififjbzcu`i`adda`at", +"````a`dtcy`xdrcrexfxfvfgeabkbbdhffadejdndnblclepapdubhaqfvcefn`xdtegfe``", +"````a`dieybxfnbx`jfsfxfkfgfgdheoev`qdncdfcdlfjfi`wfiapcuchaubzaceydiat``", +"````atdifr`abz`bbzbranaifneifufidyckejepckffepfibyaianancu`bbgbgagegen``", +"````atczegeyf`bgascrcrelchanefdyfieaaa`qaq`uexduanbhfxaicecraoemajfea```", +"```````tfebedtccaled`dcoaqdoamdeaiandydyaifi`mfbaqfdfnbh`pagfrddfmfe````", +"```````t`reydidjagbzaxchanfnaianchch`lbhcoaichauc`chdoelbgbgbcegfm`r````", +"`````````reyaoacetcrfn`afd`ffvchc`fvbjaianfvco`bdrdgbz`e`vbe`zeyeg``````", +"```````````regacem`vccfnbxc`cu`jbifnfvcoc`bi`ich`adjac`xflajemew````````", +"``````````ewbpbpdtaobcbc`jchbic``ac``afafafnfd`jfncybcdxdkbedd`r````````", +"````````````d`ddbeakfh`kdrfd`b`b`jcudged`bcacvct`dcyccddewd``r``````````", +"``````````````eubndddxdxakaecvcaae`ecaagaecvafcabcfhbp`keucn````````````", +"``````````````````d`flem`z`s`v`kbc`bekaeagaeetafekd`bmbf````````````````", +"`````````````````````s`zdk`zae`kdxakaeekek`zekbfdkd`bn``````````````````", +"````````````````````````bnbmd`dkdk`sbndxd`bmbfbnah``````````````````````", +"````````````````````````````````cnbneu`sah``````````````````````````````", +"````````````````````````````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass8[] = { +/* width height ncolors chars_per_pixel */ +"44 44 189 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #353579", +"`p c #272754", +"`q c #414188", +"`r c #20202C", +"`s c #2E2E3D", +"`t c #1C1C28", +"`u c #2E2E68", +"`v c #242447", +"`w c #2C2C66", +"`x c #222245", +"`y c #181824", +"`z c #25253E", +"a` c #161622", +"aa c #B9B9ED", +"ab c #3E3E67", +"ac c #1C1C3F", +"ad c #6767A3", +"ae c #2B2B47", +"af c #272743", +"ag c #222248", +"ah c #292931", +"ai c #29295C", +"aj c #1D1D39", +"ak c #252544", +"al c #1E1E47", +"am c #2B2B61", +"an c #29295F", +"ao c #1F1F3E", +"ap c #2F2F68", +"aq c #2D2D66", +"ar c #30305F", +"as c #2C2C5B", +"at c #11111C", +"au c #262655", +"av c #31316D", +"aw c #4C4C6D", +"ax c #222251", +"ay c #323264", +"az c #2D2D69", +"b` c #33335B", +"ba c #43436E", +"bb c #2B2B67", +"bc c #212146", +"bd c #37374B", +"be c #22223D", +"bf c #252536", +"bg c #1D1D42", +"bh c #2A2A5C", +"bi c #28285A", +"bj c #2B2B53", +"bk c #333372", +"bl c #2F2F6E", +"bm c #2B2B3F", +"bn c #2C2C36", +"bo c #424266", +"bp c #232337", +"bq c #2F2FB0", +"br c #34346C", +"bs c #525265", +"bt c #32326A", +"bu c #1B1B2F", +"bv c #3B3B55", +"bw c #303068", +"bx c #21214C", +"by c #2C2C64", +"bz c #292957", +"c` c #232351", +"ca c #26264A", +"cb c #2F2F60", +"cc c #202044", +"cd c #5D5D97", +"ce c #2B2B5C", +"cf c #363674", +"cg c #3C3C66", +"ch c #252556", +"ci c #30306E", +"cj c #3E3E54", +"ck c #414178", +"cl c #2C2C6A", +"cm c #2F2F4F", +"cn c #25252E", +"co c #27275B", +"cp c #363663", +"cq c #4C4C68", +"cr c #20204A", +"cs c #2E2E5B", +"ct c #29294C", +"cu c #242451", +"cv c #27274A", +"cw c #343464", +"cx c #4F4F64", +"cy c #252548", +"cz c #16162C", +"d` c #292938", +"da c #333384", +"db c #3C3C6F", +"dc c #353572", +"dd c #1E1E37", +"de c #38386B", +"df c #414156", +"dg c #242454", +"dh c #31316E", +"di c #181831", +"dj c #232349", +"dk c #272739", +"dl c #393979", +"dm c #4C4C85", +"dn c #2F2F83", +"do c #28285B", +"dp c #292952", +"dq c #36366C", +"dr c #48486D", +"ds c #23234C", +"dt c #37377A", +"du c #20203F", +"dv c #1E1E3D", +"dw c #26265C", +"dx c #313174", +"dy c #4C4C60", +"dz c #27273F", +"e` c #3C3C78", +"ea c #48485C", +"eb c white", +"ec c #383874", +"ed c #333379", +"ee c #444458", +"ef c #272756", +"eg c #47477C", +"eh c #32326E", +"ei c #1B1B33", +"ej c #1E1E2C", +"ek c #30306C", +"el c #40407F", +"em c #292944", +"en c #212150", +"eo c #23233E", +"ep c #141422", +"eq c #343473", +"er c #323271", +"es c #2D2D76", +"et c #2E2E6D", +"eu c #40406E", +"ev c #21213F", +"ew c #272731", +"ex c #8080BA", +"ey c #23232D", +"ez c #25255A", +"f` c #1B1B39", +"fa c #35356D", +"fb c #191937", +"fc c #262651", +"fd c #313169", +"fe c #2C2C6E", +"ff c #22224D", +"fg c #18182C", +"fh c #373786", +"fi c #2D2D65", +"fj c #232344", +"fk c #2B2B63", +"fl c #292961", +"fm c #27275F", +"fn c #202037", +"fo c #1C1C33", +"fp c #242452", +"fq c #45456F", +"fr c #484868", +"fs c #535380", +"ft c #1F1F43", +"fu c #2C2C5D", +"fv c #3535DD", +"fw c #353573", +"fx c #262657", +"fy c #393963", +"fz c #242455", +/* pixels */ +"````````````````````````````````````````````bs``````````````````````````````````````````", +"````````````````````````````````dybseabsawbsbscxawcxbsdybs``````````````````````````````", +"````````````````````````````eedycqcqcqdrcxawcqawawawawfrfrcxcq``````````````````````````", +"````````````````````````eadyfrdybafrfqawawfqdrawawfrfrdrawcqeaeeee``````````````````````", +"````````````````````eeeebofrboawbofqdrbadrfqeufqfqbababafqfrbobobocjee``````````````````", +"``````````````````dfeebvfybvcgbaboeueueueuababfqdefqegeuabeufybocgdfeacj````````````````", +"````````````````bvbo`nfydffybocgcgdedbegfsfqeuegexeudbdqdedbdeabfybvcjdfcj``````````````", +"``````````````bdcjbvfyfyb`defyfydedbckexexebckdmaqdbdbdbayaydeaycpbvab`ccjbd````````````", +"`````````````s`ccjb`b`b`b`ardededeaydcexadckaddbdbaadqdqbrbtbrayb`cpb``c`ccm`n``````````", +"```````````n`n`ncmcsb`cpascpegfi`ucwbrcdcdebehaddbbrdmfaayaqcbb`arcscs`ccmb`ae`s````````", +"``````````aeafcmaeasfu`paraycbbtfd`lavecckegcdcdaaec`qfa`ufa`f`ubwarbzb`cscs`kbm````````", +"````````ewaectfjbzcsb`arcwbtdcapec`fdcaadmcd`ueqaddmekecav`fapbtecbwdparbjcmaoct`n``````", +"````````bddzcmbjdparcscb`fdbfdfidcdlcieqbbdlciebexeletegbwbk`ubtbwfufucsdpcm`zctbm``````", +"```````ycmdjdpctauaramefcsbwapehekereddleledcfdmdmdmerelecaqaqbrehcbbzarfc`vbjcyem`r````", +"``````bpaobefjccbzasenbw`ufafdblcl`oeldldnbqededdtcdbkdldlet`lekamcbbw`fbjauctdp`zfn````", +"`````yfoaj`bbzeodsfibhbrekavcfcletfldneddxeddadtdadmbkerercleh`ubwbwcbbzarbhdpfjdiei`t``", +"````atfoemfcdpbzasfi`ffadcekbkazeqerbkerdadtdmfhbqdldleddxfkfdapdcfdfcam`pbz`e`ifoepa```", +"````a`dd`v`bbzbjefdw`lbwbtehdceccf`hfeerbqfhedesbqfvdlcifwcifldhbrficbficsefcc`v`xajbp``", +"````fnfgeo`vfubzbwdwco`ufm`m`ucfbler`ofh`hfveddndnbqdldldtcffmbkbwapbwaiefaybgctczfgei``", +"`````yczacaodpbjayfxcobwapbkehdhblerdtdnfe`hbqfhbqfedtcfeqecaqeqbwfiapanbhbr`zdjbcaofo``", +"````atczf``bbzbzbhax`laqbwaqdhciblfeclfhfhdafmbqdabqdacidldtdhflcf`wby`fauef`vccakev`y``", +"``ata`fnagccbzenbhfiaifdehezdhdlet`geteddnbqesfvedbqesdndabbfmfmbtbyamfufuasbcccdidiepat", +"````fgfgao`dbg`e`falcobwfkfmdh`o`gcidnesdn`gdabqed`geteretblekazfk`u`fdocb`j`abgf`ev`y``", +"`````yeicv`v`b`pamfcbhfxfidwetazazdx`q`heted`qfveder`get`wciekehchcodgbhffefeffcczbu`y``", +"````epdvfjfj`acubzenanbifxbyaqci`w`gereleddnesehdnazdxbkcl`wfmfm`f`lfmayenau`bfceidia```", +"`````ybuev`xcc`j`pfzaxau`jezekcferblcifhfhdmdmdldtfmblekdhekaq`fbififzbzftbidudvdifgbu``", +"````atfgfoaobgal`pc`auamaxcoekapdcfwaqe`edeldnele`ekelfm`manapaqficubi`pdjfcacf`bgdvep``", +"`````ya`f`ag`bdpasbcfubraibifmfmdhcfanekdcdmdtdhflexblcifkbyfiaifian`pau`pagbgbceicza```", +"``````epdif`dubcefbgauenaxfmco`f`mecekfied`uavexfkbbaqfmdwanapcubifxffbgacftbef`di`y````", +"``````a`czbuf`ddddbcfffcfcdgdoancofdezbwecfkap`wehaifmbtfiandwaxenbibzagf`ccbpaj`t`y````", +"`````````yfoeyaceoevenfpffbx`mam`mbifpdwchapehaicocoamaibibtezfxdgfxeffjccfpeiddfg``````", +"````````ej`rdidvaobzalbzfp`mauchfpfkezfkau`f`fdechchchfzbic`axbxfpauff`ebg`pejej`t``````", +"```````````tf`f`ajal`zcrfpendsffaycochfzdgfzbjcoancofpdo`ben`affce`edjbcbebef`di````````", +"```````````t`rf`dvaoeobcdu`ece`bfpencucofxbic`auc`dgficuef`bbxffbg`ebedddvaobfew````````", +"````````````cnejbpaodvftdj`jcr`pcoen`j`jcu`ifcbifx`jc``jen`bbx`vccbe`z`zddddcn``````````", +"``````````````ewbpddfbddaccycr`dfp`jfpca`jcu`dc`cacv`dff`d`d`x`dft`z`zbeejcn````````````", +"````````````````fgfneoduembmfj`vag`act`bds`ac``j`j`acv`bbcagak`xdudvbpcn`t``````````````", +"``````````````````ewd`fnaeakemcyaecvdjaeaecrcvdsakaeakafcy`jao`zfnd`cn`t````````````````", +"````````````````````d`dkfndzd``zbm`v`k`b`ecvemaeca`vaedudz`zafew`kbfey``````````````````", +"````````````````````````bfdkd`dz`kafdzae`vemcyafakakaedzdzbed`dkcn``````````````````````", +"````````````````````````````ahdkbnbnbm`z`sdk`s`zd`bm`safd`bn`s``````````````````````````", +"````````````````````````````````bnbn`sd`d`dk`sbmbnah`s`sah``````````````````````````````", +"````````````````````````````````````````````cn``````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass9[] = { +/* width height ncolors chars_per_pixel */ +"50 50 188 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #353579", +"`p c #272754", +"`q c #414188", +"`r c #20202C", +"`s c #2E2E3D", +"`t c #1C1C28", +"`u c #2E2E68", +"`v c #242447", +"`w c #2C2C66", +"`x c #222245", +"`y c #181824", +"`z c #25253E", +"a` c #161622", +"aa c #B9B9ED", +"ab c #3E3E67", +"ac c #1C1C3F", +"ad c #6767A3", +"ae c #2B2B47", +"af c #272743", +"ag c #222248", +"ah c #292931", +"ai c #29295C", +"aj c #1D1D39", +"ak c #252544", +"al c #1E1E47", +"am c #2B2B61", +"an c #29295F", +"ao c #1F1F3E", +"ap c #2F2F68", +"aq c #2D2D66", +"ar c #30305F", +"as c #2C2C5B", +"at c #11111C", +"au c #262655", +"av c #31316D", +"aw c #4C4C6D", +"ax c #222251", +"ay c #323264", +"az c #2D2D69", +"b` c #33335B", +"ba c #43436E", +"bb c #2B2B67", +"bc c #212146", +"bd c #37374B", +"be c #22223D", +"bf c #252536", +"bg c #1D1D42", +"bh c #2A2A5C", +"bi c #28285A", +"bj c #2B2B53", +"bk c #333372", +"bl c #2F2F6E", +"bm c #2B2B3F", +"bn c #2C2C36", +"bo c #424266", +"bp c #232337", +"bq c #2F2FB0", +"br c #34346C", +"bs c #525265", +"bt c #32326A", +"bu c #1B1B2F", +"bv c #3B3B55", +"bw c #303068", +"bx c #21214C", +"by c #292957", +"bz c #232351", +"c` c #26264A", +"ca c #2F2F60", +"cb c #202044", +"cc c #5D5D97", +"cd c #2B2B5C", +"ce c #363674", +"cf c #3C3C66", +"cg c #252556", +"ch c #30306E", +"ci c #3E3E54", +"cj c #414178", +"ck c #2C2C6A", +"cl c #2F2F4F", +"cm c #25252E", +"cn c #27275B", +"co c #363663", +"cp c #4C4C68", +"cq c #20204A", +"cr c #2E2E5B", +"cs c #29294C", +"ct c #242451", +"cu c #27274A", +"cv c #343464", +"cw c #4F4F64", +"cx c #252548", +"cy c #16162C", +"cz c #292938", +"d` c #333384", +"da c #3C3C6F", +"db c #353572", +"dc c #1E1E37", +"dd c #38386B", +"de c #414156", +"df c #242454", +"dg c #31316E", +"dh c #181831", +"di c #232349", +"dj c #272739", +"dk c #393979", +"dl c #4C4C85", +"dm c #2F2F83", +"dn c #28285B", +"do c #292952", +"dp c #36366C", +"dq c #48486D", +"dr c #23234C", +"ds c #37377A", +"dt c #20203F", +"du c #1E1E3D", +"dv c #26265C", +"dw c #313174", +"dx c #4C4C60", +"dy c #27273F", +"dz c #3C3C78", +"e` c #48485C", +"ea c white", +"eb c #383874", +"ec c #333379", +"ed c #444458", +"ee c #272756", +"ef c #47477C", +"eg c #32326E", +"eh c #1B1B33", +"ei c #1E1E2C", +"ej c #30306C", +"ek c #40407F", +"el c #292944", +"em c #212150", +"en c #23233E", +"eo c #141422", +"ep c #343473", +"eq c #323271", +"er c #2D2D76", +"es c #2E2E6D", +"et c #40406E", +"eu c #21213F", +"ev c #272731", +"ew c #8080BA", +"ex c #23232D", +"ey c #25255A", +"ez c #1B1B39", +"f` c #35356D", +"fa c #191937", +"fb c #262651", +"fc c #313169", +"fd c #2C2C6E", +"fe c #22224D", +"ff c #18182C", +"fg c #373786", +"fh c #2D2D65", +"fi c #232344", +"fj c #2B2B63", +"fk c #292961", +"fl c #27275F", +"fm c #202037", +"fn c #1C1C33", +"fo c #242452", +"fp c #45456F", +"fq c #484868", +"fr c #535380", +"fs c #1F1F43", +"ft c #2C2C5D", +"fu c #3535DD", +"fv c #353573", +"fw c #262657", +"fx c #393963", +"fy c #242455", +/* pixels */ +"````````````````````````````````````````````````````````````````````````````````````````````````````", +"``````````````````````````````````````e`bscwbscwbsbsbsbsbsbsbscw````````````````````````````````````", +"````````````````````````````````bse`bscpbse`awawcwbsbsdqawawbsdxdxcwcw``````````````````````````````", +"````````````````````````````e`eddxfqcwcpfqfqawawdqawdqawawfqcwawawfqfqe`cw``````````````````````````", +"````````````````````````cie`e`dxfqboboawfpfpdqfpbafpawfpdqbofpabdqfqfqedcfdee```````````````````````", +"``````````````````````edede`cifqbodqabfpfpbabobaccbabafpbaddbaetfpfqabbobobodee`````````````````````", +"````````````````````deedbvbvfxfxcfetboetfpcfewetddetetdaefetbaetabetbofxabcfedcici``````````````````", +"``````````````````bdedbd`cabdefxababfxddetddcccjefbacjeaetddddcfdpdaddababb``cdeedde````````````````", +"````````````````bvbdbvfx`cb`fxcfcffxdddaddefccaaeaefewbwdldadaddcoayddcvcfb``cbvbdbvci``````````````", +"```````````````s`cbvbdb`b`b`cocvdddaddayf`braadlfrccdldzewdddaebddfcbwayfxcfb``cbd`cbd`s````````````", +"````````````bd`sclclbjb`crb`arcofr`ubtbtfcdkaaewewdlcjdabtdabtcvddebayaycadoarb``c`n`ncl`s``````````", +"``````````bdbv`c`ccub`b`b`ascrdp`fcadzaqbwfjebcjeaccewaaccdlfrdlegbw`f`lcab`crcrcrclclelbpbd````````", +"``````````bnbmcuclclcrb``pararcv`ff`fcegf`dzewcjcjeqdleabkavf`fc`mbrcaegfcaycabjararcrae`sbm````````", +"````````evaedycragcacvb`apcrasbwf``faybtavekewaddleqdkccccdkbrdzfcavapbrfhf`biascac`bjcuel`kbf``````", +"````````aeae`vcldo`acrcacr`fbtddaqapebceckbleqdzdseqaaadekdwebdkavceapbrbt`fftamcrbybjaeclbpbp``````", +"```````rfnbeakdocubzarfw`faiarbraqegejbkcheqeqekd``oefekewdzchekbkaqfhbtbkapcrcacr`j`vdocbbpfn`t````", +"``````cz`zdoakbccbbyasdr`fap`uf`fcejck`obkdl`odmfudwecdwaadzbkdzdbaz`legaqftar`fcadofbdobjafdccm````", +"``````bfehdc`aeefifbftaiambw`gavbkblck`gckd`eqecec`hfgd`addsepbkfvfkapazavf`fw`fbycrcd`a`vehbubp````", +"`````tbuehdyfbasdocaapayayebebbteq`geqchfvdwecbqdkaddsfudwdzbkckdwfjbrapf`bwf`byfwbyasdr`iezbucy`t``", +"`````yfnfieu`bdi`abydn`mfcf`f`egdbavdbec`odwcefgecdsd`dmbqepceeqf`az`wejdbbrambi`lcdft`bcbc``va`ei``", +"````a`eoenfifsaycrbyfl`mfc`uan`webceebdmer`gdwbqdsdsdmdmbqekdkeccechckfkejegfhbiftarby`a`v`vfiffbu``", +"````fmcycxdidt`iardpdnemanavflejazeqesepcefgblerfud`fgfderfgdkdsdkdzfkeqbkapapbt`lctfceuas`vcydhfn``", +"````ehdheudtagbybjcabidnapapfcebejblchcheqer`hbqbqerbqfufgecdsebcedkbkbleqf`fjambicaaycu`vcxa`du`y``", +"````fnfndhdtbgdobybifocnbwameqckdgeqeqfdesfdfgfgdwflfddmfufudwch`odschflejebdvayby`pee`vcbacfndcbu``", +"````bube`vacfe`iembyfc`f`ufc`wdveqdkeqflfddwfudm`her`hd`fgbqecd`ecbbflfkfjapdvbwdnftas`jfifieh`yeo``", +"````ffehdhdhdrcqalft`jembtai`wfkdg`obbesbldmfddm`gecfud`dmbbdw`ochbl`ufkap`weganaiar`j`j`ddu`adhff``", +"````ffdcdrdtbj`a`pfhfebibh`legfkesapaqeq`obqbqfddkfu`hd`dwfkchdw`wcheq`ufjemfyaucdby`peectduezdhbu``", +"`````tfadhag`v`iee`fcqfweefleyanaqfjazazebfg`g`qfu`hadcher`q`h`gazdwaibbap`lfw`waybxct`aagcbeueofn``", +"````eoa`ffcbfididr`eaxeybzbhcgaqepdlbkckazeqds`qfueqfdblefeqdzchdg`wfheyamey`laibyalbiagdraodheheo``", +"````at`ydhdh`dfsal`pfyalfyemeyey`waqdgazckepbkdw`qekepecfjdmejflazfj`ubw`lbiftaxee`beecbcbbcdu`ta```", +"````a`a`a`ficbalcqeeauct`fcgdffyflejapds`wefdleradewegaaegeseqbr`lfl`u`megamamctfb`vfebc`deudceoat``", +"``````eofffacb`abyftcbbybtfcanfwaidvapepap`wegazdzdlek`uerfgepdgfj`laqdncn`mbyfoct`p`vbgacezdhbu````", +"```````yffdhfsficbeealbybxbiemcncnamflch`u`uccew`udgdlf``wdldbcgflanbweefycnaxeeacezfsdyfmdh`y`t````", +"```````teoeiezajdcdc`ealeeai`jaxaiamcgavaiew`ucc`w`mandzanebflfcamfldvbiemdffw`pfeezcbdcbpeh`yeo````", +"`````````tfffffmaoakdtalamfbdremfjamaiaidffraiddegdbfhancnbrdn`mamegfwaxfocgftct`x`efeezeifn`t``````", +"````````ex`tehbeezdubydialcdaxcnbidndfbhfwbweydf`mandfcgdvananfyfofycncgcnaxfoacbg`e`pfadueiex``````", +"```````````rbufndcajacfscbbycqfofodnaifhfyai`paxcnfweyddcg`pcgfwfofedifeaxbyalfs`j`kduehfmfm````````", +"```````````yeifndhbefsao`vaxbxbxcsfebyfwbzfybidfcgbjfwaidnambibybzbx`afocdbc`vfidtezajbueha`````````", +"`````````````y`r`rezduaocxficb`jfw`abz`jct`jdnfwbzfwdnaufofofw`afo`i`ddiducb`zdudcezdu`rex``````````", +"``````````````evbudjfmajcbagbcctbcfwcgaufoct`afofb`afodf`jbzemfobx`dfe`val`xczdjbebpdccm````````````", +"````````````````evcmezfneufsaoelcqcxctfeaufecsfectbxbzfeae`b`jdrc``b`x`ecb`zbpfmfmeiev``````````````", +"``````````````````ffbubpfiafafbmbc`vag`bc`csdr`j`bct`jfefbcxcx`j`xdificxacbeenbfev`t````````````````", +"````````````````````cmczczdy`zak`kcucucudrcuaecxc`cxdrcxaeelak`vc``jajakbpafbfbf`r``````````````````", +"``````````````````````cmczbpdjdc`kcxelaoelakagbc`aaeel`bbxakakeu`zdtbm`zdjbpevbf````````````````````", +"````````````````````````cmbfeibfbmeuel`kelelafelelakaeelaf`k`k`zdjbebm`zbncmah``````````````````````", +"````````````````````````````czbnczbp`zafbmaedyafelbmdy`zdybeczdjczbf`kbpex``````````````````````````", +"`````````````````````````````````sevdjbncz`zdj`sczcz`k`k`s`sdjbfahevbn``````````````````````````````", +"``````````````````````````````````````evah`sbncz`kev`sbnczbnczah````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass10[] = { +/* width height ncolors chars_per_pixel */ +"60 60 189 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #353579", +"`p c #272754", +"`q c #414188", +"`r c #20202C", +"`s c #2E2E3D", +"`t c #1C1C28", +"`u c #2E2E68", +"`v c #242447", +"`w c #2C2C66", +"`x c #222245", +"`y c #181824", +"`z c #25253E", +"a` c #161622", +"aa c #B9B9ED", +"ab c #3E3E67", +"ac c #1C1C3F", +"ad c #6767A3", +"ae c #2B2B47", +"af c #272743", +"ag c #222248", +"ah c #292931", +"ai c #29295C", +"aj c #1D1D39", +"ak c #252544", +"al c #1E1E47", +"am c #2B2B61", +"an c #29295F", +"ao c #1F1F3E", +"ap c #2F2F68", +"aq c #2D2D66", +"ar c #30305F", +"as c #2C2C5B", +"at c #11111C", +"au c #262655", +"av c #31316D", +"aw c #4C4C6D", +"ax c #222251", +"ay c #323264", +"az c #2D2D69", +"b` c #33335B", +"ba c #43436E", +"bb c #2B2B67", +"bc c #212146", +"bd c #37374B", +"be c #22223D", +"bf c #252536", +"bg c #1D1D42", +"bh c #2A2A5C", +"bi c #28285A", +"bj c #2B2B53", +"bk c #333372", +"bl c #2F2F6E", +"bm c #2B2B3F", +"bn c #2C2C36", +"bo c #424266", +"bp c #232337", +"bq c #2F2FB0", +"br c #34346C", +"bs c #525265", +"bt c #32326A", +"bu c #1B1B2F", +"bv c #3B3B55", +"bw c #303068", +"bx c #21214C", +"by c #2C2C64", +"bz c #292957", +"c` c #232351", +"ca c #26264A", +"cb c #2F2F60", +"cc c #202044", +"cd c #5D5D97", +"ce c #2B2B5C", +"cf c #363674", +"cg c #3C3C66", +"ch c #252556", +"ci c #30306E", +"cj c #3E3E54", +"ck c #414178", +"cl c #2C2C6A", +"cm c #2F2F4F", +"cn c #25252E", +"co c #27275B", +"cp c #363663", +"cq c #4C4C68", +"cr c #20204A", +"cs c #2E2E5B", +"ct c #29294C", +"cu c #242451", +"cv c #27274A", +"cw c #343464", +"cx c #4F4F64", +"cy c #252548", +"cz c #16162C", +"d` c #292938", +"da c #333384", +"db c #3C3C6F", +"dc c #353572", +"dd c #1E1E37", +"de c #38386B", +"df c #414156", +"dg c #242454", +"dh c #31316E", +"di c #181831", +"dj c #232349", +"dk c #272739", +"dl c #393979", +"dm c #4C4C85", +"dn c #2F2F83", +"do c #28285B", +"dp c #292952", +"dq c #36366C", +"dr c #48486D", +"ds c #23234C", +"dt c #37377A", +"du c #20203F", +"dv c #1E1E3D", +"dw c #26265C", +"dx c #313174", +"dy c #4C4C60", +"dz c #27273F", +"e` c #3C3C78", +"ea c #48485C", +"eb c white", +"ec c #383874", +"ed c #333379", +"ee c #444458", +"ef c #272756", +"eg c #47477C", +"eh c #32326E", +"ei c #1B1B33", +"ej c #1E1E2C", +"ek c #30306C", +"el c #40407F", +"em c #292944", +"en c #212150", +"eo c #23233E", +"ep c #141422", +"eq c #343473", +"er c #323271", +"es c #2D2D76", +"et c #2E2E6D", +"eu c #40406E", +"ev c #21213F", +"ew c #272731", +"ex c #8080BA", +"ey c #23232D", +"ez c #25255A", +"f` c #1B1B39", +"fa c #35356D", +"fb c #191937", +"fc c #262651", +"fd c #313169", +"fe c #2C2C6E", +"ff c #22224D", +"fg c #18182C", +"fh c #373786", +"fi c #2D2D65", +"fj c #232344", +"fk c #2B2B63", +"fl c #292961", +"fm c #27275F", +"fn c #202037", +"fo c #1C1C33", +"fp c #242452", +"fq c #45456F", +"fr c #484868", +"fs c #535380", +"ft c #1F1F43", +"fu c #2C2C5D", +"fv c #3535DD", +"fw c #353573", +"fx c #262657", +"fy c #393963", +"fz c #242455", +/* pixels */ +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", +"````````````````````````````````````````````````bsbsbsbsbsbsbsbsbsbsbscxbs``````````````````````````````````````````````", +"``````````````````````````````````````````dycxdydycxawawawbsbsbsawcxcxcqdycxcxbs````````````````````````````````````````", +"````````````````````````````````````dyeacxfrawcqawfrawcqcxawcqawawawawawawfrfrcxcqeabs``````````````````````````````````", +"````````````````````````````````dfeadydyawcqawawfrcqawawdrawcqawawfqawcqcqfrawawfrdyeaeadf``````````````````````````````", +"``````````````````````````````eadyeadyfreedrboawfqfqfqdrfqeufqawbaawbabofqeufqdrcqfreeboeadf````````````````````````````", +"``````````````````````````dydffrbocjfrfrdrfrfrfqfqbabofrfqfsbaeubafqfqcgeubafqdrbaabbobobocjeedf````````````````````````", +"````````````````````````dfeeeadffyboeecgeufrfreufqeueueucgbaeubadrdbbacdbaeucgbabocpboboabboeaeebd``````````````````````", +"``````````````````````bdbdcjbd`cfyeefybaabcgfyeubaabdmfseudbdefsaackdbeudebaeudedebocgbofyfycjcjeecj````````````````````", +"````````````````````cjdfabbvb`cg`cfyfyfycgabcgdeckbrfscddecdcddmdmfsabdeeucwcpdbdbcgcgcp`cbvbvcjbvbdcj``````````````````", +"``````````````````bdbddfbv`ccgfyb`cgcgcpfycwdedbdbcdadcdexexckcd`u`uegdedbdbaycpaydecpcpb`bvfybvbdcj`s`s````````````````", +"````````````````dfbdcjbvbd`c`c`cb`cpcwcgdededqayfabrcdexdbcdcdcddeexebbrdbecdedqcwfdaycpcgarb`b`bd`cbd`sbd``````````````", +"```````````````sbdbd`n`ncmcscsarcscwcpdbbtbwbwbtbrfaebexegexaddbdeeceldqbrbrdqbtbkaybt`fbjcscpb`b``ncmctbdbd````````````", +"``````````````aebd`c`ncmcsb`cwayascsdebraybwbrfdbtazdmdeexaddladexckdedmdme`btay`lcbcscwarasfucpb`cmcmae`nbd````````````", +"`````````````saeeo`nbjcmcsarar`paycsbtcb`fbrbtfkfdciecdmdqebcdaacddmece`elbrazfabr`f`wbwbtarbzcsascsarbjbm`kbn``````````", +"``````````ewd`ae`z`c`zbjcsb`cscscwcwbrbravbtecbrfackaadmckexavciexdme`bkfabtapanbr`ffabtfdbtdpcscsbjbjdpbeae`s`s````````", +"``````````ahcm`kcm`bdparaycsay`fcscsfdbrfibwbtbrfdeqcd`qdmelbkeldmexdmeqdce`faerdcapbtbwfa`waucscscvdpdpafcmae`n````````", +"````````cncmaeakcmct`adpcsarcbcbbwdqdeapamdcehcfclbldlbldmeqeradexade`esecelehehdc`ubrbrbtfucsbhcsas`actbecmbpbpey``````", +"````````ejbpeo`vctcv`abzb`ef`ffxfucbbwapbldcdheqetesdlfwdmescfcddmdmdmbkbleldldhaq`ubrfabtcbcsbtcs`pcccycm`veobe`t``````", +"`````````rae`aajevdjdsasas`jbifiapbrbtav`uapclcfdlad`odndnfvdxededexegeceqe`e`cfbybydcbrfmcwcbfdcbbjdjca`bcv`zdd`t``````", +"``````ej`rbu`vcvcv`vcyfcbzefbz`f`uclapfderfeerclerdldlerdada`hedfhe`aacferdtcfciazapfk`ubramcbfuararbzfc`zaeaofo`t`r````", +"``````bpfodibedsdp`jcs`abwbh`lfadccidcecerclet`gfe`hdxdx`hededdt`hdaelcfereterer`wbk`ubtfdbtef`fefcb`paudpbcdiczdi`y````", +"``````ejddddemfcbjefcscs`faycedcececapciazcieqbldterdxdnbqelcdfhfv`h`oe`ererdnetfkfdekfabwbtfubifxfcar`affdpf``yepfo````", +"`````tej`ycyevcuctftbzefdoaiapaqbrbrehfw`udcfwda`oerekfhfhdxdtdaes`hbqfwcferbkehflfkekcffabwfuco`lbzcsbzftbccaevfneja```", +"````atddddem`xaocscsar`pdwdwfibwapbyapeccfdlcf`hdnfmbl`hfhdtdt`hclfvbq`qfhdxbkcfcl`gfkehfa`ufufpamaycsaydjcc`v`vfoepat``", +"````ejfgbucy`vccceaseffdfldgai`ubbfzfdazazcfblereqdt`hdnbq`hedbqfedndndte`dtdtdletfmdhehfkapapbt`mdgfubzacdp`xf`dicz`y``", +"````budddi`x`vevdpcsbzcwfxai`mapfdflfaavblercibkcffhcl`gfvfvfvdadaedclcfcfdteqecdcfkercfav`lbt`famchfdcsbe`bcaczfjbefg``", +"````a`buepccevcrdpbzbzcbfxbifdfififacfekazereretblfe`hfhbqesesdnfh`h`hbq`hfwecdldcerclavecaqaqfifxbhbzbzcv`xfjfodufnat``", +"````atepbufodualfcdp`lauauchfi`lapek`gcicieretfecl`gfhed`hesfm`gfefvfvfvdxbl`oederetfm`wdlfkfxaybzau`d`j`xduf`fgdufga```", +"`````yepddfjacccbz`benamfd`f`mfdbr`mdwcidtcfclfmfebldadneddnesdadadx`hdaededdaclflfmflfmehbyaiaydofuarasftccfjdidiei`t``", +"````a``yczczfbbcbc`bacficucraqfdanfkflaz`oehbbesbldndxfefefeesfvbqbqdnbbdtedciciazaqfkazaz`ubw`laicbas`pdjcccc`advddat``", +"````fo`yddccf`fcalcefucbcufpbi`fbyav`wazbt`ucldxed`hblescldn`hbqdndncl`gazedazazazfw`wekfzanameffucbbzbxbz`jf`fbevbuep``", +"````at`yfbaccy`a`bdsceaiffbzbichfi`manekaq`uclbkcffheletfvesfh`hesdx`qclci`gfkapap`wekapezanfzaifubxeffcfc`bdubufgepat``", +"````a`czdvf`bcdv`bffbzbicrax`fbiezcofifiekbkfk`geredeserbqdndndtadfhazcfblfecl`u`laiflaq`f`lez`ucbdgff`j`bdpccdddiepep``", +"````atczdidvaocy`v`edsbcaxdwbxfzefchameqecdlbl`gazdh`qfhaaadelesfhdaflblbkblerazapfidwbhchaqdobibzalfp`pccbgdveiczepat``", +"````a`epfoczdi`dccac`jaufzcraxaubxdwez`wfkehekbbclbkelaa`obqeleddldafkdmekfm`wfk`wfibwfidobhaiaxef`j`pdsbcacbcaodiddat``", +"``````eifgczevccfbau`jefdgffbhamaxfxezfd`w`l`odl`udcbk`wdneldtegadaaazetdlfmanan`waqfkehfifpbic``p`dbzagftao`vdifbfg````", +"``````a``yfgdv`b`v`ifcbz`b`ibwbtamfxfxfmfxekdhcfby`lciehec`wdlaverapcdecelaz`lby`lfidofiap`mcefxfp`idsagbcagajeicza`````", +"``````ata`czfbdv`vdjceasac`ibiamfian`maifxanazehave`apekehap`uege`ecazcfbkekdwfkfifiauchefbiencuftbcdvfbfof`fbdi`y`y````", +"`````````yczbudvdvdvfbcubgfcaucrbicraxfzchco`wekfke`aqflav`uaa`udm`u`w`uamfzchfmanameffpdgaidgfpaldvaoevf``zfbfgbu``````", +"````````a``tejeif`ajddajdsccbz`pbi`jfpdoanfzanbtai`f`ufkfkdq`lanebexaidcfme`fafiancodgenenbiai`pcracccf`bpddbufg`t``````", +"`````````t`yfgfgbpacaoakdubgbiauffdsenanfidoamaidgcdcoezbtecdc`mdmanbifidoanan`uapfzaxfpfpbhcecr`xbcbgbxddbufoej`t``````", +"```````````t`yfoddaodidv`i`xaleffpc`chfxamchezaichezfmfzanbwanfpcb`famfkanfxfzezcoanbifxc`ffefacbgccacf`ddddej`t````````", +"```````````tcnfobpdvbgdvbgbxftefbibxaiaudofzaxfichanfxfpfxezananfxchdgefezfzfxcuc`crdsfpcubz`jft`eeofcfbfoejfg`r````````", +"````````````eyfgbudiaoajbgdvbecrfpfpff`bffefbwaichchdgdgbhdgbjbidoaicofxfpaicubxds`afpdgas`e`vduag`z`zajdibuey``````````", +"```````````````t`rbuddeodvft`zalbccr`ec``bc`auenfp`jezchfxaidpc`fxdgfpfiamfcdgfxcvcrfcfpalcr`zbeajf`dvajbfey````````````", +"```````````````rbfbpfofbbgdvaffjfjcc`jfxbxfcc``b`bdsbiau`jc`biaibifxfpfcch`afpc``d`d`vdvfjfj`zdvajfbdvbp`tcn````````````", +"````````````````cnfnfnbpfnaoftftdj`ecuftfpaubidgfp`j`bfcfpfc`afpdgc``jfpencuc``b`j`e`vcrevdkdzewbefnfobfej``````````````", +"``````````````````bffnfnajfodvddccftaf`e`b`jdgcuai`jcv`jc`fcdj`jbxcvcvdsdsbxbxdjcr`xbxdjft`z`zddbefnbf`r````````````````", +"````````````````````d`eyewbeduak`zfjemcads`dfp`jdj`b`bcu`jcudgfpefds`bcacacvctct`dagak`xaoddbeeybpfn`r``````````````````", +"``````````````````````eyfnbpdkdz`z`zbmakfj`bag`v`dctctctctem`d`ecvctaeaeafcu`v`ecc`zakafbp`kbpewbfew````````````````````", +"````````````````````````eyeybfbpdk`zemcvcyafemakcvcvaeaeffdjcvcv`j`vae`vemaf`vagcc`z`z`zeodkbfd`ey``````````````````````", +"``````````````````````````cnbnfobe`kbe`kevemdzfj`k`z`b`edjctaeaeemds`eaf`vevdzdjafemd`dk`zbfd`ey````````````````````````", +"``````````````````````````````bncneybf`kbeaf`kememem`kcvafemakaeaeakemem`kdk`z`kbebm`zd`d`ah````````````````````````````", +"````````````````````````````````ahcnewd`dk`z`zaeaf`kaf`k`vemaedzcvakak`z`kdzd`dkdkbmbfbnah``````````````````````````````", +"````````````````````````````````````cncnbf`z`sd``s`k`z`s`zbm`s`kd`d``s`s`k`kd`ahd`bncn``````````````````````````````````", +"``````````````````````````````````````````bnd``s`s`kbnd`d`bfd``kbnbnd`bnd`ewahbn````````````````````````````````````````", +"````````````````````````````````````````````````ahbnahbnd`ewdkbfewahahewbn``````````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````" +}; +/* XPM */ +static char *glass11[] = { +/* width height ncolors chars_per_pixel */ +"72 72 189 2", +/* colors */ +"`` c None", +"`a c #27274E", +"`b c #25254C", +"`c c #383858", +"`d c #23234A", +"`e c #212148", +"`f c #2E2E62", +"`g c #292967", +"`h c #3535A1", +"`i c #272751", +"`j c #23234D", +"`k c #29293F", +"`l c #2C2C63", +"`m c #2A2A61", +"`n c #33334C", +"`o c #353579", +"`p c #272754", +"`q c #414188", +"`r c #20202C", +"`s c #2E2E3D", +"`t c #1C1C28", +"`u c #2E2E68", +"`v c #242447", +"`w c #2C2C66", +"`x c #222245", +"`y c #181824", +"`z c #25253E", +"a` c #161622", +"aa c #B9B9ED", +"ab c #3E3E67", +"ac c #1C1C3F", +"ad c #6767A3", +"ae c #2B2B47", +"af c #272743", +"ag c #222248", +"ah c #292931", +"ai c #29295C", +"aj c #1D1D39", +"ak c #252544", +"al c #1E1E47", +"am c #2B2B61", +"an c #29295F", +"ao c #1F1F3E", +"ap c #2F2F68", +"aq c #2D2D66", +"ar c #30305F", +"as c #2C2C5B", +"at c #11111C", +"au c #262655", +"av c #31316D", +"aw c #4C4C6D", +"ax c #222251", +"ay c #323264", +"az c #2D2D69", +"b` c #33335B", +"ba c #43436E", +"bb c #2B2B67", +"bc c #212146", +"bd c #37374B", +"be c #22223D", +"bf c #252536", +"bg c #1D1D42", +"bh c #2A2A5C", +"bi c #28285A", +"bj c #2B2B53", +"bk c #333372", +"bl c #2F2F6E", +"bm c #2B2B3F", +"bn c #2C2C36", +"bo c #424266", +"bp c #232337", +"bq c #2F2FB0", +"br c #34346C", +"bs c #525265", +"bt c #32326A", +"bu c #1B1B2F", +"bv c #3B3B55", +"bw c #303068", +"bx c #21214C", +"by c #2C2C64", +"bz c #292957", +"c` c #232351", +"ca c #26264A", +"cb c #2F2F60", +"cc c #202044", +"cd c #5D5D97", +"ce c #2B2B5C", +"cf c #363674", +"cg c #3C3C66", +"ch c #252556", +"ci c #30306E", +"cj c #3E3E54", +"ck c #414178", +"cl c #2C2C6A", +"cm c #2F2F4F", +"cn c #25252E", +"co c #27275B", +"cp c #363663", +"cq c #4C4C68", +"cr c #20204A", +"cs c #2E2E5B", +"ct c #29294C", +"cu c #242451", +"cv c #27274A", +"cw c #343464", +"cx c #4F4F64", +"cy c #252548", +"cz c #16162C", +"d` c #292938", +"da c #333384", +"db c #3C3C6F", +"dc c #353572", +"dd c #1E1E37", +"de c #38386B", +"df c #414156", +"dg c #242454", +"dh c #31316E", +"di c #181831", +"dj c #232349", +"dk c #272739", +"dl c #393979", +"dm c #4C4C85", +"dn c #2F2F83", +"do c #28285B", +"dp c #292952", +"dq c #36366C", +"dr c #48486D", +"ds c #23234C", +"dt c #37377A", +"du c #20203F", +"dv c #1E1E3D", +"dw c #26265C", +"dx c #313174", +"dy c #4C4C60", +"dz c #27273F", +"e` c #3C3C78", +"ea c #48485C", +"eb c white", +"ec c #383874", +"ed c #333379", +"ee c #444458", +"ef c #272756", +"eg c #47477C", +"eh c #32326E", +"ei c #1B1B33", +"ej c #1E1E2C", +"ek c #30306C", +"el c #40407F", +"em c #292944", +"en c #212150", +"eo c #23233E", +"ep c #141422", +"eq c #343473", +"er c #323271", +"es c #2D2D76", +"et c #2E2E6D", +"eu c #40406E", +"ev c #21213F", +"ew c #272731", +"ex c #8080BA", +"ey c #23232D", +"ez c #25255A", +"f` c #1B1B39", +"fa c #35356D", +"fb c #191937", +"fc c #262651", +"fd c #313169", +"fe c #2C2C6E", +"ff c #22224D", +"fg c #18182C", +"fh c #373786", +"fi c #2D2D65", +"fj c #232344", +"fk c #2B2B63", +"fl c #292961", +"fm c #27275F", +"fn c #202037", +"fo c #1C1C33", +"fp c #242452", +"fq c #45456F", +"fr c #484868", +"fs c #535380", +"ft c #1F1F43", +"fu c #2C2C5D", +"fv c #3535DD", +"fw c #353573", +"fx c #262657", +"fy c #393963", +"fz c #242455", +/* pixels */ +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", +"``````````````````````````````````````````````````````````````bsbsbsbsbsbsdydybsbsea````````````````````````````````````````````````````````````", +"``````````````````````````````````````````````````````eabsbsdybsbsbsbsbsbscqcxbsbsbsbsbscxdy````````````````````````````````````````````````````", +"````````````````````````````````````````````````dydybsbsdycqcqdycxbsbsfrcqcxdyfrcqcxcxbseacxcxbsbs``````````````````````````````````````````````", +"````````````````````````````````````````````eaeaeafrcqawawawdrdrawcxawawcqcqawawawawawbscqfrfrdycxcxea``````````````````````````````````````````", +"````````````````````````````````````````frdfcxcqawcqcqawawfrcqdrawfrawawcqawawawfqawcqawcqdrawdrfrdycqdycx``````````````````````````````````````", +"````````````````````````````````````eeeaeaeadycqdffrboboawfqfqfqdrdrfqbabadrdrdrdrbobodrdrbaawdrdyfreaeaboeeee``````````````````````````````````", +"``````````````````````````````````eeeefreeeefrbofrfrbofrfqeudrbadrfqdrfqeubabababababafqdreufqfrbafrfreeeeeacjdf````````````````````````````````", +"``````````````````````````````eecjboeebocjboboababboabdrfsfqfqbabobobafqfqawdrfqawbaeueudrdebafrbocgbobobobodfdfcjbd````````````````````````````", +"````````````````````````````dfeeeedfcjbvab`ccgfyeuabboabbabaabdbadeucgdeabbabadbegfqfqfqbaeueueubobob`bocgcgdfeacjcjcj``````````````````````````", +"``````````````````````````cjbddfcjbv`ccgdffycgfqbofyfyabdbeuabfqexbaeueudefqexadckdbbadedebaabdedeeufyboabcpfycjdfdfeecj````````````````````````", +"````````````````````````cjcjdfdfbvb`cg`cfyfyfyfycgabcgdeeudbbregexdbdbadcddmegexeucgdedbdbayfydbdbabcgfycpb`bv`cbvcjdfbdcj``````````````````````", +"``````````````````````bdbdcjbvbvfy`c`cb`cpcgfyfyfycpdededbdeegexdmaaebexckaadm`ucddbdedbdbcwcpcpfddedeb`fyb`bvfycjcmbdcj`s`s````````````````````", +"````````````````````bd`nbvbvbv`ccg`c`ccscpcwcwcgdebrcwbraydqckdbcdegegcdcdade`btdcadbrdqfabrdebrcpbwaycpfyfyb``car`n`nbdcjbnbd``````````````````", +"```````````````````n`s`n`ncj`nb`b`b`b`b`b`arcpdqfabrbrcwaybtbrexadcddbadaae`dedeexaddbdqdebrdedbdededeayb`b`cpb`b`fy`n`c`ncmbdbd````````````````", +"```````````````````n`sbdaecmcmcscscscpcscscpcwfsbwfiaqfdaybtecadexaafsexe`exckdbbtecdedqfdaycpbrekcbcsaycb`icsaycpb`b``ncm`naebd````````````````", +"`````````````````scj`c`ccmctbjcsb`cparasascsdqayaybwecbwbrbrbbe`dee`ebadegcdexadegdbcdade`ecbrbwfk`ffuarcwarcscscscpcscmcmct`nd`bd``````````````", +"```````````````s`saecv`nbjaecmasarar`parcsayfdcb`fbrbtaq`fbtciecdmdbdeebcdebcdebehece`egfabtaqecbrcbazap`fayarcsas`casbjarcmem`n`sbn````````````", +"``````````````ew`s`zcv`nevcmbjcscsbzcscwaydedqbwavfafdfadcdcckadebcke`aaehdhadebe`dcehdcbtbran`fbr`fbrfibtayaybzbjarcsb`bjbjafbm`sae````````````", +"````````````bnaeae`kcmagdjfuaycsb``ffucscsbtbwdcaqfifdfabwave`exaaadcdcddh`oecadcddmfwapdbe`fdaqbrapbtbtfdecaqbhbzarcs`adpcmaf`zcmcncn``````````", +"````````````dz`n`kctcmct`idparcwaybw`farfubrdqbr`ffdfafaecekerdcfeazeleqavdmexaddmelcibkegbrbtbkfa`uehbwfifiambzfxcscs`abjbjakctcmcm`z``````````", +"``````````ey`saf`zafbjcv`befascsfuar`ffdbrde`faq`wdcdcbkerclesdlcfdmcdblfwcdebaddmdldxercdecbkavbkapbrbtfdbt`fcbbwcbbjbzcactaebectfn`zey````````", +"``````````a`bf`zcacvdpcv`icucscsbi`fefbhar`fbr`uekbrekcierdxdxdlcieleqes`odmelelexdmcfere`eldcetaqfibwfadcapcbcscsbtcsfcccakdp`vcv`zfncn````````", +"`````````tbpaecvao`vcccydsbzcsbzffaifiekbwbtbrap`uekbber`odladdteddndnbqdxeqedeqebeleceqdtelelerbyfkavdcfiancwarbtfdcsbjdjfcbjctaebpddbpbf``````", +"````````bf`rfodpevcv`vfjcybz`idpefbhayapetblapfdciblcleqeteqeldldxdxdadadaesdadtadcdcfereqdldcekapap`wflbwayamcbbhcbasasdp`pbjakcvfjfo`y`y``````", +"````````ewdddidvdj`abzagdpcu`p`lbzambwfdbbclehdcerfeetetflfedaedbldxdadndaeddada`qdmcfeqdxdheqblfkap`waqfddq`fdgaycs`pcsefef`afjeveieifo`k``````", +"```````ybfevei`zft`afubzcsas`fam`fbwfaecdcdcdccfetbbblcieretedesed`h`heldm`qdafvdndleceqercledetaqbrapbkfaayfabwbz`fbiascs`p`j`vftf`a`epbu`t````", +"```````y`ybufnaefc`bdpcucs`pfubw`lbwbrdqdcehavfw`wcfcfereqfwercidt`hdae``qdtbqbqeddle`cfdtdxercifk`uavavecbwbw`fbz`m`mefay`jbc`d`aaobua`fg`t````", +"``````epbuddcvfjefca`bdsbzbzbhezbyaqaqbrdqehecdcfddccfeqdaedblazdtfhfhdxdtdnfednfvfvcfdtererdcehfl`wfkbkfafaap`fcefifiasasfudjbc`bcadudda``t````", +"``````a`foeoemak`adparcsarefaidwamapbwapbyazeheccfeccfdxbqesfmblesbqeldtdtbq`g`hfvbq`q`qeqerfweqclbbfmdhbwfa`ufubifxbtarcscb`b`bcv`v`vfgfgbu````", +"````atejfgfgcy`v`bbcfuasef`ffiezchco`uazezezap`uekdlererereqeddadnfvfved`ofvesesbqfvdle`dleddtdlclfmfkerbr`mapfibtbi`lbzfufuccfccvccdvfg`yfoat``", +"`````yfodiaj`v`v`x`bdpcsbzdeamamaxfkaqehfm`wav`ueteretbkbkcffhdxfednfefv`hbqdadxesfedtfwcfdtfwe`dcflcldlbkfdfibtap`fanfpayasao`idpagczfneifg`t``", +"````atfgfofgagccao`abjasbzcbfufxbibtbwfdapecdlavekerblbkeqeqdaesfedafvdndn`hfvfv`hdxeddtdtcffwdlecdhcleqehbkaqaqfkfkco`f`fayafctdjcadiajdv`yfo``", +"````atejbpczaocc`aaldpbzbzfudoen`mbtfiambtbtereretererbletetfeesbq`hfv`g`gdn`hdafhdabqfvbkbkdldlfwerclfkekecaqaqfdfidgef`b`pctccftakfoajfgbua```", +"````ata`befofoft`daldp`p`laubzambi`lby`lehfm`gavciererclfe`g`gfhdtdxed`g`gesfmdnfvfvdndnetdxedblblazfmfmapec`mfzcbarc`bzbxfcaoccftf`fgbcepfgbu``", +"`````y`yevbefjdv`xfpdp`jenbifd`lfufkfdbtazdw`merdtdtci`g`gfebledfhesdnfeesdafvededfvdaed`hdadaclflfmflezfibtbycobwfudgfuarfuds`v`xaodidia`atat``", +"````atfgaobudif`acfp`ebxacfu`fc`fxfdfdan`mdw`gaz`ocfekcletesdndxfecletesdn`h`hfvfhedclfheqfherek`gbyazfm`uaz`ubtamanfucbceaufcccccducaevfoatat``", +"````atfoejfof`fbcc`jcrbheffufualaxamfiancifkbbciehekflcleleqdadxfedn`gbq`hfvesdnblfmflbberedcletazeqazehapfm`w`lfubzcbcsbzcr`jdpacf`ftdvfn`yat``", +"````atfgbufodjfjdudp`afpfu`l`jfcbiefdoapavfkfketazbyazbldxdt`hes`hesdxdx`h`hesdndaet`gazeler`wazdhdhcidhanbxezfzchbibh`p`pfceffffcf`czfodd`yat``", +"````atatczdif``b`v`v`afffu`facfcfubidgfmcoez`lapbbap`gbbedecfhedetdaesesfv`h`qcifhfhdadletfl`wekfianfkcifk`lfkchfl`lbzcrcufc`ift`aaodddda`buat``", +"````at`tdif`dvagcycc`iff`pefcraxfz`fbianezfkap`uehfw`ufl`gcieqcderfh`hdnedeqdcfedmazdldxdl`gazaq`lfmfmdwfi`l`lan`wfdfucrc`fp`b`d`daoddbufnatat``", +"``````fga`f`dvdvcycc`xffdsdscrchezcrfzeffxezfieqecdlbkfebbcidh`qfhfhad`qelfedndadnfkblcfclcierazapaqdwaibhchaqanfxcecealfpef`x`bdvf`eiczfg`y````", +"``````at`yeiczeiajftftac`j`pfpaxalaxefbxfzch`maqfkbkerazclblbkdmdtdaaaedexfvaddafe`udmblflfkazbbazaqfiaqanbiamanaxfpbzds`pfcbcccdvftaoei`yep````", +"``````a`a`didif`f`acbxalfp`pbxax`jcefufzfzfmfmbbfifkfibkdhaveqelexfv`qcddndmcdadfeekdl`hflanfkfm`wfdfkapapbhcuefchcuau`bbz`jacccf``vdidvat`y````", +"``````a`epfoczdv`baoacefbxbzcscr`pfi`fcochchezez`mavekdcecfmfmdmfa`wdlapexcdcddmaabbazes`wfd`lan`maqaibwehapcofiauauau`befalbcdp`ddvfodieiat````", +"````````ata`difbftao`a`bbzfu`bagbzfdbrfiandoaiaifp`wekeqfw`wfkeke`apckaqelecerfkckcdfherer`ufk`wbyaqaidoanamanbzcufx`b`pbgbcbgccagdieiczep``````", +"````````at`yfgf`difbctagbzascrbcefaubififx`lananezdo`mcidhapav`uelcddcecape`dcflfaekbkeqekdwcofkfiapaidgefchbic`ffalftaldvf`bpf`fbdidia`a```````", +"````````at`yczddeiaof`dvfb`jbgccasc`crbhcrfpenchchcoanekeh`we``wfkelececaaek`qcdaqfk`ufiezdgdwfman`lbhenfzfzaifpcealcraoaodueobeajdifg`ya```````", +"``````````a`bueibueiajajddddbcbgalbzfcbh`j`pfpdoaichchavapdodmbtbyad`mfkbydweccfckaielfmbybt`l`mcodwanaxaxenbifxbzdsbxf`ftacfndkajfofgfg````````", +"``````````a``teifgbubeftdvafccbgalamef`j`dbxcofkaqcodo`famdgdeanaidqanape``me`fiaianfk`m`mbwfdapaqfzffenfpc`bhfu`pftagagft`jddddfofofga`````````", +"````````````fg`tbueibpf`dvevfbevbgfpfpcrenbxaxamfiananfkbiaxfpezezfxfkecbwbifzch`mezfiamdocochfi`lcobibibzfpfpbzcufjevccac`efgbubu`tej``````````", +"`````````````tbu`rejf`aodidvdjfcagacbzbhaxdochfxanfzfpbiaichanbychchchbt`lfzbhezcofxaiaichchaufzc`fxch`jdoffenefbgalbgbcbccceiddfo`y`r``````````", +"```````````````rejeifodvdvajacbcccccdgbibxfpdgaufuezfz`manfzanfxaufp`fcodocoezchchenauchfxchefff`jagffbxenbzbi`dftbc`edz`df`buddbudd````````````", +"```````````````y`rbuf`diaoajacbgevevcrfpfpfp`afffffc`faqfxchchfzc`dgfxdgbjfxaiaiancofxfpcodg`bffds`adgbxbzbz`e`v`vftbeev`zajf`ddei`t````````````", +"`````````````````yfoeyfbaj`zajbgevakalbxcccu`e`b`bc`efbic`axaxchfxfpezchbjfcdodochfx`fanbzcuaufxcv`bfp`pef`e`eeoeoaof`f`ajdv`rfn`r``````````````", +"``````````````````cn`rejeidvacdveoak`vccccfffpbibx`ac``jcucu`jfxbifxfpfxfxfxcodgc`aybiai`i`jch`j`a`edjagacbc`x`zfnddajf`eodvey`t````````````````", +"``````````````````eybfej`rejfoaoevcccc`v`xbcc`c`fffpbicubxcucuffc`cu`pfcfpdgbhdoaucu`jcuffbxbx`bcr`efjagbcfjeodkeodkevddfobpcney````````````````", +"````````````````````eyejbpejbpdddvaoaodjbcagbcft`jefchfxbiauc``a`ac`c`fc`afcfccufcenfp`jfffp`jdsfpftcycrbcccdz`zdkbebebfddbf`r``````````````````", +"``````````````````````cnbpeyfofofodudd`eacdjafcr`d`dcufpffef`jca`bff`jfcbxcuc`dsaecv`d`jds`dcy`vag`xagbcfteo`zbpfnbpbfej`r`r````````````````````", +"````````````````````````d`bpddbfbebgak`zfj`z`kdsdsbxffff`bdj`b`b`jcucucudgcueffp`b`bcacacvcvctct`dagcyfjccevddeoeybpd`ej`r``````````````````````", +"``````````````````````````eyddbp`r`k`z`zdzem`kfjfj`b`d`vdjcyctctcactctcv`dcr`bcvctaeaecv`b`jfjdsccakcveoakbedz`zd`ahewah````````````````````````", +"````````````````````````````ewcnbnbndd`kdzfjdzemakemae`zcv`dcaaeaecy`e`acadsag`vaeaecvakaffjcacrbcajfj`zbp`z`kfnewewcn``````````````````````````", +"```````````````````````````````rewbfbp`z`zbedzafcyakembeafctcaak`d`v`acvaeae`dff`dag`baeakfj`zcy`zbm`z`z`k`zbfd`ahcn````````````````````````````", +"```````````````````````````````````sd`eyfnbmeobm`zdz`saf`v`k`kcvbcag`bcvemaeaecvagcyaecvevafaf`zem`zd`dkbmd`bfbf````````````````````````````````", +"````````````````````````````````````ahewfoewbf`k`z`zdz`zafemememcvaf`kdz`vafaeafakemembmbpafdkdkbp`k`zbp`seyah``````````````````````````````````", +"`````````````````````````````````````````sah`zewdk`z`zdzaeaf`kemdzakakaeae`kemakemeo`z`kemdkbfbpdk`kd`d`bn``````````````````````````````````````", +"````````````````````````````````````````````ahbnbf`zd`d``sbm`kdz`sdkdk`sae`k`zbmd``k`sbmdz`kbnah`s`sbn``````````````````````````````````````````", +"````````````````````````````````````````````````bncnbmbnd`dkdkdkdkbm`sbnbnbndzd`d``sbm`sbfd`bnewah``````````````````````````````````````````````", +"``````````````````````````````````````````````````````cnd``s`s`sahd`dkbmbnbn`sbnd`bnbn`newah````````````````````````````````````````````````````", +"``````````````````````````````````````````````````````````````ahcn`sbnahewbn`sewahbn````````````````````````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````", +"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````" +}; +char **default_bubbles[] = {glass1, glass2, glass3, glass4, glass5, glass6, glass7, glass8, glass9, glass10, glass11, (char **)0}; + +int num_default_bubbles = 11; + +#endif /* NO_DEFAULT_BUBBLE */ diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com new file mode 100644 index 00000000..b65f53eb --- /dev/null +++ b/hacks/compile_axp.com @@ -0,0 +1,51 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES_DEFAULT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FRACT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.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]) PYRO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XROGER-HACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE,XLOCKMORE)/INCL=([],[-],[-.UTILS])/OBJ=SCREENHACK-XLOCK.OBJ SCREENHACK.C diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com new file mode 100644 index 00000000..b65f53eb --- /dev/null +++ b/hacks/compile_decc.com @@ -0,0 +1,51 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES_DEFAULT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FRACT.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.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]) PYRO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XROGER-HACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE,XLOCKMORE)/INCL=([],[-],[-.UTILS])/OBJ=SCREENHACK-XLOCK.OBJ SCREENHACK.C diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c new file mode 100644 index 00000000..60450049 --- /dev/null +++ b/hacks/decayscreen.c @@ -0,0 +1,139 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* decayscreen + * + * Based on slidescreen program from the xscreensaver application and the + * decay program for Sun framebuffers. This is the comment from the decay.c + * file: + + * decay.c + * find the screen bitmap for the console and make it "decay" by + * randomly shifting random rectangles by one pixelwidth at a time. + * + * by David Wald, 1988 + * rewritten by Natuerlich! + * based on a similar "utility" on the Apollo ring at Yale. + + * X version by + * + * Vivek Khera + * 5-AUG-1993 + */ + +#include "screenhack.h" + +static int sizex, sizey; +static int delay; +static GC gc; + +static void +init_decay (Display *dpy, Window window) +{ + XGCValues gcv; + XWindowAttributes xgwa; + + delay = get_integer_resource ("delay", "Integer"); + + if (delay < 0) delay = 0; + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCForeground |GCFunction | GCSubwindowMode, + &gcv); + + XGetWindowAttributes (dpy, window, &xgwa); + sizex = xgwa.width; + sizey = xgwa.height; + + grab_screen_image (xgwa.screen, window); +} + + +/* + * perform one iteration of decay + */ +static void +decay1 (Display *dpy, Window window) +{ + int left, top, width, height; + +#define nrnd(x) (random() % (x)) + + switch (random() % 8) { + case 0: /* move a block left */ + case 1: + left = nrnd(sizex - 1) + 1; + top = nrnd(sizey); + width = nrnd(sizex - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left - 1, top); + break; + case 2: /* move a block right */ + case 3: + left = nrnd(sizex - 1); + top = nrnd(sizey); + width = nrnd(sizex - 1 - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left + 1, top); + break; + case 4: /* move a block up */ + left = nrnd(sizex); + top = nrnd(sizey - 1) + 1; + width = nrnd(sizex - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left, top - 1); + break; + default: /* move block down (biased to this) */ + left = nrnd(sizex); + top = nrnd(sizey - 1); + width = nrnd(sizex - left); + height = nrnd(sizey - 1 - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left, top + 1); + break; + } + XSync (dpy, True); +#undef nrnd +} + + +char *progclass = "DecayScreen"; + +char *defaults [] = { + "*dontClearRoot: True", + +#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ + "*visualID: Best", +#endif + + "*delay: 10", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_decay (dpy, window); + while (1) { + decay1 (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/decayscreen.1 b/hacks/decayscreen.man similarity index 100% rename from local/man/man.1/decayscreen.1 rename to hacks/decayscreen.man diff --git a/hacks/deco.c b/hacks/deco.c new file mode 100644 index 00000000..bd9e62d8 --- /dev/null +++ b/hacks/deco.c @@ -0,0 +1,152 @@ +/* xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * Concept snarfed from Michael D. Bayne in + * http://www.go2net.com/internet/deep/1997/04/16/body.html + */ + +#include "screenhack.h" +#include + +static XColor colors[255]; +static int ncolors = 0; +static int max_depth = 0; +static int min_height = 0; +static int min_width = 0; + +static void +deco (Display *dpy, + Window window, + Colormap cmap, + GC fgc, GC bgc, + int x, int y, int w, int h, int depth) +{ + if (((random() % max_depth) < depth) || (w < min_width) || (h < min_height)) + { + if (!mono_p) + { + static int current_color = 0; + if (++current_color >= ncolors) + current_color = 0; + XSetForeground(dpy, bgc, colors[current_color].pixel); + } + XFillRectangle (dpy, window, bgc, x, y, w, h); + XDrawRectangle (dpy, window, fgc, x, y, w, h); + } + else + { + if (random() & 1) + { + deco (dpy, window, cmap, fgc, bgc, x, y, w/2, h, depth+1); + deco (dpy, window, cmap, fgc, bgc, x+w/2, y, w/2, h, depth+1); + } + else + { + deco (dpy, window, cmap, fgc, bgc, x, y, w, h/2, depth+1); + deco (dpy, window, cmap, fgc, bgc, x, y+h/2, w, h/2, depth+1); + } + } +} + + +char *progclass = "Deco"; + +char *defaults [] = { + "Deco.background: black", /* to placate SGI */ + "Deco.foreground: white", + "*maxDepth: 12", + "*minWidth: 20", + "*minHeight: 20", + "*cycle: False", + "*delay: 5", + "*cycleDelay: 1000000", + "*ncolors: 64", + 0 +}; + +XrmOptionDescRec options [] = { + { "-max-depth", ".maxDepth", XrmoptionSepArg, 0 }, + { "-min-width", ".minWidth", XrmoptionSepArg, 0 }, + { "-min-height", ".minHeight", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + GC fgc, bgc; + XGCValues gcv; + XWindowAttributes xgwa; + int delay = get_integer_resource ("delay", "Integer"); + int cycle_delay = get_integer_resource ("cycleDelay", "Integer"); + Bool writable = get_boolean_resource ("cycle", "Boolean"); + + max_depth = get_integer_resource ("maxDepth", "Integer"); + if (max_depth < 1) max_depth = 1; + else if (max_depth > 1000) max_depth = 1000; + + min_width = get_integer_resource ("minWidth", "Integer"); + if (min_width < 2) min_width = 2; + min_height = get_integer_resource ("minHeight", "Integer"); + if (min_height < 2) min_height = 2; + + XGetWindowAttributes (dpy, window, &xgwa); + + gcv.foreground = get_pixel_resource("foreground", "Foreground", + dpy, xgwa.colormap); + fgc = XCreateGC (dpy, window, GCForeground, &gcv); + + gcv.foreground = get_pixel_resource("background", "Background", + dpy, xgwa.colormap); + bgc = XCreateGC (dpy, window, GCForeground, &gcv); + + ncolors = get_integer_resource ("ncolors", "Integer"); + + make_random_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors, + False, True, &writable, True); + + if (ncolors <= 2) + mono_p = True; + + if (!mono_p) + { + GC tmp = fgc; + fgc = bgc; + bgc = tmp; + } + + while (1) + { + XGetWindowAttributes (dpy, window, &xgwa); + XFillRectangle(dpy, window, bgc, 0, 0, xgwa.width, xgwa.height); + deco (dpy, window, xgwa.colormap, fgc, bgc, + 0, 0, xgwa.width, xgwa.height, 0); + XSync (dpy, True); + + if (!delay) continue; + if (!writable) + sleep (delay); + else + { + time_t start = time((time_t) 0); + while (start - delay < time((time_t) 0)) + { + rotate_colors (dpy, xgwa.colormap, colors, ncolors, 1); + if (cycle_delay) + usleep (cycle_delay); + } + } + } +} diff --git a/local/man/man.1/deco.1 b/hacks/deco.man similarity index 100% rename from local/man/man.1/deco.1 rename to hacks/deco.man diff --git a/hacks/default.xbm b/hacks/default.xbm new file mode 100644 index 00000000..dcd2ff50 --- /dev/null +++ b/hacks/default.xbm @@ -0,0 +1,1686 @@ +#define logo_width 464 +#define logo_height 435 +static unsigned char logo_bits[] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x60, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x60,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x0f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfc,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfc,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf8,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xdf,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xdf,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x8f, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xff,0xff,0x07,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xff,0xff,0x07,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0x07,0xfe,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0x03,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0x03,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0xfc, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0xff,0xff,0,0xf0,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xe0,0xff,0xff,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0x07,0,0, +0x80,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0xff,0x03,0,0,0xe0,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0,0,0,0,0,0xe0,0xff,0x07,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0x7f,0xfe,0,0,0,0,0,0,0xfc,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x01,0xfe, +0x01,0,0,0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x01,0xfe,0x01,0, +0,0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0x07,0,0xce,0x07,0,0,0, +0,0,0,0xfe,0x1f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0x7f,0,0,0x87,0x1f,0,0,0,0,0, +0,0xc0,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0x07,0,0x80,0x03,0x3e,0,0,0,0,0,0,0, +0xfe,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0x3f,0,0,0x80,0x03,0xf8,0,0,0,0,0,0,0,0xe0,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0x3f,0, +0,0x80,0x03,0xf8,0,0,0,0,0,0,0,0xe0,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x07,0,0,0xc0, +0x01,0xe0,0x01,0,0,0,0,0,0,0,0xff,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0xc0,0xfb,0xff, +0x0f,0,0,0,0,0,0,0,0xf0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0xff,0x07,0,0xc0,0xff,0xff,0x3f,0, +0,0,0,0,0,0,0x80,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xc0,0xff,0x7f,0,0xe0,0xff,0xff,0x7f,0,0,0, +0,0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0xff,0xc0,0xff,0x7f,0,0xe0,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0x1f, +0,0xf8,0xff,0x0f,0xf0,0x0f,0xc0,0xff,0x01,0,0,0,0,0,0, +0,0xf0,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xe0,0x0f,0,0, +0xff,0x7f,0xf0,0x01,0,0xf8,0x03,0,0,0,0,0,0,0,0xc0, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0,0x80,0xff, +0x7b,0,0,0xe0,0x07,0,0,0,0,0,0,0,0,0xfe,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf8,0,0,0,0,0xfc,0x3f,0, +0,0x80,0x1f,0,0,0,0,0,0,0,0,0xf0,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0,0,0,0,0xfc,0x3f,0,0,0x80, +0x1f,0,0,0,0,0,0,0,0,0xf0,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x3c,0,0,0,0,0xe0,0x7f,0,0,0,0x7e,0, +0,0,0,0,0,0,0,0xe0,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x3e,0,0,0,0,0,0xff,0x03,0,0,0x70,0,0,0, +0,0,0,0,0,0x80,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0x0f, +0,0,0,0,0,0xf0,0x1f,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0x0f,0,0, +0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0, +0,0,0xf8,0x07,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0,0,0, +0xf8,0x07,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0x03,0,0,0,0,0,0,0xe0,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x01,0,0,0,0,0,0,0x80,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf8,0x01,0,0,0,0,0,0,0,0xfc,0x07,0,0,0, +0,0,0,0,0,0,0,0,0x7c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8, +0,0,0,0xfe,0x03,0,0,0,0xf0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0,0, +0,0xfe,0x03,0,0,0,0xf0,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0,0,0xf0,0xff, +0x1f,0,0,0,0x80,0x7f,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3f,0,0,0xfc,0xff,0x7f,0, +0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0,0, +0xc0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0x1f,0,0,0xff,0x47,0x7f,0,0,0, +0,0xf8,0x0f,0,0,0,0,0,0,0,0,0,0,0x80,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0,0,0,0,0xc0, +0xff,0,0,0,0,0,0,0,0,0,0,0,0x3e,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0,0,0,0,0xc0,0xff,0, +0,0,0,0,0,0,0,0,0,0,0x3e,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0x03,0xc0,0xff,0xfe,0xff,0x7d,0,0,0,0,0x80,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0x7c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0,0x40, +0,0,0xfe,0x7f,0,0,0,0,0x80,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x3f,0,0,0x80,0x03, +0xf8,0x3f,0,0,0,0,0x80,0xe7,0x1f,0,0,0,0,0,0, +0,0,0,0,0xf0,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0x0f,0,0,0xf0,0xff,0xff,0x1f, +0,0,0,0,0x80,0xc7,0x7f,0,0,0,0,0,0,0,0, +0,0,0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0x0f,0,0,0xf0,0xff,0xff,0x1f,0,0, +0,0,0x80,0xc7,0x7f,0,0,0,0,0,0,0,0,0,0, +0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0xff,0x03,0,0,0xf0,0xff,0xff,0x0f,0,0,0,0, +0xc0,0x0f,0xff,0x01,0,0,0,0,0,0,0,0,0,0xc0,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0x7f,0,0,0,0xc0,0xff,0xff,0x01,0,0,0,0,0xc0,0x0f, +0xfc,0x07,0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0x0f,0xf0,0x0f, +0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x80,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0xe0,0x1f,0x80,0x3f,0,0, +0,0,0,0,0,0,0,0,0x1c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0x1c,0,0xfe,0x03,0,0,0, +0,0,0,0,0,0,0x78,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0x1c,0,0xfe,0x03,0,0,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0x70,0x1c,0,0xf0,0x07,0,0,0,0,0,0,0, +0,0,0xf0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x3f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x70,0x38,0,0xc0,0x1f,0,0,0,0,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0x70, +0x78,0,0,0x7f,0,0,0,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0, +0,0xfc,0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x70,0x70,0,0,0xfc, +0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0x01,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x38,0x70,0,0,0xfe,0x03,0xfe, +0x7f,0,0,0,0,0,0,0,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x38,0xf0,0,0,0xfe,0x0f,0xff,0xff,0x01, +0,0,0,0,0,0,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x18,0xe0,0,0x80,0x9f,0xff,0x3f,0xfe,0x03,0,0, +0,0,0,0,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x1c,0xe0,0,0x80,0x0f,0xff,0x07,0xc0,0x0f,0,0,0,0, +0,0,0x1e,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1c,0xe0,0,0x80,0x0f,0xff,0x07,0xc0,0x0f,0,0,0,0,0,0, +0x1e,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xf1, +0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0x0e,0xe0, +0,0xc0,0x07,0xfc,0x01,0,0x1f,0,0,0,0,0,0,0x3e,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xe1,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0x0e,0xe0,0x01,0xe0, +0x03,0x60,0,0,0x38,0,0,0,0,0,0,0x3c,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xc3,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0x07,0xc0,0x01,0xf0,0x01,0, +0xe0,0x03,0xf0,0,0,0,0,0,0,0x38,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0x07,0xf0,0x03,0,0,0,0, +0,0,0,0,0,0,0,0x07,0xc0,0x03,0xf8,0,0,0xf8,0x1f, +0xe0,0,0,0,0,0,0,0x38,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0x07,0xf0,0x03,0,0,0,0,0,0, +0,0,0,0,0,0x07,0xc0,0x03,0xf8,0,0,0xf8,0x1f,0xe0,0, +0,0,0,0,0,0x38,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0x0f,0xc0,0x07,0,0,0,0,0,0,0,0, +0,0,0,0x07,0x80,0x03,0x78,0,0,0xf8,0x7f,0xe0,0x01,0,0, +0,0,0,0x78,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x0f,0x80,0x0f,0,0,0,0,0,0,0,0,0,0, +0x80,0x03,0x80,0x03,0x3e,0,0,0x78,0x7e,0xc0,0x03,0,0,0,0, +0,0x78,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1e,0x1c,0x0f,0,0,0,0,0,0,0,0,0,0,0x80,0xf3, +0x9f,0x03,0x1f,0,0,0,0xf0,0x80,0x03,0,0,0,0,0,0x70, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e,0xfe, +0x0f,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x07, +0x0f,0,0,0,0xe0,0,0x07,0,0,0,0,0,0x70,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x1e,0xfe,0x0f,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x07,0x0f,0, +0,0,0xe0,0,0x07,0,0,0,0,0,0x70,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x7c,0xfc,0x0f,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x87,0x07,0,0,0, +0xe0,0,0x07,0,0,0,0,0,0x70,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x7c,0xf8,0x0f,0,0,0,0,0, +0,0,0,0,0,0xc0,0x3f,0xf4,0xc7,0x07,0,0,0,0xe0,0, +0x07,0,0,0,0,0,0x70,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0x01,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0x03,0x80,0xe7,0x01,0,0,0,0xe0,0,0x07,0, +0,0,0,0,0xe0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0,0,0xff,0x01,0,0,0,0xe0,0x80,0x07,0,0,0, +0,0,0xe0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xff,0,0,0,0,0xf8,0x80,0x03,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff,0,0,0,0,0xf8,0x80,0x03,0,0,0,0,0,0xe0,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0x07,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x7e,0, +0,0,0,0x7c,0xc0,0x01,0,0,0,0,0,0xe0,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x3e,0,0x80,0x07, +0xe0,0x3f,0xe0,0x01,0,0,0,0,0,0xc0,0x01,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1e,0,0xc0,0xff,0xff,0x0f, +0xe0,0,0,0,0,0,0,0xc0,0x01,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x1e,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x1f,0,0xe0,0xff,0xff,0x03,0xe0,0, +0,0,0,0,0,0xc0,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1e,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1f,0,0xe0,0xff,0xff,0x03,0xe0,0,0,0, +0,0,0,0xc0,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x3f,0,0x1e,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0x07,0,0x80,0xff,0x7f,0,0xf8,0x01,0,0,0,0, +0,0xc0,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x03,0x1e,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0x07,0,0,0,0,0,0xfc,0x07,0,0,0,0,0,0xc0, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x1e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x03, +0,0,0,0,0,0xfe,0x0f,0,0,0,0,0,0xc0,0x01,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0, +0,0,0x80,0xcf,0x3f,0,0,0xfe,0x01,0,0xc0,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0,0,0, +0x80,0xcf,0x3f,0,0,0xfe,0x01,0,0xc0,0x01,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0,0,0,0,0,0xe0,0xe7, +0xff,0,0,0xfe,0x0f,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x03,0,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0x03,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x7c,0,0,0,0,0xf0,0xff,0xf9,0xff,0x01, +0,0xe0,0x1f,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0x03,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x03,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x7e,0,0,0,0xc0,0xff,0x7f,0xfe,0xe1,0x07,0,0xc0, +0xff,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x01,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x03,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x1e,0,0,0,0xfc,0xff,0x1f,0xff,0x81,0x0f,0,0x80,0xf1,0x03, +0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0, +0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e, +0,0,0,0xfc,0xff,0x1f,0xff,0x81,0x0f,0,0x80,0xf1,0x03,0xc0,0xe1, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0xc0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x81,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1f,0,0, +0,0xff,0x3f,0x80,0xff,0,0x1f,0,0x80,0xc1,0x07,0xc0,0xe1,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0x03,0xc0,0x3f, +0,0xe0,0x7f,0,0x7e,0,0x80,0x01,0x1f,0xe0,0xe1,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0xfc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0x80,0x0f,0x80,0x07,0xf0,0x07,0,0xf0, +0x3f,0,0xf8,0,0x80,0x01,0x3c,0xe0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x03,0,0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0xc0,0x03,0x80,0xff,0xff,0x01,0,0xfc,0x1f,0, +0xf0,0x01,0xc0,0x01,0x38,0xe0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x7f,0xf0,0,0xf8,0xff,0x07,0,0,0,0,0,0, +0,0,0,0xe0,0x03,0,0xfe,0x1f,0,0x80,0xbf,0x07,0,0x80,0x07, +0xc0,0x01,0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f, +0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x7f,0xf0,0,0xf8,0xff,0x07,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0xfe,0x1f,0,0x80,0xbf,0x07,0,0x80,0x07,0xc0,0x01, +0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,0, +0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, +0xf0,0,0,0xfe,0x7f,0,0,0,0,0,0,0,0,0,0xf0, +0x01,0,0xf8,0x03,0,0xc0,0xcf,0x03,0,0x80,0x1f,0xf0,0x01,0xe0,0x71, +0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0, +0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0, +0,0xe0,0xff,0x03,0,0,0,0,0,0,0,0,0xf8,0,0, +0,0,0,0xe0,0xe7,0x03,0,0,0x7e,0xff,0,0xc0,0x73,0xf0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0xfc, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xf0,0,0,0, +0xfc,0x1f,0,0,0,0,0,0,0,0,0x78,0,0,0,0, +0,0xf8,0xf3,0,0,0,0xfc,0x7f,0,0,0x7f,0xf0,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0xf0,0,0,0,0xe0,0xff, +0,0,0,0,0,0,0,0,0x3c,0,0,0,0,0,0x7c, +0xf8,0,0,0,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x1f, +0,0,0,0,0,0,0,0xf0,0,0,0,0xe0,0xff,0,0, +0,0,0,0,0,0,0x3c,0,0,0,0,0,0x7c,0xf8,0, +0,0,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x3f,0,0, +0,0,0,0,0,0x70,0,0,0,0x80,0xff,0x0f,0,0,0, +0,0,0,0,0x3e,0,0,0,0,0,0x7f,0x7c,0,0,0, +0xe0,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f, +0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0,0,0,0, +0,0,0,0x78,0,0,0,0,0xfe,0x7f,0,0,0,0,0, +0,0,0x1e,0,0,0,0,0xc0,0x1f,0x3e,0,0,0,0xc0,0xff, +0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0, +0,0,0,0,0,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0, +0,0x7c,0,0,0,0,0xf0,0xff,0x03,0,0,0,0,0,0, +0x0f,0,0,0,0,0xe0,0x07,0x1f,0,0,0,0x80,0x0f,0,0, +0x3c,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0xfc,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0x3c, +0,0,0,0,0,0xfe,0x0f,0,0,0,0,0,0,0x0f,0, +0,0,0,0xfc,0x83,0x0f,0,0,0,0,0x0f,0,0,0x38,0xf0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0x3c,0,0, +0,0,0,0xfe,0x0f,0,0,0,0,0,0,0x0f,0,0,0, +0,0xfc,0x83,0x0f,0,0,0,0,0x0f,0,0,0x38,0xf0,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0xf0, +0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0x1e,0,0,0,0xf8, +0xff,0xff,0x3f,0,0,0,0,0,0x80,0x07,0,0,0,0,0xff, +0x80,0x07,0,0,0,0,0x3e,0,0,0x38,0,0,0,0,0, +0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0x0f,0,0,0,0xff,0xff,0xff, +0xff,0x03,0,0,0,0,0xe0,0x01,0,0,0,0xe0,0x1f,0xe0,0x03, +0,0,0,0,0x78,0,0,0x1c,0,0,0,0,0xe0,0xff,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff, +0,0,0,0,0,0x80,0x0f,0,0,0,0xff,0x3f,0xe0,0xff,0x0f, +0,0,0,0,0xf0,0x01,0,0,0,0xf8,0x07,0xf0,0x01,0,0, +0,0,0xf0,0x01,0,0x1e,0,0,0,0,0xf0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x03,0, +0,0,0,0x80,0x07,0,0,0,0xe0,0xff,0x01,0xfe,0x3f,0,0, +0,0,0xf0,0,0,0,0,0xfe,0x01,0xf8,0,0,0,0,0, +0xc0,0x03,0,0x0e,0,0,0,0,0xfc,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x03,0,0,0, +0,0x80,0x07,0,0,0,0xe0,0xff,0x01,0xfe,0x3f,0,0,0,0, +0xf0,0,0,0,0,0xfe,0x01,0xf8,0,0,0,0,0,0xc0,0x03, +0,0x0e,0,0,0,0,0xfc,0xff,0xff,0xff,0x01,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0x07,0,0,0,0,0x80, +0x07,0,0,0,0,0xf8,0x07,0xc0,0xff,0x01,0,0,0,0xf8,0, +0,0,0x80,0x7f,0,0x78,0,0,0,0,0,0xc0,0x0f,0,0x0e, +0,0,0,0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0x1f,0,0,0,0,0xc0,0xe3,0xff, +0xff,0,0,0xc0,0x1f,0x80,0xff,0x03,0,0,0,0x3c,0,0,0, +0xe0,0x1f,0,0x3e,0,0,0,0,0,0,0x0f,0,0x07,0,0, +0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x7f,0,0,0,0,0xc0,0xfb,0xff,0xff,0x0f, +0,0,0x3e,0x80,0xf3,0x1f,0,0,0,0x3e,0,0,0,0xf8,0x07, +0,0x1e,0,0,0,0,0,0,0x1e,0,0x07,0,0,0,0xe0, +0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0xff,0xff,0xff,0xff,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0,0, +0x7c,0xc0,0x81,0xff,0,0,0,0x1f,0,0,0,0xff,0x01,0,0x0f, +0,0,0,0,0,0,0x7c,0x80,0x07,0,0,0,0xf0,0xff,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0xff,0xff,0x03,0,0,0,0xc0,0x7f,0,0xe0,0xff,0x3f,0,0xf0,0xc0, +0x01,0xfe,0x03,0,0,0x0f,0,0,0xc0,0x7f,0,0xc0,0x07,0,0, +0,0,0,0,0xf0,0xc0,0x03,0,0,0,0xfc,0xff,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff, +0x03,0,0,0,0xc0,0x7f,0,0xe0,0xff,0x3f,0,0xf0,0xc0,0x01,0xfe, +0x03,0,0,0x0f,0,0,0xc0,0x7f,0,0xc0,0x07,0,0,0,0, +0,0,0xf0,0xc0,0x03,0,0,0,0xfc,0xff,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0x07,0, +0,0,0xc0,0x0f,0,0,0xfc,0xff,0x03,0xc0,0xe3,0x01,0xf0,0x07,0, +0x80,0x07,0,0,0xf0,0x1f,0,0xc0,0x07,0,0,0,0,0,0, +0xf0,0xc1,0x01,0,0,0,0xff,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0,0, +0xc0,0x07,0,0,0,0xfc,0xff,0,0xf7,0,0,0x3f,0,0xc0,0x03, +0,0,0xff,0,0,0xe0,0x01,0,0,0,0,0,0,0xc0,0xe3, +0x01,0,0,0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0,0,0,0xc0,0x01, +0,0,0,0xc0,0xff,0x07,0x7f,0,0,0xfc,0,0xe0,0x03,0,0xe0, +0x3f,0,0,0xf0,0x01,0,0,0,0,0,0,0x80,0xff,0,0, +0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0xff,0xff,0xff,0,0,0,0xc0,0x01,0,0, +0,0,0xfe,0x7f,0x7f,0,0,0xf8,0x01,0xe0,0x01,0,0xfc,0x07,0, +0,0xf8,0,0,0,0,0,0,0,0,0xff,0,0,0,0xfc, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfe,0xff,0xff,0xff,0,0,0,0xc0,0x01,0,0,0,0, +0xfe,0x7f,0x7f,0,0,0xf8,0x01,0xe0,0x01,0,0xfc,0x07,0,0,0xf8, +0,0,0,0,0,0,0,0,0xff,0,0,0,0xfc,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x03,0,0,0xc0,0x03,0,0,0,0,0xe0,0xff, +0x3f,0,0,0xf0,0x07,0xf0,0,0,0xff,0x03,0,0,0x7c,0,0, +0,0,0,0,0,0,0x7e,0,0,0,0xff,0xff,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0x0f,0,0,0xc0,0x03,0,0,0,0,0,0xfe,0x3f,0, +0,0xc0,0x3f,0xf8,0,0xf8,0x3f,0,0,0,0x3c,0,0,0,0, +0,0,0,0,0x3c,0,0,0x80,0xff,0xff,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff, +0x3f,0,0,0xc0,0x03,0,0,0,0,0,0xf0,0xff,0x0f,0,0, +0x7f,0x7c,0,0xfe,0x07,0,0,0,0x1e,0,0,0,0,0,0, +0,0,0x1e,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0, +0,0x80,0x07,0,0,0,0,0,0,0xff,0x7f,0,0,0xfc,0x3e, +0xe0,0x7f,0,0,0,0,0x1f,0,0,0,0,0,0,0,0, +0x1f,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0,0,0x80, +0x07,0,0,0,0,0,0,0xff,0x7f,0,0,0xfc,0x3e,0xe0,0x7f, +0,0,0,0,0x1f,0,0,0,0,0,0,0,0,0x1f,0, +0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x01,0,0x80,0x0f,0, +0,0,0,0,0,0xf0,0xff,0x1f,0,0xf0,0x1f,0xfe,0x0f,0,0, +0,0x80,0x0f,0,0,0,0,0,0,0,0,0x07,0,0,0xfc, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0x0f,0,0,0, +0,0,0,0,0xfc,0xff,0x3f,0xc0,0xff,0xff,0,0,0,0,0xc0, +0x07,0,0,0,0,0,0,0,0x80,0x03,0,0,0xff,0xff,0xff, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0x0f,0,0,0x1e,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0x1f,0,0,0,0,0xe0,0x03,0, +0,0,0,0,0,0,0xe0,0x03,0,0xc0,0xff,0xff,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0xff,0xff,0xff,0x7f,0,0,0x3c,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0xff,0x03,0,0,0,0,0xf0,0x01,0,0,0, +0,0,0,0,0xf8,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0xff,0x7f,0,0,0x3c,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0x03,0,0,0,0,0xf0,0x01,0,0,0,0,0, +0,0,0xf8,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0xff,0,0,0x78,0,0,0,0,0,0,0,0,0,0,0xf8, +0xff,0x1f,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0x7c,0,0,0xfc,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03, +0,0xf0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0x7f, +0,0,0,0,0x7c,0,0,0,0,0,0,0,0,0x3e,0, +0,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0,0xe0, +0x01,0,0,0,0,0,0,0,0,0,0,0x7c,0xfe,0,0, +0,0,0x3c,0,0,0,0,0,0,0,0x80,0x1f,0,0xc0,0xff, +0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0xc0,0x03,0, +0,0,0,0,0,0,0,0,0,0x78,0xf8,0x03,0,0,0, +0x1e,0,0,0,0,0,0,0,0xc0,0x07,0,0xe0,0xff,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0,0x80,0x07,0,0,0, +0,0,0,0,0,0,0,0x70,0xe0,0x0f,0,0,0,0x0f,0, +0,0,0,0,0,0,0xf0,0x03,0,0xf8,0xff,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xff,0xff,0x7f,0,0x80,0x07,0,0,0,0,0, +0,0,0,0,0,0x70,0xe0,0x0f,0,0,0,0x0f,0,0,0, +0,0,0,0,0xf0,0x03,0,0xf8,0xff,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0xff,0xff,0,0x80,0x0f,0,0,0,0,0,0,0, +0,0,0,0x70,0,0x3f,0,0,0x80,0x0f,0,0,0,0,0, +0,0,0xf8,0x01,0,0xfe,0xff,0xff,0x7f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0xff,0xff,0xff,0x03,0,0x1f,0,0,0,0,0,0,0,0,0, +0,0x70,0,0xfe,0,0,0xc0,0x03,0,0,0,0,0,0,0, +0x7e,0,0x80,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0x0f,0,0x3e,0,0,0,0,0,0,0,0,0,0,0x70, +0,0xf8,0x01,0,0xc0,0x03,0,0,0,0,0,0,0,0x3e,0, +0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f, +0,0xf8,0,0,0,0,0,0,0,0,0,0,0x70,0,0x80, +0x0f,0,0xf0,0x01,0,0,0,0,0,0,0xc0,0x0f,0,0xf8,0xff, +0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f,0,0xf8, +0,0,0,0,0,0,0,0,0,0,0x70,0,0x80,0x0f,0, +0xf0,0x01,0,0,0,0,0,0,0xc0,0x0f,0,0xf8,0xff,0xff,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0,0xe0,0x01,0, +0,0,0,0,0,0,0,0,0x70,0,0,0x3e,0,0xf0,0, +0,0,0,0,0,0,0xe0,0x07,0,0xfe,0xff,0xff,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03,0xc0,0x03,0,0,0, +0,0,0,0,0,0,0x70,0,0,0xfc,0,0x78,0,0,0, +0,0,0,0,0xf8,0x01,0x80,0xff,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0x0f,0xc0,0x07,0,0,0,0,0, +0,0,0,0,0x78,0,0,0xe0,0x03,0x3c,0,0,0,0,0, +0,0,0x7c,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x1f,0,0x0f,0,0,0,0,0,0,0, +0,0,0x7c,0,0,0xc0,0x1f,0x1e,0,0,0,0,0,0,0, +0x3e,0,0xf0,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0x1f,0,0x0f,0,0,0,0,0,0,0,0,0, +0x7c,0,0,0xc0,0x1f,0x1e,0,0,0,0,0,0,0,0x3e,0, +0xf0,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff, +0xff,0x7f,0,0x1e,0,0,0,0,0,0,0,0,0,0x7c,0, +0,0,0x3f,0x0f,0,0,0,0,0,0,0x80,0x0f,0,0xfc,0xff, +0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff, +0x01,0x7c,0,0,0,0,0,0,0,0,0,0x3c,0,0,0, +0xfc,0x0f,0,0,0,0,0,0,0xe0,0x07,0,0xff,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03,0x78, +0,0,0,0,0,0,0,0,0,0x3c,0,0,0,0xf8,0x07, +0,0,0,0,0,0,0xf0,0x01,0xc0,0xff,0xff,0xff,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0, +0,0,0,0,0,0,0,0x1c,0,0,0,0xfc,0x03,0,0, +0,0,0,0,0xf8,0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0,0,0, +0,0,0,0,0,0x1c,0,0,0,0xfc,0x03,0,0,0,0, +0,0,0xf8,0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0xff,0x1f,0xe0,0x03,0,0,0,0,0, +0,0,0,0x1c,0,0,0,0xfc,0x01,0,0,0,0,0,0, +0x7e,0,0xf8,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xff,0xff,0xff,0xff,0x80,0x0f,0,0,0,0,0,0,0, +0,0x1e,0,0,0,0xff,0,0,0,0,0,0,0x80,0x0f,0, +0xfe,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x01,0x1f,0,0,0,0,0,0,0,0,0x0e, +0,0,0x80,0x7f,0,0,0,0,0,0,0xc0,0x07,0x80,0xff,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0xff,0xff,0x07,0x3e,0,0,0,0,0,0,0,0,0x0e,0,0, +0xc0,0x3f,0,0,0,0,0,0,0xf0,0x01,0xe0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff, +0x0f,0x7c,0,0,0,0,0,0,0,0,0x0f,0,0,0xe0,0x3f, +0,0,0,0,0,0,0xf8,0x01,0xf8,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f,0x7c, +0,0,0,0,0,0,0,0,0x0f,0,0,0xe0,0x3f,0,0, +0,0,0,0,0xf8,0x01,0xf8,0xff,0xff,0xff,0x01,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f,0xf0,0,0, +0,0,0,0,0,0,0x0f,0,0,0xf0,0x1f,0,0,0,0, +0,0,0x7e,0,0xfc,0xff,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0xff,0x7f,0xe0,0x01,0,0,0, +0,0,0,0x80,0x07,0,0,0xfc,0x1f,0,0,0,0,0,0, +0x3e,0,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0xff,0xff,0xff,0xe0,0x03,0,0,0,0,0, +0,0x80,0x07,0,0,0xfc,0x0f,0,0,0,0,0,0,0x1f,0xc0, +0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xc1,0x07,0,0,0,0,0,0,0xc0, +0x03,0,0,0xfe,0x07,0,0,0,0,0,0xc0,0x0f,0xf0,0xff,0xff, +0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xc1,0x07,0,0,0,0,0,0,0xc0,0x03,0, +0,0xfe,0x07,0,0,0,0,0,0xc0,0x0f,0xf0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0x83,0x0f,0,0,0,0,0,0,0xc0,0x01,0,0,0xff, +0x07,0,0,0,0,0,0xc0,0x07,0xf8,0xff,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff, +0x0f,0x1e,0,0,0,0,0,0,0xe0,0x01,0,0xc0,0xef,0x03,0, +0,0,0,0,0xe0,0x01,0xff,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0x0f,0x1c, +0,0,0,0,0,0,0xf0,0,0,0xe0,0xf3,0x01,0,0,0, +0,0,0xf0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x1f,0x38,0,0, +0,0,0,0,0x70,0,0,0xf0,0xf9,0,0,0,0,0,0, +0x78,0xe0,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfc,0xff,0xff,0x1f,0x38,0,0,0,0, +0,0,0x70,0,0,0xf0,0xf9,0,0,0,0,0,0,0x78,0xe0, +0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0x7f,0xf0,0,0,0,0,0,0, +0x78,0,0,0x78,0x7c,0,0,0,0,0,0,0x3c,0xf0,0xff,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xff,0xff,0xe0,0,0,0,0,0,0,0x78,0, +0,0x7e,0x7c,0,0,0,0,0,0,0x3c,0xf8,0xff,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0xff,0xe0,0x01,0,0,0,0,0,0x3c,0,0,0x3e, +0x3e,0,0,0,0,0,0,0x1f,0xfe,0xff,0xff,0x7f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0xc1,0x03,0,0,0,0,0,0x3c,0,0,0x0f,0x1e,0, +0,0,0,0,0,0x0f,0xfe,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0xc1,0x03,0,0,0,0,0,0x3c,0,0,0x0f,0x1e,0,0,0, +0,0,0,0x0f,0xfe,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x83,0x07, +0,0,0,0,0,0x1e,0,0xc0,0x07,0x0f,0,0,0,0,0, +0x80,0x07,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0x07,0x0f,0,0, +0,0,0,0x0f,0,0xe0,0x83,0x0f,0,0,0,0,0,0x80,0xc7, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc0,0xff,0xff,0x0f,0x0f,0,0,0,0, +0,0x07,0,0xf0,0x81,0x07,0,0,0,0,0,0xc0,0xc3,0xff,0xff, +0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x1f,0x1c,0,0,0,0,0x80,0x03, +0,0x7c,0xc0,0x03,0,0,0,0,0,0xe0,0xe1,0xff,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x3f,0x3c,0,0,0,0,0xc0,0x03,0,0x3f, +0xe0,0x01,0,0,0,0,0,0xe0,0xe0,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0x3f,0x3c,0,0,0,0,0xc0,0x03,0,0x3f,0xe0,0x01, +0,0,0,0,0,0xe0,0xe0,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8, +0xff,0x3f,0x3c,0,0,0,0,0xe0,0x01,0x80,0x1f,0xe0,0x01,0,0, +0,0,0,0xf0,0xe0,0xff,0xff,0x07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0x3f, +0x38,0,0,0,0,0xe0,0,0xe0,0x07,0xf0,0,0,0,0,0, +0,0x78,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0, +0,0,0,0xf0,0,0xf0,0x03,0x70,0,0,0,0,0,0,0x78, +0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0, +0,0x70,0,0xfe,0,0x38,0,0,0,0,0,0,0x3c,0xfc,0xff, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0,0,0x70, +0,0xfe,0,0x38,0,0,0,0,0,0,0x3c,0xfc,0xff,0x3f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0,0,0x38,0x80,0x3f, +0,0x3c,0,0,0,0,0,0,0x1c,0xfc,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x3f,0x38,0,0,0,0,0x1c,0xc0,0x0f,0,0x1c, +0,0,0,0,0,0,0x1e,0xfc,0xff,0x3f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0x38,0,0,0,0,0x1e,0xf0,0x03,0,0x1e,0,0, +0,0,0,0,0x1e,0xfc,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff, +0x1f,0x38,0,0,0,0,0x0f,0x7f,0,0,0x0f,0,0,0,0, +0,0,0x0f,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x1f,0x38, +0,0,0,0,0x0f,0x7f,0,0,0x0f,0,0,0,0,0,0, +0x0f,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x1f,0x38,0,0, +0,0,0xe7,0x3f,0,0,0x07,0,0,0,0,0,0,0x0f,0xfc, +0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xff,0xff,0x0f,0x38,0,0,0,0x80, +0xfb,0x0f,0,0x80,0x03,0,0,0,0,0,0,0x07,0xfc,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x07,0x38,0,0,0,0xc0,0xff,0x01, +0,0xc0,0x03,0,0,0,0,0,0x80,0x07,0xf8,0xff,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x07,0x38,0,0,0,0xe0,0x3f,0,0,0xc0, +0x01,0,0,0,0,0,0xc0,0x03,0xf8,0xff,0xff,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0x38,0,0,0,0xe0,0x3f,0,0,0xc0,0x01,0, +0,0,0,0,0xc0,0x03,0xf8,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0x07,0x38,0,0,0,0xe0,0x0f,0,0,0xe0,0,0,0,0, +0,0,0xc0,0x03,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03, +0x38,0,0,0,0xf0,0x03,0,0,0xf0,0,0,0,0,0,0, +0xe0,0x01,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0x38,0, +0,0,0x70,0,0,0,0x70,0,0,0,0,0,0,0xe0,0x01, +0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x01,0x38,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0xe0,0,0xf0,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0, +0,0,0x38,0,0,0,0,0,0,0xf0,0,0xf0,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0,0,0, +0x38,0,0,0,0,0,0,0xf0,0,0xf0,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0,0,0,0x3c,0, +0,0,0,0,0,0xf0,0,0xe0,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0,0x38,0,0,0,0,0,0,0,0x1e,0,0,0, +0,0,0,0x78,0,0xe0,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f, +0,0x18,0,0,0,0,0,0,0,0x1e,0,0,0,0,0, +0,0x78,0,0xc0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0x18, +0,0,0,0,0,0,0,0x0f,0,0,0,0,0,0,0x3c, +0,0xc0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0x18,0,0, +0,0,0,0,0,0x0f,0,0,0,0,0,0,0x3c,0,0xc0, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x7f,0,0x1c,0,0,0,0, +0,0,0x80,0x07,0,0,0,0,0,0,0x3c,0,0x80,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0,0x1c,0,0,0,0,0,0, +0x80,0x07,0,0,0,0,0,0,0x1e,0,0x80,0xff,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0,0,0,0x1e,0,0x80,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03,0,0, +0,0,0,0,0x1f,0,0,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03,0,0,0,0, +0,0,0x1f,0,0,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0, +0x1c,0,0,0,0,0,0,0xe0,0x01,0,0,0,0,0,0, +0x0f,0,0,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0x1c,0, +0,0,0,0,0,0xe0,0,0,0,0,0,0,0,0x0f,0, +0,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0x07,0,0x1c,0,0,0, +0,0,0,0xf0,0,0,0,0,0,0,0x80,0x07,0,0,0xfe, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0, +0,0x70,0,0,0,0,0,0,0x80,0x07,0,0,0xfe,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0,0,0x70, +0,0,0,0,0,0,0x80,0x07,0,0,0xfe,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0,0,0x78,0,0, +0,0,0,0,0x80,0x07,0,0,0xfc,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0x03,0,0x1e,0,0,0,0,0,0,0x38,0,0,0,0, +0,0,0x80,0x03,0,0,0xfc,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03, +0,0x1e,0,0,0,0,0,0,0x3c,0,0,0,0,0,0, +0xc0,0x03,0,0,0xfc,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0,0x1e, +0,0,0,0,0,0,0x1e,0,0,0,0,0,0,0xc0,0x03, +0,0,0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0,0x1e,0,0, +0,0,0,0,0x1e,0,0,0,0,0,0,0xc0,0x03,0,0, +0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc0,0xff,0xff,0x01,0,0x1e,0,0,0,0, +0,0,0x1e,0,0,0,0,0,0,0xc0,0x03,0,0,0xf8,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0x01,0,0x1c,0,0,0,0,0,0, +0x0f,0,0,0,0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0xff,0,0,0x1c,0,0,0,0,0,0x80,0x07,0, +0,0,0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0,0,0x3c,0,0,0,0,0,0x80,0x07,0,0,0, +0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f, +0,0,0x3c,0,0,0,0,0,0x80,0x03,0,0,0,0,0, +0,0xc0,0x01,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0, +0x3c,0,0,0,0,0,0x80,0x03,0,0,0,0,0,0,0xc0, +0x01,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0x38,0, +0,0,0,0,0xc0,0x03,0,0,0,0,0,0,0xc0,0x01,0, +0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x3f,0,0,0x38,0,0,0, +0,0,0xc0,0x01,0,0,0,0,0,0,0xc0,0x01,0,0,0xe0, +0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0,0,0x38,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x1f,0,0,0x38,0,0,0,0,0,0xe0,0, +0,0,0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff,0x07,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0,0x38,0,0,0,0,0,0xe0,0,0,0, +0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff,0x07,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0x1f,0,0,0x38,0,0,0,0,0,0xf0,0,0,0,0,0, +0,0,0xc0,0x01,0,0,0x80,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0, +0,0x38,0,0,0,0,0,0x78,0,0,0,0,0,0,0, +0xc0,0x03,0,0,0x80,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x38, +0,0,0,0,0,0x78,0,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x3c,0,0, +0,0,0,0x3c,0,0,0,0,0,0,0,0x80,0x07,0,0, +0,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x3c,0,0,0,0, +0,0x3c,0,0,0,0,0,0,0,0x80,0x07,0,0,0,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0x07,0,0,0xfc,0x3f,0,0,0,0,0,0x3e, +0,0,0,0,0,0,0,0x80,0x07,0,0,0,0xfe,0xff,0x1f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x0f,0,0xe0,0xff,0xff,0x3f,0,0,0,0,0,0x1e,0,0, +0,0,0,0,0,0,0x0f,0,0,0,0xfe,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x3f,0,0,0,0,0,0x0f,0,0,0,0, +0,0,0,0,0x0f,0,0,0,0xfe,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0xff,0x0f,0x3c,0,0,0,0,0,0x0f,0,0,0,0,0,0, +0,0,0x0e,0,0,0,0xfc,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f, +0x3c,0,0,0,0,0,0x0f,0,0,0,0,0,0,0,0, +0x0e,0,0,0,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x01,0,0x38,0, +0,0,0,0x80,0x07,0,0,0,0,0,0,0,0,0x1e,0, +0,0,0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0xff,0,0,0,0x38,0,0,0, +0,0x80,0x07,0,0,0,0,0,0,0,0,0x3c,0,0,0, +0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x03,0,0,0,0x38,0,0,0,0,0xc0, +0x03,0,0,0,0,0,0,0,0,0x78,0,0,0,0xf8,0xff, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0,0,0,0x78,0,0,0,0,0xc0,0x01,0, +0,0,0,0,0,0,0,0x70,0,0,0,0xf8,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0x01,0,0,0,0,0x70,0,0,0,0,0xe0,0x01,0,0,0, +0,0,0,0,0,0xf0,0x01,0,0,0xf0,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x01,0, +0,0,0,0x70,0,0,0,0,0xe0,0x01,0,0,0,0,0, +0,0,0,0xf0,0x01,0,0,0xf0,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0xff,0x07,0,0xfe,0,0, +0,0x70,0,0,0,0,0xe0,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0,0xf0,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0x1f,0,0xf8,0xff,0,0,0,0x70, +0,0,0,0,0xf0,0,0,0,0,0,0,0,0,0,0xc0, +0x03,0,0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0x7f,0,0xe0,0xff,0x7f,0,0,0,0x70,0,0, +0,0,0xf8,0,0,0,0,0,0,0,0,0,0x80,0x0f,0, +0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0xff,0x03,0,0xf0,0xff,0x3f,0,0,0,0x70,0,0,0,0, +0x78,0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0xe0, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0x03,0,0xf0,0xff,0x3f,0,0,0,0x70,0,0,0,0,0x78,0, +0,0,0,0,0,0,0,0,0,0x1f,0,0,0xe0,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0x7f,0,0, +0xf8,0xff,0x3f,0,0,0,0x70,0,0,0,0,0x78,0,0,0, +0,0,0,0,0,0,0,0x7c,0,0,0xe0,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x80,0xff,0x07,0,0,0xf8,0xff, +0x1f,0,0,0,0xe0,0,0,0,0,0x3c,0,0,0,0,0, +0,0,0,0,0,0xf8,0x01,0,0xe0,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc0,0xff,0,0,0,0xfc,0xff,0x1f,0, +0,0,0xe0,0,0,0,0,0x3c,0,0,0,0,0,0,0, +0,0,0,0xe0,0x07,0,0xc0,0xff,0xff,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xc0,0x1f,0,0,0,0xfe,0xff,0x1f,0,0,0, +0xe0,0,0,0,0,0x3c,0,0,0x60,0,0,0,0,0,0, +0,0xc0,0x3f,0,0xc0,0xff,0xff,0x07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0x1f,0,0,0,0xfe,0xff,0x1f,0,0,0,0xe0,0, +0,0,0,0x3c,0,0,0x60,0,0,0,0,0,0,0,0xc0, +0x3f,0,0xc0,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0x03,0,0,0,0xfe,0xff,0x0f,0,0,0,0xe0,0,0,0, +0,0x3e,0,0,0x70,0,0,0,0,0,0,0,0,0xff,0x01, +0x80,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x0f,0,0,0,0xe0,0,0,0,0,0x3f, +0,0,0x38,0,0,0,0,0,0,0,0,0xf8,0x3f,0x80,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0,0,0xc0,0x01,0,0,0,0xff,0,0, +0x38,0,0,0,0,0,0,0,0,0xc0,0xff,0,0xfc,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0,0,0xc0,0x01,0,0,0,0xf7,0x03,0,0x3c,0, +0,0,0,0,0,0,0,0,0xff,0x0f,0xc0,0xff,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x07, +0,0,0,0xc0,0x01,0,0,0,0xf7,0x03,0,0x3c,0,0,0, +0,0,0,0,0,0,0xff,0x0f,0xc0,0xff,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0, +0,0xc0,0x01,0,0,0x80,0xe3,0x0f,0,0x3f,0,0,0,0,0, +0,0,0,0,0xf0,0x7f,0,0xf8,0x1f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0,0,0xc0, +0x01,0,0,0x80,0xe3,0xff,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0x80,0xff,0x03,0x80,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x03,0,0,0,0xc0,0x01,0, +0,0x80,0xc3,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0xfe,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0x01,0,0,0,0xc0,0x01,0,0,0xc0, +0x01,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0,0,0,0,0xc0,0x01,0,0,0xc0,0x01,0xfe, +0x7f,0x38,0,0,0,0,0,0,0,0,0,0,0,0xfe,0x1f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0,0,0,0,0xc0,0x01,0,0,0xc0,0x01,0xfe,0x7f,0x38, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0,0,0,0,0xc1,0x01,0,0,0xe0,0,0x3e,0,0x38,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0xff,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0,0, +0,0x80,0xc3,0x01,0,0,0xe0,0,0x7c,0,0x3c,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0,0xf0, +0xc3,0x01,0,0,0xf0,0,0xf0,0,0x3c,0,0,0,0,0,0, +0,0,0,0,0,0,0x80,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x7f,0,0,0,0xf8,0xc3,0x01, +0,0,0xf0,0,0xe0,0x01,0x3c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x7f,0,0,0,0xf8,0xc3,0x01,0,0, +0xf0,0,0xe0,0x01,0x3c,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0x7f,0,0,0,0xff,0xc3,0x03,0,0,0x70,0, +0xc0,0x03,0x3c,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0x3f,0,0,0x80,0xff,0xc3,0x03,0,0,0x70,0,0xc0,0x03, +0x3c,0,0,0,0,0,0,0,0,0,0,0,0xf0,0x01,0, +0xf0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0x1f,0,0,0xe0,0xff,0xc3,0x03,0,0,0x78,0,0x80,0x07,0x3c,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0x7f,0,0,0, +0xfc,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0, +0,0xf8,0xff,0xc3,0x03,0,0,0x78,0,0,0x0f,0x3c,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0,0,0xf8, +0xff,0xc3,0x03,0,0,0x78,0,0,0x0f,0x3c,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0x0f,0,0,0xfe,0xff,0x83, +0x03,0,0,0x3c,0,0,0x1e,0x1c,0,0,0,0,0,0,0, +0,0xfc,0xff,0x01,0xe0,0xff,0xff,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x0f,0,0x80,0xff,0xff,0x87,0x03,0, +0,0x3c,0,0,0x3c,0x1c,0,0,0,0,0,0,0xf8,0xff,0xff, +0xff,0xff,0xe1,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x0f,0,0xc0,0xff,0xff,0x87,0x03,0,0,0x3c, +0,0,0x78,0x1c,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0xff, +0xe1,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0xf8,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0, +0xe0,0x1c,0,0,0,0x80,0xff,0xff,0xff,0x01,0,0,0,0xc0,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0xf8,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0xe0,0x1c, +0,0,0,0x80,0xff,0xff,0xff,0x01,0,0,0,0xc0,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x03, +0,0xfe,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0xe0,0x1f,0,0, +0,0xf0,0xff,0xff,0,0,0,0,0,0x80,0xff,0xff,0x07,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0xff, +0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0x80,0x1f,0,0,0,0xff, +0xff,0x03,0,0,0,0xfc,0x03,0x80,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0xc0,0xff,0xff,0xff, +0xc7,0x03,0,0,0x1e,0,0,0,0x1f,0,0,0xf8,0xff,0x0f,0, +0x80,0xff,0xff,0xff,0x1f,0,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x01,0xf0,0xff,0xff,0xff,0xc3,0x03, +0,0,0xfe,0xff,0,0,0x1f,0,0xe0,0xff,0x3f,0,0,0x80,0xff, +0xff,0xff,0x3f,0,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0,0, +0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0x80,0xff,0xff,0xff, +0x7f,0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0,0,0xfe,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0x80,0xff,0xff,0xff,0x7f,0, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0x01,0xff,0xff,0xff,0xff,0x80,0x03,0,0,0xfe,0xff,0xff,0xff, +0xff,0xff,0xff,0x07,0,0,0,0,0xfe,0xff,0xff,0xff,0x01,0xfe,0xff, +0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0x80,0xff,0xff,0xff,0x3f,0,0,0,0,0x7c,0,0,0xf5,0xff,0xff, +0x3f,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x07,0xfe,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0xf0,0xff, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0x1f,0xfe,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0xff,0xff,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff, +0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0xff, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0xff,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0, +0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff, +0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf0,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff, +0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x0f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0x01,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xe0,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfe,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0x01,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x18,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; diff --git a/hacks/drift.c b/hacks/drift.c new file mode 100644 index 00000000..395a1ec5 --- /dev/null +++ b/hacks/drift.c @@ -0,0 +1,624 @@ +/* -*- Mode: C; tab-width: 4 -*- + * drift --- drifting recursive fractal cosmic flames. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)drift.c 4.02 97/04/01 xlockmore"; +#endif + +/* Copyright (c) 1991 by Patrick J. Naughton. + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 01-Jan-97: Moved new flame to drift. Compile time options now run time. + * 01-Jun-95: Updated by Scott Draves. + * 27-Jun-91: vary number of functions used. + * 24-Jun-91: fixed portability problem with integer mod (%). + * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu). + */ + +#ifdef STANDALONE +# define PROGCLASS "Drift" +# define HACK_INIT init_drift +# define HACK_DRAW draw_drift +# define drift_opts xlockmore_opts +# define DEFAULTS "*count: 30 \n" \ + "*delay: 10000 \n" \ + "*ncolors: 200 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + + +#define MAXBATCH1 200 /* mono */ +#define MAXBATCH2 20 /* color */ +#define FUSE 10 /* discard this many initial iterations */ +#define NMAJORVARS 7 +#define MAXLEV 10 + +#define DEF_GROW "False" /* Grow fractals instead of animating one at a time, + would then be like flame */ +#define DEF_LISS "False" /* if this is defined then instead of a point + bouncing around in a high dimensional sphere, we + use lissojous figures. Only makes sense if + grow is false. */ + +static Bool grow; +static Bool liss; + +static XrmOptionDescRec opts[] = +{ + {"-grow", ".drift.grow", XrmoptionNoArg, (caddr_t) "on"}, + {"+grow", ".drift.grow", XrmoptionNoArg, (caddr_t) "off"}, + {"-liss", ".drift.trail", XrmoptionNoArg, (caddr_t) "on"}, + {"+liss", ".drift.trail", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & grow, "grow", "Grow", DEF_GROW, t_Bool}, + {(caddr_t *) & liss, "liss", "Liss", DEF_LISS, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-/+grow", "turn on/off growing fractals, else they are animated"}, + {"-/+liss", "turn on/off using lissojous figures to get points"} +}; + +ModeSpecOpt drift_opts = { 4, opts, 2, vars, desc }; + + +typedef struct { + /* shape of current flame */ + int nxforms; + double f[2][3][MAXLEV]; /* a bunch of non-homogeneous xforms */ + int variation[10]; /* for each xform */ + + /* Animation */ + double df[2][3][MAXLEV]; + + /* high-level control */ + int mode; /* 0->slow/single 1->fast/many */ + int nfractals; /* draw this many fractals */ + int major_variation; + int fractal_len; /* pts/fractal */ + int color; + int rainbow; /* more than one color per fractal + 1-> computed by adding dimension to fractal */ + + int width, height; /* of window */ + int timer; + + /* draw info about current flame */ + int fuse; /* iterate this many before drawing */ + int total_points; /* draw this many pts before fractal ends */ + int npoints; /* how many we've computed but not drawn */ + XPoint pts[MAXBATCH1]; /* here they are */ + unsigned long pixcol; + /* when drawing in color, we have a buffer per color */ + int ncpoints[NUMCOLORS]; + XPoint cpts[NUMCOLORS][MAXBATCH2]; + + double x, y, c; + int liss_time; + Bool grow, liss; +} driftstruct; + +static driftstruct *drifts = NULL; + +static short +halfrandom(int mv) +{ + static short lasthalf = 0; + unsigned long r; + + if (lasthalf) { + r = lasthalf; + lasthalf = 0; + } else { + r = LRAND(); + lasthalf = r >> 16; + } + r = r % mv; + return r; +} + +static int +frandom(int n) +{ + static long saved_random_bits = 0; + static int nbits = 0; + int result; + + if (3 > nbits) { + saved_random_bits = LRAND(); + nbits = 31; + } + switch (n) { + case 2: + result = saved_random_bits & 1; + saved_random_bits >>= 1; + nbits -= 1; + return result; + + case 3: + result = saved_random_bits & 3; + saved_random_bits >>= 2; + nbits -= 2; + if (3 == result) + return frandom(3); + return result; + + case 4: + result = saved_random_bits & 3; + saved_random_bits >>= 2; + nbits -= 2; + return result; + + case 5: + result = saved_random_bits & 7; + saved_random_bits >>= 3; + nbits -= 3; + if (4 < result) + return frandom(5); + return result; + default: + (void) fprintf(stderr, "bad arg to frandom\n"); + exit(1); + } + return 0; +} + +#define DISTRIB_A (halfrandom(7000) + 9000) +#define DISTRIB_B ((frandom(3) + 1) * (frandom(3) + 1) * 120000) +#define LEN(x) (sizeof(x)/sizeof((x)[0])) + +static void +initmode(ModeInfo * mi, int mode) +{ + driftstruct *dp = &drifts[MI_SCREEN(mi)]; + +#define VARIATION_LEN 14 + + dp->mode = mode; + + dp->major_variation = halfrandom(VARIATION_LEN); + /* 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6 */ + dp->major_variation = ((dp->major_variation >= VARIATION_LEN >> 1) && + (dp->major_variation < VARIATION_LEN - 1)) ? + (dp->major_variation + 1) >> 1 : dp->major_variation >> 1; + + if (dp->grow) { + dp->rainbow = 0; + if (mode) { + if (!dp->color || halfrandom(8)) { + dp->nfractals = halfrandom(30) + 5; + dp->fractal_len = DISTRIB_A; + } else { + dp->nfractals = halfrandom(5) + 5; + dp->fractal_len = DISTRIB_B; + } + } else { + dp->rainbow = dp->color; + dp->nfractals = 1; + dp->fractal_len = DISTRIB_B; + } + } else { + dp->nfractals = 1; + dp->rainbow = dp->color; + dp->fractal_len = 2000000; + } + dp->fractal_len = (dp->fractal_len * MI_BATCHCOUNT(mi)) / 20; + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} + +static void +pick_df_coefs(ModeInfo * mi) +{ + driftstruct *dp = &drifts[MI_SCREEN(mi)]; + int i, j, k; + double r; + + for (i = 0; i < dp->nxforms; i++) { + + r = 1e-6; + for (j = 0; j < 2; j++) + for (k = 0; k < 3; k++) { + dp->df[j][k][i] = ((double) halfrandom(1000) / 500.0 - 1.0); + r += dp->df[j][k][i] * dp->df[j][k][i]; + } + r = (3 + halfrandom(5)) * 0.01 / sqrt(r); + for (j = 0; j < 2; j++) + for (k = 0; k < 3; k++) + dp->df[j][k][i] *= r; + } +} + +static void +initfractal(ModeInfo * mi) +{ + driftstruct *dp = &drifts[MI_SCREEN(mi)]; + int i, j, k; + +#define XFORM_LEN 9 + + dp->fuse = FUSE; + dp->total_points = 0; + if (dp->rainbow) + for (i = 0; i < MI_NPIXELS(mi); i++) + dp->ncpoints[i] = 0; + else + dp->npoints = 0; + dp->nxforms = halfrandom(XFORM_LEN); + /* 2, 2, 2, 3, 3, 3, 4, 4, 5 */ + dp->nxforms = (dp->nxforms >= XFORM_LEN - 1) + dp->nxforms / 3 + 2; + + dp->c = dp->x = dp->y = 0.0; + if (dp->liss && !halfrandom(10)) { + dp->liss_time = 0; + } + if (!dp->grow) + pick_df_coefs(mi); + for (i = 0; i < dp->nxforms; i++) { + if (NMAJORVARS == dp->major_variation) + dp->variation[i] = halfrandom(NMAJORVARS); + else + dp->variation[i] = dp->major_variation; + for (j = 0; j < 2; j++) + for (k = 0; k < 3; k++) { + if (dp->liss) + dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]); + else + dp->f[j][k][i] = ((double) halfrandom(1000) / 500.0 - 1.0); + } + } + if (dp->color) + dp->pixcol = MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi))); + else + dp->pixcol = MI_WIN_WHITE_PIXEL(mi); + +} + + +void +init_drift(ModeInfo * mi) +{ + driftstruct *dp; + + if (drifts == NULL) { + if ((drifts = (driftstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (driftstruct))) == NULL) + return; + } + dp = &drifts[MI_SCREEN(mi)]; + + dp->width = MI_WIN_WIDTH(mi); + dp->height = MI_WIN_HEIGHT(mi); + dp->color = MI_NPIXELS(mi) > 2; + + if (MI_WIN_IS_FULLRANDOM(mi)) { +#if 1 /* jwz: even up the odds */ + switch ((int) (LRAND() % 3)) { + case 0: dp->grow = True; dp->liss = False; break; + case 1: dp->grow = False; dp->liss = True; break; + default: dp->grow = False; dp->liss = False; break; + /* liss and grow don't work together. */ + } +#else /* 0 */ + if (LRAND() & 1) + dp->grow = True; + else { + dp->grow = False; + dp->liss = (Bool) (LRAND() & 1); + } +#endif + } else { + dp->grow = grow; + if (dp->grow) + dp->liss = False; + else + dp->liss = liss; + } + initmode(mi, 1); + initfractal(mi); +} + +static void +iter(driftstruct * dp) +{ + int i = frandom(dp->nxforms); + double nx, ny, nc; + + + if (i) + nc = (dp->c + 1.0) / 2.0; + else + nc = dp->c / 2.0; + + nx = dp->f[0][0][i] * dp->x + dp->f[0][1][i] * dp->y + dp->f[0][2][i]; + ny = dp->f[1][0][i] * dp->x + dp->f[1][1][i] * dp->y + dp->f[1][2][i]; + + + switch (dp->variation[i]) { + case 1: + /* sinusoidal */ + nx = sin(nx); + ny = sin(ny); + break; + case 2: + { + /* complex */ + double r2 = nx * nx + ny * ny + 1e-6; + + nx = nx / r2; + ny = ny / r2; + break; + } + case 3: + /* bent */ + if (nx < 0.0) + nx = nx * 2.0; + if (ny < 0.0) + ny = ny / 2.0; + break; + case 4: + { + /* swirl */ + + double r = (nx * nx + ny * ny); /* times k here is fun */ + double c1 = sin(r); + double c2 = cos(r); + double t = nx; + + if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4) + ny = 1e4; + else + ny = c2 * t + c1 * ny; + nx = c1 * nx - c2 * ny; + break; + } + case 5: + { + /* horseshoe */ + double r, c1, c2, t; + + /* Avoid atan2: DOMAIN error message */ + if (nx == 0.0 && ny == 0.0) + r = 0.0; + else + r = atan2(nx, ny); /* times k here is fun */ + c1 = sin(r); + c2 = cos(r); + t = nx; + + nx = c1 * nx - c2 * ny; + ny = c2 * t + c1 * ny; + break; + } + case 6: + { + /* drape */ + double t; + + /* Avoid atan2: DOMAIN error message */ + if (nx == 0.0 && ny == 0.0) + t = 0.0; + else + t = atan2(nx, ny) / M_PI; + + if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4) + ny = 1e4; + else + ny = sqrt(nx * nx + ny * ny) - 1.0; + nx = t; + break; + } + } + +#if 0 + /* here are some others */ + { + /* broken */ + if (nx > 1.0) + nx = nx - 1.0; + if (nx < -1.0) + nx = nx + 1.0; + if (ny > 1.0) + ny = ny - 1.0; + if (ny < -1.0) + ny = ny + 1.0; + break; + } + { + /* complex sine */ + double u = nx, v = ny; + double ev = exp(v); + double emv = exp(-v); + + nx = (ev + emv) * sin(u) / 2.0; + ny = (ev - emv) * cos(u) / 2.0; + } + { + + /* polynomial */ + if (nx < 0) + nx = -nx * nx; + else + nx = nx * nx; + + if (ny < 0) + ny = -ny * ny; + else + ny = ny * ny; + } + { + /* spherical */ + double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6); + + nx = nx / r; + ny = ny / r; + } + { + nx = atan(nx) / M_PI_2 + ny = atan(ny) / M_PI_2 + } +#endif + + /* how to check nan too? some machines don't have finite(). + don't need to check ny, it'll propogate */ + if (nx > 1e4 || nx < -1e4) { + nx = halfrandom(1000) / 500.0 - 1.0; + ny = halfrandom(1000) / 500.0 - 1.0; + dp->fuse = FUSE; + } + dp->x = nx; + dp->y = ny; + dp->c = nc; + +} + +static void +draw(ModeInfo * mi, driftstruct * dp, Drawable d) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + double x = dp->x; + double y = dp->y; + int fixed_x, fixed_y, npix, c, n; + + if (dp->fuse) { + dp->fuse--; + return; + } + if (!(x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0)) + return; + + fixed_x = (int) ((dp->width / 2) * (x + 1.0)); + fixed_y = (int) ((dp->height / 2) * (y + 1.0)); + + if (!dp->rainbow) { + + dp->pts[dp->npoints].x = fixed_x; + dp->pts[dp->npoints].y = fixed_y; + dp->npoints++; + if (dp->npoints == MAXBATCH1) { + XSetForeground(display, gc, dp->pixcol); + XDrawPoints(display, d, gc, dp->pts, dp->npoints, CoordModeOrigin); + dp->npoints = 0; + } + } else { + + npix = MI_NPIXELS(mi); + c = (int) (dp->c * npix); + + if (c < 0) + c = 0; + if (c >= npix) + c = npix - 1; + n = dp->ncpoints[c]; + dp->cpts[c][n].x = fixed_x; + dp->cpts[c][n].y = fixed_y; + if (++dp->ncpoints[c] == MAXBATCH2) { + XSetForeground(display, gc, MI_PIXEL(mi, c)); + XDrawPoints(display, d, gc, dp->cpts[c], + dp->ncpoints[c], CoordModeOrigin); + dp->ncpoints[c] = 0; + } + } +} + +static void +draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + + if (dp->rainbow) { + int npix = MI_NPIXELS(mi); + int i; + + for (i = 0; i < npix; i++) { + if (dp->ncpoints[i]) { + XSetForeground(display, gc, MI_PIXEL(mi, i)); + XDrawPoints(display, d, gc, dp->cpts[i], + dp->ncpoints[i], CoordModeOrigin); + dp->ncpoints[i] = 0; + } + } + } else { + if (dp->npoints) + XSetForeground(display, gc, dp->pixcol); + XDrawPoints(display, d, gc, dp->pts, + dp->npoints, CoordModeOrigin); + dp->npoints = 0; + } +} + + +void +draw_drift(ModeInfo * mi) +{ + Window window = MI_WINDOW(mi); + driftstruct *dp = &drifts[MI_SCREEN(mi)]; + + dp->timer = 3000; + + while (dp->timer) { + iter(dp); + draw(mi, dp, window); + if (dp->total_points++ > dp->fractal_len) { + draw_flush(mi, dp, window); + if (0 == --dp->nfractals) + initmode(mi, frandom(2)); + initfractal(mi); + } + dp->timer--; + } + if (!dp->grow) { + int i, j, k; + + draw_flush(mi, dp, window); + if (dp->liss) + dp->liss_time++; + for (i = 0; i < dp->nxforms; i++) + for (j = 0; j < 2; j++) + for (k = 0; k < 3; k++) { + if (dp->liss) + dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]); + else { + double t = dp->f[j][k][i] += dp->df[j][k][i]; + + if (t < -1.0 || 1.0 < t) + dp->df[j][k][i] *= -1.0; + } + } + } +} + +void +release_drift(ModeInfo * mi) +{ + if (drifts != NULL) { + (void) free((void *) drifts); + drifts = NULL; + } +} + +void +refresh_drift(ModeInfo * mi) +{ + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} diff --git a/local/man/man.1/drift.1 b/hacks/drift.man similarity index 100% rename from local/man/man.1/drift.1 rename to hacks/drift.man diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c new file mode 100644 index 00000000..5b715522 --- /dev/null +++ b/hacks/fadeplot.c @@ -0,0 +1,177 @@ +/* -*- Mode: C; tab-width: 4 -*- + * fadeplot.c --- some easy plotting stuff, by Bas van Gaalen, Holland, PD + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)fadeplot.c 4.04 97/07/26 xlockmore"; +#endif + +/* Converted for xlock by Charles Vidal + * See xlock.c for copying information. + * + * 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. + */ + +/*- + 1) Not random enough, i.e. always same starting position. + 2) Needs to be less flashy + */ + +#ifdef STANDALONE +# define PROGCLASS "Fadeplot" +# define HACK_INIT init_fadeplot +# define HACK_DRAW draw_fadeplot +# define fadeplot_opts xlockmore_opts +# define DEFAULTS "*count: 10 \n" \ + "*delay: 30000 \n" \ + "*cycles: 1500 \n" \ + "*ncolors: 64 \n" +# define BRIGHT_COLORS +# define UNIFORM_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* STANDALONE */ + +ModeSpecOpt fadeplot_opts = { + 0, NULL, 0, NULL, NULL }; + +#define MINSTEPS 1 +#define ANGLES 1000 + +typedef struct { + XPoint speed, step, factor, st; + int temps, maxpts, nbstep; + int min; + int width, height; + int pix; + int stab[ANGLES]; + XPoint *pts; +} fadeplotstruct; + +static fadeplotstruct *fadeplots = NULL; + +static void +initSintab(ModeInfo * mi) +{ + fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)]; + int i; + float x; + + for (i = 0; i < ANGLES; i++) { + x = SINF(i * 2 * M_PI / ANGLES); + fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min; + } +} + +void +init_fadeplot(ModeInfo * mi) +{ + fadeplotstruct *fp; + + if (fadeplots == NULL) { + if ((fadeplots = (fadeplotstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (fadeplotstruct))) == NULL) + return; + } + fp = &fadeplots[MI_SCREEN(mi)]; + + fp->width = MI_WIN_WIDTH(mi); + fp->height = MI_WIN_HEIGHT(mi); + fp->min = MAX(MIN(fp->width, fp->height) / 2, 1); + + fp->speed.x = 8; + fp->speed.y = 10; + fp->step.x = 1; + fp->step.y = 1; + fp->temps = 0; + fp->factor.x = MAX(fp->width / (2 * fp->min), 1); + fp->factor.y = MAX(fp->height / (2 * fp->min), 1); + + fp->nbstep = MI_BATCHCOUNT(mi); + if (fp->nbstep < -MINSTEPS) { + fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS; + } else if (fp->nbstep < MINSTEPS) + fp->nbstep = MINSTEPS; + + fp->maxpts = MI_CYCLES(mi); + if (fp->maxpts < 1) + fp->maxpts = 1; + + if (fp->pts == NULL) + fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint)); + if (MI_NPIXELS(mi) > 2) + fp->pix = NRAND(MI_NPIXELS(mi)); + + initSintab(mi); + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} + +void +draw_fadeplot(ModeInfo * mi) +{ + fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + int i, j; + long temp; + + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin); + + if (MI_NPIXELS(mi) > 2) { + XSetForeground(display, gc, MI_PIXEL(mi, fp->pix)); + if (++fp->pix >= MI_NPIXELS(mi)) + fp->pix = 0; + } else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + + for (temp = fp->nbstep - 1; temp >= 0; temp--) { + j = temp; + for (i = 0; i < fp->maxpts / fp->nbstep; i++) { + fp->pts[temp * i + i].x = + fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % ANGLES] * + fp->factor.x + fp->width / 2 - fp->min; + fp->pts[temp * i + i].y = + fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % ANGLES] * + fp->factor.y + fp->height / 2 - fp->min; + } + } + XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin); + XFlush(display); + fp->st.x = (fp->st.x + fp->speed.x) % ANGLES; + fp->st.y = (fp->st.y + fp->speed.y) % ANGLES; + fp->temps++; + if ((fp->temps % (ANGLES / 2)) == 0) { + fp->temps = fp->temps % ANGLES * 5; + if ((fp->temps % (ANGLES)) == 0) + fp->speed.y = (fp->speed.y++) % 30 + 1; + if ((fp->temps % (ANGLES * 2)) == 0) + fp->speed.x = (fp->speed.x) % 20; + if ((fp->temps % (ANGLES * 3)) == 0) + fp->step.y = (fp->step.y++) % 2 + 1; + XClearWindow(display, window); + } +} +void +refresh_fadeplot(ModeInfo * mi) +{ + +} + +void +release_fadeplot(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/hacks/flag.c b/hacks/flag.c new file mode 100644 index 00000000..1c2c5054 --- /dev/null +++ b/hacks/flag.c @@ -0,0 +1,488 @@ +/* -*- Mode: C; tab-width: 4 -*- + * flag --- a waving flag + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)flag.c 4.02 97/04/01 xlockmore"; +#endif + +/* Copyright (c) 1996 Charles Vidal . + * PEtite demo X11 de charles vidal 15 05 96 + * tourne sous Linux et SOLARIS + * thank's to Bas van Gaalen, Holland, PD, for his sources + * in pascal vous devez rajouter une ligne dans mode.c + * + * 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. + * + * Revision History: + * 13-May-97: jwz@netscape.com: turned into a standalone program. + * Made it able to animate arbitrary (runtime) text or bitmaps. + * 01-May-96: written. + */ + +#ifdef STANDALONE +# define PROGCLASS "Flag" +# define HACK_INIT init_flag +# define HACK_DRAW draw_flag +# define flag_opts xlockmore_opts +# define DEFAULTS "*delay: 50000 \n" \ + "*cycles: 1000 \n" \ + "*size: -7 \n" \ + "*ncolors: 200 \n" +# define BRIGHT_COLORS +# define UNIFORM_COLORS +# define DEF_FONT "-*-helvetica-bold-r-*-240-*" +# define DEF_BITMAP "" +# define DEF_TEXT "" +# include "xlockmore.h" /* from the xscreensaver distribution */ + +#ifdef HAVE_XMU +# ifndef VMS +# include +# else /* VMS */ +# include +# endif /* VMS */ +#endif /* HAVE_XMU */ + +#include "bob.xbm" + +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +# include "flag.h" +#endif /* !STANDALONE */ + + +#if defined(VMS) && !defined(HAVE_UNAME) && (__VMS_VER >= 70000000) +# define HAVE_UNAME 1 +#endif + +#ifdef HAVE_UNAME +# include +#endif /* HAVE_UNAME */ + +ModeSpecOpt flag_opts = { + 0, NULL, 0, NULL, NULL }; + +#include +#include + +#define MINSIZE 1 +#define MAXSCALE 8 +#define MINSCALE 2 +#define MAXINITSIZE 6 +#define MININITSIZE 2 +#define MINAMP 5 +#define MAXAMP 20 +#define MAXW(fp) (MAXSCALE * (fp)->image->width + 2 * MAXAMP + (fp)->pointsize) +#define MAXH(fp) (MAXSCALE * (fp)->image->height+ 2 * MAXAMP + (fp)->pointsize) +#define MINW(fp) (MINSCALE * (fp)->image->width + 2 * MINAMP + (fp)->pointsize) +#define MINH(fp) (MINSCALE * (fp)->image->height+ 2 * MINAMP + (fp)->pointsize) +#define ANGLES 360 + +typedef struct { + int samp; + int sofs; + int sidx; + int x_flag, y_flag; + int timer; + int initialized; + int stab[ANGLES]; + Pixmap cache; + int width, height; + int pointsize; + float size; + float inctaille; + int startcolor; + XImage *image; +} flagstruct; + +static flagstruct *flags = NULL; + +static int +random_num(int n) +{ + return ((int) (((float) LRAND() / MAXRAND) * (n + 1.0))); +} + +static void +initSintab(ModeInfo * mi) +{ + flagstruct *fp = &flags[MI_SCREEN(mi)]; + int i; + + for (i = 0; i < ANGLES; i++) + fp->stab[i] = (int) (SINF(i * 4 * M_PI / ANGLES) * fp->samp) + fp->sofs; +} + +static void +affiche(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + int x, y, xp, yp; + flagstruct *fp = &flags[MI_SCREEN(mi)]; + + for (x = 0; x < fp->image->width; x++) + for (y = fp->image->height-1; y >= 0; y--) { + xp = (int) (fp->size * (float) x) + + fp->stab[(fp->sidx + x + y) % ANGLES]; + yp = (int) (fp->size * (float) y) + + fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES]; + if (XGetPixel(fp->image, x, y)) + XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + else if (MI_NPIXELS(mi) <= 2) + XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); + else + XSetForeground(display, MI_GC(mi), + MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi))); + if (fp->pointsize <= 1) + XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp); + else if (fp->pointsize < 6) + XFillRectangle(display, fp->cache, MI_GC(mi), xp, yp, + fp->pointsize, fp->pointsize); + else + XFillArc(display, fp->cache, MI_GC(mi), xp, yp, + fp->pointsize, fp->pointsize, 0, 360*64); + } +} + +#ifdef STANDALONE + +static void +make_flag_bits(ModeInfo *mi) +{ + Display *dpy = MI_DISPLAY(mi); + flagstruct *fp = &flags[MI_SCREEN(mi)]; + char *bitmap_name = get_string_resource ("bitmap", "Bitmap"); + char *text = get_string_resource ("text", "Text"); + + /* If neither a bitmap nor text are specified, randomly select either + the builtin bitmap or builtin text. */ + if ((!bitmap_name || !*bitmap_name) && (!text || !*text)) + { + if (random() & 1) + { + free(bitmap_name); + bitmap_name = strdup("(default)"); + } + else + { + free(text); + text = strdup("(default)"); + } + } + + if (bitmap_name && + *bitmap_name && + !!strcmp(bitmap_name, "(default)")) + { +#ifdef HAVE_XMU + int width, height, xh, yh; + Pixmap bitmap = + XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy), + bitmap_name, 0, 0, &width, &height, &xh, &yh); + if (!bitmap) + { + fprintf(stderr, "%s: unable to load bitmap file %s\n", + progname, bitmap_name); + exit (1); + } + fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, + 1L, XYPixmap); + XFreePixmap(dpy, bitmap); + +#else /* !XMU */ + fprintf (stderr, + "%s: your vendor doesn't ship the standard Xmu library.\n", + progname); + fprintf (stderr, "\tWe can't load XBM files without it.\n"); + exit (1); +#endif /* !XMU */ + + } + else if (text && *text) + { + char *text2; + char *fn = get_string_resource ("font", "Font"); + char *def_fn = "fixed"; + char *line, *token; + int width, height; + int lines; + int margin = 2; + int fg = 1; + int bg = 0; + Pixmap bitmap; + XFontStruct *font; + XCharStruct overall; + XGCValues gcv; + GC gc; + + if (!strcmp(text, "(default)")) + { +# ifdef HAVE_UNAME + struct utsname uts; + if (uname (&uts) < 0) + { + text = strdup("uname() failed"); + } + else + { + char *s; + if ((s = strchr(uts.nodename, '.'))) + *s = 0; + text = (char *) malloc(strlen(uts.nodename) + + strlen(uts.sysname) + + strlen(uts.release) + 10); + sprintf(text, "%s\n%s %s", + uts.nodename, uts.sysname, uts.release); + } +#else /* !HAVE_UNAME */ +# ifdef VMS + text = strdup(getenv("SYS$NODE")); +# else + text = strdup("X\nScreen\nSaver"); +# endif +#endif /* !HAVE_UNAME */ + } + + while (*text && + (text[strlen(text)-1] == '\r' || + text[strlen(text)-1] == '\n')) + text[strlen(text)-1] = 0; + + text2 = strdup(text); + + if (!fn) fn = def_fn; + font = XLoadQueryFont (dpy, fn); + if (! font) + { + fprintf(stderr, "%s: unable to load font %s; using %s\n", + progname, fn, def_fn); + font = XLoadQueryFont (dpy, def_fn); + } + + memset(&overall, 0, sizeof(overall)); + token = text; + lines = 0; + while ((line = strtok(token, "\r\n"))) + { + XCharStruct o2; + int ascent, descent, direction; + token = 0; + XTextExtents(font, line, strlen(line), + &direction, &ascent, &descent, &o2); + overall.lbearing = MAX(overall.lbearing, o2.lbearing); + overall.rbearing = MAX(overall.rbearing, o2.rbearing); + lines++; + } + + width = overall.lbearing + overall.rbearing + margin + margin + 1; + height = ((font->ascent + font->descent) * lines) + margin + margin; + + bitmap = XCreatePixmap(dpy, MI_WINDOW(mi), width, height, 1); + + gcv.font = font->fid; + gcv.foreground = bg; + gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv); + XFillRectangle(dpy, bitmap, gc, 0, 0, width, height); + XSetForeground(dpy, gc, fg); + + token = text2; + lines = 0; + while ((line = strtok(token, "\r\n"))) + { + XCharStruct o2; + int ascent, descent, direction, xoff; + token = 0; + + XTextExtents(font, line, strlen(line), + &direction, &ascent, &descent, &o2); + xoff = ((overall.lbearing + overall.rbearing) - + (o2.lbearing + o2.rbearing)) / 2; + + XDrawString(dpy, bitmap, gc, + overall.lbearing + margin + xoff, + ((font->ascent * (lines + 1)) + + (font->descent * lines) + + margin), + line, strlen(line)); + lines++; + } + free(text2); + XUnloadFont(dpy, font->fid); + XFree((XPointer) font); + XFreeGC(dpy, gc); + + fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap); + XFreePixmap(dpy, bitmap); + } + else + { + fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0, + (char *) bob_bits, bob_width, bob_height, + 8, 0); + fp->image->byte_order = LSBFirst; + fp->image->bitmap_bit_order = LSBFirst; + } + + if (bitmap_name) + free (bitmap_name); + if (text) + free (text); +} + +#else /* !STANDALONE */ + +static void +make_flag_bits(ModeInfo *mi) +{ + flagstruct *fp = &flags[MI_SCREEN(mi)]; + int x, y; + int w = flag_width; + int h = flag_height; + int i = 0; + fp->image = + XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi), + 1, XYBitmap, 0, /* dpth, fmt, offset */ + (char *) calloc ((w+8) / 8, h), /* data */ + w, h, 8, 0); /* w, h, pad, bpl */ + /* Geez, what kinda goofy bit order is this?? */ + for (x = 0; x < w; x++) + for (y = h-1; y >= 0; y--) + XPutPixel (fp->image, x, y, flag_bits[i++]); +} + +#endif /* !STANDALONE */ + + +void +init_flag(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + int size = MI_SIZE(mi); + flagstruct *fp; + + if (flags == NULL) { + if ((flags = (flagstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (flagstruct))) == NULL) + return; + } + fp = &flags[MI_SCREEN(mi)]; + + make_flag_bits(mi); + + fp->width = MI_WIN_WIDTH(mi); + fp->height = MI_WIN_HEIGHT(mi); + + fp->samp = MAXAMP; /* Amplitude */ + fp->sofs = 20; /* ???????? */ + fp->pointsize = size; + if (size < -MINSIZE) + fp->pointsize = NRAND(-size - MINSIZE + 1) + MINSIZE; + if (fp->pointsize < MINSIZE || + fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) + fp->pointsize = MINSIZE; + fp->size = MAXINITSIZE; /* Initial distance between pts */ + fp->inctaille = 0.05; + fp->timer = 0; + fp->sidx = fp->x_flag = fp->y_flag = 0; + + if (!fp->initialized) { + fp->initialized = True; + if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi), + MAXW(fp), MAXH(fp), MI_WIN_DEPTH(mi)))) +#ifdef STANDALONE + exit(-1); +#else /* !STANDALONE */ + error("%s: catastrophe memoire\n"); +#endif /* !STANDALONE */ + } + XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XFillRectangle(display, fp->cache, MI_GC(mi), + 0, 0, MAXW(fp), MAXH(fp)); + /* don't want any exposure events from XCopyArea */ + XSetGraphicsExposures(display, MI_GC(mi), False); + if (MI_NPIXELS(mi) > 2) + fp->startcolor = NRAND(MI_NPIXELS(mi)); + if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) { + fp->samp = MINAMP; + fp->sofs = 0; + fp->x_flag = random_num(fp->width - MINW(fp)); + fp->y_flag = random_num(fp->height - MINH(fp)); + } else { + fp->samp = MAXAMP; + fp->sofs = 20; + fp->x_flag = random_num(fp->width - MAXW(fp)); + fp->y_flag = random_num(fp->height - MAXH(fp)); + } + + initSintab(mi); + + XClearWindow(display, MI_WINDOW(mi)); +} + +void +draw_flag(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + flagstruct *fp = &flags[MI_SCREEN(mi)]; + + if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) { + fp->size = MININITSIZE; + /* fp->pointsize = MINPOINTSIZE; */ + XCopyArea(display, fp->cache, window, MI_GC(mi), + 0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag); + } else { + if ((fp->size + fp->inctaille) > MAXSCALE) + fp->inctaille = -fp->inctaille; + if ((fp->size + fp->inctaille) < MINSCALE) + fp->inctaille = -fp->inctaille; + fp->size += fp->inctaille; + XCopyArea(display, fp->cache, window, MI_GC(mi), + 0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag); + } + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XFillRectangle(display, fp->cache, MI_GC(mi), + 0, 0, MAXW(fp), MAXH(fp)); + XFlush(display); + affiche(mi); + fp->sidx += 2; + fp->sidx %= (ANGLES * MI_NPIXELS(mi)); + XFlush(display); + fp->timer++; + if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi))) + init_flag(mi); +} + +void +release_flag(ModeInfo * mi) +{ + if (flags != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) + { + if (flags[screen].cache) + XFreePixmap(MI_DISPLAY(mi), flags[screen].cache); + if (flags[screen].image) + XDestroyImage(flags[screen].image); + } + (void) free((void *) flags); + flags = NULL; + } +} + +void +refresh_flag(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/flag.1 b/hacks/flag.man similarity index 100% rename from local/man/man.1/flag.1 rename to hacks/flag.man diff --git a/hacks/flame.c b/hacks/flame.c new file mode 100644 index 00000000..d723f055 --- /dev/null +++ b/hacks/flame.c @@ -0,0 +1,401 @@ +/* xscreensaver, Copyright (c) 1993, 1995, 1996 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This file was ported from xlock for use in xscreensaver (and standalone) + * by jwz on 18-Oct-93. (And again, 11-May-97.) Original copyright reads: + * + * static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK"; + * + * flame.c - recursive fractal cosmic flames. + * + * Copyright (c) 1991 by Patrick J. Naughton. + * + * 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. + * + * Comments and additions should be sent to the author: + * + * naughton@eng.sun.com + * + * Patrick J. Naughton + * MS 21-14 + * Sun Laboritories, Inc. + * 2550 Garcia Ave + * Mountain View, CA 94043 + * + * Revision History: + * 01-Jun-95: This should look more like the original with some updates by + * Scott Draves. + * 27-Jun-91: vary number of functions used. + * 24-Jun-91: fixed portability problem with integer mod (%). + * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu). + */ + +#include +#include "screenhack.h" + +#define POINT_BUFFER_SIZE 10 +#define MAXLEV 4 +#define MAXKINDS 10 + +static double f[2][3][MAXLEV]; /* three non-homogeneous transforms */ +static int max_total; +static int max_levels; +static int max_points; +static int cur_level; +static int variation; +static int snum; +static int anum; +static int num_points; +static int total_points; +static int pixcol; +static int ncolors; +static XColor *colors; +static XPoint points [POINT_BUFFER_SIZE]; +static GC gc; + +static int delay, delay2; +static int width, height; + +static short +halfrandom (int mv) +{ + static short lasthalf = 0; + unsigned long r; + + if (lasthalf) + { + r = lasthalf; + lasthalf = 0; + } + else + { + r = random (); + lasthalf = r >> 16; + } + return (r % mv); +} + +static void +init_flame (Display *dpy, Window window) +{ + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + max_points = get_integer_resource ("iterations", "Integer"); + if (max_points <= 0) max_points = 100; + + max_levels = max_points; + + max_total = get_integer_resource ("points", "Integer"); + if (max_total <= 0) max_total = 10000; + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + delay2 = get_integer_resource ("delay2", "Integer"); + if (delay2 < 0) delay2 = 0; + + variation = random() % MAXKINDS; + + if (mono_p) + ncolors = 0; + else + { + ncolors = get_integer_resource ("colors", "Integer"); + if (ncolors <= 0) ncolors = 128; + colors = (XColor *) malloc ((ncolors+1) * sizeof (*colors)); + make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors, + True, 0, True); + if (ncolors <= 2) + mono_p = True, ncolors = 0; + } + + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.background = get_pixel_resource ("background", "Background", dpy, cmap); + + if (! mono_p) + { + pixcol = halfrandom (ncolors); + gcv.foreground = (colors [pixcol].pixel); + } + + gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv); +} + +static int +recurse (double x, double y, int l, Display *dpy, Window win) +{ + int xp, yp, i; + double nx, ny; + + if (l == max_levels) + { + total_points++; + if (total_points > max_total) /* how long each fractal runs */ + return 0; + + if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0) + { + xp = points[num_points].x = (int) ((width / 2) * (x + 1.0)); + yp = points[num_points].y = (int) ((height / 2) * (y + 1.0)); + num_points++; + if (num_points >= POINT_BUFFER_SIZE) + { + XDrawPoints (dpy, win, gc, points, num_points, CoordModeOrigin); + num_points = 0; + /* if (delay) usleep (delay); */ + /* XSync (dpy, True); */ + } + } + } + else + { + for (i = 0; i < snum; i++) + { + nx = f[0][0][i] * x + f[0][1][i] * y + f[0][2][i]; + ny = f[1][0][i] * x + f[1][1][i] * y + f[1][2][i]; + if (i < anum) + { + switch (variation) + { + case 0: /* sinusoidal */ + nx = sin(nx); + ny = sin(ny); + break; + case 1: /* complex */ + { + double r2 = nx * nx + ny * ny + 1e-6; + nx = nx / r2; + ny = ny / r2; + } + break; + case 2: /* bent */ + if (nx < 0.0) + nx = nx * 2.0; + if (ny < 0.0) + ny = ny / 2.0; + break; + case 3: /* swirl */ + { + double r = (nx * nx + ny * ny); /* times k here is fun */ + double c1 = sin(r); + double c2 = cos(r); + double t = nx; + + if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4) + ny = 1e4; + else + ny = c2 * t + c1 * ny; + nx = c1 * nx - c2 * ny; + } + break; + case 4: /* horseshoe */ + { + double r, c1, c2, t; + + /* Avoid atan2: DOMAIN error message */ + if (nx == 0.0 && ny == 0.0) + r = 0.0; + else + r = atan2(nx, ny); /* times k here is fun */ + c1 = sin(r); + c2 = cos(r); + t = nx; + + nx = c1 * nx - c2 * ny; + ny = c2 * t + c1 * ny; + } + break; + case 5: /* drape */ + { + double t; + + /* Avoid atan2: DOMAIN error message */ + if (nx == 0.0 && ny == 0.0) + t = 0.0; + else + t = atan2(nx, ny) / M_PI; + + if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4) + ny = 1e4; + else + ny = sqrt(nx * nx + ny * ny) - 1.0; + nx = t; + } + break; + case 6: /* broken */ + if (nx > 1.0) + nx = nx - 1.0; + if (nx < -1.0) + nx = nx + 1.0; + if (ny > 1.0) + ny = ny - 1.0; + if (ny < -1.0) + ny = ny + 1.0; + break; + case 7: /* spherical */ + { + double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6); + + nx = nx / r; + ny = ny / r; + } + break; + case 8: /* */ + nx = atan(nx) / M_PI_2; + ny = atan(ny) / M_PI_2; + break; +/* #if 0 */ /* core dumps on some machines, why not all? */ + case 9: /* complex sine */ + { + double u = nx; + double v = ny; + double ev = exp(v); + double emv = exp(-v); + + nx = (ev + emv) * sin(u) / 2.0; + ny = (ev - emv) * cos(u) / 2.0; + } + break; + case 10: /* polynomial */ + if (nx < 0) + nx = -nx * nx; + else + nx = nx * nx; + if (ny < 0) + ny = -ny * ny; + else + ny = ny * ny; + break; +/* #endif */ + default: + nx = sin(nx); + ny = sin(ny); + } + } + if (!recurse (nx, ny, l + 1, dpy, win)) + return 0; + } + } + return 1; +} + + +static void +flame (Display *dpy, Window window) +{ + int i, j, k; + static int alt = 0; + + if (!(cur_level++ % max_levels)) + { + if (delay2) usleep (delay2); + XClearWindow (dpy, window); + alt = !alt; + + variation = random() % MAXKINDS; + } + else + { + if (ncolors > 2) + { + XSetForeground (dpy, gc, colors [pixcol].pixel); + if (--pixcol < 0) + pixcol = ncolors - 1; + } + } + + /* number of functions */ + snum = 2 + (cur_level % (MAXLEV - 1)); + + /* how many of them are of alternate form */ + if (alt) + anum = 0; + else + anum = halfrandom (snum) + 2; + + /* 6 coefs per function */ + for (k = 0; k < snum; k++) + { + for (i = 0; i < 2; i++) + for (j = 0; j < 3; j++) + f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0); + } + num_points = 0; + total_points = 0; + (void) recurse (0.0, 0.0, 0, dpy, window); + XDrawPoints (dpy, window, gc, points, num_points, CoordModeOrigin); + XSync (dpy, True); + if (delay) usleep (delay); +} + + +#ifdef __hpux +/* I don't understand why this is necessary, but I'm told that this program + does nothing at all on HP-sUX without it. + */ +#undef random +#undef srandom +#include +int matherr(x) + register struct exception *x; +{ + if (x->type == PLOSS) return 1; + else return 0; +} +#endif /* __hpux */ + + + +char *progclass = "Flame"; + +char *defaults [] = { + "Flame.background: black", /* to placate SGI */ + "Flame.foreground: white", + "*colors: 64", + "*iterations: 25", + "*delay: 50000", + "*delay2: 2000000", + "*points: 10000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-colors", ".colors", XrmoptionSepArg, 0 }, + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-points", ".points", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_flame (dpy, window); + while (1) + flame (dpy, window); +} diff --git a/local/man/man.1/flame.1 b/hacks/flame.man similarity index 100% rename from local/man/man.1/flame.1 rename to hacks/flame.man diff --git a/hacks/forest.c b/hacks/forest.c new file mode 100644 index 00000000..881fe779 --- /dev/null +++ b/hacks/forest.c @@ -0,0 +1,206 @@ +/* -*- Mode: C; tab-width: 4 -*- + * forest.c --- draw a fractal forest. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)forest.c 4.03 97/05/10 xlockmore"; +#endif + +/* Copyright (c) 1995 Pascal Pensa + * + * Original idea : Guillaume Ramey + * + * 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. + * + * Revision History: + * 10-May-97: Compatible with xscreensaver + */ + +#ifdef STANDALONE +# define PROGCLASS "Forest" +# define HACK_INIT init_forest +# define HACK_DRAW draw_forest +# define forest_opts xlockmore_opts +# define DEFAULTS "*count: 100 \n" \ + "*cycles: 200 \n" \ + "*delay: 400000 \n" \ + "*ncolors: 100 \n" +# define UNIFORM_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt forest_opts = { + 0, NULL, 0, NULL, NULL }; + + +#define MINTREES 1 + +#define MINHEIGHT 20 /* Tree height range */ +#define MAXHEIGHT 40 + +#define MINANGLE 15 /* (degree) angle between soon */ +#define MAXANGLE 35 +#define RANDANGLE 15 /* (degree) Max random angle from default */ + +#define REDUCE 90 /* Height % from father */ + +#define ITERLEVEL 10 /* Tree iteration */ + +#define COLORSPEED 2 /* Color increment */ + +/* degree to radian */ +#define DEGTORAD(x) (((float)(x)) * M_PI / 180.0) + +#define RANGE_RAND(min,max) ((min) + NRAND((max) - (min))) + +typedef struct { + int width; + int height; + int time; /* up time */ + int ntrees; +} foreststruct; + +static foreststruct *forests = NULL; + +static void +draw_tree(ModeInfo * mi, + short int x, short int y, short int len, + float a, float as, short int c, short int level) + /* Father's end */ + /* Length */ + /* color */ + /* Height level */ + /* Father's angle */ + /* Father's angle step */ +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + short x_1, y_1, x_2, y_2; + float a1, a2; + + /* left */ + + a1 = a + as + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE); + + x_1 = x + (short) (COSF(a1) * ((float) len)); + y_1 = y + (short) (SINF(a1) * ((float) len)); + + /* right */ + + a2 = a - as + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE); + + x_2 = x + (short) (COSF(a2) * ((float) len)); + y_2 = y + (short) (SINF(a2) * ((float) len)); + + if (MI_NPIXELS(mi) > 2) { + XSetForeground(display, gc, MI_PIXEL(mi, c)); + c = (c + COLORSPEED) % MI_NPIXELS(mi); + } else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + + XDrawLine(display, window, gc, x, y, x_1, y_1); + XDrawLine(display, window, gc, x, y, x_2, y_2); + + if (level < 2) { + XDrawLine(display, window, gc, x + 1, y, x_1 + 1, y_1); + XDrawLine(display, window, gc, x + 1, y, x_2 + 1, y_2); + } + len = (len * REDUCE * 10) / 1000; + + if (level < ITERLEVEL) { + draw_tree(mi, x_1, y_1, len, a1, as, c, level + 1); + draw_tree(mi, x_2, y_2, len, a2, as, c, level + 1); + } +} + +void +init_forest(ModeInfo * mi) +{ + foreststruct *fp; + + if (forests == NULL) { + if ((forests = (foreststruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (foreststruct))) == NULL) + return; + } + fp = &forests[MI_SCREEN(mi)]; + + fp->width = MI_WIN_WIDTH(mi); + fp->height = MI_WIN_HEIGHT(mi); + fp->time = 0; + + fp->ntrees = MI_BATCHCOUNT(mi); + if (fp->ntrees < -MINTREES) + fp->ntrees = NRAND(-fp->ntrees - MINTREES + 1) + MINTREES; + else if (fp->ntrees < MINTREES) + fp->ntrees = MINTREES; + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} + +void +draw_forest(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + foreststruct *fp = &forests[MI_SCREEN(mi)]; + short x, y, x_2, y_2, len, c = 0; + float a, as; + + if (fp->time < fp->ntrees) { + + x = RANGE_RAND(0, fp->width); + y = RANGE_RAND(0, fp->height + MAXHEIGHT); + a = -M_PI / 2.0 + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE); + as = DEGTORAD(RANGE_RAND(MINANGLE, MAXANGLE)); + len = ((RANGE_RAND(MINHEIGHT, MAXHEIGHT) * (fp->width / 20)) / 50) + 2; + + if (MI_NPIXELS(mi) > 2) { + c = NRAND(MI_NPIXELS(mi)); + XSetForeground(display, gc, MI_PIXEL(mi, c)); + c = (c + COLORSPEED) % MI_NPIXELS(mi); + } else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + + x_2 = x + (short) (COSF(a) * ((float) len)); + y_2 = y + (short) (SINF(a) * ((float) len)); + + XDrawLine(display, MI_WINDOW(mi), gc, x, y, x_2, y_2); + XDrawLine(display, MI_WINDOW(mi), gc, x + 1, y, x_2 + 1, y_2); + + draw_tree(mi, x_2, y_2, (len * REDUCE) / 100, a, as, c, 1); + } + if (++fp->time > MI_CYCLES(mi)) + init_forest(mi); +} + +void +release_forest(ModeInfo * mi) +{ + if (forests != NULL) { + (void) free((void *) forests); + forests = NULL; + } +} + +void +refresh_forest(ModeInfo * mi) +{ + foreststruct *fp = &forests[MI_SCREEN(mi)]; + + if (fp->time < fp->ntrees) + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + else + init_forest(mi); +} diff --git a/local/man/man.1/forest.1 b/hacks/forest.man similarity index 100% rename from local/man/man.1/forest.1 rename to hacks/forest.man diff --git a/hacks/fract.c b/hacks/fract.c new file mode 100644 index 00000000..c8a65453 --- /dev/null +++ b/hacks/fract.c @@ -0,0 +1,135 @@ +/* -*- Mode: C; tab-width: 4 -*- + * fract --- another geometric pattern generator. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)fract.c 4.02 97/04/01 xlockmore"; +#endif + +/* xlockmore mode written by Tracy Camp + * campt@hurrah.com 1997 + * released to the public domain + * + * This was modifed from a 'screen saver' that a friend and I + * wrote on our TI-8x calculators in high school physics one day + * Basically another geometric pattern generator, this ones claim + * to fame is a pseudo-fractal looking vine like pattern that creates + * nifty whorls and loops. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 21-Mar-97: David Hansen + * Updated mode to draw complete patterns on every + * iteration instead of growing the vine. Also made + * adjustments to randomization and changed variable + * names to make logic easier to follow. + */ + +#ifdef STANDALONE +# define PROGCLASS "Fract" +# define HACK_INIT init_fract +# define HACK_DRAW draw_fract +# define fract_opts xlockmore_opts +# define DEFAULTS "*delay: 200000 \n" \ + "*ncolors: 64 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt fract_opts = { + 0, NULL, 0, NULL, NULL }; + +typedef struct { + int a; + int x1; + int y1; + int x2; + int y2; + int length; + int iterations; + int constant; + int ang; + int centerx; + int centery; +} fractstruct; + +static fractstruct *fracts = NULL; + +void +refresh_fract(ModeInfo * mi) +{ +} + +void +init_fract(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + fractstruct *fp; + + if (fracts == NULL) { + if ((fracts = (fractstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (fractstruct))) == NULL) { + return; + } + } + fp = &fracts[MI_SCREEN(mi)]; + + fp->iterations = 30 + NRAND(100); + + XClearWindow(display, MI_WINDOW(mi)); +} + +void +draw_fract(ModeInfo * mi) +{ + fractstruct *fp = &fracts[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + int i; + + if (--(fp->iterations) == 0) + init_fract(mi); + + fp->centerx = NRAND(MI_WIN_WIDTH(mi)); + fp->centery = NRAND(MI_WIN_HEIGHT(mi)); + + fp->ang = 60 + NRAND(720); + fp->length = 100 + NRAND(3000); + fp->constant = fp->length * (10 + NRAND(10)); + + fp->a = 0; + fp->x1 = 0; + fp->y1 = 0; + fp->x2 = 1; + fp->y2 = 0; + + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)))); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + + + for (i = 0; i < fp->length; i++) { + XDrawLine(display, MI_WINDOW(mi), gc, + fp->centerx + (fp->x1 / fp->constant), + fp->centery - (fp->y1 / fp->constant), + fp->centerx + (fp->x2 / fp->constant), + fp->centery - (fp->y2 / fp->constant)); + + fp->a += (fp->ang * i); + + fp->x1 = fp->x2; + fp->y1 = fp->y2; + + fp->x2 += (int) (i * ((cos(fp->a) * 360) / (2 * M_PI))); + fp->y2 += (int) (i * ((sin(fp->a) * 360) / (2 * M_PI))); + } +} + +void +release_fract(ModeInfo * mi) +{ + if (fracts != NULL) { + (void) free((void *) fracts); + fracts = NULL; + } +} diff --git a/local/man/man.1/fract.1 b/hacks/fract.man similarity index 100% rename from local/man/man.1/fract.1 rename to hacks/fract.man diff --git a/hacks/galaxy.c b/hacks/galaxy.c new file mode 100644 index 00000000..737c4f5d --- /dev/null +++ b/hacks/galaxy.c @@ -0,0 +1,442 @@ +/* -*- Mode: C; tab-width: 4 -*- + * galaxy --- draw spinning, colliding galaxies. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)galaxy.c 4.02 97/04/01 xlockmore"; +#endif + +/* Originally done by Uli Siegmund (uli@wombat.okapi.sub.org) on Amiga + * for EGS in Cluster + * + * 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. + * Port to X11 and incorporation into xlockmore by Hubert Feyrer + * (hubert.feyrer@rz.uni-regensburg.de) + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 18-Apr-97: Memory leak fixed by Tom Schmidt + * 07-Apr-97: Modified by Dave Mitchell + * 23-Oct-94: Modified by David Bagley + * random star sizes + * colors change depending on velocity + * 10-Oct-94: Add colors by Hubert Feyer + * 30-Sep-94: Initial port by Hubert Feyer + * 09-Mar-94: VMS can generate a random number 0.0 which results in a + * division by zero, corrected by Jouk Jansen + * + */ + +#ifdef STANDALONE +# define PROGCLASS "Galaxy" +# define HACK_INIT init_galaxy +# define HACK_DRAW draw_galaxy +# define galaxy_opts xlockmore_opts +# define DEFAULTS "*count: 5 \n" \ + "*cycles: 250 \n" \ + "*delay: 100 \n" \ + "*size: 3 \n" \ + "*ncolors: 64 \n" +# define UNIFORM_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#define FLOATRAND ((double) LRAND() / ((double) MAXRAND)) + +#if 0 +#define WRAP 1 /* Warp around edges */ +#define BOUNCE 1 /* Bounce from borders */ +#endif + +#define MINSIZE 1 +#define MINGALAXIES 1 +#define MAX_STARS 300 +#define MAX_IDELTAT 50 +/* These come originally from the Cluster-version */ +#define DEFAULT_GALAXIES 2 +#define DEFAULT_STARS 1000 +#define DEFAULT_HITITERATIONS 7500 +#define DEFAULT_IDELTAT 200 /* 0.02 */ +#define EPSILON 0.0000001 + +#define GALAXYRANGESIZE 0.1 +#define GALAXYMINSIZE 0.1 +#define QCONS 0.001 + +#define COLORBASE 8 + /* Colors for stars start here */ +#define COLORSTEP (NUMCOLORS/COLORBASE) /* 8 colors per galaxy */ + +#define drawStar(x,y,size) if(size<=1) XDrawPoint(display,window,gc,x,y);\ + else XFillArc(display,window,gc,x,y,size,size,0,23040) + + +static Bool tracks; + +#define DEF_TRACKS "False" + +static XrmOptionDescRec opts[] = +{ + {"-tracks", ".galaxy.tracks", XrmoptionNoArg, (caddr_t) "on"}, + {"+tracks", ".galaxy.tracks", XrmoptionNoArg, (caddr_t) "off"} +}; + +static argtype vars[] = +{ + {(caddr_t *) & tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool} +}; + +static OptionStruct desc[] = +{ + {"-/+tracks", "turn on/off star tracks"} +}; + +ModeSpecOpt galaxy_opts = { 2, opts, 1, vars, desc }; + + +typedef struct { + double pos[3], vel[3]; + int px, py; + int color; + int size; +} Star; + +typedef struct { + int mass; + int nstars; + Star *stars; + double pos[3], vel[3]; + int galcol; +} Galaxy; + +typedef struct { + struct { + int left; /* x minimum */ + int right; /* x maximum */ + int top; /* y minimum */ + int bottom; /* y maximum */ + } clip; + double mat[3][3]; /* Movement of stars(?) */ + double scale; /* Scale */ + int midx; /* Middle of screen, x */ + int midy; /* Middle of screen, y */ + double size; /* */ + double diff[3]; /* */ + Galaxy *galaxies; /* the Whole Universe */ + int ngalaxies; /* # galaxies */ + double f_deltat; /* quality of calculation, calc'd by d_ideltat */ + int f_hititerations; /* # iterations before restart */ + int step; /* */ +} unistruct; + +static unistruct *universes = NULL; + +static void +free_galaxies(unistruct * gp) +{ + if (gp->galaxies != NULL) { + int i; + + for (i = 0; i < gp->ngalaxies; i++) { + Galaxy *gt = &gp->galaxies[i]; + + if (gt->stars != NULL) + (void) free((void *) gt->stars); + } + (void) free((void *) gp->galaxies); + gp->galaxies = NULL; + } +} + +static void +startover(ModeInfo * mi) +{ + unistruct *gp = &universes[MI_SCREEN(mi)]; + int size = MI_SIZE(mi); + int i, j; /* more tmp */ + double w1, w2; /* more tmp */ + double d, v, w, h; /* yet more tmp */ + + gp->step = 0; + + if (MI_BATCHCOUNT(mi) < -MINGALAXIES) + free_galaxies(gp); + gp->ngalaxies = MI_BATCHCOUNT(mi); + if (gp->ngalaxies < -MINGALAXIES) + gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES; + else if (gp->ngalaxies < MINGALAXIES) + gp->ngalaxies = MINGALAXIES; + if (gp->galaxies == NULL) + gp->galaxies = (Galaxy *) calloc(gp->ngalaxies, sizeof (Galaxy)); + + for (i = 0; i < gp->ngalaxies; ++i) { + Galaxy *gt = &gp->galaxies[i]; + double sinw1, sinw2, cosw1, cosw2; + + gt->galcol = NRAND(COLORBASE - 2); + if (gt->galcol > 1) + gt->galcol += 2; /* Mult 8; 16..31 no green stars */ + /* Galaxies still may have some green stars but are not all green. */ + + if (gt->stars != NULL) { + (void) free((void *) gt->stars); + gt->stars = NULL; + } + gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2; + gt->stars = (Star *) malloc(gt->nstars * sizeof (Star)); + w1 = 2.0 * M_PI * FLOATRAND; + w2 = 2.0 * M_PI * FLOATRAND; + sinw1 = SINF(w1); + sinw2 = SINF(w2); + cosw1 = COSF(w1); + cosw2 = COSF(w2); + + gp->mat[0][0] = cosw2; + gp->mat[0][1] = -sinw1 * sinw2; + gp->mat[0][2] = cosw1 * sinw2; + gp->mat[1][0] = 0.0; + gp->mat[1][1] = cosw1; + gp->mat[1][2] = sinw1; + gp->mat[2][0] = -sinw2; + gp->mat[2][1] = -sinw1 * cosw2; + gp->mat[2][2] = cosw1 * cosw2; + + gt->vel[0] = FLOATRAND * 2.0 - 1.0; + gt->vel[1] = FLOATRAND * 2.0 - 1.0; + gt->vel[2] = FLOATRAND * 2.0 - 1.0; + gt->pos[0] = -gt->vel[0] * gp->f_deltat * + gp->f_hititerations + FLOATRAND - 0.5; + gt->pos[1] = -gt->vel[1] * gp->f_deltat * + gp->f_hititerations + FLOATRAND - 0.5; + gt->pos[2] = -gt->vel[2] * gp->f_deltat * + gp->f_hititerations + FLOATRAND - 0.5; + + gt->mass = (int) (FLOATRAND * 1000.0) + 1; + + gp->size = GALAXYRANGESIZE * FLOATRAND + GALAXYMINSIZE; + + for (j = 0; j < gt->nstars; ++j) { + Star *st = >->stars[j]; + double sinw, cosw; + + w = 2.0 * M_PI * FLOATRAND; + sinw = SINF(w); + cosw = COSF(w); + d = FLOATRAND * gp->size; + h = FLOATRAND * exp(-2.0 * (d / gp->size)) / 5.0 * gp->size; + if (FLOATRAND < 0.5) + h = -h; + st->pos[0] = gp->mat[0][0] * d * cosw + gp->mat[1][0] * d * sinw + + gp->mat[2][0] * h + gt->pos[0]; + st->pos[1] = gp->mat[0][1] * d * cosw + gp->mat[1][1] * d * sinw + + gp->mat[2][1] * h + gt->pos[1]; + st->pos[2] = gp->mat[0][2] * d * cosw + gp->mat[1][2] * d * sinw + + gp->mat[2][2] * h + gt->pos[2]; + + v = sqrt(gt->mass * QCONS / sqrt(d * d + h * h)); + st->vel[0] = -gp->mat[0][0] * v * sinw + gp->mat[1][0] * v * cosw + + gt->vel[0]; + st->vel[1] = -gp->mat[0][1] * v * sinw + gp->mat[1][1] * v * cosw + + gt->vel[1]; + st->vel[2] = -gp->mat[0][2] * v * sinw + gp->mat[1][2] * v * cosw + + gt->vel[2]; + + st->px = 0; + st->py = 0; + + if (size < -MINSIZE) + st->size = NRAND(-size - MINSIZE + 1) + MINSIZE; + else if (size < MINSIZE) + st->size = MINSIZE; + else + st->size = size; + } + } + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + +#if 0 + (void) printf("ngalaxies=%d, f_hititerations=%d\n", + gp->ngalaxies, gp->f_hititerations); + (void) printf("f_deltat=%g\n", gp->f_deltat); + (void) printf("Screen: "); + (void) printf("%dx%d pixel (%d-%d, %d-%d)\n", + (gp->clip.right - gp->clip.left), (gp->clip.bottom - gp->clip.top), + gp->clip.left, gp->clip.right, gp->clip.top, gp->clip.bottom); +#endif /*0 */ +} + +void +init_galaxy(ModeInfo * mi) +{ + unistruct *gp; + + if (universes == NULL) { + if ((universes = (unistruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (unistruct))) == NULL) + return; + } + gp = &universes[MI_SCREEN(mi)]; + + gp->f_hititerations = MI_CYCLES(mi); + gp->f_deltat = ((double) MAX_IDELTAT) / 10000.0; + + gp->clip.left = 0; + gp->clip.top = 0; + gp->clip.right = MI_WIN_WIDTH(mi); + gp->clip.bottom = MI_WIN_HEIGHT(mi); + + gp->scale = (double) (gp->clip.right + gp->clip.bottom) / 8.0; + gp->midx = gp->clip.right / 2; + gp->midy = gp->clip.bottom / 2; + startover(mi); +} + +void +draw_galaxy(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + unistruct *gp = &universes[MI_SCREEN(mi)]; + double d; /* tmp */ + int i, j, k; /* more tmp */ + + for (i = 0; i < gp->ngalaxies; ++i) { + Galaxy *gt = &gp->galaxies[i]; + + for (j = 0; j < gp->galaxies[i].nstars; ++j) { + Star *st = >->stars[j]; + + for (k = 0; k < gp->ngalaxies; ++k) { + Galaxy *gtk = &gp->galaxies[k]; + + gp->diff[0] = gtk->pos[0] - st->pos[0]; + gp->diff[1] = gtk->pos[1] - st->pos[1]; + gp->diff[2] = gtk->pos[2] - st->pos[2]; + d = gp->diff[0] * gp->diff[0] + gp->diff[1] * gp->diff[1] + + gp->diff[2] * gp->diff[2]; + if (d < EPSILON) + d = EPSILON; + d = gt->mass / (d * sqrt(d)) * gp->f_deltat * QCONS; + gp->diff[0] *= d; + gp->diff[1] *= d; + gp->diff[2] *= d; + st->vel[0] += gp->diff[0]; + st->vel[1] += gp->diff[1]; + st->vel[2] += gp->diff[2]; + } + + st->color = COLORSTEP * gt->galcol + ((int) ((st->vel[0] * st->vel[0] + + st->vel[1] * st->vel[1] + st->vel[2] * st->vel[2]) / 3.0)) % COLORSTEP; + + st->pos[0] += st->vel[0] * gp->f_deltat; + st->pos[1] += st->vel[1] * gp->f_deltat; + st->pos[2] += st->vel[2] * gp->f_deltat; + + if (st->px >= gp->clip.left && + st->px <= gp->clip.right - st->size && + st->py >= gp->clip.top && + st->py <= gp->clip.bottom - st->size) { + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + drawStar(st->px, st->py, st->size); + } + st->px = (int) (st->pos[0] * gp->scale) + gp->midx; + st->py = (int) (st->pos[1] * gp->scale) + gp->midy; + + +#ifdef WRAP + if (st->px < gp->clip.left) { + (void) printf("wrap l -> r\n"); + st->px = gp->clip.right; + } + if (st->px > gp->clip.right) { + (void) printf("wrap r -> l\n"); + st->px = gp->clip.left; + } + if (st->py > gp->clip.bottom) { + (void) printf("wrap b -> t\n"); + st->py = gp->clip.top; + } + if (st->py < gp->clip.top) { + (void) printf("wrap t -> b\n"); + st->py = gp->clip.bottom; + } +#endif /*WRAP */ + + + if (st->px >= gp->clip.left && + st->px <= gp->clip.right - st->size && + st->py >= gp->clip.top && + st->py <= gp->clip.bottom - st->size) { + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, st->color)); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + if (tracks) + drawStar(st->px + 1, st->py, st->size); + else + drawStar(st->px, st->py, st->size); + } + } + + for (k = i + 1; k < gp->ngalaxies; ++k) { + Galaxy *gtk = &gp->galaxies[k]; + + gp->diff[0] = gtk->pos[0] - gt->pos[0]; + gp->diff[1] = gtk->pos[1] - gt->pos[1]; + gp->diff[2] = gtk->pos[2] - gt->pos[2]; + d = gp->diff[0] * gp->diff[0] + gp->diff[1] * gp->diff[1] + + gp->diff[2] * gp->diff[2]; + if (d < EPSILON) + d = EPSILON; + d = gt->mass * gt->mass / (d * sqrt(d)) * gp->f_deltat * QCONS; + gp->diff[0] *= d; + gp->diff[1] *= d; + gp->diff[2] *= d; + gt->vel[0] += gp->diff[0] / gt->mass; + gt->vel[1] += gp->diff[1] / gt->mass; + gt->vel[2] += gp->diff[2] / gt->mass; + gtk->vel[0] -= gp->diff[0] / gtk->mass; + gtk->vel[1] -= gp->diff[1] / gtk->mass; + gtk->vel[2] -= gp->diff[2] / gtk->mass; + } + gt->pos[0] += gt->vel[0] * gp->f_deltat; + gt->pos[1] += gt->vel[1] * gp->f_deltat; + gt->pos[2] += gt->vel[2] * gp->f_deltat; + } + + gp->step++; + if (gp->step > gp->f_hititerations * 4) + startover(mi); +} + +void +release_galaxy(ModeInfo * mi) +{ + if (universes != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) + free_galaxies(&universes[screen]); + (void) free((void *) universes); + universes = NULL; + } +} + +void +refresh_galaxy(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/galaxy.1 b/hacks/galaxy.man similarity index 100% rename from local/man/man.1/galaxy.1 rename to hacks/galaxy.man diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in new file mode 100644 index 00000000..2f8292b6 --- /dev/null +++ b/hacks/glx/Makefile.in @@ -0,0 +1,333 @@ +# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski. +# the `../../configure' script generates `hacks/glx/Makefile' from this file. + +@SET_MAKE@ +.SUFFIXES: +.SUFFIXES: .c .o + +srcdir = @srcdir@ +VPATH = @srcdir@ + +install_prefix = +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +mandir = @mandir@ +man1dir = $(mandir)/man1 +mansuffix = 1 + +CC = @CC@ +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +DEFS = -DSTANDALONE -DUSE_GL @DEFS@ +LIBS = @LIBS@ + +DEPEND = @DEPEND@ +DEPEND_FLAGS = @DEPEND_FLAGS@ +DEPEND_DEFINES = @DEPEND_DEFINES@ + +SHELL = /bin/sh +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +HACKDIR = @HACKDIR@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ + +HACK_LIBS = $(LIBS) $(X_LIBS) $(X_PRE_LIBS) @GL_LIBS@ @HACK_LIBS@ \ + -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm + +HACK_SRC = $(srcdir)/.. +HACK_BIN = .. +UTILS_SRC = $(HACK_SRC)/../utils +UTILS_BIN = $(HACK_BIN)/../utils + +INCLUDES = -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) \ + -I$(HACK_SRC)/.. @INCLUDES@ + +UTIL_SRCS = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \ + $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \ + $(UTILS_SRC)/visual.c $(UTILS_SRC)/yarandom.c +UTIL_OBJS = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \ + $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \ + $(UTILS_SRC)/visual.o $(UTILS_SRC)/yarandom.o + +SRCS = buildlwo.c escher.c gears.c morph3d.c pipeobjs.c pipes.c \ + s1_1.c s1_2.c s1_3.c s1_4.c s1_5.c s1_6.c s1_b.c \ + sproingies.c sproingiewrap.c superquadrics.c rubik.c \ + xlock-gl.c + +OBJS = buildlwo.o escher.o gears.o morph3d.o pipeobjs.o pipes.o \ + s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o \ + sproingies.o sproingiewrap.o superquadrics.o rubik.o \ + xlock-gl.o + +GL_EXES = escher gears pipes sproingies superquadrics morph3d rubik +EXES = @GL_EXES@ + +HACK_OBJS = screenhack-gl.o xlock-gl.o $(HACK_BIN)/xlockmore.o \ + $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \ + $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o + +HDRS = buildlwo.h e_textures.h +MEN = +EXTRAS = README Makefile.in + +TARFILES = $(SRCS) $(HDRS) $(MEN) $(EXTRAS) + + +all: $(EXES) + +install: install-program install-man +uninstall: uninstall-program uninstall-man + +install-strip: + $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install + +install-program: + @exes="$(EXES)" ; \ + for program in $$exes; do \ + echo $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ; \ + $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ; \ + done + +install-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ; \ + done + +uninstall-program: + @for program in $(EXES); do \ + echo rm -f $(HACKDIR)/$$program ; \ + rm -f $(HACKDIR)/$$program ; \ + done + +uninstall-man: + @men="$(MEN)" ; \ + for man in $$men; do \ + instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ; \ + echo rm -f $(man1dir)/$$instname ; \ + rm -f $(man1dir)/$$instname ; \ + done + +clean: + -rm -f *.o a.out core $(EXES) + +distclean: clean + -rm -f Makefile *~ "#"* + +# Adds all current dependencies to Makefile +depend: + $(DEPEND) -s '# DO NOT DELETE: updated by make depend' \ + $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SRCS) + +# Adds some dependencies to Makefile.in -- not totally accurate, but pretty +# close. This excludes dependencies on files in /usr/include, etc. It tries +# to include only dependencies on files which are themselves a part of this +# package. +distdepend: + @echo updating dependencies in `pwd`/Makefile.in... ; \ + $(DEPEND) -w 0 -f - \ + -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \ + $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) -- \ + $(SRCS) | \ + ( \ + awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \ + sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d' \ + -e 's@\.\./\.\./utils@$$(UTILS_SRC)@g' \ + -e 's@\.\./glx/@@g' \ + -e 's@ \.\./@ $$(HACK_SRC)/@g' \ + -e 's@ \([^$$]\)@ $$(srcdir)/\1@g' ; \ + echo '' \ + ) > /tmp/distdepend.$$$$ && \ + mv Makefile.in Makefile.in.bak && \ + mv /tmp/distdepend.$$$$ Makefile.in + +TAGS: tags +tags: + find $(srcdir) -name '*.[chly]' -print | xargs etags -a + +echo_tarfiles: + @echo $(TARFILES) + + +# Rules for noticing when the objects from the utils directory are out of +# date with respect to their sources, and going and building them according +# to the rules in their own Makefile... +# +$(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c +$(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c +$(UTILS_BIN)/resources.o: $(UTILS_SRC)/resources.c +$(UTILS_BIN)/usleep.o: $(UTILS_SRC)/usleep.c +$(UTILS_BIN)/visual.o: $(UTILS_SRC)/visual.c +$(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c + +$(UTIL_OBJS): + cd $(UTILS_BIN) ; \ + $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" + +$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c + cd $(HACK_BIN) ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" + + +# How we build object files in this directory. +.c.o: + $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $< + +# These hacks use a slightly-differently-compiled variant of screenhack.c. +# This is how to make the the other .o file from it. +# +screenhack-gl.o: $(HACK_SRC)/screenhack.c + $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \ + -DXLOCKMORE -DUSE_GL $(HACK_SRC)/screenhack.c + +CC_HACK = $(CC) $(LDFLAGS) + +gears: gears.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +superquadrics: superquadrics.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +escher: escher.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +pipes: pipes.o $(HACK_OBJS) pipeobjs.o buildlwo.o + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) pipeobjs.o buildlwo.o \ + $(HACK_LIBS) + +morph3d: morph3d.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +rubik: rubik.o $(HACK_OBJS) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(HACK_LIBS) + +SPROINGIES = sproingiewrap.o buildlwo.o \ + s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o +sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES) + $(CC_HACK) -o $@ $@.o $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS) + + +############################################################################## +# +# DO NOT DELETE: updated by make distdepend + +buildlwo.o: $(srcdir)/buildlwo.h +escher.o: $(HACK_SRC)/xlockmore.h +escher.o: $(HACK_SRC)/../config.h +escher.o: $(HACK_SRC)/xlockmoreI.h +escher.o: $(HACK_SRC)/screenhack.h +escher.o: $(UTILS_SRC)/yarandom.h +escher.o: $(UTILS_SRC)/usleep.h +escher.o: $(UTILS_SRC)/resources.h +escher.o: $(UTILS_SRC)/hsv.h +escher.o: $(UTILS_SRC)/colors.h +escher.o: $(UTILS_SRC)/grabscreen.h +escher.o: $(UTILS_SRC)/visual.h +escher.o: $(srcdir)/e_textures.h +gears.o: $(HACK_SRC)/xlockmore.h +gears.o: $(HACK_SRC)/../config.h +gears.o: $(HACK_SRC)/xlockmoreI.h +gears.o: $(HACK_SRC)/screenhack.h +gears.o: $(UTILS_SRC)/yarandom.h +gears.o: $(UTILS_SRC)/usleep.h +gears.o: $(UTILS_SRC)/resources.h +gears.o: $(UTILS_SRC)/hsv.h +gears.o: $(UTILS_SRC)/colors.h +gears.o: $(UTILS_SRC)/grabscreen.h +gears.o: $(UTILS_SRC)/visual.h +morph3d.o: $(HACK_SRC)/xlockmore.h +morph3d.o: $(HACK_SRC)/../config.h +morph3d.o: $(HACK_SRC)/xlockmoreI.h +morph3d.o: $(HACK_SRC)/screenhack.h +morph3d.o: $(UTILS_SRC)/yarandom.h +morph3d.o: $(UTILS_SRC)/usleep.h +morph3d.o: $(UTILS_SRC)/resources.h +morph3d.o: $(UTILS_SRC)/hsv.h +morph3d.o: $(UTILS_SRC)/colors.h +morph3d.o: $(UTILS_SRC)/grabscreen.h +morph3d.o: $(UTILS_SRC)/visual.h +pipeobjs.o: $(srcdir)/buildlwo.h +pipes.o: $(HACK_SRC)/xlockmore.h +pipes.o: $(HACK_SRC)/../config.h +pipes.o: $(HACK_SRC)/xlockmoreI.h +pipes.o: $(HACK_SRC)/screenhack.h +pipes.o: $(UTILS_SRC)/yarandom.h +pipes.o: $(UTILS_SRC)/usleep.h +pipes.o: $(UTILS_SRC)/resources.h +pipes.o: $(UTILS_SRC)/hsv.h +pipes.o: $(UTILS_SRC)/colors.h +pipes.o: $(UTILS_SRC)/grabscreen.h +pipes.o: $(UTILS_SRC)/visual.h +pipes.o: $(srcdir)/buildlwo.h +s1_1.o: $(srcdir)/buildlwo.h +s1_2.o: $(srcdir)/buildlwo.h +s1_3.o: $(srcdir)/buildlwo.h +s1_4.o: $(srcdir)/buildlwo.h +s1_5.o: $(srcdir)/buildlwo.h +s1_6.o: $(srcdir)/buildlwo.h +s1_b.o: $(srcdir)/buildlwo.h +sproingies.o: $(HACK_SRC)/xlockmoreI.h +sproingies.o: $(HACK_SRC)/screenhack.h +sproingies.o: $(HACK_SRC)/../config.h +sproingies.o: $(UTILS_SRC)/yarandom.h +sproingies.o: $(UTILS_SRC)/usleep.h +sproingies.o: $(UTILS_SRC)/resources.h +sproingies.o: $(UTILS_SRC)/hsv.h +sproingies.o: $(UTILS_SRC)/colors.h +sproingies.o: $(UTILS_SRC)/grabscreen.h +sproingies.o: $(UTILS_SRC)/visual.h +sproingies.o: $(srcdir)/buildlwo.h +sproingiewrap.o: $(HACK_SRC)/xlockmore.h +sproingiewrap.o: $(HACK_SRC)/../config.h +sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h +sproingiewrap.o: $(HACK_SRC)/screenhack.h +sproingiewrap.o: $(UTILS_SRC)/yarandom.h +sproingiewrap.o: $(UTILS_SRC)/usleep.h +sproingiewrap.o: $(UTILS_SRC)/resources.h +sproingiewrap.o: $(UTILS_SRC)/hsv.h +sproingiewrap.o: $(UTILS_SRC)/colors.h +sproingiewrap.o: $(UTILS_SRC)/grabscreen.h +sproingiewrap.o: $(UTILS_SRC)/visual.h +superquadrics.o: $(HACK_SRC)/xlockmore.h +superquadrics.o: $(HACK_SRC)/../config.h +superquadrics.o: $(HACK_SRC)/xlockmoreI.h +superquadrics.o: $(HACK_SRC)/screenhack.h +superquadrics.o: $(UTILS_SRC)/yarandom.h +superquadrics.o: $(UTILS_SRC)/usleep.h +superquadrics.o: $(UTILS_SRC)/resources.h +superquadrics.o: $(UTILS_SRC)/hsv.h +superquadrics.o: $(UTILS_SRC)/colors.h +superquadrics.o: $(UTILS_SRC)/grabscreen.h +superquadrics.o: $(UTILS_SRC)/visual.h +rubik.o: $(HACK_SRC)/xlockmore.h +rubik.o: $(HACK_SRC)/../config.h +rubik.o: $(HACK_SRC)/xlockmoreI.h +rubik.o: $(HACK_SRC)/screenhack.h +rubik.o: $(UTILS_SRC)/yarandom.h +rubik.o: $(UTILS_SRC)/usleep.h +rubik.o: $(UTILS_SRC)/resources.h +rubik.o: $(UTILS_SRC)/hsv.h +rubik.o: $(UTILS_SRC)/colors.h +rubik.o: $(UTILS_SRC)/grabscreen.h +rubik.o: $(UTILS_SRC)/visual.h +xlock-gl.o: $(HACK_SRC)/screenhack.h +xlock-gl.o: $(HACK_SRC)/../config.h +xlock-gl.o: $(UTILS_SRC)/yarandom.h +xlock-gl.o: $(UTILS_SRC)/usleep.h +xlock-gl.o: $(UTILS_SRC)/resources.h +xlock-gl.o: $(UTILS_SRC)/hsv.h +xlock-gl.o: $(UTILS_SRC)/colors.h +xlock-gl.o: $(UTILS_SRC)/grabscreen.h +xlock-gl.o: $(UTILS_SRC)/visual.h +xlock-gl.o: $(HACK_SRC)/xlockmoreI.h + diff --git a/hacks/glx/README b/hacks/glx/README new file mode 100644 index 00000000..83a795b6 --- /dev/null +++ b/hacks/glx/README @@ -0,0 +1,6 @@ + +This directory contains various graphics hacks that requre GL. These are +independent from the xscreensaver program (in the ../../driver/ directory) +but some of them use the utility functions found in the ../../utils/ directory. + +If you have compilation problems, check the parameters in ../../config.h. diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c new file mode 100644 index 00000000..f405730d --- /dev/null +++ b/hacks/glx/buildlwo.c @@ -0,0 +1,101 @@ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)buildlwo.c 4.02 97/04/20 xlockmore"; + +#endif + +/*- + * buildlwo.c: Lightwave Object Display List Builder for OpenGL + * + * This module can be called by any GL mode wishing to use + * objects created in NewTek's Lightwave 3D. The objects must + * first be converted to C source with my converter "lw2ogl". + * If other people are interested in this, I will put up a + * web page for it at http://www.early.com/~emackey/lw2ogl/ + * + * by Ed Mackey, 4/19/97 + * + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include +#include "buildlwo.h" + +GLuint +BuildLWO(int wireframe, struct lwo *object) +{ + GLuint dl_num; + GLfloat *pnts, *normals, three[3], *grab; + unsigned short int *pols; + int p, num_pnts = 0; + + dl_num = glGenLists(1); + if (!dl_num) + return (0); + + pnts = object->pnts; + normals = object->normals; + pols = object->pols; + + glNewList(dl_num, GL_COMPILE); + + if (!pols) { + num_pnts = object->num_pnts; + glBegin(GL_POINTS); + for (p = 0; p < num_pnts; ++p) { + three[0] = *(pnts++); + three[1] = *(pnts++); + three[2] = *(pnts++); + glVertex3fv(three); + } + glEnd(); + } else + for (;;) { + if (num_pnts <= 0) { + num_pnts = *pols + 2; + if (num_pnts < 3) + break; + if (num_pnts == 3) { + glBegin(GL_POINTS); + } else if (num_pnts == 4) { + glBegin(GL_LINES); + } else { + three[0] = *(normals++); + three[1] = *(normals++); + three[2] = *(normals++); + glNormal3fv(three); + if (wireframe) + glBegin(GL_LINE_LOOP); + else + glBegin(GL_POLYGON); + } + } else if (num_pnts == 1) { + glEnd(); + } else { + grab = pnts + ((int) (*pols) * 3); + three[0] = *(grab++); + three[1] = *(grab++); + three[2] = *(grab++); + glVertex3fv(three); + } + --num_pnts; + ++pols; + } + + glEndList(); + + return (dl_num); +} + +#endif /* USE_GL */ + +/* End of buildlwo.c */ diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h new file mode 100644 index 00000000..fd9f027e --- /dev/null +++ b/hacks/glx/buildlwo.h @@ -0,0 +1,24 @@ +/*- + * buildlwo.h: Header file for Lightwave Object Display List Builder + * for OpenGL + * + * by Ed Mackey, 4/19/97 + * + */ + +#ifndef __BUILD_LWO_H__ +#define __BUILD_LWO_H__ + +struct lwo { + int num_pnts; + GLfloat *pnts; + GLfloat *normals; + unsigned short int *pols; + GLfloat *smoothnormals; +}; + +GLuint BuildLWO(int wireframe, struct lwo *object); + +#endif + +/* End of buildlwo.h */ diff --git a/hacks/glx/e_textures.h b/hacks/glx/e_textures.h new file mode 100644 index 00000000..7f9457e3 --- /dev/null +++ b/hacks/glx/e_textures.h @@ -0,0 +1,1478 @@ +static unsigned char WoodTextureWidth = 199; +static unsigned char WoodTextureHeight = 37; +static unsigned char WoodTextureData[] = +{ + 84, 30, 12, 84, 26, 12, 108, 42, 28, 100, 38, 28, 108, 42, 28, + 108, 46, 28, 100, 38, 28, 108, 46, 28, 108, 42, 28, 108, 42, 20, + 108, 42, 28, 108, 38, 20, 108, 42, 20, 108, 42, 28, 116, 42, 28, + 108, 42, 20, 108, 46, 28, 100, 34, 12, 108, 42, 20, 108, 42, 20, + 108, 42, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, 108, 42, 20, + 108, 42, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, + 108, 42, 20, 108, 42, 20, 108, 42, 28, 108, 42, 20, 108, 42, 20, + 100, 38, 20, 100, 38, 20, 100, 38, 20, 108, 38, 20, 116, 50, 28, + 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 108, 42, 20, + 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20, + 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, + 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 42, 20, 108, 42, 20, + 108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 100, 38, 20, + 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20, + 108, 42, 20, 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, + 100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20, + 100, 38, 20, 100, 34, 12, 100, 34, 12, 100, 38, 20, 108, 38, 20, + 100, 38, 20, 108, 38, 20, 108, 42, 20, 100, 38, 20, 108, 42, 20, + 108, 42, 28, 108, 46, 20, 108, 38, 20, 108, 42, 20, 108, 46, 28, + 108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20, + 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, + 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 54, 36, 116, 54, 36, + 116, 54, 28, 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 42, 20, + 108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, + 116, 46, 28, 108, 42, 28, 116, 50, 36, 116, 50, 36, 100, 38, 20, + 108, 42, 28, 108, 38, 20, 100, 38, 20, 108, 38, 20, 108, 42, 28, + 108, 46, 28, 116, 46, 28, 108, 42, 28, 108, 42, 28, 108, 42, 20, + 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, + 108, 42, 28, 108, 42, 20, 100, 38, 20, 116, 50, 28, 108, 46, 28, + 108, 42, 20, 108, 42, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28, + 108, 46, 28, 108, 46, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28, + 116, 50, 28, 108, 46, 28, 108, 46, 28, 108, 42, 20, 116, 46, 28, + 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 46, 28, 116, 50, 28, + 116, 50, 28, 116, 50, 36, 124, 54, 36, 116, 54, 36, 116, 54, 28, + 116, 50, 28, 116, 50, 28, 108, 46, 28, 116, 46, 28, 108, 46, 28, + 116, 50, 28, 116, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, + 116, 50, 28, 108, 46, 28, 108, 46, 20, 124, 50, 36, 116, 54, 28, + 124, 54, 28, 116, 54, 28, 116, 54, 28, 116, 54, 28, 124, 54, 36, + 124, 58, 36, 124, 50, 36, 116, 46, 28, 116, 46, 28, 116, 42, 28, + 116, 50, 36, 124, 66, 44, 108, 58, 36, 84, 30, 12, 100, 42, 20, + 116, 54, 36, 140, 82, 68, 148, 86, 68, 148, 86, 68, 156, 90, 76, + 148, 86, 68, 156, 86, 76, 156, 86, 68, 148, 86, 68, 156, 86, 68, + 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 86, 68, + 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84, + 164, 98, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 84, + 164, 98, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, + 164, 94, 68, 164, 94, 68, 164, 98, 76, 172, 106, 84, 164, 98, 76, + 164, 98, 76, 164, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 94, 68, 164, 98, 76, 164, 98, 76, 164, 102, 76, + 164, 94, 76, 156, 94, 68, 172, 102, 84, 172, 106, 84, 172, 102, 84, + 164, 98, 76, 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, + 164, 94, 76, 156, 94, 68, 164, 98, 76, 164, 102, 76, 164, 98, 76, + 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 102, 76, + 172, 106, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 172, 102, 84, + 172, 106, 84, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 110, 84, + 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 114, 92, + 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 122, 108, 188, 126, 108, + 188, 118, 100, 196, 130, 108, 204, 134, 116, 188, 126, 108, 196, 122, 108, + 180, 118, 100, 180, 110, 92, 180, 114, 100, 180, 118, 100, 188, 118, 100, + 188, 122, 108, 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 118, 100, + 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92, + 172, 110, 92, 172, 106, 84, 180, 114, 92, 172, 106, 92, 172, 102, 84, + 172, 106, 84, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 106, 84, + 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, + 164, 102, 84, 164, 102, 76, 172, 106, 84, 172, 110, 92, 180, 110, 92, + 172, 110, 84, 172, 114, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92, + 172, 106, 92, 172, 106, 84, 172, 106, 84, 164, 102, 84, 180, 114, 100, + 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, + 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 172, 110, 92, 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 118, 100, + 196, 126, 100, 196, 122, 108, 196, 126, 108, 196, 130, 116, 196, 134, 116, + 204, 142, 124, 164, 106, 84, 100, 42, 20, 84, 26, 4, 132, 78, 68, + 188, 122, 108, 188, 122, 108, 188, 126, 116, 196, 134, 116, 188, 122, 108, + 188, 126, 108, 188, 126, 108, 188, 122, 108, 196, 126, 108, 196, 130, 108, + 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 126, 108, 188, 126, 108, + 196, 130, 108, 196, 130, 108, 196, 134, 116, 196, 130, 108, 196, 130, 108, + 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 188, 126, 108, + 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 196, 130, 108, + 196, 134, 116, 204, 142, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, + 188, 126, 108, 196, 126, 100, 196, 134, 108, 196, 130, 108, 188, 126, 100, + 188, 122, 100, 188, 126, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, + 188, 126, 100, 196, 130, 108, 204, 134, 108, 196, 134, 116, 196, 134, 108, + 196, 130, 108, 196, 126, 108, 196, 130, 108, 196, 130, 108, 196, 130, 108, + 188, 126, 108, 196, 126, 108, 196, 134, 108, 196, 130, 108, 196, 130, 108, + 188, 122, 100, 196, 130, 108, 196, 130, 108, 196, 134, 108, 196, 130, 108, + 188, 126, 100, 196, 130, 108, 196, 134, 108, 204, 134, 116, 204, 138, 116, + 204, 138, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, 196, 134, 108, + 204, 134, 116, 196, 134, 116, 196, 134, 108, 196, 130, 108, 196, 130, 108, + 204, 134, 116, 204, 138, 116, 204, 138, 116, 196, 130, 108, 196, 130, 108, + 188, 122, 100, 180, 118, 92, 188, 118, 100, 196, 130, 108, 196, 130, 108, + 188, 126, 100, 188, 122, 100, 188, 122, 100, 204, 134, 108, 196, 134, 116, + 204, 134, 116, 196, 134, 108, 196, 130, 108, 204, 134, 108, 204, 138, 116, + 204, 138, 116, 212, 142, 124, 204, 142, 116, 204, 134, 116, 204, 138, 116, + 204, 138, 116, 204, 138, 116, 204, 134, 108, 188, 126, 108, 196, 130, 108, + 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 138, 116, 212, 146, 124, + 204, 142, 116, 204, 138, 116, 212, 146, 124, 212, 142, 124, 204, 138, 124, + 204, 138, 124, 204, 138, 124, 204, 138, 116, 212, 142, 124, 204, 138, 124, + 196, 130, 116, 204, 134, 116, 204, 138, 116, 204, 138, 124, 204, 138, 116, + 204, 138, 124, 204, 134, 116, 204, 138, 124, 212, 142, 124, 204, 138, 116, + 196, 134, 116, 196, 130, 108, 196, 134, 116, 204, 138, 116, 204, 142, 124, + 212, 142, 124, 204, 138, 116, 204, 138, 116, 204, 138, 116, 204, 138, 116, + 204, 138, 124, 204, 142, 124, 204, 142, 116, 204, 138, 124, 196, 134, 108, + 196, 134, 116, 196, 134, 116, 196, 130, 116, 196, 130, 108, 188, 126, 108, + 196, 126, 108, 188, 130, 108, 188, 126, 108, 188, 122, 100, 180, 118, 100, + 188, 118, 100, 188, 126, 108, 196, 130, 108, 196, 126, 108, 188, 126, 108, + 188, 122, 100, 188, 122, 108, 188, 126, 108, 196, 126, 108, 196, 130, 108, + 188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 134, 108, 196, 134, 116, + 196, 134, 108, 196, 130, 108, 196, 126, 108, 188, 122, 108, 188, 122, 100, + 188, 122, 100, 196, 130, 108, 196, 130, 100, 196, 130, 108, 196, 130, 100, + 188, 130, 108, 196, 130, 108, 196, 134, 108, 204, 138, 116, 204, 130, 108, + 204, 134, 116, 204, 134, 116, 204, 134, 116, 204, 138, 124, 204, 146, 124, + 156, 102, 84, 84, 26, 4, 84, 26, 4, 116, 58, 36, 164, 106, 92, + 164, 102, 84, 164, 106, 92, 172, 110, 92, 156, 98, 84, 172, 102, 84, + 172, 102, 84, 180, 110, 92, 180, 118, 100, 180, 118, 100, 180, 110, 92, + 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 106, 92, + 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 92, 172, 110, 92, + 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 76, + 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, + 180, 110, 92, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 106, 84, + 172, 110, 84, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, + 172, 102, 76, 172, 102, 84, 172, 102, 84, 164, 102, 76, 164, 94, 76, + 172, 102, 84, 172, 110, 92, 172, 110, 84, 172, 102, 84, 164, 98, 76, + 172, 102, 76, 172, 106, 84, 172, 110, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, + 172, 102, 76, 172, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, + 172, 106, 84, 180, 110, 92, 172, 110, 84, 180, 118, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 180, 118, 92, + 188, 122, 100, 188, 118, 100, 180, 114, 92, 180, 118, 92, 180, 114, 92, + 180, 118, 92, 188, 118, 100, 180, 118, 92, 180, 114, 92, 180, 118, 92, + 180, 110, 84, 180, 110, 92, 180, 118, 92, 188, 122, 100, 188, 114, 100, + 180, 114, 92, 180, 114, 92, 196, 126, 108, 188, 126, 100, 188, 122, 100, + 188, 118, 100, 180, 118, 100, 180, 114, 92, 188, 118, 100, 188, 122, 100, + 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 188, 122, 100, + 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 110, 84, 172, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100, + 188, 122, 100, 180, 106, 92, 172, 110, 92, 172, 102, 84, 172, 102, 84, + 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, + 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92, + 172, 106, 84, 172, 106, 92, 172, 110, 84, 164, 102, 84, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 172, 110, 92, 180, 114, 92, 180, 118, 100, + 180, 118, 100, 188, 122, 100, 180, 122, 108, 188, 122, 100, 188, 122, 100, + 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 126, 108, + 188, 122, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92, + 180, 118, 100, 180, 110, 92, 172, 110, 92, 172, 106, 84, 180, 110, 92, + 180, 118, 92, 180, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 84, + 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, + 180, 114, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, + 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84, + 180, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 92, + 180, 118, 92, 188, 118, 100, 188, 122, 100, 180, 114, 100, 180, 110, 92, + 188, 114, 100, 180, 110, 92, 172, 110, 92, 180, 126, 108, 148, 98, 76, + 84, 26, 4, 84, 26, 12, 108, 50, 36, 164, 102, 84, 164, 98, 84, + 156, 94, 76, 164, 98, 84, 148, 86, 68, 156, 90, 76, 156, 94, 84, + 164, 90, 76, 164, 98, 84, 172, 102, 84, 164, 94, 76, 156, 90, 68, + 164, 94, 76, 164, 98, 84, 164, 94, 76, 164, 98, 76, 164, 98, 84, + 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 164, 102, 84, 164, 94, 68, 164, 94, 76, 156, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 98, 76, + 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, + 172, 110, 84, 172, 106, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, 172, 106, 84, + 180, 110, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 106, 84, + 180, 114, 92, 172, 106, 84, 164, 102, 76, 164, 98, 76, 172, 106, 84, + 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, + 180, 114, 92, 188, 118, 100, 180, 114, 92, 172, 110, 84, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 172, 110, 92, 172, 106, 84, 164, 102, 76, + 172, 102, 76, 164, 102, 84, 180, 110, 84, 180, 118, 92, 188, 118, 100, + 188, 122, 100, 180, 118, 92, 180, 110, 92, 180, 110, 84, 172, 106, 92, + 180, 114, 84, 180, 114, 100, 188, 122, 100, 188, 122, 100, 180, 114, 92, + 172, 110, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, + 180, 118, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 102, 76, + 164, 102, 76, 172, 102, 84, 172, 110, 84, 180, 114, 92, 172, 110, 84, + 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 118, 100, 188, 118, 92, + 180, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 188, 118, 92, + 180, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, + 180, 114, 92, 188, 122, 100, 188, 126, 108, 188, 118, 100, 172, 110, 92, + 172, 102, 84, 172, 106, 84, 180, 106, 92, 164, 98, 76, 172, 102, 84, + 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, + 172, 102, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, + 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, + 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 122, 100, + 188, 122, 108, 196, 126, 108, 180, 118, 92, 188, 118, 100, 180, 118, 100, + 180, 118, 100, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 118, 100, + 180, 110, 92, 172, 110, 84, 172, 106, 92, 172, 110, 92, 188, 118, 100, + 180, 118, 100, 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 114, 92, + 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92, + 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 110, 92, + 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 172, 106, 84, + 180, 110, 84, 180, 118, 92, 188, 122, 100, 180, 118, 100, 180, 118, 92, + 180, 118, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, 188, 118, 108, + 188, 118, 100, 188, 122, 100, 188, 130, 108, 156, 102, 84, 84, 26, 12, + 84, 30, 12, 108, 46, 28, 140, 82, 68, 156, 90, 76, 156, 94, 84, + 156, 94, 84, 156, 94, 76, 164, 94, 76, 156, 90, 76, 164, 94, 76, + 156, 94, 76, 156, 90, 68, 156, 90, 68, 164, 90, 76, 156, 90, 68, + 148, 82, 60, 148, 78, 60, 164, 98, 76, 164, 94, 76, 156, 90, 68, + 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 76, + 164, 94, 68, 156, 94, 76, 156, 94, 68, 156, 90, 68, 156, 90, 68, + 172, 102, 76, 180, 114, 92, 188, 118, 92, 172, 106, 84, 180, 106, 84, + 172, 106, 84, 164, 98, 76, 164, 94, 68, 164, 98, 76, 172, 102, 84, + 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 180, 110, 92, + 172, 110, 84, 172, 98, 76, 164, 98, 76, 172, 106, 84, 180, 118, 92, + 180, 106, 84, 180, 106, 84, 172, 106, 84, 172, 110, 84, 180, 110, 92, + 180, 110, 84, 172, 102, 76, 164, 98, 76, 164, 94, 68, 172, 106, 84, + 180, 114, 92, 172, 106, 84, 164, 98, 76, 172, 98, 76, 172, 106, 84, + 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 92, + 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 188, 118, 92, + 188, 114, 92, 172, 106, 84, 172, 102, 76, 172, 106, 84, 188, 118, 92, + 188, 122, 100, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84, + 180, 114, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76, + 180, 106, 84, 180, 114, 84, 172, 102, 76, 164, 94, 76, 172, 106, 84, + 180, 110, 84, 172, 106, 84, 172, 106, 84, 188, 122, 100, 188, 118, 92, + 180, 118, 92, 188, 118, 100, 196, 122, 100, 188, 122, 100, 180, 118, 92, + 180, 110, 84, 188, 114, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, + 188, 114, 92, 180, 114, 92, 180, 114, 84, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 110, 92, + 188, 118, 100, 180, 118, 92, 180, 110, 92, 180, 114, 100, 180, 118, 100, + 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 102, 84, + 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 118, 92, 180, 118, 100, + 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, 180, 118, 92, + 180, 118, 100, 188, 122, 108, 188, 122, 100, 188, 118, 100, 180, 114, 92, + 180, 114, 92, 172, 110, 92, 172, 110, 92, 172, 106, 84, 188, 122, 100, + 180, 114, 100, 172, 106, 84, 172, 110, 84, 180, 114, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92, + 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92, + 164, 106, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 172, 110, 92, + 180, 110, 84, 172, 110, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92, + 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 100, 188, 118, 92, + 188, 118, 100, 180, 110, 92, 180, 110, 92, 188, 118, 100, 188, 118, 100, + 180, 118, 100, 180, 122, 108, 148, 90, 68, 84, 30, 12, 92, 34, 12, + 116, 58, 44, 156, 90, 76, 156, 94, 76, 156, 94, 76, 156, 90, 76, + 148, 86, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, 156, 86, 68, + 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, 148, 78, 60, + 140, 74, 52, 148, 82, 68, 148, 82, 60, 148, 86, 68, 156, 90, 68, + 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 148, 86, 68, + 156, 86, 68, 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, + 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, + 172, 106, 84, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76, + 172, 102, 84, 164, 94, 68, 164, 94, 76, 172, 102, 76, 180, 110, 84, + 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76, + 164, 98, 76, 164, 98, 76, 172, 102, 76, 180, 110, 92, 180, 110, 92, + 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, 180, 110, 92, + 172, 102, 84, 164, 98, 76, 156, 94, 68, 172, 106, 84, 188, 114, 92, + 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, + 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 76, + 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, + 188, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 172, 106, 84, + 180, 114, 92, 172, 106, 84, 164, 94, 68, 172, 106, 84, 180, 114, 92, + 188, 118, 92, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 180, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 172, 106, 84, + 180, 114, 92, 180, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84, + 172, 102, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, 164, 102, 84, + 172, 102, 84, 164, 94, 76, 156, 90, 68, 164, 94, 76, 180, 106, 92, + 172, 102, 84, 164, 98, 84, 180, 110, 84, 180, 110, 92, 164, 98, 84, + 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, 164, 102, 84, + 164, 102, 84, 172, 102, 84, 164, 106, 84, 172, 106, 92, 172, 106, 92, + 172, 110, 92, 180, 110, 84, 180, 118, 100, 188, 118, 100, 180, 118, 100, + 180, 114, 92, 172, 114, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, + 180, 118, 100, 180, 118, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, + 172, 110, 92, 180, 110, 92, 172, 114, 92, 188, 118, 100, 180, 114, 92, + 172, 110, 92, 172, 106, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84, + 164, 102, 84, 172, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, + 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92, + 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 92, + 188, 122, 92, 180, 122, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100, + 196, 122, 100, 188, 118, 100, 196, 122, 108, 180, 114, 100, 180, 114, 100, + 180, 126, 108, 148, 98, 76, 92, 34, 12, 84, 26, 12, 116, 58, 36, + 148, 90, 76, 148, 90, 76, 140, 82, 68, 148, 82, 68, 140, 78, 60, + 156, 86, 68, 148, 86, 68, 156, 90, 68, 156, 90, 76, 164, 94, 76, + 156, 90, 76, 156, 90, 68, 148, 82, 68, 148, 78, 60, 140, 78, 60, + 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 156, 94, 76, + 164, 94, 76, 156, 94, 76, 148, 86, 68, 148, 82, 60, 148, 86, 68, + 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 94, 76, + 164, 102, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, + 180, 114, 84, 180, 110, 84, 172, 102, 76, 180, 106, 84, 172, 106, 76, + 172, 98, 76, 164, 98, 68, 172, 106, 76, 172, 106, 84, 180, 110, 84, + 172, 98, 76, 180, 106, 84, 180, 110, 84, 180, 110, 84, 172, 98, 76, + 172, 98, 76, 180, 106, 84, 180, 114, 84, 188, 114, 92, 180, 110, 84, + 180, 110, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84, + 164, 98, 68, 164, 94, 68, 180, 106, 84, 188, 118, 92, 180, 114, 92, + 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 76, + 180, 106, 84, 180, 110, 84, 180, 114, 92, 188, 114, 92, 180, 110, 84, + 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 180, 114, 84, + 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84, + 180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 188, 118, 92, + 180, 118, 92, 188, 118, 92, 196, 122, 100, 172, 106, 84, 188, 114, 84, + 172, 106, 84, 164, 98, 68, 172, 102, 76, 180, 106, 84, 180, 110, 84, + 188, 118, 92, 188, 122, 92, 188, 114, 92, 180, 110, 92, 180, 114, 84, + 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 102, 84, 188, 122, 92, + 180, 110, 84, 164, 102, 76, 172, 102, 76, 172, 98, 76, 172, 102, 76, + 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, + 172, 102, 76, 164, 90, 76, 172, 98, 76, 180, 110, 92, 172, 102, 76, + 172, 102, 84, 180, 106, 84, 180, 110, 84, 172, 102, 84, 172, 98, 76, + 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 164, 98, 76, + 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92, + 180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100, + 172, 106, 92, 172, 106, 84, 164, 106, 84, 172, 106, 84, 180, 114, 92, + 180, 110, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 172, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 118, 92, 172, 110, 92, 172, 106, 84, + 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, 164, 94, 76, + 164, 98, 76, 172, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 92, + 172, 110, 84, 172, 106, 92, 164, 102, 84, 172, 110, 92, 180, 110, 92, + 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92, + 180, 118, 92, 180, 114, 92, 188, 114, 92, 180, 118, 92, 180, 118, 100, + 180, 118, 92, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 110, 92, + 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 114, 92, + 140, 90, 68, 84, 26, 12, 84, 30, 12, 116, 58, 44, 156, 90, 76, + 156, 90, 76, 148, 86, 68, 148, 86, 76, 148, 86, 68, 156, 90, 76, + 156, 90, 76, 164, 94, 84, 164, 98, 76, 164, 94, 76, 156, 90, 68, + 156, 86, 68, 156, 86, 60, 156, 90, 68, 156, 90, 76, 164, 94, 76, + 156, 94, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 156, 94, 68, 148, 78, 60, 148, 86, 68, 156, 90, 68, + 156, 90, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 164, 98, 76, + 164, 94, 68, 172, 98, 76, 180, 106, 84, 188, 118, 92, 188, 118, 92, + 188, 118, 100, 180, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76, + 172, 98, 76, 172, 106, 84, 180, 106, 84, 164, 98, 68, 172, 102, 76, + 180, 114, 84, 196, 122, 100, 188, 118, 92, 172, 106, 76, 172, 102, 76, + 180, 110, 84, 188, 122, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, + 188, 114, 84, 188, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76, + 164, 94, 68, 180, 110, 84, 188, 118, 92, 188, 118, 92, 188, 114, 92, + 180, 114, 92, 188, 114, 84, 180, 114, 92, 180, 106, 84, 180, 110, 84, + 180, 114, 84, 188, 114, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, + 180, 106, 84, 180, 114, 84, 188, 114, 92, 188, 114, 92, 180, 114, 92, + 188, 118, 92, 196, 122, 100, 188, 122, 92, 180, 114, 92, 188, 114, 92, + 180, 110, 84, 180, 114, 84, 188, 118, 92, 188, 122, 92, 188, 118, 92, + 188, 118, 92, 188, 122, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92, + 188, 114, 92, 188, 122, 100, 196, 126, 100, 188, 118, 92, 188, 114, 92, + 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 188, 118, 92, + 188, 118, 92, 188, 118, 92, 180, 114, 84, 196, 126, 100, 188, 114, 92, + 180, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 76, 172, 106, 76, + 180, 110, 84, 188, 118, 92, 180, 110, 92, 180, 114, 92, 180, 106, 92, + 164, 98, 76, 180, 106, 84, 188, 114, 100, 180, 106, 84, 180, 110, 92, + 180, 110, 92, 188, 114, 92, 180, 110, 92, 172, 106, 84, 172, 98, 76, + 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 102, 84, + 172, 106, 84, 172, 110, 92, 180, 118, 92, 180, 114, 100, 180, 118, 100, + 188, 122, 108, 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 106, 84, + 164, 102, 84, 172, 102, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84, + 172, 106, 92, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92, + 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92, + 172, 110, 92, 180, 110, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, + 172, 106, 84, 180, 114, 92, 172, 106, 84, 164, 102, 84, 172, 110, 84, + 172, 106, 84, 164, 98, 76, 172, 102, 84, 164, 106, 84, 172, 106, 84, + 172, 106, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, + 180, 106, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, 180, 106, 84, + 188, 114, 100, 188, 118, 100, 180, 114, 100, 180, 126, 108, 148, 90, 68, + 84, 30, 12, 92, 34, 12, 124, 66, 44, 156, 98, 84, 164, 102, 84, + 164, 98, 84, 164, 98, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76, + 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, + 156, 86, 68, 156, 86, 68, 164, 94, 68, 156, 90, 76, 156, 94, 68, + 156, 90, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 102, 84, 148, 82, 60, 148, 86, 68, 156, 90, 68, 156, 90, 68, + 148, 86, 68, 148, 82, 60, 156, 86, 68, 156, 94, 68, 156, 86, 68, + 164, 98, 68, 180, 110, 84, 188, 118, 92, 196, 122, 92, 196, 122, 100, + 188, 118, 92, 188, 118, 92, 180, 110, 92, 172, 106, 76, 172, 106, 76, + 180, 106, 84, 180, 106, 84, 172, 102, 76, 180, 110, 84, 188, 118, 92, + 196, 126, 100, 188, 118, 100, 180, 110, 84, 172, 106, 84, 188, 114, 84, + 188, 122, 100, 196, 122, 100, 188, 118, 92, 180, 114, 84, 180, 114, 92, + 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 172, 102, 76, + 180, 110, 84, 196, 122, 100, 188, 122, 92, 188, 118, 92, 188, 118, 92, + 188, 122, 92, 188, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84, + 180, 110, 92, 180, 114, 84, 188, 114, 92, 180, 114, 84, 188, 114, 92, + 180, 114, 92, 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, + 188, 118, 92, 188, 114, 92, 180, 114, 84, 188, 118, 92, 180, 114, 92, + 188, 114, 92, 188, 122, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, + 196, 122, 100, 180, 114, 92, 188, 118, 92, 180, 110, 84, 180, 110, 84, + 196, 130, 100, 204, 134, 108, 196, 126, 100, 188, 118, 100, 188, 122, 92, + 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 122, 100, 196, 122, 100, + 196, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 110, 84, + 180, 110, 84, 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 110, 84, + 180, 110, 92, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 94, 68, + 172, 106, 84, 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 110, 84, + 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84, + 172, 106, 84, 172, 102, 84, 172, 102, 76, 164, 102, 84, 172, 110, 92, + 180, 114, 92, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 126, 108, + 188, 122, 100, 180, 118, 100, 172, 110, 92, 164, 106, 84, 172, 102, 84, + 172, 106, 84, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84, + 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, + 172, 110, 92, 172, 110, 92, 172, 110, 84, 180, 110, 92, 172, 114, 92, + 180, 110, 92, 172, 106, 92, 172, 106, 84, 156, 94, 68, 172, 106, 92, + 180, 114, 92, 172, 102, 84, 164, 102, 84, 180, 110, 92, 172, 106, 92, + 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 102, 84, + 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 106, 84, + 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 180, 114, 100, + 188, 118, 100, 180, 118, 100, 188, 126, 100, 148, 94, 76, 92, 34, 12, + 92, 34, 12, 116, 62, 44, 156, 94, 76, 164, 94, 84, 156, 94, 76, + 156, 94, 76, 148, 86, 68, 148, 86, 76, 148, 82, 68, 148, 78, 60, + 148, 82, 68, 156, 90, 68, 156, 94, 76, 164, 90, 76, 156, 90, 68, + 148, 82, 68, 148, 82, 60, 164, 94, 76, 156, 94, 76, 156, 94, 68, + 164, 94, 76, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, + 156, 90, 68, 156, 90, 68, 156, 94, 76, 156, 90, 68, 148, 86, 68, + 148, 86, 68, 156, 90, 68, 156, 90, 68, 164, 98, 76, 172, 106, 84, + 180, 110, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 110, 84, + 188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 180, 114, 84, + 180, 114, 84, 180, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84, + 188, 118, 92, 188, 114, 92, 180, 114, 92, 188, 114, 84, 180, 110, 84, + 196, 122, 100, 188, 118, 92, 188, 114, 92, 188, 114, 92, 188, 118, 92, + 188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 106, 84, 188, 114, 92, + 196, 122, 100, 188, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 100, + 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 92, 188, 114, 92, + 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 92, 196, 122, 100, + 188, 126, 100, 188, 118, 92, 180, 110, 84, 188, 114, 92, 188, 122, 100, + 196, 126, 100, 188, 118, 100, 196, 122, 92, 188, 114, 92, 180, 114, 92, + 196, 122, 92, 188, 122, 100, 188, 118, 92, 196, 122, 100, 196, 126, 100, + 188, 118, 92, 188, 118, 92, 172, 98, 76, 164, 94, 68, 180, 110, 92, + 188, 122, 92, 188, 114, 92, 180, 114, 84, 204, 130, 108, 196, 126, 100, + 188, 118, 92, 188, 122, 92, 196, 122, 100, 188, 122, 92, 188, 122, 92, + 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92, + 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 106, 84, 180, 110, 92, + 180, 106, 84, 172, 102, 76, 172, 98, 76, 164, 94, 76, 180, 106, 84, + 180, 110, 92, 180, 106, 84, 172, 102, 76, 172, 98, 84, 172, 102, 76, + 180, 110, 84, 180, 110, 84, 180, 106, 84, 180, 110, 92, 180, 114, 92, + 172, 110, 92, 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 118, 100, + 188, 122, 100, 180, 122, 100, 188, 118, 100, 188, 126, 108, 188, 118, 100, + 180, 114, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92, + 180, 114, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 164, 102, 84, + 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, + 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, + 172, 114, 92, 180, 110, 92, 164, 98, 76, 172, 110, 92, 180, 114, 92, + 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, + 172, 106, 84, 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, + 172, 110, 92, 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 84, 172, 110, 84, 172, 114, 92, 172, 110, 92, 172, 110, 84, + 172, 110, 84, 180, 106, 92, 172, 102, 84, 180, 106, 92, 172, 106, 92, + 172, 106, 92, 180, 122, 100, 148, 98, 76, 92, 34, 12, 100, 42, 28, + 116, 54, 36, 148, 86, 68, 148, 90, 76, 148, 86, 76, 148, 86, 76, + 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, + 148, 82, 60, 156, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, + 148, 86, 68, 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, + 172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, + 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 94, 76, 164, 94, 76, + 156, 94, 76, 164, 98, 76, 180, 110, 84, 188, 114, 84, 188, 114, 92, + 180, 106, 84, 188, 114, 84, 188, 118, 92, 188, 114, 92, 188, 118, 92, + 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 114, 92, 188, 118, 92, + 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, + 188, 118, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, 196, 122, 100, + 188, 118, 92, 180, 114, 84, 188, 114, 92, 188, 122, 92, 196, 122, 100, + 188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 118, 92, 196, 122, 100, + 196, 122, 92, 188, 118, 92, 188, 118, 100, 196, 122, 92, 188, 118, 92, + 196, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 92, 196, 122, 100, + 188, 122, 92, 196, 122, 100, 196, 122, 100, 196, 122, 100, 196, 122, 92, + 188, 114, 92, 180, 110, 84, 188, 114, 84, 188, 118, 92, 196, 122, 92, + 188, 118, 92, 188, 122, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, + 196, 122, 92, 188, 118, 92, 188, 118, 92, 196, 126, 100, 204, 130, 108, + 204, 134, 108, 188, 122, 92, 180, 106, 84, 188, 114, 92, 188, 118, 92, + 188, 118, 92, 196, 122, 100, 204, 134, 108, 196, 130, 100, 196, 122, 100, + 188, 122, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92, + 188, 114, 84, 180, 110, 84, 180, 110, 84, 188, 114, 92, 180, 110, 84, + 180, 106, 84, 180, 106, 84, 188, 114, 92, 188, 118, 92, 188, 114, 92, + 180, 110, 92, 180, 106, 84, 172, 102, 84, 180, 110, 84, 188, 118, 92, + 180, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 92, + 188, 114, 92, 180, 110, 92, 180, 110, 84, 188, 114, 92, 188, 114, 100, + 180, 114, 92, 172, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 108, + 188, 122, 100, 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, + 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92, + 180, 110, 92, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84, + 164, 106, 84, 172, 106, 84, 180, 110, 92, 172, 114, 92, 180, 110, 92, + 172, 110, 92, 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 110, 84, + 180, 110, 92, 164, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 106, 84, 180, 114, 92, + 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 110, 84, + 172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 84, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 114, 92, 180, 114, 92, + 188, 118, 100, 188, 114, 92, 196, 122, 108, 188, 118, 100, 180, 118, 100, + 188, 130, 108, 156, 106, 84, 100, 42, 28, 84, 30, 12, 116, 54, 36, + 156, 90, 76, 156, 90, 76, 156, 90, 68, 156, 94, 76, 148, 86, 68, + 164, 94, 84, 156, 94, 76, 156, 90, 76, 148, 86, 68, 148, 78, 60, + 148, 78, 60, 148, 86, 68, 164, 94, 76, 164, 94, 76, 172, 98, 84, + 164, 98, 76, 164, 102, 76, 172, 106, 84, 180, 110, 92, 180, 118, 100, + 180, 118, 100, 180, 110, 92, 172, 110, 92, 164, 98, 76, 164, 94, 76, + 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 172, 102, 84, + 164, 102, 76, 188, 118, 92, 188, 122, 100, 196, 122, 100, 188, 114, 92, + 180, 114, 92, 188, 114, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, + 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84, + 196, 122, 100, 196, 122, 100, 188, 122, 92, 196, 122, 100, 196, 126, 100, + 196, 122, 100, 188, 118, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92, + 188, 114, 92, 188, 118, 92, 196, 122, 100, 196, 126, 100, 196, 122, 100, + 188, 118, 92, 188, 114, 84, 188, 122, 92, 196, 122, 100, 188, 122, 92, + 188, 118, 92, 196, 122, 100, 196, 122, 92, 188, 118, 92, 196, 122, 100, + 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 126, 100, 196, 126, 100, + 196, 122, 100, 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 122, 100, + 188, 118, 92, 188, 118, 100, 196, 126, 100, 196, 126, 100, 196, 122, 100, + 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 122, 100, 196, 122, 92, + 188, 114, 92, 188, 114, 92, 188, 122, 92, 188, 114, 92, 204, 130, 108, + 196, 126, 100, 188, 118, 92, 188, 118, 92, 188, 118, 92, 196, 122, 100, + 196, 126, 100, 204, 130, 108, 196, 126, 100, 196, 122, 100, 188, 118, 92, + 196, 122, 100, 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92, + 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 114, 84, + 188, 114, 92, 196, 126, 100, 196, 122, 100, 188, 114, 92, 180, 110, 84, + 180, 106, 84, 172, 98, 76, 180, 110, 92, 188, 114, 92, 172, 102, 84, + 196, 126, 100, 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 114, 92, + 180, 110, 84, 188, 114, 92, 188, 114, 92, 188, 122, 100, 180, 118, 100, + 180, 114, 92, 180, 118, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, + 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 110, 92, 180, 114, 100, + 180, 118, 100, 188, 118, 100, 172, 114, 92, 172, 106, 84, 172, 110, 92, + 172, 106, 92, 172, 102, 84, 164, 102, 84, 172, 102, 76, 172, 106, 84, + 172, 106, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84, + 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 118, 100, 180, 118, 100, + 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, 172, 114, 92, + 172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84, + 172, 106, 84, 180, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 118, 92, 180, 118, 92, 180, 114, 92, 180, 118, 92, 188, 114, 100, + 180, 110, 92, 188, 122, 108, 188, 122, 100, 180, 118, 108, 188, 126, 108, + 148, 90, 76, 84, 30, 12, 92, 38, 28, 140, 78, 60, 156, 90, 68, + 156, 90, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76, + 164, 94, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 86, 68, + 148, 86, 68, 156, 86, 68, 156, 94, 76, 164, 102, 76, 180, 110, 92, + 172, 102, 84, 172, 98, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, + 188, 114, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 90, 68, + 156, 86, 68, 164, 94, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92, + 188, 114, 92, 196, 126, 100, 196, 126, 100, 188, 118, 92, 180, 110, 92, + 188, 118, 92, 196, 130, 108, 196, 126, 100, 196, 122, 100, 188, 126, 100, + 196, 126, 108, 196, 126, 100, 196, 122, 100, 180, 118, 92, 188, 114, 92, + 188, 118, 92, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 188, 118, 92, 188, 118, 92, 196, 126, 100, 188, 122, 100, 196, 122, 100, + 188, 122, 100, 196, 126, 100, 196, 130, 100, 196, 126, 108, 196, 130, 100, + 196, 122, 100, 188, 122, 100, 196, 126, 108, 196, 126, 100, 204, 130, 108, + 196, 130, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, 196, 126, 100, + 188, 122, 100, 196, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 100, + 196, 130, 100, 196, 130, 108, 196, 130, 100, 196, 126, 100, 196, 126, 100, + 204, 130, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, 196, 122, 100, + 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 126, 108, 196, 130, 100, + 196, 122, 100, 188, 122, 100, 196, 126, 100, 204, 134, 108, 204, 134, 108, + 196, 126, 100, 188, 114, 92, 188, 118, 92, 188, 122, 100, 196, 126, 100, + 196, 130, 108, 196, 126, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, + 188, 122, 92, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, + 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, 188, 118, 92, + 188, 118, 100, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, + 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 100, + 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 102, 84, 172, 106, 84, + 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100, + 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, + 196, 130, 108, 180, 114, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92, + 172, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 92, 164, 102, 84, 164, 98, 84, 172, 102, 84, + 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92, + 172, 106, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, + 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92, + 180, 114, 92, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 110, 92, + 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, + 180, 118, 100, 180, 114, 92, 180, 114, 92, 172, 102, 84, 172, 102, 84, + 180, 106, 92, 164, 94, 84, 156, 94, 76, 172, 110, 100, 140, 82, 68, + 92, 38, 28, 92, 34, 20, 124, 58, 44, 140, 78, 60, 148, 86, 68, + 156, 90, 68, 156, 94, 76, 164, 94, 76, 148, 90, 68, 156, 90, 68, + 164, 94, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 148, 86, 60, + 148, 86, 68, 156, 90, 68, 164, 94, 76, 164, 98, 76, 156, 94, 76, + 156, 94, 76, 172, 98, 84, 180, 110, 92, 180, 118, 100, 188, 114, 100, + 180, 114, 92, 172, 102, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, + 156, 90, 68, 164, 94, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76, + 180, 110, 92, 196, 126, 100, 196, 126, 108, 204, 130, 100, 196, 126, 108, + 196, 130, 108, 196, 126, 100, 188, 122, 100, 196, 122, 100, 196, 126, 100, + 196, 126, 100, 188, 122, 100, 188, 118, 92, 196, 130, 108, 196, 134, 108, + 204, 134, 108, 204, 134, 108, 196, 130, 108, 196, 130, 108, 196, 126, 108, + 196, 130, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, 196, 126, 100, + 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, + 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, + 196, 126, 100, 196, 126, 108, 204, 130, 108, 196, 130, 108, 196, 130, 108, + 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, 204, 130, 108, + 196, 130, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, 196, 126, 108, + 196, 130, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, 188, 126, 100, + 196, 126, 100, 196, 126, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, + 196, 122, 100, 188, 126, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, + 180, 114, 92, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 188, 122, 100, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, + 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 122, 92, 188, 118, 100, + 188, 118, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 180, 118, 92, + 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 188, 118, 92, 196, 126, 100, 188, 118, 100, + 188, 122, 100, 188, 118, 92, 180, 110, 84, 180, 114, 92, 188, 122, 100, + 188, 122, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 106, 84, + 164, 94, 76, 164, 102, 84, 180, 114, 92, 180, 118, 100, 172, 106, 84, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, + 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, + 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 172, 110, 92, + 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100, + 188, 118, 92, 180, 118, 100, 180, 118, 100, 188, 118, 100, 180, 110, 92, + 172, 110, 100, 180, 114, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100, + 188, 122, 100, 188, 118, 100, 180, 106, 84, 172, 102, 84, 188, 114, 100, + 164, 98, 76, 164, 98, 84, 172, 110, 100, 132, 78, 68, 92, 34, 20, + 92, 34, 20, 132, 70, 52, 156, 90, 68, 164, 102, 76, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 156, 90, 68, 156, 94, 76, 148, 82, 60, + 148, 86, 68, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60, + 148, 82, 60, 148, 86, 68, 148, 82, 68, 148, 82, 60, 156, 82, 68, + 156, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 164, 102, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 156, 82, 60, + 140, 78, 60, 140, 70, 52, 132, 70, 52, 156, 82, 60, 172, 98, 76, + 188, 114, 92, 196, 122, 100, 196, 126, 100, 196, 126, 108, 196, 130, 108, + 196, 130, 108, 196, 126, 100, 188, 126, 100, 196, 126, 100, 188, 126, 100, + 196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108, + 196, 130, 108, 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, + 196, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, + 188, 126, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, + 196, 126, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100, + 188, 126, 100, 196, 126, 100, 196, 126, 100, 196, 130, 108, 196, 126, 100, + 196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 122, 100, 196, 130, 108, + 196, 130, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 204, 130, 108, + 196, 130, 108, 196, 126, 108, 196, 130, 108, 204, 134, 108, 196, 130, 108, + 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 134, 108, + 204, 130, 108, 204, 134, 116, 196, 130, 108, 196, 122, 100, 188, 122, 100, + 196, 126, 108, 196, 126, 100, 196, 126, 100, 188, 118, 100, 188, 118, 92, + 188, 118, 92, 188, 122, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, + 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, + 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 114, 92, + 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 122, 100, + 188, 122, 100, 180, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 100, + 188, 118, 100, 180, 118, 100, 180, 118, 100, 188, 122, 100, 188, 122, 100, + 188, 122, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 164, 102, 76, + 164, 102, 84, 188, 118, 100, 180, 118, 100, 172, 106, 84, 164, 102, 84, + 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, + 172, 106, 84, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, + 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, 180, 110, 84, + 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, + 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 106, 92, 172, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 100, 180, 114, 92, + 180, 114, 92, 180, 114, 100, 180, 118, 92, 180, 122, 100, 188, 122, 100, + 188, 122, 100, 188, 118, 100, 180, 110, 92, 188, 114, 100, 172, 102, 92, + 172, 106, 92, 180, 118, 100, 132, 78, 68, 92, 34, 20, 92, 34, 20, + 132, 74, 60, 156, 90, 68, 164, 94, 76, 148, 90, 68, 156, 86, 68, + 156, 90, 68, 156, 90, 68, 164, 98, 84, 156, 90, 68, 156, 90, 68, + 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 102, 76, + 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 110, 92, 164, 98, 84, 164, 94, 76, + 156, 90, 68, 156, 90, 68, 172, 102, 84, 180, 110, 92, 188, 118, 92, + 196, 122, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, + 188, 118, 100, 188, 118, 100, 180, 114, 92, 188, 114, 92, 188, 118, 100, + 188, 118, 92, 196, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, + 180, 118, 92, 188, 118, 92, 188, 122, 100, 196, 122, 100, 196, 126, 108, + 188, 126, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, 196, 122, 100, + 188, 122, 100, 188, 118, 92, 180, 110, 92, 180, 114, 92, 188, 118, 92, + 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 114, 92, 188, 114, 92, + 188, 126, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 196, 126, 108, + 188, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, + 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 126, 100, 188, 122, 100, + 188, 118, 92, 196, 130, 108, 196, 130, 108, 196, 126, 108, 196, 126, 100, + 196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, + 196, 130, 100, 196, 122, 100, 180, 118, 92, 188, 118, 92, 188, 122, 100, + 196, 126, 100, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 114, 92, + 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 188, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 92, + 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 92, 188, 114, 92, + 188, 122, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 118, 92, + 196, 122, 100, 188, 118, 100, 180, 114, 92, 188, 122, 100, 188, 118, 92, + 180, 110, 92, 180, 114, 84, 188, 118, 100, 180, 118, 92, 188, 118, 100, + 188, 122, 100, 188, 122, 100, 188, 122, 108, 188, 122, 100, 188, 122, 100, + 180, 114, 92, 172, 106, 84, 164, 98, 84, 156, 94, 76, 164, 94, 76, + 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 106, 84, 188, 122, 100, + 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, + 180, 110, 84, 172, 110, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84, + 172, 106, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, + 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, + 172, 106, 84, 172, 106, 92, 180, 110, 92, 172, 110, 92, 180, 106, 92, + 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, + 188, 118, 100, 188, 114, 100, 188, 118, 100, 180, 110, 92, 180, 118, 108, + 180, 122, 108, 132, 78, 68, 92, 34, 20, 92, 34, 20, 108, 50, 28, + 132, 66, 52, 140, 74, 52, 132, 70, 52, 140, 74, 52, 140, 78, 60, + 148, 86, 60, 164, 94, 76, 156, 94, 68, 156, 94, 76, 164, 98, 76, + 164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, + 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, + 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 188, 114, 100, + 188, 122, 100, 180, 110, 84, 188, 114, 92, 180, 114, 92, 188, 114, 92, + 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 84, + 180, 114, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84, + 180, 110, 92, 188, 118, 92, 188, 122, 100, 180, 114, 84, 180, 110, 92, + 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 106, 84, + 172, 106, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, + 172, 110, 92, 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 118, 92, + 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 92, 188, 118, 100, + 188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92, + 188, 114, 92, 188, 118, 92, 188, 122, 92, 188, 118, 100, 196, 122, 92, + 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, 188, 118, 92, + 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 118, 92, 188, 114, 92, + 172, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 92, 180, 110, 84, + 172, 110, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, + 172, 106, 76, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, + 172, 106, 84, 172, 102, 84, 172, 102, 76, 180, 106, 84, 180, 114, 92, + 188, 118, 92, 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 110, 84, + 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, 172, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, 164, 98, 84, + 156, 94, 76, 140, 74, 52, 140, 78, 60, 148, 86, 68, 156, 90, 68, + 156, 94, 76, 156, 98, 76, 172, 102, 84, 172, 110, 92, 172, 106, 92, + 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, + 172, 102, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92, + 172, 106, 84, 172, 106, 84, 172, 110, 92, 164, 102, 84, 172, 102, 84, + 164, 106, 84, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 92, 172, 106, 92, 164, 102, 84, 172, 102, 84, + 164, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92, + 180, 106, 92, 180, 110, 92, 172, 102, 92, 172, 114, 100, 180, 118, 100, + 132, 74, 60, 92, 34, 20, 92, 34, 12, 124, 58, 44, 148, 78, 60, + 148, 90, 68, 156, 86, 68, 156, 94, 76, 156, 94, 76, 156, 90, 68, + 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 156, 98, 76, 164, 94, 76, + 164, 98, 76, 164, 98, 84, 164, 98, 84, 172, 102, 76, 164, 102, 84, + 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, 180, 106, 84, + 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92, + 180, 110, 92, 180, 106, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, + 188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92, + 188, 122, 100, 188, 122, 100, 188, 118, 92, 180, 118, 92, 188, 118, 92, + 188, 118, 100, 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 118, 92, + 188, 122, 100, 196, 130, 108, 188, 114, 92, 180, 114, 92, 180, 118, 92, + 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 180, 110, 84, + 180, 110, 92, 180, 114, 84, 180, 114, 92, 180, 114, 92, 188, 118, 92, + 188, 118, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100, + 188, 122, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, + 196, 122, 100, 188, 126, 100, 188, 122, 100, 188, 122, 92, 188, 122, 100, + 196, 122, 100, 188, 126, 100, 196, 122, 100, 188, 118, 92, 180, 118, 92, + 188, 118, 100, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, + 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 114, 92, + 180, 110, 84, 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92, + 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 92, + 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, + 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, + 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92, + 172, 110, 84, 172, 110, 84, 180, 110, 92, 188, 118, 92, 188, 118, 92, + 180, 114, 92, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84, + 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, + 172, 110, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 94, 76, + 156, 94, 68, 172, 102, 76, 172, 110, 92, 172, 110, 84, 172, 106, 92, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, + 172, 106, 84, 172, 106, 92, 172, 102, 84, 172, 102, 84, 172, 106, 92, + 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, + 172, 106, 84, 172, 102, 84, 172, 106, 92, 172, 102, 84, 164, 98, 76, + 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, + 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 98, 76, + 172, 102, 84, 172, 102, 84, 172, 102, 84, 164, 98, 84, 164, 102, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 98, 76, + 172, 98, 84, 164, 94, 84, 172, 110, 92, 172, 110, 100, 116, 62, 52, + 92, 34, 12, 92, 34, 20, 148, 90, 68, 172, 106, 84, 172, 110, 92, + 172, 106, 84, 172, 110, 84, 180, 110, 92, 164, 102, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 110, 92, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, + 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, + 180, 110, 92, 188, 118, 100, 188, 114, 100, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100, + 188, 118, 92, 196, 122, 100, 196, 126, 108, 204, 130, 108, 188, 122, 100, + 188, 118, 100, 180, 118, 92, 180, 114, 92, 188, 122, 100, 196, 122, 100, + 188, 122, 100, 188, 118, 92, 180, 110, 92, 196, 122, 100, 188, 126, 100, + 196, 126, 100, 188, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 108, + 196, 130, 108, 196, 130, 108, 196, 126, 100, 196, 126, 108, 196, 130, 108, + 196, 134, 108, 204, 134, 108, 196, 130, 108, 188, 126, 108, 188, 118, 92, + 180, 114, 92, 180, 106, 84, 180, 110, 84, 180, 114, 92, 180, 118, 92, + 188, 118, 92, 180, 118, 92, 188, 126, 100, 188, 122, 100, 196, 126, 100, + 196, 126, 100, 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108, + 196, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100, + 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, 188, 118, 92, + 180, 114, 92, 188, 118, 92, 188, 118, 100, 188, 122, 92, 188, 122, 100, + 196, 122, 100, 180, 118, 92, 188, 118, 92, 180, 114, 92, 172, 110, 84, + 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 118, 92, + 188, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, + 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 114, 84, + 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, + 180, 114, 84, 180, 114, 92, 180, 118, 92, 180, 110, 92, 172, 106, 84, + 180, 110, 84, 180, 110, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, + 172, 110, 84, 172, 106, 92, 172, 106, 84, 164, 98, 76, 180, 118, 100, + 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, 172, 106, 92, + 172, 106, 84, 164, 102, 84, 180, 106, 84, 172, 106, 92, 180, 110, 92, + 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, + 172, 98, 84, 164, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, + 180, 106, 84, 172, 110, 92, 180, 106, 92, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 172, 102, 84, 164, 102, 84, + 172, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 172, 102, 84, + 172, 102, 92, 164, 102, 84, 172, 102, 84, 164, 106, 84, 164, 106, 84, + 164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 102, 84, + 164, 94, 84, 172, 106, 92, 164, 106, 92, 116, 62, 52, 92, 34, 20, + 100, 46, 28, 148, 86, 76, 164, 98, 76, 164, 98, 76, 156, 90, 76, + 164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 164, 102, 84, + 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 110, 92, + 180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 106, 92, 172, 106, 84, + 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92, + 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 180, 106, 92, + 180, 110, 84, 172, 106, 84, 172, 102, 84, 180, 110, 92, 172, 102, 76, + 172, 98, 76, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 172, 102, 76, 172, 110, 84, 172, 106, 84, + 172, 98, 76, 156, 94, 68, 164, 94, 68, 164, 94, 76, 164, 98, 76, + 164, 94, 68, 164, 94, 68, 156, 90, 68, 164, 94, 68, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84, + 172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 164, 98, 76, + 148, 86, 60, 148, 82, 60, 156, 90, 68, 164, 94, 76, 164, 98, 76, + 164, 94, 76, 172, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 172, 106, 84, + 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, + 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 102, 84, 172, 102, 76, + 164, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 114, 92, + 172, 102, 76, 172, 106, 84, 172, 102, 84, 164, 94, 76, 164, 98, 76, + 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 172, 98, 76, + 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 164, 102, 76, + 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 102, 76, 164, 102, 76, + 172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 84, + 172, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, + 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 76, 156, 90, 68, 164, 94, 68, 164, 98, 76, 164, 98, 76, + 164, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, + 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, + 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 90, 68, + 156, 94, 76, 156, 86, 68, 156, 90, 68, 164, 98, 76, 164, 94, 76, + 164, 94, 76, 164, 98, 76, 172, 102, 84, 180, 114, 92, 164, 102, 76, + 172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92, + 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, 172, 110, 92, + 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, + 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 172, 110, 92, 172, 110, 84, 172, 106, 84, 172, 102, 92, 172, 106, 84, + 172, 106, 92, 172, 110, 92, 172, 110, 92, 172, 110, 92, 180, 106, 84, + 172, 106, 84, 180, 106, 92, 180, 110, 92, 180, 110, 100, 172, 102, 84, + 180, 114, 100, 172, 110, 100, 124, 66, 52, 100, 46, 28, 100, 42, 28, + 148, 78, 68, 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 156, 90, 68, 148, 82, 60, 148, 82, 68, 148, 86, 60, + 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 90, 68, 148, 86, 68, + 156, 90, 68, 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, + 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84, + 156, 90, 68, 164, 94, 76, 164, 98, 76, 164, 94, 76, 156, 86, 68, + 156, 94, 76, 180, 110, 92, 172, 98, 76, 172, 102, 76, 172, 102, 84, + 164, 98, 76, 172, 98, 76, 180, 110, 84, 188, 122, 100, 188, 118, 92, + 180, 114, 92, 188, 118, 100, 188, 118, 92, 188, 122, 100, 180, 114, 92, + 180, 110, 92, 172, 102, 76, 172, 106, 84, 188, 118, 92, 188, 122, 100, + 188, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 172, 102, 76, + 172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 114, 92, 188, 118, 92, + 188, 114, 92, 180, 114, 92, 188, 114, 92, 188, 118, 100, 188, 118, 92, + 180, 114, 92, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84, + 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, 164, 98, 76, + 172, 102, 76, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, + 180, 110, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 106, 84, + 180, 110, 92, 172, 106, 76, 172, 110, 84, 180, 110, 92, 180, 110, 84, + 180, 106, 84, 172, 106, 84, 180, 106, 84, 172, 110, 84, 180, 110, 84, + 172, 102, 84, 172, 102, 76, 172, 102, 76, 164, 94, 68, 164, 98, 76, + 172, 102, 76, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 94, 76, + 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, + 164, 102, 84, 172, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, + 156, 90, 68, 156, 90, 68, 164, 94, 76, 172, 102, 76, 172, 106, 84, + 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, + 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, + 164, 94, 68, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 102, 76, + 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76, + 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, + 164, 98, 76, 156, 94, 76, 156, 86, 68, 148, 86, 68, 148, 82, 60, + 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 82, 60, + 148, 86, 68, 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, + 148, 78, 60, 148, 82, 60, 156, 86, 68, 156, 90, 76, 156, 90, 68, + 156, 86, 68, 148, 86, 60, 156, 86, 68, 148, 86, 68, 148, 86, 68, + 156, 90, 68, 156, 90, 68, 164, 94, 76, 156, 94, 76, 156, 86, 68, + 156, 90, 68, 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, + 156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, + 156, 90, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 106, 84, + 172, 102, 84, 164, 90, 76, 172, 102, 84, 172, 102, 84, 164, 102, 92, + 164, 102, 92, 124, 70, 60, 100, 42, 28, 84, 30, 12, 132, 70, 52, + 140, 74, 60, 148, 78, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, + 140, 78, 60, 140, 74, 52, 148, 78, 60, 148, 82, 60, 148, 82, 60, + 148, 82, 68, 156, 86, 60, 156, 90, 68, 156, 90, 68, 156, 90, 76, + 148, 82, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, + 156, 86, 68, 156, 90, 68, 164, 90, 76, 172, 102, 84, 156, 94, 76, + 156, 90, 68, 172, 98, 84, 164, 102, 84, 164, 94, 76, 164, 94, 76, + 172, 102, 84, 180, 110, 84, 180, 110, 92, 188, 114, 92, 180, 110, 84, + 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 92, 180, 118, 92, + 188, 114, 92, 188, 118, 92, 180, 118, 92, 180, 114, 92, 180, 110, 84, + 180, 114, 92, 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 114, 92, 180, 114, 92, + 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, + 172, 102, 84, 172, 106, 76, 180, 110, 92, 188, 118, 92, 188, 118, 100, + 188, 118, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, + 180, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, + 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 106, 84, 180, 110, 84, + 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, + 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 172, 106, 84, + 172, 106, 84, 180, 106, 84, 180, 110, 92, 180, 110, 92, 172, 106, 76, + 172, 106, 84, 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 106, 84, + 172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 98, 76, 164, 102, 76, + 172, 102, 84, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 102, 76, + 164, 102, 84, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 94, 68, + 164, 94, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 172, 106, 84, + 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 76, + 172, 102, 76, 164, 98, 76, 172, 102, 84, 172, 106, 76, 164, 94, 76, + 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 84, 164, 98, 76, + 156, 94, 76, 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 94, 76, + 156, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, 156, 86, 68, + 156, 90, 68, 164, 94, 76, 164, 94, 76, 156, 90, 68, 156, 86, 68, + 156, 86, 68, 156, 94, 76, 164, 98, 76, 164, 94, 76, 156, 90, 76, + 156, 86, 68, 148, 90, 68, 156, 90, 68, 156, 94, 68, 156, 94, 76, + 156, 94, 76, 156, 94, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, + 164, 94, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, + 156, 90, 68, 164, 94, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76, + 164, 102, 76, 156, 98, 76, 164, 98, 76, 164, 94, 68, 156, 82, 68, + 132, 66, 44, 140, 70, 52, 148, 78, 68, 156, 90, 76, 156, 102, 84, + 124, 66, 52, 84, 30, 12, 92, 38, 28, 132, 66, 52, 140, 74, 52, + 132, 74, 60, 132, 66, 44, 124, 66, 44, 140, 70, 52, 140, 78, 60, + 148, 82, 60, 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 86, 68, + 148, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, 164, 90, 68, + 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, 164, 98, 84, + 172, 98, 76, 164, 102, 84, 172, 102, 84, 172, 98, 84, 164, 98, 76, + 172, 102, 84, 180, 110, 84, 180, 110, 92, 172, 110, 92, 172, 102, 76, + 180, 106, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 106, 84, + 172, 102, 84, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 188, 114, 92, 180, 110, 92, 172, 110, 84, 188, 118, 100, + 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, + 180, 114, 92, 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 102, 84, 172, 102, 76, + 172, 102, 76, 172, 110, 84, 188, 118, 100, 188, 122, 100, 188, 118, 92, + 188, 118, 100, 188, 122, 92, 188, 122, 100, 172, 110, 84, 180, 110, 92, + 180, 114, 84, 180, 114, 92, 188, 114, 92, 180, 118, 92, 188, 114, 92, + 180, 118, 92, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, + 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 106, 84, + 180, 106, 84, 172, 110, 92, 180, 110, 84, 180, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 106, 84, 172, 110, 84, + 172, 102, 84, 172, 102, 84, 164, 102, 76, 172, 102, 76, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 76, + 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 98, 76, 172, 102, 76, + 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84, + 172, 106, 84, 180, 110, 92, 180, 110, 84, 172, 110, 84, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 180, 110, 84, 164, 98, 76, 164, 98, 76, + 172, 106, 84, 164, 102, 76, 172, 102, 84, 164, 98, 84, 164, 98, 76, + 172, 106, 84, 172, 110, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84, + 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, + 156, 94, 76, 164, 98, 76, 172, 106, 84, 172, 102, 76, 164, 98, 84, + 172, 102, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76, + 172, 102, 84, 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68, + 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, + 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 76, 164, 98, 76, + 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 94, 76, + 164, 98, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, 164, 102, 84, + 164, 98, 76, 156, 94, 68, 156, 90, 68, 156, 86, 68, 132, 62, 44, + 140, 66, 52, 140, 74, 60, 156, 94, 84, 172, 110, 100, 132, 74, 60, + 92, 38, 28, 116, 58, 44, 164, 106, 84, 180, 114, 92, 180, 114, 92, + 172, 106, 84, 172, 106, 84, 172, 110, 92, 188, 122, 100, 188, 126, 100, + 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 92, 180, 110, 92, 164, 102, 84, 172, 106, 84, + 180, 106, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 84, 180, 114, 92, 180, 114, 100, 180, 114, 92, + 180, 114, 100, 188, 122, 100, 188, 122, 100, 188, 114, 92, 180, 114, 92, + 188, 114, 92, 188, 114, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, + 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84, + 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 110, 84, + 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 114, 92, + 188, 118, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, + 180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 106, 76, + 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84, + 180, 106, 84, 172, 110, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, + 164, 94, 68, 164, 98, 76, 172, 106, 84, 180, 110, 84, 172, 106, 84, + 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 76, 172, 102, 76, 172, 102, 84, 164, 102, 76, 172, 102, 84, + 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, 180, 110, 84, + 180, 110, 92, 180, 114, 84, 180, 110, 92, 172, 106, 84, 180, 106, 84, + 172, 110, 84, 180, 106, 84, 172, 110, 92, 180, 106, 84, 172, 106, 84, + 180, 110, 84, 172, 106, 84, 164, 98, 76, 172, 98, 76, 180, 110, 84, + 172, 106, 84, 172, 102, 84, 164, 98, 76, 164, 102, 84, 172, 106, 84, + 172, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, + 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 98, 76, 156, 90, 68, + 156, 90, 68, 164, 98, 84, 164, 98, 84, 172, 102, 76, 172, 102, 84, + 164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, 172, 106, 84, + 172, 98, 84, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 106, 84, + 172, 106, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 164, 102, 76, 172, 102, 84, 164, 102, 84, 164, 102, 76, + 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 98, 84, 164, 98, 84, + 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 102, 84, + 164, 98, 76, 164, 98, 76, 172, 102, 84, 164, 90, 68, 164, 90, 76, + 164, 94, 76, 164, 102, 92, 172, 114, 100, 140, 82, 68, 116, 58, 44, + 116, 62, 52, 148, 86, 68, 164, 98, 76, 164, 102, 84, 164, 98, 76, + 156, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, + 164, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84, + 164, 98, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 172, 106, 84, + 180, 110, 84, 172, 110, 92, 180, 110, 84, 172, 106, 92, 172, 106, 84, + 164, 90, 76, 172, 106, 84, 180, 110, 92, 172, 98, 84, 164, 98, 76, + 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84, + 188, 114, 92, 188, 118, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92, + 180, 110, 84, 180, 114, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, + 172, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, + 172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 110, 92, + 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 110, 84, 180, 110, 84, + 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 110, 84, + 180, 110, 92, 180, 114, 92, 180, 114, 92, 172, 106, 84, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84, + 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84, + 172, 102, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84, + 172, 102, 84, 172, 102, 76, 172, 106, 84, 172, 102, 76, 156, 90, 68, + 164, 94, 68, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 98, 76, + 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, + 164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 180, 106, 84, + 172, 106, 84, 164, 102, 76, 172, 102, 76, 172, 110, 92, 180, 110, 84, + 172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 180, 114, 84, 172, 106, 84, 180, 106, 84, + 172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 110, 84, 180, 114, 92, + 164, 98, 84, 156, 98, 76, 164, 98, 76, 172, 106, 84, 172, 110, 92, + 172, 106, 84, 164, 102, 76, 164, 102, 84, 156, 90, 68, 156, 90, 68, + 156, 94, 76, 164, 102, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, + 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, + 164, 98, 84, 172, 98, 76, 172, 102, 84, 172, 106, 92, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 102, 84, + 164, 98, 76, 156, 90, 68, 164, 98, 76, 164, 98, 76, 164, 98, 84, + 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 98, 84, 164, 102, 76, + 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 164, 102, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, + 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 106, 84, 172, 102, 84, + 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 92, 164, 98, 84, + 164, 102, 92, 156, 98, 84, 132, 74, 60, 116, 62, 52, 116, 58, 44, + 148, 86, 68, 164, 94, 76, 164, 102, 84, 164, 102, 76, 164, 98, 76, + 164, 98, 76, 164, 102, 84, 164, 98, 76, 172, 106, 84, 172, 106, 84, + 172, 106, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 180, 114, 92, + 180, 114, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, + 180, 110, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 84, + 180, 114, 92, 188, 122, 100, 180, 114, 92, 172, 102, 84, 180, 106, 92, + 188, 118, 100, 188, 122, 100, 172, 102, 84, 172, 106, 84, 180, 106, 84, + 180, 110, 84, 180, 110, 84, 180, 106, 92, 172, 102, 76, 172, 102, 84, + 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, + 180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 76, 164, 98, 76, + 172, 102, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 172, 102, 84, + 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, + 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, + 180, 110, 92, 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 84, 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, 180, 110, 92, + 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, + 172, 102, 76, 172, 102, 84, 172, 102, 84, 172, 106, 76, 164, 98, 76, + 164, 98, 76, 172, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 76, + 164, 98, 76, 172, 106, 84, 172, 102, 84, 164, 94, 68, 164, 94, 76, + 172, 102, 76, 172, 102, 76, 164, 102, 84, 172, 102, 76, 164, 98, 76, + 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, + 164, 102, 76, 172, 98, 76, 164, 102, 76, 172, 106, 84, 172, 102, 76, + 172, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 84, + 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, + 156, 90, 68, 164, 94, 68, 172, 110, 84, 180, 114, 92, 172, 102, 76, + 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 102, 84, + 164, 98, 76, 164, 98, 84, 156, 94, 76, 164, 98, 76, 164, 98, 84, + 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, + 164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 172, 102, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 164, 94, 76, + 156, 90, 68, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, + 164, 98, 76, 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 102, 84, + 164, 98, 84, 164, 102, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, + 172, 98, 84, 164, 98, 76, 172, 98, 84, 164, 94, 76, 164, 98, 84, + 156, 98, 84, 124, 70, 60, 116, 58, 44, 116, 62, 44, 164, 98, 76, + 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 102, 84, 172, 102, 84, + 172, 106, 84, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84, + 172, 102, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92, + 172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 114, 92, 180, 106, 92, 164, 102, 84, 180, 106, 84, 180, 114, 100, + 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 118, 100, + 188, 118, 100, 188, 114, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100, + 188, 114, 92, 188, 122, 100, 172, 106, 84, 172, 106, 84, 180, 110, 84, + 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, 180, 110, 84, + 180, 114, 92, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84, + 180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, + 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84, + 172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 106, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 114, 92, + 180, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 106, 84, 172, 102, 76, + 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 84, + 164, 98, 76, 172, 106, 76, 172, 102, 84, 164, 98, 76, 172, 102, 76, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, + 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 98, 76, + 164, 102, 84, 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, + 172, 106, 84, 172, 106, 84, 172, 98, 76, 172, 102, 76, 172, 106, 84, + 172, 106, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, 156, 94, 68, + 164, 90, 68, 172, 106, 84, 180, 110, 84, 164, 102, 84, 164, 98, 76, + 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 172, 106, 84, 172, 106, 84, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, + 164, 98, 84, 172, 102, 84, 172, 98, 76, 164, 98, 76, 164, 94, 76, + 164, 98, 76, 172, 102, 84, 164, 98, 84, 164, 94, 76, 164, 94, 76, + 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68, + 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, + 172, 102, 76, 164, 102, 84, 164, 102, 76, 172, 102, 84, 164, 102, 76, + 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 84, + 164, 102, 76, 164, 102, 84, 172, 98, 84, 164, 102, 84, 164, 98, 76, + 164, 102, 84, 156, 98, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76, + 172, 98, 84, 172, 98, 84, 164, 90, 76, 172, 106, 92, 164, 106, 92, + 132, 70, 60, 116, 62, 44, 116, 58, 44, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 156, 90, 68, 156, 90, 68, 164, 98, 76, 164, 102, 84, + 164, 98, 76, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 92, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92, + 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 110, 92, + 172, 106, 84, 164, 98, 76, 180, 110, 92, 180, 110, 92, 180, 114, 92, + 188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92, + 180, 114, 92, 188, 118, 92, 188, 118, 100, 180, 110, 84, 180, 110, 92, + 188, 118, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92, + 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 180, 110, 92, + 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 180, 110, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, 180, 110, 92, + 180, 110, 84, 180, 118, 100, 188, 114, 92, 180, 114, 92, 180, 110, 92, + 188, 122, 100, 188, 118, 92, 180, 114, 100, 180, 114, 84, 180, 110, 92, + 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, + 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84, + 180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76, + 172, 102, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 110, 84, + 180, 110, 84, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 110, 84, 180, 114, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84, + 180, 110, 84, 172, 102, 76, 172, 102, 76, 172, 102, 76, 164, 94, 76, + 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, + 180, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, + 180, 110, 84, 180, 110, 92, 172, 106, 76, 172, 102, 84, 172, 106, 84, + 172, 106, 84, 172, 102, 76, 164, 102, 76, 180, 106, 84, 164, 98, 76, + 164, 102, 76, 180, 110, 84, 172, 110, 84, 164, 94, 76, 156, 94, 68, + 172, 102, 84, 172, 106, 84, 172, 106, 92, 164, 102, 84, 164, 98, 76, + 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 84, + 156, 90, 68, 164, 102, 84, 164, 102, 84, 156, 86, 68, 148, 86, 68, + 172, 102, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, + 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76, + 164, 98, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 164, 94, 76, + 172, 98, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, 148, 90, 68, + 156, 94, 76, 164, 94, 76, 164, 102, 84, 164, 102, 84, 164, 102, 84, + 164, 98, 76, 164, 98, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 102, 76, 164, 98, 84, + 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84, + 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 94, 84, + 164, 98, 84, 156, 94, 76, 164, 106, 92, 164, 102, 92, 124, 66, 52, + 116, 58, 44, 116, 58, 36, 164, 106, 92, 172, 106, 84, 164, 106, 84, + 172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 84, + 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, 172, 106, 92, + 172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, + 172, 110, 92, 180, 110, 92, 188, 118, 92, 188, 118, 100, 180, 114, 100, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, + 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100, + 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92, + 180, 106, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, 180, 110, 92, + 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, + 172, 106, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, 188, 118, 100, + 180, 118, 92, 188, 114, 100, 180, 118, 92, 188, 118, 100, 188, 118, 100, + 188, 118, 100, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100, + 188, 118, 100, 180, 114, 92, 188, 114, 92, 180, 114, 100, 180, 114, 92, + 180, 110, 92, 172, 106, 84, 188, 118, 92, 180, 114, 92, 172, 110, 84, + 172, 110, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, + 172, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, + 172, 102, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 84, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, + 180, 110, 84, 172, 106, 84, 172, 106, 76, 172, 102, 84, 164, 102, 76, + 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, + 172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 172, 106, 84, + 172, 106, 84, 172, 102, 84, 180, 106, 84, 172, 106, 84, 180, 106, 92, + 172, 106, 84, 180, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, 172, 98, 76, + 164, 102, 76, 172, 110, 84, 180, 118, 92, 172, 106, 84, 172, 110, 84, + 172, 102, 84, 172, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 68, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, + 164, 98, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 84, 164, 106, 84, 164, 98, 76, 164, 98, 76, 156, 94, 76, + 156, 94, 76, 164, 94, 76, 164, 98, 76, 172, 102, 84, 164, 102, 84, + 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 76, 164, 94, 76, 156, 94, 76, 148, 86, 68, 164, 94, 76, + 164, 102, 84, 164, 102, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, + 164, 94, 84, 164, 90, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, + 164, 94, 76, 164, 94, 76, 172, 102, 84, 164, 98, 76, 172, 98, 84, + 164, 98, 84, 172, 110, 92, 164, 102, 84, 124, 66, 52, 116, 58, 36, + 108, 46, 28, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, + 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, 172, 110, 92, + 180, 114, 92, 180, 118, 100, 180, 110, 92, 172, 106, 84, 180, 110, 92, + 180, 110, 92, 180, 114, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, + 180, 114, 100, 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 172, 106, 92, 180, 106, 84, 180, 114, 92, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92, + 180, 110, 92, 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 106, 84, + 180, 106, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 84, + 180, 106, 92, 180, 114, 92, 188, 118, 100, 188, 118, 100, 180, 114, 92, + 180, 110, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 180, 118, 100, + 188, 118, 100, 188, 118, 100, 188, 118, 100, 196, 126, 108, 188, 122, 100, + 188, 118, 100, 188, 118, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, + 180, 114, 92, 188, 118, 100, 180, 118, 92, 180, 110, 84, 180, 110, 92, + 180, 114, 84, 180, 114, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, + 180, 110, 84, 180, 110, 92, 180, 110, 92, 188, 114, 84, 180, 110, 92, + 180, 110, 84, 188, 114, 92, 188, 114, 92, 180, 118, 92, 188, 118, 100, + 188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 118, 92, + 180, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84, + 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 102, 84, + 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, + 164, 98, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92, + 172, 106, 84, 172, 110, 92, 180, 106, 92, 172, 110, 92, 180, 110, 84, + 172, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, 172, 106, 84, + 180, 114, 84, 180, 118, 92, 180, 110, 84, 172, 110, 84, 172, 110, 84, + 172, 106, 84, 164, 102, 76, 172, 102, 76, 164, 102, 76, 164, 102, 84, + 172, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76, + 164, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, 164, 98, 76, + 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, + 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 102, 84, 164, 98, 84, + 164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 102, 84, 172, 106, 84, + 172, 110, 92, 172, 102, 84, 164, 102, 76, 172, 102, 84, 164, 106, 84, + 164, 98, 84, 164, 98, 76, 164, 98, 84, 156, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 84, 164, 98, 84, 164, 94, 76, + 164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, 164, 98, 84, + 164, 94, 76, 156, 94, 84, 156, 94, 76, 156, 94, 76, 156, 90, 76, + 164, 98, 84, 156, 90, 76, 116, 54, 36, 108, 46, 28, 116, 54, 36, + 172, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84, + 172, 106, 92, 164, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 188, 114, 100, 180, 114, 92, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 92, + 172, 110, 84, 172, 106, 92, 180, 110, 84, 180, 110, 92, 180, 110, 92, + 180, 110, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, 180, 114, 92, + 180, 114, 100, 180, 114, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, + 172, 106, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 172, 106, 84, + 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92, + 180, 114, 92, 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, + 180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, + 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 110, 92, 172, 110, 84, + 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 110, 84, 172, 110, 84, + 180, 110, 92, 180, 114, 84, 172, 110, 84, 172, 102, 84, 172, 106, 76, + 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 84, + 172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 92, 180, 110, 84, + 180, 110, 92, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, + 172, 106, 84, 164, 102, 84, 172, 102, 76, 164, 102, 76, 172, 102, 84, + 172, 106, 76, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 106, 84, + 180, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, 172, 102, 84, + 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, + 180, 106, 84, 172, 106, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92, + 172, 114, 92, 180, 110, 84, 172, 114, 92, 180, 110, 84, 172, 114, 92, + 180, 110, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, + 164, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 164, 98, 76, + 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, + 156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 102, 84, 164, 102, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, + 156, 94, 68, 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 156, 86, 68, 156, 94, 68, 164, 98, 76, 164, 98, 76, + 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 98, 76, + 164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 156, 94, 76, + 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 76, + 156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 94, 76, + 164, 98, 84, 164, 94, 76, 164, 98, 84, 156, 94, 76, 164, 102, 84, + 156, 94, 76, 116, 58, 36, 116, 54, 36, 116, 58, 36, 180, 114, 100, + 180, 118, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, + 180, 110, 92, 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, + 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 100, + 180, 114, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 188, 122, 100, + 196, 126, 108, 188, 122, 108, 196, 126, 100, 188, 122, 108, 188, 122, 100, + 188, 118, 100, 180, 118, 100, 188, 114, 100, 180, 118, 100, 188, 118, 100, + 188, 118, 100, 196, 126, 108, 188, 126, 100, 196, 126, 108, 188, 122, 100, + 180, 114, 100, 180, 114, 92, 188, 122, 100, 196, 122, 108, 196, 126, 108, + 196, 126, 100, 188, 118, 100, 180, 114, 100, 188, 114, 92, 180, 118, 100, + 188, 122, 100, 188, 118, 100, 188, 114, 100, 188, 118, 100, 188, 122, 100, + 196, 122, 108, 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 130, 108, + 196, 130, 116, 196, 130, 108, 196, 126, 108, 188, 118, 100, 180, 114, 100, + 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, + 172, 106, 84, 180, 106, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, + 180, 118, 92, 180, 118, 92, 180, 118, 92, 188, 118, 92, 180, 118, 92, + 180, 118, 92, 188, 118, 100, 180, 114, 84, 180, 110, 92, 188, 114, 92, + 180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92, + 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, + 180, 110, 92, 180, 110, 84, 180, 110, 84, 188, 118, 92, 180, 114, 92, + 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, + 188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 122, 108, + 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 114, 92, + 180, 114, 92, 180, 114, 100, 188, 114, 92, 180, 118, 100, 188, 118, 100, + 188, 118, 100, 188, 118, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100, + 188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 180, 118, 92, + 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 76, + 164, 102, 76, 164, 102, 84, 172, 102, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 102, 84, 164, 98, 76, 164, 102, 76, 164, 98, 76, + 156, 98, 76, 164, 98, 84, 164, 98, 76, 156, 94, 76, 164, 94, 68, + 156, 94, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76, + 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76, + 156, 98, 76, 164, 98, 76, 164, 98, 84, 156, 98, 76, 156, 94, 68, + 164, 94, 76, 164, 98, 76, 164, 102, 84, 164, 102, 84, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 68, + 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 68, + 156, 94, 76, 172, 98, 84, 164, 98, 84, 172, 98, 76, 164, 94, 84, + 172, 98, 84, 164, 98, 84, 164, 98, 84, 172, 98, 84, 164, 98, 84, + 164, 98, 84, 164, 106, 84, 164, 102, 84, 172, 110, 92, 164, 98, 84, + 124, 66, 44, 116, 58, 36, 116, 50, 36, 172, 106, 84, 164, 102, 84, + 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84, + 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 106, 84, 172, 102, 84, + 164, 102, 76, 172, 102, 84, 164, 102, 84, 172, 106, 84, 172, 102, 84, + 180, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, + 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92, + 172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, + 180, 118, 92, 180, 114, 100, 180, 110, 92, 180, 110, 92, 180, 106, 92, + 172, 102, 84, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, + 180, 110, 92, 180, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92, + 172, 110, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92, + 180, 110, 92, 180, 110, 92, 180, 110, 92, 188, 114, 100, 188, 122, 100, + 188, 118, 100, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 76, + 172, 102, 84, 172, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, + 172, 106, 84, 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84, + 172, 106, 84, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 106, 84, + 172, 110, 92, 180, 110, 84, 172, 110, 92, 180, 110, 84, 180, 110, 92, + 180, 114, 92, 180, 114, 92, 188, 114, 92, 188, 114, 92, 180, 110, 92, + 180, 110, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, + 172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 106, 84, 172, 106, 84, + 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, + 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, + 180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 102, 84, + 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, 172, 110, 92, + 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, + 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, 172, 106, 92, + 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 84, 164, 102, 76, + 164, 98, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, + 172, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 84, 164, 98, 76, + 172, 102, 76, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 164, 94, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 84, 172, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76, + 164, 98, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 94, 76, + 156, 94, 76, 164, 94, 68, 164, 94, 76, 164, 94, 76, 156, 94, 76, + 164, 94, 76, 164, 90, 76, 156, 94, 76, 164, 94, 76, 164, 94, 76, + 156, 94, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76, + 164, 102, 84, 164, 102, 84, 172, 106, 92, 156, 94, 76, 124, 62, 44, + 116, 50, 36, 108, 50, 28, 156, 86, 68, 156, 90, 68, 148, 86, 68, + 156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 86, 68, 148, 90, 68, + 156, 90, 68, 156, 90, 76, 156, 94, 76, 156, 90, 68, 148, 86, 68, + 156, 86, 68, 156, 90, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, + 156, 90, 68, 164, 90, 76, 156, 90, 68, 156, 90, 76, 164, 90, 68, + 156, 90, 76, 164, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, + 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 86, 76, + 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 90, 68, + 164, 90, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, + 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, + 156, 90, 68, 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 76, + 156, 90, 68, 148, 86, 68, 156, 86, 68, 164, 94, 76, 164, 94, 76, + 156, 90, 68, 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, + 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, + 156, 90, 68, 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, + 164, 94, 76, 156, 94, 68, 156, 90, 68, 156, 94, 68, 164, 94, 68, + 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, + 164, 90, 76, 164, 90, 68, 164, 90, 76, 164, 94, 76, 156, 94, 68, + 164, 94, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 164, 94, 76, + 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, + 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, 156, 90, 76, + 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 68, 156, 90, 76, + 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 86, 68, + 164, 90, 76, 156, 90, 68, 164, 90, 76, 156, 94, 68, 164, 94, 76, + 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 94, 76, + 156, 94, 76, 156, 90, 76, 148, 86, 68, 164, 98, 84, 164, 98, 76, + 164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76, + 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 94, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, + 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76, + 156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 84, + 156, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, + 164, 98, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, 156, 90, 68, + 156, 94, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 148, 90, 68, + 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 90, 68, 156, 94, 76, + 156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 68, 156, 82, 68, + 156, 86, 76, 156, 90, 76, 156, 86, 76, 148, 86, 68, 156, 86, 68, + 156, 86, 76, 156, 90, 68, 156, 94, 76, 164, 94, 84, 164, 98, 84, + 156, 94, 76, 156, 98, 76, 148, 86, 68, 116, 54, 36, 108, 50, 28, + 108, 50, 36, 140, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60, + 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, + 148, 82, 60, 148, 82, 60, 148, 78, 60, 140, 74, 52, 140, 74, 52, + 140, 78, 60, 148, 82, 60, 140, 70, 52, 140, 74, 52, 148, 74, 60, + 140, 78, 60, 148, 74, 60, 140, 74, 52, 140, 74, 52, 140, 78, 60, + 140, 74, 52, 148, 78, 60, 140, 74, 60, 148, 78, 60, 148, 74, 60, + 148, 78, 60, 148, 74, 60, 148, 78, 60, 140, 70, 52, 140, 70, 52, + 148, 74, 60, 140, 74, 60, 148, 78, 60, 148, 78, 68, 140, 78, 60, + 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, 148, 74, 60, + 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, + 148, 74, 60, 148, 78, 60, 140, 78, 60, 148, 74, 60, 140, 74, 52, + 140, 70, 52, 140, 74, 52, 140, 78, 60, 148, 78, 60, 148, 78, 60, + 148, 78, 60, 148, 78, 60, 148, 82, 60, 140, 74, 52, 140, 74, 52, + 140, 78, 60, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, + 140, 78, 60, 140, 82, 60, 148, 82, 60, 148, 86, 68, 148, 86, 60, + 140, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 70, 52, + 140, 70, 52, 140, 74, 52, 140, 70, 52, 140, 74, 52, 140, 70, 52, + 140, 74, 52, 140, 74, 52, 140, 78, 60, 148, 74, 60, 140, 74, 52, + 140, 74, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, 148, 78, 60, + 156, 82, 60, 148, 82, 68, 156, 82, 60, 148, 82, 68, 148, 82, 60, + 156, 82, 68, 148, 82, 60, 148, 82, 68, 148, 82, 60, 148, 82, 60, + 148, 82, 60, 148, 82, 68, 148, 78, 60, 156, 82, 60, 148, 82, 68, + 148, 82, 60, 156, 82, 60, 148, 82, 60, 156, 82, 68, 148, 82, 60, + 156, 86, 68, 148, 82, 60, 156, 82, 68, 148, 82, 60, 148, 82, 68, + 148, 82, 68, 148, 82, 68, 148, 86, 68, 148, 82, 68, 156, 86, 68, + 148, 82, 68, 148, 82, 60, 148, 82, 68, 140, 78, 60, 148, 78, 68, + 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60, + 148, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, + 140, 78, 60, 148, 78, 60, 148, 82, 60, 140, 78, 60, 148, 78, 60, + 140, 78, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 78, 60, + 148, 82, 60, 140, 74, 52, 140, 78, 60, 148, 78, 60, 140, 78, 60, + 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60, + 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, 148, 82, 60, + 148, 78, 60, 140, 78, 60, 148, 86, 60, 148, 82, 68, 148, 82, 60, + 148, 82, 60, 140, 78, 60, 148, 82, 60, 148, 78, 60, 148, 78, 60, + 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, + 140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 82, 68, 148, 82, 68, + 148, 86, 68, 156, 82, 68, 148, 82, 68, 148, 82, 68, 148, 82, 68, + 148, 86, 68, 148, 82, 68, 148, 78, 60, 140, 82, 60, 140, 74, 60, + 140, 78, 60, 140, 74, 60, 116, 50, 36, 108, 50, 36, 108, 50, 28, + 108, 42, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 116, 46, 28, + 108, 42, 20, 116, 46, 28, 108, 42, 20, 108, 46, 28, 108, 46, 28, + 116, 46, 28, 108, 46, 20, 108, 42, 20, 100, 42, 20, 108, 42, 20, + 108, 42, 28, 108, 42, 20, 116, 46, 28, 116, 46, 28, 116, 46, 28, + 108, 42, 20, 108, 38, 20, 108, 42, 28, 116, 42, 28, 108, 42, 20, + 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 50, 28, 108, 46, 28, + 116, 46, 28, 108, 42, 20, 108, 42, 28, 116, 42, 28, 108, 46, 28, + 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 42, 28, 108, 42, 20, + 116, 46, 28, 108, 42, 20, 116, 46, 28, 108, 46, 28, 108, 42, 20, + 116, 42, 28, 108, 38, 20, 108, 42, 28, 116, 46, 28, 108, 46, 28, + 116, 46, 28, 108, 42, 20, 108, 42, 20, 116, 42, 28, 116, 46, 28, + 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 46, 28, 116, 46, 28, + 116, 46, 28, 116, 50, 28, 116, 46, 28, 116, 50, 36, 124, 50, 36, + 116, 50, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, + 108, 46, 20, 108, 50, 28, 116, 50, 28, 116, 54, 28, 108, 46, 28, + 108, 46, 20, 108, 42, 20, 108, 42, 20, 116, 50, 28, 116, 46, 28, + 116, 46, 28, 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 46, 28, + 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 42, 28, + 116, 46, 28, 116, 46, 28, 116, 50, 28, 124, 50, 36, 124, 58, 36, + 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36, + 124, 58, 36, 124, 54, 36, 132, 62, 44, 124, 54, 36, 124, 58, 36, + 124, 58, 36, 124, 58, 36, 124, 54, 44, 124, 58, 36, 132, 62, 44, + 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, + 124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36, + 124, 58, 44, 124, 54, 36, 124, 58, 44, 124, 58, 36, 124, 58, 44, + 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, 124, 58, 44, + 124, 58, 44, 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, + 124, 62, 44, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 62, 44, + 124, 62, 44, 132, 62, 44, 116, 58, 36, 124, 58, 36, 124, 58, 44, + 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 58, 36, + 124, 62, 44, 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, + 132, 62, 44, 124, 66, 44, 132, 62, 44, 124, 62, 44, 124, 58, 36, + 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, 124, 62, 44, + 124, 58, 36, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 58, 44, + 124, 58, 36, 124, 58, 36, 116, 58, 36, 124, 58, 36, 124, 58, 36, + 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, + 124, 58, 36, 124, 58, 36, 124, 50, 36, 124, 54, 36, 124, 54, 36, + 124, 54, 36, 116, 54, 36, 116, 50, 36, 124, 54, 36, 124, 54, 44, + 124, 54, 36, 116, 54, 36, 116, 54, 36, 108, 46, 28, 124, 58, 44, + 124, 58, 44, 100, 42, 20, 108, 50, 28 +}; diff --git a/hacks/glx/escher.c b/hacks/glx/escher.c new file mode 100644 index 00000000..b61b2736 --- /dev/null +++ b/hacks/glx/escher.c @@ -0,0 +1,814 @@ +/* -*- Mode: C; tab-width: 4 -*- + * escher.c - Shows some Escher like scenes + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)escher.c 4.04 97/07/28 xlockmore"; +#endif + +#undef DEBUG_LISTS + +/* 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 RotateAroundU() routine was adapted from the book + * "Computer Graphics Principles and Practice + * Foley - vanDam - Feiner - Hughes + * Second Edition" Pag. 227, exercise 5.15. + * + * This mode shows some interesting scenes that are impossible OR very + * wierd to build in the real universe. Much of the scenes are inspirated + * on Mauritz Cornelis Escher's works which derivated the mode's name. + * M.C. Escher (1898-1972) was a dutch artist and many people prefer to + * say he was a mathematician. + * + * Thanks goes to Brian Paul for making it possible and inexpensive to use + * OpenGL at home. + * + * Since I'm not a native english speaker, my apologies for any gramatical + * mistake. + * + * My e-mail addresses are + * vianna@cat.cbpf.br + * and + * marcelo@venus.rdc.puc-rio.br + * + * Marcelo F. Vianna (Jun-01-1997) + * + * Revision History: + * 08-Jun-97: New scene implemented: "Impossible Cage" based in a M.C. Escher's + * painting with the same name (quite similar). The first GL mode + * to use texture mapping. + * The "Impossible Cage" scene doesn't use DEPTH BUFFER, the + * wood planks are drawn consistently using GL_CULL_FACE, and + * the painter's algorithm is used to sort the planks. + * Marcelo F. Vianna. + * 07-Jun-97: Speed ups in Moebius Strip using GL_CULL_FACE. + * Marcelo F. Vianna. + * 03-Jun-97: Initial Release (Only one scene: "Moebius Strip") + * The Moebious Strip scene was inspirated in a M.C. Escher's + * painting named Moebius Strip II in wich ants walk across a + * Moebius Strip path, sometimes meeting each other and sometimes + * being in "opposite faces" (note that the moebius strip has + * only one face and one edge). + * Marcelo F. Vianna. + * + */ + +/*- + * Texture mapping is only available on RGBA contexts, Mono and color index + * visuals DO NOT support texture mapping in OpenGL. + * + * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture + * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono + * is not officially supported for both OpenGL and Mesa, but seems to not crash + * Mesa. + * + * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know). + */ + +#include + +#ifdef STANDALONE +# define PROGCLASS "Escher" +# define HACK_INIT init_escher +# define HACK_DRAW draw_escher +# define escher_opts xlockmore_opts +# define DEFAULTS "*count: 0 \n" \ + "*cycles: 1 \n" \ + "*delay: 100 \n" \ + "*wireframe: False \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + + +#ifdef USE_GL + + +#include +#include "e_textures.h" + +#define DEF_SOLIDMOEBIUS "False" +#define DEF_NOANTS "False" + +static int solidmoebius; +static int noants; + +static XrmOptionDescRec opts[] = +{ + {"-solidmoebius", ".escher.solidmoebius", XrmoptionNoArg, (caddr_t) "on"}, + {"+solidmoebius", ".escher.solidmoebius", XrmoptionNoArg, (caddr_t) "off"}, + {"-noants", ".escher.noants", XrmoptionNoArg, (caddr_t) "on"}, + {"+noants", ".escher.noants", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool}, + {(caddr_t *) & noants, "noants", "Noants", DEF_NOANTS, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"}, + {"-/+noants", "turn on/off walking ants"} +}; + +ModeSpecOpt escher_opts = +{4, opts, 2, vars, desc}; + +#define Scale4Window 0.3 +#define Scale4Iconic 0.4 + +#define sqr(A) ((A)*(A)) + +#ifndef Pi +#define Pi M_PI +#endif + +/*************************************************************************/ + +typedef struct { + GLint WindH, WindW; + GLfloat step; + GLfloat ant_position; + int scene; + int AreObjectsDefined[3]; + GLXContext glx_context; +} escherstruct; + +static float front_shininess[] = +{60.0}; +static float front_specular[] = +{0.7, 0.7, 0.7, 1.0}; +static float ambient[] = +{0.0, 0.0, 0.0, 1.0}; +static float diffuse[] = +{1.0, 1.0, 1.0, 1.0}; +static float position0[] = +{1.0, 1.0, 1.0, 0.0}; +static float position1[] = +{-1.0, -1.0, 1.0, 0.0}; +static float lmodel_ambient[] = +{0.5, 0.5, 0.5, 1.0}; +static float lmodel_twoside[] = +{GL_TRUE}; + +static float MaterialRed[] = +{0.7, 0.0, 0.0, 1.0}; +static float MaterialGreen[] = +{0.1, 0.5, 0.2, 1.0}; +static float MaterialBlue[] = +{0.0, 0.0, 0.7, 1.0}; +static float MaterialCyan[] = +{0.2, 0.5, 0.7, 1.0}; +static float MaterialYellow[] = +{0.7, 0.7, 0.0, 1.0}; +static float MaterialMagenta[] = +{0.6, 0.2, 0.5, 1.0}; +static float MaterialWhite[] = +{0.7, 0.7, 0.7, 1.0}; +static float MaterialGray[] = +{0.2, 0.2, 0.2, 1.0}; + +static escherstruct *escher = NULL; +static GLuint objects; + +#define NUM_SCENES 2 + +#define ObjMoebiusStrip 0 +#define ObjAntBody 1 +#define ObjWoodPlank 2 + +#define PlankWidth 3.0 +#define PlankHeight 0.35 +#define PlankThickness 0.15 + +static void +mySphere(float radius) +{ + GLUquadricObj *quadObj; + + quadObj = gluNewQuadric(); + gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL); + gluSphere(quadObj, radius, 16, 16); + gluDeleteQuadric(quadObj); +} + +static void +myCone(float radius) +{ + GLUquadricObj *quadObj; + + quadObj = gluNewQuadric(); + gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL); + gluCylinder(quadObj, radius, 0, radius * 3, 8, 1); + gluDeleteQuadric(quadObj); +} + +static void +draw_escher_ant(escherstruct * ep, float *Material) +{ + static float ant_step = 0; + float cos1 = cos(ant_step); + float cos2 = cos(ant_step + 2 * Pi / 3); + float cos3 = cos(ant_step + 4 * Pi / 3); + float sin1 = sin(ant_step); + float sin2 = sin(ant_step + 2 * Pi / 3); + float sin3 = sin(ant_step + 4 * Pi / 3); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material); + if (!ep->AreObjectsDefined[ObjAntBody]) { + glNewList(objects + ObjAntBody, GL_COMPILE_AND_EXECUTE); + glEnable(GL_CULL_FACE); + glPushMatrix(); + glScalef(1, 1.3, 1); + mySphere(0.18); + glScalef(1, 1 / 1.3, 1); + glTranslatef(0.00, 0.30, 0.00); + mySphere(0.2); + + glTranslatef(-0.05, 0.17, 0.05); + glRotatef(-90, 1, 0, 0); + glRotatef(-25, 0, 1, 0); + myCone(0.05); + glTranslatef(0.00, 0.10, 0.00); + myCone(0.05); + glRotatef(25, 0, 1, 0); + glRotatef(90, 1, 0, 0); + + glScalef(1, 1.3, 1); + glTranslatef(0.15, -0.65, 0.05); + mySphere(0.25); + glScalef(1, 1 / 1.3, 1); + glPopMatrix(); + glDisable(GL_CULL_FACE); + glEndList(); + ep->AreObjectsDefined[ObjAntBody] = 1; +#ifdef DEBUG_LISTS + (void) printf("Ant drawn SLOWLY\n"); +#endif + } else { + glCallList(objects + ObjAntBody); +#ifdef DEBUG_LISTS + (void) printf("Ant drawn quickly\n"); +#endif + } + + glDisable(GL_LIGHTING); + /* ANTENNAS */ + glBegin(GL_LINES); + glColor3fv(Material); + glVertex3f(0.00, 0.30, 0.00); + glColor3fv(MaterialGray); + glVertex3f(0.40, 0.70, 0.40); + glColor3fv(Material); + glVertex3f(0.00, 0.30, 0.00); + glColor3fv(MaterialGray); + glVertex3f(0.40, 0.70, -0.40); + glEnd(); + glBegin(GL_POINTS); + glColor3fv(MaterialRed); + glVertex3f(0.40, 0.70, 0.40); + glVertex3f(0.40, 0.70, -0.40); + glEnd(); + + /* LEFT-FRONT ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, 0.05, 0.18); + glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45); + glEnd(); + + /* LEFT-CENTER ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, 0.00, 0.18); + glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45); + glEnd(); + + /* LEFT-BACK ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, -0.05, 0.18); + glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45); + glEnd(); + + /* RIGHT-FRONT ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, 0.05, -0.18); + glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45); + glEnd(); + + /* RIGHT-CENTER ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, 0.00, -0.18); + glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45); + glEnd(); + + /* RIGHT-BACK ARM */ + glBegin(GL_LINE_STRIP); + glColor3fv(Material); + glVertex3f(0.00, -0.05, -0.18); + glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25); + glColor3fv(MaterialGray); + glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45); + glEnd(); + + glBegin(GL_POINTS); + glColor3fv(MaterialMagenta); + glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45); + glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45); + glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45); + glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45); + glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45); + glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45); + glEnd(); + + glEnable(GL_LIGHTING); + + ant_step += 0.3; +} + +static void +RotateAaroundU(float Ax, float Ay, float Az, + float Ux, float Uy, float Uz, + float *Cx, float *Cy, float *Cz, + float Theta) +{ + float cosO = cos(Theta); + float sinO = sin(Theta); + float one_cosO = 1 - cosO; + float Ux2 = sqr(Ux); + float Uy2 = sqr(Uy); + float Uz2 = sqr(Uz); + float UxUy = Ux * Uy; + float UxUz = Ux * Uz; + float UyUz = Uy * Uz; + + *Cx = (Ux2 + cosO * (1 - Ux2)) * Ax + (UxUy * one_cosO - Uz * sinO) * Ay + (UxUz * one_cosO + Uy * sinO) * Az; + *Cy = (UxUy * one_cosO + Uz * sinO) * Ax + (Uy2 + cosO * (1 - Uy2)) * Ay + (UyUz * one_cosO - Ux * sinO) * Az; + *Cz = (UxUz * one_cosO - Uy * sinO) * Ax + (UyUz * one_cosO + Ux * sinO) * Ay + (Uz2 + cosO * (1 - Uz2)) * Az; +} + +#define MoebiusDivisions 40 +#define MoebiusTransversals 4 +static void +draw_moebius(ModeInfo * mi) +{ + GLfloat Phi, Theta; + GLfloat cPhi, sPhi; + escherstruct *ep = &escher[MI_SCREEN(mi)]; + int i, j; + + float Cx, Cy, Cz; + + if (!ep->AreObjectsDefined[ObjMoebiusStrip]) { + glNewList(objects + ObjMoebiusStrip, GL_COMPILE_AND_EXECUTE); + + if (solidmoebius) { + glBegin(GL_QUAD_STRIP); + Phi = 0; + i = 0; + while (i < (MoebiusDivisions * 2 + 1)) { + Theta = Phi / 2; + cPhi = cos(Phi); + sPhi = sin(Phi); + + i++; + if (i % 2) + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); + else + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + + RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta); + glNormal3f(Cx, Cy, Cz); + RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta); + glVertex3f(cPhi * 3 + Cx, sPhi * 3 + Cy, +Cz); + glVertex3f(cPhi * 3 - Cx, sPhi * 3 - Cy, -Cz); + + Phi += Pi / MoebiusDivisions; + } + glEnd(); + } else { + for (j = -MoebiusTransversals; j < MoebiusTransversals; j++) { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glBegin(GL_QUAD_STRIP); + Phi = 0; + i = 0; + while (i < (MoebiusDivisions * 2 + 1)) { + Theta = Phi / 2; + cPhi = cos(Phi); + sPhi = sin(Phi); + + RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta); + glNormal3f(Cx, Cy, Cz); + RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta); + j++; + if (j == MoebiusTransversals) + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + else if (i % 2) + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); + else + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j); + j--; + if (j == -MoebiusTransversals) + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + else if (i % 2) + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); + else + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j); + + Phi += Pi / MoebiusDivisions; + i++; + } + glEnd(); + } + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } + + glEndList(); + ep->AreObjectsDefined[ObjMoebiusStrip] = 1; +#ifdef DEBUG_LISTS + (void) printf("Strip drawn SLOWLY\n"); +#endif + } else { + glCallList(objects + ObjMoebiusStrip); +#ifdef DEBUG_LISTS + (void) printf("Strip drawn quickly\n"); +#endif + } + + if (!noants) { + /* DRAW BLUE ANT */ + glPushMatrix(); + glRotatef(ep->ant_position + 180, 0, 0, 1); + glTranslatef(3, 0, 0); + glRotatef(ep->ant_position / 2 + 90, 0, 1, 0); + glTranslatef(0.28, 0, -0.45); + draw_escher_ant(ep, MaterialYellow); + glPopMatrix(); + + /* DRAW YELLOW ANT */ + glPushMatrix(); + glRotatef(ep->ant_position, 0, 0, 1); + glTranslatef(3, 0, 0); + glRotatef(ep->ant_position / 2, 0, 1, 0); + glTranslatef(0.28, 0, -0.45); + draw_escher_ant(ep, MaterialBlue); + glPopMatrix(); + + /* DRAW GREEN ANT */ + glPushMatrix(); + glRotatef(-ep->ant_position, 0, 0, 1); + glTranslatef(3, 0, 0); + glRotatef(-ep->ant_position / 2, 0, 1, 0); + glTranslatef(0.28, 0, 0.45); + glRotatef(180, 1, 0, 0); + draw_escher_ant(ep, MaterialGreen); + glPopMatrix(); + + /* DRAW CYAN ANT */ + glPushMatrix(); + glRotatef(-ep->ant_position + 180, 0, 0, 1); + glTranslatef(3, 0, 0); + glRotatef(-ep->ant_position / 2 + 90, 0, 1, 0); + glTranslatef(0.28, 0, 0.45); + glRotatef(180, 1, 0, 0); + draw_escher_ant(ep, MaterialCyan); + glPopMatrix(); + } + ep->ant_position += 1; +} +#undef MoebiusDivisions +#undef MoebiusTransversals + +static void +draw_woodplank(escherstruct * ep) +{ + if (!ep->AreObjectsDefined[ObjWoodPlank]) { + glNewList(objects + ObjWoodPlank, GL_COMPILE_AND_EXECUTE); + glBegin(GL_QUADS); + glNormal3f(0, 0, 1); + glTexCoord2f(0, 0); + glVertex3f(-PlankWidth, -PlankHeight, PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(PlankWidth, -PlankHeight, PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(PlankWidth, PlankHeight, PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(-PlankWidth, PlankHeight, PlankThickness); + glNormal3f(0, 0, -1); + glTexCoord2f(0, 0); + glVertex3f(-PlankWidth, PlankHeight, -PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(PlankWidth, PlankHeight, -PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(PlankWidth, -PlankHeight, -PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness); + glNormal3f(0, 1, 0); + glTexCoord2f(0, 0); + glVertex3f(-PlankWidth, PlankHeight, PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(PlankWidth, PlankHeight, PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(PlankWidth, PlankHeight, -PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(-PlankWidth, PlankHeight, -PlankThickness); + glNormal3f(0, -1, 0); + glTexCoord2f(0, 0); + glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(PlankWidth, -PlankHeight, -PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(PlankWidth, -PlankHeight, PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(-PlankWidth, -PlankHeight, PlankThickness); + glNormal3f(1, 0, 0); + glTexCoord2f(0, 0); + glVertex3f(PlankWidth, -PlankHeight, PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(PlankWidth, -PlankHeight, -PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(PlankWidth, PlankHeight, -PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(PlankWidth, PlankHeight, PlankThickness); + glNormal3f(-1, 0, 0); + glTexCoord2f(0, 0); + glVertex3f(-PlankWidth, PlankHeight, PlankThickness); + glTexCoord2f(1, 0); + glVertex3f(-PlankWidth, PlankHeight, -PlankThickness); + glTexCoord2f(1, 1); + glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness); + glTexCoord2f(0, 1); + glVertex3f(-PlankWidth, -PlankHeight, PlankThickness); + glEnd(); + glEndList(); + ep->AreObjectsDefined[ObjWoodPlank] = 1; +#ifdef DEBUG_LISTS + (void) printf("WoodPlank drawn SLOWLY\n"); +#endif + } else { + glCallList(objects + ObjWoodPlank); +#ifdef DEBUG_LISTS + (void) printf("WoodPlank drawn quickly\n"); +#endif + } +} + +static void +draw_impossiblecage(escherstruct * ep) +{ + glPushMatrix(); + glRotatef(90, 0, 1, 0); + glTranslatef(0.0, PlankHeight - PlankWidth, -PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 0, 1); + glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - PlankThickness); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 1, 0); + glTranslatef(0.0, PlankWidth - PlankHeight, -PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0, PlankWidth - PlankHeight, 3 * PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 0, 1); + glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - PlankThickness); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - 3 * PlankThickness); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0, PlankHeight - PlankWidth, 3 * PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 0, 1); + glTranslatef(0.0, PlankHeight - PlankWidth, PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - 3 * PlankThickness); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 1, 0); + glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth + PlankThickness); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 0, 1); + glTranslatef(0.0, PlankWidth - PlankHeight, PlankThickness - PlankWidth); + draw_woodplank(ep); + glPopMatrix(); + glPushMatrix(); + glRotatef(90, 0, 1, 0); + glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth + PlankThickness); + draw_woodplank(ep); + glPopMatrix(); +} + +void +draw_escher(ModeInfo * mi) +{ + escherstruct *ep = &escher[MI_SCREEN(mi)]; + + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glXMakeCurrent(display, window, ep->glx_context); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glTranslatef(0.0, 0.0, -10.0); + + if (!MI_WIN_IS_ICONIC(mi)) { + glScalef(Scale4Window * ep->WindH / ep->WindW, Scale4Window, Scale4Window); + } else { + glScalef(Scale4Iconic * ep->WindH / ep->WindW, Scale4Iconic, Scale4Iconic); + } + + + switch (ep->scene) { + case 1: + glRotatef(ep->step * 100, 1, 0, 0); + glRotatef(ep->step * 95, 0, 1, 0); + glRotatef(ep->step * 90, 0, 0, 1); + draw_moebius(mi); + break; + case 2: /* 196 - 213 */ + glRotatef(ep->step * 100, 0, 0, 1); + glRotatef(25 + cos(ep->step * 5) * 6, 1, 0, 0); + glRotatef(204.5 - sin(ep->step * 5) * 8, 0, 1, 0); + draw_impossiblecage(ep); + break; + } + + glPopMatrix(); + + glFlush(); + + glXSwapBuffers(display, window); + + ep->step += 0.025; +} + +static void +reshape(ModeInfo * mi, int width, int height) +{ + escherstruct *ep = &escher[MI_SCREEN(mi)]; + + glViewport(0, 0, ep->WindW = (GLint) width, ep->WindH = (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); + glMatrixMode(GL_MODELVIEW); + if (width >= 1024) { + glLineWidth(3); + glPointSize(3); + } else if (width >= 512) { + glLineWidth(2); + glPointSize(2); + } else { + glLineWidth(1); + glPointSize(1); + } + ep->AreObjectsDefined[ObjMoebiusStrip] = 0; + ep->AreObjectsDefined[ObjAntBody] = 0; + ep->AreObjectsDefined[ObjWoodPlank] = 0; +} + +static void +pinit(ModeInfo * mi) +{ + escherstruct *ep = &escher[MI_SCREEN(mi)]; + + glClearDepth(1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_NORMALIZE); + glFrontFace(GL_CCW); + glCullFace(GL_BACK); + + switch (ep->scene) { + case 1: + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDisable(GL_TEXTURE_2D); + glDisable(GL_CULL_FACE); + break; + case 2: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + glShadeModel(GL_FLAT); + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + glEnable(GL_CULL_FACE); + break; + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + gluBuild2DMipmaps(GL_TEXTURE_2D, 3, WoodTextureWidth, WoodTextureHeight, + GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); +} + +void +init_escher(ModeInfo * mi) +{ + int screen = MI_SCREEN(mi); + escherstruct *ep; + + if (escher == NULL) { + if ((escher = (escherstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (escherstruct))) == NULL) + return; + } + ep = &escher[screen]; + ep->step = NRAND(90); + ep->ant_position = NRAND(90); + + ep->glx_context = init_GL(mi); + + reshape(mi, MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + ep->scene = MI_BATCHCOUNT(mi); + if (ep->scene <= 0 || ep->scene > NUM_SCENES) + ep->scene = NRAND(NUM_SCENES) + 1; + glDrawBuffer(GL_BACK); + objects = glGenLists(3); + pinit(mi); + +} + +void +change_escher(ModeInfo * mi) +{ + escherstruct *ep = &escher[MI_SCREEN(mi)]; + + ep->scene = (ep->scene) % NUM_SCENES + 1; + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), ep->glx_context); + pinit(mi); +} + +void +release_escher(ModeInfo * mi) +{ + if (escher != NULL) { + (void) free((void *) escher); + escher = NULL; + } + glDeleteLists(objects, 3); +} + +#endif diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c new file mode 100644 index 00000000..db13ab46 --- /dev/null +++ b/hacks/glx/gears.c @@ -0,0 +1,481 @@ +/* -*- Mode: C; tab-width: 4 -*- + * gears.c --- 3D gear wheels + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)gears.c 4.02 97/04/01 xlockmore"; +#endif +/* 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. + * + * Revision History: + * 22-Mar-97: Added support for -mono mode, and monochrome X servers. + * Ed Mackey, emackey@early.com + * 13-Mar-97: Memory leak fix by Tom Schmidt + * 1996: "written" by Danny Sung + * Based on 3-D gear wheels by Brian Paul which is in the public domain. + * + * Brian Paul + */ + +/*- + * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of + * the glCallList() functions below when using MesaGL 2.1. This has + * been fixed in MesaGL 2.2 and later releases. + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ + +#include + +#ifdef STANDALONE +# define PROGCLASS "Gears" +# define HACK_INIT init_gears +# define HACK_DRAW draw_gears +# define gears_opts xlockmore_opts +# define DEFAULTS "*count: 1 \n" \ + "*cycles: 2 \n" \ + "*delay: 100 \n" \ + "*wireframe: False \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +ModeSpecOpt gears_opts = { + 0, NULL, 0, NULL, NULL }; + +typedef struct { + GLfloat view_rotx, view_roty, view_rotz; + GLuint gear1, gear2, gear3; + GLfloat angle; + int mono; + GLXContext glx_context; +#if 0 + Window win; +#endif +} gearsstruct; + +static gearsstruct *gears = NULL; + +/* + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + * wire - true for wireframe mode + */ +static void +gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth, Bool wire) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + glShadeModel(GL_FLAT); + + /* This subroutine got kind of messy when I added all the checks + * for wireframe mode. A much cleaner solution that I sometimes + * use is to have a variable hold the value GL_LINE_LOOP when + * in wireframe mode, or hold the value GL_POLYGON otherwise. + * Then I just call glBegin(that_variable), give my polygon + * coordinates, and glEnd(). Pretty neat eh? Too bad I couldn't + * integrate that trick here. + * --Ed. + */ + + if (!wire) + glNormal3f(0.0, 0.0, 1.0); + + /* draw front face */ + if (!wire) + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + if (wire) + glBegin(GL_LINES); + angle = i * 2.0 * M_PI / teeth; + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + if (!wire) { + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + } else { + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), width * 0.5); + glEnd(); + } + } + if (!wire) + glEnd(); + + /* draw front sides of teeth */ + if (!wire) + glBegin(GL_QUADS); + da = 2.0 * M_PI / teeth / 4.0; + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + if (wire) + glBegin(GL_LINE_LOOP); + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + if (wire) + glEnd(); + } + if (!wire) + glEnd(); + + + if (!wire) + glNormal3f(0.0, 0.0, -1.0); + + /* draw back face */ + if (!wire) + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + if (wire) + glBegin(GL_LINES); + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + if (!wire) { + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + } else { + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); + glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), -width * 0.5); + glEnd(); + } + } + if (!wire) + glEnd(); + + /* draw back sides of teeth */ + if (!wire) + glBegin(GL_QUADS); + da = 2.0 * M_PI / teeth / 4.0; + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + if (wire) + glBegin(GL_LINE_LOOP); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + if (wire) + glEnd(); + } + if (!wire) + glEnd(); + + + /* draw outward faces of teeth */ + if (!wire) + glBegin(GL_QUAD_STRIP); + for (i = 0; i < teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + + if (wire) + glBegin(GL_LINES); + glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + u = r2 * cos(angle + da) - r1 * cos(angle); + v = r2 * sin(angle + da) - r1 * sin(angle); + len = sqrt(u * u + v * v); + u /= len; + v /= len; + glNormal3f(v, -u, 0.0); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); + glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); + glNormal3f(cos(angle), sin(angle), 0.0); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); + glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); + u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); + v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); + glNormal3f(v, -u, 0.0); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); + glNormal3f(cos(angle), sin(angle), 0.0); + if (wire) + glEnd(); + } + + if (!wire) { + glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); + glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); + glEnd(); + } + if (!wire) + glShadeModel(GL_SMOOTH); + + /* draw inside radius cylinder */ + if (!wire) + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= teeth; i++) { + angle = i * 2.0 * M_PI / teeth; + if (wire) + glBegin(GL_LINES); + glNormal3f(-cos(angle), -sin(angle), 0.0); + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + if (wire) { + glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + glVertex3f(r0 * cos(angle + 4 * da), r0 * sin(angle + 4 * da), -width * 0.5); + glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + glVertex3f(r0 * cos(angle + 4 * da), r0 * sin(angle + 4 * da), width * 0.5); + glEnd(); + } + } + if (!wire) + glEnd(); + +} + +static void +draw(ModeInfo * mi) +{ + gearsstruct *gp = &gears[MI_SCREEN(mi)]; + int wire = MI_WIN_IS_WIREFRAME(mi) || gp->mono; + + if (!wire) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } else { + glClear(GL_COLOR_BUFFER_BIT); + } + + glPushMatrix(); + glRotatef(gp->view_rotx, 1.0, 0.0, 0.0); + glRotatef(gp->view_roty, 0.0, 1.0, 0.0); + glRotatef(gp->view_rotz, 0.0, 0.0, 1.0); + + glPushMatrix(); + glTranslatef(-3.0, -2.0, 0.0); + glRotatef(gp->angle, 0.0, 0.0, 1.0); +/* PURIFY 4.0.1 reports an unitialized memory read on the next line when using + * MesaGL 2.2 and -mono. This has been fixed in MesaGL 2.3 and later. */ + glCallList(gp->gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(3.1, -2.0, 0.0); + glRotatef(-2.0 * gp->angle - 9.0, 0.0, 0.0, 1.0); + glCallList(gp->gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(-3.1, 4.2, 0.0); + glRotatef(-2.0 * gp->angle - 25.0, 0.0, 0.0, 1.0); + glCallList(gp->gear3); + glPopMatrix(); + + glPopMatrix(); +} + + + +/* new window size or exposure */ +static void +reshape(int width, int height) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + + glViewport(0, 0, (GLint) width, (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -40.0); + + /* The depth buffer will be cleared, if needed, before the + * next frame. Right now we just want to black the screen. + */ + glClear(GL_COLOR_BUFFER_BIT); + +} + + +static void +pinit(ModeInfo * mi) +{ + gearsstruct *gp = &gears[MI_SCREEN(mi)]; + static GLfloat pos[4] = + {5.0, 5.0, 10.0, 1.0}; + static GLfloat red[4] = + {0.8, 0.1, 0.0, 1.0}; + static GLfloat green[4] = + {0.0, 0.8, 0.2, 1.0}; + static GLfloat blue[4] = + {0.2, 0.2, 1.0, 1.0}; + int wire = MI_WIN_IS_WIREFRAME(mi) || gp->mono; + + if (!wire) { + glLightfv(GL_LIGHT0, GL_POSITION, pos); + glEnable(GL_CULL_FACE); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + } +#if 0 +/*- + * Messes up on multiscreen Pseudocolor:0 StaticGray(monochrome):1 + * 2nd time mode is run it is Grayscale on PseudoColor. + * The code below forces monochrome on TrueColor. + */ + if (MI_WIN_IS_MONO(mi)) { + red[0] = red[1] = red[2] = 1.0; + green[0] = green[1] = green[2] = 1.0; + blue[0] = blue[1] = blue[2] = 1.0; + } +#endif + + /* make the gears */ + gp->gear1 = glGenLists(1); + glNewList(gp->gear1, GL_COMPILE); + if (!wire) + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); + else + glColor4fv(red); + gear(1.0, 4.0, 1.0, 20, 0.7, wire); + glEndList(); + + gp->gear2 = glGenLists(1); + glNewList(gp->gear2, GL_COMPILE); + if (!wire) + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); + else + glColor4fv(green); + gear(0.5, 2.0, 2.0, 10, 0.7, wire); + glEndList(); + + gp->gear3 = glGenLists(1); + glNewList(gp->gear3, GL_COMPILE); + if (!wire) + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); + else + glColor4fv(blue); + gear(1.3, 2.0, 0.5, 10, 0.7, wire); + glEndList(); + if (!wire) + glEnable(GL_NORMALIZE); +} + +void +init_gears(ModeInfo * mi) +{ +#if 0 + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + +#endif + int screen = MI_SCREEN(mi); + + /*Colormap cmap; */ + /* Boolean rgba, doublebuffer, cmap_installed; */ + gearsstruct *gp; + + if (gears == NULL) { + if ((gears = (gearsstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (gearsstruct))) == NULL) + return; + } + gp = &gears[screen]; + +#if 0 + gp->win = window; +#endif + gp->view_rotx = NRAND(360); + gp->view_roty = NRAND(360); + gp->view_rotz = NRAND(360); + gp->angle = NRAND(360); + gp->mono = (MI_WIN_IS_MONO(mi) ? 1 : 0); + + gp->glx_context = init_GL(mi); + + reshape(MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + pinit(mi); +} + +void +draw_gears(ModeInfo * mi) +{ + gearsstruct *gp = &gears[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + int angle_incr = MI_CYCLES(mi) ? MI_CYCLES(mi) : 2; + int rot_incr = MI_BATCHCOUNT(mi) ? MI_BATCHCOUNT(mi) : 1; + + glDrawBuffer(GL_BACK); + + glXMakeCurrent(display, window, gp->glx_context); + draw(mi); + + /* let's do something so we don't get bored */ + gp->angle = (int) (gp->angle + angle_incr) % 360; + gp->view_rotx = (int) (gp->view_rotx + rot_incr) % 360; + gp->view_roty = (int) (gp->view_roty + rot_incr) % 360; + gp->view_rotz = (int) (gp->view_rotz + rot_incr) % 360; + + glFinish(); + glXSwapBuffers(display, window); +} + +void +release_gears(ModeInfo * mi) +{ + if (gears != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + gearsstruct *gp = &gears[screen]; + + /* Display lists MUST be freed while their glXContext is current. */ + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), gp->glx_context); + + if (glIsList(gp->gear1)) + glDeleteLists(gp->gear1, 1); + if (glIsList(gp->gear2)) + glDeleteLists(gp->gear2, 1); + if (glIsList(gp->gear3)) + glDeleteLists(gp->gear3, 1); + + /* Don't destroy the glXContext. init_GL does that. */ + + } + (void) free((void *) gears); + gears = NULL; + } +} + + +/*********************************************************/ + +#endif diff --git a/hacks/glx/morph3d.c b/hacks/glx/morph3d.c new file mode 100644 index 00000000..99316b07 --- /dev/null +++ b/hacks/glx/morph3d.c @@ -0,0 +1,860 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)morph3d.c 4.02 97/04/01 xlockmore"; + +#endif + +#undef DEBUG_CULL_FACE + +/*- + * morph3d.c - Shows 3D morphing objects (XLock Version) + * + * See xlock.c for copying information. + * + * The original code for this mode was written by Marcelo Fernandes Vianna + * (me...) and was inspired on a WindowsNT(R)'s screen saver. It was written + * from scratch and it was not based on any other source code. + * + * Porting it to xlock (the final objective of this code since the moment I + * decided to create it) was possible by comparing the original Mesa's gear + * demo with it's ported version to xlock, so thanks for Danny Sung (look at + * gear.c) for his indirect help. + * + * Thanks goes also to Brian Paul for making it possible and inexpensive + * to use OpenGL at home. + * + * If you are interested in the original version of this program (not a xlock + * mode, please refer to the Mesa package (ftp iris.ssec.wisc.edu on /pub/Mesa) + * + * Since I'm not a native english speaker, my apologies for any gramatical + * mistake. + * + * My e-mail addresses are + * vianna@cat.cbpf.br + * and + * marcelo@venus.rdc.puc-rio.br + * + * Marcelo F. Vianna (Feb-13-1997) + * + * Revision History: + * 27-Jul-97: Speed ups by Marcelo F. Vianna. + * 08-May-97: Speed ups by Marcelo F. Vianna. + * + */ + +/*- + * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of + * the glCallList() functions below when using MesaGL 2.1. This has + * been fixed in MesaGL 2.2 and later releases. + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ + +#include + +#ifdef STANDALONE +# define PROGCLASS "Morph3d" +# define HACK_INIT init_morph3d +# define HACK_DRAW draw_morph3d +# define morph3d_opts xlockmore_opts +# define DEFAULTS "*delay: 1000 \n" \ + "*count: 0 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +ModeSpecOpt morph3d_opts = +{0, NULL, 0, NULL, NULL}; + +#define Scale4Window 0.3 +#define Scale4Iconic 1.0 + +#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2) +#define sqr(A) ((A)*(A)) + +/* Increasing this values produces better image quality, the price is speed. */ +#define tetradivisions 23 +#define cubedivisions 20 +#define octadivisions 21 +#define dodecadivisions 10 +#define icodivisions 15 + +#define tetraangle 109.47122063449069174 +#define cubeangle 90.000000000000000000 +#define octaangle 109.47122063449069174 +#define dodecaangle 63.434948822922009981 +#define icoangle 41.810314895778596167 + +#ifndef Pi +#define Pi M_PI +#endif +#define SQRT2 1.4142135623730951455 +#define SQRT3 1.7320508075688771932 +#define SQRT5 2.2360679774997898051 +#define SQRT6 2.4494897427831778813 +#define SQRT15 3.8729833462074170214 +#define cossec36_2 0.8506508083520399322 +#define cos72 0.3090169943749474241 +#define sin72 0.9510565162951535721 +#define cos36 0.8090169943749474241 +#define sin36 0.5877852522924731292 + +/*************************************************************************/ + +typedef struct { + GLint WindH, WindW; + GLfloat step; + GLfloat seno; + int object; + int edgedivisions; + int VisibleSpikes; + void (*draw_object) (ModeInfo * mi); + float Magnitude; + float *MaterialColor[20]; + GLXContext glx_context; +} morph3dstruct; + +static float front_shininess[] = +{60.0}; +static float front_specular[] = +{0.7, 0.7, 0.7, 1.0}; +static float ambient[] = +{0.0, 0.0, 0.0, 1.0}; +static float diffuse[] = +{1.0, 1.0, 1.0, 1.0}; +static float position0[] = +{1.0, 1.0, 1.0, 0.0}; +static float position1[] = +{-1.0, -1.0, 1.0, 0.0}; +static float lmodel_ambient[] = +{0.5, 0.5, 0.5, 1.0}; +static float lmodel_twoside[] = +{GL_TRUE}; + +static float MaterialRed[] = +{0.7, 0.0, 0.0, 1.0}; +static float MaterialGreen[] = +{0.1, 0.5, 0.2, 1.0}; +static float MaterialBlue[] = +{0.0, 0.0, 0.7, 1.0}; +static float MaterialCyan[] = +{0.2, 0.5, 0.7, 1.0}; +static float MaterialYellow[] = +{0.7, 0.7, 0.0, 1.0}; +static float MaterialMagenta[] = +{0.6, 0.2, 0.5, 1.0}; +static float MaterialWhite[] = +{0.7, 0.7, 0.7, 1.0}; +static float MaterialGray[] = +{0.2, 0.2, 0.2, 1.0}; + +static morph3dstruct *morph3d = NULL; + +#define TRIANGLE(Edge, Amp, Divisions, Z, VS) \ +{ \ + GLfloat Xf,Yf,Xa,Yb,Xf2,Yf2,Yf_2,Yb2,Yb_2; \ + GLfloat Factor=0.0,Factor1,Factor2; \ + GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \ + GLfloat Ax,Ay; \ + int Ri,Ti; \ + GLfloat Vr=(Edge)*SQRT3/3; \ + GLfloat AmpVr2=(Amp)/sqr(Vr); \ + GLfloat Zf=(Edge)*(Z); \ + \ + Ax=(Edge)*(+0.5/(Divisions)), Ay=(Edge)*(-SQRT3/(2*Divisions)); \ + \ + Yf=Vr+Ay; Yb=Yf+0.001; \ + for (Ri=1; Ri<=(Divisions); Ri++) { \ + glBegin(GL_TRIANGLE_STRIP); \ + Xf=(float)Ri*Ax; Xa=Xf+0.001; \ + Yf2=sqr(Yf); Yf_2=sqr(Yf-Ay); \ + Yb2=sqr(Yb); Yb_2=sqr(Yb-Ay); \ + for (Ti=0; TiMaterialColor[0]); + + list = glGenLists(1); + glNewList(list, GL_COMPILE_AND_EXECUTE); + TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes); + glEndList(); + + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-tetraangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + tetraangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + tetraangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]); + glCallList(list); + + glDeleteLists(list, 1); +} + +static void +draw_cube(ModeInfo * mi) +{ + GLuint list; + + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]); + + list = glGenLists(1); + glNewList(list, GL_COMPILE_AND_EXECUTE); + SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes) + glEndList(); + + glRotatef(cubeangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]); + glCallList(list); + glRotatef(cubeangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]); + glCallList(list); + glRotatef(cubeangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]); + glCallList(list); + glRotatef(cubeangle, 0, 1, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]); + glCallList(list); + glRotatef(2 * cubeangle, 0, 1, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]); + glCallList(list); + + glDeleteLists(list, 1); +} + +static void +draw_octa(ModeInfo * mi) +{ + GLuint list; + + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]); + + list = glGenLists(1); + glNewList(list, GL_COMPILE_AND_EXECUTE); + TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes); + glEndList(); + + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-180 + octaangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-octaangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-180 + octaangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-octaangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]); + glCallList(list); + + glDeleteLists(list, 1); +} + +static void +draw_dodeca(ModeInfo * mi) +{ + GLuint list; + + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + +#define TAU ((SQRT5+1)/2) + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]); + + list = glGenLists(1); + glNewList(list, GL_COMPILE_AND_EXECUTE); + PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes); + glEndList(); + + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glPushMatrix(); + glRotatef(-dodecaangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(-dodecaangle, cos72, sin72, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(-dodecaangle, cos72, -sin72, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(dodecaangle, cos36, -sin36, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]); + glCallList(list); + glPopMatrix(); + glRotatef(dodecaangle, cos36, sin36, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]); + glCallList(list); + glRotatef(180, 0, 0, 1); + glPushMatrix(); + glRotatef(-dodecaangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(-dodecaangle, cos72, sin72, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(-dodecaangle, cos72, -sin72, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(dodecaangle, cos36, -sin36, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]); + glCallList(list); + glPopMatrix(); + glRotatef(dodecaangle, cos36, sin36, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]); + glCallList(list); + + glDeleteLists(list, 1); +} + +static void +draw_icosa(ModeInfo * mi) +{ + GLuint list; + + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]); + + list = glGenLists(1); + glNewList(list, GL_COMPILE_AND_EXECUTE); + TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes); + glEndList(); + + glPushMatrix(); + + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[12]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[13]); + glCallList(list); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[14]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[15]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[16]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[17]); + glCallList(list); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[18]); + glCallList(list); + glPopMatrix(); + glRotatef(180, 0, 0, 1); + glRotatef(-icoangle, 1, 0, 0); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[19]); + glCallList(list); + + glDeleteLists(list, 1); +} + +void +draw_morph3d(ModeInfo * mi) +{ + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glDrawBuffer(GL_BACK); + glXMakeCurrent(display, window, mp->glx_context); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glTranslatef(0.0, 0.0, -10.0); + + if (!MI_WIN_IS_ICONIC(mi)) { + glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window); + glTranslatef(2.5 * mp->WindW / mp->WindH * sin(mp->step * 1.11), 2.5 * cos(mp->step * 1.25 * 1.11), 0); + } else { + glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic); + } + + glRotatef(mp->step * 100, 1, 0, 0); + glRotatef(mp->step * 95, 0, 1, 0); + glRotatef(mp->step * 90, 0, 0, 1); + + mp->seno = (sin(mp->step) + 1.0 / 3.0) * (4.0 / 5.0) * mp->Magnitude; + + if (mp->VisibleSpikes) { +#ifdef DEBUG_CULL_FACE + int loop; + + for (loop = 0; loop < 20; loop++) + mp->MaterialColor[loop] = MaterialGray; +#endif + glDisable(GL_CULL_FACE); + } else { +#ifdef DEBUG_CULL_FACE + int loop; + + for (loop = 0; loop < 20; loop++) + mp->MaterialColor[loop] = MaterialWhite; +#endif + glEnable(GL_CULL_FACE); + } + + mp->draw_object(mi); + + glPopMatrix(); + + glFlush(); + + glXSwapBuffers(display, window); + + mp->step += 0.05; +} + +static void +reshape(ModeInfo * mi, int width, int height) +{ + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); + glMatrixMode(GL_MODELVIEW); +} + +static void +pinit(ModeInfo * mi) +{ + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + glClearDepth(1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); + glColor3f(1.0, 1.0, 1.0); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + + glShadeModel(GL_SMOOTH); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); + + switch (mp->object) { + case 2: + mp->draw_object = draw_cube; + mp->MaterialColor[0] = MaterialRed; + mp->MaterialColor[1] = MaterialGreen; + mp->MaterialColor[2] = MaterialCyan; + mp->MaterialColor[3] = MaterialMagenta; + mp->MaterialColor[4] = MaterialYellow; + mp->MaterialColor[5] = MaterialBlue; + mp->edgedivisions = cubedivisions; + mp->Magnitude = 2.0; + break; + case 3: + mp->draw_object = draw_octa; + mp->MaterialColor[0] = MaterialRed; + mp->MaterialColor[1] = MaterialGreen; + mp->MaterialColor[2] = MaterialBlue; + mp->MaterialColor[3] = MaterialWhite; + mp->MaterialColor[4] = MaterialCyan; + mp->MaterialColor[5] = MaterialMagenta; + mp->MaterialColor[6] = MaterialGray; + mp->MaterialColor[7] = MaterialYellow; + mp->edgedivisions = octadivisions; + mp->Magnitude = 2.5; + break; + case 4: + mp->draw_object = draw_dodeca; + mp->MaterialColor[0] = MaterialRed; + mp->MaterialColor[1] = MaterialGreen; + mp->MaterialColor[2] = MaterialCyan; + mp->MaterialColor[3] = MaterialBlue; + mp->MaterialColor[4] = MaterialMagenta; + mp->MaterialColor[5] = MaterialYellow; + mp->MaterialColor[6] = MaterialGreen; + mp->MaterialColor[7] = MaterialCyan; + mp->MaterialColor[8] = MaterialRed; + mp->MaterialColor[9] = MaterialMagenta; + mp->MaterialColor[10] = MaterialBlue; + mp->MaterialColor[11] = MaterialYellow; + mp->edgedivisions = dodecadivisions; + mp->Magnitude = 2.0; + break; + case 5: + mp->draw_object = draw_icosa; + mp->MaterialColor[0] = MaterialRed; + mp->MaterialColor[1] = MaterialGreen; + mp->MaterialColor[2] = MaterialBlue; + mp->MaterialColor[3] = MaterialCyan; + mp->MaterialColor[4] = MaterialYellow; + mp->MaterialColor[5] = MaterialMagenta; + mp->MaterialColor[6] = MaterialRed; + mp->MaterialColor[7] = MaterialGreen; + mp->MaterialColor[8] = MaterialBlue; + mp->MaterialColor[9] = MaterialWhite; + mp->MaterialColor[10] = MaterialCyan; + mp->MaterialColor[11] = MaterialYellow; + mp->MaterialColor[12] = MaterialMagenta; + mp->MaterialColor[13] = MaterialRed; + mp->MaterialColor[14] = MaterialGreen; + mp->MaterialColor[15] = MaterialBlue; + mp->MaterialColor[16] = MaterialCyan; + mp->MaterialColor[17] = MaterialYellow; + mp->MaterialColor[18] = MaterialMagenta; + mp->MaterialColor[19] = MaterialGray; + mp->edgedivisions = icodivisions; + mp->Magnitude = 2.5; + break; + default: + mp->draw_object = draw_tetra; + mp->MaterialColor[0] = MaterialRed; + mp->MaterialColor[1] = MaterialGreen; + mp->MaterialColor[2] = MaterialBlue; + mp->MaterialColor[3] = MaterialWhite; + mp->edgedivisions = tetradivisions; + mp->Magnitude = 2.5; + break; + } + if (MI_WIN_IS_MONO(mi)) { + int loop; + + for (loop = 0; loop < 20; loop++) + mp->MaterialColor[loop] = MaterialGray; + } +} + +void +init_morph3d(ModeInfo * mi) +{ + int screen = MI_SCREEN(mi); + morph3dstruct *mp; + + if (morph3d == NULL) { + if ((morph3d = (morph3dstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (morph3dstruct))) == NULL) + return; + } + mp = &morph3d[screen]; + mp->step = NRAND(90); + mp->VisibleSpikes = 1; + + mp->glx_context = init_GL(mi); + + reshape(mi, MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + mp->object = MI_BATCHCOUNT(mi); + if (mp->object <= 0 || mp->object > 5) + mp->object = NRAND(5) + 1; + pinit(mi); +} + +void +change_morph3d(ModeInfo * mi) +{ + morph3dstruct *mp = &morph3d[MI_SCREEN(mi)]; + + mp->object = (mp->object) % 5 + 1; + pinit(mi); +} + +void +release_morph3d(ModeInfo * mi) +{ + if (morph3d != NULL) { + (void) free((void *) morph3d); + morph3d = NULL; + } +} + +#endif diff --git a/hacks/glx/pipeobjs.c b/hacks/glx/pipeobjs.c new file mode 100644 index 00000000..28d9e6a2 --- /dev/null +++ b/hacks/glx/pipeobjs.c @@ -0,0 +1,3267 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)pipeobjs.c 4.2 97/04/27 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render objects for pipes. + * + * Generated by lw2ogl. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat BigValve_PNTS[] = +{ + (GLfloat) 0.756788, (GLfloat) 0.614672, (GLfloat) - 0.000000, + (GLfloat) 0.779498, (GLfloat) 0.599497, (GLfloat) - 0.000000, + (GLfloat) 0.794672, (GLfloat) 0.576788, (GLfloat) - 0.000000, + (GLfloat) 0.800000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.794672, (GLfloat) 0.523212, (GLfloat) - 0.000000, + (GLfloat) 0.779498, (GLfloat) 0.500503, (GLfloat) - 0.000000, + (GLfloat) 0.756788, (GLfloat) 0.485328, (GLfloat) - 0.000000, + (GLfloat) 0.730000, (GLfloat) 0.480000, (GLfloat) - 0.000000, + (GLfloat) 0.703212, (GLfloat) 0.485328, (GLfloat) - 0.000000, + (GLfloat) 0.680503, (GLfloat) 0.500503, (GLfloat) - 0.000000, + (GLfloat) 0.665328, (GLfloat) 0.523212, (GLfloat) - 0.000000, + (GLfloat) 0.660000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.665328, (GLfloat) 0.576788, (GLfloat) - 0.000000, + (GLfloat) 0.680503, (GLfloat) 0.599497, (GLfloat) - 0.000000, + (GLfloat) 0.703212, (GLfloat) 0.614672, (GLfloat) - 0.000000, + (GLfloat) 0.730000, (GLfloat) 0.620000, (GLfloat) - 0.000000, + (GLfloat) 0.756788, (GLfloat) 0.602861, (GLfloat) 0.119916, + (GLfloat) 0.779498, (GLfloat) 0.587978, (GLfloat) 0.116956, + (GLfloat) 0.794672, (GLfloat) 0.565705, (GLfloat) 0.112526, + (GLfloat) 0.800000, (GLfloat) 0.539432, (GLfloat) 0.107300, + (GLfloat) 0.794672, (GLfloat) 0.513159, (GLfloat) 0.102074, + (GLfloat) 0.779498, (GLfloat) 0.490886, (GLfloat) 0.097643, + (GLfloat) 0.756788, (GLfloat) 0.476003, (GLfloat) 0.094683, + (GLfloat) 0.730000, (GLfloat) 0.470777, (GLfloat) 0.093643, + (GLfloat) 0.703212, (GLfloat) 0.476003, (GLfloat) 0.094683, + (GLfloat) 0.680503, (GLfloat) 0.490886, (GLfloat) 0.097643, + (GLfloat) 0.665328, (GLfloat) 0.513159, (GLfloat) 0.102074, + (GLfloat) 0.660000, (GLfloat) 0.539432, (GLfloat) 0.107300, + (GLfloat) 0.665328, (GLfloat) 0.565705, (GLfloat) 0.112526, + (GLfloat) 0.680503, (GLfloat) 0.587978, (GLfloat) 0.116956, + (GLfloat) 0.703212, (GLfloat) 0.602861, (GLfloat) 0.119916, + (GLfloat) 0.730000, (GLfloat) 0.608087, (GLfloat) 0.120956, + (GLfloat) 0.756788, (GLfloat) 0.567882, (GLfloat) 0.235225, + (GLfloat) 0.779498, (GLfloat) 0.553863, (GLfloat) 0.229418, + (GLfloat) 0.794672, (GLfloat) 0.532882, (GLfloat) 0.220727, + (GLfloat) 0.800000, (GLfloat) 0.508134, (GLfloat) 0.210476, + (GLfloat) 0.794672, (GLfloat) 0.483385, (GLfloat) 0.200225, + (GLfloat) 0.779498, (GLfloat) 0.462404, (GLfloat) 0.191534, + (GLfloat) 0.756788, (GLfloat) 0.448385, (GLfloat) 0.185727, + (GLfloat) 0.730000, (GLfloat) 0.443462, (GLfloat) 0.183688, + (GLfloat) 0.703212, (GLfloat) 0.448385, (GLfloat) 0.185727, + (GLfloat) 0.680503, (GLfloat) 0.462404, (GLfloat) 0.191534, + (GLfloat) 0.665328, (GLfloat) 0.483385, (GLfloat) 0.200225, + (GLfloat) 0.660000, (GLfloat) 0.508134, (GLfloat) 0.210476, + (GLfloat) 0.665328, (GLfloat) 0.532882, (GLfloat) 0.220727, + (GLfloat) 0.680503, (GLfloat) 0.553863, (GLfloat) 0.229418, + (GLfloat) 0.703212, (GLfloat) 0.567882, (GLfloat) 0.235225, + (GLfloat) 0.730000, (GLfloat) 0.572805, (GLfloat) 0.237264, + (GLfloat) 0.756788, (GLfloat) 0.511081, (GLfloat) 0.341493, + (GLfloat) 0.779498, (GLfloat) 0.498464, (GLfloat) 0.333063, + (GLfloat) 0.794672, (GLfloat) 0.479582, (GLfloat) 0.320446, + (GLfloat) 0.800000, (GLfloat) 0.457308, (GLfloat) 0.305564, + (GLfloat) 0.794672, (GLfloat) 0.435035, (GLfloat) 0.290681, + (GLfloat) 0.779498, (GLfloat) 0.416153, (GLfloat) 0.278064, + (GLfloat) 0.756788, (GLfloat) 0.403536, (GLfloat) 0.269634, + (GLfloat) 0.730000, (GLfloat) 0.399105, (GLfloat) 0.266674, + (GLfloat) 0.703212, (GLfloat) 0.403536, (GLfloat) 0.269634, + (GLfloat) 0.680503, (GLfloat) 0.416153, (GLfloat) 0.278064, + (GLfloat) 0.665328, (GLfloat) 0.435035, (GLfloat) 0.290681, + (GLfloat) 0.660000, (GLfloat) 0.457308, (GLfloat) 0.305564, + (GLfloat) 0.665328, (GLfloat) 0.479582, (GLfloat) 0.320446, + (GLfloat) 0.680503, (GLfloat) 0.498464, (GLfloat) 0.333063, + (GLfloat) 0.703212, (GLfloat) 0.511081, (GLfloat) 0.341493, + (GLfloat) 0.730000, (GLfloat) 0.515511, (GLfloat) 0.344454, + (GLfloat) 0.756788, (GLfloat) 0.434638, (GLfloat) 0.434638, + (GLfloat) 0.779498, (GLfloat) 0.423909, (GLfloat) 0.423909, + (GLfloat) 0.794672, (GLfloat) 0.407851, (GLfloat) 0.407851, + (GLfloat) 0.800000, (GLfloat) 0.388909, (GLfloat) 0.388909, + (GLfloat) 0.794672, (GLfloat) 0.369967, (GLfloat) 0.369967, + (GLfloat) 0.779498, (GLfloat) 0.353909, (GLfloat) 0.353909, + (GLfloat) 0.756788, (GLfloat) 0.343179, (GLfloat) 0.343179, + (GLfloat) 0.730000, (GLfloat) 0.339411, (GLfloat) 0.339411, + (GLfloat) 0.703212, (GLfloat) 0.343179, (GLfloat) 0.343179, + (GLfloat) 0.680503, (GLfloat) 0.353909, (GLfloat) 0.353909, + (GLfloat) 0.665328, (GLfloat) 0.369967, (GLfloat) 0.369967, + (GLfloat) 0.660000, (GLfloat) 0.388909, (GLfloat) 0.388909, + (GLfloat) 0.665328, (GLfloat) 0.407851, (GLfloat) 0.407851, + (GLfloat) 0.680503, (GLfloat) 0.423909, (GLfloat) 0.423909, + (GLfloat) 0.703212, (GLfloat) 0.434638, (GLfloat) 0.434638, + (GLfloat) 0.730000, (GLfloat) 0.438406, (GLfloat) 0.438406, + (GLfloat) 0.756788, (GLfloat) 0.341493, (GLfloat) 0.511081, + (GLfloat) 0.779498, (GLfloat) 0.333063, (GLfloat) 0.498464, + (GLfloat) 0.794672, (GLfloat) 0.320446, (GLfloat) 0.479582, + (GLfloat) 0.800000, (GLfloat) 0.305564, (GLfloat) 0.457308, + (GLfloat) 0.794672, (GLfloat) 0.290681, (GLfloat) 0.435035, + (GLfloat) 0.779498, (GLfloat) 0.278064, (GLfloat) 0.416153, + (GLfloat) 0.756788, (GLfloat) 0.269634, (GLfloat) 0.403536, + (GLfloat) 0.730000, (GLfloat) 0.266674, (GLfloat) 0.399105, + (GLfloat) 0.703212, (GLfloat) 0.269634, (GLfloat) 0.403536, + (GLfloat) 0.680503, (GLfloat) 0.278064, (GLfloat) 0.416153, + (GLfloat) 0.665328, (GLfloat) 0.290681, (GLfloat) 0.435035, + (GLfloat) 0.660000, (GLfloat) 0.305564, (GLfloat) 0.457308, + (GLfloat) 0.665328, (GLfloat) 0.320446, (GLfloat) 0.479582, + (GLfloat) 0.680503, (GLfloat) 0.333063, (GLfloat) 0.498464, + (GLfloat) 0.703212, (GLfloat) 0.341493, (GLfloat) 0.511081, + (GLfloat) 0.730000, (GLfloat) 0.344454, (GLfloat) 0.515511, + (GLfloat) 0.756788, (GLfloat) 0.235225, (GLfloat) 0.567882, + (GLfloat) 0.779498, (GLfloat) 0.229418, (GLfloat) 0.553863, + (GLfloat) 0.794672, (GLfloat) 0.220727, (GLfloat) 0.532882, + (GLfloat) 0.800000, (GLfloat) 0.210476, (GLfloat) 0.508134, + (GLfloat) 0.794672, (GLfloat) 0.200225, (GLfloat) 0.483385, + (GLfloat) 0.779498, (GLfloat) 0.191534, (GLfloat) 0.462404, + (GLfloat) 0.756788, (GLfloat) 0.185727, (GLfloat) 0.448385, + (GLfloat) 0.730000, (GLfloat) 0.183688, (GLfloat) 0.443462, + (GLfloat) 0.703212, (GLfloat) 0.185727, (GLfloat) 0.448385, + (GLfloat) 0.680503, (GLfloat) 0.191534, (GLfloat) 0.462404, + (GLfloat) 0.665328, (GLfloat) 0.200225, (GLfloat) 0.483385, + (GLfloat) 0.660000, (GLfloat) 0.210476, (GLfloat) 0.508134, + (GLfloat) 0.665328, (GLfloat) 0.220727, (GLfloat) 0.532882, + (GLfloat) 0.680503, (GLfloat) 0.229418, (GLfloat) 0.553863, + (GLfloat) 0.703212, (GLfloat) 0.235225, (GLfloat) 0.567882, + (GLfloat) 0.730000, (GLfloat) 0.237264, (GLfloat) 0.572805, + (GLfloat) 0.756788, (GLfloat) 0.119916, (GLfloat) 0.602861, + (GLfloat) 0.779498, (GLfloat) 0.116956, (GLfloat) 0.587978, + (GLfloat) 0.794672, (GLfloat) 0.112526, (GLfloat) 0.565705, + (GLfloat) 0.800000, (GLfloat) 0.107300, (GLfloat) 0.539432, + (GLfloat) 0.794672, (GLfloat) 0.102074, (GLfloat) 0.513159, + (GLfloat) 0.779498, (GLfloat) 0.097643, (GLfloat) 0.490886, + (GLfloat) 0.756788, (GLfloat) 0.094683, (GLfloat) 0.476003, + (GLfloat) 0.730000, (GLfloat) 0.093643, (GLfloat) 0.470777, + (GLfloat) 0.703212, (GLfloat) 0.094683, (GLfloat) 0.476003, + (GLfloat) 0.680503, (GLfloat) 0.097643, (GLfloat) 0.490886, + (GLfloat) 0.665328, (GLfloat) 0.102074, (GLfloat) 0.513159, + (GLfloat) 0.660000, (GLfloat) 0.107300, (GLfloat) 0.539432, + (GLfloat) 0.665328, (GLfloat) 0.112526, (GLfloat) 0.565705, + (GLfloat) 0.680503, (GLfloat) 0.116956, (GLfloat) 0.587978, + (GLfloat) 0.703212, (GLfloat) 0.119916, (GLfloat) 0.602861, + (GLfloat) 0.730000, (GLfloat) 0.120956, (GLfloat) 0.608087, + (GLfloat) 0.756788, (GLfloat) 0.000000, (GLfloat) 0.614672, + (GLfloat) 0.779498, (GLfloat) 0.000000, (GLfloat) 0.599497, + (GLfloat) 0.794672, (GLfloat) 0.000000, (GLfloat) 0.576788, + (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) 0.550000, + (GLfloat) 0.794672, (GLfloat) 0.000000, (GLfloat) 0.523212, + (GLfloat) 0.779498, (GLfloat) 0.000000, (GLfloat) 0.500503, + (GLfloat) 0.756788, (GLfloat) 0.000000, (GLfloat) 0.485328, + (GLfloat) 0.730000, (GLfloat) 0.000000, (GLfloat) 0.480000, + (GLfloat) 0.703212, (GLfloat) 0.000000, (GLfloat) 0.485328, + (GLfloat) 0.680503, (GLfloat) 0.000000, (GLfloat) 0.500503, + (GLfloat) 0.665328, (GLfloat) 0.000000, (GLfloat) 0.523212, + (GLfloat) 0.660000, (GLfloat) 0.000000, (GLfloat) 0.550000, + (GLfloat) 0.665328, (GLfloat) 0.000000, (GLfloat) 0.576788, + (GLfloat) 0.680503, (GLfloat) 0.000000, (GLfloat) 0.599497, + (GLfloat) 0.703212, (GLfloat) 0.000000, (GLfloat) 0.614672, + (GLfloat) 0.730000, (GLfloat) 0.000000, (GLfloat) 0.620000, + (GLfloat) 0.756788, (GLfloat) - 0.119916, (GLfloat) 0.602861, + (GLfloat) 0.779498, (GLfloat) - 0.116956, (GLfloat) 0.587978, + (GLfloat) 0.794672, (GLfloat) - 0.112526, (GLfloat) 0.565705, + (GLfloat) 0.800000, (GLfloat) - 0.107300, (GLfloat) 0.539432, + (GLfloat) 0.794672, (GLfloat) - 0.102074, (GLfloat) 0.513159, + (GLfloat) 0.779498, (GLfloat) - 0.097643, (GLfloat) 0.490886, + (GLfloat) 0.756788, (GLfloat) - 0.094683, (GLfloat) 0.476003, + (GLfloat) 0.730000, (GLfloat) - 0.093643, (GLfloat) 0.470777, + (GLfloat) 0.703212, (GLfloat) - 0.094683, (GLfloat) 0.476003, + (GLfloat) 0.680503, (GLfloat) - 0.097643, (GLfloat) 0.490886, + (GLfloat) 0.665328, (GLfloat) - 0.102074, (GLfloat) 0.513159, + (GLfloat) 0.660000, (GLfloat) - 0.107300, (GLfloat) 0.539432, + (GLfloat) 0.665328, (GLfloat) - 0.112526, (GLfloat) 0.565705, + (GLfloat) 0.680503, (GLfloat) - 0.116956, (GLfloat) 0.587978, + (GLfloat) 0.703212, (GLfloat) - 0.119916, (GLfloat) 0.602861, + (GLfloat) 0.730000, (GLfloat) - 0.120956, (GLfloat) 0.608087, + (GLfloat) 0.756788, (GLfloat) - 0.235225, (GLfloat) 0.567882, + (GLfloat) 0.779498, (GLfloat) - 0.229418, (GLfloat) 0.553863, + (GLfloat) 0.794672, (GLfloat) - 0.220727, (GLfloat) 0.532882, + (GLfloat) 0.800000, (GLfloat) - 0.210476, (GLfloat) 0.508134, + (GLfloat) 0.794672, (GLfloat) - 0.200225, (GLfloat) 0.483385, + (GLfloat) 0.779498, (GLfloat) - 0.191534, (GLfloat) 0.462404, + (GLfloat) 0.756788, (GLfloat) - 0.185727, (GLfloat) 0.448385, + (GLfloat) 0.730000, (GLfloat) - 0.183688, (GLfloat) 0.443462, + (GLfloat) 0.703212, (GLfloat) - 0.185727, (GLfloat) 0.448385, + (GLfloat) 0.680503, (GLfloat) - 0.191534, (GLfloat) 0.462404, + (GLfloat) 0.665328, (GLfloat) - 0.200225, (GLfloat) 0.483385, + (GLfloat) 0.660000, (GLfloat) - 0.210476, (GLfloat) 0.508134, + (GLfloat) 0.665328, (GLfloat) - 0.220727, (GLfloat) 0.532882, + (GLfloat) 0.680503, (GLfloat) - 0.229418, (GLfloat) 0.553863, + (GLfloat) 0.703212, (GLfloat) - 0.235225, (GLfloat) 0.567882, + (GLfloat) 0.730000, (GLfloat) - 0.237264, (GLfloat) 0.572805, + (GLfloat) 0.756788, (GLfloat) - 0.341493, (GLfloat) 0.511081, + (GLfloat) 0.779498, (GLfloat) - 0.333063, (GLfloat) 0.498464, + (GLfloat) 0.794672, (GLfloat) - 0.320446, (GLfloat) 0.479582, + (GLfloat) 0.800000, (GLfloat) - 0.305564, (GLfloat) 0.457308, + (GLfloat) 0.794672, (GLfloat) - 0.290681, (GLfloat) 0.435035, + (GLfloat) 0.779498, (GLfloat) - 0.278064, (GLfloat) 0.416153, + (GLfloat) 0.756788, (GLfloat) - 0.269634, (GLfloat) 0.403536, + (GLfloat) 0.730000, (GLfloat) - 0.266674, (GLfloat) 0.399105, + (GLfloat) 0.703212, (GLfloat) - 0.269634, (GLfloat) 0.403536, + (GLfloat) 0.680503, (GLfloat) - 0.278064, (GLfloat) 0.416153, + (GLfloat) 0.665328, (GLfloat) - 0.290681, (GLfloat) 0.435035, + (GLfloat) 0.660000, (GLfloat) - 0.305564, (GLfloat) 0.457308, + (GLfloat) 0.665328, (GLfloat) - 0.320446, (GLfloat) 0.479582, + (GLfloat) 0.680503, (GLfloat) - 0.333063, (GLfloat) 0.498464, + (GLfloat) 0.703212, (GLfloat) - 0.341493, (GLfloat) 0.511081, + (GLfloat) 0.730000, (GLfloat) - 0.344454, (GLfloat) 0.515511, + (GLfloat) 0.756788, (GLfloat) - 0.434638, (GLfloat) 0.434638, + (GLfloat) 0.779498, (GLfloat) - 0.423909, (GLfloat) 0.423909, + (GLfloat) 0.794672, (GLfloat) - 0.407851, (GLfloat) 0.407851, + (GLfloat) 0.800000, (GLfloat) - 0.388909, (GLfloat) 0.388909, + (GLfloat) 0.794672, (GLfloat) - 0.369967, (GLfloat) 0.369967, + (GLfloat) 0.779498, (GLfloat) - 0.353909, (GLfloat) 0.353909, + (GLfloat) 0.756788, (GLfloat) - 0.343179, (GLfloat) 0.343179, + (GLfloat) 0.730000, (GLfloat) - 0.339411, (GLfloat) 0.339411, + (GLfloat) 0.703212, (GLfloat) - 0.343179, (GLfloat) 0.343179, + (GLfloat) 0.680503, (GLfloat) - 0.353909, (GLfloat) 0.353909, + (GLfloat) 0.665328, (GLfloat) - 0.369967, (GLfloat) 0.369967, + (GLfloat) 0.660000, (GLfloat) - 0.388909, (GLfloat) 0.388909, + (GLfloat) 0.665328, (GLfloat) - 0.407851, (GLfloat) 0.407851, + (GLfloat) 0.680503, (GLfloat) - 0.423909, (GLfloat) 0.423909, + (GLfloat) 0.703212, (GLfloat) - 0.434638, (GLfloat) 0.434638, + (GLfloat) 0.730000, (GLfloat) - 0.438406, (GLfloat) 0.438406, + (GLfloat) 0.756788, (GLfloat) - 0.511081, (GLfloat) 0.341493, + (GLfloat) 0.779498, (GLfloat) - 0.498464, (GLfloat) 0.333063, + (GLfloat) 0.794672, (GLfloat) - 0.479582, (GLfloat) 0.320446, + (GLfloat) 0.800000, (GLfloat) - 0.457308, (GLfloat) 0.305564, + (GLfloat) 0.794672, (GLfloat) - 0.435035, (GLfloat) 0.290681, + (GLfloat) 0.779498, (GLfloat) - 0.416153, (GLfloat) 0.278064, + (GLfloat) 0.756788, (GLfloat) - 0.403536, (GLfloat) 0.269634, + (GLfloat) 0.730000, (GLfloat) - 0.399105, (GLfloat) 0.266674, + (GLfloat) 0.703212, (GLfloat) - 0.403536, (GLfloat) 0.269634, + (GLfloat) 0.680503, (GLfloat) - 0.416153, (GLfloat) 0.278064, + (GLfloat) 0.665328, (GLfloat) - 0.435035, (GLfloat) 0.290681, + (GLfloat) 0.660000, (GLfloat) - 0.457308, (GLfloat) 0.305564, + (GLfloat) 0.665328, (GLfloat) - 0.479582, (GLfloat) 0.320446, + (GLfloat) 0.680503, (GLfloat) - 0.498464, (GLfloat) 0.333063, + (GLfloat) 0.703212, (GLfloat) - 0.511081, (GLfloat) 0.341493, + (GLfloat) 0.730000, (GLfloat) - 0.515511, (GLfloat) 0.344454, + (GLfloat) 0.756788, (GLfloat) - 0.567882, (GLfloat) 0.235225, + (GLfloat) 0.779498, (GLfloat) - 0.553863, (GLfloat) 0.229418, + (GLfloat) 0.794672, (GLfloat) - 0.532882, (GLfloat) 0.220727, + (GLfloat) 0.800000, (GLfloat) - 0.508134, (GLfloat) 0.210476, + (GLfloat) 0.794672, (GLfloat) - 0.483385, (GLfloat) 0.200225, + (GLfloat) 0.779498, (GLfloat) - 0.462404, (GLfloat) 0.191534, + (GLfloat) 0.756788, (GLfloat) - 0.448385, (GLfloat) 0.185727, + (GLfloat) 0.730000, (GLfloat) - 0.443462, (GLfloat) 0.183688, + (GLfloat) 0.703212, (GLfloat) - 0.448385, (GLfloat) 0.185727, + (GLfloat) 0.680503, (GLfloat) - 0.462404, (GLfloat) 0.191534, + (GLfloat) 0.665328, (GLfloat) - 0.483385, (GLfloat) 0.200225, + (GLfloat) 0.660000, (GLfloat) - 0.508134, (GLfloat) 0.210476, + (GLfloat) 0.665328, (GLfloat) - 0.532882, (GLfloat) 0.220727, + (GLfloat) 0.680503, (GLfloat) - 0.553863, (GLfloat) 0.229418, + (GLfloat) 0.703212, (GLfloat) - 0.567882, (GLfloat) 0.235225, + (GLfloat) 0.730000, (GLfloat) - 0.572805, (GLfloat) 0.237264, + (GLfloat) 0.756788, (GLfloat) - 0.602861, (GLfloat) 0.119916, + (GLfloat) 0.779498, (GLfloat) - 0.587978, (GLfloat) 0.116956, + (GLfloat) 0.794672, (GLfloat) - 0.565705, (GLfloat) 0.112526, + (GLfloat) 0.800000, (GLfloat) - 0.539432, (GLfloat) 0.107300, + (GLfloat) 0.794672, (GLfloat) - 0.513159, (GLfloat) 0.102074, + (GLfloat) 0.779498, (GLfloat) - 0.490886, (GLfloat) 0.097643, + (GLfloat) 0.756788, (GLfloat) - 0.476003, (GLfloat) 0.094683, + (GLfloat) 0.730000, (GLfloat) - 0.470777, (GLfloat) 0.093643, + (GLfloat) 0.703212, (GLfloat) - 0.476003, (GLfloat) 0.094683, + (GLfloat) 0.680503, (GLfloat) - 0.490886, (GLfloat) 0.097643, + (GLfloat) 0.665328, (GLfloat) - 0.513159, (GLfloat) 0.102074, + (GLfloat) 0.660000, (GLfloat) - 0.539432, (GLfloat) 0.107300, + (GLfloat) 0.665328, (GLfloat) - 0.565705, (GLfloat) 0.112526, + (GLfloat) 0.680503, (GLfloat) - 0.587978, (GLfloat) 0.116956, + (GLfloat) 0.703212, (GLfloat) - 0.602861, (GLfloat) 0.119916, + (GLfloat) 0.730000, (GLfloat) - 0.608087, (GLfloat) 0.120956, + (GLfloat) 0.756788, (GLfloat) - 0.614672, (GLfloat) 0.000000, + (GLfloat) 0.779498, (GLfloat) - 0.599497, (GLfloat) 0.000000, + (GLfloat) 0.794672, (GLfloat) - 0.576788, (GLfloat) 0.000000, + (GLfloat) 0.800000, (GLfloat) - 0.550000, (GLfloat) 0.000000, + (GLfloat) 0.794672, (GLfloat) - 0.523212, (GLfloat) 0.000000, + (GLfloat) 0.779498, (GLfloat) - 0.500503, (GLfloat) 0.000000, + (GLfloat) 0.756788, (GLfloat) - 0.485328, (GLfloat) 0.000000, + (GLfloat) 0.730000, (GLfloat) - 0.480000, (GLfloat) 0.000000, + (GLfloat) 0.703212, (GLfloat) - 0.485328, (GLfloat) 0.000000, + (GLfloat) 0.680503, (GLfloat) - 0.500503, (GLfloat) 0.000000, + (GLfloat) 0.665328, (GLfloat) - 0.523212, (GLfloat) 0.000000, + (GLfloat) 0.660000, (GLfloat) - 0.550000, (GLfloat) 0.000000, + (GLfloat) 0.665328, (GLfloat) - 0.576788, (GLfloat) 0.000000, + (GLfloat) 0.680503, (GLfloat) - 0.599497, (GLfloat) 0.000000, + (GLfloat) 0.703212, (GLfloat) - 0.614672, (GLfloat) 0.000000, + (GLfloat) 0.730000, (GLfloat) - 0.620000, (GLfloat) 0.000000, + (GLfloat) 0.756788, (GLfloat) - 0.602861, (GLfloat) - 0.119916, + (GLfloat) 0.779498, (GLfloat) - 0.587978, (GLfloat) - 0.116956, + (GLfloat) 0.794672, (GLfloat) - 0.565705, (GLfloat) - 0.112526, + (GLfloat) 0.800000, (GLfloat) - 0.539432, (GLfloat) - 0.107300, + (GLfloat) 0.794672, (GLfloat) - 0.513159, (GLfloat) - 0.102074, + (GLfloat) 0.779498, (GLfloat) - 0.490886, (GLfloat) - 0.097643, + (GLfloat) 0.756788, (GLfloat) - 0.476003, (GLfloat) - 0.094683, + (GLfloat) 0.730000, (GLfloat) - 0.470777, (GLfloat) - 0.093643, + (GLfloat) 0.703212, (GLfloat) - 0.476003, (GLfloat) - 0.094683, + (GLfloat) 0.680503, (GLfloat) - 0.490886, (GLfloat) - 0.097643, + (GLfloat) 0.665328, (GLfloat) - 0.513159, (GLfloat) - 0.102074, + (GLfloat) 0.660000, (GLfloat) - 0.539432, (GLfloat) - 0.107300, + (GLfloat) 0.665328, (GLfloat) - 0.565705, (GLfloat) - 0.112526, + (GLfloat) 0.680503, (GLfloat) - 0.587978, (GLfloat) - 0.116956, + (GLfloat) 0.703212, (GLfloat) - 0.602861, (GLfloat) - 0.119916, + (GLfloat) 0.730000, (GLfloat) - 0.608087, (GLfloat) - 0.120956, + (GLfloat) 0.756788, (GLfloat) - 0.567882, (GLfloat) - 0.235225, + (GLfloat) 0.779498, (GLfloat) - 0.553863, (GLfloat) - 0.229418, + (GLfloat) 0.794672, (GLfloat) - 0.532882, (GLfloat) - 0.220727, + (GLfloat) 0.800000, (GLfloat) - 0.508134, (GLfloat) - 0.210476, + (GLfloat) 0.794672, (GLfloat) - 0.483385, (GLfloat) - 0.200225, + (GLfloat) 0.779498, (GLfloat) - 0.462404, (GLfloat) - 0.191534, + (GLfloat) 0.756788, (GLfloat) - 0.448385, (GLfloat) - 0.185727, + (GLfloat) 0.730000, (GLfloat) - 0.443462, (GLfloat) - 0.183688, + (GLfloat) 0.703212, (GLfloat) - 0.448385, (GLfloat) - 0.185727, + (GLfloat) 0.680503, (GLfloat) - 0.462404, (GLfloat) - 0.191534, + (GLfloat) 0.665328, (GLfloat) - 0.483385, (GLfloat) - 0.200225, + (GLfloat) 0.660000, (GLfloat) - 0.508134, (GLfloat) - 0.210476, + (GLfloat) 0.665328, (GLfloat) - 0.532882, (GLfloat) - 0.220727, + (GLfloat) 0.680503, (GLfloat) - 0.553863, (GLfloat) - 0.229418, + (GLfloat) 0.703212, (GLfloat) - 0.567882, (GLfloat) - 0.235225, + (GLfloat) 0.730000, (GLfloat) - 0.572805, (GLfloat) - 0.237264, + (GLfloat) 0.756788, (GLfloat) - 0.511081, (GLfloat) - 0.341493, + (GLfloat) 0.779498, (GLfloat) - 0.498464, (GLfloat) - 0.333063, + (GLfloat) 0.794672, (GLfloat) - 0.479582, (GLfloat) - 0.320446, + (GLfloat) 0.800000, (GLfloat) - 0.457308, (GLfloat) - 0.305564, + (GLfloat) 0.794672, (GLfloat) - 0.435035, (GLfloat) - 0.290681, + (GLfloat) 0.779498, (GLfloat) - 0.416153, (GLfloat) - 0.278064, + (GLfloat) 0.756788, (GLfloat) - 0.403536, (GLfloat) - 0.269634, + (GLfloat) 0.730000, (GLfloat) - 0.399105, (GLfloat) - 0.266674, + (GLfloat) 0.703212, (GLfloat) - 0.403536, (GLfloat) - 0.269634, + (GLfloat) 0.680503, (GLfloat) - 0.416153, (GLfloat) - 0.278064, + (GLfloat) 0.665328, (GLfloat) - 0.435035, (GLfloat) - 0.290681, + (GLfloat) 0.660000, (GLfloat) - 0.457308, (GLfloat) - 0.305564, + (GLfloat) 0.665328, (GLfloat) - 0.479582, (GLfloat) - 0.320446, + (GLfloat) 0.680503, (GLfloat) - 0.498464, (GLfloat) - 0.333063, + (GLfloat) 0.703212, (GLfloat) - 0.511081, (GLfloat) - 0.341493, + (GLfloat) 0.730000, (GLfloat) - 0.515511, (GLfloat) - 0.344454, + (GLfloat) 0.756788, (GLfloat) - 0.434638, (GLfloat) - 0.434638, + (GLfloat) 0.779498, (GLfloat) - 0.423909, (GLfloat) - 0.423909, + (GLfloat) 0.794672, (GLfloat) - 0.407851, (GLfloat) - 0.407851, + (GLfloat) 0.800000, (GLfloat) - 0.388909, (GLfloat) - 0.388909, + (GLfloat) 0.794672, (GLfloat) - 0.369967, (GLfloat) - 0.369967, + (GLfloat) 0.779498, (GLfloat) - 0.353909, (GLfloat) - 0.353909, + (GLfloat) 0.756788, (GLfloat) - 0.343179, (GLfloat) - 0.343179, + (GLfloat) 0.730000, (GLfloat) - 0.339411, (GLfloat) - 0.339411, + (GLfloat) 0.703212, (GLfloat) - 0.343179, (GLfloat) - 0.343179, + (GLfloat) 0.680503, (GLfloat) - 0.353909, (GLfloat) - 0.353909, + (GLfloat) 0.665328, (GLfloat) - 0.369967, (GLfloat) - 0.369967, + (GLfloat) 0.660000, (GLfloat) - 0.388909, (GLfloat) - 0.388909, + (GLfloat) 0.665328, (GLfloat) - 0.407851, (GLfloat) - 0.407851, + (GLfloat) 0.680503, (GLfloat) - 0.423909, (GLfloat) - 0.423909, + (GLfloat) 0.703212, (GLfloat) - 0.434638, (GLfloat) - 0.434638, + (GLfloat) 0.730000, (GLfloat) - 0.438406, (GLfloat) - 0.438406, + (GLfloat) 0.756788, (GLfloat) - 0.341493, (GLfloat) - 0.511081, + (GLfloat) 0.779498, (GLfloat) - 0.333063, (GLfloat) - 0.498464, + (GLfloat) 0.794672, (GLfloat) - 0.320446, (GLfloat) - 0.479582, + (GLfloat) 0.800000, (GLfloat) - 0.305564, (GLfloat) - 0.457308, + (GLfloat) 0.794672, (GLfloat) - 0.290681, (GLfloat) - 0.435035, + (GLfloat) 0.779498, (GLfloat) - 0.278064, (GLfloat) - 0.416153, + (GLfloat) 0.756788, (GLfloat) - 0.269634, (GLfloat) - 0.403536, + (GLfloat) 0.730000, (GLfloat) - 0.266674, (GLfloat) - 0.399105, + (GLfloat) 0.703212, (GLfloat) - 0.269634, (GLfloat) - 0.403536, + (GLfloat) 0.680503, (GLfloat) - 0.278064, (GLfloat) - 0.416153, + (GLfloat) 0.665328, (GLfloat) - 0.290681, (GLfloat) - 0.435035, + (GLfloat) 0.660000, (GLfloat) - 0.305564, (GLfloat) - 0.457308, + (GLfloat) 0.665328, (GLfloat) - 0.320446, (GLfloat) - 0.479582, + (GLfloat) 0.680503, (GLfloat) - 0.333063, (GLfloat) - 0.498464, + (GLfloat) 0.703212, (GLfloat) - 0.341493, (GLfloat) - 0.511081, + (GLfloat) 0.730000, (GLfloat) - 0.344454, (GLfloat) - 0.515511, + (GLfloat) 0.756788, (GLfloat) - 0.235225, (GLfloat) - 0.567882, + (GLfloat) 0.779498, (GLfloat) - 0.229418, (GLfloat) - 0.553863, + (GLfloat) 0.794672, (GLfloat) - 0.220727, (GLfloat) - 0.532882, + (GLfloat) 0.800000, (GLfloat) - 0.210476, (GLfloat) - 0.508134, + (GLfloat) 0.794672, (GLfloat) - 0.200225, (GLfloat) - 0.483385, + (GLfloat) 0.779498, (GLfloat) - 0.191534, (GLfloat) - 0.462404, + (GLfloat) 0.756788, (GLfloat) - 0.185727, (GLfloat) - 0.448385, + (GLfloat) 0.730000, (GLfloat) - 0.183688, (GLfloat) - 0.443462, + (GLfloat) 0.703212, (GLfloat) - 0.185727, (GLfloat) - 0.448385, + (GLfloat) 0.680503, (GLfloat) - 0.191534, (GLfloat) - 0.462404, + (GLfloat) 0.665328, (GLfloat) - 0.200225, (GLfloat) - 0.483385, + (GLfloat) 0.660000, (GLfloat) - 0.210476, (GLfloat) - 0.508134, + (GLfloat) 0.665328, (GLfloat) - 0.220727, (GLfloat) - 0.532882, + (GLfloat) 0.680503, (GLfloat) - 0.229418, (GLfloat) - 0.553863, + (GLfloat) 0.703212, (GLfloat) - 0.235225, (GLfloat) - 0.567882, + (GLfloat) 0.730000, (GLfloat) - 0.237264, (GLfloat) - 0.572805, + (GLfloat) 0.756788, (GLfloat) - 0.119916, (GLfloat) - 0.602861, + (GLfloat) 0.779498, (GLfloat) - 0.116956, (GLfloat) - 0.587978, + (GLfloat) 0.794672, (GLfloat) - 0.112526, (GLfloat) - 0.565705, + (GLfloat) 0.800000, (GLfloat) - 0.107300, (GLfloat) - 0.539432, + (GLfloat) 0.794672, (GLfloat) - 0.102074, (GLfloat) - 0.513159, + (GLfloat) 0.779498, (GLfloat) - 0.097643, (GLfloat) - 0.490885, + (GLfloat) 0.756788, (GLfloat) - 0.094683, (GLfloat) - 0.476003, + (GLfloat) 0.730000, (GLfloat) - 0.093643, (GLfloat) - 0.470777, + (GLfloat) 0.703212, (GLfloat) - 0.094683, (GLfloat) - 0.476003, + (GLfloat) 0.680503, (GLfloat) - 0.097643, (GLfloat) - 0.490885, + (GLfloat) 0.665328, (GLfloat) - 0.102074, (GLfloat) - 0.513159, + (GLfloat) 0.660000, (GLfloat) - 0.107300, (GLfloat) - 0.539432, + (GLfloat) 0.665328, (GLfloat) - 0.112526, (GLfloat) - 0.565705, + (GLfloat) 0.680503, (GLfloat) - 0.116956, (GLfloat) - 0.587978, + (GLfloat) 0.703212, (GLfloat) - 0.119916, (GLfloat) - 0.602861, + (GLfloat) 0.730000, (GLfloat) - 0.120956, (GLfloat) - 0.608087, + (GLfloat) 0.756788, (GLfloat) - 0.000000, (GLfloat) - 0.614672, + (GLfloat) 0.779498, (GLfloat) - 0.000000, (GLfloat) - 0.599497, + (GLfloat) 0.794672, (GLfloat) - 0.000000, (GLfloat) - 0.576788, + (GLfloat) 0.800000, (GLfloat) - 0.000000, (GLfloat) - 0.550000, + (GLfloat) 0.794672, (GLfloat) - 0.000000, (GLfloat) - 0.523212, + (GLfloat) 0.779498, (GLfloat) - 0.000000, (GLfloat) - 0.500503, + (GLfloat) 0.756788, (GLfloat) - 0.000000, (GLfloat) - 0.485328, + (GLfloat) 0.730000, (GLfloat) - 0.000000, (GLfloat) - 0.480000, + (GLfloat) 0.703212, (GLfloat) - 0.000000, (GLfloat) - 0.485328, + (GLfloat) 0.680503, (GLfloat) - 0.000000, (GLfloat) - 0.500503, + (GLfloat) 0.665328, (GLfloat) - 0.000000, (GLfloat) - 0.523212, + (GLfloat) 0.660000, (GLfloat) - 0.000000, (GLfloat) - 0.550000, + (GLfloat) 0.665328, (GLfloat) - 0.000000, (GLfloat) - 0.576788, + (GLfloat) 0.680503, (GLfloat) - 0.000000, (GLfloat) - 0.599497, + (GLfloat) 0.703212, (GLfloat) - 0.000000, (GLfloat) - 0.614672, + (GLfloat) 0.730000, (GLfloat) - 0.000000, (GLfloat) - 0.620000, + (GLfloat) 0.756788, (GLfloat) 0.119916, (GLfloat) - 0.602861, + (GLfloat) 0.779498, (GLfloat) 0.116956, (GLfloat) - 0.587978, + (GLfloat) 0.794672, (GLfloat) 0.112526, (GLfloat) - 0.565705, + (GLfloat) 0.800000, (GLfloat) 0.107300, (GLfloat) - 0.539432, + (GLfloat) 0.794672, (GLfloat) 0.102074, (GLfloat) - 0.513159, + (GLfloat) 0.779498, (GLfloat) 0.097643, (GLfloat) - 0.490886, + (GLfloat) 0.756788, (GLfloat) 0.094683, (GLfloat) - 0.476003, + (GLfloat) 0.730000, (GLfloat) 0.093643, (GLfloat) - 0.470777, + (GLfloat) 0.703212, (GLfloat) 0.094683, (GLfloat) - 0.476003, + (GLfloat) 0.680503, (GLfloat) 0.097643, (GLfloat) - 0.490886, + (GLfloat) 0.665328, (GLfloat) 0.102074, (GLfloat) - 0.513159, + (GLfloat) 0.660000, (GLfloat) 0.107300, (GLfloat) - 0.539432, + (GLfloat) 0.665328, (GLfloat) 0.112526, (GLfloat) - 0.565705, + (GLfloat) 0.680503, (GLfloat) 0.116956, (GLfloat) - 0.587978, + (GLfloat) 0.703212, (GLfloat) 0.119916, (GLfloat) - 0.602861, + (GLfloat) 0.730000, (GLfloat) 0.120956, (GLfloat) - 0.608087, + (GLfloat) 0.756788, (GLfloat) 0.235225, (GLfloat) - 0.567882, + (GLfloat) 0.779498, (GLfloat) 0.229418, (GLfloat) - 0.553863, + (GLfloat) 0.794672, (GLfloat) 0.220727, (GLfloat) - 0.532882, + (GLfloat) 0.800000, (GLfloat) 0.210476, (GLfloat) - 0.508134, + (GLfloat) 0.794672, (GLfloat) 0.200225, (GLfloat) - 0.483385, + (GLfloat) 0.779498, (GLfloat) 0.191534, (GLfloat) - 0.462404, + (GLfloat) 0.756788, (GLfloat) 0.185727, (GLfloat) - 0.448385, + (GLfloat) 0.730000, (GLfloat) 0.183688, (GLfloat) - 0.443462, + (GLfloat) 0.703212, (GLfloat) 0.185727, (GLfloat) - 0.448385, + (GLfloat) 0.680503, (GLfloat) 0.191534, (GLfloat) - 0.462404, + (GLfloat) 0.665328, (GLfloat) 0.200225, (GLfloat) - 0.483385, + (GLfloat) 0.660000, (GLfloat) 0.210476, (GLfloat) - 0.508134, + (GLfloat) 0.665328, (GLfloat) 0.220727, (GLfloat) - 0.532882, + (GLfloat) 0.680503, (GLfloat) 0.229418, (GLfloat) - 0.553863, + (GLfloat) 0.703212, (GLfloat) 0.235225, (GLfloat) - 0.567882, + (GLfloat) 0.730000, (GLfloat) 0.237264, (GLfloat) - 0.572805, + (GLfloat) 0.756788, (GLfloat) 0.341493, (GLfloat) - 0.511081, + (GLfloat) 0.779498, (GLfloat) 0.333063, (GLfloat) - 0.498464, + (GLfloat) 0.794672, (GLfloat) 0.320446, (GLfloat) - 0.479582, + (GLfloat) 0.800000, (GLfloat) 0.305564, (GLfloat) - 0.457308, + (GLfloat) 0.794672, (GLfloat) 0.290681, (GLfloat) - 0.435035, + (GLfloat) 0.779498, (GLfloat) 0.278064, (GLfloat) - 0.416153, + (GLfloat) 0.756788, (GLfloat) 0.269634, (GLfloat) - 0.403536, + (GLfloat) 0.730000, (GLfloat) 0.266674, (GLfloat) - 0.399105, + (GLfloat) 0.703212, (GLfloat) 0.269634, (GLfloat) - 0.403536, + (GLfloat) 0.680503, (GLfloat) 0.278064, (GLfloat) - 0.416153, + (GLfloat) 0.665328, (GLfloat) 0.290681, (GLfloat) - 0.435035, + (GLfloat) 0.660000, (GLfloat) 0.305564, (GLfloat) - 0.457308, + (GLfloat) 0.665328, (GLfloat) 0.320446, (GLfloat) - 0.479582, + (GLfloat) 0.680503, (GLfloat) 0.333063, (GLfloat) - 0.498464, + (GLfloat) 0.703212, (GLfloat) 0.341493, (GLfloat) - 0.511081, + (GLfloat) 0.730000, (GLfloat) 0.344454, (GLfloat) - 0.515511, + (GLfloat) 0.756788, (GLfloat) 0.434638, (GLfloat) - 0.434638, + (GLfloat) 0.779498, (GLfloat) 0.423909, (GLfloat) - 0.423909, + (GLfloat) 0.794672, (GLfloat) 0.407851, (GLfloat) - 0.407851, + (GLfloat) 0.800000, (GLfloat) 0.388909, (GLfloat) - 0.388909, + (GLfloat) 0.794672, (GLfloat) 0.369967, (GLfloat) - 0.369967, + (GLfloat) 0.779498, (GLfloat) 0.353909, (GLfloat) - 0.353909, + (GLfloat) 0.756788, (GLfloat) 0.343179, (GLfloat) - 0.343179, + (GLfloat) 0.730000, (GLfloat) 0.339411, (GLfloat) - 0.339411, + (GLfloat) 0.703212, (GLfloat) 0.343179, (GLfloat) - 0.343179, + (GLfloat) 0.680503, (GLfloat) 0.353909, (GLfloat) - 0.353909, + (GLfloat) 0.665328, (GLfloat) 0.369967, (GLfloat) - 0.369967, + (GLfloat) 0.660000, (GLfloat) 0.388909, (GLfloat) - 0.388909, + (GLfloat) 0.665328, (GLfloat) 0.407851, (GLfloat) - 0.407851, + (GLfloat) 0.680503, (GLfloat) 0.423909, (GLfloat) - 0.423909, + (GLfloat) 0.703212, (GLfloat) 0.434638, (GLfloat) - 0.434638, + (GLfloat) 0.730000, (GLfloat) 0.438406, (GLfloat) - 0.438406, + (GLfloat) 0.756788, (GLfloat) 0.511081, (GLfloat) - 0.341493, + (GLfloat) 0.779498, (GLfloat) 0.498464, (GLfloat) - 0.333063, + (GLfloat) 0.794672, (GLfloat) 0.479582, (GLfloat) - 0.320446, + (GLfloat) 0.800000, (GLfloat) 0.457308, (GLfloat) - 0.305564, + (GLfloat) 0.794672, (GLfloat) 0.435035, (GLfloat) - 0.290681, + (GLfloat) 0.779498, (GLfloat) 0.416153, (GLfloat) - 0.278064, + (GLfloat) 0.756788, (GLfloat) 0.403536, (GLfloat) - 0.269634, + (GLfloat) 0.730000, (GLfloat) 0.399105, (GLfloat) - 0.266674, + (GLfloat) 0.703212, (GLfloat) 0.403536, (GLfloat) - 0.269634, + (GLfloat) 0.680503, (GLfloat) 0.416153, (GLfloat) - 0.278064, + (GLfloat) 0.665328, (GLfloat) 0.435035, (GLfloat) - 0.290681, + (GLfloat) 0.660000, (GLfloat) 0.457308, (GLfloat) - 0.305564, + (GLfloat) 0.665328, (GLfloat) 0.479582, (GLfloat) - 0.320446, + (GLfloat) 0.680503, (GLfloat) 0.498464, (GLfloat) - 0.333063, + (GLfloat) 0.703212, (GLfloat) 0.511081, (GLfloat) - 0.341493, + (GLfloat) 0.730000, (GLfloat) 0.515511, (GLfloat) - 0.344454, + (GLfloat) 0.756788, (GLfloat) 0.567882, (GLfloat) - 0.235225, + (GLfloat) 0.779498, (GLfloat) 0.553863, (GLfloat) - 0.229418, + (GLfloat) 0.794672, (GLfloat) 0.532882, (GLfloat) - 0.220727, + (GLfloat) 0.800000, (GLfloat) 0.508134, (GLfloat) - 0.210476, + (GLfloat) 0.794672, (GLfloat) 0.483385, (GLfloat) - 0.200225, + (GLfloat) 0.779498, (GLfloat) 0.462404, (GLfloat) - 0.191534, + (GLfloat) 0.756788, (GLfloat) 0.448385, (GLfloat) - 0.185727, + (GLfloat) 0.730000, (GLfloat) 0.443462, (GLfloat) - 0.183688, + (GLfloat) 0.703212, (GLfloat) 0.448385, (GLfloat) - 0.185727, + (GLfloat) 0.680503, (GLfloat) 0.462404, (GLfloat) - 0.191534, + (GLfloat) 0.665328, (GLfloat) 0.483385, (GLfloat) - 0.200225, + (GLfloat) 0.660000, (GLfloat) 0.508134, (GLfloat) - 0.210476, + (GLfloat) 0.665328, (GLfloat) 0.532882, (GLfloat) - 0.220727, + (GLfloat) 0.680503, (GLfloat) 0.553863, (GLfloat) - 0.229418, + (GLfloat) 0.703212, (GLfloat) 0.567882, (GLfloat) - 0.235225, + (GLfloat) 0.730000, (GLfloat) 0.572805, (GLfloat) - 0.237264, + (GLfloat) 0.756788, (GLfloat) 0.602861, (GLfloat) - 0.119916, + (GLfloat) 0.779498, (GLfloat) 0.587978, (GLfloat) - 0.116956, + (GLfloat) 0.794672, (GLfloat) 0.565705, (GLfloat) - 0.112526, + (GLfloat) 0.800000, (GLfloat) 0.539432, (GLfloat) - 0.107300, + (GLfloat) 0.794672, (GLfloat) 0.513159, (GLfloat) - 0.102074, + (GLfloat) 0.779498, (GLfloat) 0.490885, (GLfloat) - 0.097643, + (GLfloat) 0.756788, (GLfloat) 0.476003, (GLfloat) - 0.094683, + (GLfloat) 0.730000, (GLfloat) 0.470777, (GLfloat) - 0.093643, + (GLfloat) 0.703212, (GLfloat) 0.476003, (GLfloat) - 0.094683, + (GLfloat) 0.680503, (GLfloat) 0.490885, (GLfloat) - 0.097643, + (GLfloat) 0.665328, (GLfloat) 0.513159, (GLfloat) - 0.102074, + (GLfloat) 0.660000, (GLfloat) 0.539432, (GLfloat) - 0.107300, + (GLfloat) 0.665328, (GLfloat) 0.565705, (GLfloat) - 0.112526, + (GLfloat) 0.680503, (GLfloat) 0.587978, (GLfloat) - 0.116956, + (GLfloat) 0.703212, (GLfloat) 0.602861, (GLfloat) - 0.119916, + (GLfloat) 0.730000, (GLfloat) 0.608087, (GLfloat) - 0.120956, + (GLfloat) 0.420000, (GLfloat) - 0.000000, (GLfloat) - 0.200000, + (GLfloat) 0.420000, (GLfloat) 0.051764, (GLfloat) - 0.193185, + (GLfloat) 0.420000, (GLfloat) 0.100000, (GLfloat) - 0.173205, + (GLfloat) 0.420000, (GLfloat) 0.141421, (GLfloat) - 0.141421, + (GLfloat) 0.420000, (GLfloat) 0.173205, (GLfloat) - 0.100000, + (GLfloat) 0.420000, (GLfloat) 0.193185, (GLfloat) - 0.051764, + (GLfloat) 0.420000, (GLfloat) 0.200000, (GLfloat) - 0.000000, + (GLfloat) 0.420000, (GLfloat) 0.193185, (GLfloat) 0.051764, + (GLfloat) 0.420000, (GLfloat) 0.173205, (GLfloat) 0.100000, + (GLfloat) 0.420000, (GLfloat) 0.141421, (GLfloat) 0.141421, + (GLfloat) 0.420000, (GLfloat) 0.100000, (GLfloat) 0.173205, + (GLfloat) 0.420000, (GLfloat) 0.051764, (GLfloat) 0.193185, + (GLfloat) 0.420000, (GLfloat) 0.000000, (GLfloat) 0.200000, + (GLfloat) 0.420000, (GLfloat) - 0.051764, (GLfloat) 0.193185, + (GLfloat) 0.420000, (GLfloat) - 0.100000, (GLfloat) 0.173205, + (GLfloat) 0.420000, (GLfloat) - 0.141421, (GLfloat) 0.141421, + (GLfloat) 0.420000, (GLfloat) - 0.173205, (GLfloat) 0.100000, + (GLfloat) 0.420000, (GLfloat) - 0.193185, (GLfloat) 0.051764, + (GLfloat) 0.420000, (GLfloat) - 0.200000, (GLfloat) 0.000000, + (GLfloat) 0.420000, (GLfloat) - 0.193185, (GLfloat) - 0.051764, + (GLfloat) 0.420000, (GLfloat) - 0.173205, (GLfloat) - 0.100000, + (GLfloat) 0.420000, (GLfloat) - 0.141421, (GLfloat) - 0.141421, + (GLfloat) 0.420000, (GLfloat) - 0.100000, (GLfloat) - 0.173205, + (GLfloat) 0.420000, (GLfloat) - 0.051764, (GLfloat) - 0.193185, + (GLfloat) 0.540000, (GLfloat) - 0.000000, (GLfloat) - 0.200000, + (GLfloat) 0.540000, (GLfloat) 0.051764, (GLfloat) - 0.193185, + (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) - 0.173205, + (GLfloat) 0.540000, (GLfloat) 0.141421, (GLfloat) - 0.141421, + (GLfloat) 0.540000, (GLfloat) 0.173205, (GLfloat) - 0.100000, + (GLfloat) 0.540000, (GLfloat) 0.193185, (GLfloat) - 0.051764, + (GLfloat) 0.540000, (GLfloat) 0.200000, (GLfloat) - 0.000000, + (GLfloat) 0.540000, (GLfloat) 0.193185, (GLfloat) 0.051764, + (GLfloat) 0.540000, (GLfloat) 0.173205, (GLfloat) 0.100000, + (GLfloat) 0.540000, (GLfloat) 0.141421, (GLfloat) 0.141421, + (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) 0.173205, + (GLfloat) 0.540000, (GLfloat) 0.051764, (GLfloat) 0.193185, + (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) 0.200000, + (GLfloat) 0.540000, (GLfloat) - 0.051764, (GLfloat) 0.193185, + (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) 0.173205, + (GLfloat) 0.540000, (GLfloat) - 0.141421, (GLfloat) 0.141421, + (GLfloat) 0.540000, (GLfloat) - 0.173205, (GLfloat) 0.100000, + (GLfloat) 0.540000, (GLfloat) - 0.193185, (GLfloat) 0.051764, + (GLfloat) 0.540000, (GLfloat) - 0.200000, (GLfloat) 0.000000, + (GLfloat) 0.540000, (GLfloat) - 0.193185, (GLfloat) - 0.051764, + (GLfloat) 0.540000, (GLfloat) - 0.173205, (GLfloat) - 0.100000, + (GLfloat) 0.540000, (GLfloat) - 0.141421, (GLfloat) - 0.141421, + (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) - 0.173205, + (GLfloat) 0.540000, (GLfloat) - 0.051764, (GLfloat) - 0.193185, + (GLfloat) 0.790000, (GLfloat) 0.060000, (GLfloat) - 0.000000, + (GLfloat) 0.785433, (GLfloat) 0.060000, (GLfloat) - 0.022961, + (GLfloat) 0.772426, (GLfloat) 0.060000, (GLfloat) - 0.042426, + (GLfloat) 0.752961, (GLfloat) 0.060000, (GLfloat) - 0.055433, + (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) - 0.060000, + (GLfloat) 0.707039, (GLfloat) 0.060000, (GLfloat) - 0.055433, + (GLfloat) 0.687574, (GLfloat) 0.060000, (GLfloat) - 0.042426, + (GLfloat) 0.674567, (GLfloat) 0.060000, (GLfloat) - 0.022961, + (GLfloat) 0.670000, (GLfloat) 0.060000, (GLfloat) - 0.000000, + (GLfloat) 0.674567, (GLfloat) 0.060000, (GLfloat) 0.022961, + (GLfloat) 0.687574, (GLfloat) 0.060000, (GLfloat) 0.042426, + (GLfloat) 0.707039, (GLfloat) 0.060000, (GLfloat) 0.055433, + (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) 0.060000, + (GLfloat) 0.752961, (GLfloat) 0.060000, (GLfloat) 0.055433, + (GLfloat) 0.772426, (GLfloat) 0.060000, (GLfloat) 0.042426, + (GLfloat) 0.785433, (GLfloat) 0.060000, (GLfloat) 0.022961, + (GLfloat) 0.790000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.785433, (GLfloat) 0.550000, (GLfloat) - 0.022961, + (GLfloat) 0.772426, (GLfloat) 0.550000, (GLfloat) - 0.042426, + (GLfloat) 0.752961, (GLfloat) 0.550000, (GLfloat) - 0.055433, + (GLfloat) 0.730000, (GLfloat) 0.550000, (GLfloat) - 0.060000, + (GLfloat) 0.707039, (GLfloat) 0.550000, (GLfloat) - 0.055433, + (GLfloat) 0.687574, (GLfloat) 0.550000, (GLfloat) - 0.042426, + (GLfloat) 0.674567, (GLfloat) 0.550000, (GLfloat) - 0.022961, + (GLfloat) 0.670000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.674567, (GLfloat) 0.550000, (GLfloat) 0.022961, + (GLfloat) 0.687574, (GLfloat) 0.550000, (GLfloat) 0.042426, + (GLfloat) 0.707039, (GLfloat) 0.550000, (GLfloat) 0.055433, + (GLfloat) 0.730000, (GLfloat) 0.550000, (GLfloat) 0.060000, + (GLfloat) 0.752961, (GLfloat) 0.550000, (GLfloat) 0.055433, + (GLfloat) 0.772426, (GLfloat) 0.550000, (GLfloat) 0.042426, + (GLfloat) 0.785433, (GLfloat) 0.550000, (GLfloat) 0.022961, + (GLfloat) 0.790000, (GLfloat) 0.000000, (GLfloat) 0.060000, + (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) 0.060000, + (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) 0.060000, + (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) 0.060000, + (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) 0.060000, + (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) 0.060000, + (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) 0.060000, + (GLfloat) 0.670000, (GLfloat) 0.000000, (GLfloat) 0.060000, + (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) 0.060000, + (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) 0.060000, + (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) 0.060000, + (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) 0.060000, + (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) 0.060000, + (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) 0.060000, + (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) 0.060000, + (GLfloat) 0.790000, (GLfloat) 0.000000, (GLfloat) 0.550000, + (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) 0.550000, + (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) 0.550000, + (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) 0.550000, + (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) 0.550000, + (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) 0.550000, + (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) 0.550000, + (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) 0.550000, + (GLfloat) 0.670000, (GLfloat) 0.000000, (GLfloat) 0.550000, + (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) 0.550000, + (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) 0.550000, + (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) 0.550000, + (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) 0.550000, + (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) 0.550000, + (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) 0.550000, + (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) 0.550000, + (GLfloat) 0.790000, (GLfloat) - 0.060000, (GLfloat) 0.000000, + (GLfloat) 0.785433, (GLfloat) - 0.060000, (GLfloat) 0.022961, + (GLfloat) 0.772426, (GLfloat) - 0.060000, (GLfloat) 0.042426, + (GLfloat) 0.752961, (GLfloat) - 0.060000, (GLfloat) 0.055433, + (GLfloat) 0.707039, (GLfloat) - 0.060000, (GLfloat) 0.055433, + (GLfloat) 0.687574, (GLfloat) - 0.060000, (GLfloat) 0.042426, + (GLfloat) 0.674567, (GLfloat) - 0.060000, (GLfloat) 0.022961, + (GLfloat) 0.670000, (GLfloat) - 0.060000, (GLfloat) 0.000000, + (GLfloat) 0.674567, (GLfloat) - 0.060000, (GLfloat) - 0.022961, + (GLfloat) 0.687574, (GLfloat) - 0.060000, (GLfloat) - 0.042426, + (GLfloat) 0.707039, (GLfloat) - 0.060000, (GLfloat) - 0.055433, + (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) - 0.060000, + (GLfloat) 0.752961, (GLfloat) - 0.060000, (GLfloat) - 0.055433, + (GLfloat) 0.772426, (GLfloat) - 0.060000, (GLfloat) - 0.042426, + (GLfloat) 0.785433, (GLfloat) - 0.060000, (GLfloat) - 0.022961, + (GLfloat) 0.790000, (GLfloat) - 0.550000, (GLfloat) 0.000000, + (GLfloat) 0.785433, (GLfloat) - 0.550000, (GLfloat) 0.022961, + (GLfloat) 0.772426, (GLfloat) - 0.550000, (GLfloat) 0.042426, + (GLfloat) 0.752961, (GLfloat) - 0.550000, (GLfloat) 0.055433, + (GLfloat) 0.730000, (GLfloat) - 0.550000, (GLfloat) 0.060000, + (GLfloat) 0.707039, (GLfloat) - 0.550000, (GLfloat) 0.055433, + (GLfloat) 0.687574, (GLfloat) - 0.550000, (GLfloat) 0.042426, + (GLfloat) 0.674567, (GLfloat) - 0.550000, (GLfloat) 0.022961, + (GLfloat) 0.670000, (GLfloat) - 0.550000, (GLfloat) 0.000000, + (GLfloat) 0.674567, (GLfloat) - 0.550000, (GLfloat) - 0.022961, + (GLfloat) 0.687574, (GLfloat) - 0.550000, (GLfloat) - 0.042426, + (GLfloat) 0.707039, (GLfloat) - 0.550000, (GLfloat) - 0.055433, + (GLfloat) 0.730000, (GLfloat) - 0.550000, (GLfloat) - 0.060000, + (GLfloat) 0.752961, (GLfloat) - 0.550000, (GLfloat) - 0.055433, + (GLfloat) 0.772426, (GLfloat) - 0.550000, (GLfloat) - 0.042426, + (GLfloat) 0.785433, (GLfloat) - 0.550000, (GLfloat) - 0.022961, + (GLfloat) 0.790000, (GLfloat) - 0.000000, (GLfloat) - 0.060000, + (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) - 0.060000, + (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) - 0.060000, + (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) - 0.060000, + (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) - 0.060000, + (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) - 0.060000, + (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) - 0.060000, + (GLfloat) 0.670000, (GLfloat) - 0.000000, (GLfloat) - 0.060000, + (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) - 0.060000, + (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) - 0.060000, + (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) - 0.060000, + (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) - 0.060000, + (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) - 0.060000, + (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) - 0.060000, + (GLfloat) 0.790000, (GLfloat) - 0.000000, (GLfloat) - 0.550000, + (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) - 0.550000, + (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) - 0.550000, + (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) - 0.550000, + (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) - 0.550000, + (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) - 0.550000, + (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) - 0.550000, + (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) - 0.550000, + (GLfloat) 0.670000, (GLfloat) - 0.000000, (GLfloat) - 0.550000, + (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) - 0.550000, + (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) - 0.550000, + (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) - 0.550000, + (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) - 0.550000, + (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) - 0.550000, + (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) - 0.550000, + (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) - 0.550000, + (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) - 0.100000, + (GLfloat) 0.540000, (GLfloat) 0.038268, (GLfloat) - 0.092388, + (GLfloat) 0.540000, (GLfloat) 0.070711, (GLfloat) - 0.070711, + (GLfloat) 0.540000, (GLfloat) 0.092388, (GLfloat) - 0.038268, + (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) - 0.000000, + (GLfloat) 0.540000, (GLfloat) 0.092388, (GLfloat) 0.038268, + (GLfloat) 0.540000, (GLfloat) 0.070711, (GLfloat) 0.070711, + (GLfloat) 0.540000, (GLfloat) 0.038268, (GLfloat) 0.092388, + (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) 0.100000, + (GLfloat) 0.540000, (GLfloat) - 0.038268, (GLfloat) 0.092388, + (GLfloat) 0.540000, (GLfloat) - 0.070711, (GLfloat) 0.070711, + (GLfloat) 0.540000, (GLfloat) - 0.092388, (GLfloat) 0.038268, + (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) 0.000000, + (GLfloat) 0.540000, (GLfloat) - 0.092388, (GLfloat) - 0.038268, + (GLfloat) 0.540000, (GLfloat) - 0.070711, (GLfloat) - 0.070711, + (GLfloat) 0.540000, (GLfloat) - 0.038268, (GLfloat) - 0.092388, + (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) - 0.100000, + (GLfloat) 0.800000, (GLfloat) 0.038268, (GLfloat) - 0.092388, + (GLfloat) 0.800000, (GLfloat) 0.070711, (GLfloat) - 0.070711, + (GLfloat) 0.800000, (GLfloat) 0.092388, (GLfloat) - 0.038268, + (GLfloat) 0.800000, (GLfloat) 0.100000, (GLfloat) - 0.000000, + (GLfloat) 0.800000, (GLfloat) 0.092388, (GLfloat) 0.038268, + (GLfloat) 0.800000, (GLfloat) 0.070711, (GLfloat) 0.070711, + (GLfloat) 0.800000, (GLfloat) 0.038268, (GLfloat) 0.092388, + (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) 0.100000, + (GLfloat) 0.800000, (GLfloat) - 0.038268, (GLfloat) 0.092388, + (GLfloat) 0.800000, (GLfloat) - 0.070711, (GLfloat) 0.070711, + (GLfloat) 0.800000, (GLfloat) - 0.092388, (GLfloat) 0.038268, + (GLfloat) 0.800000, (GLfloat) - 0.100000, (GLfloat) 0.000000, + (GLfloat) 0.800000, (GLfloat) - 0.092388, (GLfloat) - 0.038268, + (GLfloat) 0.800000, (GLfloat) - 0.070711, (GLfloat) - 0.070711, + (GLfloat) 0.800000, (GLfloat) - 0.038268, (GLfloat) - 0.092388, +}; + +static GLfloat BigValve_normals[] = +{ + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.195090, (GLfloat) - 0.980785, + (GLfloat) - 0.000000, (GLfloat) 0.555570, (GLfloat) - 0.831470, + (GLfloat) - 0.000000, (GLfloat) 0.831470, (GLfloat) - 0.555570, + (GLfloat) - 0.000000, (GLfloat) 0.980785, (GLfloat) - 0.195090, + (GLfloat) - 0.000000, (GLfloat) 0.980785, (GLfloat) 0.195090, + (GLfloat) - 0.000000, (GLfloat) 0.831470, (GLfloat) 0.555570, + (GLfloat) - 0.000000, (GLfloat) 0.555570, (GLfloat) 0.831470, + (GLfloat) - 0.000000, (GLfloat) 0.195090, (GLfloat) 0.980785, + (GLfloat) - 0.000000, (GLfloat) - 0.195090, (GLfloat) 0.980785, + (GLfloat) - 0.000000, (GLfloat) - 0.555570, (GLfloat) 0.831470, + (GLfloat) - 0.000000, (GLfloat) - 0.831470, (GLfloat) 0.555570, + (GLfloat) - 0.000000, (GLfloat) - 0.980785, (GLfloat) 0.195090, + (GLfloat) 0.000000, (GLfloat) - 0.980785, (GLfloat) - 0.195090, + (GLfloat) 0.000000, (GLfloat) - 0.831470, (GLfloat) - 0.555570, + (GLfloat) 0.000000, (GLfloat) - 0.555570, (GLfloat) - 0.831470, + (GLfloat) 0.000000, (GLfloat) - 0.195090, (GLfloat) - 0.980785, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.980785, (GLfloat) - 0.195092, (GLfloat) - 0.000000, + (GLfloat) 0.831470, (GLfloat) - 0.555569, (GLfloat) - 0.000000, + (GLfloat) 0.555569, (GLfloat) - 0.831470, (GLfloat) - 0.000000, + (GLfloat) 0.195091, (GLfloat) - 0.980785, (GLfloat) - 0.000000, + (GLfloat) - 0.195090, (GLfloat) - 0.980785, (GLfloat) - 0.000000, + (GLfloat) - 0.555570, (GLfloat) - 0.831469, (GLfloat) - 0.000000, + (GLfloat) - 0.831469, (GLfloat) - 0.555571, (GLfloat) - 0.000000, + (GLfloat) - 0.980785, (GLfloat) - 0.195089, (GLfloat) 0.000000, + (GLfloat) - 0.980785, (GLfloat) 0.195089, (GLfloat) - 0.000000, + (GLfloat) - 0.831469, (GLfloat) 0.555571, (GLfloat) - 0.000000, + (GLfloat) - 0.555570, (GLfloat) 0.831469, (GLfloat) - 0.000000, + (GLfloat) - 0.195090, (GLfloat) 0.980785, (GLfloat) - 0.000000, + (GLfloat) 0.195091, (GLfloat) 0.980785, (GLfloat) 0.000000, + (GLfloat) 0.555569, (GLfloat) 0.831470, (GLfloat) 0.000000, + (GLfloat) 0.831470, (GLfloat) 0.555569, (GLfloat) 0.000000, + (GLfloat) 0.980785, (GLfloat) 0.195092, (GLfloat) - 0.000000, + (GLfloat) 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195092, + (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) 0.555569, + (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) 0.831470, + (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) 0.980785, + (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) 0.980785, + (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) 0.831469, + (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) 0.555571, + (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195089, + (GLfloat) - 0.980785, (GLfloat) - 0.000000, (GLfloat) - 0.195089, + (GLfloat) - 0.831469, (GLfloat) - 0.000000, (GLfloat) - 0.555571, + (GLfloat) - 0.555570, (GLfloat) - 0.000000, (GLfloat) - 0.831469, + (GLfloat) - 0.195090, (GLfloat) - 0.000000, (GLfloat) - 0.980785, + (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) - 0.980785, + (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) - 0.831470, + (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) - 0.555569, + (GLfloat) 0.980785, (GLfloat) - 0.000000, (GLfloat) - 0.195092, + (GLfloat) 0.980785, (GLfloat) 0.195092, (GLfloat) - 0.000000, + (GLfloat) 0.831470, (GLfloat) 0.555569, (GLfloat) - 0.000000, + (GLfloat) 0.555569, (GLfloat) 0.831470, (GLfloat) - 0.000000, + (GLfloat) 0.195091, (GLfloat) 0.980785, (GLfloat) - 0.000000, + (GLfloat) - 0.195090, (GLfloat) 0.980785, (GLfloat) - 0.000000, + (GLfloat) - 0.555570, (GLfloat) 0.831469, (GLfloat) - 0.000000, + (GLfloat) - 0.831469, (GLfloat) 0.555571, (GLfloat) - 0.000000, + (GLfloat) - 0.980785, (GLfloat) 0.195089, (GLfloat) - 0.000000, + (GLfloat) - 0.980785, (GLfloat) - 0.195089, (GLfloat) 0.000000, + (GLfloat) - 0.831469, (GLfloat) - 0.555571, (GLfloat) 0.000000, + (GLfloat) - 0.555570, (GLfloat) - 0.831469, (GLfloat) 0.000000, + (GLfloat) - 0.195090, (GLfloat) - 0.980785, (GLfloat) 0.000000, + (GLfloat) 0.195091, (GLfloat) - 0.980785, (GLfloat) - 0.000000, + (GLfloat) 0.555569, (GLfloat) - 0.831470, (GLfloat) - 0.000000, + (GLfloat) 0.831470, (GLfloat) - 0.555569, (GLfloat) - 0.000000, + (GLfloat) 0.980785, (GLfloat) - 0.195092, (GLfloat) 0.000000, + (GLfloat) 0.980785, (GLfloat) 0.000000, (GLfloat) - 0.195092, + (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) - 0.555569, + (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) - 0.831470, + (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) - 0.980785, + (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) - 0.980785, + (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) - 0.831469, + (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) - 0.555571, + (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) - 0.195089, + (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195089, + (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) 0.555571, + (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) 0.831469, + (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) 0.980785, + (GLfloat) 0.195091, (GLfloat) - 0.000000, (GLfloat) 0.980785, + (GLfloat) 0.555569, (GLfloat) - 0.000000, (GLfloat) 0.831470, + (GLfloat) 0.831470, (GLfloat) - 0.000000, (GLfloat) 0.555569, + (GLfloat) 0.980785, (GLfloat) - 0.000000, (GLfloat) 0.195092, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.130526, (GLfloat) - 0.991445, + (GLfloat) - 0.000000, (GLfloat) 0.382684, (GLfloat) - 0.923880, + (GLfloat) - 0.000000, (GLfloat) 0.608761, (GLfloat) - 0.793353, + (GLfloat) - 0.000000, (GLfloat) 0.793353, (GLfloat) - 0.608761, + (GLfloat) - 0.000000, (GLfloat) 0.923880, (GLfloat) - 0.382684, + (GLfloat) - 0.000000, (GLfloat) 0.991445, (GLfloat) - 0.130526, + (GLfloat) - 0.000000, (GLfloat) 0.991445, (GLfloat) 0.130526, + (GLfloat) - 0.000000, (GLfloat) 0.923880, (GLfloat) 0.382684, + (GLfloat) - 0.000000, (GLfloat) 0.793353, (GLfloat) 0.608761, + (GLfloat) - 0.000000, (GLfloat) 0.608761, (GLfloat) 0.793353, + (GLfloat) - 0.000000, (GLfloat) 0.382684, (GLfloat) 0.923880, + (GLfloat) - 0.000000, (GLfloat) 0.130526, (GLfloat) 0.991445, + (GLfloat) - 0.000000, (GLfloat) - 0.130526, (GLfloat) 0.991445, + (GLfloat) - 0.000000, (GLfloat) - 0.382684, (GLfloat) 0.923880, + (GLfloat) - 0.000000, (GLfloat) - 0.608761, (GLfloat) 0.793353, + (GLfloat) - 0.000000, (GLfloat) - 0.793353, (GLfloat) 0.608761, + (GLfloat) - 0.000000, (GLfloat) - 0.923880, (GLfloat) 0.382684, + (GLfloat) - 0.000000, (GLfloat) - 0.991445, (GLfloat) 0.130526, + (GLfloat) 0.000000, (GLfloat) - 0.991445, (GLfloat) - 0.130526, + (GLfloat) 0.000000, (GLfloat) - 0.923880, (GLfloat) - 0.382684, + (GLfloat) 0.000000, (GLfloat) - 0.793353, (GLfloat) - 0.608761, + (GLfloat) 0.000000, (GLfloat) - 0.608761, (GLfloat) - 0.793353, + (GLfloat) 0.000000, (GLfloat) - 0.382684, (GLfloat) - 0.923880, + (GLfloat) 0.000000, (GLfloat) - 0.130526, (GLfloat) - 0.991445, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.194185, (GLfloat) 0.976241, (GLfloat) 0.096151, + (GLfloat) - 0.194185, (GLfloat) 0.976241, (GLfloat) 0.096151, + (GLfloat) - 0.553718, (GLfloat) 0.828695, (GLfloat) 0.081619, + (GLfloat) - 0.830228, (GLfloat) 0.554740, (GLfloat) 0.054637, + (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) 0.019211, + (GLfloat) - 0.980605, (GLfloat) - 0.195053, (GLfloat) - 0.019211, + (GLfloat) - 0.830227, (GLfloat) - 0.554741, (GLfloat) - 0.054637, + (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) - 0.081619, + (GLfloat) - 0.194187, (GLfloat) - 0.976241, (GLfloat) - 0.096151, + (GLfloat) 0.194188, (GLfloat) - 0.976241, (GLfloat) - 0.096151, + (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) - 0.081619, + (GLfloat) 0.830227, (GLfloat) - 0.554741, (GLfloat) - 0.054637, + (GLfloat) 0.980604, (GLfloat) - 0.195053, (GLfloat) - 0.019211, + (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) 0.019211, + (GLfloat) 0.830228, (GLfloat) 0.554740, (GLfloat) 0.054637, + (GLfloat) 0.553717, (GLfloat) 0.828695, (GLfloat) 0.081619, + (GLfloat) 0.194186, (GLfloat) 0.938725, (GLfloat) 0.284759, + (GLfloat) - 0.194185, (GLfloat) 0.938725, (GLfloat) 0.284759, + (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) 0.241721, + (GLfloat) - 0.830228, (GLfloat) 0.533421, (GLfloat) 0.161812, + (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895, + (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895, + (GLfloat) - 0.830227, (GLfloat) - 0.533422, (GLfloat) - 0.161812, + (GLfloat) - 0.553717, (GLfloat) - 0.796849, (GLfloat) - 0.241722, + (GLfloat) - 0.194186, (GLfloat) - 0.938725, (GLfloat) - 0.284759, + (GLfloat) 0.194187, (GLfloat) - 0.938724, (GLfloat) - 0.284759, + (GLfloat) 0.553716, (GLfloat) - 0.796849, (GLfloat) - 0.241722, + (GLfloat) 0.830227, (GLfloat) - 0.533422, (GLfloat) - 0.161812, + (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895, + (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895, + (GLfloat) 0.830228, (GLfloat) 0.533421, (GLfloat) 0.161811, + (GLfloat) 0.553716, (GLfloat) 0.796850, (GLfloat) 0.241722, + (GLfloat) 0.194186, (GLfloat) 0.865134, (GLfloat) 0.462423, + (GLfloat) - 0.194185, (GLfloat) 0.865134, (GLfloat) 0.462424, + (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) 0.392534, + (GLfloat) - 0.830228, (GLfloat) 0.491604, (GLfloat) 0.262768, + (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393, + (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393, + (GLfloat) - 0.830227, (GLfloat) - 0.491605, (GLfloat) - 0.262768, + (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) - 0.392534, + (GLfloat) - 0.194187, (GLfloat) - 0.865134, (GLfloat) - 0.462424, + (GLfloat) 0.194187, (GLfloat) - 0.865134, (GLfloat) - 0.462423, + (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) - 0.392534, + (GLfloat) 0.830227, (GLfloat) - 0.491605, (GLfloat) - 0.262768, + (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393, + (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393, + (GLfloat) 0.830228, (GLfloat) 0.491604, (GLfloat) 0.262768, + (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) 0.392535, + (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622317, + (GLfloat) - 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622318, + (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) 0.528263, + (GLfloat) - 0.830228, (GLfloat) 0.430895, (GLfloat) 0.353626, + (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124340, + (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124339, + (GLfloat) - 0.830227, (GLfloat) - 0.430895, (GLfloat) - 0.353627, + (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) - 0.528263, + (GLfloat) - 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622317, + (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622318, + (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) - 0.528263, + (GLfloat) 0.830227, (GLfloat) - 0.430895, (GLfloat) - 0.353627, + (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124339, + (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124340, + (GLfloat) 0.830228, (GLfloat) 0.430895, (GLfloat) 0.353626, + (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) 0.528263, + (GLfloat) 0.194186, (GLfloat) 0.622317, (GLfloat) 0.758296, + (GLfloat) - 0.194185, (GLfloat) 0.622318, (GLfloat) 0.758296, + (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) 0.643690, + (GLfloat) - 0.830228, (GLfloat) 0.353626, (GLfloat) 0.430895, + (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508, + (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508, + (GLfloat) - 0.830227, (GLfloat) - 0.353627, (GLfloat) - 0.430895, + (GLfloat) - 0.553717, (GLfloat) - 0.528262, (GLfloat) - 0.643689, + (GLfloat) - 0.194187, (GLfloat) - 0.622317, (GLfloat) - 0.758296, + (GLfloat) 0.194187, (GLfloat) - 0.622317, (GLfloat) - 0.758296, + (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) - 0.643690, + (GLfloat) 0.830227, (GLfloat) - 0.353627, (GLfloat) - 0.430895, + (GLfloat) 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508, + (GLfloat) 0.980604, (GLfloat) 0.124340, (GLfloat) 0.151508, + (GLfloat) 0.830228, (GLfloat) 0.353626, (GLfloat) 0.430895, + (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) 0.643690, + (GLfloat) 0.194186, (GLfloat) 0.462423, (GLfloat) 0.865134, + (GLfloat) - 0.194185, (GLfloat) 0.462424, (GLfloat) 0.865134, + (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) 0.734380, + (GLfloat) - 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491604, + (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172855, + (GLfloat) - 0.980604, (GLfloat) - 0.092392, (GLfloat) - 0.172854, + (GLfloat) - 0.830227, (GLfloat) - 0.262768, (GLfloat) - 0.491605, + (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) - 0.734380, + (GLfloat) - 0.194186, (GLfloat) - 0.462424, (GLfloat) - 0.865134, + (GLfloat) 0.194187, (GLfloat) - 0.462423, (GLfloat) - 0.865134, + (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) - 0.734381, + (GLfloat) 0.830227, (GLfloat) - 0.262768, (GLfloat) - 0.491605, + (GLfloat) 0.980604, (GLfloat) - 0.092392, (GLfloat) - 0.172854, + (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172855, + (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491604, + (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) 0.734381, + (GLfloat) 0.194185, (GLfloat) 0.284759, (GLfloat) 0.938725, + (GLfloat) - 0.194185, (GLfloat) 0.284759, (GLfloat) 0.938725, + (GLfloat) - 0.553718, (GLfloat) 0.241721, (GLfloat) 0.796848, + (GLfloat) - 0.830228, (GLfloat) 0.161812, (GLfloat) 0.533422, + (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187558, + (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558, + (GLfloat) - 0.830227, (GLfloat) - 0.161812, (GLfloat) - 0.533423, + (GLfloat) - 0.553717, (GLfloat) - 0.241722, (GLfloat) - 0.796849, + (GLfloat) - 0.194187, (GLfloat) - 0.284759, (GLfloat) - 0.938725, + (GLfloat) 0.194188, (GLfloat) - 0.284759, (GLfloat) - 0.938724, + (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) - 0.796849, + (GLfloat) 0.830227, (GLfloat) - 0.161812, (GLfloat) - 0.533423, + (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187557, + (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187558, + (GLfloat) 0.830228, (GLfloat) 0.161812, (GLfloat) 0.533422, + (GLfloat) 0.553717, (GLfloat) 0.241722, (GLfloat) 0.796849, + (GLfloat) 0.194186, (GLfloat) 0.096151, (GLfloat) 0.976241, + (GLfloat) - 0.194186, (GLfloat) 0.096151, (GLfloat) 0.976241, + (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) 0.828695, + (GLfloat) - 0.830228, (GLfloat) 0.054637, (GLfloat) 0.554740, + (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054, + (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054, + (GLfloat) - 0.830227, (GLfloat) - 0.054637, (GLfloat) - 0.554741, + (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) - 0.828695, + (GLfloat) - 0.194187, (GLfloat) - 0.096151, (GLfloat) - 0.976241, + (GLfloat) 0.194187, (GLfloat) - 0.096151, (GLfloat) - 0.976241, + (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) - 0.828696, + (GLfloat) 0.830227, (GLfloat) - 0.054637, (GLfloat) - 0.554741, + (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054, + (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054, + (GLfloat) 0.830228, (GLfloat) 0.054637, (GLfloat) 0.554740, + (GLfloat) 0.553716, (GLfloat) 0.081619, (GLfloat) 0.828696, + (GLfloat) 0.194185, (GLfloat) - 0.096151, (GLfloat) 0.976241, + (GLfloat) - 0.194185, (GLfloat) - 0.096151, (GLfloat) 0.976241, + (GLfloat) - 0.553718, (GLfloat) - 0.081619, (GLfloat) 0.828695, + (GLfloat) - 0.830228, (GLfloat) - 0.054637, (GLfloat) 0.554740, + (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195054, + (GLfloat) - 0.980605, (GLfloat) 0.019211, (GLfloat) - 0.195053, + (GLfloat) - 0.830227, (GLfloat) 0.054637, (GLfloat) - 0.554741, + (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) - 0.828695, + (GLfloat) - 0.194187, (GLfloat) 0.096151, (GLfloat) - 0.976241, + (GLfloat) 0.194188, (GLfloat) 0.096151, (GLfloat) - 0.976241, + (GLfloat) 0.553716, (GLfloat) 0.081619, (GLfloat) - 0.828696, + (GLfloat) 0.830227, (GLfloat) 0.054637, (GLfloat) - 0.554741, + (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195053, + (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195054, + (GLfloat) 0.830228, (GLfloat) - 0.054637, (GLfloat) 0.554740, + (GLfloat) 0.553717, (GLfloat) - 0.081619, (GLfloat) 0.828695, + (GLfloat) 0.194186, (GLfloat) - 0.284759, (GLfloat) 0.938725, + (GLfloat) - 0.194185, (GLfloat) - 0.284759, (GLfloat) 0.938725, + (GLfloat) - 0.553717, (GLfloat) - 0.241721, (GLfloat) 0.796849, + (GLfloat) - 0.830228, (GLfloat) - 0.161812, (GLfloat) 0.533421, + (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558, + (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558, + (GLfloat) - 0.830227, (GLfloat) 0.161812, (GLfloat) - 0.533422, + (GLfloat) - 0.553717, (GLfloat) 0.241722, (GLfloat) - 0.796849, + (GLfloat) - 0.194186, (GLfloat) 0.284759, (GLfloat) - 0.938725, + (GLfloat) 0.194187, (GLfloat) 0.284759, (GLfloat) - 0.938724, + (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) - 0.796849, + (GLfloat) 0.830227, (GLfloat) 0.161812, (GLfloat) - 0.533422, + (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558, + (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558, + (GLfloat) 0.830228, (GLfloat) - 0.161811, (GLfloat) 0.533421, + (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) 0.796850, + (GLfloat) 0.194186, (GLfloat) - 0.462423, (GLfloat) 0.865134, + (GLfloat) - 0.194185, (GLfloat) - 0.462424, (GLfloat) 0.865134, + (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) 0.734380, + (GLfloat) - 0.830228, (GLfloat) - 0.262768, (GLfloat) 0.491604, + (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854, + (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854, + (GLfloat) - 0.830227, (GLfloat) 0.262768, (GLfloat) - 0.491605, + (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) - 0.734380, + (GLfloat) - 0.194187, (GLfloat) 0.462424, (GLfloat) - 0.865134, + (GLfloat) 0.194187, (GLfloat) 0.462423, (GLfloat) - 0.865134, + (GLfloat) 0.553716, (GLfloat) 0.392534, (GLfloat) - 0.734381, + (GLfloat) 0.830227, (GLfloat) 0.262768, (GLfloat) - 0.491605, + (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854, + (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854, + (GLfloat) 0.830228, (GLfloat) - 0.262768, (GLfloat) 0.491604, + (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) 0.734381, + (GLfloat) 0.194186, (GLfloat) - 0.622317, (GLfloat) 0.758296, + (GLfloat) - 0.194186, (GLfloat) - 0.622318, (GLfloat) 0.758296, + (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) 0.643690, + (GLfloat) - 0.830228, (GLfloat) - 0.353626, (GLfloat) 0.430895, + (GLfloat) - 0.980604, (GLfloat) - 0.124340, (GLfloat) 0.151508, + (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) - 0.151508, + (GLfloat) - 0.830227, (GLfloat) 0.353627, (GLfloat) - 0.430895, + (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) - 0.643690, + (GLfloat) - 0.194186, (GLfloat) 0.622317, (GLfloat) - 0.758296, + (GLfloat) 0.194186, (GLfloat) 0.622318, (GLfloat) - 0.758296, + (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) - 0.643690, + (GLfloat) 0.830227, (GLfloat) 0.353627, (GLfloat) - 0.430895, + (GLfloat) 0.980604, (GLfloat) 0.124339, (GLfloat) - 0.151508, + (GLfloat) 0.980604, (GLfloat) - 0.124340, (GLfloat) 0.151508, + (GLfloat) 0.830228, (GLfloat) - 0.353626, (GLfloat) 0.430895, + (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) 0.643690, + (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) 0.622317, + (GLfloat) - 0.194185, (GLfloat) - 0.758296, (GLfloat) 0.622318, + (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) 0.528263, + (GLfloat) - 0.830228, (GLfloat) - 0.430895, (GLfloat) 0.353626, + (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339, + (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339, + (GLfloat) - 0.830227, (GLfloat) 0.430895, (GLfloat) - 0.353627, + (GLfloat) - 0.553717, (GLfloat) 0.643689, (GLfloat) - 0.528262, + (GLfloat) - 0.194187, (GLfloat) 0.758296, (GLfloat) - 0.622317, + (GLfloat) 0.194187, (GLfloat) 0.758296, (GLfloat) - 0.622317, + (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) - 0.528263, + (GLfloat) 0.830227, (GLfloat) 0.430895, (GLfloat) - 0.353627, + (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339, + (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124340, + (GLfloat) 0.830228, (GLfloat) - 0.430895, (GLfloat) 0.353626, + (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) 0.528263, + (GLfloat) 0.194186, (GLfloat) - 0.865134, (GLfloat) 0.462423, + (GLfloat) - 0.194185, (GLfloat) - 0.865134, (GLfloat) 0.462424, + (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) 0.392534, + (GLfloat) - 0.830228, (GLfloat) - 0.491604, (GLfloat) 0.262768, + (GLfloat) - 0.980604, (GLfloat) - 0.172855, (GLfloat) 0.092393, + (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) - 0.092393, + (GLfloat) - 0.830227, (GLfloat) 0.491605, (GLfloat) - 0.262768, + (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) - 0.392534, + (GLfloat) - 0.194186, (GLfloat) 0.865134, (GLfloat) - 0.462424, + (GLfloat) 0.194187, (GLfloat) 0.865134, (GLfloat) - 0.462423, + (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) - 0.392535, + (GLfloat) 0.830228, (GLfloat) 0.491605, (GLfloat) - 0.262768, + (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) - 0.092393, + (GLfloat) 0.980604, (GLfloat) - 0.172855, (GLfloat) 0.092393, + (GLfloat) 0.830228, (GLfloat) - 0.491604, (GLfloat) 0.262768, + (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) 0.392535, + (GLfloat) 0.194185, (GLfloat) - 0.938725, (GLfloat) 0.284759, + (GLfloat) - 0.194185, (GLfloat) - 0.938725, (GLfloat) 0.284759, + (GLfloat) - 0.553718, (GLfloat) - 0.796848, (GLfloat) 0.241721, + (GLfloat) - 0.830228, (GLfloat) - 0.533422, (GLfloat) 0.161812, + (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) 0.056895, + (GLfloat) - 0.980605, (GLfloat) 0.187557, (GLfloat) - 0.056895, + (GLfloat) - 0.830227, (GLfloat) 0.533423, (GLfloat) - 0.161812, + (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) - 0.241722, + (GLfloat) - 0.194187, (GLfloat) 0.938725, (GLfloat) - 0.284759, + (GLfloat) 0.194188, (GLfloat) 0.938724, (GLfloat) - 0.284759, + (GLfloat) 0.553716, (GLfloat) 0.796849, (GLfloat) - 0.241722, + (GLfloat) 0.830227, (GLfloat) 0.533423, (GLfloat) - 0.161812, + (GLfloat) 0.980604, (GLfloat) 0.187557, (GLfloat) - 0.056895, + (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) 0.056895, + (GLfloat) 0.830228, (GLfloat) - 0.533422, (GLfloat) 0.161812, + (GLfloat) 0.553717, (GLfloat) - 0.796849, (GLfloat) 0.241722, + (GLfloat) 0.194186, (GLfloat) - 0.976241, (GLfloat) 0.096151, + (GLfloat) - 0.194186, (GLfloat) - 0.976241, (GLfloat) 0.096151, + (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) 0.081619, + (GLfloat) - 0.830228, (GLfloat) - 0.554740, (GLfloat) 0.054637, + (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211, + (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211, + (GLfloat) - 0.830227, (GLfloat) 0.554741, (GLfloat) - 0.054637, + (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) - 0.081619, + (GLfloat) - 0.194187, (GLfloat) 0.976241, (GLfloat) - 0.096151, + (GLfloat) 0.194187, (GLfloat) 0.976241, (GLfloat) - 0.096151, + (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) - 0.081619, + (GLfloat) 0.830227, (GLfloat) 0.554741, (GLfloat) - 0.054637, + (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211, + (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211, + (GLfloat) 0.830228, (GLfloat) - 0.554740, (GLfloat) 0.054637, + (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) 0.081619, + (GLfloat) 0.194185, (GLfloat) - 0.976241, (GLfloat) - 0.096151, + (GLfloat) - 0.194185, (GLfloat) - 0.976241, (GLfloat) - 0.096151, + (GLfloat) - 0.553718, (GLfloat) - 0.828695, (GLfloat) - 0.081619, + (GLfloat) - 0.830228, (GLfloat) - 0.554740, (GLfloat) - 0.054637, + (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) - 0.019211, + (GLfloat) - 0.980605, (GLfloat) 0.195053, (GLfloat) 0.019211, + (GLfloat) - 0.830227, (GLfloat) 0.554741, (GLfloat) 0.054637, + (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) 0.081619, + (GLfloat) - 0.194187, (GLfloat) 0.976241, (GLfloat) 0.096151, + (GLfloat) 0.194188, (GLfloat) 0.976241, (GLfloat) 0.096151, + (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) 0.081619, + (GLfloat) 0.830227, (GLfloat) 0.554741, (GLfloat) 0.054637, + (GLfloat) 0.980604, (GLfloat) 0.195053, (GLfloat) 0.019211, + (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) - 0.019211, + (GLfloat) 0.830228, (GLfloat) - 0.554740, (GLfloat) - 0.054637, + (GLfloat) 0.553717, (GLfloat) - 0.828695, (GLfloat) - 0.081619, + (GLfloat) 0.194186, (GLfloat) - 0.938725, (GLfloat) - 0.284759, + (GLfloat) - 0.194185, (GLfloat) - 0.938725, (GLfloat) - 0.284759, + (GLfloat) - 0.553717, (GLfloat) - 0.796849, (GLfloat) - 0.241721, + (GLfloat) - 0.830228, (GLfloat) - 0.533421, (GLfloat) - 0.161812, + (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895, + (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895, + (GLfloat) - 0.830227, (GLfloat) 0.533422, (GLfloat) 0.161812, + (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) 0.241722, + (GLfloat) - 0.194186, (GLfloat) 0.938725, (GLfloat) 0.284759, + (GLfloat) 0.194187, (GLfloat) 0.938724, (GLfloat) 0.284759, + (GLfloat) 0.553716, (GLfloat) 0.796849, (GLfloat) 0.241722, + (GLfloat) 0.830227, (GLfloat) 0.533422, (GLfloat) 0.161812, + (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895, + (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895, + (GLfloat) 0.830228, (GLfloat) - 0.533421, (GLfloat) - 0.161811, + (GLfloat) 0.553716, (GLfloat) - 0.796850, (GLfloat) - 0.241722, + (GLfloat) 0.194186, (GLfloat) - 0.865134, (GLfloat) - 0.462423, + (GLfloat) - 0.194185, (GLfloat) - 0.865134, (GLfloat) - 0.462424, + (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) - 0.392534, + (GLfloat) - 0.830228, (GLfloat) - 0.491604, (GLfloat) - 0.262768, + (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393, + (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393, + (GLfloat) - 0.830227, (GLfloat) 0.491605, (GLfloat) 0.262768, + (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) 0.392534, + (GLfloat) - 0.194187, (GLfloat) 0.865134, (GLfloat) 0.462424, + (GLfloat) 0.194187, (GLfloat) 0.865134, (GLfloat) 0.462423, + (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) 0.392534, + (GLfloat) 0.830227, (GLfloat) 0.491605, (GLfloat) 0.262768, + (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393, + (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393, + (GLfloat) 0.830228, (GLfloat) - 0.491604, (GLfloat) - 0.262768, + (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) - 0.392535, + (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622317, + (GLfloat) - 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622318, + (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) - 0.528263, + (GLfloat) - 0.830228, (GLfloat) - 0.430895, (GLfloat) - 0.353626, + (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124340, + (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124339, + (GLfloat) - 0.830227, (GLfloat) 0.430895, (GLfloat) 0.353627, + (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) 0.528263, + (GLfloat) - 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622317, + (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622318, + (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) 0.528263, + (GLfloat) 0.830227, (GLfloat) 0.430895, (GLfloat) 0.353627, + (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124339, + (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124340, + (GLfloat) 0.830228, (GLfloat) - 0.430895, (GLfloat) - 0.353626, + (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) - 0.528263, + (GLfloat) 0.194186, (GLfloat) - 0.622317, (GLfloat) - 0.758296, + (GLfloat) - 0.194185, (GLfloat) - 0.622318, (GLfloat) - 0.758296, + (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) - 0.643690, + (GLfloat) - 0.830228, (GLfloat) - 0.353626, (GLfloat) - 0.430895, + (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508, + (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508, + (GLfloat) - 0.830227, (GLfloat) 0.353627, (GLfloat) 0.430895, + (GLfloat) - 0.553717, (GLfloat) 0.528262, (GLfloat) 0.643689, + (GLfloat) - 0.194187, (GLfloat) 0.622317, (GLfloat) 0.758296, + (GLfloat) 0.194187, (GLfloat) 0.622317, (GLfloat) 0.758296, + (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) 0.643690, + (GLfloat) 0.830227, (GLfloat) 0.353627, (GLfloat) 0.430895, + (GLfloat) 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508, + (GLfloat) 0.980604, (GLfloat) - 0.124340, (GLfloat) - 0.151508, + (GLfloat) 0.830228, (GLfloat) - 0.353626, (GLfloat) - 0.430895, + (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) - 0.643690, + (GLfloat) 0.194186, (GLfloat) - 0.462423, (GLfloat) - 0.865134, + (GLfloat) - 0.194185, (GLfloat) - 0.462424, (GLfloat) - 0.865134, + (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) - 0.734380, + (GLfloat) - 0.830228, (GLfloat) - 0.262768, (GLfloat) - 0.491604, + (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) - 0.172855, + (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172854, + (GLfloat) - 0.830227, (GLfloat) 0.262768, (GLfloat) 0.491605, + (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) 0.734380, + (GLfloat) - 0.194186, (GLfloat) 0.462424, (GLfloat) 0.865134, + (GLfloat) 0.194187, (GLfloat) 0.462423, (GLfloat) 0.865134, + (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) 0.734381, + (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491605, + (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172854, + (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) - 0.172855, + (GLfloat) 0.830228, (GLfloat) - 0.262768, (GLfloat) - 0.491604, + (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) - 0.734381, + (GLfloat) 0.194185, (GLfloat) - 0.284759, (GLfloat) - 0.938725, + (GLfloat) - 0.194185, (GLfloat) - 0.284759, (GLfloat) - 0.938725, + (GLfloat) - 0.553718, (GLfloat) - 0.241721, (GLfloat) - 0.796848, + (GLfloat) - 0.830228, (GLfloat) - 0.161812, (GLfloat) - 0.533422, + (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558, + (GLfloat) - 0.980605, (GLfloat) 0.056895, (GLfloat) 0.187557, + (GLfloat) - 0.830227, (GLfloat) 0.161812, (GLfloat) 0.533422, + (GLfloat) - 0.553716, (GLfloat) 0.241722, (GLfloat) 0.796849, + (GLfloat) - 0.194187, (GLfloat) 0.284759, (GLfloat) 0.938725, + (GLfloat) 0.194188, (GLfloat) 0.284759, (GLfloat) 0.938724, + (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) 0.796850, + (GLfloat) 0.830227, (GLfloat) 0.161812, (GLfloat) 0.533423, + (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187557, + (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558, + (GLfloat) 0.830228, (GLfloat) - 0.161812, (GLfloat) - 0.533422, + (GLfloat) 0.553717, (GLfloat) - 0.241722, (GLfloat) - 0.796849, + (GLfloat) 0.194186, (GLfloat) - 0.096151, (GLfloat) - 0.976241, + (GLfloat) - 0.194186, (GLfloat) - 0.096151, (GLfloat) - 0.976241, + (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) - 0.828695, + (GLfloat) - 0.830228, (GLfloat) - 0.054637, (GLfloat) - 0.554740, + (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054, + (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054, + (GLfloat) - 0.830227, (GLfloat) 0.054637, (GLfloat) 0.554741, + (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) 0.828695, + (GLfloat) - 0.194187, (GLfloat) 0.096151, (GLfloat) 0.976241, + (GLfloat) 0.194187, (GLfloat) 0.096151, (GLfloat) 0.976241, + (GLfloat) 0.553716, (GLfloat) 0.081620, (GLfloat) 0.828696, + (GLfloat) 0.830227, (GLfloat) 0.054637, (GLfloat) 0.554741, + (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054, + (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054, + (GLfloat) 0.830228, (GLfloat) - 0.054637, (GLfloat) - 0.554740, + (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) - 0.828696, + (GLfloat) 0.194185, (GLfloat) 0.096151, (GLfloat) - 0.976241, + (GLfloat) - 0.194185, (GLfloat) 0.096151, (GLfloat) - 0.976241, + (GLfloat) - 0.553718, (GLfloat) 0.081619, (GLfloat) - 0.828695, + (GLfloat) - 0.830228, (GLfloat) 0.054637, (GLfloat) - 0.554740, + (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195054, + (GLfloat) - 0.980605, (GLfloat) - 0.019211, (GLfloat) 0.195053, + (GLfloat) - 0.830227, (GLfloat) - 0.054637, (GLfloat) 0.554741, + (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) 0.828695, + (GLfloat) - 0.194187, (GLfloat) - 0.096151, (GLfloat) 0.976241, + (GLfloat) 0.194188, (GLfloat) - 0.096151, (GLfloat) 0.976241, + (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) 0.828696, + (GLfloat) 0.830227, (GLfloat) - 0.054637, (GLfloat) 0.554741, + (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195053, + (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195054, + (GLfloat) 0.830228, (GLfloat) 0.054637, (GLfloat) - 0.554740, + (GLfloat) 0.553717, (GLfloat) 0.081619, (GLfloat) - 0.828695, + (GLfloat) 0.194186, (GLfloat) 0.284759, (GLfloat) - 0.938725, + (GLfloat) - 0.194185, (GLfloat) 0.284759, (GLfloat) - 0.938725, + (GLfloat) - 0.553717, (GLfloat) 0.241721, (GLfloat) - 0.796849, + (GLfloat) - 0.830228, (GLfloat) 0.161812, (GLfloat) - 0.533421, + (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558, + (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558, + (GLfloat) - 0.830227, (GLfloat) - 0.161812, (GLfloat) 0.533422, + (GLfloat) - 0.553717, (GLfloat) - 0.241722, (GLfloat) 0.796849, + (GLfloat) - 0.194186, (GLfloat) - 0.284759, (GLfloat) 0.938725, + (GLfloat) 0.194187, (GLfloat) - 0.284759, (GLfloat) 0.938724, + (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) 0.796849, + (GLfloat) 0.830227, (GLfloat) - 0.161812, (GLfloat) 0.533422, + (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558, + (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558, + (GLfloat) 0.830228, (GLfloat) 0.161811, (GLfloat) - 0.533421, + (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) - 0.796850, + (GLfloat) 0.194186, (GLfloat) 0.462423, (GLfloat) - 0.865134, + (GLfloat) - 0.194185, (GLfloat) 0.462424, (GLfloat) - 0.865134, + (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) - 0.734380, + (GLfloat) - 0.830228, (GLfloat) 0.262768, (GLfloat) - 0.491604, + (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854, + (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854, + (GLfloat) - 0.830227, (GLfloat) - 0.262768, (GLfloat) 0.491605, + (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) 0.734380, + (GLfloat) - 0.194187, (GLfloat) - 0.462424, (GLfloat) 0.865134, + (GLfloat) 0.194187, (GLfloat) - 0.462423, (GLfloat) 0.865134, + (GLfloat) 0.553716, (GLfloat) - 0.392534, (GLfloat) 0.734381, + (GLfloat) 0.830227, (GLfloat) - 0.262768, (GLfloat) 0.491605, + (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854, + (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854, + (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) - 0.491604, + (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) - 0.734381, + (GLfloat) 0.194186, (GLfloat) 0.622317, (GLfloat) - 0.758296, + (GLfloat) - 0.194186, (GLfloat) 0.622318, (GLfloat) - 0.758296, + (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) - 0.643690, + (GLfloat) - 0.830228, (GLfloat) 0.353626, (GLfloat) - 0.430895, + (GLfloat) - 0.980604, (GLfloat) 0.124340, (GLfloat) - 0.151508, + (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) 0.151508, + (GLfloat) - 0.830227, (GLfloat) - 0.353627, (GLfloat) 0.430895, + (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) 0.643690, + (GLfloat) - 0.194186, (GLfloat) - 0.622317, (GLfloat) 0.758296, + (GLfloat) 0.194186, (GLfloat) - 0.622318, (GLfloat) 0.758296, + (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) 0.643690, + (GLfloat) 0.830227, (GLfloat) - 0.353627, (GLfloat) 0.430895, + (GLfloat) 0.980604, (GLfloat) - 0.124339, (GLfloat) 0.151508, + (GLfloat) 0.980604, (GLfloat) 0.124340, (GLfloat) - 0.151508, + (GLfloat) 0.830228, (GLfloat) 0.353626, (GLfloat) - 0.430895, + (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) - 0.643690, + (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) - 0.622317, + (GLfloat) - 0.194185, (GLfloat) 0.758296, (GLfloat) - 0.622318, + (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) - 0.528263, + (GLfloat) - 0.830228, (GLfloat) 0.430895, (GLfloat) - 0.353626, + (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339, + (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339, + (GLfloat) - 0.830227, (GLfloat) - 0.430895, (GLfloat) 0.353627, + (GLfloat) - 0.553717, (GLfloat) - 0.643689, (GLfloat) 0.528262, + (GLfloat) - 0.194187, (GLfloat) - 0.758296, (GLfloat) 0.622317, + (GLfloat) 0.194187, (GLfloat) - 0.758296, (GLfloat) 0.622317, + (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) 0.528263, + (GLfloat) 0.830227, (GLfloat) - 0.430895, (GLfloat) 0.353627, + (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339, + (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124340, + (GLfloat) 0.830228, (GLfloat) 0.430895, (GLfloat) - 0.353626, + (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) - 0.528263, + (GLfloat) 0.194186, (GLfloat) 0.865134, (GLfloat) - 0.462423, + (GLfloat) - 0.194185, (GLfloat) 0.865134, (GLfloat) - 0.462424, + (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) - 0.392534, + (GLfloat) - 0.830228, (GLfloat) 0.491604, (GLfloat) - 0.262768, + (GLfloat) - 0.980604, (GLfloat) 0.172855, (GLfloat) - 0.092393, + (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) 0.092393, + (GLfloat) - 0.830227, (GLfloat) - 0.491605, (GLfloat) 0.262768, + (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) 0.392534, + (GLfloat) - 0.194186, (GLfloat) - 0.865134, (GLfloat) 0.462424, + (GLfloat) 0.194187, (GLfloat) - 0.865134, (GLfloat) 0.462423, + (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) 0.392535, + (GLfloat) 0.830228, (GLfloat) - 0.491605, (GLfloat) 0.262768, + (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) 0.092393, + (GLfloat) 0.980604, (GLfloat) 0.172855, (GLfloat) - 0.092393, + (GLfloat) 0.830228, (GLfloat) 0.491604, (GLfloat) - 0.262768, + (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) - 0.392535, + (GLfloat) 0.194185, (GLfloat) 0.938725, (GLfloat) - 0.284759, + (GLfloat) - 0.194185, (GLfloat) 0.938725, (GLfloat) - 0.284759, + (GLfloat) - 0.553718, (GLfloat) 0.796848, (GLfloat) - 0.241721, + (GLfloat) - 0.830228, (GLfloat) 0.533422, (GLfloat) - 0.161812, + (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) - 0.056895, + (GLfloat) - 0.980605, (GLfloat) - 0.187557, (GLfloat) 0.056895, + (GLfloat) - 0.830227, (GLfloat) - 0.533422, (GLfloat) 0.161812, + (GLfloat) - 0.553716, (GLfloat) - 0.796849, (GLfloat) 0.241722, + (GLfloat) - 0.194187, (GLfloat) - 0.938725, (GLfloat) 0.284759, + (GLfloat) 0.194188, (GLfloat) - 0.938724, (GLfloat) 0.284759, + (GLfloat) 0.553716, (GLfloat) - 0.796850, (GLfloat) 0.241722, + (GLfloat) 0.830227, (GLfloat) - 0.533423, (GLfloat) 0.161812, + (GLfloat) 0.980604, (GLfloat) - 0.187557, (GLfloat) 0.056895, + (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) - 0.056895, + (GLfloat) 0.830228, (GLfloat) 0.533422, (GLfloat) - 0.161812, + (GLfloat) 0.553717, (GLfloat) 0.796849, (GLfloat) - 0.241722, + (GLfloat) 0.194186, (GLfloat) 0.976241, (GLfloat) - 0.096151, + (GLfloat) - 0.194186, (GLfloat) 0.976241, (GLfloat) - 0.096151, + (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) - 0.081619, + (GLfloat) - 0.830228, (GLfloat) 0.554740, (GLfloat) - 0.054637, + (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211, + (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211, + (GLfloat) - 0.830227, (GLfloat) - 0.554741, (GLfloat) 0.054637, + (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) 0.081619, + (GLfloat) - 0.194187, (GLfloat) - 0.976241, (GLfloat) 0.096151, + (GLfloat) 0.194187, (GLfloat) - 0.976241, (GLfloat) 0.096151, + (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) 0.081620, + (GLfloat) 0.830227, (GLfloat) - 0.554741, (GLfloat) 0.054637, + (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211, + (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211, + (GLfloat) 0.830228, (GLfloat) 0.554740, (GLfloat) - 0.054637, + (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) - 0.081619, +}; + +static unsigned short int BigValve_POLS[] = +{ + 16, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 1, 4, 700, + 701, 685, 684, 1, 4, 701, 702, 686, 685, 1, 4, 702, 703, 687, 686, 1, 4, 703, 704, 688, + 687, 1, 4, 704, 705, 689, 688, 1, 4, 705, 706, 690, 689, 1, 4, 706, 707, 691, 690, 1, + 4, 707, 708, 692, 691, 1, 4, 708, 709, 693, 692, 1, 4, 709, 710, 694, 693, 1, 4, 710, + 711, 695, 694, 1, 4, 711, 712, 696, 695, 1, 4, 712, 713, 697, 696, 1, 4, 713, 714, 698, + 697, 1, 4, 714, 715, 699, 698, 1, 4, 715, 700, 684, 699, 1, 16, 700, 715, 714, 713, 712, + 711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, 1, 4, 668, 669, 655, 654, 1, 4, 669, + 670, 656, 655, 1, 4, 670, 671, 657, 656, 1, 4, 671, 672, 634, 657, 1, 4, 672, 673, 658, + 634, 1, 4, 673, 674, 659, 658, 1, 4, 674, 675, 660, 659, 1, 4, 675, 676, 661, 660, 1, + 4, 676, 677, 662, 661, 1, 4, 677, 678, 663, 662, 1, 4, 678, 679, 664, 663, 1, 4, 679, + 680, 564, 664, 1, 4, 680, 681, 665, 564, 1, 4, 681, 682, 666, 665, 1, 4, 682, 683, 667, + 666, 1, 4, 683, 668, 654, 667, 1, 4, 638, 639, 624, 623, 1, 4, 639, 640, 625, 624, 1, + 4, 640, 641, 626, 625, 1, 4, 641, 642, 603, 626, 1, 4, 642, 643, 627, 603, 1, 4, 643, + 644, 628, 627, 1, 4, 644, 645, 629, 628, 1, 4, 645, 646, 630, 629, 1, 4, 646, 647, 631, + 630, 1, 4, 647, 648, 632, 631, 1, 4, 648, 649, 633, 632, 1, 4, 649, 650, 634, 633, 1, + 4, 650, 651, 635, 634, 1, 4, 651, 652, 636, 635, 1, 4, 652, 653, 637, 636, 1, 4, 653, + 638, 623, 637, 1, 4, 607, 608, 593, 592, 1, 4, 608, 609, 594, 593, 1, 4, 609, 610, 595, + 594, 1, 4, 610, 611, 572, 595, 1, 4, 611, 612, 596, 572, 1, 4, 612, 613, 597, 596, 1, + 4, 613, 614, 598, 597, 1, 4, 614, 615, 599, 598, 1, 4, 615, 616, 600, 599, 1, 4, 616, + 617, 601, 600, 1, 4, 617, 618, 602, 601, 1, 4, 618, 619, 603, 602, 1, 4, 619, 620, 604, + 603, 1, 4, 620, 621, 605, 604, 1, 4, 621, 622, 606, 605, 1, 4, 622, 607, 592, 606, 1, + 4, 576, 577, 561, 560, 1, 4, 577, 578, 562, 561, 1, 4, 578, 579, 563, 562, 1, 4, 579, + 580, 564, 563, 1, 4, 580, 581, 565, 564, 1, 4, 581, 582, 566, 565, 1, 4, 582, 583, 567, + 566, 1, 4, 583, 584, 568, 567, 1, 4, 584, 585, 569, 568, 1, 4, 585, 586, 570, 569, 1, + 4, 586, 587, 571, 570, 1, 4, 587, 588, 572, 571, 1, 4, 588, 589, 573, 572, 1, 4, 589, + 590, 574, 573, 1, 4, 590, 591, 575, 574, 1, 4, 591, 576, 560, 575, 1, 24, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 1, 4, 536, 537, 513, 512, 1, 4, 537, 538, 514, 513, 1, 4, 538, 539, 515, 514, 1, + 4, 539, 540, 516, 515, 1, 4, 540, 541, 517, 516, 1, 4, 541, 542, 518, 517, 1, 4, 542, + 543, 519, 518, 1, 4, 543, 544, 520, 519, 1, 4, 544, 545, 521, 520, 1, 4, 545, 546, 522, + 521, 1, 4, 546, 547, 523, 522, 1, 4, 547, 548, 524, 523, 1, 4, 548, 549, 525, 524, 1, + 4, 549, 550, 526, 525, 1, 4, 550, 551, 527, 526, 1, 4, 551, 552, 528, 527, 1, 4, 552, + 553, 529, 528, 1, 4, 553, 554, 530, 529, 1, 4, 554, 555, 531, 530, 1, 4, 555, 556, 532, + 531, 1, 4, 556, 557, 533, 532, 1, 4, 557, 558, 534, 533, 1, 4, 558, 559, 535, 534, 1, + 4, 559, 536, 512, 535, 1, 24, 536, 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, 548, + 547, 546, 545, 544, 543, 542, 541, 540, 539, 538, 537, 1, 4, 16, 31, 15, 0, 1, 4, 31, + 30, 14, 15, 1, 4, 30, 29, 13, 14, 1, 4, 29, 28, 12, 13, 1, 4, 28, 27, 11, + 12, 1, 4, 27, 26, 10, 11, 1, 4, 26, 25, 9, 10, 1, 4, 25, 24, 8, 9, 1, + 4, 24, 23, 7, 8, 1, 4, 23, 22, 6, 7, 1, 4, 22, 21, 5, 6, 1, 4, 21, + 20, 4, 5, 1, 4, 20, 19, 3, 4, 1, 4, 19, 18, 2, 3, 1, 4, 18, 17, 1, + 2, 1, 4, 17, 16, 0, 1, 1, 4, 32, 47, 31, 16, 1, 4, 47, 46, 30, 31, 1, + 4, 46, 45, 29, 30, 1, 4, 45, 44, 28, 29, 1, 4, 44, 43, 27, 28, 1, 4, 43, + 42, 26, 27, 1, 4, 42, 41, 25, 26, 1, 4, 41, 40, 24, 25, 1, 4, 40, 39, 23, + 24, 1, 4, 39, 38, 22, 23, 1, 4, 38, 37, 21, 22, 1, 4, 37, 36, 20, 21, 1, + 4, 36, 35, 19, 20, 1, 4, 35, 34, 18, 19, 1, 4, 34, 33, 17, 18, 1, 4, 33, + 32, 16, 17, 1, 4, 48, 63, 47, 32, 1, 4, 63, 62, 46, 47, 1, 4, 62, 61, 45, + 46, 1, 4, 61, 60, 44, 45, 1, 4, 60, 59, 43, 44, 1, 4, 59, 58, 42, 43, 1, + 4, 58, 57, 41, 42, 1, 4, 57, 56, 40, 41, 1, 4, 56, 55, 39, 40, 1, 4, 55, + 54, 38, 39, 1, 4, 54, 53, 37, 38, 1, 4, 53, 52, 36, 37, 1, 4, 52, 51, 35, + 36, 1, 4, 51, 50, 34, 35, 1, 4, 50, 49, 33, 34, 1, 4, 49, 48, 32, 33, 1, + 4, 64, 79, 63, 48, 1, 4, 79, 78, 62, 63, 1, 4, 78, 77, 61, 62, 1, 4, 77, + 76, 60, 61, 1, 4, 76, 75, 59, 60, 1, 4, 75, 74, 58, 59, 1, 4, 74, 73, 57, + 58, 1, 4, 73, 72, 56, 57, 1, 4, 72, 71, 55, 56, 1, 4, 71, 70, 54, 55, 1, + 4, 70, 69, 53, 54, 1, 4, 69, 68, 52, 53, 1, 4, 68, 67, 51, 52, 1, 4, 67, + 66, 50, 51, 1, 4, 66, 65, 49, 50, 1, 4, 65, 64, 48, 49, 1, 4, 80, 95, 79, + 64, 1, 4, 95, 94, 78, 79, 1, 4, 94, 93, 77, 78, 1, 4, 93, 92, 76, 77, 1, + 4, 92, 91, 75, 76, 1, 4, 91, 90, 74, 75, 1, 4, 90, 89, 73, 74, 1, 4, 89, + 88, 72, 73, 1, 4, 88, 87, 71, 72, 1, 4, 87, 86, 70, 71, 1, 4, 86, 85, 69, + 70, 1, 4, 85, 84, 68, 69, 1, 4, 84, 83, 67, 68, 1, 4, 83, 82, 66, 67, 1, + 4, 82, 81, 65, 66, 1, 4, 81, 80, 64, 65, 1, 4, 96, 111, 95, 80, 1, 4, 111, + 110, 94, 95, 1, 4, 110, 109, 93, 94, 1, 4, 109, 108, 92, 93, 1, 4, 108, 107, 91, +92, 1, 4, 107, 106, 90, 91, 1, 4, 106, 105, 89, 90, 1, 4, 105, 104, 88, 89, 1, + 4, 104, 103, 87, 88, 1, 4, 103, 102, 86, 87, 1, 4, 102, 101, 85, 86, 1, 4, 101, + 100, 84, 85, 1, 4, 100, 99, 83, 84, 1, 4, 99, 98, 82, 83, 1, 4, 98, 97, 81, + 82, 1, 4, 97, 96, 80, 81, 1, 4, 112, 127, 111, 96, 1, 4, 127, 126, 110, 111, 1, + 4, 126, 125, 109, 110, 1, 4, 125, 124, 108, 109, 1, 4, 124, 123, 107, 108, 1, 4, 123, + 122, 106, 107, 1, 4, 122, 121, 105, 106, 1, 4, 121, 120, 104, 105, 1, 4, 120, 119, 103, + 104, 1, 4, 119, 118, 102, 103, 1, 4, 118, 117, 101, 102, 1, 4, 117, 116, 100, 101, 1, + 4, 116, 115, 99, 100, 1, 4, 115, 114, 98, 99, 1, 4, 114, 113, 97, 98, 1, 4, 113, + 112, 96, 97, 1, 4, 128, 143, 127, 112, 1, 4, 143, 142, 126, 127, 1, 4, 142, 141, 125, + 126, 1, 4, 141, 140, 124, 125, 1, 4, 140, 139, 123, 124, 1, 4, 139, 138, 122, 123, 1, + 4, 138, 137, 121, 122, 1, 4, 137, 136, 120, 121, 1, 4, 136, 135, 119, 120, 1, 4, 135, + 134, 118, 119, 1, 4, 134, 133, 117, 118, 1, 4, 133, 132, 116, 117, 1, 4, 132, 131, 115, + 116, 1, 4, 131, 130, 114, 115, 1, 4, 130, 129, 113, 114, 1, 4, 129, 128, 112, 113, 1, + 4, 144, 159, 143, 128, 1, 4, 159, 158, 142, 143, 1, 4, 158, 157, 141, 142, 1, 4, 157, + 156, 140, 141, 1, 4, 156, 155, 139, 140, 1, 4, 155, 154, 138, 139, 1, 4, 154, 153, 137, + 138, 1, 4, 153, 152, 136, 137, 1, 4, 152, 151, 135, 136, 1, 4, 151, 150, 134, 135, 1, + 4, 150, 149, 133, 134, 1, 4, 149, 148, 132, 133, 1, 4, 148, 147, 131, 132, 1, 4, 147, + 146, 130, 131, 1, 4, 146, 145, 129, 130, 1, 4, 145, 144, 128, 129, 1, 4, 160, 175, 159, + 144, 1, 4, 175, 174, 158, 159, 1, 4, 174, 173, 157, 158, 1, 4, 173, 172, 156, 157, 1, + 4, 172, 171, 155, 156, 1, 4, 171, 170, 154, 155, 1, 4, 170, 169, 153, 154, 1, 4, 169, + 168, 152, 153, 1, 4, 168, 167, 151, 152, 1, 4, 167, 166, 150, 151, 1, 4, 166, 165, 149, + 150, 1, 4, 165, 164, 148, 149, 1, 4, 164, 163, 147, 148, 1, 4, 163, 162, 146, 147, 1, + 4, 162, 161, 145, 146, 1, 4, 161, 160, 144, 145, 1, 4, 176, 191, 175, 160, 1, 4, 191, + 190, 174, 175, 1, 4, 190, 189, 173, 174, 1, 4, 189, 188, 172, 173, 1, 4, 188, 187, 171, + 172, 1, 4, 187, 186, 170, 171, 1, 4, 186, 185, 169, 170, 1, 4, 185, 184, 168, 169, 1, + 4, 184, 183, 167, 168, 1, 4, 183, 182, 166, 167, 1, 4, 182, 181, 165, 166, 1, 4, 181, + 180, 164, 165, 1, 4, 180, 179, 163, 164, 1, 4, 179, 178, 162, 163, 1, 4, 178, 177, 161, + 162, 1, 4, 177, 176, 160, 161, 1, 4, 192, 207, 191, 176, 1, 4, 207, 206, 190, 191, 1, + 4, 206, 205, 189, 190, 1, 4, 205, 204, 188, 189, 1, 4, 204, 203, 187, 188, 1, 4, 203, + 202, 186, 187, 1, 4, 202, 201, 185, 186, 1, 4, 201, 200, 184, 185, 1, 4, 200, 199, 183, + 184, 1, 4, 199, 198, 182, 183, 1, 4, 198, 197, 181, 182, 1, 4, 197, 196, 180, 181, 1, + 4, 196, 195, 179, 180, 1, 4, 195, 194, 178, 179, 1, 4, 194, 193, 177, 178, 1, 4, 193, + 192, 176, 177, 1, 4, 208, 223, 207, 192, 1, 4, 223, 222, 206, 207, 1, 4, 222, 221, 205, + 206, 1, 4, 221, 220, 204, 205, 1, 4, 220, 219, 203, 204, 1, 4, 219, 218, 202, 203, 1, + 4, 218, 217, 201, 202, 1, 4, 217, 216, 200, 201, 1, 4, 216, 215, 199, 200, 1, 4, 215, + 214, 198, 199, 1, 4, 214, 213, 197, 198, 1, 4, 213, 212, 196, 197, 1, 4, 212, 211, 195, + 196, 1, 4, 211, 210, 194, 195, 1, 4, 210, 209, 193, 194, 1, 4, 209, 208, 192, 193, 1, + 4, 224, 239, 223, 208, 1, 4, 239, 238, 222, 223, 1, 4, 238, 237, 221, 222, 1, 4, 237, + 236, 220, 221, 1, 4, 236, 235, 219, 220, 1, 4, 235, 234, 218, 219, 1, 4, 234, 233, 217, + 218, 1, 4, 233, 232, 216, 217, 1, 4, 232, 231, 215, 216, 1, 4, 231, 230, 214, 215, 1, + 4, 230, 229, 213, 214, 1, 4, 229, 228, 212, 213, 1, 4, 228, 227, 211, 212, 1, 4, 227, + 226, 210, 211, 1, 4, 226, 225, 209, 210, 1, 4, 225, 224, 208, 209, 1, 4, 240, 255, 239, + 224, 1, 4, 255, 254, 238, 239, 1, 4, 254, 253, 237, 238, 1, 4, 253, 252, 236, 237, 1, + 4, 252, 251, 235, 236, 1, 4, 251, 250, 234, 235, 1, 4, 250, 249, 233, 234, 1, 4, 249, + 248, 232, 233, 1, 4, 248, 247, 231, 232, 1, 4, 247, 246, 230, 231, 1, 4, 246, 245, 229, + 230, 1, 4, 245, 244, 228, 229, 1, 4, 244, 243, 227, 228, 1, 4, 243, 242, 226, 227, 1, + 4, 242, 241, 225, 226, 1, 4, 241, 240, 224, 225, 1, 4, 256, 271, 255, 240, 1, 4, 271, + 270, 254, 255, 1, 4, 270, 269, 253, 254, 1, 4, 269, 268, 252, 253, 1, 4, 268, 267, 251, + 252, 1, 4, 267, 266, 250, 251, 1, 4, 266, 265, 249, 250, 1, 4, 265, 264, 248, 249, 1, + 4, 264, 263, 247, 248, 1, 4, 263, 262, 246, 247, 1, 4, 262, 261, 245, 246, 1, 4, 261, + 260, 244, 245, 1, 4, 260, 259, 243, 244, 1, 4, 259, 258, 242, 243, 1, 4, 258, 257, 241, + 242, 1, 4, 257, 256, 240, 241, 1, 4, 272, 287, 271, 256, 1, 4, 287, 286, 270, 271, 1, + 4, 286, 285, 269, 270, 1, 4, 285, 284, 268, 269, 1, 4, 284, 283, 267, 268, 1, 4, 283, + 282, 266, 267, 1, 4, 282, 281, 265, 266, 1, 4, 281, 280, 264, 265, 1, 4, 280, 279, 263, + 264, 1, 4, 279, 278, 262, 263, 1, 4, 278, 277, 261, 262, 1, 4, 277, 276, 260, 261, 1, + 4, 276, 275, 259, 260, 1, 4, 275, 274, 258, 259, 1, 4, 274, 273, 257, 258, 1, 4, 273, + 272, 256, 257, 1, 4, 288, 303, 287, 272, 1, 4, 303, 302, 286, 287, 1, 4, 302, 301, 285, + 286, 1, 4, 301, 300, 284, 285, 1, 4, 300, 299, 283, 284, 1, 4, 299, 298, 282, 283, 1, + 4, 298, 297, 281, 282, 1, 4, 297, 296, 280, 281, 1, 4, 296, 295, 279, 280, 1, 4, 295, + 294, 278, 279, 1, 4, 294, 293, 277, 278, 1, 4, 293, 292, 276, 277, 1, 4, 292, 291, 275, + 276, 1, 4, 291, 290, 274, 275, 1, 4, 290, 289, 273, 274, 1, 4, 289, 288, 272, 273, 1, + 4, 304, 319, 303, 288, 1, 4, 319, 318, 302, 303, 1, 4, 318, 317, 301, 302, 1, 4, 317, + 316, 300, 301, 1, 4, 316, 315, 299, 300, 1, 4, 315, 314, 298, 299, 1, 4, 314, 313, 297, + 298, 1, 4, 313, 312, 296, 297, 1, 4, 312, 311, 295, 296, 1, 4, 311, 310, 294, 295, 1, + 4, 310, 309, 293, 294, 1, 4, 309, 308, 292, 293, 1, 4, 308, 307, 291, 292, 1, 4, 307, + 306, 290, 291, 1, 4, 306, 305, 289, 290, 1, 4, 305, 304, 288, 289, 1, 4, 320, 335, 319, + 304, 1, 4, 335, 334, 318, 319, 1, 4, 334, 333, 317, 318, 1, 4, 333, 332, 316, 317, 1, + 4, 332, 331, 315, 316, 1, 4, 331, 330, 314, 315, 1, 4, 330, 329, 313, 314, 1, 4, 329, + 328, 312, 313, 1, 4, 328, 327, 311, 312, 1, 4, 327, 326, 310, 311, 1, 4, 326, 325, 309, + 310, 1, 4, 325, 324, 308, 309, 1, 4, 324, 323, 307, 308, 1, 4, 323, 322, 306, 307, 1, + 4, 322, 321, 305, 306, 1, 4, 321, 320, 304, 305, 1, 4, 336, 351, 335, 320, 1, 4, 351, + 350, 334, 335, 1, 4, 350, 349, 333, 334, 1, 4, 349, 348, 332, 333, 1, 4, 348, 347, 331, + 332, 1, 4, 347, 346, 330, 331, 1, 4, 346, 345, 329, 330, 1, 4, 345, 344, 328, 329, 1, + 4, 344, 343, 327, 328, 1, 4, 343, 342, 326, 327, 1, 4, 342, 341, 325, 326, 1, 4, 341, + 340, 324, 325, 1, 4, 340, 339, 323, 324, 1, 4, 339, 338, 322, 323, 1, 4, 338, 337, 321, + 322, 1, 4, 337, 336, 320, 321, 1, 4, 352, 367, 351, 336, 1, 4, 367, 366, 350, 351, 1, + 4, 366, 365, 349, 350, 1, 4, 365, 364, 348, 349, 1, 4, 364, 363, 347, 348, 1, 4, 363, + 362, 346, 347, 1, 4, 362, 361, 345, 346, 1, 4, 361, 360, 344, 345, 1, 4, 360, 359, 343, + 344, 1, 4, 359, 358, 342, 343, 1, 4, 358, 357, 341, 342, 1, 4, 357, 356, 340, 341, 1, + 4, 356, 355, 339, 340, 1, 4, 355, 354, 338, 339, 1, 4, 354, 353, 337, 338, 1, 4, 353, + 352, 336, 337, 1, 4, 368, 383, 367, 352, 1, 4, 383, 382, 366, 367, 1, 4, 382, 381, 365, + 366, 1, 4, 381, 380, 364, 365, 1, 4, 380, 379, 363, 364, 1, 4, 379, 378, 362, 363, 1, + 4, 378, 377, 361, 362, 1, 4, 377, 376, 360, 361, 1, 4, 376, 375, 359, 360, 1, 4, 375, + 374, 358, 359, 1, 4, 374, 373, 357, 358, 1, 4, 373, 372, 356, 357, 1, 4, 372, 371, 355, + 356, 1, 4, 371, 370, 354, 355, 1, 4, 370, 369, 353, 354, 1, 4, 369, 368, 352, 353, 1, + 4, 384, 399, 383, 368, 1, 4, 399, 398, 382, 383, 1, 4, 398, 397, 381, 382, 1, 4, 397, + 396, 380, 381, 1, 4, 396, 395, 379, 380, 1, 4, 395, 394, 378, 379, 1, 4, 394, 393, 377, + 378, 1, 4, 393, 392, 376, 377, 1, 4, 392, 391, 375, 376, 1, 4, 391, 390, 374, 375, 1, + 4, 390, 389, 373, 374, 1, 4, 389, 388, 372, 373, 1, 4, 388, 387, 371, 372, 1, 4, 387, + 386, 370, 371, 1, 4, 386, 385, 369, 370, 1, 4, 385, 384, 368, 369, 1, 4, 400, 415, 399, + 384, 1, 4, 415, 414, 398, 399, 1, 4, 414, 413, 397, 398, 1, 4, 413, 412, 396, 397, 1, + 4, 412, 411, 395, 396, 1, 4, 411, 410, 394, 395, 1, 4, 410, 409, 393, 394, 1, 4, 409, + 408, 392, 393, 1, 4, 408, 407, 391, 392, 1, 4, 407, 406, 390, 391, 1, 4, 406, 405, 389, + 390, 1, 4, 405, 404, 388, 389, 1, 4, 404, 403, 387, 388, 1, 4, 403, 402, 386, 387, 1, + 4, 402, 401, 385, 386, 1, 4, 401, 400, 384, 385, 1, 4, 416, 431, 415, 400, 1, 4, 431, + 430, 414, 415, 1, 4, 430, 429, 413, 414, 1, 4, 429, 428, 412, 413, 1, 4, 428, 427, 411, + 412, 1, 4, 427, 426, 410, 411, 1, 4, 426, 425, 409, 410, 1, 4, 425, 424, 408, 409, 1, + 4, 424, 423, 407, 408, 1, 4, 423, 422, 406, 407, 1, 4, 422, 421, 405, 406, 1, 4, 421, + 420, 404, 405, 1, 4, 420, 419, 403, 404, 1, 4, 419, 418, 402, 403, 1, 4, 418, 417, 401, + 402, 1, 4, 417, 416, 400, 401, 1, 4, 432, 447, 431, 416, 1, 4, 447, 446, 430, 431, 1, + 4, 446, 445, 429, 430, 1, 4, 445, 444, 428, 429, 1, 4, 444, 443, 427, 428, 1, 4, 443, + 442, 426, 427, 1, 4, 442, 441, 425, 426, 1, 4, 441, 440, 424, 425, 1, 4, 440, 439, 423, + 424, 1, 4, 439, 438, 422, 423, 1, 4, 438, 437, 421, 422, 1, 4, 437, 436, 420, 421, 1, + 4, 436, 435, 419, 420, 1, 4, 435, 434, 418, 419, 1, 4, 434, 433, 417, 418, 1, 4, 433, + 432, 416, 417, 1, 4, 448, 463, 447, 432, 1, 4, 463, 462, 446, 447, 1, 4, 462, 461, 445, + 446, 1, 4, 461, 460, 444, 445, 1, 4, 460, 459, 443, 444, 1, 4, 459, 458, 442, 443, 1, + 4, 458, 457, 441, 442, 1, 4, 457, 456, 440, 441, 1, 4, 456, 455, 439, 440, 1, 4, 455, + 454, 438, 439, 1, 4, 454, 453, 437, 438, 1, 4, 453, 452, 436, 437, 1, 4, 452, 451, 435, + 436, 1, 4, 451, 450, 434, 435, 1, 4, 450, 449, 433, 434, 1, 4, 449, 448, 432, 433, 1, + 4, 464, 479, 463, 448, 1, 4, 479, 478, 462, 463, 1, 4, 478, 477, 461, 462, 1, 4, 477, + 476, 460, 461, 1, 4, 476, 475, 459, 460, 1, 4, 475, 474, 458, 459, 1, 4, 474, 473, 457, + 458, 1, 4, 473, 472, 456, 457, 1, 4, 472, 471, 455, 456, 1, 4, 471, 470, 454, 455, 1, + 4, 470, 469, 453, 454, 1, 4, 469, 468, 452, 453, 1, 4, 468, 467, 451, 452, 1, 4, 467, + 466, 450, 451, 1, 4, 466, 465, 449, 450, 1, 4, 465, 464, 448, 449, 1, 4, 480, 495, 479, + 464, 1, 4, 495, 494, 478, 479, 1, 4, 494, 493, 477, 478, 1, 4, 493, 492, 476, 477, 1, + 4, 492, 491, 475, 476, 1, 4, 491, 490, 474, 475, 1, 4, 490, 489, 473, 474, 1, 4, 489, + 488, 472, 473, 1, 4, 488, 487, 471, 472, 1, 4, 487, 486, 470, 471, 1, 4, 486, 485, 469, + 470, 1, 4, 485, 484, 468, 469, 1, 4, 484, 483, 467, 468, 1, 4, 483, 482, 466, 467, 1, + 4, 482, 481, 465, 466, 1, 4, 481, 480, 464, 465, 1, 4, 496, 511, 495, 480, 1, 4, 511, + 510, 494, 495, 1, 4, 510, 509, 493, 494, 1, 4, 509, 508, 492, 493, 1, 4, 508, 507, 491, + 492, 1, 4, 507, 506, 490, 491, 1, 4, 506, 505, 489, 490, 1, 4, 505, 504, 488, 489, 1, + 4, 504, 503, 487, 488, 1, 4, 503, 502, 486, 487, 1, 4, 502, 501, 485, 486, 1, 4, 501, + 500, 484, 485, 1, 4, 500, 499, 483, 484, 1, 4, 499, 498, 482, 483, 1, 4, 498, 497, 481, + 482, 1, 4, 497, 496, 480, 481, 1, 4, 0, 15, 511, 496, 1, 4, 15, 14, 510, 511, 1, +4, 14, 13, 509, 510, 1, 4, 13, 12, 508, 509, 1, 4, 12, 11, 507, 508, 1, 4, 11, + 10, 506, 507, 1, 4, 10, 9, 505, 506, 1, 4, 9, 8, 504, 505, 1, 4, 8, 7, 503, + 504, 1, 4, 7, 6, 502, 503, 1, 4, 6, 5, 501, 502, 1, 4, 5, 4, 500, 501, 1, + 4, 4, 3, 499, 500, 1, 4, 3, 2, 498, 499, 1, 4, 2, 1, 497, 498, 1, 4, 1, + 0, 496, 497, 1, + 0 +}; + +struct lwo LWO_BigValve = +{ + 716, /* number of points */ + BigValve_PNTS, BigValve_normals, BigValve_POLS, 0L +}; + +static GLfloat Bolts3D_PNTS[] = +{ + (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) 0.600000, + (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) - 0.500000, + (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) 0.600000, + (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) - 0.500000, + (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) 0.600000, + (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) - 0.500000, + (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) 0.600000, + (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) - 0.500000, + (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) 0.600000, + (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) - 0.500000, + (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) 0.600000, + (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) - 0.500000, + (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) 0.600000, + (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) - 0.500000, + (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) 0.600000, + (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) - 0.500000, + (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) 0.500000, + (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) - 0.600000, + (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) - 0.600000, + (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) 0.500000, + (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) - 0.600000, + (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) 0.500000, + (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) - 0.600000, + (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) 0.500000, + (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) 0.500000, + (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) - 0.600000, + (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) 0.500000, + (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) - 0.600000, + (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) - 0.600000, + (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) 0.500000, + (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) - 0.600000, + (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) 0.500000, +}; + +static GLfloat Bolts3D_normals[] = +{ + (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 0.709703, (GLfloat) 0.704502, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.727535, (GLfloat) - 0.686070, (GLfloat) - 0.000000, + (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.681980, (GLfloat) - 0.731370, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.706289, (GLfloat) 0.707924, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 0.709703, (GLfloat) 0.704502, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.727535, (GLfloat) - 0.686070, (GLfloat) - 0.000000, + (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.681980, (GLfloat) - 0.731370, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.706289, (GLfloat) 0.707924, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, +}; + +static unsigned short int Bolts3D_POLS[] = +{ + 4, 16, 31, 14, 0, 1, 4, 31, 29, 12, 14, 1, 4, 29, 26, 10, 12, 1, 4, 26, + 24, 8, 10, 1, 4, 24, 23, 6, 8, 1, 4, 23, 21, 4, 6, 1, 4, 21, 19, 2, + 4, 1, 4, 19, 16, 0, 2, 1, 8, 14, 12, 10, 8, 6, 4, 2, 0, 1, 4, 17, + 30, 15, 1, 1, 4, 30, 28, 13, 15, 1, 4, 28, 27, 11, 13, 1, 4, 27, 25, 9, + 11, 1, 4, 25, 22, 7, 9, 1, 4, 22, 20, 5, 7, 1, 4, 20, 18, 3, 5, 1, + 4, 18, 17, 1, 3, 1, 8, 30, 17, 18, 20, 22, 25, 27, 28, 1, + 0 +}; + +struct lwo LWO_Bolts3D = +{ + 32, /* number of points */ + Bolts3D_PNTS, Bolts3D_normals, Bolts3D_POLS, 0L +}; + +static GLfloat GuageConnector_PNTS[] = +{ + (GLfloat) 0.200000, (GLfloat) 0.400000, (GLfloat) - 0.000000, + (GLfloat) 0.200000, (GLfloat) 0.800000, (GLfloat) - 0.000000, + (GLfloat) 0.193185, (GLfloat) 0.400000, (GLfloat) - 0.051764, + (GLfloat) 0.193185, (GLfloat) 0.800000, (GLfloat) - 0.051764, + (GLfloat) 0.173205, (GLfloat) 0.400000, (GLfloat) - 0.100000, + (GLfloat) 0.173205, (GLfloat) 0.800000, (GLfloat) - 0.100000, + (GLfloat) 0.141421, (GLfloat) 0.800000, (GLfloat) - 0.141421, + (GLfloat) 0.141421, (GLfloat) 0.400000, (GLfloat) - 0.141421, + (GLfloat) 0.100000, (GLfloat) 0.400000, (GLfloat) - 0.173205, + (GLfloat) 0.100000, (GLfloat) 0.800000, (GLfloat) - 0.173205, + (GLfloat) 0.051764, (GLfloat) 0.800000, (GLfloat) - 0.193185, + (GLfloat) 0.051764, (GLfloat) 0.400000, (GLfloat) - 0.193185, + (GLfloat) 0.000000, (GLfloat) 0.800000, (GLfloat) - 0.200000, + (GLfloat) 0.000000, (GLfloat) 0.400000, (GLfloat) - 0.200000, + (GLfloat) - 0.051764, (GLfloat) 0.800000, (GLfloat) - 0.193185, + (GLfloat) - 0.051764, (GLfloat) 0.400000, (GLfloat) - 0.193185, + (GLfloat) - 0.100000, (GLfloat) 0.800000, (GLfloat) - 0.173205, + (GLfloat) - 0.100000, (GLfloat) 0.400000, (GLfloat) - 0.173205, + (GLfloat) - 0.141421, (GLfloat) 0.400000, (GLfloat) - 0.141421, + (GLfloat) - 0.141421, (GLfloat) 0.800000, (GLfloat) - 0.141421, + (GLfloat) - 0.173205, (GLfloat) 0.800000, (GLfloat) - 0.100000, + (GLfloat) - 0.173205, (GLfloat) 0.400000, (GLfloat) - 0.100000, + (GLfloat) - 0.193185, (GLfloat) 0.400000, (GLfloat) - 0.051764, + (GLfloat) - 0.193185, (GLfloat) 0.800000, (GLfloat) - 0.051764, + (GLfloat) - 0.200000, (GLfloat) 0.400000, (GLfloat) - 0.000000, + (GLfloat) - 0.200000, (GLfloat) 0.800000, (GLfloat) - 0.000000, + (GLfloat) - 0.193185, (GLfloat) 0.400000, (GLfloat) 0.051764, + (GLfloat) - 0.193185, (GLfloat) 0.800000, (GLfloat) 0.051764, + (GLfloat) - 0.173205, (GLfloat) 0.400000, (GLfloat) 0.100000, + (GLfloat) - 0.173205, (GLfloat) 0.800000, (GLfloat) 0.100000, + (GLfloat) - 0.141421, (GLfloat) 0.800000, (GLfloat) 0.141421, + (GLfloat) - 0.141421, (GLfloat) 0.400000, (GLfloat) 0.141421, + (GLfloat) - 0.100000, (GLfloat) 0.800000, (GLfloat) 0.173205, + (GLfloat) - 0.100000, (GLfloat) 0.400000, (GLfloat) 0.173205, + (GLfloat) - 0.051764, (GLfloat) 0.800000, (GLfloat) 0.193185, + (GLfloat) - 0.051764, (GLfloat) 0.400000, (GLfloat) 0.193185, + (GLfloat) - 0.000000, (GLfloat) 0.800000, (GLfloat) 0.200000, + (GLfloat) - 0.000000, (GLfloat) 0.400000, (GLfloat) 0.200000, + (GLfloat) 0.051764, (GLfloat) 0.800000, (GLfloat) 0.193185, + (GLfloat) 0.051764, (GLfloat) 0.400000, (GLfloat) 0.193185, + (GLfloat) 0.100000, (GLfloat) 0.400000, (GLfloat) 0.173205, + (GLfloat) 0.100000, (GLfloat) 0.800000, (GLfloat) 0.173205, + (GLfloat) 0.141421, (GLfloat) 0.400000, (GLfloat) 0.141421, + (GLfloat) 0.141421, (GLfloat) 0.800000, (GLfloat) 0.141421, + (GLfloat) 0.173205, (GLfloat) 0.800000, (GLfloat) 0.100000, + (GLfloat) 0.173205, (GLfloat) 0.400000, (GLfloat) 0.100000, + (GLfloat) 0.193185, (GLfloat) 0.400000, (GLfloat) 0.051764, + (GLfloat) 0.193185, (GLfloat) 0.800000, (GLfloat) 0.051764, + (GLfloat) 0.200000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.193185, (GLfloat) 0.550000, (GLfloat) - 0.051764, + (GLfloat) 0.173205, (GLfloat) 0.550000, (GLfloat) - 0.100000, + (GLfloat) 0.141421, (GLfloat) 0.550000, (GLfloat) - 0.141421, + (GLfloat) 0.100000, (GLfloat) 0.550000, (GLfloat) - 0.173205, + (GLfloat) 0.051764, (GLfloat) 0.550000, (GLfloat) - 0.193185, + (GLfloat) 0.000000, (GLfloat) 0.550000, (GLfloat) - 0.200000, + (GLfloat) - 0.051764, (GLfloat) 0.550000, (GLfloat) - 0.193185, + (GLfloat) - 0.100000, (GLfloat) 0.550000, (GLfloat) - 0.173205, + (GLfloat) - 0.141421, (GLfloat) 0.550000, (GLfloat) - 0.141421, + (GLfloat) - 0.173205, (GLfloat) 0.550000, (GLfloat) - 0.100000, + (GLfloat) - 0.193185, (GLfloat) 0.550000, (GLfloat) - 0.051764, + (GLfloat) - 0.200000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) - 0.193185, (GLfloat) 0.550000, (GLfloat) 0.051764, + (GLfloat) - 0.173205, (GLfloat) 0.550000, (GLfloat) 0.100000, + (GLfloat) - 0.141421, (GLfloat) 0.550000, (GLfloat) 0.141421, + (GLfloat) - 0.100000, (GLfloat) 0.550000, (GLfloat) 0.173205, + (GLfloat) - 0.051764, (GLfloat) 0.550000, (GLfloat) 0.193185, + (GLfloat) - 0.000000, (GLfloat) 0.550000, (GLfloat) 0.200000, + (GLfloat) 0.051764, (GLfloat) 0.550000, (GLfloat) 0.193185, + (GLfloat) 0.100000, (GLfloat) 0.550000, (GLfloat) 0.173205, + (GLfloat) 0.141421, (GLfloat) 0.550000, (GLfloat) 0.141421, + (GLfloat) 0.173205, (GLfloat) 0.550000, (GLfloat) 0.100000, + (GLfloat) 0.193185, (GLfloat) 0.550000, (GLfloat) 0.051764, + (GLfloat) 0.150000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) 0.144889, (GLfloat) 0.550000, (GLfloat) - 0.038823, + (GLfloat) 0.129904, (GLfloat) 0.550000, (GLfloat) - 0.075000, + (GLfloat) 0.106066, (GLfloat) 0.550000, (GLfloat) - 0.106066, + (GLfloat) 0.075000, (GLfloat) 0.550000, (GLfloat) - 0.129904, + (GLfloat) 0.038823, (GLfloat) 0.550000, (GLfloat) - 0.144889, + (GLfloat) 0.000000, (GLfloat) 0.550000, (GLfloat) - 0.150000, + (GLfloat) - 0.038823, (GLfloat) 0.550000, (GLfloat) - 0.144889, + (GLfloat) - 0.075000, (GLfloat) 0.550000, (GLfloat) - 0.129904, + (GLfloat) - 0.106066, (GLfloat) 0.550000, (GLfloat) - 0.106066, + (GLfloat) - 0.129904, (GLfloat) 0.550000, (GLfloat) - 0.075000, + (GLfloat) - 0.144889, (GLfloat) 0.550000, (GLfloat) - 0.038823, + (GLfloat) - 0.150000, (GLfloat) 0.550000, (GLfloat) - 0.000000, + (GLfloat) - 0.144889, (GLfloat) 0.550000, (GLfloat) 0.038823, + (GLfloat) - 0.129904, (GLfloat) 0.550000, (GLfloat) 0.075000, + (GLfloat) - 0.106066, (GLfloat) 0.550000, (GLfloat) 0.106066, + (GLfloat) - 0.075000, (GLfloat) 0.550000, (GLfloat) 0.129904, + (GLfloat) - 0.038823, (GLfloat) 0.550000, (GLfloat) 0.144889, + (GLfloat) - 0.000000, (GLfloat) 0.550000, (GLfloat) 0.150000, + (GLfloat) 0.038823, (GLfloat) 0.550000, (GLfloat) 0.144889, + (GLfloat) 0.075000, (GLfloat) 0.550000, (GLfloat) 0.129904, + (GLfloat) 0.106066, (GLfloat) 0.550000, (GLfloat) 0.106066, + (GLfloat) 0.129904, (GLfloat) 0.550000, (GLfloat) 0.075000, + (GLfloat) 0.144889, (GLfloat) 0.550000, (GLfloat) 0.038823, + (GLfloat) 0.150000, (GLfloat) 0.800000, (GLfloat) - 0.000000, + (GLfloat) 0.144889, (GLfloat) 0.800000, (GLfloat) - 0.038823, + (GLfloat) 0.129904, (GLfloat) 0.800000, (GLfloat) - 0.075000, + (GLfloat) 0.106066, (GLfloat) 0.800000, (GLfloat) - 0.106066, + (GLfloat) 0.075000, (GLfloat) 0.800000, (GLfloat) - 0.129904, + (GLfloat) 0.038823, (GLfloat) 0.800000, (GLfloat) - 0.144889, + (GLfloat) 0.000000, (GLfloat) 0.800000, (GLfloat) - 0.150000, + (GLfloat) - 0.038823, (GLfloat) 0.800000, (GLfloat) - 0.144889, + (GLfloat) - 0.075000, (GLfloat) 0.800000, (GLfloat) - 0.129904, + (GLfloat) - 0.106066, (GLfloat) 0.800000, (GLfloat) - 0.106066, + (GLfloat) - 0.129904, (GLfloat) 0.800000, (GLfloat) - 0.075000, + (GLfloat) - 0.144889, (GLfloat) 0.800000, (GLfloat) - 0.038823, + (GLfloat) - 0.150000, (GLfloat) 0.800000, (GLfloat) - 0.000000, + (GLfloat) - 0.144889, (GLfloat) 0.800000, (GLfloat) 0.038823, + (GLfloat) - 0.129904, (GLfloat) 0.800000, (GLfloat) 0.075000, + (GLfloat) - 0.106066, (GLfloat) 0.800000, (GLfloat) 0.106066, + (GLfloat) - 0.075000, (GLfloat) 0.800000, (GLfloat) 0.129904, + (GLfloat) - 0.038823, (GLfloat) 0.800000, (GLfloat) 0.144889, + (GLfloat) - 0.000000, (GLfloat) 0.800000, (GLfloat) 0.150000, + (GLfloat) 0.038823, (GLfloat) 0.800000, (GLfloat) 0.144889, + (GLfloat) 0.075000, (GLfloat) 0.800000, (GLfloat) 0.129904, + (GLfloat) 0.106066, (GLfloat) 0.800000, (GLfloat) 0.106066, + (GLfloat) 0.129904, (GLfloat) 0.800000, (GLfloat) 0.075000, + (GLfloat) 0.144889, (GLfloat) 0.800000, (GLfloat) 0.038823, + (GLfloat) 0.200000, (GLfloat) 0.875988, (GLfloat) - 0.000000, + (GLfloat) 0.193185, (GLfloat) 0.872346, (GLfloat) - 0.051764, + (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.056214, + (GLfloat) 0.173205, (GLfloat) 0.865859, (GLfloat) - 0.100000, + (GLfloat) 0.141421, (GLfloat) 0.856217, (GLfloat) - 0.141421, + (GLfloat) 0.100000, (GLfloat) 0.843652, (GLfloat) - 0.173205, + (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.174222, + (GLfloat) 0.051764, (GLfloat) 0.838398, (GLfloat) - 0.193185, + (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) - 0.200000, + (GLfloat) - 0.051764, (GLfloat) 0.838398, (GLfloat) - 0.193185, + (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.174222, + (GLfloat) - 0.100000, (GLfloat) 0.843652, (GLfloat) - 0.173205, + (GLfloat) - 0.141421, (GLfloat) 0.856217, (GLfloat) - 0.141421, + (GLfloat) - 0.173205, (GLfloat) 0.865859, (GLfloat) - 0.100000, + (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.056214, + (GLfloat) - 0.193185, (GLfloat) 0.872346, (GLfloat) - 0.051764, + (GLfloat) - 0.200000, (GLfloat) 0.875988, (GLfloat) - 0.000000, + (GLfloat) - 0.193185, (GLfloat) 0.872346, (GLfloat) 0.051764, + (GLfloat) - 0.173205, (GLfloat) 0.865859, (GLfloat) 0.100000, + (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) 0.056214, + (GLfloat) - 0.141421, (GLfloat) 0.856217, (GLfloat) 0.141421, + (GLfloat) - 0.100000, (GLfloat) 0.843652, (GLfloat) 0.173205, + (GLfloat) - 0.051764, (GLfloat) 0.838398, (GLfloat) 0.193185, + (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) 0.174222, + (GLfloat) - 0.000000, (GLfloat) 0.833300, (GLfloat) 0.200000, + (GLfloat) 0.051764, (GLfloat) 0.838398, (GLfloat) 0.193185, + (GLfloat) 0.100000, (GLfloat) 0.843652, (GLfloat) 0.173205, + (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) 0.174222, + (GLfloat) 0.141421, (GLfloat) 0.856217, (GLfloat) 0.141421, + (GLfloat) 0.173205, (GLfloat) 0.865859, (GLfloat) 0.100000, + (GLfloat) 0.193185, (GLfloat) 0.872346, (GLfloat) 0.051764, + (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) 0.056214, +}; + +static GLfloat GuageConnector_normals[] = +{ + (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526, + (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382683, + (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761, + (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353, + (GLfloat) 0.382683, (GLfloat) 0.000000, (GLfloat) - 0.923880, + (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.130526, (GLfloat) - 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.382683, (GLfloat) - 0.000000, (GLfloat) - 0.923880, + (GLfloat) - 0.608761, (GLfloat) - 0.000000, (GLfloat) - 0.793353, + (GLfloat) - 0.793353, (GLfloat) - 0.000000, (GLfloat) - 0.608761, + (GLfloat) - 0.923880, (GLfloat) - 0.000000, (GLfloat) - 0.382683, + (GLfloat) - 0.991445, (GLfloat) - 0.000000, (GLfloat) - 0.130526, + (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526, + (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382683, + (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761, + (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353, + (GLfloat) - 0.382683, (GLfloat) 0.000000, (GLfloat) 0.923880, + (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.382683, (GLfloat) 0.000000, (GLfloat) 0.923880, + (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353, + (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761, + (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382683, + (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526, + (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526, + (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684, + (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761, + (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353, + (GLfloat) 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880, + (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880, + (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353, + (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761, + (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684, + (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526, + (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526, + (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382684, + (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761, + (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353, + (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) 0.923880, + (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.130526, (GLfloat) - 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.382684, (GLfloat) - 0.000000, (GLfloat) 0.923880, + (GLfloat) 0.608761, (GLfloat) - 0.000000, (GLfloat) 0.793353, + (GLfloat) 0.793353, (GLfloat) - 0.000000, (GLfloat) 0.608761, + (GLfloat) 0.923880, (GLfloat) - 0.000000, (GLfloat) 0.382684, + (GLfloat) 0.991445, (GLfloat) - 0.000000, (GLfloat) 0.130526, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526, + (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684, + (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761, + (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353, + (GLfloat) 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880, + (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445, + (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880, + (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353, + (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761, + (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684, + (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526, + (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526, + (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382684, + (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761, + (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353, + (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) 0.923880, + (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.130526, (GLfloat) - 0.000000, (GLfloat) 0.991445, + (GLfloat) 0.382684, (GLfloat) - 0.000000, (GLfloat) 0.923880, + (GLfloat) 0.608761, (GLfloat) - 0.000000, (GLfloat) 0.793353, + (GLfloat) 0.793353, (GLfloat) - 0.000000, (GLfloat) 0.608761, + (GLfloat) 0.923880, (GLfloat) - 0.000000, (GLfloat) 0.382684, + (GLfloat) 0.991445, (GLfloat) - 0.000000, (GLfloat) 0.130526, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, +}; + +static unsigned short int GuageConnector_POLS[] = +{ + 4, 1, 120, 121, 3, 1, 5, 3, 121, 122, 123, 5, 1, 4, 5, 123, 124, 6, 1, 4, +6, 124, 125, 9, 1, 5, 9, 125, 126, 127, 10, 1, 4, 10, 127, 128, 12, 1, 4, 14, + 12, 128, 129, 1, 5, 16, 14, 129, 130, 131, 1, 4, 19, 16, 131, 132, 1, 4, 20, 19, + 132, 133, 1, 5, 23, 20, 133, 134, 135, 1, 4, 25, 23, 135, 136, 1, 4, 25, 136, 137, + 27, 1, 5, 27, 137, 139, 138, 29, 1, 4, 29, 138, 140, 30, 1, 4, 30, 140, 141, 32, + 1, 5, 32, 141, 143, 142, 34, 1, 4, 34, 142, 144, 36, 1, 4, 38, 36, 144, 145, 1, + 5, 41, 38, 145, 147, 146, 1, 4, 43, 41, 146, 148, 1, 4, 44, 43, 148, 149, 1, 5, +47, 44, 149, 151, 150, 1, 4, 1, 47, 150, 120, 1, 4, 96, 97, 73, 72, 1, 4, 97, + 98, 74, 73, 1, 4, 98, 99, 75, 74, 1, 4, 99, 100, 76, 75, 1, 4, 100, 101, 77, +76, 1, 4, 101, 102, 78, 77, 1, 4, 102, 103, 79, 78, 1, 4, 103, 104, 80, 79, 1, + 4, 104, 105, 81, 80, 1, 4, 105, 106, 82, 81, 1, 4, 106, 107, 83, 82, 1, 4, 107, + 108, 84, 83, 1, 4, 108, 109, 85, 84, 1, 4, 109, 110, 86, 85, 1, 4, 110, 111, 87, +86, 1, 4, 111, 112, 88, 87, 1, 4, 112, 113, 89, 88, 1, 4, 113, 114, 90, 89, 1, + 4, 114, 115, 91, 90, 1, 4, 115, 116, 92, 91, 1, 4, 116, 117, 93, 92, 1, 4, 117, + 118, 94, 93, 1, 4, 118, 119, 95, 94, 1, 4, 119, 96, 72, 95, 1, 24, 1, 3, 5, +6, 9, 10, 12, 14, 16, 19, 20, 23, 25, 27, 29, 30, 32, 34, 36, 38, 41, 43, 44, + 47, 1, 4, 48, 49, 2, 0, 1, 4, 49, 50, 4, 2, 1, 4, 50, 51, 7, 4, 1, + 4, 51, 52, 8, 7, 1, 4, 52, 53, 11, 8, 1, 4, 53, 54, 13, 11, 1, 4, 54, + 55, 15, 13, 1, 4, 55, 56, 17, 15, 1, 4, 56, 57, 18, 17, 1, 4, 57, 58, 21, + 18, 1, 4, 58, 59, 22, 21, 1, 4, 59, 60, 24, 22, 1, 4, 60, 61, 26, 24, 1, + 4, 61, 62, 28, 26, 1, 4, 62, 63, 31, 28, 1, 4, 63, 64, 33, 31, 1, 4, 64, + 65, 35, 33, 1, 4, 65, 66, 37, 35, 1, 4, 66, 67, 39, 37, 1, 4, 67, 68, 40, + 39, 1, 4, 68, 69, 42, 40, 1, 4, 69, 70, 45, 42, 1, 4, 70, 71, 46, 45, 1, + 4, 71, 48, 0, 46, 1, 24, 48, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, + 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 1, + 0 +}; + +struct lwo LWO_GuageConnector = +{ + 152, /* number of points */ + GuageConnector_PNTS, GuageConnector_normals, GuageConnector_POLS, 0L +}; + +static GLfloat GuageDial_PNTS[] = +{ + (GLfloat) 0.000000, (GLfloat) 0.050000, (GLfloat) 0.300000, + (GLfloat) 0.019134, (GLfloat) 0.046194, (GLfloat) 0.300000, + (GLfloat) 0.035355, (GLfloat) 0.035355, (GLfloat) 0.300000, + (GLfloat) 0.046194, (GLfloat) 0.019134, (GLfloat) 0.300000, + (GLfloat) 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.300000, + (GLfloat) 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.300000, + (GLfloat) 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.275000, + (GLfloat) 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.300000, + (GLfloat) 0.019134, (GLfloat) - 0.046200, (GLfloat) 0.300000, + (GLfloat) 0.000000, (GLfloat) - 0.050000, (GLfloat) 0.300000, + (GLfloat) - 0.019134, (GLfloat) - 0.046200, (GLfloat) 0.300000, + (GLfloat) - 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.275000, + (GLfloat) - 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.300000, + (GLfloat) - 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.300000, + (GLfloat) - 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.300000, + (GLfloat) - 0.046194, (GLfloat) 0.019134, (GLfloat) 0.300000, + (GLfloat) - 0.035355, (GLfloat) 0.035355, (GLfloat) 0.300000, + (GLfloat) - 0.019134, (GLfloat) 0.046194, (GLfloat) 0.300000, + (GLfloat) 0.000000, (GLfloat) 0.050000, (GLfloat) 0.200000, + (GLfloat) 0.019134, (GLfloat) 0.046194, (GLfloat) 0.200000, + (GLfloat) 0.035355, (GLfloat) 0.035355, (GLfloat) 0.200000, + (GLfloat) 0.046194, (GLfloat) 0.019134, (GLfloat) 0.200000, + (GLfloat) 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.200000, + (GLfloat) 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.200000, + (GLfloat) 0.035355, (GLfloat) - 0.035355, (GLfloat) 0.200000, + (GLfloat) 0.019134, (GLfloat) - 0.046194, (GLfloat) 0.200000, + (GLfloat) 0.000000, (GLfloat) - 0.050000, (GLfloat) 0.200000, + (GLfloat) - 0.019134, (GLfloat) - 0.046194, (GLfloat) 0.200000, + (GLfloat) - 0.035355, (GLfloat) - 0.035355, (GLfloat) 0.200000, + (GLfloat) - 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.200000, + (GLfloat) - 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.200000, + (GLfloat) - 0.046194, (GLfloat) 0.019134, (GLfloat) 0.200000, + (GLfloat) - 0.035355, (GLfloat) 0.035355, (GLfloat) 0.200000, + (GLfloat) - 0.019134, (GLfloat) 0.046194, (GLfloat) 0.200000, + (GLfloat) 0.000000, (GLfloat) - 0.373300, (GLfloat) 0.275000, +}; + +static GLfloat GuageDial_normals[] = +{ + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.195089, (GLfloat) 0.980786, (GLfloat) 0.000000, + (GLfloat) 0.555570, (GLfloat) 0.831470, (GLfloat) 0.000000, + (GLfloat) 0.831470, (GLfloat) 0.555570, (GLfloat) 0.000000, + (GLfloat) 0.980785, (GLfloat) 0.195090, (GLfloat) 0.000000, + (GLfloat) 0.980785, (GLfloat) - 0.195090, (GLfloat) - 0.000000, + (GLfloat) 0.831470, (GLfloat) - 0.555570, (GLfloat) - 0.000248, + (GLfloat) 0.555570, (GLfloat) - 0.831470, (GLfloat) - 0.000051, + (GLfloat) 0.195089, (GLfloat) - 0.980786, (GLfloat) - 0.000000, + (GLfloat) - 0.195089, (GLfloat) - 0.980786, (GLfloat) - 0.000060, + (GLfloat) - 0.555570, (GLfloat) - 0.831470, (GLfloat) - 0.000371, + (GLfloat) - 0.831470, (GLfloat) - 0.555570, (GLfloat) - 0.000000, + (GLfloat) - 0.980785, (GLfloat) - 0.195090, (GLfloat) - 0.000000, + (GLfloat) - 0.980785, (GLfloat) 0.195090, (GLfloat) - 0.000000, + (GLfloat) - 0.831470, (GLfloat) 0.555570, (GLfloat) - 0.000000, + (GLfloat) - 0.555570, (GLfloat) 0.831470, (GLfloat) - 0.000000, + (GLfloat) - 0.195089, (GLfloat) 0.980786, (GLfloat) - 0.000000, +}; + +static unsigned short int GuageDial_POLS[] = +{ + 3, 11, 6, 34, 1, 16, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, + 16, 17, 1, 4, 18, 19, 1, 0, 1, 4, 19, 20, 2, 1, 1, 4, 20, 21, 3, 2, + 1, 4, 21, 22, 4, 3, 1, 4, 22, 23, 5, 4, 1, 4, 23, 24, 7, 5, 1, 4, + 24, 25, 8, 7, 1, 4, 25, 26, 9, 8, 1, 4, 26, 27, 10, 9, 1, 4, 27, 28, + 12, 10, 1, 4, 28, 29, 13, 12, 1, 4, 29, 30, 14, 13, 1, 4, 30, 31, 15, 14, + 1, 4, 31, 32, 16, 15, 1, 4, 32, 33, 17, 16, 1, 4, 33, 18, 0, 17, 1, + 0 +}; + +struct lwo LWO_GuageDial = +{ + 35, /* number of points */ + GuageDial_PNTS, GuageDial_normals, GuageDial_POLS, 0L +}; + +static GLfloat GuageFace_PNTS[] = +{ + (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.200000, + (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000, + (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000, + (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000, + (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000, + (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000, + (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000, + (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000, + (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000, + (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000, + (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000, + (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000, + (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000, + (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000, + (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000, + (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000, + (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.200000, + (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000, + (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000, + (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000, + (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000, + (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000, + (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000, + (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000, + (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000, + (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000, + (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000, + (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000, + (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000, + (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000, + (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000, + (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000, +}; + +static GLfloat GuageFace_normals[] = +{ + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, +}; + +static unsigned short int GuageFace_POLS[] = +{ +32, 0, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, + 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, + 0 +}; + +struct lwo LWO_GuageFace = +{ + 32, /* number of points */ + GuageFace_PNTS, GuageFace_normals, GuageFace_POLS, 0L +}; + +static GLfloat GuageHead_PNTS[] = +{ + (GLfloat) 0.000000, (GLfloat) 1.833300, (GLfloat) 0.333330, + (GLfloat) 0.097545, (GLfloat) 1.823693, (GLfloat) 0.333330, + (GLfloat) 0.191342, (GLfloat) 1.795240, (GLfloat) 0.333330, + (GLfloat) 0.277785, (GLfloat) 1.749035, (GLfloat) 0.333330, + (GLfloat) 0.353553, (GLfloat) 1.686853, (GLfloat) 0.333330, + (GLfloat) 0.415735, (GLfloat) 1.611085, (GLfloat) 0.333330, + (GLfloat) 0.461940, (GLfloat) 1.524642, (GLfloat) 0.333330, + (GLfloat) 0.490393, (GLfloat) 1.430845, (GLfloat) 0.333330, + (GLfloat) 0.500000, (GLfloat) 1.333300, (GLfloat) 0.333330, + (GLfloat) 0.490393, (GLfloat) 1.235755, (GLfloat) 0.333330, + (GLfloat) 0.461940, (GLfloat) 1.141958, (GLfloat) 0.333330, + (GLfloat) 0.415735, (GLfloat) 1.055515, (GLfloat) 0.333330, + (GLfloat) 0.353553, (GLfloat) 0.979747, (GLfloat) 0.333330, + (GLfloat) 0.277785, (GLfloat) 0.917565, (GLfloat) 0.333330, + (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) 0.333330, + (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) 0.333330, + (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) 0.333330, + (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) 0.333330, + (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) 0.333330, + (GLfloat) - 0.277785, (GLfloat) 0.917565, (GLfloat) 0.333330, + (GLfloat) - 0.353553, (GLfloat) 0.979747, (GLfloat) 0.333330, + (GLfloat) - 0.415735, (GLfloat) 1.055515, (GLfloat) 0.333330, + (GLfloat) - 0.461940, (GLfloat) 1.141958, (GLfloat) 0.333330, + (GLfloat) - 0.490393, (GLfloat) 1.235755, (GLfloat) 0.333330, + (GLfloat) - 0.500000, (GLfloat) 1.333300, (GLfloat) 0.333330, + (GLfloat) - 0.490393, (GLfloat) 1.430845, (GLfloat) 0.333330, + (GLfloat) - 0.461940, (GLfloat) 1.524642, (GLfloat) 0.333330, + (GLfloat) - 0.415735, (GLfloat) 1.611085, (GLfloat) 0.333330, + (GLfloat) - 0.353553, (GLfloat) 1.686853, (GLfloat) 0.333330, + (GLfloat) - 0.277785, (GLfloat) 1.749035, (GLfloat) 0.333330, + (GLfloat) - 0.191342, (GLfloat) 1.795240, (GLfloat) 0.333330, + (GLfloat) - 0.097545, (GLfloat) 1.823693, (GLfloat) 0.333330, + (GLfloat) 0.000000, (GLfloat) 1.833300, (GLfloat) - 0.333330, + (GLfloat) 0.097545, (GLfloat) 1.823693, (GLfloat) - 0.333330, + (GLfloat) 0.191342, (GLfloat) 1.795240, (GLfloat) - 0.333330, + (GLfloat) 0.277785, (GLfloat) 1.749035, (GLfloat) - 0.333330, + (GLfloat) 0.353553, (GLfloat) 1.686853, (GLfloat) - 0.333330, + (GLfloat) 0.415735, (GLfloat) 1.611085, (GLfloat) - 0.333330, + (GLfloat) 0.461940, (GLfloat) 1.524642, (GLfloat) - 0.333330, + (GLfloat) 0.490393, (GLfloat) 1.430845, (GLfloat) - 0.333330, + (GLfloat) 0.500000, (GLfloat) 1.333300, (GLfloat) - 0.333330, + (GLfloat) 0.490393, (GLfloat) 1.235755, (GLfloat) - 0.333330, + (GLfloat) 0.461940, (GLfloat) 1.141958, (GLfloat) - 0.333330, + (GLfloat) 0.415735, (GLfloat) 1.055515, (GLfloat) - 0.333330, + (GLfloat) 0.353553, (GLfloat) 0.979747, (GLfloat) - 0.333330, + (GLfloat) 0.277785, (GLfloat) 0.917565, (GLfloat) - 0.333330, + (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.333330, + (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.333330, + (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) - 0.333330, + (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.333330, + (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.333330, + (GLfloat) - 0.277785, (GLfloat) 0.917565, (GLfloat) - 0.333330, + (GLfloat) - 0.353553, (GLfloat) 0.979747, (GLfloat) - 0.333330, + (GLfloat) - 0.415735, (GLfloat) 1.055515, (GLfloat) - 0.333330, + (GLfloat) - 0.461940, (GLfloat) 1.141958, (GLfloat) - 0.333330, + (GLfloat) - 0.490393, (GLfloat) 1.235755, (GLfloat) - 0.333330, + (GLfloat) - 0.500000, (GLfloat) 1.333300, (GLfloat) - 0.333330, + (GLfloat) - 0.490393, (GLfloat) 1.430845, (GLfloat) - 0.333330, + (GLfloat) - 0.461940, (GLfloat) 1.524642, (GLfloat) - 0.333330, + (GLfloat) - 0.415735, (GLfloat) 1.611085, (GLfloat) - 0.333330, + (GLfloat) - 0.353553, (GLfloat) 1.686853, (GLfloat) - 0.333330, + (GLfloat) - 0.277785, (GLfloat) 1.749035, (GLfloat) - 0.333330, + (GLfloat) - 0.191342, (GLfloat) 1.795240, (GLfloat) - 0.333330, + (GLfloat) - 0.097545, (GLfloat) 1.823693, (GLfloat) - 0.333330, + (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.333330, + (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.333330, + (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.333330, + (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.333330, + (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.333330, + (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.333330, + (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.333330, + (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.333330, + (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.333330, + (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.333330, + (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.333330, + (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.333330, + (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.333330, + (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.333330, + (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.333330, + (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.333330, + (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.333330, + (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.333330, + (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.333330, + (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.333330, + (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.333330, + (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.333330, + (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.333330, + (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.333330, + (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.333330, + (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.333330, + (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.333330, + (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.333330, + (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.333330, + (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.333330, + (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.333330, + (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.333330, + (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.200000, + (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000, + (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000, + (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000, + (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000, + (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000, + (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000, + (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000, + (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000, + (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000, + (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000, + (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000, + (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000, + (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000, + (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000, + (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000, + (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.200000, + (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000, + (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000, + (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000, + (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000, + (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000, + (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000, + (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000, + (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000, + (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000, + (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000, + (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000, + (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000, + (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000, + (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000, + (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000, +}; + +static GLfloat GuageHead_normals[] = +{ + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000, + (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000, + (GLfloat) 0.956940, (GLfloat) 0.290284, (GLfloat) 0.000000, + (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000, + (GLfloat) 0.773011, (GLfloat) 0.634393, (GLfloat) 0.000000, + (GLfloat) 0.634393, (GLfloat) 0.773011, (GLfloat) 0.000000, + (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000, + (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000, + (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000, + (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) 0.773011, (GLfloat) - 0.000000, + (GLfloat) - 0.773011, (GLfloat) 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) 0.290284, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) - 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000, + (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000, + (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000, + (GLfloat) 0.634393, (GLfloat) 0.773011, (GLfloat) 0.000000, + (GLfloat) 0.773011, (GLfloat) 0.634393, (GLfloat) 0.000000, + (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000, + (GLfloat) 0.956940, (GLfloat) 0.290284, (GLfloat) 0.000000, + (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000, + (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000, + (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) 0.471396, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.471396, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) - 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) 0.290284, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.773011, (GLfloat) 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) 0.773011, (GLfloat) - 0.000000, + (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, +}; + +static unsigned short int GuageHead_POLS[] = +{ + 3, 67, 3, 4, 1, 3, 68, 67, 4, 1, 3, 68, 4, 5, 1, 3, 69, 68, 5, 1, + 3, 70, 69, 5, 1, 3, 70, 5, 6, 1, 3, 70, 6, 7, 1, 3, 71, 70, 7, 1, + 3, 71, 7, 8, 1, 3, 72, 71, 8, 1, 3, 73, 72, 8, 1, 3, 73, 8, 9, 1, + 3, 74, 73, 9, 1, 3, 74, 9, 10, 1, 3, 74, 10, 11, 1, 3, 75, 74, 11, 1, + 3, 76, 75, 11, 1, 3, 76, 11, 12, 1, 3, 76, 12, 13, 1, 3, 77, 76, 13, 1, + 3, 78, 77, 13, 1, 3, 78, 13, 14, 1, 3, 78, 14, 15, 1, 3, 79, 78, 15, 1, + 3, 79, 15, 16, 1, 3, 80, 79, 16, 1, 3, 81, 80, 16, 1, 3, 81, 16, 17, 1, + 3, 82, 81, 17, 1, 3, 82, 17, 18, 1, 3, 82, 18, 19, 1, 3, 83, 82, 19, 1, + 3, 84, 83, 19, 1, 3, 84, 19, 20, 1, 3, 84, 20, 21, 1, 3, 85, 84, 21, 1, + 3, 86, 85, 21, 1, 3, 86, 21, 22, 1, 3, 86, 22, 23, 1, 3, 87, 86, 23, 1, + 3, 87, 23, 24, 1, 3, 88, 87, 24, 1, 3, 89, 88, 24, 1, 3, 89, 24, 25, 1, + 3, 90, 89, 25, 1, 3, 90, 25, 26, 1, 3, 90, 26, 27, 1, 3, 91, 90, 27, 1, + 3, 92, 91, 27, 1, 3, 92, 27, 28, 1, 3, 93, 92, 28, 1, 3, 93, 28, 29, 1, + 3, 2, 3, 67, 1, 3, 2, 67, 66, 1, 3, 1, 2, 66, 1, 3, 1, 66, 64, 1, + 3, 1, 64, 65, 1, 3, 0, 1, 65, 1, 3, 31, 0, 65, 1, 3, 31, 65, 95, 1, + 3, 31, 95, 94, 1, 3, 30, 31, 94, 1, 3, 30, 94, 93, 1, 3, 93, 29, 30, 1, + 4, 96, 97, 95, 65, 1, 4, 97, 98, 94, 95, 1, 4, 98, 99, 93, 94, 1, 4, 99, + 100, 92, 93, 1, 4, 100, 101, 91, 92, 1, 4, 101, 102, 90, 91, 1, 4, 102, 103, 89, +90, 1, 4, 103, 104, 88, 89, 1, 4, 104, 105, 87, 88, 1, 4, 105, 106, 86, 87, 1, + 4, 106, 107, 85, 86, 1, 4, 107, 108, 84, 85, 1, 4, 108, 109, 83, 84, 1, 4, 109, + 110, 82, 83, 1, 4, 110, 111, 81, 82, 1, 4, 111, 112, 80, 81, 1, 4, 112, 113, 79, +80, 1, 4, 113, 114, 78, 79, 1, 4, 114, 115, 77, 78, 1, 4, 115, 116, 76, 77, 1, + 4, 116, 117, 75, 76, 1, 4, 117, 118, 74, 75, 1, 4, 118, 119, 73, 74, 1, 4, 119, + 120, 72, 73, 1, 4, 120, 121, 71, 72, 1, 4, 121, 122, 70, 71, 1, 4, 122, 123, 69, +70, 1, 4, 123, 124, 68, 69, 1, 4, 124, 125, 67, 68, 1, 4, 125, 126, 66, 67, 1, + 4, 126, 127, 64, 66, 1, 4, 127, 96, 65, 64, 1, 4, 32, 33, 1, 0, 1, 4, 33, + 34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36, 37, 5, + 4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8, 7, 1, + 4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1, 4, 43, + 44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46, 47, 15, + 14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18, 17, 1, + 4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1, 4, 53, + 54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56, 57, 25, + 24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28, 27, 1, + 4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1, 4, 63, +32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, + 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1, + 0 +}; + +struct lwo LWO_GuageHead = +{ + 128, /* number of points */ + GuageHead_PNTS, GuageHead_normals, GuageHead_POLS, 0L +}; + +static GLfloat PipeBetweenBolts_PNTS[] = +{ + (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) 0.500000, + (GLfloat) 0.129410, (GLfloat) 0.482963, (GLfloat) 0.500000, + (GLfloat) 0.250000, (GLfloat) 0.433013, (GLfloat) 0.500000, + (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) 0.500000, + (GLfloat) 0.433013, (GLfloat) 0.250000, (GLfloat) 0.500000, + (GLfloat) 0.482963, (GLfloat) 0.129410, (GLfloat) 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.500000, + (GLfloat) 0.482963, (GLfloat) - 0.129410, (GLfloat) 0.500000, + (GLfloat) 0.433013, (GLfloat) - 0.250000, (GLfloat) 0.500000, + (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) 0.500000, + (GLfloat) 0.250000, (GLfloat) - 0.433013, (GLfloat) 0.500000, + (GLfloat) 0.129410, (GLfloat) - 0.482963, (GLfloat) 0.500000, + (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) 0.500000, + (GLfloat) - 0.129410, (GLfloat) - 0.482963, (GLfloat) 0.500000, + (GLfloat) - 0.250000, (GLfloat) - 0.433013, (GLfloat) 0.500000, + (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) 0.500000, + (GLfloat) - 0.433013, (GLfloat) - 0.250000, (GLfloat) 0.500000, + (GLfloat) - 0.482963, (GLfloat) - 0.129410, (GLfloat) 0.500000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) 0.500000, + (GLfloat) - 0.482963, (GLfloat) 0.129410, (GLfloat) 0.500000, + (GLfloat) - 0.433013, (GLfloat) 0.250000, (GLfloat) 0.500000, + (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) 0.500000, + (GLfloat) - 0.250000, (GLfloat) 0.433013, (GLfloat) 0.500000, + (GLfloat) - 0.129410, (GLfloat) 0.482963, (GLfloat) 0.500000, + (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.500000, + (GLfloat) 0.129410, (GLfloat) 0.482963, (GLfloat) - 0.500000, + (GLfloat) 0.250000, (GLfloat) 0.433013, (GLfloat) - 0.500000, + (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.500000, + (GLfloat) 0.433013, (GLfloat) 0.250000, (GLfloat) - 0.500000, + (GLfloat) 0.482963, (GLfloat) 0.129410, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.500000, + (GLfloat) 0.482963, (GLfloat) - 0.129410, (GLfloat) - 0.500000, + (GLfloat) 0.433013, (GLfloat) - 0.250000, (GLfloat) - 0.500000, + (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.500000, + (GLfloat) 0.250000, (GLfloat) - 0.433013, (GLfloat) - 0.500000, + (GLfloat) 0.129410, (GLfloat) - 0.482963, (GLfloat) - 0.500000, + (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.500000, + (GLfloat) - 0.129410, (GLfloat) - 0.482963, (GLfloat) - 0.500000, + (GLfloat) - 0.250000, (GLfloat) - 0.433013, (GLfloat) - 0.500000, + (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.500000, + (GLfloat) - 0.433013, (GLfloat) - 0.250000, (GLfloat) - 0.500000, + (GLfloat) - 0.482963, (GLfloat) - 0.129410, (GLfloat) - 0.500000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.500000, + (GLfloat) - 0.482963, (GLfloat) 0.129410, (GLfloat) - 0.500000, + (GLfloat) - 0.433013, (GLfloat) 0.250000, (GLfloat) - 0.500000, + (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.500000, + (GLfloat) - 0.250000, (GLfloat) 0.433013, (GLfloat) - 0.500000, + (GLfloat) - 0.129410, (GLfloat) 0.482963, (GLfloat) - 0.500000, +}; + +static GLfloat PipeBetweenBolts_normals[] = +{ + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.130526, (GLfloat) 0.991445, (GLfloat) 0.000000, + (GLfloat) 0.382683, (GLfloat) 0.923880, (GLfloat) 0.000000, + (GLfloat) 0.608761, (GLfloat) 0.793353, (GLfloat) 0.000000, + (GLfloat) 0.793353, (GLfloat) 0.608761, (GLfloat) 0.000000, + (GLfloat) 0.923880, (GLfloat) 0.382683, (GLfloat) 0.000000, + (GLfloat) 0.991445, (GLfloat) 0.130526, (GLfloat) 0.000000, + (GLfloat) 0.991445, (GLfloat) - 0.130526, (GLfloat) - 0.000000, + (GLfloat) 0.923880, (GLfloat) - 0.382683, (GLfloat) - 0.000000, + (GLfloat) 0.793353, (GLfloat) - 0.608761, (GLfloat) - 0.000000, + (GLfloat) 0.608761, (GLfloat) - 0.793353, (GLfloat) - 0.000000, + (GLfloat) 0.382683, (GLfloat) - 0.923880, (GLfloat) - 0.000000, + (GLfloat) 0.130526, (GLfloat) - 0.991445, (GLfloat) - 0.000000, + (GLfloat) - 0.130526, (GLfloat) - 0.991445, (GLfloat) - 0.000000, + (GLfloat) - 0.382683, (GLfloat) - 0.923880, (GLfloat) - 0.000000, + (GLfloat) - 0.608761, (GLfloat) - 0.793353, (GLfloat) - 0.000000, + (GLfloat) - 0.793353, (GLfloat) - 0.608761, (GLfloat) - 0.000000, + (GLfloat) - 0.923880, (GLfloat) - 0.382683, (GLfloat) - 0.000000, + (GLfloat) - 0.991445, (GLfloat) - 0.130526, (GLfloat) - 0.000000, + (GLfloat) - 0.991445, (GLfloat) 0.130526, (GLfloat) - 0.000000, + (GLfloat) - 0.923880, (GLfloat) 0.382683, (GLfloat) - 0.000000, + (GLfloat) - 0.793353, (GLfloat) 0.608761, (GLfloat) - 0.000000, + (GLfloat) - 0.608761, (GLfloat) 0.793353, (GLfloat) - 0.000000, + (GLfloat) - 0.382683, (GLfloat) 0.923880, (GLfloat) - 0.000000, + (GLfloat) - 0.130526, (GLfloat) 0.991445, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, +}; + +static unsigned short int PipeBetweenBolts_POLS[] = +{ + 24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 1, 4, 24, 25, 1, 0, 1, 4, 25, 26, 2, 1, 1, 4, 26, + 27, 3, 2, 1, 4, 27, 28, 4, 3, 1, 4, 28, 29, 5, 4, 1, 4, 29, 30, 6, + 5, 1, 4, 30, 31, 7, 6, 1, 4, 31, 32, 8, 7, 1, 4, 32, 33, 9, 8, 1, + 4, 33, 34, 10, 9, 1, 4, 34, 35, 11, 10, 1, 4, 35, 36, 12, 11, 1, 4, 36, + 37, 13, 12, 1, 4, 37, 38, 14, 13, 1, 4, 38, 39, 15, 14, 1, 4, 39, 40, 16, + 15, 1, 4, 40, 41, 17, 16, 1, 4, 41, 42, 18, 17, 1, 4, 42, 43, 19, 18, 1, + 4, 43, 44, 20, 19, 1, 4, 44, 45, 21, 20, 1, 4, 45, 46, 22, 21, 1, 4, 46, + 47, 23, 22, 1, 4, 47, 24, 0, 23, 1, 24, 24, 47, 46, 45, 44, 43, 42, 41, 40, + 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 1, + 0 +}; + +struct lwo LWO_PipeBetweenBolts = +{ + 48, /* number of points */ + PipeBetweenBolts_PNTS, PipeBetweenBolts_normals, PipeBetweenBolts_POLS, 0L +}; + +static GLfloat ElbowBolts_PNTS[] = +{ + (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.403061, + (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.600000, + (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.600000, + (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.333061, + (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.600000, + (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.298061, + (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.600000, + (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.333061, + (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.600000, + (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.438061, + (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.600000, + (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.403061, + (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.660000, + (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.333061, + (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.660000, + (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.660000, + (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.298061, + (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.333061, + (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.660000, + (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.660000, + (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.438061, + (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.660000, + (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.403061, + (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.333061, + (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.460000, + (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.298061, + (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.460000, + (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.333061, + (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.460000, + (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.438061, + (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.520000, + (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.403061, + (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.333061, + (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.520000, + (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.520000, + (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.298061, + (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.520000, + (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.333061, + (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.520000, + (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.438061, + (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.520000, + (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.460000, + (GLfloat) 0.485622, (GLfloat) - 0.460000, (GLfloat) 0.035000, + (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.460000, + (GLfloat) 0.425000, (GLfloat) - 0.460000, (GLfloat) 0.070000, + (GLfloat) 0.364378, (GLfloat) - 0.460000, (GLfloat) 0.035000, + (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.460000, + (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.460000, + (GLfloat) 0.364378, (GLfloat) - 0.460000, (GLfloat) - 0.035000, + (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.460000, + (GLfloat) 0.425000, (GLfloat) - 0.460000, (GLfloat) - 0.070000, + (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.460000, + (GLfloat) 0.485622, (GLfloat) - 0.460000, (GLfloat) - 0.035000, + (GLfloat) 0.485622, (GLfloat) - 0.520000, (GLfloat) 0.035000, + (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.520000, + (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.520000, + (GLfloat) 0.425000, (GLfloat) - 0.520000, (GLfloat) 0.070000, + (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.520000, + (GLfloat) 0.364378, (GLfloat) - 0.520000, (GLfloat) 0.035000, + (GLfloat) 0.364378, (GLfloat) - 0.520000, (GLfloat) - 0.035000, + (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.520000, + (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.520000, + (GLfloat) 0.425000, (GLfloat) - 0.520000, (GLfloat) - 0.070000, + (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.520000, + (GLfloat) 0.485622, (GLfloat) - 0.520000, (GLfloat) - 0.035000, + (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.600000, + (GLfloat) 0.485622, (GLfloat) - 0.600000, (GLfloat) 0.035000, + (GLfloat) 0.425000, (GLfloat) - 0.600000, (GLfloat) 0.070000, + (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.600000, + (GLfloat) 0.364378, (GLfloat) - 0.600000, (GLfloat) 0.035000, + (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.600000, + (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.600000, + (GLfloat) 0.364378, (GLfloat) - 0.600000, (GLfloat) - 0.035000, + (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.600000, + (GLfloat) 0.425000, (GLfloat) - 0.600000, (GLfloat) - 0.070000, + (GLfloat) 0.485622, (GLfloat) - 0.600000, (GLfloat) - 0.035000, + (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.600000, + (GLfloat) 0.485622, (GLfloat) - 0.660000, (GLfloat) 0.035000, + (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.660000, + (GLfloat) 0.425000, (GLfloat) - 0.660000, (GLfloat) 0.070000, + (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.660000, + (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.660000, + (GLfloat) 0.364378, (GLfloat) - 0.660000, (GLfloat) 0.035000, + (GLfloat) 0.364378, (GLfloat) - 0.660000, (GLfloat) - 0.035000, + (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.660000, + (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.660000, + (GLfloat) 0.425000, (GLfloat) - 0.660000, (GLfloat) - 0.070000, + (GLfloat) 0.485622, (GLfloat) - 0.660000, (GLfloat) - 0.035000, + (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.660000, + (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.460000, + (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.438061, + (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.460000, + (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.403061, + (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.333061, + (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.460000, + (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.298061, + (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.333061, + (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.460000, + (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.438061, + (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.520000, + (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.520000, + (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.403061, + (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.520000, + (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.333061, + (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.520000, + (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.298061, + (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.520000, + (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.333061, + (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.520000, + (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.403061, + (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.600000, + (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.438061, + (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.600000, + (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.403061, + (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.333061, + (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.600000, + (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.600000, + (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.298061, + (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.600000, + (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.333061, + (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.403061, + (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.600000, + (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.438061, + (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.660000, + (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.660000, + (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.403061, + (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.660000, + (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.333061, + (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.298061, + (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.660000, + (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.333061, + (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.660000, + (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.403061, + (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.403061, + (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.460000, + (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.333061, + (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.460000, + (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.460000, + (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.298061, + (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.460000, + (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.333061, + (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.460000, + (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.403061, + (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.438061, + (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.460000, + (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.403061, + (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.520000, + (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.520000, + (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.333061, + (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.298061, + (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.520000, + (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.520000, + (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.333061, + (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.403061, + (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.520000, + (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.438061, + (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.520000, + (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.403061, + (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.600000, + (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.333061, + (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.600000, + (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.298061, + (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.600000, + (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.600000, + (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.333061, + (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.403061, + (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.600000, + (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.600000, + (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.438061, + (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.403061, + (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.333061, + (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.660000, + (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.298061, + (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.333061, + (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.660000, + (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.403061, + (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.660000, + (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.660000, + (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.438061, + (GLfloat) - 0.485622, (GLfloat) - 0.460000, (GLfloat) - 0.035000, + (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.460000, + (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.460000, + (GLfloat) - 0.425000, (GLfloat) - 0.460000, (GLfloat) - 0.070000, + (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.460000, + (GLfloat) - 0.364378, (GLfloat) - 0.460000, (GLfloat) - 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.460000, (GLfloat) 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.460000, + (GLfloat) - 0.425000, (GLfloat) - 0.460000, (GLfloat) 0.070000, + (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.460000, + (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.460000, + (GLfloat) - 0.485622, (GLfloat) - 0.460000, (GLfloat) 0.035000, + (GLfloat) - 0.485622, (GLfloat) - 0.520000, (GLfloat) - 0.035000, + (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.520000, + (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.520000, + (GLfloat) - 0.425000, (GLfloat) - 0.520000, (GLfloat) - 0.070000, + (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.520000, + (GLfloat) - 0.364378, (GLfloat) - 0.520000, (GLfloat) - 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.520000, + (GLfloat) - 0.364378, (GLfloat) - 0.520000, (GLfloat) 0.035000, + (GLfloat) - 0.425000, (GLfloat) - 0.520000, (GLfloat) 0.070000, + (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.520000, + (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.520000, + (GLfloat) - 0.485622, (GLfloat) - 0.520000, (GLfloat) 0.035000, + (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.600000, + (GLfloat) - 0.485622, (GLfloat) - 0.600000, (GLfloat) - 0.035000, + (GLfloat) - 0.425000, (GLfloat) - 0.600000, (GLfloat) - 0.070000, + (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.600000, + (GLfloat) - 0.364378, (GLfloat) - 0.600000, (GLfloat) - 0.035000, + (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.600000, + (GLfloat) - 0.364378, (GLfloat) - 0.600000, (GLfloat) 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.600000, + (GLfloat) - 0.425000, (GLfloat) - 0.600000, (GLfloat) 0.070000, + (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.600000, + (GLfloat) - 0.485622, (GLfloat) - 0.600000, (GLfloat) 0.035000, + (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.600000, + (GLfloat) - 0.485622, (GLfloat) - 0.660000, (GLfloat) - 0.035000, + (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.660000, + (GLfloat) - 0.425000, (GLfloat) - 0.660000, (GLfloat) - 0.070000, + (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.660000, + (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.660000, + (GLfloat) - 0.364378, (GLfloat) - 0.660000, (GLfloat) - 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.660000, (GLfloat) 0.035000, + (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.660000, + (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.660000, + (GLfloat) - 0.425000, (GLfloat) - 0.660000, (GLfloat) 0.070000, + (GLfloat) - 0.485622, (GLfloat) - 0.660000, (GLfloat) 0.035000, + (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.660000, + (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.438061, + (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.460000, + (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.460000, + (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.403061, + (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.333061, + (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.460000, + (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.460000, + (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.298061, + (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.460000, + (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.333061, + (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.403061, + (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.460000, + (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.438061, + (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.520000, + (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.520000, + (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.403061, + (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.333061, + (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.520000, + (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.520000, + (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.298061, + (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.520000, + (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.333061, + (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.520000, + (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.403061, + (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.600000, + (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.438061, + (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.403061, + (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.600000, + (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.600000, + (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.333061, + (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.298061, + (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.600000, + (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.333061, + (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.600000, + (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.403061, + (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.600000, + (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.438061, + (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.660000, + (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.403061, + (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.660000, + (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.333061, + (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.660000, + (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.298061, + (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.333061, + (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.660000, + (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.403061, +}; + +static GLfloat ElbowBolts_normals[] = +{ + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.500000, (GLfloat) 0.866026, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.499999, (GLfloat) 0.866026, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) - 0.499999, (GLfloat) - 0.866026, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000, + (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866026, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 0.499999, (GLfloat) 0.000000, (GLfloat) - 0.866026, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.499999, (GLfloat) 0.000000, (GLfloat) 0.866026, + (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000, + (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026, + (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025, + (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025, + (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, +}; + +static unsigned short int ElbowBolts_POLS[] = +{ + 6, 241, 242, 245, 246, 248, 251, 1, 4, 253, 254, 242, 241, 1, 4, 254, 257, 245, 242, 1, + 4, 257, 258, 246, 245, 1, 4, 258, 260, 248, 246, 1, 4, 260, 262, 251, 248, 1, 4, 262, + 253, 241, 251, 1, 6, 253, 262, 260, 258, 257, 254, 1, 6, 264, 267, 268, 271, 273, 275, 1, + 4, 277, 279, 267, 264, 1, 4, 279, 281, 268, 267, 1, 4, 281, 283, 271, 268, 1, 4, 283, + 285, 273, 271, 1, 4, 285, 286, 275, 273, 1, 4, 286, 277, 264, 275, 1, 6, 277, 286, 285, + 283, 281, 279, 1, 6, 193, 194, 196, 199, 201, 202, 1, 4, 205, 206, 194, 193, 1, 4, 206, + 208, 196, 194, 1, 4, 208, 210, 199, 196, 1, 4, 210, 213, 201, 199, 1, 4, 213, 214, 202, + 201, 1, 4, 214, 205, 193, 202, 1, 6, 205, 214, 213, 210, 208, 206, 1, 6, 216, 219, 221, + 223, 225, 227, 1, 4, 229, 231, 219, 216, 1, 4, 231, 232, 221, 219, 1, 4, 232, 235, 223, + 221, 1, 4, 235, 236, 225, 223, 1, 4, 236, 239, 227, 225, 1, 4, 239, 229, 216, 227, 1, + 6, 229, 239, 236, 235, 232, 231, 1, 6, 145, 147, 148, 150, 152, 155, 1, 4, 157, 158, 147, + 145, 1, 4, 158, 161, 148, 147, 1, 4, 161, 162, 150, 148, 1, 4, 162, 165, 152, 150, 1, + 4, 165, 167, 155, 152, 1, 4, 167, 157, 145, 155, 1, 6, 157, 167, 165, 162, 161, 158, 1, + 6, 169, 171, 173, 174, 177, 178, 1, 4, 181, 182, 171, 169, 1, 4, 182, 184, 173, 171, 1, + 4, 184, 187, 174, 173, 1, 4, 187, 189, 177, 174, 1, 4, 189, 190, 178, 177, 1, 4, 190, + 181, 169, 178, 1, 6, 181, 190, 189, 187, 184, 182, 1, 6, 96, 98, 101, 103, 105, 106, 1, + 4, 109, 110, 98, 96, 1, 4, 110, 112, 101, 98, 1, 4, 112, 114, 103, 101, 1, 4, 114, + 116, 105, 103, 1, 4, 116, 118, 106, 105, 1, 4, 118, 109, 96, 106, 1, 6, 109, 118, 116, + 114, 112, 110, 1, 6, 120, 122, 125, 126, 128, 131, 1, 4, 133, 134, 122, 120, 1, 4, 134, + 136, 125, 122, 1, 4, 136, 139, 126, 125, 1, 4, 139, 141, 128, 126, 1, 4, 141, 143, 131, + 128, 1, 4, 143, 133, 120, 131, 1, 6, 133, 143, 141, 139, 136, 134, 1, 6, 48, 50, 53, + 54, 56, 58, 1, 4, 61, 62, 50, 48, 1, 4, 62, 64, 53, 50, 1, 4, 64, 67, 54, + 53, 1, 4, 67, 68, 56, 54, 1, 4, 68, 70, 58, 56, 1, 4, 70, 61, 48, 58, 1, + 6, 61, 70, 68, 67, 64, 62, 1, 6, 72, 75, 77, 78, 80, 83, 1, 4, 85, 87, 75, + 72, 1, 4, 87, 88, 77, 75, 1, 4, 88, 91, 78, 77, 1, 4, 91, 92, 80, 78, 1, + 4, 92, 95, 83, 80, 1, 4, 95, 85, 72, 83, 1, 6, 85, 95, 92, 91, 88, 87, 1, + 6, 24, 26, 28, 30, 32, 35, 1, 4, 36, 39, 26, 24, 1, 4, 39, 40, 28, 26, 1, + 4, 40, 42, 30, 28, 1, 4, 42, 44, 32, 30, 1, 4, 44, 47, 35, 32, 1, 4, 47, + 36, 24, 35, 1, 6, 36, 47, 44, 42, 40, 39, 1, 6, 1, 2, 4, 6, 8, 11, 1, + 4, 13, 15, 2, 1, 1, 4, 15, 16, 4, 2, 1, 4, 16, 19, 6, 4, 1, 4, 19, + 20, 8, 6, 1, 4, 20, 23, 11, 8, 1, 4, 23, 13, 1, 11, 1, 6, 13, 23, 20, + 19, 16, 15, 1, 6, 240, 243, 244, 247, 249, 250, 1, 4, 252, 255, 243, 240, 1, 4, 255, + 256, 244, 243, 1, 4, 256, 259, 247, 244, 1, 4, 259, 261, 249, 247, 1, 4, 261, 263, 250, + 249, 1, 4, 263, 252, 240, 250, 1, 6, 252, 263, 261, 259, 256, 255, 1, 6, 265, 266, 269, + 270, 272, 274, 1, 4, 276, 278, 266, 265, 1, 4, 278, 280, 269, 266, 1, 4, 280, 282, 270, + 269, 1, 4, 282, 284, 272, 270, 1, 4, 284, 287, 274, 272, 1, 4, 287, 276, 265, 274, 1, + 6, 276, 287, 284, 282, 280, 278, 1, 6, 192, 195, 197, 198, 200, 203, 1, 4, 204, 207, 195, + 192, 1, 4, 207, 209, 197, 195, 1, 4, 209, 211, 198, 197, 1, 4, 211, 212, 200, 198, 1, + 4, 212, 215, 203, 200, 1, 4, 215, 204, 192, 203, 1, 6, 204, 215, 212, 211, 209, 207, 1, + 6, 217, 218, 220, 222, 224, 226, 1, 4, 228, 230, 218, 217, 1, 4, 230, 233, 220, 218, 1, + 4, 233, 234, 222, 220, 1, 4, 234, 237, 224, 222, 1, 4, 237, 238, 226, 224, 1, 4, 238, + 228, 217, 226, 1, 6, 228, 238, 237, 234, 233, 230, 1, 6, 144, 146, 149, 151, 153, 154, 1, + 4, 156, 159, 146, 144, 1, 4, 159, 160, 149, 146, 1, 4, 160, 163, 151, 149, 1, 4, 163, + 164, 153, 151, 1, 4, 164, 166, 154, 153, 1, 4, 166, 156, 144, 154, 1, 6, 156, 166, 164, + 163, 160, 159, 1, 6, 168, 170, 172, 175, 176, 179, 1, 4, 180, 183, 170, 168, 1, 4, 183, + 185, 172, 170, 1, 4, 185, 186, 175, 172, 1, 4, 186, 188, 176, 175, 1, 4, 188, 191, 179, + 176, 1, 4, 191, 180, 168, 179, 1, 6, 180, 191, 188, 186, 185, 183, 1, 6, 97, 99, 100, + 102, 104, 107, 1, 4, 108, 111, 99, 97, 1, 4, 111, 113, 100, 99, 1, 4, 113, 115, 102, + 100, 1, 4, 115, 117, 104, 102, 1, 4, 117, 119, 107, 104, 1, 4, 119, 108, 97, 107, 1, + 6, 108, 119, 117, 115, 113, 111, 1, 6, 121, 123, 124, 127, 129, 130, 1, 4, 132, 135, 123, + 121, 1, 4, 135, 137, 124, 123, 1, 4, 137, 138, 127, 124, 1, 4, 138, 140, 129, 127, 1, + 4, 140, 142, 130, 129, 1, 4, 142, 132, 121, 130, 1, 6, 132, 142, 140, 138, 137, 135, 1, + 6, 49, 51, 52, 55, 57, 59, 1, 4, 60, 63, 51, 49, 1, 4, 63, 65, 52, 51, 1, + 4, 65, 66, 55, 52, 1, 4, 66, 69, 57, 55, 1, 4, 69, 71, 59, 57, 1, 4, 71, + 60, 49, 59, 1, 6, 60, 71, 69, 66, 65, 63, 1, 6, 73, 74, 76, 79, 81, 82, 1, + 4, 84, 86, 74, 73, 1, 4, 86, 89, 76, 74, 1, 4, 89, 90, 79, 76, 1, 4, 90, + 93, 81, 79, 1, 4, 93, 94, 82, 81, 1, 4, 94, 84, 73, 82, 1, 6, 84, 94, 93, + 90, 89, 86, 1, 6, 25, 27, 29, 31, 33, 34, 1, 4, 37, 38, 27, 25, 1, 4, 38, + 41, 29, 27, 1, 4, 41, 43, 31, 29, 1, 4, 43, 45, 33, 31, 1, 4, 45, 46, 34, + 33, 1, 4, 46, 37, 25, 34, 1, 6, 37, 46, 45, 43, 41, 38, 1, 6, 0, 3, 5, + 7, 9, 10, 1, 4, 12, 14, 3, 0, 1, 4, 14, 17, 5, 3, 1, 4, 17, 18, 7, + 5, 1, 4, 18, 21, 9, 7, 1, 4, 21, 22, 10, 9, 1, 4, 22, 12, 0, 10, 1, + 6, 12, 22, 21, 18, 17, 14, 1, + 0 +}; + +struct lwo LWO_ElbowBolts = +{ + 288, /* number of points */ + ElbowBolts_PNTS, ElbowBolts_normals, ElbowBolts_POLS, 0L +}; + +static GLfloat ElbowCoins_PNTS[] = +{ + (GLfloat) 0.000000, (GLfloat) - 0.520000, (GLfloat) - 0.500000, + (GLfloat) 0.097545, (GLfloat) - 0.520000, (GLfloat) - 0.490393, + (GLfloat) 0.191342, (GLfloat) - 0.520000, (GLfloat) - 0.461940, + (GLfloat) 0.277785, (GLfloat) - 0.520000, (GLfloat) - 0.415735, + (GLfloat) 0.353553, (GLfloat) - 0.520000, (GLfloat) - 0.353553, + (GLfloat) 0.415735, (GLfloat) - 0.520000, (GLfloat) - 0.277785, + (GLfloat) 0.461940, (GLfloat) - 0.520000, (GLfloat) - 0.191342, + (GLfloat) 0.490393, (GLfloat) - 0.520000, (GLfloat) - 0.097545, + (GLfloat) 0.500000, (GLfloat) - 0.520000, (GLfloat) - 0.000000, + (GLfloat) 0.490393, (GLfloat) - 0.520000, (GLfloat) 0.097545, + (GLfloat) 0.461940, (GLfloat) - 0.520000, (GLfloat) 0.191342, + (GLfloat) 0.415735, (GLfloat) - 0.520000, (GLfloat) 0.277785, + (GLfloat) 0.353553, (GLfloat) - 0.520000, (GLfloat) 0.353553, + (GLfloat) 0.277785, (GLfloat) - 0.520000, (GLfloat) 0.415735, + (GLfloat) 0.191342, (GLfloat) - 0.520000, (GLfloat) 0.461940, + (GLfloat) 0.097545, (GLfloat) - 0.520000, (GLfloat) 0.490393, + (GLfloat) 0.000000, (GLfloat) - 0.520000, (GLfloat) 0.500000, + (GLfloat) - 0.097545, (GLfloat) - 0.520000, (GLfloat) 0.490393, + (GLfloat) - 0.191342, (GLfloat) - 0.520000, (GLfloat) 0.461940, + (GLfloat) - 0.277785, (GLfloat) - 0.520000, (GLfloat) 0.415735, + (GLfloat) - 0.353553, (GLfloat) - 0.520000, (GLfloat) 0.353553, + (GLfloat) - 0.415735, (GLfloat) - 0.520000, (GLfloat) 0.277785, + (GLfloat) - 0.461940, (GLfloat) - 0.520000, (GLfloat) 0.191342, + (GLfloat) - 0.490393, (GLfloat) - 0.520000, (GLfloat) 0.097545, + (GLfloat) - 0.500000, (GLfloat) - 0.520000, (GLfloat) 0.000000, + (GLfloat) - 0.490393, (GLfloat) - 0.520000, (GLfloat) - 0.097545, + (GLfloat) - 0.461940, (GLfloat) - 0.520000, (GLfloat) - 0.191342, + (GLfloat) - 0.415735, (GLfloat) - 0.520000, (GLfloat) - 0.277785, + (GLfloat) - 0.353553, (GLfloat) - 0.520000, (GLfloat) - 0.353553, + (GLfloat) - 0.277785, (GLfloat) - 0.520000, (GLfloat) - 0.415735, + (GLfloat) - 0.191342, (GLfloat) - 0.520000, (GLfloat) - 0.461940, + (GLfloat) - 0.097545, (GLfloat) - 0.520000, (GLfloat) - 0.490393, + (GLfloat) 0.000000, (GLfloat) - 0.600000, (GLfloat) - 0.500000, + (GLfloat) 0.097545, (GLfloat) - 0.600000, (GLfloat) - 0.490393, + (GLfloat) 0.191342, (GLfloat) - 0.600000, (GLfloat) - 0.461940, + (GLfloat) 0.277785, (GLfloat) - 0.600000, (GLfloat) - 0.415735, + (GLfloat) 0.353553, (GLfloat) - 0.600000, (GLfloat) - 0.353553, + (GLfloat) 0.415735, (GLfloat) - 0.600000, (GLfloat) - 0.277785, + (GLfloat) 0.461940, (GLfloat) - 0.600000, (GLfloat) - 0.191342, + (GLfloat) 0.490393, (GLfloat) - 0.600000, (GLfloat) - 0.097545, + (GLfloat) 0.500000, (GLfloat) - 0.600000, (GLfloat) - 0.000000, + (GLfloat) 0.490393, (GLfloat) - 0.600000, (GLfloat) 0.097545, + (GLfloat) 0.461940, (GLfloat) - 0.600000, (GLfloat) 0.191342, + (GLfloat) 0.415735, (GLfloat) - 0.600000, (GLfloat) 0.277785, + (GLfloat) 0.353553, (GLfloat) - 0.600000, (GLfloat) 0.353553, + (GLfloat) 0.277785, (GLfloat) - 0.600000, (GLfloat) 0.415735, + (GLfloat) 0.191342, (GLfloat) - 0.600000, (GLfloat) 0.461940, + (GLfloat) 0.097545, (GLfloat) - 0.600000, (GLfloat) 0.490393, + (GLfloat) 0.000000, (GLfloat) - 0.600000, (GLfloat) 0.500000, + (GLfloat) - 0.097545, (GLfloat) - 0.600000, (GLfloat) 0.490393, + (GLfloat) - 0.191342, (GLfloat) - 0.600000, (GLfloat) 0.461940, + (GLfloat) - 0.277785, (GLfloat) - 0.600000, (GLfloat) 0.415735, + (GLfloat) - 0.353553, (GLfloat) - 0.600000, (GLfloat) 0.353553, + (GLfloat) - 0.415735, (GLfloat) - 0.600000, (GLfloat) 0.277785, + (GLfloat) - 0.461940, (GLfloat) - 0.600000, (GLfloat) 0.191342, + (GLfloat) - 0.490393, (GLfloat) - 0.600000, (GLfloat) 0.097545, + (GLfloat) - 0.500000, (GLfloat) - 0.600000, (GLfloat) 0.000000, + (GLfloat) - 0.490393, (GLfloat) - 0.600000, (GLfloat) - 0.097545, + (GLfloat) - 0.461940, (GLfloat) - 0.600000, (GLfloat) - 0.191342, + (GLfloat) - 0.415735, (GLfloat) - 0.600000, (GLfloat) - 0.277785, + (GLfloat) - 0.353553, (GLfloat) - 0.600000, (GLfloat) - 0.353553, + (GLfloat) - 0.277785, (GLfloat) - 0.600000, (GLfloat) - 0.415735, + (GLfloat) - 0.191342, (GLfloat) - 0.600000, (GLfloat) - 0.461940, + (GLfloat) - 0.097545, (GLfloat) - 0.600000, (GLfloat) - 0.490393, + (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.520000, + (GLfloat) 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.520000, + (GLfloat) 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.520000, + (GLfloat) 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.520000, + (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.520000, + (GLfloat) 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.520000, + (GLfloat) 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.520000, + (GLfloat) 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.520000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.520000, + (GLfloat) 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.520000, + (GLfloat) 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.520000, + (GLfloat) 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.520000, + (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.520000, + (GLfloat) 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.520000, + (GLfloat) 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.520000, + (GLfloat) 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.520000, + (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.520000, + (GLfloat) - 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.520000, + (GLfloat) - 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.520000, + (GLfloat) - 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.520000, + (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.520000, + (GLfloat) - 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.520000, + (GLfloat) - 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.520000, + (GLfloat) - 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.520000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.520000, + (GLfloat) - 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.520000, + (GLfloat) - 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.520000, + (GLfloat) - 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.520000, + (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.520000, + (GLfloat) - 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.520000, + (GLfloat) - 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.520000, + (GLfloat) - 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.520000, + (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.600000, + (GLfloat) 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.600000, + (GLfloat) 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.600000, + (GLfloat) 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.600000, + (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.600000, + (GLfloat) 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.600000, + (GLfloat) 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.600000, + (GLfloat) 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.600000, + (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.600000, + (GLfloat) 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.600000, + (GLfloat) 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.600000, + (GLfloat) 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.600000, + (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.600000, + (GLfloat) 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.600000, + (GLfloat) 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.600000, + (GLfloat) 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.600000, + (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.600000, + (GLfloat) - 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.600000, + (GLfloat) - 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.600000, + (GLfloat) - 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.600000, + (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.600000, + (GLfloat) - 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.600000, + (GLfloat) - 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.600000, + (GLfloat) - 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.600000, + (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.600000, + (GLfloat) - 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.600000, + (GLfloat) - 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.600000, + (GLfloat) - 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.600000, + (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.600000, + (GLfloat) - 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.600000, + (GLfloat) - 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.600000, + (GLfloat) - 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.600000, +}; + +static GLfloat ElbowCoins_normals[] = +{ + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000, + (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000, + (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000, + (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000, + (GLfloat) 0.634393, (GLfloat) 0.773010, (GLfloat) 0.000000, + (GLfloat) 0.773010, (GLfloat) 0.634393, (GLfloat) 0.000000, + (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000, + (GLfloat) 0.956940, (GLfloat) 0.290285, (GLfloat) 0.000000, + (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000, + (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) 0.956940, (GLfloat) - 0.290285, (GLfloat) - 0.000000, + (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) 0.773010, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000, + (GLfloat) - 0.773010, (GLfloat) - 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) - 0.290285, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000, + (GLfloat) - 0.956940, (GLfloat) 0.290285, (GLfloat) - 0.000000, + (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000, + (GLfloat) - 0.773010, (GLfloat) 0.634393, (GLfloat) - 0.000000, + (GLfloat) - 0.634393, (GLfloat) 0.773010, (GLfloat) - 0.000000, + (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000, + (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000, + (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000, + (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000, + (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000, + (GLfloat) 0.098017, (GLfloat) 0.000000, (GLfloat) - 0.995185, + (GLfloat) 0.290285, (GLfloat) 0.000000, (GLfloat) - 0.956940, + (GLfloat) 0.471397, (GLfloat) 0.000000, (GLfloat) - 0.881921, + (GLfloat) 0.634393, (GLfloat) 0.000000, (GLfloat) - 0.773010, + (GLfloat) 0.773010, (GLfloat) 0.000000, (GLfloat) - 0.634393, + (GLfloat) 0.881921, (GLfloat) 0.000000, (GLfloat) - 0.471397, + (GLfloat) 0.956940, (GLfloat) 0.000000, (GLfloat) - 0.290285, + (GLfloat) 0.995185, (GLfloat) 0.000000, (GLfloat) - 0.098017, + (GLfloat) 0.995185, (GLfloat) 0.000000, (GLfloat) 0.098017, + (GLfloat) 0.956940, (GLfloat) 0.000000, (GLfloat) 0.290285, + (GLfloat) 0.881921, (GLfloat) 0.000000, (GLfloat) 0.471397, + (GLfloat) 0.773010, (GLfloat) 0.000000, (GLfloat) 0.634393, + (GLfloat) 0.634393, (GLfloat) 0.000000, (GLfloat) 0.773010, + (GLfloat) 0.471397, (GLfloat) 0.000000, (GLfloat) 0.881921, + (GLfloat) 0.290285, (GLfloat) 0.000000, (GLfloat) 0.956940, + (GLfloat) 0.098017, (GLfloat) 0.000000, (GLfloat) 0.995185, + (GLfloat) - 0.098017, (GLfloat) 0.000000, (GLfloat) 0.995185, + (GLfloat) - 0.290285, (GLfloat) 0.000000, (GLfloat) 0.956940, + (GLfloat) - 0.471397, (GLfloat) 0.000000, (GLfloat) 0.881921, + (GLfloat) - 0.634393, (GLfloat) 0.000000, (GLfloat) 0.773010, + (GLfloat) - 0.773010, (GLfloat) 0.000000, (GLfloat) 0.634393, + (GLfloat) - 0.881921, (GLfloat) 0.000000, (GLfloat) 0.471397, + (GLfloat) - 0.956940, (GLfloat) 0.000000, (GLfloat) 0.290285, + (GLfloat) - 0.995185, (GLfloat) - 0.000000, (GLfloat) 0.098017, + (GLfloat) - 0.995185, (GLfloat) - 0.000000, (GLfloat) - 0.098017, + (GLfloat) - 0.956940, (GLfloat) - 0.000000, (GLfloat) - 0.290285, + (GLfloat) - 0.881921, (GLfloat) - 0.000000, (GLfloat) - 0.471397, + (GLfloat) - 0.773010, (GLfloat) - 0.000000, (GLfloat) - 0.634393, + (GLfloat) - 0.634393, (GLfloat) - 0.000000, (GLfloat) - 0.773010, + (GLfloat) - 0.471397, (GLfloat) - 0.000000, (GLfloat) - 0.881921, + (GLfloat) - 0.290285, (GLfloat) - 0.000000, (GLfloat) - 0.956940, + (GLfloat) - 0.098017, (GLfloat) - 0.000000, (GLfloat) - 0.995185, + (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000, +}; + +static unsigned short int ElbowCoins_POLS[] = +{ + 32, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1, 4, 96, 97, 65, 64, 1, + 4, 97, 98, 66, 65, 1, 4, 98, 99, 67, 66, 1, 4, 99, 100, 68, 67, 1, 4, 100, + 101, 69, 68, 1, 4, 101, 102, 70, 69, 1, 4, 102, 103, 71, 70, 1, 4, 103, 104, 72, +71, 1, 4, 104, 105, 73, 72, 1, 4, 105, 106, 74, 73, 1, 4, 106, 107, 75, 74, 1, + 4, 107, 108, 76, 75, 1, 4, 108, 109, 77, 76, 1, 4, 109, 110, 78, 77, 1, 4, 110, + 111, 79, 78, 1, 4, 111, 112, 80, 79, 1, 4, 112, 113, 81, 80, 1, 4, 113, 114, 82, +81, 1, 4, 114, 115, 83, 82, 1, 4, 115, 116, 84, 83, 1, 4, 116, 117, 85, 84, 1, + 4, 117, 118, 86, 85, 1, 4, 118, 119, 87, 86, 1, 4, 119, 120, 88, 87, 1, 4, 120, + 121, 89, 88, 1, 4, 121, 122, 90, 89, 1, 4, 122, 123, 91, 90, 1, 4, 123, 124, 92, +91, 1, 4, 124, 125, 93, 92, 1, 4, 125, 126, 94, 93, 1, 4, 126, 127, 95, 94, 1, + 4, 127, 96, 64, 95, 1, 32, 96, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, + 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 1, + 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 1, 4, 32, 33, 1, 0, 1, + 4, 33, 34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36, + 37, 5, 4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8, + 7, 1, 4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1, + 4, 43, 44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46, + 47, 15, 14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18, + 17, 1, 4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1, + 4, 53, 54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56, + 57, 25, 24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28, + 27, 1, 4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1, + 4, 63, 32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, +51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1, + 0 +}; + +struct lwo LWO_ElbowCoins = +{ + 128, /* number of points */ + ElbowCoins_PNTS, ElbowCoins_normals, ElbowCoins_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of pipeobjs.c */ diff --git a/hacks/glx/pipes.c b/hacks/glx/pipes.c new file mode 100644 index 00000000..c6f35d90 --- /dev/null +++ b/hacks/glx/pipes.c @@ -0,0 +1,1008 @@ +/* -*- Mode: C; tab-width: 4 -*- + * pipes.c - Shows 3D selfbuiding pipe system (xlock Version) + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)pipes.c 4.04 97/07/28 xlockmore"; +#endif +/* 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. + * + * This program was inspired on a WindowsNT(R)'s screen saver. It was written + * from scratch and it was not based on any other source code. + * + * ========================================================================== + * The routine myElbow is derivated from the doughnut routine from the MesaGL + * library (more especifically the Mesaaux library) written by Brian Paul. + * ========================================================================== + * + * Thanks goes to Brian Paul for making it possible and inexpensive to use + * OpenGL at home. + * + * Since I'm not a native english speaker, my apologies for any gramatical + * mistake. + * + * My e-mail addresses are + * + * vianna@cat.cbpf.br + * and + * marcelo@venus.rdc.puc-rio.br + * + * Marcelo F. Vianna (Apr-09-1997) + * + * Revision History: + * 29-Apr-97: Factory equipment by Ed Mackey. Productive day today, eh? + * 29-Apr-97: Less tight turns Jeff Epler + * 29-Apr-97: Efficiency speed-ups by Marcelo F. Vianna + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ + +#include + +#ifdef STANDALONE +# define PROGCLASS "Pipes" +# define HACK_INIT init_pipes +# define HACK_DRAW draw_pipes +# define pipes_opts xlockmore_opts +# define DEFAULTS "*count: 2 \n" \ + "*cycles: 5 \n" \ + "*size: 500 \n" \ + "*delay: 100 \n" \ + "*fisheye: True \n" \ + "*tightturns: False \n" \ + "*rotatepipes: True \n" \ + "*noBuffer: True \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +#include +#include "buildlwo.h" + +#define DEF_FACTORY "2" +#define DEF_FISHEYE "True" +#define DEF_TIGHTTURNS "False" +#define DEF_ROTATEPIPES "True" +#define NofSysTypes 3 + +static int factory; +static Bool fisheye, tightturns, rotatepipes; + +static XrmOptionDescRec opts[] = +{ + {"-factory", ".pipes.factory", XrmoptionSepArg, (caddr_t) NULL}, + {"-fisheye", ".pipes.fisheye", XrmoptionNoArg, (caddr_t) "on"}, + {"+fisheye", ".pipes.fisheye", XrmoptionNoArg, (caddr_t) "off"}, + {"-tightturns", ".pipes.tightturns", XrmoptionNoArg, (caddr_t) "on"}, + {"+tightturns", ".pipes.tightturns", XrmoptionNoArg, (caddr_t) "off"}, + {"-rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, (caddr_t) "on"}, + {"+rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & factory, "factory", "Factory", DEF_FACTORY, t_Int}, + {(caddr_t *) & fisheye, "fisheye", "Fisheye", DEF_FISHEYE, t_Bool}, + {(caddr_t *) & tightturns, "tightturns", "Tightturns", DEF_TIGHTTURNS, t_Bool}, + {(caddr_t *) & rotatepipes, "rotatepipes", "Rotatepipes", DEF_ROTATEPIPES, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-factory num", "how much extra equipment in pipes (0 for none)"}, + {"-/+fisheye", "turn on/off zoomed-in view of pipes"}, + {"-/+tightturns", "turn on/off tight turns"}, + {"-/+rotatepipes", "turn on/off pipe system rotation per screenful"} +}; + +ModeSpecOpt pipes_opts = +{7, opts, 4, vars, desc}; + +#define Scale4Window 0.1 +#define Scale4Iconic 0.07 + +#define one_third 0.3333333333333333333 + +#define dirNone -1 +#define dirUP 0 +#define dirDOWN 1 +#define dirLEFT 2 +#define dirRIGHT 3 +#define dirNEAR 4 +#define dirFAR 5 + +#define HCELLS 33 +#define VCELLS 25 +#define DEFINEDCOLORS 7 +#define elbowradius 0.5 + +/*************************************************************************/ + +typedef struct { +#if defined( MESA ) && defined( SLOW ) + int flip; +#endif + GLint WindH, WindW; + int Cells[HCELLS][VCELLS][HCELLS]; + int usedcolors[DEFINEDCOLORS]; + int directions[6]; + int ndirections; + int nowdir, olddir; + int system_number; + int counter; + int PX, PY, PZ; + int number_of_systems; + int system_type; + int system_length; + int turncounter; + float *system_color; + GLfloat initial_rotation; + GLuint valve, bolts, betweenbolts, elbowbolts, elbowcoins; + GLuint guagehead, guageface, guagedial, guageconnector; + GLXContext glx_context; +} pipesstruct; + +extern struct lwo LWO_BigValve, LWO_PipeBetweenBolts, LWO_Bolts3D; +extern struct lwo LWO_GuageHead, LWO_GuageFace, LWO_GuageDial, LWO_GuageConnector; +extern struct lwo LWO_ElbowBolts, LWO_ElbowCoins; + +static float front_shininess[] = +{60.0}; +static float front_specular[] = +{0.7, 0.7, 0.7, 1.0}; +static float ambient0[] = +{0.4, 0.4, 0.4, 1.0}; +static float diffuse0[] = +{1.0, 1.0, 1.0, 1.0}; +static float ambient1[] = +{0.2, 0.2, 0.2, 1.0}; +static float diffuse1[] = +{0.5, 0.5, 0.5, 1.0}; +static float position0[] = +{1.0, 1.0, 1.0, 0.0}; +static float position1[] = +{-1.0, -1.0, 1.0, 0.0}; +static float lmodel_ambient[] = +{0.5, 0.5, 0.5, 1.0}; +static float lmodel_twoside[] = +{GL_TRUE}; + +static float MaterialRed[] = +{0.7, 0.0, 0.0, 1.0}; +static float MaterialGreen[] = +{0.1, 0.5, 0.2, 1.0}; +static float MaterialBlue[] = +{0.0, 0.0, 0.7, 1.0}; +static float MaterialCyan[] = +{0.2, 0.5, 0.7, 1.0}; +static float MaterialYellow[] = +{0.7, 0.7, 0.0, 1.0}; +static float MaterialMagenta[] = +{0.6, 0.2, 0.5, 1.0}; +static float MaterialWhite[] = +{0.7, 0.7, 0.7, 1.0}; +static float MaterialGray[] = +{0.2, 0.2, 0.2, 1.0}; + +static pipesstruct *pipes = NULL; + + +static void +MakeTube(int direction) +{ + float an; + float SINan_3, COSan_3; + + /*dirUP = 00000000 */ + /*dirDOWN = 00000001 */ + /*dirLEFT = 00000010 */ + /*dirRIGHT = 00000011 */ + /*dirNEAR = 00000100 */ + /*dirFAR = 00000101 */ + + glRotatef(90.0, (direction & 6) ? 0.0 : 1.0, (direction & 2) ? 1.0 : 0.0, 0.0); + + glBegin(GL_QUAD_STRIP); + for (an = 0.0; an <= 2.0 * M_PI; an += M_PI / 12.0) { + glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0); + glVertex3f(COSan_3, SINan_3, one_third); + glVertex3f(COSan_3, SINan_3, -one_third); + } + glEnd(); +} + +static void +mySphere(float radius) +{ + GLUquadricObj *quadObj; + + quadObj = gluNewQuadric(); + gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL); + gluSphere(quadObj, radius, 16, 16); + gluDeleteQuadric(quadObj); +} + +static void +myElbow(ModeInfo * mi, int bolted) +{ +#define nsides 25 +#define rings 25 +#define r one_third +#define R one_third + + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + int i, j; + GLfloat p0[3], p1[3], p2[3], p3[3]; + GLfloat n0[3], n1[3], n2[3], n3[3]; + GLfloat COSphi, COSphi1, COStheta, COStheta1; + GLfloat _SINtheta, _SINtheta1; + + for (i = 0; i <= rings / 4; i++) { + GLfloat theta, theta1; + + theta = (GLfloat) i *2.0 * M_PI / rings; + + theta1 = (GLfloat) (i + 1) * 2.0 * M_PI / rings; + for (j = 0; j < nsides; j++) { + GLfloat phi, phi1; + + phi = (GLfloat) j *2.0 * M_PI / nsides; + + phi1 = (GLfloat) (j + 1) * 2.0 * M_PI / nsides; + + p0[0] = (COStheta = cos(theta)) * (R + r * (COSphi = cos(phi))); + p0[1] = (_SINtheta = -sin(theta)) * (R + r * COSphi); + + p1[0] = (COStheta1 = cos(theta1)) * (R + r * COSphi); + p1[1] = (_SINtheta1 = -sin(theta1)) * (R + r * COSphi); + + p2[0] = COStheta1 * (R + r * (COSphi1 = cos(phi1))); + p2[1] = _SINtheta1 * (R + r * COSphi1); + + p3[0] = COStheta * (R + r * COSphi1); + p3[1] = _SINtheta * (R + r * COSphi1); + + n0[0] = COStheta * COSphi; + n0[1] = _SINtheta * COSphi; + + n1[0] = COStheta1 * COSphi; + n1[1] = _SINtheta1 * COSphi; + + n2[0] = COStheta1 * COSphi1; + n2[1] = _SINtheta1 * COSphi1; + + n3[0] = COStheta * COSphi1; + n3[1] = _SINtheta * COSphi1; + + p0[2] = p1[2] = r * (n0[2] = n1[2] = sin(phi)); + p2[2] = p3[2] = r * (n2[2] = n3[2] = sin(phi1)); + + glBegin(GL_QUADS); + glNormal3fv(n3); + glVertex3fv(p3); + glNormal3fv(n2); + glVertex3fv(p2); + glNormal3fv(n1); + glVertex3fv(p1); + glNormal3fv(n0); + glVertex3fv(p0); + glEnd(); + } + } + + if (factory > 0 && bolted) { + /* Bolt the elbow onto the pipe system */ + glFrontFace(GL_CW); + glPushMatrix(); + glRotatef(90.0, 0.0, 0.0, -1.0); + glRotatef(90.0, 0.0, 1.0, 0.0); + glTranslatef(0.0, one_third, one_third); + glCallList(pp->elbowcoins); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glCallList(pp->elbowbolts); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color); + glPopMatrix(); + glFrontFace(GL_CCW); + } +#undef r +#undef R +#undef nsides +#undef rings +} + +static void +FindNeighbors(ModeInfo * mi) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + pp->ndirections = 0; + pp->directions[dirUP] = (!pp->Cells[pp->PX][pp->PY + 1][pp->PZ]) ? 1 : 0; + pp->ndirections += pp->directions[dirUP]; + pp->directions[dirDOWN] = (!pp->Cells[pp->PX][pp->PY - 1][pp->PZ]) ? 1 : 0; + pp->ndirections += pp->directions[dirDOWN]; + pp->directions[dirLEFT] = (!pp->Cells[pp->PX - 1][pp->PY][pp->PZ]) ? 1 : 0; + pp->ndirections += pp->directions[dirLEFT]; + pp->directions[dirRIGHT] = (!pp->Cells[pp->PX + 1][pp->PY][pp->PZ]) ? 1 : 0; + pp->ndirections += pp->directions[dirRIGHT]; + pp->directions[dirFAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ - 1]) ? 1 : 0; + pp->ndirections += pp->directions[dirFAR]; + pp->directions[dirNEAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ + 1]) ? 1 : 0; + pp->ndirections += pp->directions[dirNEAR]; +} + +static int +SelectNeighbor(ModeInfo * mi) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + int dirlist[6]; + int i, j; + + for (i = 0, j = 0; i < 6; i++) { + if (pp->directions[i]) { + dirlist[j] = i; + j++; + } + } + + return dirlist[NRAND(pp->ndirections)]; +} + +static void +MakeValve(ModeInfo * mi, int newdir) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + /* There is a glPopMatrix() right after this subroutine returns. */ + switch (newdir) { + case dirUP: + case dirDOWN: + glRotatef(90.0, 1.0, 0.0, 0.0); + glRotatef(NRAND(3) * 90.0, 0.0, 0.0, 1.0); + break; + case dirLEFT: + case dirRIGHT: + glRotatef(90.0, 0.0, -1.0, 0.0); + glRotatef((NRAND(3) * 90.0) - 90.0, 0.0, 0.0, 1.0); + break; + case dirNEAR: + case dirFAR: + glRotatef(NRAND(4) * 90.0, 0.0, 0.0, 1.0); + break; + } + glFrontFace(GL_CW); + glCallList(pp->betweenbolts); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glCallList(pp->bolts); + if (!MI_WIN_IS_MONO(mi)) { + if (pp->system_color == MaterialRed) { + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialYellow : MaterialBlue); + } else if (pp->system_color == MaterialBlue) { + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialRed : MaterialYellow); + } else if (pp->system_color == MaterialYellow) { + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialBlue : MaterialRed); + } else { + switch ((NRAND(3))) { + case 0: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); + break; + case 1: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue); + break; + case 2: + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow); + } + } + } + glRotatef((GLfloat) (NRAND(90)), 1.0, 0.0, 0.0); + glCallList(pp->valve); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color); + glFrontFace(GL_CCW); +} + +static int +MakeGuage(ModeInfo * mi, int newdir) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + /* Can't have a guage on a vertical pipe. */ + if ((newdir == dirUP) || (newdir == dirDOWN)) + return (0); + + /* Is there space above this pipe for a guage? */ + if (!pp->directions[dirUP]) + return (0); + + /* Yes! Mark the space as used. */ + pp->Cells[pp->PX][pp->PY + 1][pp->PZ] = 1; + + glFrontFace(GL_CW); + glPushMatrix(); + if ((newdir == dirLEFT) || (newdir == dirRIGHT)) + glRotatef(90.0, 0.0, 1.0, 0.0); + glCallList(pp->betweenbolts); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glCallList(pp->bolts); + glPopMatrix(); + + glCallList(pp->guageconnector); + glPushMatrix(); + glTranslatef(0.0, 1.33333, 0.0); + /* Do not change the above to 1 + ONE_THIRD, because */ + /* the object really is centered on 1.3333300000. */ + glRotatef(NRAND(270) + 45.0, 0.0, 0.0, -1.0); + /* Random rotation for the dial. I love it. */ + glCallList(pp->guagedial); + glPopMatrix(); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color); + glCallList(pp->guagehead); + + /* GuageFace is drawn last, in case of low-res depth buffers. */ + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + glCallList(pp->guageface); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color); + glFrontFace(GL_CCW); + + return (1); +} + +static void +MakeShape(ModeInfo * mi, int newdir) +{ + switch (NRAND(2)) { + case 1: + if (!MakeGuage(mi, newdir)) + MakeTube(newdir); + break; + default: + MakeValve(mi, newdir); + break; + } +} + +static void pinit(ModeInfo * mi, int zera); + +void +draw_pipes(ModeInfo * mi) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + int newdir; + int OPX, OPY, OPZ; + + glXMakeCurrent(display, window, pp->glx_context); + +#if defined( MESA ) && defined( SLOW ) + glDrawBuffer(GL_BACK); +#else + glDrawBuffer(GL_FRONT); +#endif + glPushMatrix(); + + glTranslatef(0.0, 0.0, fisheye ? -3.8 : -4.8); + if (rotatepipes) + glRotatef(pp->initial_rotation, 0.0, 1.0, 0.0); + + if (!MI_WIN_IS_ICONIC(mi)) { + /* Width/height ratio handled by gluPerspective() now. */ + glScalef(Scale4Window, Scale4Window, Scale4Window); + } else { + glScalef(Scale4Iconic, Scale4Iconic, Scale4Iconic); + } + + FindNeighbors(mi); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color); + + /* If it's the begining of a system, draw a sphere */ + if (pp->olddir == dirNone) { + glPushMatrix(); + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0); + mySphere(0.6); + glPopMatrix(); + } + /* Check for stop conditions */ + if (pp->ndirections == 0 || pp->counter > pp->system_length) { + glPushMatrix(); + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0); + /* Finish the system with another sphere */ + mySphere(0.6); +#if defined( MESA ) && defined( SLOW ) + glXSwapBuffers(display, window); +#endif + glPopMatrix(); + + /* If the maximum number of system was drawn, restart (clearing the screen), */ + /* else start a new system. */ + if (++pp->system_number > pp->number_of_systems) { + (void) sleep(1); + pinit(mi, 1); + } else { + pinit(mi, 0); + } + + glPopMatrix(); + return; + } + pp->counter++; + pp->turncounter++; + + /* Do will the direction change? if so, determine the new one */ + newdir = pp->nowdir; + if (!pp->directions[newdir]) { /* cannot proceed in the current direction */ + newdir = SelectNeighbor(mi); + } else { + if (tightturns) { + /* random change (20% chance) */ + if ((pp->counter > 1) && (NRAND(100) < 20)) { + newdir = SelectNeighbor(mi); + } + } else { + /* Chance to turn increases after each length of pipe drawn */ + if ((pp->counter > 1) && NRAND(50) < NRAND(pp->turncounter + 1)) { + newdir = SelectNeighbor(mi); + pp->turncounter = 0; + } + } + } + + /* Has the direction changed? */ + if (newdir == pp->nowdir) { + /* If not, draw the cell's center pipe */ + glPushMatrix(); + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0); + /* Chance of factory shape here, if enabled. */ + if ((pp->counter > 1) && (NRAND(100) < factory)) { + MakeShape(mi, newdir); + } else { + MakeTube(newdir); + } + glPopMatrix(); + } else { + /* If so, draw the cell's center elbow/sphere */ + int sysT = pp->system_type; + + if (sysT == NofSysTypes + 1) { + sysT = ((pp->system_number - 1) % NofSysTypes) + 1; + } + glPushMatrix(); + + switch (sysT) { + case 1: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0); + mySphere(elbowradius); + break; + case 2: + case 3: + switch (pp->nowdir) { + case dirUP: + switch (newdir) { + case dirLEFT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + break; + case dirRIGHT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirFAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + break; + case dirNEAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + break; + } + break; + case dirDOWN: + switch (newdir) { + case dirLEFT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0); + break; + case dirRIGHT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirFAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 0.0, 1.0, 0.0); + break; + case dirNEAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + break; + } + break; + case dirLEFT: + switch (newdir) { + case dirUP: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirDOWN: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirFAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirNEAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + break; + } + break; + case dirRIGHT: + switch (newdir) { + case dirUP: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0); + break; + case dirDOWN: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + break; + case dirFAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + break; + case dirNEAR: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 1.0, 0.0, 0.0); + break; + } + break; + case dirNEAR: + switch (newdir) { + case dirLEFT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + break; + case dirRIGHT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 1.0, 0.0); + break; + case dirUP: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(270.0, 0.0, 1.0, 0.0); + break; + case dirDOWN: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + break; + } + break; + case dirFAR: + switch (newdir) { + case dirUP: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + break; + case dirDOWN: + glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 0.0, 1.0, 0.0); + glRotatef(180.0, 1.0, 0.0, 0.0); + break; + case dirLEFT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(90.0, 1.0, 0.0, 0.0); + break; + case dirRIGHT: + glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third)); + glRotatef(270.0, 1.0, 0.0, 0.0); + glRotatef(180.0, 0.0, 0.0, 1.0); + break; + } + break; + } + myElbow(mi, (sysT == 2)); + break; + } + glPopMatrix(); + } + + OPX = pp->PX; + OPY = pp->PY; + OPZ = pp->PZ; + pp->olddir = pp->nowdir; + pp->nowdir = newdir; + switch (pp->nowdir) { + case dirUP: + pp->PY++; + break; + case dirDOWN: + pp->PY--; + break; + case dirLEFT: + pp->PX--; + break; + case dirRIGHT: + pp->PX++; + break; + case dirNEAR: + pp->PZ++; + break; + case dirFAR: + pp->PZ--; + break; + } + pp->Cells[pp->PX][pp->PY][pp->PZ] = 1; + + /* Cells'face pipe */ + glTranslatef(((pp->PX + OPX) / 2.0 - 16) / 3.0 * 4.0, ((pp->PY + OPY) / 2.0 - 12) / 3.0 * 4.0, ((pp->PZ + OPZ) / 2.0 - 16) / 3.0 * 4.0); + MakeTube(newdir); + + glPopMatrix(); + + glFlush(); + +#if defined( MESA ) && defined( SLOW ) + pp->flip = !pp->flip; + if (pp->flip) + glXSwapBuffers(display, window); +#endif +} + +static void +reshape(ModeInfo * mi, int width, int height) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + glViewport(0, 0, pp->WindW = (GLint) width, pp->WindH = (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + /*glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); */ + gluPerspective(65.0, (GLfloat) width / (GLfloat) height, 0.1, 20.0); + glMatrixMode(GL_MODELVIEW); +} + +static void +pinit(ModeInfo * mi, int zera) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + int X, Y, Z; + + glClearDepth(1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); + glColor3f(1.0, 1.0, 1.0); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glEnable(GL_CULL_FACE); + + glShadeModel(GL_SMOOTH); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); + + if (zera) { + pp->system_number = 1; + glDrawBuffer(GL_FRONT_AND_BACK); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + (void) memset(pp->Cells, 0, sizeof (pp->Cells)); + for (X = 0; X < HCELLS; X++) { + for (Y = 0; Y < VCELLS; Y++) { + pp->Cells[X][Y][0] = 1; + pp->Cells[X][Y][HCELLS - 1] = 1; + pp->Cells[0][Y][X] = 1; + pp->Cells[HCELLS - 1][Y][X] = 1; + } + } + for (X = 0; X < HCELLS; X++) { + for (Z = 0; Z < HCELLS; Z++) { + pp->Cells[X][0][Z] = 1; + pp->Cells[X][VCELLS - 1][Z] = 1; + } + } + (void) memset(pp->usedcolors, 0, sizeof (pp->usedcolors)); + if ((pp->initial_rotation += 10.0) > 45.0) { + pp->initial_rotation -= 90.0; + } + } + pp->counter = 0; + pp->turncounter = 0; + + if (!MI_WIN_IS_MONO(mi)) { + int collist[DEFINEDCOLORS]; + int i, j, lower = 1000; + + /* Avoid repeating colors on the same screen unless necessary */ + for (i = 0; i < DEFINEDCOLORS; i++) { + if (lower > pp->usedcolors[i]) + lower = pp->usedcolors[i]; + } + for (i = 0, j = 0; i < DEFINEDCOLORS; i++) { + if (pp->usedcolors[i] == lower) { + collist[j] = i; + j++; + } + } + i = collist[NRAND(j)]; + pp->usedcolors[i]++; + switch (i) { + case 0: + pp->system_color = MaterialRed; + break; + case 1: + pp->system_color = MaterialGreen; + break; + case 2: + pp->system_color = MaterialBlue; + break; + case 3: + pp->system_color = MaterialCyan; + break; + case 4: + pp->system_color = MaterialYellow; + break; + case 5: + pp->system_color = MaterialMagenta; + break; + case 6: + pp->system_color = MaterialWhite; + break; + } + } else { + pp->system_color = MaterialGray; + } + + do { + pp->PX = NRAND((HCELLS - 1)) + 1; + pp->PY = NRAND((VCELLS - 1)) + 1; + pp->PZ = NRAND((HCELLS - 1)) + 1; + } while (pp->Cells[pp->PX][pp->PY][pp->PZ] || + (pp->Cells[pp->PX + 1][pp->PY][pp->PZ] && pp->Cells[pp->PX - 1][pp->PY][pp->PZ] && + pp->Cells[pp->PX][pp->PY + 1][pp->PZ] && pp->Cells[pp->PX][pp->PY - 1][pp->PZ] && + pp->Cells[pp->PX][pp->PY][pp->PZ + 1] && pp->Cells[pp->PX][pp->PY][pp->PZ - 1])); + pp->Cells[pp->PX][pp->PY][pp->PZ] = 1; + pp->olddir = dirNone; + + FindNeighbors(mi); + + pp->nowdir = SelectNeighbor(mi); +} + +void +init_pipes(ModeInfo * mi) +{ + int screen = MI_SCREEN(mi); + pipesstruct *pp; + + if (pipes == NULL) { + if ((pipes = (pipesstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (pipesstruct))) == NULL) + return; + } + pp = &pipes[screen]; + + pp->glx_context = init_GL(mi); + + reshape(mi, MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + pp->initial_rotation = -10.0; + pinit(mi, 1); + + if (factory > 0) { + pp->valve = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_BigValve); + pp->bolts = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_Bolts3D); + pp->betweenbolts = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_PipeBetweenBolts); + + pp->elbowbolts = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_ElbowBolts); + pp->elbowcoins = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_ElbowCoins); + + pp->guagehead = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_GuageHead); + pp->guageface = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_GuageFace); + pp->guagedial = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_GuageDial); + pp->guageconnector = BuildLWO(MI_WIN_IS_WIREFRAME(mi), &LWO_GuageConnector); + } + /* else they are all 0, thanks to calloc(). */ + + if (MI_BATCHCOUNT(mi) < 1 || MI_BATCHCOUNT(mi) > NofSysTypes + 1) { + pp->system_type = NRAND(NofSysTypes) + 1; + } else { + pp->system_type = MI_BATCHCOUNT(mi); + } + + if (MI_CYCLES(mi) > 0 && MI_CYCLES(mi) < 11) { + pp->number_of_systems = MI_CYCLES(mi); + } else { + pp->number_of_systems = 5; + } + + if (MI_SIZE(mi) < 10) { + pp->system_length = 10; + } else if (MI_SIZE(mi) > 1000) { + pp->system_length = 1000; + } else { + pp->system_length = MI_SIZE(mi); + } + +} + +void +change_pipes(ModeInfo * mi) +{ + pipesstruct *pp = &pipes[MI_SCREEN(mi)]; + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), pp->glx_context); + pinit(mi, 1); +} + +void +release_pipes(ModeInfo * mi) +{ + if (pipes != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + pipesstruct *pp = &pipes[screen]; + + /* Display lists MUST be freed while their glXContext is current. */ + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), pp->glx_context); + + if (pp->valve) + glDeleteLists(pp->valve, 1); + if (pp->bolts) + glDeleteLists(pp->bolts, 1); + if (pp->betweenbolts) + glDeleteLists(pp->betweenbolts, 1); + + if (pp->elbowbolts) + glDeleteLists(pp->elbowbolts, 1); + if (pp->elbowcoins) + glDeleteLists(pp->elbowcoins, 1); + + if (pp->guagehead) + glDeleteLists(pp->guagehead, 1); + if (pp->guageface) + glDeleteLists(pp->guageface, 1); + if (pp->guagedial) + glDeleteLists(pp->guagedial, 1); + if (pp->guageconnector) + glDeleteLists(pp->guageconnector, 1); + } + + /* Don't destroy the glXContext. init_GL does that. */ + + (void) free((void *) pipes); + pipes = NULL; + } +} + +#endif diff --git a/hacks/glx/rubik.c b/hacks/glx/rubik.c new file mode 100644 index 00000000..00f8bfc3 --- /dev/null +++ b/hacks/glx/rubik.c @@ -0,0 +1,1402 @@ +/* -*- Mode: C; tab-width: 4 -*- */ +/* rubik --- Shows a self-solving Rubik's cube */ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)rubik.c 4.04 97/07/28 xlockmore"; + +#endif + +#undef DEBUG_LISTS + +/*- + * 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. + * + * This mode shows a self solving rubik's cube "puzzle". If somebody + * intends to make a game or something based on this code, please let me + * know first, my e-mail address is provided in this comment. Marcelo. + * + * Thanks goes also to Brian Paul for making it possible and inexpensive + * to use OpenGL at home. + * + * Since I'm not a native english speaker, my apologies for any gramatical + * mistake. + * + * My e-mail addresses are + * vianna@cat.cbpf.br + * and + * marcelo@venus.rdc.puc-rio.br + * + * Marcelo F. Vianna (Jul-31-1997) + * + * Revision History: + * 02-Aug-97: Now behaves more like puzzle.c: first show the cube being + * shuffled and then being solved. A mode specific option was added: + * "+/-hideshuffling" to provide the original behavior (in which + * only the solution is shown). + * The color labels corners are now rounded. + * Optimized the cubit() routine using glLists. + * 01-Aug-97: Shuffling now avoids movements that undoes the previous movement + * and three consecutive identical moves (which is pretty stupid). + * improved the "cycles" option in replacement of David's hack, + * now rp->anglestep is a GLfloat, so this option selects the + * "exact" number of frames that a rotation (movement) takes to + * complete. + * 30-Jul-97: Initial release, there is no algorithm to solve the puzzle, + * instead, it randomly shuffle the cube and then make the + * movements in the reverse order. + * The mode was written in 1 day (I got sick and had a license + * at work...) There was not much to do since I could not exit + * from home... :) + * + */ + +/*- + * Color labels mapping: + * ===================== + * + * +------------+ + * | 22| + * | | + * | | + * | TOP(0) | + * |^ | + * || | + * |00--> | + * +-----------+------------+-----------+ + * | 22| 22| 22| + * | | | | + * | | | | + * | LEFT(1) | FRONT(2) | RIGHT(3) | + * |^ |^ |^ | + * || || || | + * |00--> |00--> |00--> | + * +-----------+------------+-----------+ + * | 22| + * | | + * | | + * | BOTTOM(4) | rp->faces[N][X][Y]= + * |^ | F_[N][X][Y]= + * || | + * |00--> | +---+---+---+ + * +------------+ | | |XY | + * | 22| |02 |12 |22 | + * | | |---+---+---+ + * | | | xxxxx(N) | + * | BACK(5) | |01 |11 |21 | + * |^ | +---+---+---+ + * || | |XY | | | + * |00--> | |00 |10 |20 | + * +------------+ +---+---+---+ + * + * Map to 3d + * FRONT => X, Y + * BACK => X, Y + * LEFT => Z, Y + * RIGHT => Z, Y + * TOP => X, Z + * BOTTOM => X, Z + */ + +/*- + * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of + * the glCallList() functions below when using MesaGL 2.1. This has + * been fixed in MesaGL 2.2 and later releases. + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ +#include +#include + +#ifdef STANDALONE +# define PROGCLASS "Rubik" +# define HACK_INIT init_rubik +# define HACK_DRAW draw_rubik +# define rubik_opts xlockmore_opts +# define DEFAULTS "*delay: 50000 \n" \ + "*count: -30 \n" \ + "*cycles: 5 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +#define DEF_HIDESHUFFLING "False" + +static Bool hideshuffling; + +static XrmOptionDescRec opts[] = +{ + {"-hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, (caddr_t) "on"}, + {"+hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, (caddr_t) "off"} +}; + +static argtype vars[] = +{ + {(caddr_t *) & hideshuffling, "hideshuffling", "Hideshuffling", DEF_HIDESHUFFLING, t_Bool} +}; + +static OptionStruct desc[] = +{ + {"-/+hideshuffling", "turn on/off hidden shuffle phase"} +}; + +ModeSpecOpt rubik_opts = +{2, opts, 1, vars, desc}; + +#define Scale4Window 0.3 +#define Scale4Iconic 0.7 + +#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2) +#define sqr(A) ((A)*(A)) + +#ifndef Pi +#define Pi M_PI +#endif + +#define NO_ROTATION -1 +#define TOP_ROTATION 0 +#define LEFT_ROTATION 1 +#define FRONT_ROTATION 2 +#define RIGHT_ROTATION 3 +#define BOTTOM_ROTATION 4 +#define BACK_ROTATION 5 + +#define CLOCK_WISE 0 +#define C_CLOCK_WISE 1 + +#define ACTION_SOLVE 1 +#define ACTION_SHUFFLE 0 + +#define DELAY_AFTER_SHUFFLING 5 +#define DELAY_AFTER_SOLVING 20 + +#define F_ rp->faces + +/*************************************************************************/ + +/*- + * Ignore trivial case, since it adds needless complications. + * MAXSIZE must be 2 or greater. + */ + +#define MAXSIZEX 3 +#define MAXSIZEY 3 +#define MAXSIZEZ 3 +#define MAXSIZE (MAX(MAX(MAXSIZEX,MAXSIZEY),MAXSIZEZ)) +#define MAXSIZEXY (MAXSIZEX*MAXSIZEY) +#define MAXSIZEZY (MAXSIZEZ*MAXSIZEY) +#define MAXSIZEXZ (MAXSIZEX*MAXSIZEZ) +#define MAXSIZESQ (MAX(MAX(MAXSIZEXY,MAXSIZEZY),MAXSIZEXZ)) +#define LAST (MAXSIZE-1) +#define LASTX (MAXSIZEX-1) +#define LASTY (MAXSIZEY-1) +#define LASTZ (MAXSIZEZ-1) + +typedef struct { + GLint WindH, WindW; + GLfloat step; + char *movedfaces; + char *movedorient; + int storedmoves; + int shufflingmoves; + int action; + int done; + GLfloat anglestep; + char faces[6][MAXSIZE][MAXSIZE]; + int movement; + int orientation; + GLfloat rotatestep; + GLXContext glx_context; + int AreObjectsDefined[1]; +} rubikstruct; + +static float front_shininess[] = +{60.0}; +static float front_specular[] = +{0.7, 0.7, 0.7, 1.0}; +static float ambient[] = +{0.0, 0.0, 0.0, 1.0}; +static float diffuse[] = +{1.0, 1.0, 1.0, 1.0}; +static float position0[] = +{1.0, 1.0, 1.0, 0.0}; +static float position1[] = +{-1.0, -1.0, 1.0, 0.0}; +static float lmodel_ambient[] = +{0.5, 0.5, 0.5, 1.0}; +static float lmodel_twoside[] = +{GL_TRUE}; + +static float MaterialRed[] = +{0.5, 0.0, 0.0, 1.0}; +static float MaterialGreen[] = +{0.0, 0.5, 0.0, 1.0}; +static float MaterialBlue[] = +{0.0, 0.0, 0.5, 1.0}; +static float MaterialYellow[] = +{0.7, 0.7, 0.0, 1.0}; +static float MaterialOrange[] = +{1.0, 0.5, 0.4, 1.0}; + +#if 0 +static float MaterialMagenta[] = +{0.7, 0.0, 0.7, 1.0}; +static float MaterialCyan[] = +{0.0, 0.7, 0.7, 1.0}; + +#endif +static float MaterialWhite[] = +{0.8, 0.8, 0.8, 1.0}; +static float MaterialGray[] = +{0.2, 0.2, 0.2, 1.0}; + +static rubikstruct *rubik = NULL; +static GLuint objects; + +#define ObjCubit 0 + +static void +pickcolor(char C) +{ + switch (C) { + case 'R': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed); + break; + case 'G': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGreen); + break; + case 'B': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue); + break; + case 'Y': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow); + break; +#if 0 + case 'C': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialCyan); + break; + case 'M': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialMagenta); + break; +#else + case 'O': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialOrange); + break; + case 'W': + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite); + break; +#endif + } +} + +static void +draw_cubit(ModeInfo * mi, char BACK, char FRONT, char LEFT, char RIGHT, char BOTTOM, char TOP) +{ + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + + if (!rp->AreObjectsDefined[ObjCubit]) { + glNewList(objects + ObjCubit, GL_COMPILE_AND_EXECUTE); + glBegin(GL_QUADS); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glNormal3f(0.00, 0.00, 1.00); + glVertex3f(-0.45, -0.45, 0.50); + glVertex3f(0.45, -0.45, 0.50); + glVertex3f(0.45, 0.45, 0.50); + glVertex3f(-0.45, 0.45, 0.50); + glNormal3f(0.00, 0.00, -1.00); + glVertex3f(-0.45, 0.45, -0.50); + glVertex3f(0.45, 0.45, -0.50); + glVertex3f(0.45, -0.45, -0.50); + glVertex3f(-0.45, -0.45, -0.50); + glNormal3f(-1.00, 0.00, 0.00); + glVertex3f(-0.50, -0.45, 0.45); + glVertex3f(-0.50, 0.45, 0.45); + glVertex3f(-0.50, 0.45, -0.45); + glVertex3f(-0.50, -0.45, -0.45); + glNormal3f(1.00, 0.00, 0.00); + glVertex3f(0.50, -0.45, -0.45); + glVertex3f(0.50, 0.45, -0.45); + glVertex3f(0.50, 0.45, 0.45); + glVertex3f(0.50, -0.45, 0.45); + glNormal3f(0.00, -1.00, 0.00); + glVertex3f(0.45, -0.50, -0.45); + glVertex3f(0.45, -0.50, 0.45); + glVertex3f(-0.45, -0.50, 0.45); + glVertex3f(-0.45, -0.50, -0.45); + glNormal3f(0.00, 1.00, 0.00); + glVertex3f(-0.45, 0.50, -0.45); + glVertex3f(-0.45, 0.50, 0.45); + glVertex3f(0.45, 0.50, 0.45); + glVertex3f(0.45, 0.50, -0.45); + glNormal3f(-1.00, -1.00, 0.00); + glVertex3f(-0.45, -0.50, -0.45); + glVertex3f(-0.45, -0.50, 0.45); + glVertex3f(-0.50, -0.45, 0.45); + glVertex3f(-0.50, -0.45, -0.45); + glNormal3f(1.00, 1.00, 0.00); + glVertex3f(0.45, 0.50, -0.45); + glVertex3f(0.45, 0.50, 0.45); + glVertex3f(0.50, 0.45, 0.45); + glVertex3f(0.50, 0.45, -0.45); + glNormal3f(-1.00, 1.00, 0.00); + glVertex3f(-0.50, 0.45, -0.45); + glVertex3f(-0.50, 0.45, 0.45); + glVertex3f(-0.45, 0.50, 0.45); + glVertex3f(-0.45, 0.50, -0.45); + glNormal3f(1.00, -1.00, 0.00); + glVertex3f(0.50, -0.45, -0.45); + glVertex3f(0.50, -0.45, 0.45); + glVertex3f(0.45, -0.50, 0.45); + glVertex3f(0.45, -0.50, -0.45); + glNormal3f(0.00, -1.00, -1.00); + glVertex3f(-0.45, -0.45, -0.50); + glVertex3f(0.45, -0.45, -0.50); + glVertex3f(0.45, -0.50, -0.45); + glVertex3f(-0.45, -0.50, -0.45); + glNormal3f(0.00, 1.00, 1.00); + glVertex3f(-0.45, 0.45, 0.50); + glVertex3f(0.45, 0.45, 0.50); + glVertex3f(0.45, 0.50, 0.45); + glVertex3f(-0.45, 0.50, 0.45); + glNormal3f(0.00, -1.00, 1.00); + glVertex3f(-0.45, -0.50, 0.45); + glVertex3f(0.45, -0.50, 0.45); + glVertex3f(0.45, -0.45, 0.50); + glVertex3f(-0.45, -0.45, 0.50); + glNormal3f(0.00, 1.00, -1.00); + glVertex3f(-0.45, 0.50, -0.45); + glVertex3f(0.45, 0.50, -0.45); + glVertex3f(0.45, 0.45, -0.50); + glVertex3f(-0.45, 0.45, -0.50); + glNormal3f(-1.00, 0.00, -1.00); + glVertex3f(-0.50, -0.45, -0.45); + glVertex3f(-0.50, 0.45, -0.45); + glVertex3f(-0.45, 0.45, -0.50); + glVertex3f(-0.45, -0.45, -0.50); + glNormal3f(1.00, 0.00, 1.00); + glVertex3f(0.50, -0.45, 0.45); + glVertex3f(0.50, 0.45, 0.45); + glVertex3f(0.45, 0.45, 0.50); + glVertex3f(0.45, -0.45, 0.50); + glNormal3f(1.00, 0.00, -1.00); + glVertex3f(0.45, -0.45, -0.50); + glVertex3f(0.45, 0.45, -0.50); + glVertex3f(0.50, 0.45, -0.45); + glVertex3f(0.50, -0.45, -0.45); + glNormal3f(-1.00, 0.00, 1.00); + glVertex3f(-0.45, -0.45, 0.50); + glVertex3f(-0.45, 0.45, 0.50); + glVertex3f(-0.50, 0.45, 0.45); + glVertex3f(-0.50, -0.45, 0.45); + glEnd(); + glBegin(GL_TRIANGLES); + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray); + glNormal3f(1.00, 1.00, 1.00); + glVertex3f(0.45, 0.45, 0.50); + glVertex3f(0.50, 0.45, 0.45); + glVertex3f(0.45, 0.50, 0.45); + glNormal3f(-1.00, -1.00, -1.00); + glVertex3f(-0.45, -0.50, -0.45); + glVertex3f(-0.50, -0.45, -0.45); + glVertex3f(-0.45, -0.45, -0.50); + glNormal3f(-1.00, 1.00, 1.00); + glVertex3f(-0.45, 0.45, 0.50); + glVertex3f(-0.45, 0.50, 0.45); + glVertex3f(-0.50, 0.45, 0.45); + glNormal3f(1.00, -1.00, -1.00); + glVertex3f(0.50, -0.45, -0.45); + glVertex3f(0.45, -0.50, -0.45); + glVertex3f(0.45, -0.45, -0.50); + glNormal3f(1.00, -1.00, 1.00); + glVertex3f(0.45, -0.45, 0.50); + glVertex3f(0.45, -0.50, 0.45); + glVertex3f(0.50, -0.45, 0.45); + glNormal3f(-1.00, 1.00, -1.00); + glVertex3f(-0.50, 0.45, -0.45); + glVertex3f(-0.45, 0.50, -0.45); + glVertex3f(-0.45, 0.45, -0.50); + glNormal3f(-1.00, -1.00, 1.00); + glVertex3f(-0.45, -0.45, 0.50); + glVertex3f(-0.50, -0.45, 0.45); + glVertex3f(-0.45, -0.50, 0.45); + glNormal3f(1.00, 1.00, -1.00); + glVertex3f(0.50, 0.45, -0.45); + glVertex3f(0.45, 0.45, -0.50); + glVertex3f(0.45, 0.50, -0.45); + glEnd(); + glEndList(); + rp->AreObjectsDefined[ObjCubit] = 1; +#ifdef DEBUG_LISTS + (void) printf("Cubit drawn SLOWLY\n"); +#endif + } else { + glCallList(objects + ObjCubit); +#ifdef DEBUG_LISTS + (void) printf("Cubit drawn quickly\n"); +#endif + } + + if (BACK != ' ') { + glBegin(GL_POLYGON); + pickcolor(BACK); + glNormal3f(0.00, 0.00, -1.00); + glVertex3f(-0.35, 0.40, -0.51); + glVertex3f(0.35, 0.40, -0.51); + glVertex3f(0.40, 0.35, -0.51); + glVertex3f(0.40, -0.35, -0.51); + glVertex3f(0.35, -0.40, -0.51); + glVertex3f(-0.35, -0.40, -0.51); + glVertex3f(-0.40, -0.35, -0.51); + glVertex3f(-0.40, 0.35, -0.51); + glEnd(); + } + if (FRONT != ' ') { + glBegin(GL_POLYGON); + pickcolor(FRONT); + glNormal3f(0.00, 0.00, 1.00); + glVertex3f(-0.35, -0.40, 0.51); + glVertex3f(0.35, -0.40, 0.51); + glVertex3f(0.40, -0.35, 0.51); + glVertex3f(0.40, 0.35, 0.51); + glVertex3f(0.35, 0.40, 0.51); + glVertex3f(-0.35, 0.40, 0.51); + glVertex3f(-0.40, 0.35, 0.51); + glVertex3f(-0.40, -0.35, 0.51); + glEnd(); + } + if (LEFT != ' ') { + glBegin(GL_POLYGON); + pickcolor(LEFT); + glNormal3f(-1.00, 0.00, 0.00); + glVertex3f(-0.51, -0.35, 0.40); + glVertex3f(-0.51, 0.35, 0.40); + glVertex3f(-0.51, 0.40, 0.35); + glVertex3f(-0.51, 0.40, -0.35); + glVertex3f(-0.51, 0.35, -0.40); + glVertex3f(-0.51, -0.35, -0.40); + glVertex3f(-0.51, -0.40, -0.35); + glVertex3f(-0.51, -0.40, 0.35); + glEnd(); + } + if (RIGHT != ' ') { + glBegin(GL_POLYGON); + pickcolor(RIGHT); + glNormal3f(1.00, 0.00, 0.00); + glVertex3f(0.51, -0.35, -0.40); + glVertex3f(0.51, 0.35, -0.40); + glVertex3f(0.51, 0.40, -0.35); + glVertex3f(0.51, 0.40, 0.35); + glVertex3f(0.51, 0.35, 0.40); + glVertex3f(0.51, -0.35, 0.40); + glVertex3f(0.51, -0.40, 0.35); + glVertex3f(0.51, -0.40, -0.35); + glEnd(); + } + if (BOTTOM != ' ') { + glBegin(GL_POLYGON); + pickcolor(BOTTOM); + glNormal3f(0.00, -1.00, 0.00); + glVertex3f(0.40, -0.51, -0.35); + glVertex3f(0.40, -0.51, 0.35); + glVertex3f(0.35, -0.51, 0.40); + glVertex3f(-0.35, -0.51, 0.40); + glVertex3f(-0.40, -0.51, 0.35); + glVertex3f(-0.40, -0.51, -0.35); + glVertex3f(-0.35, -0.51, -0.40); + glVertex3f(0.35, -0.51, -0.40); + glEnd(); + } + if (TOP != ' ') { + glBegin(GL_POLYGON); + pickcolor(TOP); + glNormal3f(0.00, 1.00, 0.00); + glVertex3f(-0.40, 0.51, -0.35); + glVertex3f(-0.40, 0.51, 0.35); + glVertex3f(-0.35, 0.51, 0.40); + glVertex3f(0.35, 0.51, 0.40); + glVertex3f(0.40, 0.51, 0.35); + glVertex3f(0.40, 0.51, -0.35); + glVertex3f(0.35, 0.51, -0.40); + glVertex3f(-0.35, 0.51, -0.40); + glEnd(); + } + glEnd(); +} + +static void +draw_cube(ModeInfo * mi) +{ +#define S1 1 +#define S2 (S1*2) + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + + switch (rp->movement) { + case NO_ROTATION: + case BACK_ROTATION: + case FRONT_ROTATION: + glPushMatrix(); + if (rp->movement == BACK_ROTATION) + glRotatef(-rp->rotatestep, 0, 0, 1); + glTranslatef(-S1, -S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][0][LAST], ' ', + F_[LEFT_ROTATION][0][0], ' ', + F_[BOTTOM_ROTATION][0][0], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][1][LAST], ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][0], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][LAST][LAST], ' ', + ' ', F_[RIGHT_ROTATION][LAST][0], + F_[BOTTOM_ROTATION][LAST][0], ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][0][1], ' ', + F_[LEFT_ROTATION][0][1], ' ', + ' ', ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][1][1], ' ', + ' ', ' ', + ' ', ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][LAST][1], ' ', + ' ', F_[RIGHT_ROTATION][LAST][1], + ' ', ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][0][0], ' ', + F_[LEFT_ROTATION][0][LAST], ' ', + ' ', F_[TOP_ROTATION][0][LAST]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][1][0], ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][LAST]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, F_[BACK_ROTATION][LAST][0], ' ', + ' ', F_[RIGHT_ROTATION][LAST][LAST], + ' ', F_[TOP_ROTATION][LAST][LAST]); + glPopMatrix(); + glPushMatrix(); + glTranslatef(-S1, -S1, 0); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][0], ' ', + F_[BOTTOM_ROTATION][0][1], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][1], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][0], + F_[BOTTOM_ROTATION][LAST][1], ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][1], ' ', + ' ', ' '); + glTranslatef(2, 0, 0); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][1], + ' ', ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][LAST], ' ', + ' ', F_[TOP_ROTATION][0][1]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][1]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][LAST], + ' ', F_[TOP_ROTATION][LAST][1]); + glPopMatrix(); + if (rp->movement == FRONT_ROTATION) + glRotatef(rp->rotatestep, 0, 0, 1); + glTranslatef(-S1, -S1, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][0], + F_[LEFT_ROTATION][LAST][0], ' ', + F_[BOTTOM_ROTATION][0][LAST], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][0], + ' ', ' ', + F_[BOTTOM_ROTATION][1][LAST], ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][0], + ' ', F_[RIGHT_ROTATION][0][0], + F_[BOTTOM_ROTATION][LAST][LAST], ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][1], + F_[LEFT_ROTATION][LAST][1], ' ', + ' ', ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][1], + ' ', ' ', + ' ', ' '); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][1], + ' ', F_[RIGHT_ROTATION][0][1], + ' ', ' '); + glTranslatef(-S2, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][LASTY], + F_[LEFT_ROTATION][LAST][LAST], ' ', + ' ', F_[TOP_ROTATION][0][0]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][LASTY], + ' ', ' ', + ' ', F_[TOP_ROTATION][1][0]); + glTranslatef(S1, 0, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][LASTY], + ' ', F_[RIGHT_ROTATION][0][LAST], + ' ', F_[TOP_ROTATION][LAST][0]); + break; + case LEFT_ROTATION: + case RIGHT_ROTATION: + glPushMatrix(); + if (rp->movement == LEFT_ROTATION) + glRotatef(-rp->rotatestep, 1, 0, 0); + glTranslatef(-S1, -S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][0][LAST], ' ', + F_[LEFT_ROTATION][0][0], ' ', + F_[BOTTOM_ROTATION][0][0], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][0][1], ' ', + F_[LEFT_ROTATION][0][1], ' ', + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][0][0], ' ', + F_[LEFT_ROTATION][0][LAST], ' ', + ' ', F_[TOP_ROTATION][0][LAST]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][0], ' ', + F_[BOTTOM_ROTATION][0][1], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][1], ' ', + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][LAST], ' ', + ' ', F_[TOP_ROTATION][0][1]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][0], + F_[LEFT_ROTATION][LAST][0], ' ', + F_[BOTTOM_ROTATION][0][LAST], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][1], + F_[LEFT_ROTATION][LAST][1], ' ', + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][LASTY], + F_[LEFT_ROTATION][LAST][LAST], ' ', + ' ', F_[TOP_ROTATION][0][0]); + glPopMatrix(); + glPushMatrix(); + glTranslatef(0, -S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][1][LAST], ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][0], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][1][1], ' ', + ' ', ' ', + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][1][0], ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][LAST]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][1], ' '); + glTranslatef(0, S2, 0); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][1]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][0], + ' ', ' ', + F_[BOTTOM_ROTATION][1][LAST], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][1], + ' ', ' ', + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][LASTY], + ' ', ' ', + ' ', F_[TOP_ROTATION][1][0]); + glPopMatrix(); + if (rp->movement == RIGHT_ROTATION) + glRotatef(rp->rotatestep, 1, 0, 0); + glTranslatef(S1, -S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][LAST][LAST], ' ', + ' ', F_[RIGHT_ROTATION][LAST][0], + F_[BOTTOM_ROTATION][LAST][0], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][LAST][1], ' ', + ' ', F_[RIGHT_ROTATION][LAST][1], + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, F_[BACK_ROTATION][LAST][0], ' ', + ' ', F_[RIGHT_ROTATION][LAST][LAST], + ' ', F_[TOP_ROTATION][LAST][LAST]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][0], + F_[BOTTOM_ROTATION][LAST][1], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][1], + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][LAST], + ' ', F_[TOP_ROTATION][LAST][1]); + glTranslatef(0, -S2, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][0], + ' ', F_[RIGHT_ROTATION][0][0], + F_[BOTTOM_ROTATION][LAST][LAST], ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][1], + ' ', F_[RIGHT_ROTATION][0][1], + ' ', ' '); + glTranslatef(0, S1, 0); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][LASTY], + ' ', F_[RIGHT_ROTATION][0][LAST], + ' ', F_[TOP_ROTATION][LAST][0]); + break; + case BOTTOM_ROTATION: + case TOP_ROTATION: + glPushMatrix(); + if (rp->movement == BOTTOM_ROTATION) + glRotatef(-rp->rotatestep, 0, 1, 0); + glTranslatef(-S1, -S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][0][LAST], ' ', + F_[LEFT_ROTATION][0][0], ' ', + F_[BOTTOM_ROTATION][0][0], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][0], ' ', + F_[BOTTOM_ROTATION][0][1], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][0], + F_[LEFT_ROTATION][LAST][0], ' ', + F_[BOTTOM_ROTATION][0][LAST], ' '); + glTranslatef(S1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][1][LAST], ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][0], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + F_[BOTTOM_ROTATION][1][1], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][0], + ' ', ' ', + F_[BOTTOM_ROTATION][1][LAST], ' '); + glTranslatef(1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][LAST][LAST], ' ', + ' ', F_[RIGHT_ROTATION][LAST][0], + F_[BOTTOM_ROTATION][LAST][0], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][0], + F_[BOTTOM_ROTATION][LAST][1], ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][0], + ' ', F_[RIGHT_ROTATION][0][0], + F_[BOTTOM_ROTATION][LAST][LAST], ' '); + glPopMatrix(); + glPushMatrix(); + glTranslatef(-S1, 0, -S1); + draw_cubit(mi, F_[BACK_ROTATION][0][1], ' ', + F_[LEFT_ROTATION][0][1], ' ', + ' ', ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][1], ' ', + ' ', ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][1], + F_[LEFT_ROTATION][LAST][1], ' ', + ' ', ' '); + glTranslatef(1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][1][1], ' ', + ' ', ' ', + ' ', ' '); + glTranslatef(0, 0, S2); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][1], + ' ', ' ', + ' ', ' '); + glTranslatef(S1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][LAST][1], ' ', + ' ', F_[RIGHT_ROTATION][LAST][1], + ' ', ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][1], + ' ', ' '); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][1], + ' ', F_[RIGHT_ROTATION][0][1], + ' ', ' '); + glPopMatrix(); + if (rp->movement == TOP_ROTATION) + glRotatef(rp->rotatestep, 0, 1, 0); + glTranslatef(-S1, S1, -S1); + draw_cubit(mi, F_[BACK_ROTATION][0][0], ' ', + F_[LEFT_ROTATION][0][LAST], ' ', + ' ', F_[TOP_ROTATION][0][LAST]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + F_[LEFT_ROTATION][1][LAST], ' ', + ' ', F_[TOP_ROTATION][0][1]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][0][LASTY], + F_[LEFT_ROTATION][LAST][LAST], ' ', + ' ', F_[TOP_ROTATION][0][0]); + glTranslatef(S1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][1][0], ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][LAST]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + ' ', ' ', + ' ', F_[TOP_ROTATION][1][1]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][1][LASTY], + ' ', ' ', + ' ', F_[TOP_ROTATION][1][0]); + glTranslatef(S1, 0, -S2); + draw_cubit(mi, F_[BACK_ROTATION][LAST][0], ' ', + ' ', F_[RIGHT_ROTATION][LAST][LAST], + ' ', F_[TOP_ROTATION][LAST][LAST]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', ' ', + ' ', F_[RIGHT_ROTATION][1][LAST], + ' ', F_[TOP_ROTATION][LAST][1]); + glTranslatef(0, 0, S1); + draw_cubit(mi, ' ', F_[FRONT_ROTATION][LASTX][LASTY], + ' ', F_[RIGHT_ROTATION][0][LAST], + ' ', F_[TOP_ROTATION][LAST][0]); + break; + } +#undef S1 +#undef S2 +} + +static void +evalmovement(ModeInfo * mi, int face, char orient) +{ + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + char T1, T2, T3; + + if (face < 0 || face > 5) + return; + + if (orient == CLOCK_WISE) { + T1 = F_[face][0][LAST]; + T2 = F_[face][1][LAST]; + F_[face][0][LAST] = F_[face][0][0]; + F_[face][1][LAST] = F_[face][0][1]; + F_[face][0][0] = F_[face][LAST][0]; + F_[face][0][1] = F_[face][1][0]; + F_[face][1][0] = F_[face][LAST][1]; + F_[face][LAST][0] = F_[face][LAST][LAST]; + F_[face][LAST][LAST] = T1; /* F_[face][0][LAST]; */ + F_[face][LAST][1] = T2; /* F_[face][1][LAST]; */ + } else { + T1 = F_[face][0][0]; + T2 = F_[face][0][1]; + F_[face][0][0] = F_[face][0][LAST]; + F_[face][0][1] = F_[face][1][LAST]; + F_[face][0][LAST] = F_[face][LAST][LAST]; + F_[face][1][LAST] = F_[face][LAST][1]; + F_[face][LAST][1] = F_[face][1][0]; + F_[face][LAST][LAST] = F_[face][LAST][0]; + F_[face][1][0] = T2; /* F_[face][0][1]; */ + F_[face][LAST][0] = T1; /* F_[face][0][0]; */ + } + + switch (face) { + case BACK_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[BOTTOM_ROTATION][0][0]; + T2 = F_[BOTTOM_ROTATION][1][0]; + T3 = F_[BOTTOM_ROTATION][LAST][0]; + F_[BOTTOM_ROTATION][0][0] = F_[LEFT_ROTATION][0][LAST]; + F_[BOTTOM_ROTATION][1][0] = F_[LEFT_ROTATION][0][1]; + F_[BOTTOM_ROTATION][LAST][0] = F_[LEFT_ROTATION][0][0]; + F_[LEFT_ROTATION][0][0] = F_[TOP_ROTATION][0][LAST]; + F_[LEFT_ROTATION][0][1] = F_[TOP_ROTATION][1][LAST]; + F_[LEFT_ROTATION][0][LAST] = F_[TOP_ROTATION][LAST][LAST]; + F_[TOP_ROTATION][0][LAST] = F_[RIGHT_ROTATION][LAST][LAST]; + F_[TOP_ROTATION][1][LAST] = F_[RIGHT_ROTATION][LAST][1]; + F_[TOP_ROTATION][LAST][LAST] = F_[RIGHT_ROTATION][LAST][0]; + F_[RIGHT_ROTATION][LAST][0] = T1; /* F_[BOTTOM_ROTATION][0][0]; */ + F_[RIGHT_ROTATION][LAST][1] = T2; /* F_[BOTTOM_ROTATION][1][0]; */ + F_[RIGHT_ROTATION][LAST][LAST] = T3; /* F_[BOTTOM_ROTATION][LAST][0]; */ + } else { + T1 = F_[LEFT_ROTATION][0][LAST]; + T2 = F_[LEFT_ROTATION][0][1]; + T3 = F_[LEFT_ROTATION][0][0]; + F_[LEFT_ROTATION][0][LAST] = F_[BOTTOM_ROTATION][0][0]; + F_[LEFT_ROTATION][0][1] = F_[BOTTOM_ROTATION][1][0]; + F_[LEFT_ROTATION][0][0] = F_[BOTTOM_ROTATION][LAST][0]; + F_[BOTTOM_ROTATION][0][0] = F_[RIGHT_ROTATION][LAST][0]; + F_[BOTTOM_ROTATION][1][0] = F_[RIGHT_ROTATION][LAST][1]; + F_[BOTTOM_ROTATION][LAST][0] = F_[RIGHT_ROTATION][LAST][LAST]; + F_[RIGHT_ROTATION][LAST][LAST] = F_[TOP_ROTATION][0][LAST]; + F_[RIGHT_ROTATION][LAST][1] = F_[TOP_ROTATION][1][LAST]; + F_[RIGHT_ROTATION][LAST][0] = F_[TOP_ROTATION][LAST][LAST]; + F_[TOP_ROTATION][0][LAST] = T3; /* F_[LEFT_ROTATION][0][0]; */ + F_[TOP_ROTATION][1][LAST] = T2; /* F_[LEFT_ROTATION][0][1]; */ + F_[TOP_ROTATION][LAST][LAST] = T1; /* F_[LEFT_ROTATION][0][LAST]; */ + } + break; + case FRONT_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[RIGHT_ROTATION][0][LAST]; + T2 = F_[RIGHT_ROTATION][0][1]; + T3 = F_[RIGHT_ROTATION][0][0]; + F_[RIGHT_ROTATION][0][LAST] = F_[TOP_ROTATION][0][0]; + F_[RIGHT_ROTATION][0][1] = F_[TOP_ROTATION][1][0]; + F_[RIGHT_ROTATION][0][0] = F_[TOP_ROTATION][LAST][0]; + F_[TOP_ROTATION][0][0] = F_[LEFT_ROTATION][LAST][0]; + F_[TOP_ROTATION][1][0] = F_[LEFT_ROTATION][LAST][1]; + F_[TOP_ROTATION][LAST][0] = F_[LEFT_ROTATION][LAST][LAST]; + F_[LEFT_ROTATION][LAST][LAST] = F_[BOTTOM_ROTATION][0][LAST]; + F_[LEFT_ROTATION][LAST][1] = F_[BOTTOM_ROTATION][1][LAST]; + F_[LEFT_ROTATION][LAST][0] = F_[BOTTOM_ROTATION][LAST][LAST]; + F_[BOTTOM_ROTATION][0][LAST] = T3; /* F_[RIGHT_ROTATION][0][0]; */ + F_[BOTTOM_ROTATION][1][LAST] = T2; /* F_[RIGHT_ROTATION][0][1]; */ + F_[BOTTOM_ROTATION][LAST][LAST] = T1; /* F_[RIGHT_ROTATION][0][LAST]; */ + } else { + T1 = F_[TOP_ROTATION][0][0]; + T2 = F_[TOP_ROTATION][1][0]; + T3 = F_[TOP_ROTATION][LAST][0]; + F_[TOP_ROTATION][0][0] = F_[RIGHT_ROTATION][0][LAST]; + F_[TOP_ROTATION][1][0] = F_[RIGHT_ROTATION][0][1]; + F_[TOP_ROTATION][LAST][0] = F_[RIGHT_ROTATION][0][0]; + F_[RIGHT_ROTATION][0][0] = F_[BOTTOM_ROTATION][0][LAST]; + F_[RIGHT_ROTATION][0][1] = F_[BOTTOM_ROTATION][1][LAST]; + F_[RIGHT_ROTATION][0][LAST] = F_[BOTTOM_ROTATION][LAST][LAST]; + F_[BOTTOM_ROTATION][0][LAST] = F_[LEFT_ROTATION][LAST][LAST]; + F_[BOTTOM_ROTATION][1][LAST] = F_[LEFT_ROTATION][LAST][1]; + F_[BOTTOM_ROTATION][LAST][LAST] = F_[LEFT_ROTATION][LAST][0]; + F_[LEFT_ROTATION][LAST][0] = T1; /* F_[TOP_ROTATION][0][0]; */ + F_[LEFT_ROTATION][LAST][1] = T2; /* F_[TOP_ROTATION][1][0]; */ + F_[LEFT_ROTATION][LAST][LAST] = T3; /* F_[TOP_ROTATION][LAST][0]; */ + } + break; + case LEFT_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[TOP_ROTATION][0][0]; + T2 = F_[TOP_ROTATION][0][1]; + T3 = F_[TOP_ROTATION][0][LAST]; + F_[TOP_ROTATION][0][0] = F_[BACK_ROTATION][0][0]; + F_[TOP_ROTATION][0][1] = F_[BACK_ROTATION][0][1]; + F_[TOP_ROTATION][0][LAST] = F_[BACK_ROTATION][0][LAST]; + F_[BACK_ROTATION][0][0] = F_[BOTTOM_ROTATION][0][0]; + F_[BACK_ROTATION][0][1] = F_[BOTTOM_ROTATION][0][1]; + F_[BACK_ROTATION][0][LAST] = F_[BOTTOM_ROTATION][0][LAST]; + F_[BOTTOM_ROTATION][0][0] = F_[FRONT_ROTATION][0][0]; + F_[BOTTOM_ROTATION][0][1] = F_[FRONT_ROTATION][0][1]; + F_[BOTTOM_ROTATION][0][LAST] = F_[FRONT_ROTATION][0][LASTY]; + F_[FRONT_ROTATION][0][0] = T1; /* F_[TOP_ROTATION][0][0]; */ + F_[FRONT_ROTATION][0][1] = T2; /* F_[TOP_ROTATION][0][1]; */ + F_[FRONT_ROTATION][0][LASTY] = T3; /* F_[TOP_ROTATION][0][LAST]; */ + } else { + T1 = F_[BACK_ROTATION][0][0]; + T2 = F_[BACK_ROTATION][0][1]; + T3 = F_[BACK_ROTATION][0][LAST]; + F_[BACK_ROTATION][0][0] = F_[TOP_ROTATION][0][0]; + F_[BACK_ROTATION][0][1] = F_[TOP_ROTATION][0][1]; + F_[BACK_ROTATION][0][LAST] = F_[TOP_ROTATION][0][LAST]; + F_[TOP_ROTATION][0][0] = F_[FRONT_ROTATION][0][0]; + F_[TOP_ROTATION][0][1] = F_[FRONT_ROTATION][0][1]; + F_[TOP_ROTATION][0][LAST] = F_[FRONT_ROTATION][0][LASTY]; + F_[FRONT_ROTATION][0][0] = F_[BOTTOM_ROTATION][0][0]; + F_[FRONT_ROTATION][0][1] = F_[BOTTOM_ROTATION][0][1]; + F_[FRONT_ROTATION][0][LASTY] = F_[BOTTOM_ROTATION][0][LAST]; + F_[BOTTOM_ROTATION][0][0] = T1; /* F_[BACK_ROTATION][0][0]; */ + F_[BOTTOM_ROTATION][0][1] = T2; /* F_[BACK_ROTATION][0][1]; */ + F_[BOTTOM_ROTATION][0][LAST] = T3; /* F_[BACK_ROTATION][0][LAST]; */ + } + break; + case RIGHT_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[TOP_ROTATION][LAST][0]; + T2 = F_[TOP_ROTATION][LAST][1]; + T3 = F_[TOP_ROTATION][LAST][LAST]; + F_[TOP_ROTATION][LAST][0] = F_[FRONT_ROTATION][LASTX][0]; + F_[TOP_ROTATION][LAST][1] = F_[FRONT_ROTATION][LASTX][1]; + F_[TOP_ROTATION][LAST][LAST] = F_[FRONT_ROTATION][LASTX][LASTY]; + F_[FRONT_ROTATION][LASTX][0] = F_[BOTTOM_ROTATION][LAST][0]; + F_[FRONT_ROTATION][LASTX][1] = F_[BOTTOM_ROTATION][LAST][1]; + F_[FRONT_ROTATION][LASTX][LASTY] = F_[BOTTOM_ROTATION][LAST][LAST]; + F_[BOTTOM_ROTATION][LAST][0] = F_[BACK_ROTATION][LAST][0]; + F_[BOTTOM_ROTATION][LAST][1] = F_[BACK_ROTATION][LAST][1]; + F_[BOTTOM_ROTATION][LAST][LAST] = F_[BACK_ROTATION][LAST][LAST]; + F_[BACK_ROTATION][LAST][0] = T1; /* F_[TOP_ROTATION][LAST][0]; */ + F_[BACK_ROTATION][LAST][1] = T2; /* F_[TOP_ROTATION][LAST][1]; */ + F_[BACK_ROTATION][LAST][LAST] = T3; /* F_[TOP_ROTATION][LAST][LAST]; */ + } else { + T1 = F_[FRONT_ROTATION][LASTX][0]; + T2 = F_[FRONT_ROTATION][LASTX][1]; + T3 = F_[FRONT_ROTATION][LASTX][LASTY]; + F_[FRONT_ROTATION][LASTX][0] = F_[TOP_ROTATION][LAST][0]; + F_[FRONT_ROTATION][LASTX][1] = F_[TOP_ROTATION][LAST][1]; + F_[FRONT_ROTATION][LASTX][LASTY] = F_[TOP_ROTATION][LAST][LAST]; + F_[TOP_ROTATION][LAST][0] = F_[BACK_ROTATION][LAST][0]; + F_[TOP_ROTATION][LAST][1] = F_[BACK_ROTATION][LAST][1]; + F_[TOP_ROTATION][LAST][LAST] = F_[BACK_ROTATION][LAST][LAST]; + F_[BACK_ROTATION][LAST][0] = F_[BOTTOM_ROTATION][LAST][0]; + F_[BACK_ROTATION][LAST][1] = F_[BOTTOM_ROTATION][LAST][1]; + F_[BACK_ROTATION][LAST][LAST] = F_[BOTTOM_ROTATION][LAST][LAST]; + F_[BOTTOM_ROTATION][LAST][0] = T1; /* F_[FRONT_ROTATION][LASTX][0]; */ + F_[BOTTOM_ROTATION][LAST][1] = T2; /* F_[FRONT_ROTATION][LASTX][1]; */ + F_[BOTTOM_ROTATION][LAST][LAST] = T3; /* F_[FRONT_ROTATION][LASTX][LASTY]; */ + } + break; + case BOTTOM_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[FRONT_ROTATION][0][0]; + T2 = F_[FRONT_ROTATION][1][0]; + T3 = F_[FRONT_ROTATION][LASTX][0]; + F_[FRONT_ROTATION][0][0] = F_[LEFT_ROTATION][0][0]; + F_[FRONT_ROTATION][1][0] = F_[LEFT_ROTATION][1][0]; + F_[FRONT_ROTATION][LASTX][0] = F_[LEFT_ROTATION][LAST][0]; + F_[LEFT_ROTATION][0][0] = F_[BACK_ROTATION][LAST][LAST]; + F_[LEFT_ROTATION][1][0] = F_[BACK_ROTATION][1][LAST]; + F_[LEFT_ROTATION][LAST][0] = F_[BACK_ROTATION][0][LAST]; + F_[BACK_ROTATION][LAST][LAST] = F_[RIGHT_ROTATION][0][0]; + F_[BACK_ROTATION][1][LAST] = F_[RIGHT_ROTATION][1][0]; + F_[BACK_ROTATION][0][LAST] = F_[RIGHT_ROTATION][LAST][0]; + F_[RIGHT_ROTATION][0][0] = T1; /* F_[FRONT_ROTATION][0][0]; */ + F_[RIGHT_ROTATION][1][0] = T2; /* F_[FRONT_ROTATION][1][0]; */ + F_[RIGHT_ROTATION][LAST][0] = T3; /* F_[FRONT_ROTATION][LASTX][0]; */ + } else { + T1 = F_[BACK_ROTATION][LAST][LAST]; + T2 = F_[BACK_ROTATION][1][LAST]; + T3 = F_[BACK_ROTATION][0][LAST]; + F_[BACK_ROTATION][LAST][LAST] = F_[LEFT_ROTATION][0][0]; + F_[BACK_ROTATION][1][LAST] = F_[LEFT_ROTATION][1][0]; + F_[BACK_ROTATION][0][LAST] = F_[LEFT_ROTATION][LAST][0]; + F_[LEFT_ROTATION][0][0] = F_[FRONT_ROTATION][0][0]; + F_[LEFT_ROTATION][1][0] = F_[FRONT_ROTATION][1][0]; + F_[LEFT_ROTATION][LAST][0] = F_[FRONT_ROTATION][LASTX][0]; + F_[FRONT_ROTATION][0][0] = F_[RIGHT_ROTATION][0][0]; + F_[FRONT_ROTATION][1][0] = F_[RIGHT_ROTATION][1][0]; + F_[FRONT_ROTATION][LASTX][0] = F_[RIGHT_ROTATION][LAST][0]; + F_[RIGHT_ROTATION][0][0] = T1; /* F_[BACK_ROTATION][LAST][LAST]; */ + F_[RIGHT_ROTATION][1][0] = T2; /* F_[BACK_ROTATION][1][LAST]; */ + F_[RIGHT_ROTATION][LAST][0] = T3; /* F_[BACK_ROTATION][0][LAST]; */ + } + break; + case TOP_ROTATION: + if (orient == CLOCK_WISE) { + T1 = F_[BACK_ROTATION][0][0]; + T2 = F_[BACK_ROTATION][1][0]; + T3 = F_[BACK_ROTATION][LAST][0]; + F_[BACK_ROTATION][0][0] = F_[LEFT_ROTATION][LAST][LAST]; + F_[BACK_ROTATION][1][0] = F_[LEFT_ROTATION][1][LAST]; + F_[BACK_ROTATION][LAST][0] = F_[LEFT_ROTATION][0][LAST]; + F_[LEFT_ROTATION][LAST][LAST] = F_[FRONT_ROTATION][LASTX][LASTY]; + F_[LEFT_ROTATION][1][LAST] = F_[FRONT_ROTATION][1][LASTY]; + F_[LEFT_ROTATION][0][LAST] = F_[FRONT_ROTATION][0][LASTY]; + F_[FRONT_ROTATION][LASTX][LASTY] = F_[RIGHT_ROTATION][LAST][LAST]; + F_[FRONT_ROTATION][1][LASTY] = F_[RIGHT_ROTATION][1][LAST]; + F_[FRONT_ROTATION][0][LASTY] = F_[RIGHT_ROTATION][0][LAST]; + F_[RIGHT_ROTATION][LAST][LAST] = T1; /* F_[BACK_ROTATION][0][0]; */ + F_[RIGHT_ROTATION][1][LAST] = T2; /* F_[BACK_ROTATION][1][0]; */ + F_[RIGHT_ROTATION][0][LAST] = T3; /* F_[BACK_ROTATION][LAST][0]; */ + } else { + T1 = F_[RIGHT_ROTATION][LAST][LAST]; + T2 = F_[RIGHT_ROTATION][1][LAST]; + T3 = F_[RIGHT_ROTATION][0][LAST]; + F_[RIGHT_ROTATION][LAST][LAST] = F_[FRONT_ROTATION][LASTX][LASTY]; + F_[RIGHT_ROTATION][1][LAST] = F_[FRONT_ROTATION][1][LASTY]; + F_[RIGHT_ROTATION][0][LAST] = F_[FRONT_ROTATION][0][LASTY]; + F_[FRONT_ROTATION][LASTX][LASTY] = F_[LEFT_ROTATION][LAST][LAST]; + F_[FRONT_ROTATION][1][LASTY] = F_[LEFT_ROTATION][1][LAST]; + F_[FRONT_ROTATION][0][LASTY] = F_[LEFT_ROTATION][0][LAST]; + F_[LEFT_ROTATION][LAST][LAST] = F_[BACK_ROTATION][0][0]; + F_[LEFT_ROTATION][1][LAST] = F_[BACK_ROTATION][1][0]; + F_[LEFT_ROTATION][0][LAST] = F_[BACK_ROTATION][LAST][0]; + F_[BACK_ROTATION][0][0] = T1; /* F_[RIGHT_ROTATION][LAST][LAST]; */ + F_[BACK_ROTATION][1][0] = T2; /* F_[RIGHT_ROTATION][1][LAST]; */ + F_[BACK_ROTATION][LAST][0] = T3; /* F_[RIGHT_ROTATION][0][LAST]; */ + } + break; + } +} + +static void +shuffle(ModeInfo * mi) +{ + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + int i, mov, ori; + + memset(F_[TOP_ROTATION], 'R', MAXSIZEXZ); + memset(F_[LEFT_ROTATION], 'Y', MAXSIZEZY); + memset(F_[FRONT_ROTATION], 'W', MAXSIZEXY); + memset(F_[RIGHT_ROTATION], 'G', MAXSIZEZY); + memset(F_[BOTTOM_ROTATION], 'O', MAXSIZEXZ); + memset(F_[BACK_ROTATION], 'B', MAXSIZEXY); + + rp->storedmoves = MI_BATCHCOUNT(mi); + if (rp->storedmoves < 0) { + if (rp->movedfaces != NULL) + (void) free((void *) rp->movedfaces); + if (rp->movedorient != NULL) + (void) free((void *) rp->movedorient); + rp->movedfaces = NULL; + rp->movedorient = NULL; + rp->storedmoves = NRAND(-rp->storedmoves) + 1; + } + if ((rp->storedmoves) && (rp->movedfaces == NULL)) + if ((rp->movedfaces = + (char *) calloc(rp->storedmoves + 1, sizeof (char))) == NULL) + (void) fprintf(stderr, + "Could not allocate memory for rubik move buffer\n"); + + if ((rp->storedmoves) && (rp->movedorient == NULL)) + if ((rp->movedorient = + (char *) calloc(rp->storedmoves + 1, sizeof (char))) == NULL) + (void) fprintf(stderr, + "Could not allocate memory for rubik orient buffer\n"); + + if (MI_CYCLES(mi) <= 1) { + rp->anglestep = 90.0; + } else { + rp->anglestep = 90.0 / (GLfloat) (MI_CYCLES(mi)); + } + + for (i = 0; i < rp->storedmoves; i++) { + int condition; + + do { + mov = NRAND(6); + ori = NRAND(2); + condition = 1; + if (i > 0) /* avoid immediate undoing moves */ + if (mov == rp->movedfaces[i - 1] && + ori == rp->movedorient[i - 1]) + condition = 0; + if (i > 1) /* avoid 3 consecutive identical moves */ + if (mov == rp->movedfaces[i - 1] && + ori != rp->movedorient[i - 1] && + rp->movedfaces[i - 1] == rp->movedfaces[i - 2] && + rp->movedorient[i - 1] == rp->movedorient[i - 2]) + condition = 0; + } while (!condition); + if (hideshuffling) + evalmovement(mi, mov, ori); + rp->movedfaces[i] = mov; + rp->movedorient[i] = (ori == CLOCK_WISE) ? C_CLOCK_WISE : CLOCK_WISE; + } + rp->movement = NO_ROTATION; + rp->rotatestep = 0; + rp->action = hideshuffling ? ACTION_SOLVE : ACTION_SHUFFLE; + rp->shufflingmoves = 0; + rp->done = 0; +} + +void +draw_rubik(ModeInfo * mi) +{ + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glDrawBuffer(GL_BACK); + glXMakeCurrent(display, window, rp->glx_context); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glTranslatef(0.0, 0.0, -10.0); + + if (!MI_WIN_IS_ICONIC(mi)) { + glScalef(Scale4Window * rp->WindH / rp->WindW, Scale4Window, Scale4Window); + } else { + glScalef(Scale4Iconic * rp->WindH / rp->WindW, Scale4Iconic, Scale4Iconic); + } + + glRotatef(rp->step * 100, 1, 0, 0); + glRotatef(rp->step * 95, 0, 1, 0); + glRotatef(rp->step * 90, 0, 0, 1); + + if (rp->action == ACTION_SHUFFLE) { + if (rp->done) { + if (++rp->rotatestep > DELAY_AFTER_SHUFFLING) { + rp->movement = NO_ROTATION; + rp->rotatestep = 0; + rp->action = ACTION_SOLVE; + rp->done = 0; + } + } else { + if (rp->movement == NO_ROTATION) { + if (rp->shufflingmoves < rp->storedmoves) { + rp->rotatestep = 0; + rp->movement = rp->movedfaces[rp->shufflingmoves]; + rp->orientation = + (rp->movedorient[rp->shufflingmoves] == CLOCK_WISE) ? + C_CLOCK_WISE : CLOCK_WISE; + } else { + rp->rotatestep = 0; + rp->done = 1; + } + } else { + rp->rotatestep += (rp->orientation == CLOCK_WISE) ? + -rp->anglestep : rp->anglestep; + if (rp->rotatestep > 90 || rp->rotatestep < -90) { + evalmovement(mi, rp->movement, rp->orientation); + rp->shufflingmoves++; + rp->movement = NO_ROTATION; + } + } + } + } else { + if (rp->done) { + if (++rp->rotatestep > DELAY_AFTER_SOLVING) + shuffle(mi); + } else { + if (rp->movement == NO_ROTATION) { + if (rp->storedmoves > 0) { + rp->rotatestep = 0; + rp->movement = rp->movedfaces[rp->storedmoves - 1]; + rp->orientation = rp->movedorient[rp->storedmoves - 1]; + } else { + rp->rotatestep = 0; + rp->done = 1; + } + } else { + rp->rotatestep += (rp->orientation == CLOCK_WISE) ? + -rp->anglestep : rp->anglestep; + if (rp->rotatestep > 90 || rp->rotatestep < -90) { + evalmovement(mi, rp->movement, rp->orientation); + rp->storedmoves--; + rp->movement = NO_ROTATION; + } + } + } + } + + draw_cube(mi); + + glPopMatrix(); + + glFlush(); + + glXSwapBuffers(display, window); + + rp->step += 0.05; +} + +static void +reshape(ModeInfo * mi, int width, int height) +{ + rubikstruct *rp = &rubik[MI_SCREEN(mi)]; + + glViewport(0, 0, rp->WindW = (GLint) width, rp->WindH = (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); + glMatrixMode(GL_MODELVIEW); + + rp->AreObjectsDefined[ObjCubit] = 0; +} + +static void +pinit(ModeInfo * mi) +{ + glClearDepth(1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); + glColor3f(1.0, 1.0, 1.0); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glEnable(GL_CULL_FACE); + + glShadeModel(GL_FLAT); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular); + + shuffle(mi); +} + +void +init_rubik(ModeInfo * mi) +{ + int screen = MI_SCREEN(mi); + rubikstruct *rp; + + if (rubik == NULL) { + if ((rubik = (rubikstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (rubikstruct))) == NULL) + return; + } + rp = &rubik[screen]; + rp->step = NRAND(90); + + rp->glx_context = init_GL(mi); + + reshape(mi, MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + objects = glGenLists(1); + pinit(mi); +} + +void +change_rubik(ModeInfo * mi) +{ + pinit(mi); +} + +void +release_rubik(ModeInfo * mi) +{ + if (rubik != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + rubikstruct *rp = &rubik[screen]; + + if (rp->movedfaces != NULL) + (void) free((void *) rp->movedfaces); + if (rp->movedorient != NULL) + (void) free((void *) rp->movedorient); + } + (void) free((void *) rubik); + rubik = NULL; + } +} + +#undef F_ +#endif diff --git a/hacks/glx/s1_1.c b/hacks/glx/s1_1.c new file mode 100644 index 00000000..b7e22271 --- /dev/null +++ b/hacks/glx/s1_1.c @@ -0,0 +1,1058 @@ + +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_1.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_1" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_1_PNTS[] = +{ + (GLfloat) 0.332422, (GLfloat) 0.132531, (GLfloat) - 0.332422, + (GLfloat) 0.332422, (GLfloat) 0.132531, (GLfloat) - 0.667578, + (GLfloat) 0.667578, (GLfloat) 0.132531, (GLfloat) - 0.332422, + (GLfloat) 0.667578, (GLfloat) 0.132531, (GLfloat) - 0.667578, + (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.638667, + (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.638667, + (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.361333, + (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.361333, + (GLfloat) 0.653656, (GLfloat) 0.494688, (GLfloat) - 0.653656, + (GLfloat) 0.346344, (GLfloat) 0.494688, (GLfloat) - 0.653656, + (GLfloat) 0.346344, (GLfloat) 0.494688, (GLfloat) - 0.346344, + (GLfloat) 0.653656, (GLfloat) 0.494688, (GLfloat) - 0.346344, + (GLfloat) 0.667578, (GLfloat) 0.838781, (GLfloat) - 0.667578, + (GLfloat) 0.667578, (GLfloat) 0.838781, (GLfloat) - 0.332422, + (GLfloat) 0.638667, (GLfloat) 0.958463, (GLfloat) - 0.361333, + (GLfloat) 0.638667, (GLfloat) 0.958463, (GLfloat) - 0.638667, + (GLfloat) 0.332422, (GLfloat) 0.838781, (GLfloat) - 0.332422, + (GLfloat) 0.361333, (GLfloat) 0.958463, (GLfloat) - 0.361333, + (GLfloat) 0.332422, (GLfloat) 0.838781, (GLfloat) - 0.667578, + (GLfloat) 0.361333, (GLfloat) 0.958463, (GLfloat) - 0.638667, + (GLfloat) 0.738539, (GLfloat) 0.926712, (GLfloat) - 0.500000, + (GLfloat) 0.714805, (GLfloat) 0.686547, (GLfloat) - 0.500000, + (GLfloat) 0.728516, (GLfloat) 0.838781, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.926712, (GLfloat) - 0.261461, + (GLfloat) 0.674539, (GLfloat) 0.926104, (GLfloat) - 0.325461, + (GLfloat) 0.500000, (GLfloat) 0.976924, (GLfloat) - 0.500000, + (GLfloat) 0.677562, (GLfloat) 0.965162, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.926712, (GLfloat) - 0.738539, + (GLfloat) 0.674539, (GLfloat) 0.926104, (GLfloat) - 0.674539, + (GLfloat) 0.500000, (GLfloat) 0.686547, (GLfloat) - 0.285195, + (GLfloat) 0.500000, (GLfloat) 0.838781, (GLfloat) - 0.271484, + (GLfloat) 0.261461, (GLfloat) 0.926712, (GLfloat) - 0.500000, + (GLfloat) 0.325461, (GLfloat) 0.926104, (GLfloat) - 0.325461, + (GLfloat) 0.500000, (GLfloat) 0.965162, (GLfloat) - 0.322437, + (GLfloat) 0.285195, (GLfloat) 0.686547, (GLfloat) - 0.500000, + (GLfloat) 0.271484, (GLfloat) 0.838781, (GLfloat) - 0.500000, + (GLfloat) 0.325461, (GLfloat) 0.926104, (GLfloat) - 0.674539, + (GLfloat) 0.322437, (GLfloat) 0.965162, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.686547, (GLfloat) - 0.714805, + (GLfloat) 0.500000, (GLfloat) 0.838781, (GLfloat) - 0.728516, + (GLfloat) 0.500000, (GLfloat) 0.965162, (GLfloat) - 0.677562, + (GLfloat) 0.657523, (GLfloat) 0.686547, (GLfloat) - 0.657523, + (GLfloat) 0.714805, (GLfloat) 0.295922, (GLfloat) - 0.500000, + (GLfloat) 0.709531, (GLfloat) 0.494688, (GLfloat) - 0.500000, + (GLfloat) 0.657523, (GLfloat) 0.686547, (GLfloat) - 0.342477, + (GLfloat) 0.342477, (GLfloat) 0.686547, (GLfloat) - 0.657523, + (GLfloat) 0.500000, (GLfloat) 0.295922, (GLfloat) - 0.714805, + (GLfloat) 0.500000, (GLfloat) 0.494688, (GLfloat) - 0.709531, + (GLfloat) 0.500000, (GLfloat) 0.295922, (GLfloat) - 0.285195, + (GLfloat) 0.500000, (GLfloat) 0.494688, (GLfloat) - 0.290469, + (GLfloat) 0.342477, (GLfloat) 0.686547, (GLfloat) - 0.342477, + (GLfloat) 0.285195, (GLfloat) 0.295922, (GLfloat) - 0.500000, + (GLfloat) 0.290469, (GLfloat) 0.494688, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.039819, (GLfloat) - 0.738539, + (GLfloat) 0.500000, (GLfloat) 0.132531, (GLfloat) - 0.728516, + (GLfloat) 0.657523, (GLfloat) 0.295922, (GLfloat) - 0.657523, + (GLfloat) 0.342477, (GLfloat) 0.295922, (GLfloat) - 0.657523, + (GLfloat) 0.342477, (GLfloat) 0.295922, (GLfloat) - 0.342477, + (GLfloat) 0.261461, (GLfloat) 0.039819, (GLfloat) - 0.500000, + (GLfloat) 0.271484, (GLfloat) 0.132531, (GLfloat) - 0.500000, + (GLfloat) 0.657523, (GLfloat) 0.295922, (GLfloat) - 0.342477, + (GLfloat) 0.500000, (GLfloat) 0.039819, (GLfloat) - 0.261461, + (GLfloat) 0.500000, (GLfloat) 0.132531, (GLfloat) - 0.271484, + (GLfloat) 0.738539, (GLfloat) 0.039819, (GLfloat) - 0.500000, + (GLfloat) 0.728516, (GLfloat) 0.132531, (GLfloat) - 0.500000, + (GLfloat) 0.674539, (GLfloat) 0.040427, (GLfloat) - 0.674539, + (GLfloat) 0.500000, (GLfloat) - 0.010924, (GLfloat) - 0.500000, + (GLfloat) 0.677562, (GLfloat) 0.000839, (GLfloat) - 0.500000, + (GLfloat) 0.674539, (GLfloat) 0.040427, (GLfloat) - 0.325461, + (GLfloat) 0.325461, (GLfloat) 0.040427, (GLfloat) - 0.674539, + (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.677562, + (GLfloat) 0.325461, (GLfloat) 0.040427, (GLfloat) - 0.325461, + (GLfloat) 0.322437, (GLfloat) 0.000839, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.322437, + (GLfloat) 0.721812, (GLfloat) 0.890313, (GLfloat) - 0.595062, + (GLfloat) 0.706063, (GLfloat) 0.769563, (GLfloat) - 0.588313, + (GLfloat) 0.713281, (GLfloat) 0.838781, (GLfloat) - 0.591406, + (GLfloat) 0.721812, (GLfloat) 0.890313, (GLfloat) - 0.404938, + (GLfloat) 0.737656, (GLfloat) 0.890313, (GLfloat) - 0.500000, + (GLfloat) 0.706000, (GLfloat) 0.949319, (GLfloat) - 0.587500, + (GLfloat) 0.722453, (GLfloat) 0.926408, (GLfloat) - 0.595141, + (GLfloat) 0.595062, (GLfloat) 0.890313, (GLfloat) - 0.721812, + (GLfloat) 0.674281, (GLfloat) 0.890313, (GLfloat) - 0.674281, + (GLfloat) 0.595062, (GLfloat) 0.890313, (GLfloat) - 0.278187, + (GLfloat) 0.674281, (GLfloat) 0.890313, (GLfloat) - 0.325719, + (GLfloat) 0.706000, (GLfloat) 0.949319, (GLfloat) - 0.412500, + (GLfloat) 0.722453, (GLfloat) 0.926408, (GLfloat) - 0.404859, + (GLfloat) 0.706063, (GLfloat) 0.769563, (GLfloat) - 0.411687, + (GLfloat) 0.713281, (GLfloat) 0.838781, (GLfloat) - 0.408594, + (GLfloat) 0.590500, (GLfloat) 0.971195, (GLfloat) - 0.409500, + (GLfloat) 0.664625, (GLfloat) 0.962948, (GLfloat) - 0.417500, + (GLfloat) 0.721500, (GLfloat) 0.950535, (GLfloat) - 0.500000, + (GLfloat) 0.587500, (GLfloat) 0.949319, (GLfloat) - 0.294000, + (GLfloat) 0.660875, (GLfloat) 0.948104, (GLfloat) - 0.339125, + (GLfloat) 0.587500, (GLfloat) 0.949319, (GLfloat) - 0.706000, + (GLfloat) 0.660875, (GLfloat) 0.948104, (GLfloat) - 0.660875, + (GLfloat) 0.590500, (GLfloat) 0.971195, (GLfloat) - 0.590500, + (GLfloat) 0.664625, (GLfloat) 0.962948, (GLfloat) - 0.582500, + (GLfloat) 0.588313, (GLfloat) 0.769563, (GLfloat) - 0.293938, + (GLfloat) 0.591406, (GLfloat) 0.838781, (GLfloat) - 0.286719, + (GLfloat) 0.404938, (GLfloat) 0.890313, (GLfloat) - 0.278187, + (GLfloat) 0.500000, (GLfloat) 0.890313, (GLfloat) - 0.262344, + (GLfloat) 0.595141, (GLfloat) 0.926408, (GLfloat) - 0.277547, + (GLfloat) 0.278187, (GLfloat) 0.890313, (GLfloat) - 0.404938, + (GLfloat) 0.325719, (GLfloat) 0.890313, (GLfloat) - 0.325719, + (GLfloat) 0.412500, (GLfloat) 0.949319, (GLfloat) - 0.294000, + (GLfloat) 0.404859, (GLfloat) 0.926408, (GLfloat) - 0.277547, + (GLfloat) 0.411687, (GLfloat) 0.769563, (GLfloat) - 0.293938, + (GLfloat) 0.408594, (GLfloat) 0.838781, (GLfloat) - 0.286719, + (GLfloat) 0.409500, (GLfloat) 0.971195, (GLfloat) - 0.409500, + (GLfloat) 0.417500, (GLfloat) 0.962948, (GLfloat) - 0.335375, + (GLfloat) 0.500000, (GLfloat) 0.950535, (GLfloat) - 0.278500, + (GLfloat) 0.294000, (GLfloat) 0.949319, (GLfloat) - 0.412500, + (GLfloat) 0.339125, (GLfloat) 0.948104, (GLfloat) - 0.339125, + (GLfloat) 0.582500, (GLfloat) 0.962948, (GLfloat) - 0.335375, + (GLfloat) 0.293938, (GLfloat) 0.769563, (GLfloat) - 0.411687, + (GLfloat) 0.286719, (GLfloat) 0.838781, (GLfloat) - 0.408594, + (GLfloat) 0.278187, (GLfloat) 0.890313, (GLfloat) - 0.595062, + (GLfloat) 0.262344, (GLfloat) 0.890313, (GLfloat) - 0.500000, + (GLfloat) 0.277547, (GLfloat) 0.926408, (GLfloat) - 0.404859, + (GLfloat) 0.404938, (GLfloat) 0.890313, (GLfloat) - 0.721812, + (GLfloat) 0.325719, (GLfloat) 0.890313, (GLfloat) - 0.674281, + (GLfloat) 0.294000, (GLfloat) 0.949319, (GLfloat) - 0.587500, + (GLfloat) 0.277547, (GLfloat) 0.926408, (GLfloat) - 0.595141, + (GLfloat) 0.293938, (GLfloat) 0.769563, (GLfloat) - 0.588313, + (GLfloat) 0.286719, (GLfloat) 0.838781, (GLfloat) - 0.591406, + (GLfloat) 0.409500, (GLfloat) 0.971195, (GLfloat) - 0.590500, + (GLfloat) 0.335375, (GLfloat) 0.962948, (GLfloat) - 0.582500, + (GLfloat) 0.278500, (GLfloat) 0.950535, (GLfloat) - 0.500000, + (GLfloat) 0.412500, (GLfloat) 0.949319, (GLfloat) - 0.706000, + (GLfloat) 0.339125, (GLfloat) 0.948104, (GLfloat) - 0.660875, + (GLfloat) 0.335375, (GLfloat) 0.962948, (GLfloat) - 0.417500, + (GLfloat) 0.411687, (GLfloat) 0.769563, (GLfloat) - 0.706063, + (GLfloat) 0.408594, (GLfloat) 0.838781, (GLfloat) - 0.713281, + (GLfloat) 0.500000, (GLfloat) 0.890313, (GLfloat) - 0.737656, + (GLfloat) 0.404859, (GLfloat) 0.926408, (GLfloat) - 0.722453, + (GLfloat) 0.595141, (GLfloat) 0.926408, (GLfloat) - 0.722453, + (GLfloat) 0.588313, (GLfloat) 0.769563, (GLfloat) - 0.706063, + (GLfloat) 0.591406, (GLfloat) 0.838781, (GLfloat) - 0.713281, + (GLfloat) 0.582500, (GLfloat) 0.962948, (GLfloat) - 0.664625, + (GLfloat) 0.500000, (GLfloat) 0.950535, (GLfloat) - 0.721500, + (GLfloat) 0.417500, (GLfloat) 0.962948, (GLfloat) - 0.664625, + (GLfloat) 0.500000, (GLfloat) 0.973972, (GLfloat) - 0.402250, + (GLfloat) 0.597750, (GLfloat) 0.973972, (GLfloat) - 0.500000, + (GLfloat) 0.402250, (GLfloat) 0.973972, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.973972, (GLfloat) - 0.597750, + (GLfloat) 0.661906, (GLfloat) 0.769563, (GLfloat) - 0.661906, + (GLfloat) 0.696875, (GLfloat) 0.593625, (GLfloat) - 0.584375, + (GLfloat) 0.700484, (GLfloat) 0.686547, (GLfloat) - 0.585922, + (GLfloat) 0.720781, (GLfloat) 0.769563, (GLfloat) - 0.500000, + (GLfloat) 0.696875, (GLfloat) 0.393625, (GLfloat) - 0.584375, + (GLfloat) 0.695563, (GLfloat) 0.494688, (GLfloat) - 0.583813, + (GLfloat) 0.696875, (GLfloat) 0.593625, (GLfloat) - 0.415625, + (GLfloat) 0.710938, (GLfloat) 0.593625, (GLfloat) - 0.500000, + (GLfloat) 0.584375, (GLfloat) 0.593625, (GLfloat) - 0.696875, + (GLfloat) 0.654688, (GLfloat) 0.593625, (GLfloat) - 0.654688, + (GLfloat) 0.584375, (GLfloat) 0.593625, (GLfloat) - 0.303125, + (GLfloat) 0.654688, (GLfloat) 0.593625, (GLfloat) - 0.345313, + (GLfloat) 0.700484, (GLfloat) 0.686547, (GLfloat) - 0.414078, + (GLfloat) 0.696875, (GLfloat) 0.393625, (GLfloat) - 0.415625, + (GLfloat) 0.695563, (GLfloat) 0.494688, (GLfloat) - 0.416187, + (GLfloat) 0.661906, (GLfloat) 0.769563, (GLfloat) - 0.338094, + (GLfloat) 0.338094, (GLfloat) 0.769563, (GLfloat) - 0.661906, + (GLfloat) 0.415625, (GLfloat) 0.593625, (GLfloat) - 0.696875, + (GLfloat) 0.414078, (GLfloat) 0.686547, (GLfloat) - 0.700484, + (GLfloat) 0.500000, (GLfloat) 0.769563, (GLfloat) - 0.720781, + (GLfloat) 0.415625, (GLfloat) 0.393625, (GLfloat) - 0.696875, + (GLfloat) 0.416187, (GLfloat) 0.494688, (GLfloat) - 0.695563, + (GLfloat) 0.500000, (GLfloat) 0.593625, (GLfloat) - 0.710938, + (GLfloat) 0.303125, (GLfloat) 0.593625, (GLfloat) - 0.584375, + (GLfloat) 0.345313, (GLfloat) 0.593625, (GLfloat) - 0.654688, + (GLfloat) 0.585922, (GLfloat) 0.686547, (GLfloat) - 0.700484, + (GLfloat) 0.584375, (GLfloat) 0.393625, (GLfloat) - 0.696875, + (GLfloat) 0.583813, (GLfloat) 0.494688, (GLfloat) - 0.695563, + (GLfloat) 0.500000, (GLfloat) 0.769563, (GLfloat) - 0.279219, + (GLfloat) 0.415625, (GLfloat) 0.593625, (GLfloat) - 0.303125, + (GLfloat) 0.414078, (GLfloat) 0.686547, (GLfloat) - 0.299516, + (GLfloat) 0.338094, (GLfloat) 0.769563, (GLfloat) - 0.338094, + (GLfloat) 0.585922, (GLfloat) 0.686547, (GLfloat) - 0.299516, + (GLfloat) 0.584375, (GLfloat) 0.393625, (GLfloat) - 0.303125, + (GLfloat) 0.583813, (GLfloat) 0.494688, (GLfloat) - 0.304437, + (GLfloat) 0.500000, (GLfloat) 0.593625, (GLfloat) - 0.289063, + (GLfloat) 0.303125, (GLfloat) 0.593625, (GLfloat) - 0.415625, + (GLfloat) 0.345313, (GLfloat) 0.593625, (GLfloat) - 0.345313, + (GLfloat) 0.415625, (GLfloat) 0.393625, (GLfloat) - 0.303125, + (GLfloat) 0.416187, (GLfloat) 0.494688, (GLfloat) - 0.304437, + (GLfloat) 0.279219, (GLfloat) 0.769563, (GLfloat) - 0.500000, + (GLfloat) 0.299516, (GLfloat) 0.686547, (GLfloat) - 0.585922, + (GLfloat) 0.299516, (GLfloat) 0.686547, (GLfloat) - 0.414078, + (GLfloat) 0.303125, (GLfloat) 0.393625, (GLfloat) - 0.415625, + (GLfloat) 0.304437, (GLfloat) 0.494688, (GLfloat) - 0.416187, + (GLfloat) 0.289063, (GLfloat) 0.593625, (GLfloat) - 0.500000, + (GLfloat) 0.303125, (GLfloat) 0.393625, (GLfloat) - 0.584375, + (GLfloat) 0.304437, (GLfloat) 0.494688, (GLfloat) - 0.583813, + (GLfloat) 0.411687, (GLfloat) 0.207062, (GLfloat) - 0.706063, + (GLfloat) 0.404938, (GLfloat) 0.077813, (GLfloat) - 0.721812, + (GLfloat) 0.408594, (GLfloat) 0.132531, (GLfloat) - 0.713281, + (GLfloat) 0.588313, (GLfloat) 0.207062, (GLfloat) - 0.706063, + (GLfloat) 0.500000, (GLfloat) 0.207062, (GLfloat) - 0.720781, + (GLfloat) 0.414078, (GLfloat) 0.295922, (GLfloat) - 0.700484, + (GLfloat) 0.293938, (GLfloat) 0.207062, (GLfloat) - 0.588313, + (GLfloat) 0.338094, (GLfloat) 0.207062, (GLfloat) - 0.661906, + (GLfloat) 0.706063, (GLfloat) 0.207062, (GLfloat) - 0.588313, + (GLfloat) 0.661906, (GLfloat) 0.207062, (GLfloat) - 0.661906, + (GLfloat) 0.585922, (GLfloat) 0.295922, (GLfloat) - 0.700484, + (GLfloat) 0.595062, (GLfloat) 0.077813, (GLfloat) - 0.721812, + (GLfloat) 0.591406, (GLfloat) 0.132531, (GLfloat) - 0.713281, + (GLfloat) 0.500000, (GLfloat) 0.393625, (GLfloat) - 0.710938, + (GLfloat) 0.654688, (GLfloat) 0.393625, (GLfloat) - 0.654688, + (GLfloat) 0.345313, (GLfloat) 0.393625, (GLfloat) - 0.654688, + (GLfloat) 0.299516, (GLfloat) 0.295922, (GLfloat) - 0.585922, + (GLfloat) 0.293938, (GLfloat) 0.207062, (GLfloat) - 0.411687, + (GLfloat) 0.279219, (GLfloat) 0.207062, (GLfloat) - 0.500000, + (GLfloat) 0.278187, (GLfloat) 0.077813, (GLfloat) - 0.595062, + (GLfloat) 0.286719, (GLfloat) 0.132531, (GLfloat) - 0.591406, + (GLfloat) 0.289063, (GLfloat) 0.393625, (GLfloat) - 0.500000, + (GLfloat) 0.345313, (GLfloat) 0.393625, (GLfloat) - 0.345313, + (GLfloat) 0.299516, (GLfloat) 0.295922, (GLfloat) - 0.414078, + (GLfloat) 0.278187, (GLfloat) 0.077813, (GLfloat) - 0.404938, + (GLfloat) 0.286719, (GLfloat) 0.132531, (GLfloat) - 0.408594, + (GLfloat) 0.411687, (GLfloat) 0.207062, (GLfloat) - 0.293938, + (GLfloat) 0.338094, (GLfloat) 0.207062, (GLfloat) - 0.338094, + (GLfloat) 0.414078, (GLfloat) 0.295922, (GLfloat) - 0.299516, + (GLfloat) 0.588313, (GLfloat) 0.207062, (GLfloat) - 0.293938, + (GLfloat) 0.500000, (GLfloat) 0.207062, (GLfloat) - 0.279219, + (GLfloat) 0.404938, (GLfloat) 0.077813, (GLfloat) - 0.278187, + (GLfloat) 0.408594, (GLfloat) 0.132531, (GLfloat) - 0.286719, + (GLfloat) 0.500000, (GLfloat) 0.393625, (GLfloat) - 0.289063, + (GLfloat) 0.654688, (GLfloat) 0.393625, (GLfloat) - 0.345313, + (GLfloat) 0.585922, (GLfloat) 0.295922, (GLfloat) - 0.299516, + (GLfloat) 0.595062, (GLfloat) 0.077813, (GLfloat) - 0.278187, + (GLfloat) 0.591406, (GLfloat) 0.132531, (GLfloat) - 0.286719, + (GLfloat) 0.706063, (GLfloat) 0.207062, (GLfloat) - 0.411687, + (GLfloat) 0.661906, (GLfloat) 0.207062, (GLfloat) - 0.338094, + (GLfloat) 0.700484, (GLfloat) 0.295922, (GLfloat) - 0.414078, + (GLfloat) 0.720781, (GLfloat) 0.207062, (GLfloat) - 0.500000, + (GLfloat) 0.721812, (GLfloat) 0.077813, (GLfloat) - 0.404938, + (GLfloat) 0.713281, (GLfloat) 0.132531, (GLfloat) - 0.408594, + (GLfloat) 0.710938, (GLfloat) 0.393625, (GLfloat) - 0.500000, + (GLfloat) 0.700484, (GLfloat) 0.295922, (GLfloat) - 0.585922, + (GLfloat) 0.721812, (GLfloat) 0.077813, (GLfloat) - 0.595062, + (GLfloat) 0.713281, (GLfloat) 0.132531, (GLfloat) - 0.591406, + (GLfloat) 0.737656, (GLfloat) 0.077813, (GLfloat) - 0.500000, + (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.412500, + (GLfloat) 0.722453, (GLfloat) 0.040123, (GLfloat) - 0.404859, + (GLfloat) 0.674281, (GLfloat) 0.077813, (GLfloat) - 0.325719, + (GLfloat) 0.674281, (GLfloat) 0.077813, (GLfloat) - 0.674281, + (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.587500, + (GLfloat) 0.722453, (GLfloat) 0.040123, (GLfloat) - 0.595141, + (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.590500, + (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.582500, + (GLfloat) 0.721500, (GLfloat) 0.015465, (GLfloat) - 0.500000, + (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.706000, + (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.660875, + (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.294000, + (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.339125, + (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.409500, + (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.417500, + (GLfloat) 0.500000, (GLfloat) 0.077813, (GLfloat) - 0.737656, + (GLfloat) 0.595141, (GLfloat) 0.040123, (GLfloat) - 0.722453, + (GLfloat) 0.325719, (GLfloat) 0.077813, (GLfloat) - 0.674281, + (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.706000, + (GLfloat) 0.404859, (GLfloat) 0.040123, (GLfloat) - 0.722453, + (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.590500, + (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.664625, + (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.721500, + (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.587500, + (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.660875, + (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.664625, + (GLfloat) 0.262344, (GLfloat) 0.077813, (GLfloat) - 0.500000, + (GLfloat) 0.277547, (GLfloat) 0.040123, (GLfloat) - 0.595141, + (GLfloat) 0.325719, (GLfloat) 0.077813, (GLfloat) - 0.325719, + (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.412500, + (GLfloat) 0.277547, (GLfloat) 0.040123, (GLfloat) - 0.404859, + (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.409500, + (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.417500, + (GLfloat) 0.278500, (GLfloat) 0.015465, (GLfloat) - 0.500000, + (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.294000, + (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.339125, + (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.582500, + (GLfloat) 0.500000, (GLfloat) 0.077813, (GLfloat) - 0.262344, + (GLfloat) 0.404859, (GLfloat) 0.040123, (GLfloat) - 0.277547, + (GLfloat) 0.595141, (GLfloat) 0.040123, (GLfloat) - 0.277547, + (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.335375, + (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.278500, + (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.335375, + (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.597750, + (GLfloat) 0.597750, (GLfloat) - 0.007972, (GLfloat) - 0.500000, + (GLfloat) 0.402250, (GLfloat) - 0.007972, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.402250, +}; + +static GLfloat s1_1_normals[] = +{ + (GLfloat) 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493, + (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) - 0.506493, + (GLfloat) 0.971634, (GLfloat) - 0.172349, (GLfloat) - 0.161939, + (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) - 0.161939, + (GLfloat) 0.985737, (GLfloat) - 0.023907, (GLfloat) - 0.166587, + (GLfloat) 0.986237, (GLfloat) - 0.017860, (GLfloat) - 0.164373, + (GLfloat) 0.856157, (GLfloat) - 0.009890, (GLfloat) - 0.516621, + (GLfloat) 0.857379, (GLfloat) - 0.016331, (GLfloat) - 0.514427, + (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) 0.506493, + (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) 0.506493, + (GLfloat) 0.856157, (GLfloat) - 0.009889, (GLfloat) 0.516621, + (GLfloat) 0.857379, (GLfloat) - 0.016331, (GLfloat) 0.514427, + (GLfloat) 0.985737, (GLfloat) - 0.023907, (GLfloat) 0.166587, + (GLfloat) 0.986237, (GLfloat) - 0.017860, (GLfloat) 0.164373, + (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) 0.161939, + (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) 0.161939, + (GLfloat) 0.283621, (GLfloat) 0.936578, (GLfloat) 0.205866, + (GLfloat) 0.264056, (GLfloat) 0.947923, (GLfloat) 0.178092, + (GLfloat) 0.315105, (GLfloat) 0.946548, (GLfloat) 0.068965, + (GLfloat) 0.304029, (GLfloat) 0.949849, (GLfloat) 0.073162, + (GLfloat) 0.783125, (GLfloat) 0.607180, (GLfloat) 0.134346, + (GLfloat) 0.804111, (GLfloat) 0.575131, (GLfloat) 0.150431, + (GLfloat) 0.650208, (GLfloat) 0.649088, (GLfloat) 0.394860, + (GLfloat) 0.665312, (GLfloat) 0.617634, (GLfloat) 0.419391, + (GLfloat) 0.264056, (GLfloat) 0.947923, (GLfloat) - 0.178092, + (GLfloat) 0.283621, (GLfloat) 0.936578, (GLfloat) - 0.205866, + (GLfloat) 0.650207, (GLfloat) 0.649089, (GLfloat) - 0.394860, + (GLfloat) 0.665311, (GLfloat) 0.617634, (GLfloat) - 0.419391, + (GLfloat) 0.804111, (GLfloat) 0.575131, (GLfloat) - 0.150431, + (GLfloat) 0.783125, (GLfloat) 0.607180, (GLfloat) - 0.134346, + (GLfloat) 0.304029, (GLfloat) 0.949849, (GLfloat) - 0.073162, + (GLfloat) 0.315105, (GLfloat) 0.946548, (GLfloat) - 0.068965, + (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155, + (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155, + (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633, + (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633, + (GLfloat) 0.166587, (GLfloat) - 0.023907, (GLfloat) 0.985737, + (GLfloat) 0.164373, (GLfloat) - 0.017860, (GLfloat) 0.986237, + (GLfloat) 0.516622, (GLfloat) - 0.009888, (GLfloat) 0.856157, + (GLfloat) 0.514427, (GLfloat) - 0.016331, (GLfloat) 0.857379, + (GLfloat) - 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155, + (GLfloat) - 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155, + (GLfloat) - 0.516622, (GLfloat) - 0.009887, (GLfloat) 0.856157, + (GLfloat) - 0.514427, (GLfloat) - 0.016331, (GLfloat) 0.857379, + (GLfloat) - 0.166587, (GLfloat) - 0.023907, (GLfloat) 0.985737, + (GLfloat) - 0.164373, (GLfloat) - 0.017860, (GLfloat) 0.986237, + (GLfloat) - 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633, + (GLfloat) - 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633, + (GLfloat) - 0.205866, (GLfloat) 0.936578, (GLfloat) 0.283621, + (GLfloat) - 0.178092, (GLfloat) 0.947923, (GLfloat) 0.264055, + (GLfloat) - 0.068965, (GLfloat) 0.946548, (GLfloat) 0.315105, + (GLfloat) - 0.073162, (GLfloat) 0.949849, (GLfloat) 0.304029, + (GLfloat) - 0.134346, (GLfloat) 0.607180, (GLfloat) 0.783125, + (GLfloat) - 0.150431, (GLfloat) 0.575131, (GLfloat) 0.804111, + (GLfloat) - 0.394861, (GLfloat) 0.649087, (GLfloat) 0.650209, + (GLfloat) - 0.419390, (GLfloat) 0.617634, (GLfloat) 0.665312, + (GLfloat) 0.178092, (GLfloat) 0.947923, (GLfloat) 0.264056, + (GLfloat) 0.205866, (GLfloat) 0.936578, (GLfloat) 0.283621, + (GLfloat) 0.394861, (GLfloat) 0.649087, (GLfloat) 0.650208, + (GLfloat) 0.419390, (GLfloat) 0.617634, (GLfloat) 0.665312, + (GLfloat) 0.150431, (GLfloat) 0.575131, (GLfloat) 0.804111, + (GLfloat) 0.134346, (GLfloat) 0.607180, (GLfloat) 0.783125, + (GLfloat) 0.073162, (GLfloat) 0.949849, (GLfloat) 0.304029, + (GLfloat) 0.068965, (GLfloat) 0.946548, (GLfloat) 0.315105, + (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) 0.506493, + (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) 0.506493, + (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) 0.161939, + (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) 0.161939, + (GLfloat) - 0.985737, (GLfloat) - 0.023907, (GLfloat) 0.166587, + (GLfloat) - 0.986237, (GLfloat) - 0.017860, (GLfloat) 0.164373, + (GLfloat) - 0.856157, (GLfloat) - 0.009887, (GLfloat) 0.516622, + (GLfloat) - 0.857379, (GLfloat) - 0.016331, (GLfloat) 0.514427, + (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493, + (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493, + (GLfloat) - 0.856157, (GLfloat) - 0.009888, (GLfloat) - 0.516622, + (GLfloat) - 0.857379, (GLfloat) - 0.016331, (GLfloat) - 0.514427, + (GLfloat) - 0.985737, (GLfloat) - 0.023907, (GLfloat) - 0.166587, + (GLfloat) - 0.986237, (GLfloat) - 0.017860, (GLfloat) - 0.164373, + (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) - 0.161939, + (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) - 0.161939, + (GLfloat) - 0.283621, (GLfloat) 0.936578, (GLfloat) - 0.205866, + (GLfloat) - 0.264056, (GLfloat) 0.947923, (GLfloat) - 0.178092, + (GLfloat) - 0.315105, (GLfloat) 0.946548, (GLfloat) - 0.068965, + (GLfloat) - 0.304029, (GLfloat) 0.949849, (GLfloat) - 0.073162, + (GLfloat) - 0.783125, (GLfloat) 0.607180, (GLfloat) - 0.134346, + (GLfloat) - 0.804111, (GLfloat) 0.575131, (GLfloat) - 0.150431, + (GLfloat) - 0.650208, (GLfloat) 0.649087, (GLfloat) - 0.394861, + (GLfloat) - 0.665312, (GLfloat) 0.617634, (GLfloat) - 0.419390, + (GLfloat) - 0.264055, (GLfloat) 0.947923, (GLfloat) 0.178092, + (GLfloat) - 0.283621, (GLfloat) 0.936578, (GLfloat) 0.205866, + (GLfloat) - 0.650209, (GLfloat) 0.649087, (GLfloat) 0.394861, + (GLfloat) - 0.665312, (GLfloat) 0.617634, (GLfloat) 0.419390, + (GLfloat) - 0.804111, (GLfloat) 0.575131, (GLfloat) 0.150431, + (GLfloat) - 0.783125, (GLfloat) 0.607180, (GLfloat) 0.134346, + (GLfloat) - 0.304029, (GLfloat) 0.949849, (GLfloat) 0.073162, + (GLfloat) - 0.315105, (GLfloat) 0.946548, (GLfloat) 0.068965, + (GLfloat) - 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155, + (GLfloat) - 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155, + (GLfloat) - 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634, + (GLfloat) - 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634, + (GLfloat) - 0.166587, (GLfloat) - 0.023907, (GLfloat) - 0.985737, + (GLfloat) - 0.164373, (GLfloat) - 0.017860, (GLfloat) - 0.986237, + (GLfloat) - 0.516621, (GLfloat) - 0.009889, (GLfloat) - 0.856157, + (GLfloat) - 0.514427, (GLfloat) - 0.016331, (GLfloat) - 0.857379, + (GLfloat) 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155, + (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) - 0.844155, + (GLfloat) 0.516621, (GLfloat) - 0.009890, (GLfloat) - 0.856157, + (GLfloat) 0.514427, (GLfloat) - 0.016331, (GLfloat) - 0.857379, + (GLfloat) 0.166587, (GLfloat) - 0.023907, (GLfloat) - 0.985737, + (GLfloat) 0.164373, (GLfloat) - 0.017860, (GLfloat) - 0.986237, + (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) - 0.971634, + (GLfloat) 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634, + (GLfloat) 0.205866, (GLfloat) 0.936578, (GLfloat) - 0.283621, + (GLfloat) 0.178092, (GLfloat) 0.947923, (GLfloat) - 0.264056, + (GLfloat) 0.068965, (GLfloat) 0.946548, (GLfloat) - 0.315105, + (GLfloat) 0.073162, (GLfloat) 0.949849, (GLfloat) - 0.304029, + (GLfloat) 0.134346, (GLfloat) 0.607180, (GLfloat) - 0.783125, + (GLfloat) 0.150431, (GLfloat) 0.575131, (GLfloat) - 0.804111, + (GLfloat) 0.394860, (GLfloat) 0.649089, (GLfloat) - 0.650207, + (GLfloat) 0.419391, (GLfloat) 0.617634, (GLfloat) - 0.665311, + (GLfloat) - 0.178092, (GLfloat) 0.947923, (GLfloat) - 0.264056, + (GLfloat) - 0.205866, (GLfloat) 0.936578, (GLfloat) - 0.283621, + (GLfloat) - 0.394860, (GLfloat) 0.649088, (GLfloat) - 0.650208, + (GLfloat) - 0.419391, (GLfloat) 0.617634, (GLfloat) - 0.665312, + (GLfloat) - 0.150431, (GLfloat) 0.575131, (GLfloat) - 0.804111, + (GLfloat) - 0.134346, (GLfloat) 0.607180, (GLfloat) - 0.783125, + (GLfloat) - 0.073162, (GLfloat) 0.949849, (GLfloat) - 0.304029, + (GLfloat) - 0.068965, (GLfloat) 0.946548, (GLfloat) - 0.315105, + (GLfloat) 0.135802, (GLfloat) 0.982944, (GLfloat) 0.124011, + (GLfloat) 0.124011, (GLfloat) 0.982944, (GLfloat) 0.135802, + (GLfloat) 0.043834, (GLfloat) 0.993006, (GLfloat) 0.109621, + (GLfloat) 0.039656, (GLfloat) 0.992607, (GLfloat) 0.114709, + (GLfloat) 0.030163, (GLfloat) 0.998998, (GLfloat) 0.033079, + (GLfloat) 0.033079, (GLfloat) 0.998998, (GLfloat) 0.030163, + (GLfloat) 0.109621, (GLfloat) 0.993006, (GLfloat) 0.043834, + (GLfloat) 0.114709, (GLfloat) 0.992607, (GLfloat) 0.039656, + (GLfloat) - 0.124011, (GLfloat) 0.982944, (GLfloat) 0.135803, + (GLfloat) - 0.135803, (GLfloat) 0.982944, (GLfloat) 0.124011, + (GLfloat) - 0.109621, (GLfloat) 0.993006, (GLfloat) 0.043834, + (GLfloat) - 0.114709, (GLfloat) 0.992607, (GLfloat) 0.039656, + (GLfloat) - 0.033079, (GLfloat) 0.998998, (GLfloat) 0.030163, + (GLfloat) - 0.030163, (GLfloat) 0.998998, (GLfloat) 0.033079, + (GLfloat) - 0.043834, (GLfloat) 0.993006, (GLfloat) 0.109621, + (GLfloat) - 0.039656, (GLfloat) 0.992607, (GLfloat) 0.114709, + (GLfloat) - 0.135802, (GLfloat) 0.982944, (GLfloat) - 0.124011, + (GLfloat) - 0.124011, (GLfloat) 0.982944, (GLfloat) - 0.135802, + (GLfloat) - 0.043834, (GLfloat) 0.993006, (GLfloat) - 0.109621, + (GLfloat) - 0.039656, (GLfloat) 0.992607, (GLfloat) - 0.114709, + (GLfloat) - 0.030163, (GLfloat) 0.998998, (GLfloat) - 0.033079, + (GLfloat) - 0.033079, (GLfloat) 0.998998, (GLfloat) - 0.030163, + (GLfloat) - 0.109621, (GLfloat) 0.993006, (GLfloat) - 0.043834, + (GLfloat) - 0.114709, (GLfloat) 0.992607, (GLfloat) - 0.039656, + (GLfloat) 0.124011, (GLfloat) 0.982944, (GLfloat) - 0.135802, + (GLfloat) 0.135802, (GLfloat) 0.982944, (GLfloat) - 0.124011, + (GLfloat) 0.109621, (GLfloat) 0.993006, (GLfloat) - 0.043834, + (GLfloat) 0.114709, (GLfloat) 0.992607, (GLfloat) - 0.039656, + (GLfloat) 0.033079, (GLfloat) 0.998998, (GLfloat) - 0.030163, + (GLfloat) 0.030163, (GLfloat) 0.998998, (GLfloat) - 0.033079, + (GLfloat) 0.043834, (GLfloat) 0.993006, (GLfloat) - 0.109621, + (GLfloat) 0.039656, (GLfloat) 0.992607, (GLfloat) - 0.114709, + (GLfloat) 0.852125, (GLfloat) - 0.111720, (GLfloat) - 0.511275, + (GLfloat) 0.852125, (GLfloat) - 0.111718, (GLfloat) - 0.511276, + (GLfloat) 0.855252, (GLfloat) - 0.072245, (GLfloat) - 0.513151, + (GLfloat) 0.855252, (GLfloat) - 0.072244, (GLfloat) - 0.513152, + (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) - 0.163986, + (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) - 0.163986, + (GLfloat) 0.980457, (GLfloat) - 0.109554, (GLfloat) - 0.163409, + (GLfloat) 0.980457, (GLfloat) - 0.109553, (GLfloat) - 0.163410, + (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514444, + (GLfloat) 0.857405, (GLfloat) - 0.014300, (GLfloat) - 0.514443, + (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164382, + (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164382, + (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261, + (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164260, + (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045, + (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045, + (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443, + (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514444, + (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045, + (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045, + (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164260, + (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261, + (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164382, + (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164382, + (GLfloat) 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275, + (GLfloat) 0.852125, (GLfloat) - 0.111718, (GLfloat) 0.511276, + (GLfloat) 0.980457, (GLfloat) - 0.109553, (GLfloat) 0.163410, + (GLfloat) 0.980457, (GLfloat) - 0.109554, (GLfloat) 0.163409, + (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) 0.163986, + (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) 0.163986, + (GLfloat) 0.855252, (GLfloat) - 0.072244, (GLfloat) 0.513152, + (GLfloat) 0.855252, (GLfloat) - 0.072245, (GLfloat) 0.513151, + (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) - 0.852125, + (GLfloat) - 0.511276, (GLfloat) - 0.111718, (GLfloat) - 0.852125, + (GLfloat) - 0.513151, (GLfloat) - 0.072245, (GLfloat) - 0.855252, + (GLfloat) - 0.513152, (GLfloat) - 0.072244, (GLfloat) - 0.855252, + (GLfloat) - 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916, + (GLfloat) - 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916, + (GLfloat) - 0.163409, (GLfloat) - 0.109554, (GLfloat) - 0.980457, + (GLfloat) - 0.163410, (GLfloat) - 0.109553, (GLfloat) - 0.980457, + (GLfloat) - 0.514444, (GLfloat) - 0.014299, (GLfloat) - 0.857405, + (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) - 0.857405, + (GLfloat) - 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297, + (GLfloat) - 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297, + (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) - 0.985564, + (GLfloat) - 0.164260, (GLfloat) - 0.041017, (GLfloat) - 0.985564, + (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742, + (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742, + (GLfloat) 0.514443, (GLfloat) - 0.014300, (GLfloat) - 0.857405, + (GLfloat) 0.514444, (GLfloat) - 0.014299, (GLfloat) - 0.857405, + (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742, + (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742, + (GLfloat) 0.164260, (GLfloat) - 0.041017, (GLfloat) - 0.985564, + (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) - 0.985564, + (GLfloat) 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297, + (GLfloat) 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297, + (GLfloat) 0.511275, (GLfloat) - 0.111720, (GLfloat) - 0.852125, + (GLfloat) 0.511276, (GLfloat) - 0.111718, (GLfloat) - 0.852125, + (GLfloat) 0.163410, (GLfloat) - 0.109553, (GLfloat) - 0.980457, + (GLfloat) 0.163409, (GLfloat) - 0.109554, (GLfloat) - 0.980457, + (GLfloat) 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916, + (GLfloat) 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916, + (GLfloat) 0.513152, (GLfloat) - 0.072244, (GLfloat) - 0.855252, + (GLfloat) 0.513151, (GLfloat) - 0.072245, (GLfloat) - 0.855252, + (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125, + (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125, + (GLfloat) - 0.163410, (GLfloat) - 0.109554, (GLfloat) 0.980457, + (GLfloat) - 0.163409, (GLfloat) - 0.109555, (GLfloat) 0.980457, + (GLfloat) - 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916, + (GLfloat) - 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916, + (GLfloat) - 0.513151, (GLfloat) - 0.072244, (GLfloat) 0.855252, + (GLfloat) - 0.513151, (GLfloat) - 0.072245, (GLfloat) 0.855252, + (GLfloat) 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125, + (GLfloat) 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125, + (GLfloat) 0.513151, (GLfloat) - 0.072245, (GLfloat) 0.855252, + (GLfloat) 0.513151, (GLfloat) - 0.072244, (GLfloat) 0.855252, + (GLfloat) 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916, + (GLfloat) 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916, + (GLfloat) 0.163409, (GLfloat) - 0.109555, (GLfloat) 0.980457, + (GLfloat) 0.163410, (GLfloat) - 0.109554, (GLfloat) 0.980457, + (GLfloat) 0.514444, (GLfloat) - 0.014299, (GLfloat) 0.857405, + (GLfloat) 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405, + (GLfloat) 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297, + (GLfloat) 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297, + (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564, + (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564, + (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742, + (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742, + (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405, + (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405, + (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742, + (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742, + (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564, + (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564, + (GLfloat) - 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297, + (GLfloat) - 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297, + (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) - 0.511275, + (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) - 0.511275, + (GLfloat) - 0.980457, (GLfloat) - 0.109554, (GLfloat) - 0.163410, + (GLfloat) - 0.980457, (GLfloat) - 0.109555, (GLfloat) - 0.163409, + (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) - 0.163986, + (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) - 0.163986, + (GLfloat) - 0.855252, (GLfloat) - 0.072244, (GLfloat) - 0.513151, + (GLfloat) - 0.855252, (GLfloat) - 0.072245, (GLfloat) - 0.513151, + (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275, + (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275, + (GLfloat) - 0.855252, (GLfloat) - 0.072245, (GLfloat) 0.513151, + (GLfloat) - 0.855252, (GLfloat) - 0.072244, (GLfloat) 0.513151, + (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) 0.163986, + (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) 0.163986, + (GLfloat) - 0.980457, (GLfloat) - 0.109555, (GLfloat) 0.163409, + (GLfloat) - 0.980457, (GLfloat) - 0.109554, (GLfloat) 0.163410, + (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443, + (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443, + (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164383, + (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164383, + (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261, + (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261, + (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045, + (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045, + (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514443, + (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514444, + (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045, + (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045, + (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261, + (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261, + (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164383, + (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164383, + (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) - 0.852857, + (GLfloat) - 0.511715, (GLfloat) 0.103844, (GLfloat) - 0.852857, + (GLfloat) - 0.163545, (GLfloat) 0.101829, (GLfloat) - 0.981267, + (GLfloat) - 0.163544, (GLfloat) 0.101829, (GLfloat) - 0.981267, + (GLfloat) - 0.164038, (GLfloat) 0.066199, (GLfloat) - 0.984230, + (GLfloat) - 0.164039, (GLfloat) 0.066198, (GLfloat) - 0.984230, + (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) - 0.855536, + (GLfloat) - 0.513322, (GLfloat) 0.067517, (GLfloat) - 0.855536, + (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) - 0.852857, + (GLfloat) 0.511715, (GLfloat) 0.103844, (GLfloat) - 0.852857, + (GLfloat) 0.513322, (GLfloat) 0.067517, (GLfloat) - 0.855536, + (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) - 0.855536, + (GLfloat) 0.164038, (GLfloat) 0.066199, (GLfloat) - 0.984230, + (GLfloat) 0.164039, (GLfloat) 0.066198, (GLfloat) - 0.984230, + (GLfloat) 0.163544, (GLfloat) 0.101829, (GLfloat) - 0.981267, + (GLfloat) 0.163545, (GLfloat) 0.101829, (GLfloat) - 0.981267, + (GLfloat) 0.514446, (GLfloat) 0.013998, (GLfloat) - 0.857409, + (GLfloat) 0.514445, (GLfloat) 0.013999, (GLfloat) - 0.857409, + (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301, + (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301, + (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) - 0.985643, + (GLfloat) 0.164273, (GLfloat) 0.039013, (GLfloat) - 0.985643, + (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814, + (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814, + (GLfloat) - 0.514445, (GLfloat) 0.013999, (GLfloat) - 0.857409, + (GLfloat) - 0.514446, (GLfloat) 0.013998, (GLfloat) - 0.857409, + (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814, + (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814, + (GLfloat) - 0.164273, (GLfloat) 0.039013, (GLfloat) - 0.985643, + (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) - 0.985643, + (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301, + (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301, + (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714, + (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714, + (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322, + (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322, + (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164038, + (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164039, + (GLfloat) - 0.981266, (GLfloat) 0.101830, (GLfloat) - 0.163544, + (GLfloat) - 0.981266, (GLfloat) 0.101829, (GLfloat) - 0.163545, + (GLfloat) - 0.857409, (GLfloat) 0.013998, (GLfloat) - 0.514446, + (GLfloat) - 0.857409, (GLfloat) 0.013999, (GLfloat) - 0.514445, + (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383, + (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383, + (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274, + (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274, + (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088, + (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088, + (GLfloat) - 0.857409, (GLfloat) 0.013999, (GLfloat) 0.514445, + (GLfloat) - 0.857409, (GLfloat) 0.013998, (GLfloat) 0.514446, + (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088, + (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088, + (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274, + (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274, + (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383, + (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383, + (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714, + (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714, + (GLfloat) - 0.981266, (GLfloat) 0.101829, (GLfloat) 0.163545, + (GLfloat) - 0.981266, (GLfloat) 0.101830, (GLfloat) 0.163544, + (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164038, + (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164039, + (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322, + (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322, + (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857, + (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857, + (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536, + (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536, + (GLfloat) - 0.164038, (GLfloat) 0.066198, (GLfloat) 0.984230, + (GLfloat) - 0.164039, (GLfloat) 0.066198, (GLfloat) 0.984230, + (GLfloat) - 0.163544, (GLfloat) 0.101830, (GLfloat) 0.981266, + (GLfloat) - 0.163545, (GLfloat) 0.101829, (GLfloat) 0.981266, + (GLfloat) - 0.514446, (GLfloat) 0.013998, (GLfloat) 0.857409, + (GLfloat) - 0.514445, (GLfloat) 0.013999, (GLfloat) 0.857409, + (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301, + (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301, + (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643, + (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643, + (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814, + (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814, + (GLfloat) 0.514445, (GLfloat) 0.013999, (GLfloat) 0.857409, + (GLfloat) 0.514446, (GLfloat) 0.013998, (GLfloat) 0.857409, + (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814, + (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814, + (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643, + (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643, + (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301, + (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301, + (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857, + (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857, + (GLfloat) 0.163545, (GLfloat) 0.101829, (GLfloat) 0.981266, + (GLfloat) 0.163544, (GLfloat) 0.101830, (GLfloat) 0.981266, + (GLfloat) 0.164038, (GLfloat) 0.066198, (GLfloat) 0.984230, + (GLfloat) 0.164039, (GLfloat) 0.066198, (GLfloat) 0.984230, + (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536, + (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536, + (GLfloat) 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714, + (GLfloat) 0.852857, (GLfloat) 0.103844, (GLfloat) 0.511715, + (GLfloat) 0.855536, (GLfloat) 0.067517, (GLfloat) 0.513322, + (GLfloat) 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322, + (GLfloat) 0.984230, (GLfloat) 0.066199, (GLfloat) 0.164038, + (GLfloat) 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164039, + (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) 0.163544, + (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) 0.163545, + (GLfloat) 0.857409, (GLfloat) 0.013998, (GLfloat) 0.514446, + (GLfloat) 0.857409, (GLfloat) 0.013999, (GLfloat) 0.514445, + (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383, + (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383, + (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274, + (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164273, + (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088, + (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088, + (GLfloat) 0.857409, (GLfloat) 0.013999, (GLfloat) - 0.514445, + (GLfloat) 0.857409, (GLfloat) 0.013998, (GLfloat) - 0.514446, + (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088, + (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088, + (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164273, + (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274, + (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383, + (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383, + (GLfloat) 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714, + (GLfloat) 0.852857, (GLfloat) 0.103844, (GLfloat) - 0.511715, + (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) - 0.163545, + (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) - 0.163544, + (GLfloat) 0.984230, (GLfloat) 0.066199, (GLfloat) - 0.164038, + (GLfloat) 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164039, + (GLfloat) 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322, + (GLfloat) 0.855536, (GLfloat) 0.067517, (GLfloat) - 0.513322, + (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) 0.507379, + (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) 0.507379, + (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162211, + (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162212, + (GLfloat) 0.985759, (GLfloat) 0.022905, (GLfloat) 0.166594, + (GLfloat) 0.986250, (GLfloat) 0.017105, (GLfloat) 0.164375, + (GLfloat) 0.856160, (GLfloat) 0.009467, (GLfloat) 0.516625, + (GLfloat) 0.857388, (GLfloat) 0.015640, (GLfloat) 0.514433, + (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) - 0.507380, + (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) - 0.507379, + (GLfloat) 0.856160, (GLfloat) 0.009468, (GLfloat) - 0.516624, + (GLfloat) 0.857388, (GLfloat) 0.015640, (GLfloat) - 0.514433, + (GLfloat) 0.985759, (GLfloat) 0.022905, (GLfloat) - 0.166594, + (GLfloat) 0.986250, (GLfloat) 0.017105, (GLfloat) - 0.164375, + (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162211, + (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162212, + (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073162, + (GLfloat) 0.789686, (GLfloat) - 0.598377, (GLfloat) - 0.135427, + (GLfloat) 0.809934, (GLfloat) - 0.566659, (GLfloat) - 0.151344, + (GLfloat) 0.656717, (GLfloat) - 0.640092, (GLfloat) - 0.398754, + (GLfloat) 0.671170, (GLfloat) - 0.608876, (GLfloat) - 0.422849, + (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092, + (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) 0.656718, (GLfloat) - 0.640092, (GLfloat) 0.398754, + (GLfloat) 0.671170, (GLfloat) - 0.608876, (GLfloat) 0.422849, + (GLfloat) 0.809934, (GLfloat) - 0.566659, (GLfloat) 0.151344, + (GLfloat) 0.789686, (GLfloat) - 0.598377, (GLfloat) 0.135427, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633, + (GLfloat) 0.507380, (GLfloat) 0.165745, (GLfloat) - 0.845633, + (GLfloat) 0.162211, (GLfloat) 0.162582, (GLfloat) - 0.973270, + (GLfloat) 0.162212, (GLfloat) 0.162582, (GLfloat) - 0.973270, + (GLfloat) 0.166594, (GLfloat) 0.022905, (GLfloat) - 0.985759, + (GLfloat) 0.164375, (GLfloat) 0.017105, (GLfloat) - 0.986250, + (GLfloat) 0.516624, (GLfloat) 0.009468, (GLfloat) - 0.856160, + (GLfloat) 0.514433, (GLfloat) 0.015640, (GLfloat) - 0.857388, + (GLfloat) - 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633, + (GLfloat) - 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633, + (GLfloat) - 0.516625, (GLfloat) 0.009467, (GLfloat) - 0.856160, + (GLfloat) - 0.514433, (GLfloat) 0.015640, (GLfloat) - 0.857388, + (GLfloat) - 0.166594, (GLfloat) 0.022905, (GLfloat) - 0.985759, + (GLfloat) - 0.164375, (GLfloat) 0.017105, (GLfloat) - 0.986250, + (GLfloat) - 0.162211, (GLfloat) 0.162582, (GLfloat) - 0.973270, + (GLfloat) - 0.162212, (GLfloat) 0.162582, (GLfloat) - 0.973270, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264055, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) - 0.135427, (GLfloat) - 0.598377, (GLfloat) - 0.789686, + (GLfloat) - 0.151344, (GLfloat) - 0.566659, (GLfloat) - 0.809934, + (GLfloat) - 0.398754, (GLfloat) - 0.640092, (GLfloat) - 0.656718, + (GLfloat) - 0.422849, (GLfloat) - 0.608876, (GLfloat) - 0.671170, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) 0.398754, (GLfloat) - 0.640092, (GLfloat) - 0.656717, + (GLfloat) 0.422849, (GLfloat) - 0.608876, (GLfloat) - 0.671170, + (GLfloat) 0.151344, (GLfloat) - 0.566659, (GLfloat) - 0.809934, + (GLfloat) 0.135427, (GLfloat) - 0.598377, (GLfloat) - 0.789686, + (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.845633, (GLfloat) 0.165746, (GLfloat) - 0.507379, + (GLfloat) - 0.845632, (GLfloat) 0.165746, (GLfloat) - 0.507380, + (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162211, + (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162212, + (GLfloat) - 0.985759, (GLfloat) 0.022905, (GLfloat) - 0.166594, + (GLfloat) - 0.986250, (GLfloat) 0.017105, (GLfloat) - 0.164375, + (GLfloat) - 0.856160, (GLfloat) 0.009467, (GLfloat) - 0.516625, + (GLfloat) - 0.857388, (GLfloat) 0.015640, (GLfloat) - 0.514433, + (GLfloat) - 0.845633, (GLfloat) 0.165746, (GLfloat) 0.507379, + (GLfloat) - 0.845632, (GLfloat) 0.165746, (GLfloat) 0.507380, + (GLfloat) - 0.856159, (GLfloat) 0.009466, (GLfloat) 0.516625, + (GLfloat) - 0.857388, (GLfloat) 0.015640, (GLfloat) 0.514433, + (GLfloat) - 0.985759, (GLfloat) 0.022905, (GLfloat) 0.166594, + (GLfloat) - 0.986250, (GLfloat) 0.017105, (GLfloat) 0.164375, + (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162211, + (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162212, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178091, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162, + (GLfloat) - 0.789686, (GLfloat) - 0.598377, (GLfloat) 0.135427, + (GLfloat) - 0.809934, (GLfloat) - 0.566659, (GLfloat) 0.151344, + (GLfloat) - 0.656718, (GLfloat) - 0.640090, (GLfloat) 0.398755, + (GLfloat) - 0.671170, (GLfloat) - 0.608876, (GLfloat) 0.422848, + (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) - 0.656718, (GLfloat) - 0.640091, (GLfloat) - 0.398755, + (GLfloat) - 0.671170, (GLfloat) - 0.608876, (GLfloat) - 0.422848, + (GLfloat) - 0.809934, (GLfloat) - 0.566659, (GLfloat) - 0.151344, + (GLfloat) - 0.789686, (GLfloat) - 0.598377, (GLfloat) - 0.135427, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) - 0.507380, (GLfloat) 0.165746, (GLfloat) 0.845632, + (GLfloat) - 0.507379, (GLfloat) 0.165746, (GLfloat) 0.845633, + (GLfloat) - 0.162211, (GLfloat) 0.162582, (GLfloat) 0.973270, + (GLfloat) - 0.162212, (GLfloat) 0.162582, (GLfloat) 0.973270, + (GLfloat) - 0.166594, (GLfloat) 0.022905, (GLfloat) 0.985759, + (GLfloat) - 0.164375, (GLfloat) 0.017105, (GLfloat) 0.986250, + (GLfloat) - 0.516625, (GLfloat) 0.009466, (GLfloat) 0.856159, + (GLfloat) - 0.514433, (GLfloat) 0.015640, (GLfloat) 0.857388, + (GLfloat) 0.507380, (GLfloat) 0.165746, (GLfloat) 0.845632, + (GLfloat) 0.507379, (GLfloat) 0.165746, (GLfloat) 0.845633, + (GLfloat) 0.516625, (GLfloat) 0.009467, (GLfloat) 0.856160, + (GLfloat) 0.514433, (GLfloat) 0.015640, (GLfloat) 0.857388, + (GLfloat) 0.166594, (GLfloat) 0.022905, (GLfloat) 0.985759, + (GLfloat) 0.164375, (GLfloat) 0.017105, (GLfloat) 0.986250, + (GLfloat) 0.162211, (GLfloat) 0.162582, (GLfloat) 0.973270, + (GLfloat) 0.162212, (GLfloat) 0.162582, (GLfloat) 0.973270, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.073163, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) 0.135427, (GLfloat) - 0.598377, (GLfloat) 0.789686, + (GLfloat) 0.151344, (GLfloat) - 0.566659, (GLfloat) 0.809934, + (GLfloat) 0.398755, (GLfloat) - 0.640091, (GLfloat) 0.656718, + (GLfloat) 0.422848, (GLfloat) - 0.608876, (GLfloat) 0.671170, + (GLfloat) - 0.178091, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620, + (GLfloat) - 0.398755, (GLfloat) - 0.640090, (GLfloat) 0.656718, + (GLfloat) - 0.422848, (GLfloat) - 0.608876, (GLfloat) 0.671170, + (GLfloat) - 0.151344, (GLfloat) - 0.566659, (GLfloat) 0.809934, + (GLfloat) - 0.135427, (GLfloat) - 0.598377, (GLfloat) 0.789686, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, +}; + +static unsigned short int s1_1_POLS[] = +{ + 3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 76, 22, 78, 1, 3, 78, 74, 76, 1, + 3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1, + 3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1, + 3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 78, 22, 88, 1, 3, 88, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, +3, 101, 23, 102, 1, 3, 102, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1, + 3, 16, 104, 100, 1, 3, 16, 100, 108, 1, 3, 104, 32, 106, 1, 3, 106, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 101, 30, 108, 1, 3, 108, 100, 101, 1, + 3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1, + 3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1, + 3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1, + 3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1, + 3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1, + 3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1, + 3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 123, 36, 130, 1, 3, 130, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 113, 32, 119, 1, 3, 119, 112, 113, 1, + 3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1, + 3, 18, 133, 120, 1, 3, 18, 120, 121, 1, 3, 133, 39, 134, 1, 3, 134, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 135, 36, 121, 1, 3, 121, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1, + 3, 136, 27, 134, 1, 3, 134, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, + 3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1, + 3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1, + 3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, + 3, 76, 12, 146, 1, 3, 146, 75, 76, 1, 3, 41, 148, 75, 1, 3, 41, 75, 146, 1, + 3, 148, 21, 149, 1, 3, 149, 75, 148, 1, 3, 22, 76, 75, 1, 3, 22, 75, 149, 1, +3, 8, 151, 147, 1, 3, 8, 147, 155, 1, 3, 151, 43, 153, 1, 3, 153, 147, 151, 1, + 3, 21, 148, 147, 1, 3, 21, 147, 153, 1, 3, 148, 41, 155, 1, 3, 155, 147, 148, 1, + 3, 11, 157, 152, 1, 3, 11, 152, 160, 1, 3, 157, 44, 158, 1, 3, 158, 152, 157, 1, + 3, 21, 153, 152, 1, 3, 21, 152, 158, 1, 3, 153, 43, 160, 1, 3, 160, 152, 153, 1, + 3, 161, 13, 88, 1, 3, 88, 87, 161, 1, 3, 22, 149, 87, 1, 3, 22, 87, 88, 1, +3, 149, 21, 158, 1, 3, 158, 87, 149, 1, 3, 44, 161, 87, 1, 3, 44, 87, 158, 1, + 3, 133, 18, 162, 1, 3, 162, 132, 133, 1, 3, 45, 164, 132, 1, 3, 45, 132, 162, 1, + 3, 164, 38, 165, 1, 3, 165, 132, 164, 1, 3, 39, 133, 132, 1, 3, 39, 132, 165, 1, +3, 9, 167, 163, 1, 3, 9, 163, 170, 1, 3, 167, 47, 168, 1, 3, 168, 163, 167, 1, + 3, 38, 164, 163, 1, 3, 38, 163, 168, 1, 3, 164, 45, 170, 1, 3, 170, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 177, 16, 108, 1, 3, 108, 107, 177, 1, 3, 30, 174, 107, 1, 3, 30, 107, 108, 1, + 3, 174, 29, 176, 1, 3, 176, 107, 174, 1, 3, 50, 177, 107, 1, 3, 50, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 10, 183, 175, 1, 3, 10, 175, 185, 1, 3, 183, 50, 176, 1, 3, 176, 175, 183, 1, + 3, 29, 181, 175, 1, 3, 29, 175, 176, 1, 3, 181, 49, 185, 1, 3, 185, 175, 181, 1, + 3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1, + 3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1, + 3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1, + 3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1, + 3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1, + 3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1, +3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1, + 3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1, + 3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1, + 3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1, + 3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1, + 3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1, +3, 8, 173, 172, 1, 3, 8, 172, 208, 1, 3, 173, 47, 207, 1, 3, 207, 172, 173, 1, + 3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, + 3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1, + 3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1, +3, 9, 193, 192, 1, 3, 9, 192, 209, 1, 3, 193, 52, 215, 1, 3, 215, 192, 193, 1, + 3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1, + 3, 10, 216, 189, 1, 3, 10, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1, + 3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 215, 52, 190, 1, 3, 190, 189, 215, 1, + 3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1, + 3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1, + 3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1, + 3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1, + 3, 11, 228, 179, 1, 3, 11, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1, + 3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 227, 49, 180, 1, 3, 180, 179, 227, 1, + 3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1, + 3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1, + 3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1, + 3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1, + 3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1, + 3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1, +3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1, + 3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1, + 3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1, + 3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1, +3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1, + 3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1, +3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1, + 3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, +3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1, + 3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1, +3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1, + 3, 262, 53, 258, 1, 3, 258, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1, +3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, +3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1, +3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1, + 3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1, +3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1, + 3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1, + 3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, +3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1, + 3, 280, 61, 281, 1, 3, 281, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1, +3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1, + 3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1, +3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, +3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_1 = +{ + 290, /* number of points */ + s1_1_PNTS, s1_1_normals, s1_1_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_1.c */ diff --git a/hacks/glx/s1_2.c b/hacks/glx/s1_2.c new file mode 100644 index 00000000..068a5a4e --- /dev/null +++ b/hacks/glx/s1_2.c @@ -0,0 +1,1057 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_2.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_2" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_2_PNTS[] = +{ + (GLfloat) 0.316229, (GLfloat) 0.114342, (GLfloat) - 0.309219, + (GLfloat) 0.316229, (GLfloat) 0.114342, (GLfloat) - 0.690781, + (GLfloat) 0.697100, (GLfloat) 0.103031, (GLfloat) - 0.309219, + (GLfloat) 0.697100, (GLfloat) 0.103031, (GLfloat) - 0.690781, + (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.638667, + (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.638667, + (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.361333, + (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.361333, + (GLfloat) 0.813840, (GLfloat) 0.310563, (GLfloat) - 0.755750, + (GLfloat) 0.308193, (GLfloat) 0.377118, (GLfloat) - 0.755750, + (GLfloat) 0.308193, (GLfloat) 0.377118, (GLfloat) - 0.244250, + (GLfloat) 0.813840, (GLfloat) 0.310563, (GLfloat) - 0.244250, + (GLfloat) 0.865458, (GLfloat) 0.513412, (GLfloat) - 0.690781, + (GLfloat) 0.865458, (GLfloat) 0.513412, (GLfloat) - 0.309219, + (GLfloat) 0.858509, (GLfloat) 0.615264, (GLfloat) - 0.361333, + (GLfloat) 0.858509, (GLfloat) 0.615264, (GLfloat) - 0.638667, + (GLfloat) 0.500319, (GLfloat) 0.618731, (GLfloat) - 0.309219, + (GLfloat) 0.596285, (GLfloat) 0.705555, (GLfloat) - 0.361333, + (GLfloat) 0.500319, (GLfloat) 0.618731, (GLfloat) - 0.690781, + (GLfloat) 0.596285, (GLfloat) 0.705555, (GLfloat) - 0.638667, + (GLfloat) 0.945338, (GLfloat) 0.554869, (GLfloat) - 0.500000, + (GLfloat) 0.927845, (GLfloat) 0.404808, (GLfloat) - 0.500000, + (GLfloat) 0.931847, (GLfloat) 0.494263, (GLfloat) - 0.500000, + (GLfloat) 0.716506, (GLfloat) 0.632271, (GLfloat) - 0.258297, + (GLfloat) 0.883750, (GLfloat) 0.575062, (GLfloat) - 0.323141, + (GLfloat) 0.733407, (GLfloat) 0.677865, (GLfloat) - 0.500000, + (GLfloat) 0.897467, (GLfloat) 0.608935, (GLfloat) - 0.500000, + (GLfloat) 0.716506, (GLfloat) 0.632271, (GLfloat) - 0.741703, + (GLfloat) 0.883750, (GLfloat) 0.575062, (GLfloat) - 0.676859, + (GLfloat) 0.622584, (GLfloat) 0.465571, (GLfloat) - 0.187109, + (GLfloat) 0.682889, (GLfloat) 0.566071, (GLfloat) - 0.239844, + (GLfloat) 0.487673, (GLfloat) 0.709673, (GLfloat) - 0.500000, + (GLfloat) 0.548866, (GLfloat) 0.688331, (GLfloat) - 0.323141, + (GLfloat) 0.729578, (GLfloat) 0.666743, (GLfloat) - 0.322437, + (GLfloat) 0.317323, (GLfloat) 0.526334, (GLfloat) - 0.500000, + (GLfloat) 0.433930, (GLfloat) 0.637880, (GLfloat) - 0.500000, + (GLfloat) 0.548866, (GLfloat) 0.688331, (GLfloat) - 0.676859, + (GLfloat) 0.561689, (GLfloat) 0.724552, (GLfloat) - 0.500000, + (GLfloat) 0.622584, (GLfloat) 0.465571, (GLfloat) - 0.812891, + (GLfloat) 0.682889, (GLfloat) 0.566071, (GLfloat) - 0.760156, + (GLfloat) 0.729578, (GLfloat) 0.666743, (GLfloat) - 0.677562, + (GLfloat) 0.846442, (GLfloat) 0.421012, (GLfloat) - 0.729453, + (GLfloat) 0.835067, (GLfloat) 0.192357, (GLfloat) - 0.500000, + (GLfloat) 0.905776, (GLfloat) 0.298462, (GLfloat) - 0.500000, + (GLfloat) 0.846442, (GLfloat) 0.421012, (GLfloat) - 0.270547, + (GLfloat) 0.398726, (GLfloat) 0.510130, (GLfloat) - 0.729453, + (GLfloat) 0.523830, (GLfloat) 0.217409, (GLfloat) - 0.812891, + (GLfloat) 0.561017, (GLfloat) 0.343841, (GLfloat) - 0.848750, + (GLfloat) 0.523830, (GLfloat) 0.217409, (GLfloat) - 0.187109, + (GLfloat) 0.561017, (GLfloat) 0.343841, (GLfloat) - 0.151250, + (GLfloat) 0.398726, (GLfloat) 0.510130, (GLfloat) - 0.270547, + (GLfloat) 0.212593, (GLfloat) 0.242461, (GLfloat) - 0.500000, + (GLfloat) 0.216258, (GLfloat) 0.389219, (GLfloat) - 0.500000, + (GLfloat) 0.500666, (GLfloat) 0.037435, (GLfloat) - 0.741703, + (GLfloat) 0.506665, (GLfloat) 0.108686, (GLfloat) - 0.760156, + (GLfloat) 0.752070, (GLfloat) 0.199038, (GLfloat) - 0.729453, + (GLfloat) 0.295589, (GLfloat) 0.235781, (GLfloat) - 0.729453, + (GLfloat) 0.295589, (GLfloat) 0.235781, (GLfloat) - 0.270547, + (GLfloat) 0.259010, (GLfloat) 0.038206, (GLfloat) - 0.500000, + (GLfloat) 0.246980, (GLfloat) 0.116398, (GLfloat) - 0.500000, + (GLfloat) 0.752070, (GLfloat) 0.199038, (GLfloat) - 0.270547, + (GLfloat) 0.500666, (GLfloat) 0.037435, (GLfloat) - 0.258297, + (GLfloat) 0.506665, (GLfloat) 0.108686, (GLfloat) - 0.239844, + (GLfloat) 0.742322, (GLfloat) 0.036664, (GLfloat) - 0.500000, + (GLfloat) 0.766349, (GLfloat) 0.100974, (GLfloat) - 0.500000, + (GLfloat) 0.677491, (GLfloat) 0.037477, (GLfloat) - 0.676859, + (GLfloat) 0.500000, (GLfloat) - 0.010924, (GLfloat) - 0.500000, + (GLfloat) 0.677562, (GLfloat) 0.000839, (GLfloat) - 0.500000, + (GLfloat) 0.677491, (GLfloat) 0.037477, (GLfloat) - 0.323141, + (GLfloat) 0.323842, (GLfloat) 0.038608, (GLfloat) - 0.676859, + (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.677562, + (GLfloat) 0.323842, (GLfloat) 0.038608, (GLfloat) - 0.323141, + (GLfloat) 0.322437, (GLfloat) 0.000839, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.322437, + (GLfloat) 0.925000, (GLfloat) 0.532253, (GLfloat) - 0.600125, + (GLfloat) 0.911045, (GLfloat) 0.457192, (GLfloat) - 0.613625, + (GLfloat) 0.915250, (GLfloat) 0.499050, (GLfloat) - 0.604062, + (GLfloat) 0.925000, (GLfloat) 0.532253, (GLfloat) - 0.399875, + (GLfloat) 0.940858, (GLfloat) 0.527164, (GLfloat) - 0.500000, + (GLfloat) 0.919197, (GLfloat) 0.584697, (GLfloat) - 0.587500, + (GLfloat) 0.929810, (GLfloat) 0.559801, (GLfloat) - 0.596406, + (GLfloat) 0.798138, (GLfloat) 0.572966, (GLfloat) - 0.733625, + (GLfloat) 0.877427, (GLfloat) 0.547520, (GLfloat) - 0.683563, + (GLfloat) 0.798138, (GLfloat) 0.572966, (GLfloat) - 0.266375, + (GLfloat) 0.877427, (GLfloat) 0.547520, (GLfloat) - 0.316437, + (GLfloat) 0.919197, (GLfloat) 0.584697, (GLfloat) - 0.412500, + (GLfloat) 0.929810, (GLfloat) 0.559801, (GLfloat) - 0.403594, + (GLfloat) 0.911045, (GLfloat) 0.457192, (GLfloat) - 0.386375, + (GLfloat) 0.915250, (GLfloat) 0.499050, (GLfloat) - 0.395938, + (GLfloat) 0.817112, (GLfloat) 0.642984, (GLfloat) - 0.409500, + (GLfloat) 0.884513, (GLfloat) 0.611054, (GLfloat) - 0.417500, + (GLfloat) 0.934249, (GLfloat) 0.580800, (GLfloat) - 0.500000, + (GLfloat) 0.807153, (GLfloat) 0.623277, (GLfloat) - 0.294000, + (GLfloat) 0.876135, (GLfloat) 0.598240, (GLfloat) - 0.339125, + (GLfloat) 0.807153, (GLfloat) 0.623277, (GLfloat) - 0.706000, + (GLfloat) 0.876135, (GLfloat) 0.598240, (GLfloat) - 0.660875, + (GLfloat) 0.817112, (GLfloat) 0.642984, (GLfloat) - 0.590500, + (GLfloat) 0.884513, (GLfloat) 0.611054, (GLfloat) - 0.582500, + (GLfloat) 0.764624, (GLfloat) 0.492766, (GLfloat) - 0.234875, + (GLfloat) 0.782472, (GLfloat) 0.537348, (GLfloat) - 0.257187, + (GLfloat) 0.607846, (GLfloat) 0.634036, (GLfloat) - 0.266375, + (GLfloat) 0.702992, (GLfloat) 0.603501, (GLfloat) - 0.249687, + (GLfloat) 0.807680, (GLfloat) 0.601112, (GLfloat) - 0.274594, + (GLfloat) 0.480984, (GLfloat) 0.674750, (GLfloat) - 0.399875, + (GLfloat) 0.528557, (GLfloat) 0.659482, (GLfloat) - 0.316437, + (GLfloat) 0.641688, (GLfloat) 0.680252, (GLfloat) - 0.294000, + (GLfloat) 0.625134, (GLfloat) 0.662855, (GLfloat) - 0.274594, + (GLfloat) 0.544994, (GLfloat) 0.546127, (GLfloat) - 0.234875, + (GLfloat) 0.583305, (GLfloat) 0.594795, (GLfloat) - 0.257187, + (GLfloat) 0.645973, (GLfloat) 0.701912, (GLfloat) - 0.409500, + (GLfloat) 0.650852, (GLfloat) 0.691510, (GLfloat) - 0.335375, + (GLfloat) 0.724816, (GLfloat) 0.652913, (GLfloat) - 0.278500, + (GLfloat) 0.529644, (GLfloat) 0.718831, (GLfloat) - 0.412500, + (GLfloat) 0.571915, (GLfloat) 0.702991, (GLfloat) - 0.339125, + (GLfloat) 0.806863, (GLfloat) 0.637791, (GLfloat) - 0.335375, + (GLfloat) 0.398573, (GLfloat) 0.581701, (GLfloat) - 0.386375, + (GLfloat) 0.450527, (GLfloat) 0.633092, (GLfloat) - 0.395938, + (GLfloat) 0.480984, (GLfloat) 0.674750, (GLfloat) - 0.600125, + (GLfloat) 0.465127, (GLfloat) 0.679839, (GLfloat) - 0.500000, + (GLfloat) 0.503003, (GLfloat) 0.704166, (GLfloat) - 0.403594, + (GLfloat) 0.607846, (GLfloat) 0.634036, (GLfloat) - 0.733625, + (GLfloat) 0.528557, (GLfloat) 0.659482, (GLfloat) - 0.683563, + (GLfloat) 0.529644, (GLfloat) 0.718831, (GLfloat) - 0.587500, + (GLfloat) 0.503003, (GLfloat) 0.704166, (GLfloat) - 0.596406, + (GLfloat) 0.398573, (GLfloat) 0.581701, (GLfloat) - 0.613625, + (GLfloat) 0.450527, (GLfloat) 0.633092, (GLfloat) - 0.604062, + (GLfloat) 0.645973, (GLfloat) 0.701912, (GLfloat) - 0.590500, + (GLfloat) 0.573201, (GLfloat) 0.718247, (GLfloat) - 0.582500, + (GLfloat) 0.515384, (GLfloat) 0.725027, (GLfloat) - 0.500000, + (GLfloat) 0.641688, (GLfloat) 0.680252, (GLfloat) - 0.706000, + (GLfloat) 0.571915, (GLfloat) 0.702991, (GLfloat) - 0.660875, + (GLfloat) 0.573201, (GLfloat) 0.718247, (GLfloat) - 0.417500, + (GLfloat) 0.544994, (GLfloat) 0.546127, (GLfloat) - 0.765125, + (GLfloat) 0.583305, (GLfloat) 0.594795, (GLfloat) - 0.742813, + (GLfloat) 0.702992, (GLfloat) 0.603501, (GLfloat) - 0.750313, + (GLfloat) 0.625134, (GLfloat) 0.662855, (GLfloat) - 0.725406, + (GLfloat) 0.807680, (GLfloat) 0.601112, (GLfloat) - 0.725406, + (GLfloat) 0.764624, (GLfloat) 0.492766, (GLfloat) - 0.765125, + (GLfloat) 0.782472, (GLfloat) 0.537348, (GLfloat) - 0.742813, + (GLfloat) 0.806863, (GLfloat) 0.637791, (GLfloat) - 0.664625, + (GLfloat) 0.724816, (GLfloat) 0.652913, (GLfloat) - 0.721500, + (GLfloat) 0.650852, (GLfloat) 0.691510, (GLfloat) - 0.664625, + (GLfloat) 0.732447, (GLfloat) 0.675074, (GLfloat) - 0.402250, + (GLfloat) 0.824871, (GLfloat) 0.643250, (GLfloat) - 0.500000, + (GLfloat) 0.640022, (GLfloat) 0.706898, (GLfloat) - 0.500000, + (GLfloat) 0.732447, (GLfloat) 0.675074, (GLfloat) - 0.597750, + (GLfloat) 0.856137, (GLfloat) 0.470533, (GLfloat) - 0.708313, + (GLfloat) 0.899707, (GLfloat) 0.356231, (GLfloat) - 0.635000, + (GLfloat) 0.907494, (GLfloat) 0.408859, (GLfloat) - 0.625156, + (GLfloat) 0.929348, (GLfloat) 0.452746, (GLfloat) - 0.500000, + (GLfloat) 0.851860, (GLfloat) 0.246808, (GLfloat) - 0.635000, + (GLfloat) 0.882792, (GLfloat) 0.301487, (GLfloat) - 0.639500, + (GLfloat) 0.899707, (GLfloat) 0.356231, (GLfloat) - 0.365000, + (GLfloat) 0.921826, (GLfloat) 0.352648, (GLfloat) - 0.500000, + (GLfloat) 0.722756, (GLfloat) 0.384892, (GLfloat) - 0.815000, + (GLfloat) 0.833350, (GLfloat) 0.366979, (GLfloat) - 0.747500, + (GLfloat) 0.722756, (GLfloat) 0.384892, (GLfloat) - 0.185000, + (GLfloat) 0.833350, (GLfloat) 0.366979, (GLfloat) - 0.252500, + (GLfloat) 0.907494, (GLfloat) 0.408859, (GLfloat) - 0.374844, + (GLfloat) 0.851860, (GLfloat) 0.246808, (GLfloat) - 0.365000, + (GLfloat) 0.882792, (GLfloat) 0.301487, (GLfloat) - 0.360500, + (GLfloat) 0.856137, (GLfloat) 0.470533, (GLfloat) - 0.291687, + (GLfloat) 0.453481, (GLfloat) 0.568361, (GLfloat) - 0.708313, + (GLfloat) 0.457330, (GLfloat) 0.427884, (GLfloat) - 0.815000, + (GLfloat) 0.500479, (GLfloat) 0.489876, (GLfloat) - 0.792031, + (GLfloat) 0.654809, (GLfloat) 0.519447, (GLfloat) - 0.784063, + (GLfloat) 0.405397, (GLfloat) 0.294044, (GLfloat) - 0.815000, + (GLfloat) 0.423113, (GLfloat) 0.361992, (GLfloat) - 0.825500, + (GLfloat) 0.590043, (GLfloat) 0.406388, (GLfloat) - 0.837500, + (GLfloat) 0.280379, (GLfloat) 0.456545, (GLfloat) - 0.635000, + (GLfloat) 0.346736, (GLfloat) 0.445797, (GLfloat) - 0.747500, + (GLfloat) 0.744688, (GLfloat) 0.441266, (GLfloat) - 0.792031, + (GLfloat) 0.673275, (GLfloat) 0.265703, (GLfloat) - 0.815000, + (GLfloat) 0.698920, (GLfloat) 0.325689, (GLfloat) - 0.825500, + (GLfloat) 0.654809, (GLfloat) 0.519447, (GLfloat) - 0.215937, + (GLfloat) 0.457330, (GLfloat) 0.427884, (GLfloat) - 0.185000, + (GLfloat) 0.500479, (GLfloat) 0.489876, (GLfloat) - 0.207969, + (GLfloat) 0.453481, (GLfloat) 0.568361, (GLfloat) - 0.291687, + (GLfloat) 0.744688, (GLfloat) 0.441266, (GLfloat) - 0.207969, + (GLfloat) 0.673275, (GLfloat) 0.265703, (GLfloat) - 0.185000, + (GLfloat) 0.698920, (GLfloat) 0.325689, (GLfloat) - 0.174500, + (GLfloat) 0.590043, (GLfloat) 0.406388, (GLfloat) - 0.162500, + (GLfloat) 0.280379, (GLfloat) 0.456545, (GLfloat) - 0.365000, + (GLfloat) 0.346736, (GLfloat) 0.445797, (GLfloat) - 0.252500, + (GLfloat) 0.405397, (GLfloat) 0.294044, (GLfloat) - 0.185000, + (GLfloat) 0.423113, (GLfloat) 0.361992, (GLfloat) - 0.174500, + (GLfloat) 0.380271, (GLfloat) 0.586148, (GLfloat) - 0.500000, + (GLfloat) 0.337674, (GLfloat) 0.522283, (GLfloat) - 0.625156, + (GLfloat) 0.337674, (GLfloat) 0.522283, (GLfloat) - 0.374844, + (GLfloat) 0.226812, (GLfloat) 0.312938, (GLfloat) - 0.365000, + (GLfloat) 0.239242, (GLfloat) 0.386194, (GLfloat) - 0.360500, + (GLfloat) 0.258260, (GLfloat) 0.460127, (GLfloat) - 0.500000, + (GLfloat) 0.226812, (GLfloat) 0.312938, (GLfloat) - 0.635000, + (GLfloat) 0.239242, (GLfloat) 0.386194, (GLfloat) - 0.639500, + (GLfloat) 0.400082, (GLfloat) 0.165542, (GLfloat) - 0.765125, + (GLfloat) 0.402616, (GLfloat) 0.069508, (GLfloat) - 0.733625, + (GLfloat) 0.402791, (GLfloat) 0.111771, (GLfloat) - 0.742813, + (GLfloat) 0.626577, (GLfloat) 0.153203, (GLfloat) - 0.765125, + (GLfloat) 0.513329, (GLfloat) 0.159372, (GLfloat) - 0.784063, + (GLfloat) 0.399335, (GLfloat) 0.227430, (GLfloat) - 0.792031, + (GLfloat) 0.249085, (GLfloat) 0.173768, (GLfloat) - 0.613625, + (GLfloat) 0.305709, (GLfloat) 0.170683, (GLfloat) - 0.708313, + (GLfloat) 0.777574, (GLfloat) 0.144976, (GLfloat) - 0.613625, + (GLfloat) 0.720950, (GLfloat) 0.148061, (GLfloat) - 0.708313, + (GLfloat) 0.648325, (GLfloat) 0.207388, (GLfloat) - 0.792031, + (GLfloat) 0.602715, (GLfloat) 0.067041, (GLfloat) - 0.733625, + (GLfloat) 0.610539, (GLfloat) 0.105601, (GLfloat) - 0.742813, + (GLfloat) 0.539336, (GLfloat) 0.279873, (GLfloat) - 0.837500, + (GLfloat) 0.784890, (GLfloat) 0.253894, (GLfloat) - 0.747500, + (GLfloat) 0.293781, (GLfloat) 0.305853, (GLfloat) - 0.747500, + (GLfloat) 0.233342, (GLfloat) 0.240791, (GLfloat) - 0.625156, + (GLfloat) 0.249085, (GLfloat) 0.173768, (GLfloat) - 0.386375, + (GLfloat) 0.230210, (GLfloat) 0.174796, (GLfloat) - 0.500000, + (GLfloat) 0.269217, (GLfloat) 0.071154, (GLfloat) - 0.600125, + (GLfloat) 0.264292, (GLfloat) 0.115884, (GLfloat) - 0.604062, + (GLfloat) 0.204489, (GLfloat) 0.315300, (GLfloat) - 0.500000, + (GLfloat) 0.293781, (GLfloat) 0.305853, (GLfloat) - 0.252500, + (GLfloat) 0.233342, (GLfloat) 0.240791, (GLfloat) - 0.374844, + (GLfloat) 0.269217, (GLfloat) 0.071154, (GLfloat) - 0.399875, + (GLfloat) 0.264292, (GLfloat) 0.115884, (GLfloat) - 0.395938, + (GLfloat) 0.400082, (GLfloat) 0.165542, (GLfloat) - 0.234875, + (GLfloat) 0.305709, (GLfloat) 0.170683, (GLfloat) - 0.291687, + (GLfloat) 0.399335, (GLfloat) 0.227430, (GLfloat) - 0.207969, + (GLfloat) 0.626577, (GLfloat) 0.153203, (GLfloat) - 0.234875, + (GLfloat) 0.513329, (GLfloat) 0.159372, (GLfloat) - 0.215937, + (GLfloat) 0.402616, (GLfloat) 0.069508, (GLfloat) - 0.266375, + (GLfloat) 0.402791, (GLfloat) 0.111771, (GLfloat) - 0.257187, + (GLfloat) 0.539336, (GLfloat) 0.279873, (GLfloat) - 0.162500, + (GLfloat) 0.784890, (GLfloat) 0.253894, (GLfloat) - 0.252500, + (GLfloat) 0.648325, (GLfloat) 0.207388, (GLfloat) - 0.207969, + (GLfloat) 0.602715, (GLfloat) 0.067041, (GLfloat) - 0.266375, + (GLfloat) 0.610539, (GLfloat) 0.105601, (GLfloat) - 0.257187, + (GLfloat) 0.777574, (GLfloat) 0.144976, (GLfloat) - 0.386375, + (GLfloat) 0.720950, (GLfloat) 0.148061, (GLfloat) - 0.291687, + (GLfloat) 0.814318, (GLfloat) 0.194027, (GLfloat) - 0.374844, + (GLfloat) 0.796449, (GLfloat) 0.143948, (GLfloat) - 0.500000, + (GLfloat) 0.736115, (GLfloat) 0.065395, (GLfloat) - 0.399875, + (GLfloat) 0.749037, (GLfloat) 0.101488, (GLfloat) - 0.395938, + (GLfloat) 0.874183, (GLfloat) 0.244447, (GLfloat) - 0.500000, + (GLfloat) 0.814318, (GLfloat) 0.194027, (GLfloat) - 0.625156, + (GLfloat) 0.736115, (GLfloat) 0.065395, (GLfloat) - 0.600125, + (GLfloat) 0.749037, (GLfloat) 0.101488, (GLfloat) - 0.604062, + (GLfloat) 0.752790, (GLfloat) 0.065190, (GLfloat) - 0.500000, + (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.412500, + (GLfloat) 0.726029, (GLfloat) 0.037019, (GLfloat) - 0.403594, + (GLfloat) 0.686090, (GLfloat) 0.066012, (GLfloat) - 0.316437, + (GLfloat) 0.686090, (GLfloat) 0.066012, (GLfloat) - 0.683563, + (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.587500, + (GLfloat) 0.726029, (GLfloat) 0.037019, (GLfloat) - 0.596406, + (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.590500, + (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.582500, + (GLfloat) 0.721500, (GLfloat) 0.015465, (GLfloat) - 0.500000, + (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.706000, + (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.660875, + (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.294000, + (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.339125, + (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.409500, + (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.417500, + (GLfloat) 0.502666, (GLfloat) 0.068274, (GLfloat) - 0.750313, + (GLfloat) 0.597054, (GLfloat) 0.037430, (GLfloat) - 0.725406, + (GLfloat) 0.319242, (GLfloat) 0.070537, (GLfloat) - 0.683563, + (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.706000, + (GLfloat) 0.404279, (GLfloat) 0.038047, (GLfloat) - 0.725406, + (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.590500, + (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.664625, + (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.721500, + (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.587500, + (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.660875, + (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.664625, + (GLfloat) 0.252542, (GLfloat) 0.071359, (GLfloat) - 0.500000, + (GLfloat) 0.275304, (GLfloat) 0.038459, (GLfloat) - 0.596406, + (GLfloat) 0.319242, (GLfloat) 0.070537, (GLfloat) - 0.316437, + (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.412500, + (GLfloat) 0.275304, (GLfloat) 0.038459, (GLfloat) - 0.403594, + (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.409500, + (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.417500, + (GLfloat) 0.278500, (GLfloat) 0.015465, (GLfloat) - 0.500000, + (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.294000, + (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.339125, + (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.582500, + (GLfloat) 0.502666, (GLfloat) 0.068274, (GLfloat) - 0.249687, + (GLfloat) 0.404279, (GLfloat) 0.038047, (GLfloat) - 0.274594, + (GLfloat) 0.597054, (GLfloat) 0.037430, (GLfloat) - 0.274594, + (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.335375, + (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.278500, + (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.335375, + (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.597750, + (GLfloat) 0.597750, (GLfloat) - 0.007972, (GLfloat) - 0.500000, + (GLfloat) 0.402250, (GLfloat) - 0.007972, (GLfloat) - 0.500000, + (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.402250, +}; + +static GLfloat s1_2_normals[] = +{ + (GLfloat) 0.838584, (GLfloat) - 0.185505, (GLfloat) - 0.512216, + (GLfloat) 0.838560, (GLfloat) - 0.185860, (GLfloat) - 0.512127, + (GLfloat) 0.951437, (GLfloat) - 0.260566, (GLfloat) - 0.163932, + (GLfloat) 0.951618, (GLfloat) - 0.260024, (GLfloat) - 0.163738, + (GLfloat) 0.973663, (GLfloat) - 0.157463, (GLfloat) - 0.164880, + (GLfloat) 0.975548, (GLfloat) - 0.148474, (GLfloat) - 0.162053, + (GLfloat) 0.859322, (GLfloat) - 0.074133, (GLfloat) - 0.506033, + (GLfloat) 0.859277, (GLfloat) - 0.081888, (GLfloat) - 0.504914, + (GLfloat) 0.838560, (GLfloat) - 0.185860, (GLfloat) 0.512127, + (GLfloat) 0.838584, (GLfloat) - 0.185505, (GLfloat) 0.512216, + (GLfloat) 0.859322, (GLfloat) - 0.074133, (GLfloat) 0.506034, + (GLfloat) 0.859277, (GLfloat) - 0.081888, (GLfloat) 0.504914, + (GLfloat) 0.973663, (GLfloat) - 0.157463, (GLfloat) 0.164880, + (GLfloat) 0.975548, (GLfloat) - 0.148474, (GLfloat) 0.162053, + (GLfloat) 0.951618, (GLfloat) - 0.260024, (GLfloat) 0.163738, + (GLfloat) 0.951437, (GLfloat) - 0.260566, (GLfloat) 0.163932, + (GLfloat) 0.573088, (GLfloat) 0.793214, (GLfloat) 0.205867, + (GLfloat) 0.558283, (GLfloat) 0.810311, (GLfloat) 0.178092, + (GLfloat) 0.606103, (GLfloat) 0.792390, (GLfloat) 0.068965, + (GLfloat) 0.596705, (GLfloat) 0.799118, (GLfloat) 0.073163, + (GLfloat) 0.896389, (GLfloat) 0.425982, (GLfloat) 0.122582, + (GLfloat) 0.910488, (GLfloat) 0.389376, (GLfloat) 0.139274, + (GLfloat) 0.787435, (GLfloat) 0.503715, (GLfloat) 0.355272, + (GLfloat) 0.794681, (GLfloat) 0.474299, (GLfloat) 0.378844, + (GLfloat) 0.558283, (GLfloat) 0.810311, (GLfloat) - 0.178092, + (GLfloat) 0.573088, (GLfloat) 0.793214, (GLfloat) - 0.205866, + (GLfloat) 0.787434, (GLfloat) 0.503716, (GLfloat) - 0.355272, + (GLfloat) 0.794681, (GLfloat) 0.474299, (GLfloat) - 0.378844, + (GLfloat) 0.910488, (GLfloat) 0.389376, (GLfloat) - 0.139274, + (GLfloat) 0.896389, (GLfloat) 0.425982, (GLfloat) - 0.122583, + (GLfloat) 0.596705, (GLfloat) 0.799118, (GLfloat) - 0.073163, + (GLfloat) 0.606103, (GLfloat) 0.792390, (GLfloat) - 0.068965, + (GLfloat) 0.528377, (GLfloat) - 0.013430, (GLfloat) 0.848903, + (GLfloat) 0.532136, (GLfloat) - 0.007543, (GLfloat) 0.846625, + (GLfloat) 0.209439, (GLfloat) 0.141946, (GLfloat) 0.967464, + (GLfloat) 0.218070, (GLfloat) 0.152719, (GLfloat) 0.963910, + (GLfloat) 0.237428, (GLfloat) 0.197257, (GLfloat) 0.951166, + (GLfloat) 0.225804, (GLfloat) 0.180417, (GLfloat) 0.957320, + (GLfloat) 0.549711, (GLfloat) 0.076255, (GLfloat) 0.831867, + (GLfloat) 0.550775, (GLfloat) 0.056452, (GLfloat) 0.832742, + (GLfloat) - 0.393177, (GLfloat) 0.417558, (GLfloat) 0.819181, + (GLfloat) - 0.379656, (GLfloat) 0.429289, (GLfloat) 0.819495, + (GLfloat) - 0.366688, (GLfloat) 0.451901, (GLfloat) 0.813219, + (GLfloat) - 0.369492, (GLfloat) 0.449132, (GLfloat) 0.813484, + (GLfloat) - 0.064014, (GLfloat) 0.313584, (GLfloat) 0.947400, + (GLfloat) - 0.066684, (GLfloat) 0.310439, (GLfloat) 0.948252, + (GLfloat) - 0.086424, (GLfloat) 0.278029, (GLfloat) 0.956677, + (GLfloat) - 0.074037, (GLfloat) 0.290647, (GLfloat) 0.953962, + (GLfloat) 0.110270, (GLfloat) 0.952576, (GLfloat) 0.283620, + (GLfloat) 0.140226, (GLfloat) 0.954260, (GLfloat) 0.264054, + (GLfloat) 0.237331, (GLfloat) 0.918949, (GLfloat) 0.314972, + (GLfloat) 0.245773, (GLfloat) 0.920155, (GLfloat) 0.304813, + (GLfloat) 0.105329, (GLfloat) 0.694128, (GLfloat) 0.712104, + (GLfloat) 0.087202, (GLfloat) 0.678641, (GLfloat) 0.729275, + (GLfloat) - 0.104644, (GLfloat) 0.803491, (GLfloat) 0.586048, + (GLfloat) - 0.129358, (GLfloat) 0.790652, (GLfloat) 0.598444, + (GLfloat) 0.490179, (GLfloat) 0.834739, (GLfloat) 0.250869, + (GLfloat) 0.486736, (GLfloat) 0.825366, (GLfloat) 0.286109, + (GLfloat) 0.575458, (GLfloat) 0.546427, (GLfloat) 0.608494, + (GLfloat) 0.582377, (GLfloat) 0.582433, (GLfloat) 0.567105, + (GLfloat) 0.347588, (GLfloat) 0.580631, (GLfloat) 0.736241, + (GLfloat) 0.339131, (GLfloat) 0.624243, (GLfloat) 0.703783, + (GLfloat) 0.378417, (GLfloat) 0.874281, (GLfloat) 0.304028, + (GLfloat) 0.373374, (GLfloat) 0.872526, (GLfloat) 0.315104, + (GLfloat) - 0.678225, (GLfloat) 0.555239, (GLfloat) 0.481373, + (GLfloat) - 0.681792, (GLfloat) 0.544639, (GLfloat) 0.488393, + (GLfloat) - 0.792737, (GLfloat) 0.589393, (GLfloat) 0.155511, + (GLfloat) - 0.790738, (GLfloat) 0.592627, (GLfloat) 0.153380, + (GLfloat) - 0.787611, (GLfloat) 0.595240, (GLfloat) 0.159243, + (GLfloat) - 0.781477, (GLfloat) 0.604504, (GLfloat) 0.154495, + (GLfloat) - 0.659940, (GLfloat) 0.576523, (GLfloat) 0.481768, + (GLfloat) - 0.666748, (GLfloat) 0.561105, (GLfloat) 0.490519, + (GLfloat) - 0.678225, (GLfloat) 0.555239, (GLfloat) - 0.481374, + (GLfloat) - 0.681792, (GLfloat) 0.544639, (GLfloat) - 0.488393, + (GLfloat) - 0.666748, (GLfloat) 0.561105, (GLfloat) - 0.490519, + (GLfloat) - 0.659940, (GLfloat) 0.576523, (GLfloat) - 0.481768, + (GLfloat) - 0.787611, (GLfloat) 0.595240, (GLfloat) - 0.159243, + (GLfloat) - 0.781477, (GLfloat) 0.604504, (GLfloat) - 0.154495, + (GLfloat) - 0.790738, (GLfloat) 0.592627, (GLfloat) - 0.153380, + (GLfloat) - 0.792737, (GLfloat) 0.589393, (GLfloat) - 0.155511, + (GLfloat) 0.036752, (GLfloat) 0.977890, (GLfloat) - 0.205867, + (GLfloat) 0.058945, (GLfloat) 0.982247, (GLfloat) - 0.178091, + (GLfloat) 0.010229, (GLfloat) 0.997567, (GLfloat) - 0.068965, + (GLfloat) 0.021776, (GLfloat) 0.997082, (GLfloat) - 0.073162, + (GLfloat) - 0.480804, (GLfloat) 0.867725, (GLfloat) - 0.126022, + (GLfloat) - 0.442857, (GLfloat) 0.886381, (GLfloat) - 0.134932, + (GLfloat) - 0.305505, (GLfloat) 0.879128, (GLfloat) - 0.365788, + (GLfloat) - 0.350437, (GLfloat) 0.860755, (GLfloat) - 0.369182, + (GLfloat) 0.058946, (GLfloat) 0.982247, (GLfloat) 0.178091, + (GLfloat) 0.036752, (GLfloat) 0.977890, (GLfloat) 0.205867, + (GLfloat) - 0.350437, (GLfloat) 0.860755, (GLfloat) 0.369182, + (GLfloat) - 0.305505, (GLfloat) 0.879128, (GLfloat) 0.365788, + (GLfloat) - 0.480804, (GLfloat) 0.867725, (GLfloat) 0.126022, + (GLfloat) - 0.442857, (GLfloat) 0.886381, (GLfloat) 0.134932, + (GLfloat) 0.021776, (GLfloat) 0.997082, (GLfloat) 0.073162, + (GLfloat) 0.010229, (GLfloat) 0.997567, (GLfloat) 0.068965, + (GLfloat) - 0.393178, (GLfloat) 0.417557, (GLfloat) - 0.819181, + (GLfloat) - 0.379655, (GLfloat) 0.429290, (GLfloat) - 0.819495, + (GLfloat) - 0.074037, (GLfloat) 0.290648, (GLfloat) - 0.953961, + (GLfloat) - 0.086424, (GLfloat) 0.278030, (GLfloat) - 0.956677, + (GLfloat) - 0.064013, (GLfloat) 0.313585, (GLfloat) - 0.947400, + (GLfloat) - 0.066684, (GLfloat) 0.310439, (GLfloat) - 0.948252, + (GLfloat) - 0.369492, (GLfloat) 0.449132, (GLfloat) - 0.813484, + (GLfloat) - 0.366688, (GLfloat) 0.451901, (GLfloat) - 0.813219, + (GLfloat) 0.532135, (GLfloat) - 0.007544, (GLfloat) - 0.846626, + (GLfloat) 0.528378, (GLfloat) - 0.013430, (GLfloat) - 0.848903, + (GLfloat) 0.550775, (GLfloat) 0.056452, (GLfloat) - 0.832742, + (GLfloat) 0.549711, (GLfloat) 0.076255, (GLfloat) - 0.831867, + (GLfloat) 0.225804, (GLfloat) 0.180419, (GLfloat) - 0.957320, + (GLfloat) 0.237428, (GLfloat) 0.197257, (GLfloat) - 0.951166, + (GLfloat) 0.209439, (GLfloat) 0.141946, (GLfloat) - 0.967464, + (GLfloat) 0.218070, (GLfloat) 0.152720, (GLfloat) - 0.963910, + (GLfloat) 0.490179, (GLfloat) 0.834739, (GLfloat) - 0.250870, + (GLfloat) 0.486736, (GLfloat) 0.825366, (GLfloat) - 0.286109, + (GLfloat) 0.373374, (GLfloat) 0.872526, (GLfloat) - 0.315104, + (GLfloat) 0.378417, (GLfloat) 0.874281, (GLfloat) - 0.304029, + (GLfloat) 0.339131, (GLfloat) 0.624243, (GLfloat) - 0.703783, + (GLfloat) 0.347588, (GLfloat) 0.580630, (GLfloat) - 0.736241, + (GLfloat) 0.582377, (GLfloat) 0.582434, (GLfloat) - 0.567105, + (GLfloat) 0.575458, (GLfloat) 0.546427, (GLfloat) - 0.608494, + (GLfloat) 0.140225, (GLfloat) 0.954260, (GLfloat) - 0.264055, + (GLfloat) 0.110270, (GLfloat) 0.952576, (GLfloat) - 0.283620, + (GLfloat) - 0.104644, (GLfloat) 0.803491, (GLfloat) - 0.586047, + (GLfloat) - 0.129358, (GLfloat) 0.790652, (GLfloat) - 0.598444, + (GLfloat) 0.087202, (GLfloat) 0.678640, (GLfloat) - 0.729276, + (GLfloat) 0.105329, (GLfloat) 0.694128, (GLfloat) - 0.712104, + (GLfloat) 0.237332, (GLfloat) 0.918949, (GLfloat) - 0.314972, + (GLfloat) 0.245773, (GLfloat) 0.920155, (GLfloat) - 0.304813, + (GLfloat) 0.448419, (GLfloat) 0.885179, (GLfloat) 0.124011, + (GLfloat) 0.437269, (GLfloat) 0.889018, (GLfloat) 0.135803, + (GLfloat) 0.364737, (GLfloat) 0.924635, (GLfloat) 0.109622, + (GLfloat) 0.360657, (GLfloat) 0.925618, (GLfloat) 0.114709, + (GLfloat) 0.353761, (GLfloat) 0.934751, (GLfloat) 0.033079, + (GLfloat) 0.356519, (GLfloat) 0.933801, (GLfloat) 0.030163, + (GLfloat) 0.426940, (GLfloat) 0.903217, (GLfloat) 0.043834, + (GLfloat) 0.431621, (GLfloat) 0.901183, (GLfloat) 0.039656, + (GLfloat) 0.202761, (GLfloat) 0.969766, (GLfloat) 0.135803, + (GLfloat) 0.191612, (GLfloat) 0.973605, (GLfloat) 0.124011, + (GLfloat) 0.219643, (GLfloat) 0.974595, (GLfloat) 0.043834, + (GLfloat) 0.214702, (GLfloat) 0.975874, (GLfloat) 0.039656, + (GLfloat) 0.293965, (GLfloat) 0.955340, (GLfloat) 0.030163, + (GLfloat) 0.296722, (GLfloat) 0.954391, (GLfloat) 0.033079, + (GLfloat) 0.281846, (GLfloat) 0.953177, (GLfloat) 0.109622, + (GLfloat) 0.285665, (GLfloat) 0.951439, (GLfloat) 0.114709, + (GLfloat) 0.191612, (GLfloat) 0.973605, (GLfloat) - 0.124011, + (GLfloat) 0.202761, (GLfloat) 0.969766, (GLfloat) - 0.135803, + (GLfloat) 0.281846, (GLfloat) 0.953177, (GLfloat) - 0.109622, + (GLfloat) 0.285665, (GLfloat) 0.951439, (GLfloat) - 0.114709, + (GLfloat) 0.296722, (GLfloat) 0.954391, (GLfloat) - 0.033079, + (GLfloat) 0.293965, (GLfloat) 0.955340, (GLfloat) - 0.030163, + (GLfloat) 0.219643, (GLfloat) 0.974595, (GLfloat) - 0.043834, + (GLfloat) 0.214702, (GLfloat) 0.975874, (GLfloat) - 0.039656, + (GLfloat) 0.437270, (GLfloat) 0.889018, (GLfloat) - 0.135802, + (GLfloat) 0.448419, (GLfloat) 0.885179, (GLfloat) - 0.124011, + (GLfloat) 0.426940, (GLfloat) 0.903217, (GLfloat) - 0.043834, + (GLfloat) 0.431621, (GLfloat) 0.901183, (GLfloat) - 0.039656, + (GLfloat) 0.356519, (GLfloat) 0.933801, (GLfloat) - 0.030163, + (GLfloat) 0.353761, (GLfloat) 0.934751, (GLfloat) - 0.033079, + (GLfloat) 0.364737, (GLfloat) 0.924635, (GLfloat) - 0.109622, + (GLfloat) 0.360657, (GLfloat) 0.925618, (GLfloat) - 0.114709, + (GLfloat) 0.865947, (GLfloat) 0.016137, (GLfloat) - 0.499875, + (GLfloat) 0.868761, (GLfloat) 0.025708, (GLfloat) - 0.494564, + (GLfloat) 0.864411, (GLfloat) 0.044558, (GLfloat) - 0.500808, + (GLfloat) 0.867101, (GLfloat) 0.054429, (GLfloat) - 0.495149, + (GLfloat) 0.986611, (GLfloat) - 0.030929, (GLfloat) - 0.160132, + (GLfloat) 0.986294, (GLfloat) - 0.033936, (GLfloat) - 0.161472, + (GLfloat) 0.985351, (GLfloat) - 0.059326, (GLfloat) - 0.159886, + (GLfloat) 0.984981, (GLfloat) - 0.062150, (GLfloat) - 0.161092, + (GLfloat) 0.832885, (GLfloat) - 0.213353, (GLfloat) - 0.510669, + (GLfloat) 0.832050, (GLfloat) - 0.215053, (GLfloat) - 0.511318, + (GLfloat) 0.946090, (GLfloat) - 0.280224, (GLfloat) - 0.162447, + (GLfloat) 0.946491, (GLfloat) - 0.279128, (GLfloat) - 0.161996, + (GLfloat) 0.980117, (GLfloat) - 0.113104, (GLfloat) - 0.163030, + (GLfloat) 0.979875, (GLfloat) - 0.114395, (GLfloat) - 0.163582, + (GLfloat) 0.859139, (GLfloat) - 0.037704, (GLfloat) - 0.510352, + (GLfloat) 0.860908, (GLfloat) - 0.032422, (GLfloat) - 0.507727, + (GLfloat) 0.832885, (GLfloat) - 0.213353, (GLfloat) 0.510669, + (GLfloat) 0.832049, (GLfloat) - 0.215054, (GLfloat) 0.511318, + (GLfloat) 0.860908, (GLfloat) - 0.032422, (GLfloat) 0.507727, + (GLfloat) 0.859138, (GLfloat) - 0.037705, (GLfloat) 0.510352, + (GLfloat) 0.980117, (GLfloat) - 0.113104, (GLfloat) 0.163030, + (GLfloat) 0.979875, (GLfloat) - 0.114395, (GLfloat) 0.163582, + (GLfloat) 0.946491, (GLfloat) - 0.279128, (GLfloat) 0.161996, + (GLfloat) 0.946090, (GLfloat) - 0.280224, (GLfloat) 0.162447, + (GLfloat) 0.868761, (GLfloat) 0.025708, (GLfloat) 0.494563, + (GLfloat) 0.865947, (GLfloat) 0.016137, (GLfloat) 0.499875, + (GLfloat) 0.985351, (GLfloat) - 0.059326, (GLfloat) 0.159886, + (GLfloat) 0.984981, (GLfloat) - 0.062149, (GLfloat) 0.161092, + (GLfloat) 0.986294, (GLfloat) - 0.033936, (GLfloat) 0.161472, + (GLfloat) 0.986611, (GLfloat) - 0.030929, (GLfloat) 0.160132, + (GLfloat) 0.864411, (GLfloat) 0.044558, (GLfloat) 0.500808, + (GLfloat) 0.867101, (GLfloat) 0.054428, (GLfloat) 0.495149, + (GLfloat) - 0.329624, (GLfloat) 0.568782, (GLfloat) - 0.753548, + (GLfloat) - 0.303532, (GLfloat) 0.584080, (GLfloat) - 0.752808, + (GLfloat) - 0.337233, (GLfloat) 0.584915, (GLfloat) - 0.737664, + (GLfloat) - 0.311968, (GLfloat) 0.599454, (GLfloat) - 0.737110, + (GLfloat) - 0.032356, (GLfloat) 0.486520, (GLfloat) - 0.873070, + (GLfloat) - 0.057628, (GLfloat) 0.467531, (GLfloat) - 0.882096, + (GLfloat) - 0.019804, (GLfloat) 0.465587, (GLfloat) - 0.884780, + (GLfloat) - 0.045819, (GLfloat) 0.445898, (GLfloat) - 0.893910, + (GLfloat) - 0.451403, (GLfloat) 0.351833, (GLfloat) - 0.820029, + (GLfloat) - 0.442643, (GLfloat) 0.360683, (GLfloat) - 0.820960, + (GLfloat) - 0.125959, (GLfloat) 0.231940, (GLfloat) - 0.964540, + (GLfloat) - 0.133424, (GLfloat) 0.223158, (GLfloat) - 0.965608, + (GLfloat) - 0.071940, (GLfloat) 0.416419, (GLfloat) - 0.906322, + (GLfloat) - 0.089763, (GLfloat) 0.400364, (GLfloat) - 0.911949, + (GLfloat) - 0.381140, (GLfloat) 0.522054, (GLfloat) - 0.763015, + (GLfloat) - 0.362693, (GLfloat) 0.535129, (GLfloat) - 0.762949, + (GLfloat) 0.514033, (GLfloat) - 0.052564, (GLfloat) - 0.856158, + (GLfloat) 0.512829, (GLfloat) - 0.054517, (GLfloat) - 0.856758, + (GLfloat) 0.539192, (GLfloat) 0.146366, (GLfloat) - 0.829367, + (GLfloat) 0.531981, (GLfloat) 0.133703, (GLfloat) - 0.836133, + (GLfloat) 0.204167, (GLfloat) 0.278037, (GLfloat) - 0.938622, + (GLfloat) 0.217587, (GLfloat) 0.294489, (GLfloat) - 0.930555, + (GLfloat) 0.177512, (GLfloat) 0.093824, (GLfloat) - 0.979636, + (GLfloat) 0.182065, (GLfloat) 0.100184, (GLfloat) - 0.978170, + (GLfloat) 0.561737, (GLfloat) 0.205535, (GLfloat) - 0.801378, + (GLfloat) 0.550517, (GLfloat) 0.186829, (GLfloat) - 0.813650, + (GLfloat) 0.237090, (GLfloat) 0.326380, (GLfloat) - 0.915022, + (GLfloat) 0.257400, (GLfloat) 0.348104, (GLfloat) - 0.901426, + (GLfloat) 0.225204, (GLfloat) 0.351522, (GLfloat) - 0.908689, + (GLfloat) 0.244915, (GLfloat) 0.372788, (GLfloat) - 0.895012, + (GLfloat) 0.553162, (GLfloat) 0.233132, (GLfloat) - 0.799789, + (GLfloat) 0.542289, (GLfloat) 0.214487, (GLfloat) - 0.812354, + (GLfloat) - 0.303532, (GLfloat) 0.584080, (GLfloat) 0.752808, + (GLfloat) - 0.329624, (GLfloat) 0.568782, (GLfloat) 0.753548, + (GLfloat) - 0.019804, (GLfloat) 0.465588, (GLfloat) 0.884780, + (GLfloat) - 0.045820, (GLfloat) 0.445898, (GLfloat) 0.893910, + (GLfloat) - 0.057628, (GLfloat) 0.467531, (GLfloat) 0.882096, + (GLfloat) - 0.032356, (GLfloat) 0.486520, (GLfloat) 0.873070, + (GLfloat) - 0.337233, (GLfloat) 0.584915, (GLfloat) 0.737664, + (GLfloat) - 0.311968, (GLfloat) 0.599453, (GLfloat) 0.737110, + (GLfloat) 0.561737, (GLfloat) 0.205535, (GLfloat) 0.801378, + (GLfloat) 0.550517, (GLfloat) 0.186829, (GLfloat) 0.813650, + (GLfloat) 0.542289, (GLfloat) 0.214487, (GLfloat) 0.812354, + (GLfloat) 0.553162, (GLfloat) 0.233132, (GLfloat) 0.799789, + (GLfloat) 0.225204, (GLfloat) 0.351522, (GLfloat) 0.908689, + (GLfloat) 0.244915, (GLfloat) 0.372788, (GLfloat) 0.895012, + (GLfloat) 0.257400, (GLfloat) 0.348104, (GLfloat) 0.901426, + (GLfloat) 0.237091, (GLfloat) 0.326380, (GLfloat) 0.915021, + (GLfloat) 0.512829, (GLfloat) - 0.054517, (GLfloat) 0.856758, + (GLfloat) 0.514033, (GLfloat) - 0.052564, (GLfloat) 0.856158, + (GLfloat) 0.177512, (GLfloat) 0.093824, (GLfloat) 0.979636, + (GLfloat) 0.182065, (GLfloat) 0.100184, (GLfloat) 0.978170, + (GLfloat) 0.217587, (GLfloat) 0.294488, (GLfloat) 0.930555, + (GLfloat) 0.204167, (GLfloat) 0.278037, (GLfloat) 0.938622, + (GLfloat) 0.539192, (GLfloat) 0.146365, (GLfloat) 0.829367, + (GLfloat) 0.531981, (GLfloat) 0.133703, (GLfloat) 0.836133, + (GLfloat) - 0.451403, (GLfloat) 0.351833, (GLfloat) 0.820029, + (GLfloat) - 0.442643, (GLfloat) 0.360683, (GLfloat) 0.820960, + (GLfloat) - 0.362693, (GLfloat) 0.535129, (GLfloat) 0.762949, + (GLfloat) - 0.381140, (GLfloat) 0.522054, (GLfloat) 0.763015, + (GLfloat) - 0.071940, (GLfloat) 0.416419, (GLfloat) 0.906322, + (GLfloat) - 0.089763, (GLfloat) 0.400364, (GLfloat) 0.911949, + (GLfloat) - 0.133424, (GLfloat) 0.223158, (GLfloat) 0.965608, + (GLfloat) - 0.125959, (GLfloat) 0.231940, (GLfloat) 0.964540, + (GLfloat) - 0.574082, (GLfloat) 0.688221, (GLfloat) - 0.443601, + (GLfloat) - 0.590248, (GLfloat) 0.678175, (GLfloat) - 0.437821, + (GLfloat) - 0.687359, (GLfloat) 0.712967, (GLfloat) - 0.138621, + (GLfloat) - 0.682813, (GLfloat) 0.716686, (GLfloat) - 0.141874, + (GLfloat) - 0.682597, (GLfloat) 0.718360, (GLfloat) - 0.134243, + (GLfloat) - 0.678253, (GLfloat) 0.721849, (GLfloat) - 0.137502, + (GLfloat) - 0.574037, (GLfloat) 0.696240, (GLfloat) - 0.430966, + (GLfloat) - 0.589571, (GLfloat) 0.686777, (GLfloat) - 0.425139, + (GLfloat) - 0.574082, (GLfloat) 0.688221, (GLfloat) 0.443601, + (GLfloat) - 0.590248, (GLfloat) 0.678175, (GLfloat) 0.437821, + (GLfloat) - 0.589571, (GLfloat) 0.686777, (GLfloat) 0.425139, + (GLfloat) - 0.574037, (GLfloat) 0.696240, (GLfloat) 0.430966, + (GLfloat) - 0.682597, (GLfloat) 0.718360, (GLfloat) 0.134243, + (GLfloat) - 0.678253, (GLfloat) 0.721849, (GLfloat) 0.137502, + (GLfloat) - 0.682813, (GLfloat) 0.716686, (GLfloat) 0.141874, + (GLfloat) - 0.687359, (GLfloat) 0.712967, (GLfloat) 0.138621, + (GLfloat) - 0.741041, (GLfloat) 0.473108, (GLfloat) 0.476473, + (GLfloat) - 0.742406, (GLfloat) 0.464975, (GLfloat) 0.482319, + (GLfloat) - 0.850293, (GLfloat) 0.503676, (GLfloat) 0.152681, + (GLfloat) - 0.849127, (GLfloat) 0.506180, (GLfloat) 0.150879, + (GLfloat) - 0.738717, (GLfloat) 0.659007, (GLfloat) 0.141447, + (GLfloat) - 0.736283, (GLfloat) 0.662408, (GLfloat) 0.138214, + (GLfloat) - 0.631960, (GLfloat) 0.635245, (GLfloat) 0.443948, + (GLfloat) - 0.643540, (GLfloat) 0.626686, (GLfloat) 0.439455, + (GLfloat) - 0.741041, (GLfloat) 0.473108, (GLfloat) - 0.476473, + (GLfloat) - 0.742406, (GLfloat) 0.464975, (GLfloat) - 0.482319, + (GLfloat) - 0.631960, (GLfloat) 0.635245, (GLfloat) - 0.443948, + (GLfloat) - 0.643541, (GLfloat) 0.626686, (GLfloat) - 0.439455, + (GLfloat) - 0.738717, (GLfloat) 0.659007, (GLfloat) - 0.141447, + (GLfloat) - 0.736283, (GLfloat) 0.662408, (GLfloat) - 0.138214, + (GLfloat) - 0.849127, (GLfloat) 0.506180, (GLfloat) - 0.150879, + (GLfloat) - 0.850293, (GLfloat) 0.503676, (GLfloat) - 0.152681, + (GLfloat) - 0.489320, (GLfloat) - 0.355167, (GLfloat) - 0.796506, + (GLfloat) - 0.498398, (GLfloat) - 0.341072, (GLfloat) - 0.797038, + (GLfloat) - 0.172289, (GLfloat) - 0.401583, (GLfloat) - 0.899471, + (GLfloat) - 0.163102, (GLfloat) - 0.385135, (GLfloat) - 0.908333, + (GLfloat) - 0.182727, (GLfloat) - 0.410657, (GLfloat) - 0.893293, + (GLfloat) - 0.172422, (GLfloat) - 0.394484, (GLfloat) - 0.902581, + (GLfloat) - 0.506086, (GLfloat) - 0.336560, (GLfloat) - 0.794106, + (GLfloat) - 0.496896, (GLfloat) - 0.351037, (GLfloat) - 0.793642, + (GLfloat) 0.421643, (GLfloat) - 0.514114, (GLfloat) - 0.746930, + (GLfloat) 0.435781, (GLfloat) - 0.498195, (GLfloat) - 0.749598, + (GLfloat) 0.399104, (GLfloat) - 0.548391, (GLfloat) - 0.734836, + (GLfloat) 0.414969, (GLfloat) - 0.532774, (GLfloat) - 0.737532, + (GLfloat) 0.122126, (GLfloat) - 0.459168, (GLfloat) - 0.879915, + (GLfloat) 0.107835, (GLfloat) - 0.476533, (GLfloat) - 0.872518, + (GLfloat) 0.135473, (GLfloat) - 0.437168, (GLfloat) - 0.889118, + (GLfloat) 0.122726, (GLfloat) - 0.454818, (GLfloat) - 0.882088, + (GLfloat) 0.451859, (GLfloat) - 0.350279, (GLfloat) - 0.820444, + (GLfloat) 0.459996, (GLfloat) - 0.340221, (GLfloat) - 0.820154, + (GLfloat) 0.139327, (GLfloat) - 0.217141, (GLfloat) - 0.966146, + (GLfloat) 0.132987, (GLfloat) - 0.225779, (GLfloat) - 0.965059, + (GLfloat) 0.121571, (GLfloat) - 0.389814, (GLfloat) - 0.912834, + (GLfloat) 0.109716, (GLfloat) - 0.404550, (GLfloat) - 0.907910, + (GLfloat) 0.409974, (GLfloat) - 0.496912, (GLfloat) - 0.764852, + (GLfloat) 0.423414, (GLfloat) - 0.483036, (GLfloat) - 0.766418, + (GLfloat) - 0.517051, (GLfloat) 0.005478, (GLfloat) - 0.855937, + (GLfloat) - 0.518557, (GLfloat) 0.003075, (GLfloat) - 0.855038, + (GLfloat) - 0.515705, (GLfloat) - 0.236965, (GLfloat) - 0.823344, + (GLfloat) - 0.521517, (GLfloat) - 0.225403, (GLfloat) - 0.822930, + (GLfloat) - 0.189726, (GLfloat) - 0.318770, (GLfloat) - 0.928649, + (GLfloat) - 0.181223, (GLfloat) - 0.305795, (GLfloat) - 0.934691, + (GLfloat) - 0.179422, (GLfloat) - 0.111097, (GLfloat) - 0.977479, + (GLfloat) - 0.175584, (GLfloat) - 0.105473, (GLfloat) - 0.978798, + (GLfloat) - 0.822110, (GLfloat) - 0.303411, (GLfloat) - 0.481743, + (GLfloat) - 0.821692, (GLfloat) - 0.296307, (GLfloat) - 0.486851, + (GLfloat) - 0.829019, (GLfloat) - 0.285105, (GLfloat) - 0.481086, + (GLfloat) - 0.828324, (GLfloat) - 0.278227, (GLfloat) - 0.486280, + (GLfloat) - 0.955809, (GLfloat) - 0.248857, (GLfloat) - 0.156521, + (GLfloat) - 0.955462, (GLfloat) - 0.251102, (GLfloat) - 0.155051, + (GLfloat) - 0.949299, (GLfloat) - 0.272604, (GLfloat) - 0.156583, + (GLfloat) - 0.948870, (GLfloat) - 0.274919, (GLfloat) - 0.155132, + (GLfloat) - 0.850734, (GLfloat) 0.112614, (GLfloat) - 0.513391, + (GLfloat) - 0.850654, (GLfloat) 0.112793, (GLfloat) - 0.513484, + (GLfloat) - 0.974222, (GLfloat) 0.155109, (GLfloat) - 0.163808, + (GLfloat) - 0.974191, (GLfloat) 0.155230, (GLfloat) - 0.163874, + (GLfloat) - 0.980876, (GLfloat) - 0.109137, (GLfloat) - 0.161159, + (GLfloat) - 0.980855, (GLfloat) - 0.110647, (GLfloat) - 0.160255, + (GLfloat) - 0.853630, (GLfloat) - 0.150462, (GLfloat) - 0.498675, + (GLfloat) - 0.852599, (GLfloat) - 0.145646, (GLfloat) - 0.501859, + (GLfloat) - 0.850734, (GLfloat) 0.112614, (GLfloat) 0.513391, + (GLfloat) - 0.850654, (GLfloat) 0.112793, (GLfloat) 0.513484, + (GLfloat) - 0.852599, (GLfloat) - 0.145647, (GLfloat) 0.501859, + (GLfloat) - 0.853630, (GLfloat) - 0.150462, (GLfloat) 0.498676, + (GLfloat) - 0.980876, (GLfloat) - 0.109137, (GLfloat) 0.161159, + (GLfloat) - 0.980855, (GLfloat) - 0.110647, (GLfloat) 0.160255, + (GLfloat) - 0.974191, (GLfloat) 0.155230, (GLfloat) 0.163874, + (GLfloat) - 0.974222, (GLfloat) 0.155109, (GLfloat) 0.163808, + (GLfloat) - 0.821692, (GLfloat) - 0.296307, (GLfloat) 0.486851, + (GLfloat) - 0.822110, (GLfloat) - 0.303411, (GLfloat) 0.481743, + (GLfloat) - 0.949299, (GLfloat) - 0.272604, (GLfloat) 0.156583, + (GLfloat) - 0.948870, (GLfloat) - 0.274919, (GLfloat) 0.155132, + (GLfloat) - 0.955462, (GLfloat) - 0.251102, (GLfloat) 0.155051, + (GLfloat) - 0.955809, (GLfloat) - 0.248857, (GLfloat) 0.156520, + (GLfloat) - 0.829019, (GLfloat) - 0.285105, (GLfloat) 0.481086, + (GLfloat) - 0.828324, (GLfloat) - 0.278227, (GLfloat) 0.486280, + (GLfloat) - 0.498398, (GLfloat) - 0.341071, (GLfloat) 0.797038, + (GLfloat) - 0.489320, (GLfloat) - 0.355167, (GLfloat) 0.796507, + (GLfloat) - 0.506086, (GLfloat) - 0.336560, (GLfloat) 0.794106, + (GLfloat) - 0.496896, (GLfloat) - 0.351037, (GLfloat) 0.793642, + (GLfloat) - 0.182728, (GLfloat) - 0.410657, (GLfloat) 0.893293, + (GLfloat) - 0.172423, (GLfloat) - 0.394484, (GLfloat) 0.902581, + (GLfloat) - 0.163101, (GLfloat) - 0.385135, (GLfloat) 0.908333, + (GLfloat) - 0.172289, (GLfloat) - 0.401584, (GLfloat) 0.899470, + (GLfloat) - 0.518557, (GLfloat) 0.003076, (GLfloat) 0.855038, + (GLfloat) - 0.517051, (GLfloat) 0.005478, (GLfloat) 0.855937, + (GLfloat) - 0.179422, (GLfloat) - 0.111097, (GLfloat) 0.977479, + (GLfloat) - 0.175584, (GLfloat) - 0.105473, (GLfloat) 0.978798, + (GLfloat) - 0.181223, (GLfloat) - 0.305795, (GLfloat) 0.934691, + (GLfloat) - 0.189727, (GLfloat) - 0.318770, (GLfloat) 0.928649, + (GLfloat) - 0.521517, (GLfloat) - 0.225402, (GLfloat) 0.822930, + (GLfloat) - 0.515705, (GLfloat) - 0.236965, (GLfloat) 0.823344, + (GLfloat) 0.451859, (GLfloat) - 0.350279, (GLfloat) 0.820444, + (GLfloat) 0.459996, (GLfloat) - 0.340221, (GLfloat) 0.820154, + (GLfloat) 0.423414, (GLfloat) - 0.483036, (GLfloat) 0.766418, + (GLfloat) 0.409975, (GLfloat) - 0.496912, (GLfloat) 0.764853, + (GLfloat) 0.121571, (GLfloat) - 0.389814, (GLfloat) 0.912834, + (GLfloat) 0.109716, (GLfloat) - 0.404550, (GLfloat) 0.907911, + (GLfloat) 0.132987, (GLfloat) - 0.225779, (GLfloat) 0.965059, + (GLfloat) 0.139327, (GLfloat) - 0.217140, (GLfloat) 0.966146, + (GLfloat) 0.435780, (GLfloat) - 0.498195, (GLfloat) 0.749598, + (GLfloat) 0.421643, (GLfloat) - 0.514113, (GLfloat) 0.746930, + (GLfloat) 0.135473, (GLfloat) - 0.437169, (GLfloat) 0.889118, + (GLfloat) 0.122726, (GLfloat) - 0.454818, (GLfloat) 0.882088, + (GLfloat) 0.107835, (GLfloat) - 0.476534, (GLfloat) 0.872518, + (GLfloat) 0.122126, (GLfloat) - 0.459168, (GLfloat) 0.879915, + (GLfloat) 0.399104, (GLfloat) - 0.548391, (GLfloat) 0.734836, + (GLfloat) 0.414969, (GLfloat) - 0.532773, (GLfloat) 0.737532, + (GLfloat) 0.709825, (GLfloat) - 0.548164, (GLfloat) 0.442339, + (GLfloat) 0.706858, (GLfloat) - 0.559116, (GLfloat) 0.433291, + (GLfloat) 0.678133, (GLfloat) - 0.593660, (GLfloat) 0.433248, + (GLfloat) 0.674632, (GLfloat) - 0.604835, (GLfloat) 0.423140, + (GLfloat) 0.774649, (GLfloat) - 0.617973, (GLfloat) 0.134272, + (GLfloat) 0.777074, (GLfloat) - 0.614312, (GLfloat) 0.137026, + (GLfloat) 0.811265, (GLfloat) - 0.568214, (GLfloat) 0.137773, + (GLfloat) 0.813383, (GLfloat) - 0.564575, (GLfloat) 0.140223, + (GLfloat) 0.750611, (GLfloat) - 0.453426, (GLfloat) 0.480612, + (GLfloat) 0.748687, (GLfloat) - 0.462619, (GLfloat) 0.474817, + (GLfloat) 0.853444, (GLfloat) - 0.499176, (GLfloat) 0.149855, + (GLfloat) 0.854917, (GLfloat) - 0.496116, (GLfloat) 0.151614, + (GLfloat) 0.791852, (GLfloat) - 0.594634, (GLfloat) 0.139213, + (GLfloat) 0.794008, (GLfloat) - 0.591177, (GLfloat) 0.141637, + (GLfloat) 0.694144, (GLfloat) - 0.562907, (GLfloat) 0.448664, + (GLfloat) 0.690998, (GLfloat) - 0.573547, (GLfloat) 0.439961, + (GLfloat) 0.750611, (GLfloat) - 0.453426, (GLfloat) - 0.480612, + (GLfloat) 0.748687, (GLfloat) - 0.462620, (GLfloat) - 0.474817, + (GLfloat) 0.690999, (GLfloat) - 0.573546, (GLfloat) - 0.439961, + (GLfloat) 0.694144, (GLfloat) - 0.562907, (GLfloat) - 0.448664, + (GLfloat) 0.791852, (GLfloat) - 0.594634, (GLfloat) - 0.139213, + (GLfloat) 0.794008, (GLfloat) - 0.591177, (GLfloat) - 0.141637, + (GLfloat) 0.854917, (GLfloat) - 0.496116, (GLfloat) - 0.151614, + (GLfloat) 0.853444, (GLfloat) - 0.499176, (GLfloat) - 0.149855, + (GLfloat) 0.706858, (GLfloat) - 0.559116, (GLfloat) - 0.433291, + (GLfloat) 0.709825, (GLfloat) - 0.548164, (GLfloat) - 0.442339, + (GLfloat) 0.811265, (GLfloat) - 0.568214, (GLfloat) - 0.137773, + (GLfloat) 0.813383, (GLfloat) - 0.564575, (GLfloat) - 0.140223, + (GLfloat) 0.777074, (GLfloat) - 0.614312, (GLfloat) - 0.137026, + (GLfloat) 0.774649, (GLfloat) - 0.617973, (GLfloat) - 0.134272, + (GLfloat) 0.678133, (GLfloat) - 0.593660, (GLfloat) - 0.433248, + (GLfloat) 0.674631, (GLfloat) - 0.604835, (GLfloat) - 0.423139, + (GLfloat) 0.805725, (GLfloat) - 0.334902, (GLfloat) 0.488515, + (GLfloat) 0.805089, (GLfloat) - 0.341176, (GLfloat) 0.485212, + (GLfloat) 0.923877, (GLfloat) - 0.350079, (GLfloat) 0.154583, + (GLfloat) 0.924516, (GLfloat) - 0.347968, (GLfloat) 0.155526, + (GLfloat) 0.927012, (GLfloat) - 0.340158, (GLfloat) 0.157929, + (GLfloat) 0.924342, (GLfloat) - 0.348817, (GLfloat) 0.154657, + (GLfloat) 0.800744, (GLfloat) - 0.354688, (GLfloat) 0.482707, + (GLfloat) 0.801658, (GLfloat) - 0.348585, (GLfloat) 0.485626, + (GLfloat) 0.805725, (GLfloat) - 0.334902, (GLfloat) - 0.488516, + (GLfloat) 0.805089, (GLfloat) - 0.341176, (GLfloat) - 0.485212, + (GLfloat) 0.801658, (GLfloat) - 0.348585, (GLfloat) - 0.485626, + (GLfloat) 0.800744, (GLfloat) - 0.354688, (GLfloat) - 0.482707, + (GLfloat) 0.927012, (GLfloat) - 0.340158, (GLfloat) - 0.157929, + (GLfloat) 0.924342, (GLfloat) - 0.348818, (GLfloat) - 0.154657, + (GLfloat) 0.924516, (GLfloat) - 0.347968, (GLfloat) - 0.155526, + (GLfloat) 0.923877, (GLfloat) - 0.350079, (GLfloat) - 0.154583, + (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073162, + (GLfloat) 0.681274, (GLfloat) - 0.722487, (GLfloat) - 0.117805, + (GLfloat) 0.706887, (GLfloat) - 0.694350, (GLfloat) - 0.134864, + (GLfloat) 0.560017, (GLfloat) - 0.754527, (GLfloat) - 0.342154, + (GLfloat) 0.577334, (GLfloat) - 0.729313, (GLfloat) - 0.367135, + (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092, + (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) 0.560017, (GLfloat) - 0.754527, (GLfloat) 0.342155, + (GLfloat) 0.577334, (GLfloat) - 0.729313, (GLfloat) 0.367135, + (GLfloat) 0.706888, (GLfloat) - 0.694350, (GLfloat) 0.134864, + (GLfloat) 0.681274, (GLfloat) - 0.722487, (GLfloat) 0.117805, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) 0.484153, (GLfloat) - 0.303994, (GLfloat) - 0.820478, + (GLfloat) 0.489225, (GLfloat) - 0.294821, (GLfloat) - 0.820816, + (GLfloat) 0.156385, (GLfloat) - 0.248336, (GLfloat) - 0.955967, + (GLfloat) 0.151648, (GLfloat) - 0.258100, (GLfloat) - 0.954142, + (GLfloat) 0.160268, (GLfloat) - 0.275037, (GLfloat) - 0.947981, + (GLfloat) 0.153877, (GLfloat) - 0.291476, (GLfloat) - 0.944120, + (GLfloat) 0.481923, (GLfloat) - 0.335378, (GLfloat) - 0.809489, + (GLfloat) 0.489881, (GLfloat) - 0.318876, (GLfloat) - 0.811378, + (GLfloat) - 0.511124, (GLfloat) - 0.173861, (GLfloat) - 0.841739, + (GLfloat) - 0.507919, (GLfloat) - 0.180984, (GLfloat) - 0.842177, + (GLfloat) - 0.502437, (GLfloat) - 0.243295, (GLfloat) - 0.829678, + (GLfloat) - 0.501146, (GLfloat) - 0.246358, (GLfloat) - 0.829554, + (GLfloat) - 0.162122, (GLfloat) - 0.255565, (GLfloat) - 0.953102, + (GLfloat) - 0.162682, (GLfloat) - 0.257426, (GLfloat) - 0.952505, + (GLfloat) - 0.167026, (GLfloat) - 0.217710, (GLfloat) - 0.961616, + (GLfloat) - 0.163395, (GLfloat) - 0.208930, (GLfloat) - 0.964184, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264055, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) - 0.124478, (GLfloat) - 0.692921, (GLfloat) - 0.710188, + (GLfloat) - 0.138779, (GLfloat) - 0.668059, (GLfloat) - 0.731052, + (GLfloat) - 0.361212, (GLfloat) - 0.721974, (GLfloat) - 0.590152, + (GLfloat) - 0.383785, (GLfloat) - 0.697396, (GLfloat) - 0.605267, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) 0.341480, (GLfloat) - 0.751054, (GLfloat) - 0.565075, + (GLfloat) 0.372366, (GLfloat) - 0.719604, (GLfloat) - 0.586101, + (GLfloat) 0.138114, (GLfloat) - 0.672674, (GLfloat) - 0.726935, + (GLfloat) 0.117913, (GLfloat) - 0.706722, (GLfloat) - 0.697597, + (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.850324, (GLfloat) - 0.141983, (GLfloat) - 0.506744, + (GLfloat) - 0.849870, (GLfloat) - 0.138328, (GLfloat) - 0.508515, + (GLfloat) - 0.979216, (GLfloat) - 0.120924, (GLfloat) - 0.162831, + (GLfloat) - 0.979161, (GLfloat) - 0.122085, (GLfloat) - 0.162295, + (GLfloat) - 0.968183, (GLfloat) - 0.188900, (GLfloat) - 0.164128, + (GLfloat) - 0.966893, (GLfloat) - 0.198288, (GLfloat) - 0.160620, + (GLfloat) - 0.836326, (GLfloat) - 0.225408, (GLfloat) - 0.499751, + (GLfloat) - 0.836389, (GLfloat) - 0.213159, (GLfloat) - 0.504991, + (GLfloat) - 0.850324, (GLfloat) - 0.141983, (GLfloat) 0.506744, + (GLfloat) - 0.849870, (GLfloat) - 0.138328, (GLfloat) 0.508515, + (GLfloat) - 0.836389, (GLfloat) - 0.213159, (GLfloat) 0.504991, + (GLfloat) - 0.836326, (GLfloat) - 0.225408, (GLfloat) 0.499751, + (GLfloat) - 0.968183, (GLfloat) - 0.188900, (GLfloat) 0.164128, + (GLfloat) - 0.966894, (GLfloat) - 0.198288, (GLfloat) 0.160620, + (GLfloat) - 0.979161, (GLfloat) - 0.122085, (GLfloat) 0.162295, + (GLfloat) - 0.979216, (GLfloat) - 0.120924, (GLfloat) 0.162831, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178091, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162, + (GLfloat) - 0.727074, (GLfloat) - 0.675149, (GLfloat) 0.124651, + (GLfloat) - 0.751597, (GLfloat) - 0.644138, (GLfloat) 0.142086, + (GLfloat) - 0.595577, (GLfloat) - 0.717790, (GLfloat) 0.360647, + (GLfloat) - 0.614268, (GLfloat) - 0.686473, (GLfloat) 0.389139, + (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) - 0.595576, (GLfloat) - 0.717790, (GLfloat) - 0.360646, + (GLfloat) - 0.614268, (GLfloat) - 0.686473, (GLfloat) - 0.389139, + (GLfloat) - 0.751597, (GLfloat) - 0.644138, (GLfloat) - 0.142087, + (GLfloat) - 0.727074, (GLfloat) - 0.675149, (GLfloat) - 0.124651, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) - 0.511124, (GLfloat) - 0.173862, (GLfloat) 0.841739, + (GLfloat) - 0.507920, (GLfloat) - 0.180984, (GLfloat) 0.842177, + (GLfloat) - 0.167026, (GLfloat) - 0.217709, (GLfloat) 0.961616, + (GLfloat) - 0.163395, (GLfloat) - 0.208930, (GLfloat) 0.964184, + (GLfloat) - 0.162682, (GLfloat) - 0.257426, (GLfloat) 0.952505, + (GLfloat) - 0.162122, (GLfloat) - 0.255564, (GLfloat) 0.953102, + (GLfloat) - 0.501146, (GLfloat) - 0.246358, (GLfloat) 0.829554, + (GLfloat) - 0.502437, (GLfloat) - 0.243295, (GLfloat) 0.829677, + (GLfloat) 0.484153, (GLfloat) - 0.303994, (GLfloat) 0.820478, + (GLfloat) 0.489225, (GLfloat) - 0.294820, (GLfloat) 0.820816, + (GLfloat) 0.489881, (GLfloat) - 0.318876, (GLfloat) 0.811378, + (GLfloat) 0.481923, (GLfloat) - 0.335378, (GLfloat) 0.809489, + (GLfloat) 0.160269, (GLfloat) - 0.275036, (GLfloat) 0.947982, + (GLfloat) 0.153877, (GLfloat) - 0.291476, (GLfloat) 0.944120, + (GLfloat) 0.151647, (GLfloat) - 0.258100, (GLfloat) 0.954142, + (GLfloat) 0.156385, (GLfloat) - 0.248335, (GLfloat) 0.955967, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.073163, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) 0.117913, (GLfloat) - 0.706722, (GLfloat) 0.697597, + (GLfloat) 0.138114, (GLfloat) - 0.672674, (GLfloat) 0.726935, + (GLfloat) 0.341480, (GLfloat) - 0.751053, (GLfloat) 0.565076, + (GLfloat) 0.372365, (GLfloat) - 0.719604, (GLfloat) 0.586101, + (GLfloat) - 0.178091, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620, + (GLfloat) - 0.361213, (GLfloat) - 0.721973, (GLfloat) 0.590152, + (GLfloat) - 0.383785, (GLfloat) - 0.697396, (GLfloat) 0.605267, + (GLfloat) - 0.138779, (GLfloat) - 0.668060, (GLfloat) 0.731052, + (GLfloat) - 0.124478, (GLfloat) - 0.692921, (GLfloat) 0.710188, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, +}; + +static unsigned short int s1_2_POLS[] = +{ + 3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1, + 3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1, + 3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1, + 3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, + 3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 24, 84, 83, 1, 3, 24, 83, 102, 1, + 3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1, + 3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 24, 102, 92, 1, 3, 24, 92, 93, 1, + 3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1, + 3, 104, 16, 116, 1, 3, 116, 103, 104, 1, 3, 35, 118, 103, 1, 3, 35, 103, 116, 1, + 3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 32, 104, 103, 1, 3, 32, 103, 119, 1, + 3, 125, 18, 121, 1, 3, 121, 117, 125, 1, 3, 36, 123, 117, 1, 3, 36, 117, 121, 1, + 3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 35, 125, 117, 1, 3, 35, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1, + 3, 128, 31, 123, 1, 3, 123, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1, + 3, 119, 31, 128, 1, 3, 128, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1, + 3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 28, 136, 81, 1, 3, 28, 81, 82, 1, +3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, + 3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1, + 3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 28, 95, 94, 1, 3, 28, 94, 136, 1, + 3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, + 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1, + 3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1, + 3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1, + 3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1, + 3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1, + 3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1, + 3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1, +3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1, + 3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1, + 3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1, + 3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1, + 3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1, + 3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1, + 3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1, + 3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1, + 3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1, + 3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1, + 3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1, + 3, 183, 10, 190, 1, 3, 190, 182, 183, 1, 3, 52, 191, 182, 1, 3, 52, 182, 190, 1, + 3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1, + 3, 193, 9, 170, 1, 3, 170, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1, + 3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 52, 193, 169, 1, 3, 52, 169, 191, 1, +3, 1, 196, 194, 1, 3, 1, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1, + 3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 199, 56, 201, 1, 3, 201, 194, 199, 1, +3, 3, 203, 197, 1, 3, 3, 197, 206, 1, 3, 203, 55, 204, 1, 3, 204, 197, 203, 1, + 3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1, + 3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1, + 3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 55, 208, 172, 1, 3, 55, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 56, 199, 166, 1, 3, 56, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, +3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1, + 3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1, + 3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1, + 3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 56, 209, 192, 1, 3, 56, 192, 210, 1, + 3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 57, 217, 189, 1, 3, 57, 189, 216, 1, + 3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1, +3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1, + 3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1, +3, 0, 221, 220, 1, 3, 0, 220, 226, 1, 3, 221, 57, 222, 1, 3, 222, 220, 221, 1, + 3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 57, 216, 184, 1, 3, 57, 184, 222, 1, + 3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 60, 229, 179, 1, 3, 60, 179, 228, 1, + 3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1, +3, 2, 231, 223, 1, 3, 2, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1, + 3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 229, 60, 233, 1, 3, 233, 223, 229, 1, +3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 233, 60, 234, 1, 3, 234, 232, 233, 1, + 3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1, + 3, 228, 11, 160, 1, 3, 160, 159, 228, 1, 3, 43, 238, 159, 1, 3, 43, 159, 160, 1, + 3, 238, 42, 234, 1, 3, 234, 159, 238, 1, 3, 60, 228, 159, 1, 3, 60, 159, 234, 1, + 3, 151, 8, 208, 1, 3, 208, 150, 151, 1, 3, 55, 239, 150, 1, 3, 55, 150, 208, 1, + 3, 239, 42, 238, 1, 3, 238, 150, 239, 1, 3, 43, 151, 150, 1, 3, 43, 150, 238, 1, +3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1, + 3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 239, 55, 203, 1, 3, 203, 202, 239, 1, + 3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1, + 3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1, + 3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1, + 3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, + 3, 246, 3, 206, 1, 3, 206, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1, + 3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1, + 3, 196, 1, 260, 1, 3, 260, 195, 196, 1, 3, 69, 262, 195, 1, 3, 69, 195, 260, 1, + 3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1, +3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, +3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1, + 3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 59, 269, 213, 1, 3, 59, 213, 214, 1, + 3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1, + 3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1, + 3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 59, 219, 218, 1, 3, 59, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1, + 3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, + 3, 271, 0, 226, 1, 3, 226, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1, + 3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 71, 271, 225, 1, 3, 71, 225, 281, 1, + 3, 231, 2, 245, 1, 3, 245, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1, + 3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1, +3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, +3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_2 = +{ + 290, /* number of points */ + s1_2_PNTS, s1_2_normals, s1_2_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_2.c */ diff --git a/hacks/glx/s1_3.c b/hacks/glx/s1_3.c new file mode 100644 index 00000000..53057ac8 --- /dev/null +++ b/hacks/glx/s1_3.c @@ -0,0 +1,1057 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_3.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_3" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_3_PNTS[] = +{ + (GLfloat) 0.386176, (GLfloat) 0.201223, (GLfloat) - 0.326853, + (GLfloat) 0.386176, (GLfloat) 0.201223, (GLfloat) - 0.673147, + (GLfloat) 0.704261, (GLfloat) 0.116939, (GLfloat) - 0.326853, + (GLfloat) 0.704261, (GLfloat) 0.116939, (GLfloat) - 0.673147, + (GLfloat) 0.642426, (GLfloat) 0.035438, (GLfloat) - 0.638667, + (GLfloat) 0.369306, (GLfloat) 0.083596, (GLfloat) - 0.638667, + (GLfloat) 0.369306, (GLfloat) 0.083596, (GLfloat) - 0.361333, + (GLfloat) 0.642426, (GLfloat) 0.035438, (GLfloat) - 0.361333, + (GLfloat) 0.845007, (GLfloat) 0.268518, (GLfloat) - 0.678159, + (GLfloat) 0.620074, (GLfloat) 0.472355, (GLfloat) - 0.678159, + (GLfloat) 0.620074, (GLfloat) 0.472355, (GLfloat) - 0.321841, + (GLfloat) 0.845007, (GLfloat) 0.268518, (GLfloat) - 0.321841, + (GLfloat) 1.115671, (GLfloat) 0.352342, (GLfloat) - 0.673147, + (GLfloat) 1.115671, (GLfloat) 0.352342, (GLfloat) - 0.326853, + (GLfloat) 1.204957, (GLfloat) 0.421449, (GLfloat) - 0.361333, + (GLfloat) 1.204957, (GLfloat) 0.421449, (GLfloat) - 0.638667, + (GLfloat) 0.937575, (GLfloat) 0.636550, (GLfloat) - 0.326853, + (GLfloat) 1.066291, (GLfloat) 0.661627, (GLfloat) - 0.361333, + (GLfloat) 0.937575, (GLfloat) 0.636550, (GLfloat) - 0.673147, + (GLfloat) 1.066291, (GLfloat) 0.661627, (GLfloat) - 0.638667, + (GLfloat) 1.227578, (GLfloat) 0.320768, (GLfloat) - 0.500000, + (GLfloat) 1.017091, (GLfloat) 0.274757, (GLfloat) - 0.500000, + (GLfloat) 1.148052, (GLfloat) 0.300668, (GLfloat) - 0.500000, + (GLfloat) 1.107591, (GLfloat) 0.526937, (GLfloat) - 0.260702, + (GLfloat) 1.194861, (GLfloat) 0.375780, (GLfloat) - 0.324904, + (GLfloat) 1.151611, (GLfloat) 0.550768, (GLfloat) - 0.500000, + (GLfloat) 1.230206, (GLfloat) 0.391113, (GLfloat) - 0.500000, + (GLfloat) 1.107591, (GLfloat) 0.526937, (GLfloat) - 0.739298, + (GLfloat) 1.194861, (GLfloat) 0.375780, (GLfloat) - 0.675096, + (GLfloat) 0.885754, (GLfloat) 0.445570, (GLfloat) - 0.261655, + (GLfloat) 1.026623, (GLfloat) 0.494446, (GLfloat) - 0.263891, + (GLfloat) 0.987605, (GLfloat) 0.733106, (GLfloat) - 0.500000, + (GLfloat) 1.019270, (GLfloat) 0.677486, (GLfloat) - 0.324904, + (GLfloat) 1.141425, (GLfloat) 0.544887, (GLfloat) - 0.322437, + (GLfloat) 0.754416, (GLfloat) 0.616383, (GLfloat) - 0.500000, + (GLfloat) 0.905194, (GLfloat) 0.688224, (GLfloat) - 0.500000, + (GLfloat) 1.019270, (GLfloat) 0.677486, (GLfloat) - 0.675096, + (GLfloat) 1.052644, (GLfloat) 0.698661, (GLfloat) - 0.500000, + (GLfloat) 0.885754, (GLfloat) 0.445570, (GLfloat) - 0.738345, + (GLfloat) 1.026623, (GLfloat) 0.494446, (GLfloat) - 0.736109, + (GLfloat) 1.141425, (GLfloat) 0.544887, (GLfloat) - 0.677562, + (GLfloat) 0.982068, (GLfloat) 0.320307, (GLfloat) - 0.674787, + (GLfloat) 0.801608, (GLfloat) 0.169177, (GLfloat) - 0.500000, + (GLfloat) 0.885904, (GLfloat) 0.231457, (GLfloat) - 0.500000, + (GLfloat) 0.982068, (GLfloat) 0.320307, (GLfloat) - 0.325213, + (GLfloat) 0.789439, (GLfloat) 0.570833, (GLfloat) - 0.674787, + (GLfloat) 0.617093, (GLfloat) 0.264045, (GLfloat) - 0.738345, + (GLfloat) 0.732540, (GLfloat) 0.370437, (GLfloat) - 0.742944, + (GLfloat) 0.617093, (GLfloat) 0.264045, (GLfloat) - 0.261655, + (GLfloat) 0.732540, (GLfloat) 0.370437, (GLfloat) - 0.257056, + (GLfloat) 0.789439, (GLfloat) 0.570833, (GLfloat) - 0.325213, + (GLfloat) 0.432577, (GLfloat) 0.358913, (GLfloat) - 0.500000, + (GLfloat) 0.579177, (GLfloat) 0.509417, (GLfloat) - 0.500000, + (GLfloat) 0.513237, (GLfloat) 0.088956, (GLfloat) - 0.739298, + (GLfloat) 0.545218, (GLfloat) 0.159081, (GLfloat) - 0.736109, + (GLfloat) 0.752404, (GLfloat) 0.194475, (GLfloat) - 0.674787, + (GLfloat) 0.481782, (GLfloat) 0.333615, (GLfloat) - 0.674787, + (GLfloat) 0.481782, (GLfloat) 0.333615, (GLfloat) - 0.325213, + (GLfloat) 0.279139, (GLfloat) 0.132156, (GLfloat) - 0.500000, + (GLfloat) 0.328343, (GLfloat) 0.216547, (GLfloat) - 0.500000, + (GLfloat) 0.752404, (GLfloat) 0.194475, (GLfloat) - 0.325213, + (GLfloat) 0.513237, (GLfloat) 0.088956, (GLfloat) - 0.260702, + (GLfloat) 0.545218, (GLfloat) 0.159081, (GLfloat) - 0.263891, + (GLfloat) 0.747335, (GLfloat) 0.045755, (GLfloat) - 0.500000, + (GLfloat) 0.762094, (GLfloat) 0.101615, (GLfloat) - 0.500000, + (GLfloat) 0.684631, (GLfloat) 0.057942, (GLfloat) - 0.675096, + (GLfloat) 0.502661, (GLfloat) 0.041337, (GLfloat) - 0.500000, + (GLfloat) 0.679568, (GLfloat) 0.022087, (GLfloat) - 0.500000, + (GLfloat) 0.684631, (GLfloat) 0.057942, (GLfloat) - 0.324904, + (GLfloat) 0.342054, (GLfloat) 0.121167, (GLfloat) - 0.675096, + (GLfloat) 0.504703, (GLfloat) 0.052920, (GLfloat) - 0.677562, + (GLfloat) 0.342054, (GLfloat) 0.121167, (GLfloat) - 0.324904, + (GLfloat) 0.329838, (GLfloat) 0.083754, (GLfloat) - 0.500000, + (GLfloat) 0.504703, (GLfloat) 0.052920, (GLfloat) - 0.322437, + (GLfloat) 1.188046, (GLfloat) 0.322006, (GLfloat) - 0.596277, + (GLfloat) 1.077742, (GLfloat) 0.301825, (GLfloat) - 0.594388, + (GLfloat) 1.139957, (GLfloat) 0.313586, (GLfloat) - 0.594444, + (GLfloat) 1.188046, (GLfloat) 0.322006, (GLfloat) - 0.403722, + (GLfloat) 1.196159, (GLfloat) 0.308395, (GLfloat) - 0.500000, + (GLfloat) 1.230706, (GLfloat) 0.358565, (GLfloat) - 0.587500, + (GLfloat) 1.219224, (GLfloat) 0.334520, (GLfloat) - 0.595444, + (GLfloat) 1.123141, (GLfloat) 0.430895, (GLfloat) - 0.724648, + (GLfloat) 1.163707, (GLfloat) 0.362839, (GLfloat) - 0.676509, + (GLfloat) 1.123141, (GLfloat) 0.430895, (GLfloat) - 0.275352, + (GLfloat) 1.163707, (GLfloat) 0.362839, (GLfloat) - 0.323491, + (GLfloat) 1.230706, (GLfloat) 0.358565, (GLfloat) - 0.412500, + (GLfloat) 1.219224, (GLfloat) 0.334520, (GLfloat) - 0.404556, + (GLfloat) 1.077742, (GLfloat) 0.301825, (GLfloat) - 0.405612, + (GLfloat) 1.139957, (GLfloat) 0.313586, (GLfloat) - 0.405556, + (GLfloat) 1.191900, (GLfloat) 0.469528, (GLfloat) - 0.409500, + (GLfloat) 1.221821, (GLfloat) 0.401211, (GLfloat) - 0.417500, + (GLfloat) 1.239508, (GLfloat) 0.345749, (GLfloat) - 0.500000, + (GLfloat) 1.171456, (GLfloat) 0.461189, (GLfloat) - 0.294000, + (GLfloat) 1.207091, (GLfloat) 0.397037, (GLfloat) - 0.339125, + (GLfloat) 1.171456, (GLfloat) 0.461189, (GLfloat) - 0.706000, + (GLfloat) 1.207091, (GLfloat) 0.397037, (GLfloat) - 0.660875, + (GLfloat) 1.191900, (GLfloat) 0.469528, (GLfloat) - 0.590500, + (GLfloat) 1.221821, (GLfloat) 0.401211, (GLfloat) - 0.582500, + (GLfloat) 1.011218, (GLfloat) 0.399402, (GLfloat) - 0.279763, + (GLfloat) 1.075195, (GLfloat) 0.416935, (GLfloat) - 0.279631, + (GLfloat) 1.025784, (GLfloat) 0.594229, (GLfloat) - 0.275352, + (GLfloat) 1.074463, (GLfloat) 0.512562, (GLfloat) - 0.259306, + (GLfloat) 1.155185, (GLfloat) 0.444556, (GLfloat) - 0.276838, + (GLfloat) 0.960879, (GLfloat) 0.703118, (GLfloat) - 0.403722, + (GLfloat) 0.985218, (GLfloat) 0.662285, (GLfloat) - 0.323491, + (GLfloat) 1.083956, (GLfloat) 0.612743, (GLfloat) - 0.294000, + (GLfloat) 1.059471, (GLfloat) 0.609015, (GLfloat) - 0.276838, + (GLfloat) 0.911431, (GLfloat) 0.545768, (GLfloat) - 0.279763, + (GLfloat) 0.978052, (GLfloat) 0.571957, (GLfloat) - 0.279631, + (GLfloat) 1.101400, (GLfloat) 0.626279, (GLfloat) - 0.409500, + (GLfloat) 1.098258, (GLfloat) 0.615227, (GLfloat) - 0.335375, + (GLfloat) 1.128758, (GLfloat) 0.537574, (GLfloat) - 0.278500, + (GLfloat) 1.024706, (GLfloat) 0.715367, (GLfloat) - 0.412500, + (GLfloat) 1.046216, (GLfloat) 0.675680, (GLfloat) - 0.339125, + (GLfloat) 1.180758, (GLfloat) 0.472333, (GLfloat) - 0.335375, + (GLfloat) 0.844907, (GLfloat) 0.643346, (GLfloat) - 0.405612, + (GLfloat) 0.913289, (GLfloat) 0.675305, (GLfloat) - 0.405556, + (GLfloat) 0.960879, (GLfloat) 0.703118, (GLfloat) - 0.596277, + (GLfloat) 0.952766, (GLfloat) 0.716730, (GLfloat) - 0.500000, + (GLfloat) 0.995432, (GLfloat) 0.719051, (GLfloat) - 0.404556, + (GLfloat) 1.025784, (GLfloat) 0.594229, (GLfloat) - 0.724648, + (GLfloat) 0.985218, (GLfloat) 0.662285, (GLfloat) - 0.676509, + (GLfloat) 1.024706, (GLfloat) 0.715367, (GLfloat) - 0.587500, + (GLfloat) 0.995432, (GLfloat) 0.719051, (GLfloat) - 0.595444, + (GLfloat) 0.844907, (GLfloat) 0.643346, (GLfloat) - 0.594388, + (GLfloat) 0.913289, (GLfloat) 0.675305, (GLfloat) - 0.594444, + (GLfloat) 1.101400, (GLfloat) 0.626279, (GLfloat) - 0.590500, + (GLfloat) 1.057196, (GLfloat) 0.686350, (GLfloat) - 0.582500, + (GLfloat) 1.018008, (GLfloat) 0.729398, (GLfloat) - 0.500000, + (GLfloat) 1.083956, (GLfloat) 0.612743, (GLfloat) - 0.706000, + (GLfloat) 1.046216, (GLfloat) 0.675680, (GLfloat) - 0.660875, + (GLfloat) 1.057196, (GLfloat) 0.686350, (GLfloat) - 0.417500, + (GLfloat) 0.911431, (GLfloat) 0.545768, (GLfloat) - 0.720237, + (GLfloat) 0.978052, (GLfloat) 0.571957, (GLfloat) - 0.720369, + (GLfloat) 1.074463, (GLfloat) 0.512562, (GLfloat) - 0.740694, + (GLfloat) 1.059471, (GLfloat) 0.609015, (GLfloat) - 0.723162, + (GLfloat) 1.155185, (GLfloat) 0.444556, (GLfloat) - 0.723162, + (GLfloat) 1.011218, (GLfloat) 0.399402, (GLfloat) - 0.720237, + (GLfloat) 1.075195, (GLfloat) 0.416935, (GLfloat) - 0.720369, + (GLfloat) 1.180758, (GLfloat) 0.472333, (GLfloat) - 0.664625, + (GLfloat) 1.128758, (GLfloat) 0.537574, (GLfloat) - 0.721500, + (GLfloat) 1.098258, (GLfloat) 0.615227, (GLfloat) - 0.664625, + (GLfloat) 1.149055, (GLfloat) 0.549292, (GLfloat) - 0.402250, + (GLfloat) 1.197930, (GLfloat) 0.464638, (GLfloat) - 0.500000, + (GLfloat) 1.100180, (GLfloat) 0.633946, (GLfloat) - 0.500000, + (GLfloat) 1.149055, (GLfloat) 0.549292, (GLfloat) - 0.597750, + (GLfloat) 1.052796, (GLfloat) 0.338416, (GLfloat) - 0.673044, + (GLfloat) 0.938670, (GLfloat) 0.265970, (GLfloat) - 0.596525, + (GLfloat) 1.008335, (GLfloat) 0.286145, (GLfloat) - 0.595338, + (GLfloat) 1.086058, (GLfloat) 0.289628, (GLfloat) - 0.500000, + (GLfloat) 0.826297, (GLfloat) 0.209826, (GLfloat) - 0.596525, + (GLfloat) 0.875679, (GLfloat) 0.240722, (GLfloat) - 0.597178, + (GLfloat) 0.938670, (GLfloat) 0.265970, (GLfloat) - 0.403475, + (GLfloat) 0.948068, (GLfloat) 0.255539, (GLfloat) - 0.500000, + (GLfloat) 0.863485, (GLfloat) 0.349410, (GLfloat) - 0.725225, + (GLfloat) 0.910476, (GLfloat) 0.297260, (GLfloat) - 0.676962, + (GLfloat) 0.863485, (GLfloat) 0.349410, (GLfloat) - 0.274775, + (GLfloat) 0.910476, (GLfloat) 0.297260, (GLfloat) - 0.323037, + (GLfloat) 1.008335, (GLfloat) 0.286145, (GLfloat) - 0.404662, + (GLfloat) 0.826297, (GLfloat) 0.209826, (GLfloat) - 0.403475, + (GLfloat) 0.875679, (GLfloat) 0.240722, (GLfloat) - 0.402822, + (GLfloat) 1.052796, (GLfloat) 0.338416, (GLfloat) - 0.326956, + (GLfloat) 0.869854, (GLfloat) 0.606754, (GLfloat) - 0.673044, + (GLfloat) 0.750708, (GLfloat) 0.474572, (GLfloat) - 0.725225, + (GLfloat) 0.833218, (GLfloat) 0.513896, (GLfloat) - 0.722456, + (GLfloat) 0.961325, (GLfloat) 0.472585, (GLfloat) - 0.735969, + (GLfloat) 0.601974, (GLfloat) 0.366500, (GLfloat) - 0.725225, + (GLfloat) 0.671195, (GLfloat) 0.426029, (GLfloat) - 0.726748, + (GLfloat) 0.807096, (GLfloat) 0.411991, (GLfloat) - 0.741313, + (GLfloat) 0.675523, (GLfloat) 0.558012, (GLfloat) - 0.596525, + (GLfloat) 0.703717, (GLfloat) 0.526722, (GLfloat) - 0.676962, + (GLfloat) 0.938289, (GLfloat) 0.377245, (GLfloat) - 0.722456, + (GLfloat) 0.736568, (GLfloat) 0.272496, (GLfloat) - 0.725225, + (GLfloat) 0.793886, (GLfloat) 0.314845, (GLfloat) - 0.726748, + (GLfloat) 0.961325, (GLfloat) 0.472585, (GLfloat) - 0.264031, + (GLfloat) 0.750708, (GLfloat) 0.474572, (GLfloat) - 0.274775, + (GLfloat) 0.833218, (GLfloat) 0.513896, (GLfloat) - 0.277544, + (GLfloat) 0.869854, (GLfloat) 0.606754, (GLfloat) - 0.326956, + (GLfloat) 0.938289, (GLfloat) 0.377245, (GLfloat) - 0.277544, + (GLfloat) 0.736568, (GLfloat) 0.272496, (GLfloat) - 0.274775, + (GLfloat) 0.793886, (GLfloat) 0.314845, (GLfloat) - 0.273252, + (GLfloat) 0.807096, (GLfloat) 0.411991, (GLfloat) - 0.258687, + (GLfloat) 0.675523, (GLfloat) 0.558012, (GLfloat) - 0.403475, + (GLfloat) 0.703717, (GLfloat) 0.526722, (GLfloat) - 0.323037, + (GLfloat) 0.601974, (GLfloat) 0.366500, (GLfloat) - 0.274775, + (GLfloat) 0.671195, (GLfloat) 0.426029, (GLfloat) - 0.273252, + (GLfloat) 0.836591, (GLfloat) 0.655543, (GLfloat) - 0.500000, + (GLfloat) 0.763171, (GLfloat) 0.604996, (GLfloat) - 0.595338, + (GLfloat) 0.763171, (GLfloat) 0.604996, (GLfloat) - 0.404662, + (GLfloat) 0.512245, (GLfloat) 0.429169, (GLfloat) - 0.403475, + (GLfloat) 0.589401, (GLfloat) 0.500151, (GLfloat) - 0.402822, + (GLfloat) 0.666125, (GLfloat) 0.568442, (GLfloat) - 0.500000, + (GLfloat) 0.512245, (GLfloat) 0.429169, (GLfloat) - 0.596525, + (GLfloat) 0.589401, (GLfloat) 0.500151, (GLfloat) - 0.597178, + (GLfloat) 0.495371, (GLfloat) 0.238512, (GLfloat) - 0.720237, + (GLfloat) 0.432817, (GLfloat) 0.138665, (GLfloat) - 0.724648, + (GLfloat) 0.458468, (GLfloat) 0.182068, (GLfloat) - 0.720369, + (GLfloat) 0.656244, (GLfloat) 0.179386, (GLfloat) - 0.720237, + (GLfloat) 0.575807, (GLfloat) 0.208949, (GLfloat) - 0.735969, + (GLfloat) 0.543287, (GLfloat) 0.301992, (GLfloat) - 0.722456, + (GLfloat) 0.388123, (GLfloat) 0.277930, (GLfloat) - 0.594388, + (GLfloat) 0.428341, (GLfloat) 0.263148, (GLfloat) - 0.673044, + (GLfloat) 0.763492, (GLfloat) 0.139968, (GLfloat) - 0.594388, + (GLfloat) 0.723274, (GLfloat) 0.154750, (GLfloat) - 0.673044, + (GLfloat) 0.690899, (GLfloat) 0.226098, (GLfloat) - 0.722456, + (GLfloat) 0.617440, (GLfloat) 0.099959, (GLfloat) - 0.724648, + (GLfloat) 0.631969, (GLfloat) 0.136095, (GLfloat) - 0.720369, + (GLfloat) 0.669271, (GLfloat) 0.319498, (GLfloat) - 0.741313, + (GLfloat) 0.792649, (GLfloat) 0.233327, (GLfloat) - 0.676962, + (GLfloat) 0.545894, (GLfloat) 0.405668, (GLfloat) - 0.676962, + (GLfloat) 0.444878, (GLfloat) 0.352588, (GLfloat) - 0.595338, + (GLfloat) 0.388123, (GLfloat) 0.277930, (GLfloat) - 0.405612, + (GLfloat) 0.374717, (GLfloat) 0.282857, (GLfloat) - 0.500000, + (GLfloat) 0.309735, (GLfloat) 0.164469, (GLfloat) - 0.596277, + (GLfloat) 0.342801, (GLfloat) 0.212716, (GLfloat) - 0.594444, + (GLfloat) 0.501029, (GLfloat) 0.437003, (GLfloat) - 0.500000, + (GLfloat) 0.545894, (GLfloat) 0.405668, (GLfloat) - 0.323037, + (GLfloat) 0.444878, (GLfloat) 0.352588, (GLfloat) - 0.404662, + (GLfloat) 0.309735, (GLfloat) 0.164469, (GLfloat) - 0.403722, + (GLfloat) 0.342801, (GLfloat) 0.212716, (GLfloat) - 0.405556, + (GLfloat) 0.495371, (GLfloat) 0.238512, (GLfloat) - 0.279763, + (GLfloat) 0.428341, (GLfloat) 0.263148, (GLfloat) - 0.326956, + (GLfloat) 0.543287, (GLfloat) 0.301992, (GLfloat) - 0.277544, + (GLfloat) 0.656244, (GLfloat) 0.179386, (GLfloat) - 0.279763, + (GLfloat) 0.575807, (GLfloat) 0.208949, (GLfloat) - 0.264031, + (GLfloat) 0.432817, (GLfloat) 0.138665, (GLfloat) - 0.275352, + (GLfloat) 0.458468, (GLfloat) 0.182068, (GLfloat) - 0.279631, + (GLfloat) 0.669271, (GLfloat) 0.319498, (GLfloat) - 0.258687, + (GLfloat) 0.792649, (GLfloat) 0.233327, (GLfloat) - 0.323037, + (GLfloat) 0.690899, (GLfloat) 0.226098, (GLfloat) - 0.277544, + (GLfloat) 0.617440, (GLfloat) 0.099959, (GLfloat) - 0.275352, + (GLfloat) 0.631969, (GLfloat) 0.136095, (GLfloat) - 0.279631, + (GLfloat) 0.763492, (GLfloat) 0.139968, (GLfloat) - 0.405612, + (GLfloat) 0.723274, (GLfloat) 0.154750, (GLfloat) - 0.326956, + (GLfloat) 0.789307, (GLfloat) 0.175501, (GLfloat) - 0.404662, + (GLfloat) 0.776898, (GLfloat) 0.135041, (GLfloat) - 0.500000, + (GLfloat) 0.740522, (GLfloat) 0.074155, (GLfloat) - 0.403722, + (GLfloat) 0.747636, (GLfloat) 0.105446, (GLfloat) - 0.405556, + (GLfloat) 0.837513, (GLfloat) 0.201992, (GLfloat) - 0.500000, + (GLfloat) 0.789307, (GLfloat) 0.175501, (GLfloat) - 0.595338, + (GLfloat) 0.740522, (GLfloat) 0.074155, (GLfloat) - 0.596277, + (GLfloat) 0.747636, (GLfloat) 0.105446, (GLfloat) - 0.594444, + (GLfloat) 0.755907, (GLfloat) 0.070930, (GLfloat) - 0.500000, + (GLfloat) 0.710325, (GLfloat) 0.032750, (GLfloat) - 0.412500, + (GLfloat) 0.731601, (GLfloat) 0.048967, (GLfloat) - 0.404556, + (GLfloat) 0.694366, (GLfloat) 0.083832, (GLfloat) - 0.323491, + (GLfloat) 0.694366, (GLfloat) 0.083832, (GLfloat) - 0.676509, + (GLfloat) 0.710325, (GLfloat) 0.032750, (GLfloat) - 0.587500, + (GLfloat) 0.731601, (GLfloat) 0.048967, (GLfloat) - 0.595444, + (GLfloat) 0.592781, (GLfloat) 0.031264, (GLfloat) - 0.590500, + (GLfloat) 0.667212, (GLfloat) 0.026513, (GLfloat) - 0.582500, + (GLfloat) 0.725378, (GLfloat) 0.028862, (GLfloat) - 0.500000, + (GLfloat) 0.593625, (GLfloat) 0.053327, (GLfloat) - 0.706000, + (GLfloat) 0.666096, (GLfloat) 0.041783, (GLfloat) - 0.660875, + (GLfloat) 0.593625, (GLfloat) 0.053327, (GLfloat) - 0.294000, + (GLfloat) 0.666096, (GLfloat) 0.041783, (GLfloat) - 0.339125, + (GLfloat) 0.592781, (GLfloat) 0.031264, (GLfloat) - 0.409500, + (GLfloat) 0.667212, (GLfloat) 0.026513, (GLfloat) - 0.417500, + (GLfloat) 0.525128, (GLfloat) 0.119312, (GLfloat) - 0.740694, + (GLfloat) 0.606658, (GLfloat) 0.072023, (GLfloat) - 0.723162, + (GLfloat) 0.355891, (GLfloat) 0.154793, (GLfloat) - 0.676509, + (GLfloat) 0.421284, (GLfloat) 0.083716, (GLfloat) - 0.706000, + (GLfloat) 0.419921, (GLfloat) 0.106487, (GLfloat) - 0.723162, + (GLfloat) 0.414531, (GLfloat) 0.062694, (GLfloat) - 0.590500, + (GLfloat) 0.423841, (GLfloat) 0.069426, (GLfloat) - 0.664625, + (GLfloat) 0.507243, (GLfloat) 0.067325, (GLfloat) - 0.721500, + (GLfloat) 0.304584, (GLfloat) 0.104293, (GLfloat) - 0.587500, + (GLfloat) 0.349234, (GLfloat) 0.097654, (GLfloat) - 0.660875, + (GLfloat) 0.586334, (GLfloat) 0.040774, (GLfloat) - 0.664625, + (GLfloat) 0.294350, (GLfloat) 0.167695, (GLfloat) - 0.500000, + (GLfloat) 0.294978, (GLfloat) 0.129544, (GLfloat) - 0.595444, + (GLfloat) 0.355891, (GLfloat) 0.154793, (GLfloat) - 0.323491, + (GLfloat) 0.304584, (GLfloat) 0.104293, (GLfloat) - 0.412500, + (GLfloat) 0.294978, (GLfloat) 0.129544, (GLfloat) - 0.404556, + (GLfloat) 0.414531, (GLfloat) 0.062694, (GLfloat) - 0.409500, + (GLfloat) 0.342964, (GLfloat) 0.083687, (GLfloat) - 0.417500, + (GLfloat) 0.289108, (GLfloat) 0.105788, (GLfloat) - 0.500000, + (GLfloat) 0.421284, (GLfloat) 0.083716, (GLfloat) - 0.294000, + (GLfloat) 0.349234, (GLfloat) 0.097654, (GLfloat) - 0.339125, + (GLfloat) 0.342964, (GLfloat) 0.083687, (GLfloat) - 0.582500, + (GLfloat) 0.525128, (GLfloat) 0.119312, (GLfloat) - 0.259306, + (GLfloat) 0.419921, (GLfloat) 0.106487, (GLfloat) - 0.276838, + (GLfloat) 0.606658, (GLfloat) 0.072023, (GLfloat) - 0.276838, + (GLfloat) 0.586334, (GLfloat) 0.040774, (GLfloat) - 0.335375, + (GLfloat) 0.507243, (GLfloat) 0.067325, (GLfloat) - 0.278500, + (GLfloat) 0.423841, (GLfloat) 0.069426, (GLfloat) - 0.335375, + (GLfloat) 0.503173, (GLfloat) 0.044243, (GLfloat) - 0.597750, + (GLfloat) 0.599438, (GLfloat) 0.027269, (GLfloat) - 0.500000, + (GLfloat) 0.406908, (GLfloat) 0.061217, (GLfloat) - 0.500000, + (GLfloat) 0.503173, (GLfloat) 0.044243, (GLfloat) - 0.402250, +}; + +static GLfloat s1_3_normals[] = +{ + (GLfloat) 0.156072, (GLfloat) - 0.866199, (GLfloat) - 0.474700, + (GLfloat) 0.133323, (GLfloat) - 0.866325, (GLfloat) - 0.481359, + (GLfloat) 0.156764, (GLfloat) - 0.975995, (GLfloat) - 0.151191, + (GLfloat) 0.165110, (GLfloat) - 0.975177, (GLfloat) - 0.147543, + (GLfloat) 0.361485, (GLfloat) - 0.917862, (GLfloat) - 0.163883, + (GLfloat) 0.371348, (GLfloat) - 0.914502, (GLfloat) - 0.160580, + (GLfloat) 0.350149, (GLfloat) - 0.787582, (GLfloat) - 0.507060, + (GLfloat) 0.331724, (GLfloat) - 0.792390, (GLfloat) - 0.511934, + (GLfloat) 0.156072, (GLfloat) - 0.866199, (GLfloat) 0.474700, + (GLfloat) 0.133323, (GLfloat) - 0.866325, (GLfloat) 0.481359, + (GLfloat) 0.331724, (GLfloat) - 0.792390, (GLfloat) 0.511934, + (GLfloat) 0.350149, (GLfloat) - 0.787582, (GLfloat) 0.507061, + (GLfloat) 0.361485, (GLfloat) - 0.917862, (GLfloat) 0.163883, + (GLfloat) 0.371348, (GLfloat) - 0.914502, (GLfloat) 0.160580, + (GLfloat) 0.165110, (GLfloat) - 0.975177, (GLfloat) 0.147543, + (GLfloat) 0.156764, (GLfloat) - 0.975995, (GLfloat) 0.151191, + (GLfloat) 0.952910, (GLfloat) 0.222669, (GLfloat) 0.205865, + (GLfloat) 0.952953, (GLfloat) 0.245285, (GLfloat) 0.178091, + (GLfloat) 0.977287, (GLfloat) 0.200386, (GLfloat) 0.068964, + (GLfloat) 0.974607, (GLfloat) 0.211631, (GLfloat) 0.073163, + (GLfloat) 0.910741, (GLfloat) - 0.389976, (GLfloat) 0.135901, + (GLfloat) 0.891878, (GLfloat) - 0.425931, (GLfloat) 0.152106, + (GLfloat) 0.882467, (GLfloat) - 0.235214, (GLfloat) 0.407340, + (GLfloat) 0.868268, (GLfloat) - 0.279083, (GLfloat) 0.410151, + (GLfloat) 0.952953, (GLfloat) 0.245285, (GLfloat) - 0.178091, + (GLfloat) 0.952910, (GLfloat) 0.222669, (GLfloat) - 0.205865, + (GLfloat) 0.868268, (GLfloat) - 0.279083, (GLfloat) - 0.410151, + (GLfloat) 0.882468, (GLfloat) - 0.235213, (GLfloat) - 0.407340, + (GLfloat) 0.891878, (GLfloat) - 0.425931, (GLfloat) - 0.152106, + (GLfloat) 0.910741, (GLfloat) - 0.389976, (GLfloat) - 0.135901, + (GLfloat) 0.974607, (GLfloat) 0.211631, (GLfloat) - 0.073163, + (GLfloat) 0.977287, (GLfloat) 0.200386, (GLfloat) - 0.068964, + (GLfloat) 0.086707, (GLfloat) - 0.551974, (GLfloat) 0.829341, + (GLfloat) 0.062265, (GLfloat) - 0.551355, (GLfloat) 0.831944, + (GLfloat) - 0.014960, (GLfloat) - 0.207986, (GLfloat) 0.978017, + (GLfloat) - 0.026687, (GLfloat) - 0.208021, (GLfloat) 0.977760, + (GLfloat) 0.102710, (GLfloat) - 0.133733, (GLfloat) 0.985681, + (GLfloat) 0.099775, (GLfloat) - 0.134244, (GLfloat) 0.985913, + (GLfloat) 0.231521, (GLfloat) - 0.464011, (GLfloat) 0.855039, + (GLfloat) 0.236951, (GLfloat) - 0.462930, (GLfloat) 0.854137, + (GLfloat) - 0.295570, (GLfloat) 0.436154, (GLfloat) 0.849946, + (GLfloat) - 0.280583, (GLfloat) 0.437172, (GLfloat) 0.854490, + (GLfloat) - 0.178752, (GLfloat) 0.492834, (GLfloat) 0.851565, + (GLfloat) - 0.184330, (GLfloat) 0.491982, (GLfloat) 0.850868, + (GLfloat) - 0.033888, (GLfloat) 0.173633, (GLfloat) 0.984227, + (GLfloat) - 0.032872, (GLfloat) 0.173792, (GLfloat) 0.984234, + (GLfloat) - 0.140362, (GLfloat) 0.111822, (GLfloat) 0.983765, + (GLfloat) - 0.136701, (GLfloat) 0.111911, (GLfloat) 0.984271, + (GLfloat) 0.725871, (GLfloat) 0.640449, (GLfloat) 0.250870, + (GLfloat) 0.717328, (GLfloat) 0.635281, (GLfloat) 0.286109, + (GLfloat) 0.785252, (GLfloat) 0.532999, (GLfloat) 0.315105, + (GLfloat) 0.786013, (GLfloat) 0.538285, (GLfloat) 0.304028, + (GLfloat) 0.473766, (GLfloat) 0.428968, (GLfloat) 0.769111, + (GLfloat) 0.445991, (GLfloat) 0.427917, (GLfloat) 0.786117, + (GLfloat) 0.380921, (GLfloat) 0.670539, (GLfloat) 0.636613, + (GLfloat) 0.351469, (GLfloat) 0.675507, (GLfloat) 0.648198, + (GLfloat) 0.909972, (GLfloat) 0.319731, (GLfloat) 0.264053, + (GLfloat) 0.914034, (GLfloat) 0.290005, (GLfloat) 0.283618, + (GLfloat) 0.764793, (GLfloat) - 0.009035, (GLfloat) 0.644213, + (GLfloat) 0.748359, (GLfloat) - 0.049564, (GLfloat) 0.661439, + (GLfloat) 0.584615, (GLfloat) 0.165625, (GLfloat) 0.794225, + (GLfloat) 0.606922, (GLfloat) 0.199970, (GLfloat) 0.769193, + (GLfloat) 0.856780, (GLfloat) 0.408314, (GLfloat) 0.314973, + (GLfloat) 0.856353, (GLfloat) 0.416833, (GLfloat) 0.304811, + (GLfloat) - 0.450621, (GLfloat) 0.737913, (GLfloat) 0.502419, + (GLfloat) - 0.436449, (GLfloat) 0.741403, (GLfloat) 0.509739, + (GLfloat) - 0.507433, (GLfloat) 0.846833, (GLfloat) 0.159329, + (GLfloat) - 0.502539, (GLfloat) 0.849165, (GLfloat) 0.162398, + (GLfloat) - 0.409636, (GLfloat) 0.897074, (GLfloat) 0.165699, + (GLfloat) - 0.419809, (GLfloat) 0.893103, (GLfloat) 0.161638, + (GLfloat) - 0.332199, (GLfloat) 0.791771, (GLfloat) 0.512584, + (GLfloat) - 0.350779, (GLfloat) 0.787278, (GLfloat) 0.507097, + (GLfloat) - 0.436449, (GLfloat) 0.741403, (GLfloat) - 0.509738, + (GLfloat) - 0.450621, (GLfloat) 0.737913, (GLfloat) - 0.502419, + (GLfloat) - 0.332198, (GLfloat) 0.791771, (GLfloat) - 0.512584, + (GLfloat) - 0.350779, (GLfloat) 0.787278, (GLfloat) - 0.507097, + (GLfloat) - 0.419809, (GLfloat) 0.893103, (GLfloat) - 0.161638, + (GLfloat) - 0.409636, (GLfloat) 0.897074, (GLfloat) - 0.165699, + (GLfloat) - 0.507433, (GLfloat) 0.846833, (GLfloat) - 0.159329, + (GLfloat) - 0.502539, (GLfloat) 0.849165, (GLfloat) - 0.162398, + (GLfloat) 0.669290, (GLfloat) 0.713912, (GLfloat) - 0.205866, + (GLfloat) 0.688897, (GLfloat) 0.702641, (GLfloat) - 0.178093, + (GLfloat) 0.661903, (GLfloat) 0.745850, (GLfloat) - 0.074780, + (GLfloat) 0.670351, (GLfloat) 0.738996, (GLfloat) - 0.067190, + (GLfloat) 0.158706, (GLfloat) 0.978584, (GLfloat) - 0.131091, + (GLfloat) 0.119709, (GLfloat) 0.981678, (GLfloat) - 0.148253, + (GLfloat) 0.261869, (GLfloat) 0.885538, (GLfloat) - 0.383728, + (GLfloat) 0.223051, (GLfloat) 0.883291, (GLfloat) - 0.412366, + (GLfloat) 0.688897, (GLfloat) 0.702640, (GLfloat) 0.178092, + (GLfloat) 0.669290, (GLfloat) 0.713912, (GLfloat) 0.205867, + (GLfloat) 0.261868, (GLfloat) 0.885538, (GLfloat) 0.383728, + (GLfloat) 0.223050, (GLfloat) 0.883291, (GLfloat) 0.412366, + (GLfloat) 0.119709, (GLfloat) 0.981678, (GLfloat) 0.148253, + (GLfloat) 0.158706, (GLfloat) 0.978584, (GLfloat) 0.131091, + (GLfloat) 0.661903, (GLfloat) 0.745850, (GLfloat) 0.074780, + (GLfloat) 0.670351, (GLfloat) 0.738996, (GLfloat) 0.067190, + (GLfloat) - 0.295570, (GLfloat) 0.436154, (GLfloat) - 0.849946, + (GLfloat) - 0.280583, (GLfloat) 0.437172, (GLfloat) - 0.854490, + (GLfloat) - 0.136701, (GLfloat) 0.111911, (GLfloat) - 0.984271, + (GLfloat) - 0.140362, (GLfloat) 0.111822, (GLfloat) - 0.983765, + (GLfloat) - 0.033889, (GLfloat) 0.173633, (GLfloat) - 0.984227, + (GLfloat) - 0.032872, (GLfloat) 0.173792, (GLfloat) - 0.984234, + (GLfloat) - 0.184329, (GLfloat) 0.491983, (GLfloat) - 0.850868, + (GLfloat) - 0.178752, (GLfloat) 0.492834, (GLfloat) - 0.851565, + (GLfloat) 0.062265, (GLfloat) - 0.551355, (GLfloat) - 0.831944, + (GLfloat) 0.086707, (GLfloat) - 0.551973, (GLfloat) - 0.829342, + (GLfloat) 0.231522, (GLfloat) - 0.464010, (GLfloat) - 0.855039, + (GLfloat) 0.236951, (GLfloat) - 0.462929, (GLfloat) - 0.854137, + (GLfloat) 0.099774, (GLfloat) - 0.134244, (GLfloat) - 0.985913, + (GLfloat) 0.102710, (GLfloat) - 0.133733, (GLfloat) - 0.985681, + (GLfloat) - 0.014960, (GLfloat) - 0.207986, (GLfloat) - 0.978017, + (GLfloat) - 0.026687, (GLfloat) - 0.208021, (GLfloat) - 0.977760, + (GLfloat) 0.914034, (GLfloat) 0.290005, (GLfloat) - 0.283618, + (GLfloat) 0.909972, (GLfloat) 0.319730, (GLfloat) - 0.264054, + (GLfloat) 0.856780, (GLfloat) 0.408314, (GLfloat) - 0.314973, + (GLfloat) 0.856353, (GLfloat) 0.416833, (GLfloat) - 0.304811, + (GLfloat) 0.606923, (GLfloat) 0.199970, (GLfloat) - 0.769193, + (GLfloat) 0.584616, (GLfloat) 0.165625, (GLfloat) - 0.794224, + (GLfloat) 0.764793, (GLfloat) - 0.009035, (GLfloat) - 0.644213, + (GLfloat) 0.748360, (GLfloat) - 0.049564, (GLfloat) - 0.661439, + (GLfloat) 0.725871, (GLfloat) 0.640449, (GLfloat) - 0.250871, + (GLfloat) 0.717328, (GLfloat) 0.635281, (GLfloat) - 0.286109, + (GLfloat) 0.380922, (GLfloat) 0.670539, (GLfloat) - 0.636613, + (GLfloat) 0.351469, (GLfloat) 0.675507, (GLfloat) - 0.648197, + (GLfloat) 0.445992, (GLfloat) 0.427917, (GLfloat) - 0.786116, + (GLfloat) 0.473767, (GLfloat) 0.428968, (GLfloat) - 0.769111, + (GLfloat) 0.786013, (GLfloat) 0.538285, (GLfloat) - 0.304029, + (GLfloat) 0.785252, (GLfloat) 0.532999, (GLfloat) - 0.315105, + (GLfloat) 0.919156, (GLfloat) 0.373864, (GLfloat) 0.124010, + (GLfloat) 0.913260, (GLfloat) 0.384076, (GLfloat) 0.135802, + (GLfloat) 0.881886, (GLfloat) 0.458542, (GLfloat) 0.109621, + (GLfloat) 0.879452, (GLfloat) 0.461960, (GLfloat) 0.114709, + (GLfloat) 0.880239, (GLfloat) 0.473377, (GLfloat) 0.033080, + (GLfloat) 0.881697, (GLfloat) 0.470851, (GLfloat) 0.030163, + (GLfloat) 0.914779, (GLfloat) 0.401569, (GLfloat) 0.043834, + (GLfloat) 0.916978, (GLfloat) 0.396963, (GLfloat) 0.039657, + (GLfloat) 0.789250, (GLfloat) 0.598868, (GLfloat) 0.135802, + (GLfloat) 0.783354, (GLfloat) 0.609080, (GLfloat) 0.124010, + (GLfloat) 0.805159, (GLfloat) 0.591437, (GLfloat) 0.043834, + (GLfloat) 0.802269, (GLfloat) 0.595644, (GLfloat) 0.039656, + (GLfloat) 0.848617, (GLfloat) 0.528147, (GLfloat) 0.030163, + (GLfloat) 0.850075, (GLfloat) 0.525621, (GLfloat) 0.033079, + (GLfloat) 0.838052, (GLfloat) 0.534464, (GLfloat) 0.109621, + (GLfloat) 0.839795, (GLfloat) 0.530647, (GLfloat) 0.114709, + (GLfloat) 0.783354, (GLfloat) 0.609080, (GLfloat) - 0.124010, + (GLfloat) 0.789250, (GLfloat) 0.598868, (GLfloat) - 0.135802, + (GLfloat) 0.838052, (GLfloat) 0.534464, (GLfloat) - 0.109621, + (GLfloat) 0.839795, (GLfloat) 0.530647, (GLfloat) - 0.114709, + (GLfloat) 0.850075, (GLfloat) 0.525621, (GLfloat) - 0.033079, + (GLfloat) 0.848617, (GLfloat) 0.528147, (GLfloat) - 0.030163, + (GLfloat) 0.805159, (GLfloat) 0.591437, (GLfloat) - 0.043834, + (GLfloat) 0.802269, (GLfloat) 0.595644, (GLfloat) - 0.039656, + (GLfloat) 0.913260, (GLfloat) 0.384076, (GLfloat) - 0.135802, + (GLfloat) 0.919156, (GLfloat) 0.373864, (GLfloat) - 0.124010, + (GLfloat) 0.914779, (GLfloat) 0.401569, (GLfloat) - 0.043834, + (GLfloat) 0.916978, (GLfloat) 0.396963, (GLfloat) - 0.039657, + (GLfloat) 0.881697, (GLfloat) 0.470851, (GLfloat) - 0.030163, + (GLfloat) 0.880239, (GLfloat) 0.473377, (GLfloat) - 0.033080, + (GLfloat) 0.881886, (GLfloat) 0.458542, (GLfloat) - 0.109621, + (GLfloat) 0.879452, (GLfloat) 0.461960, (GLfloat) - 0.114709, + (GLfloat) 0.190919, (GLfloat) - 0.865460, (GLfloat) - 0.463172, + (GLfloat) 0.162958, (GLfloat) - 0.864281, (GLfloat) - 0.475881, + (GLfloat) 0.232098, (GLfloat) - 0.863386, (GLfloat) - 0.447991, + (GLfloat) 0.201152, (GLfloat) - 0.862208, (GLfloat) - 0.464904, + (GLfloat) 0.208595, (GLfloat) - 0.967433, (GLfloat) - 0.143393, + (GLfloat) 0.220092, (GLfloat) - 0.966009, (GLfloat) - 0.135597, + (GLfloat) 0.173391, (GLfloat) - 0.973662, (GLfloat) - 0.148045, + (GLfloat) 0.183752, (GLfloat) - 0.972679, (GLfloat) - 0.141883, + (GLfloat) 0.370543, (GLfloat) - 0.826392, (GLfloat) - 0.423998, + (GLfloat) 0.337718, (GLfloat) - 0.831172, (GLfloat) - 0.441702, + (GLfloat) 0.357949, (GLfloat) - 0.923976, (GLfloat) - 0.134692, + (GLfloat) 0.370172, (GLfloat) - 0.920284, (GLfloat) - 0.126690, + (GLfloat) 0.265644, (GLfloat) - 0.954091, (GLfloat) - 0.138357, + (GLfloat) 0.277857, (GLfloat) - 0.951799, (GLfloat) - 0.129901, + (GLfloat) 0.288098, (GLfloat) - 0.854015, (GLfloat) - 0.433195, + (GLfloat) 0.255240, (GLfloat) - 0.854757, (GLfloat) - 0.451932, + (GLfloat) 0.370543, (GLfloat) - 0.826392, (GLfloat) 0.423998, + (GLfloat) 0.337718, (GLfloat) - 0.831172, (GLfloat) 0.441701, + (GLfloat) 0.255240, (GLfloat) - 0.854757, (GLfloat) 0.451932, + (GLfloat) 0.288099, (GLfloat) - 0.854015, (GLfloat) 0.433195, + (GLfloat) 0.265644, (GLfloat) - 0.954091, (GLfloat) 0.138357, + (GLfloat) 0.277857, (GLfloat) - 0.951799, (GLfloat) 0.129901, + (GLfloat) 0.370172, (GLfloat) - 0.920284, (GLfloat) 0.126690, + (GLfloat) 0.357949, (GLfloat) - 0.923976, (GLfloat) 0.134692, + (GLfloat) 0.162958, (GLfloat) - 0.864281, (GLfloat) 0.475881, + (GLfloat) 0.190920, (GLfloat) - 0.865460, (GLfloat) 0.463172, + (GLfloat) 0.173391, (GLfloat) - 0.973662, (GLfloat) 0.148045, + (GLfloat) 0.183752, (GLfloat) - 0.972679, (GLfloat) 0.141883, + (GLfloat) 0.220093, (GLfloat) - 0.966009, (GLfloat) 0.135597, + (GLfloat) 0.208595, (GLfloat) - 0.967433, (GLfloat) 0.143394, + (GLfloat) 0.232098, (GLfloat) - 0.863386, (GLfloat) 0.447991, + (GLfloat) 0.201153, (GLfloat) - 0.862208, (GLfloat) 0.464904, + (GLfloat) - 0.220569, (GLfloat) 0.498423, (GLfloat) - 0.838406, + (GLfloat) - 0.196440, (GLfloat) 0.495475, (GLfloat) - 0.846118, + (GLfloat) - 0.216090, (GLfloat) 0.523731, (GLfloat) - 0.824021, + (GLfloat) - 0.187439, (GLfloat) 0.518039, (GLfloat) - 0.834567, + (GLfloat) - 0.035834, (GLfloat) 0.186611, (GLfloat) - 0.981780, + (GLfloat) - 0.049583, (GLfloat) 0.189912, (GLfloat) - 0.980548, + (GLfloat) - 0.057093, (GLfloat) 0.164206, (GLfloat) - 0.984772, + (GLfloat) - 0.067095, (GLfloat) 0.165750, (GLfloat) - 0.983883, + (GLfloat) - 0.313656, (GLfloat) 0.500321, (GLfloat) - 0.807031, + (GLfloat) - 0.288105, (GLfloat) 0.497578, (GLfloat) - 0.818176, + (GLfloat) - 0.079226, (GLfloat) 0.180632, (GLfloat) - 0.980355, + (GLfloat) - 0.092817, (GLfloat) 0.182734, (GLfloat) - 0.978771, + (GLfloat) - 0.045426, (GLfloat) 0.193014, (GLfloat) - 0.980144, + (GLfloat) - 0.060897, (GLfloat) 0.196689, (GLfloat) - 0.978573, + (GLfloat) - 0.250277, (GLfloat) 0.526446, (GLfloat) - 0.812537, + (GLfloat) - 0.220552, (GLfloat) 0.520843, (GLfloat) - 0.824669, + (GLfloat) 0.247012, (GLfloat) - 0.528860, (GLfloat) - 0.811968, + (GLfloat) 0.280618, (GLfloat) - 0.529785, (GLfloat) - 0.800363, + (GLfloat) 0.197390, (GLfloat) - 0.535630, (GLfloat) - 0.821059, + (GLfloat) 0.231067, (GLfloat) - 0.540483, (GLfloat) - 0.809003, + (GLfloat) 0.104568, (GLfloat) - 0.158183, (GLfloat) - 0.981857, + (GLfloat) 0.094460, (GLfloat) - 0.156029, (GLfloat) - 0.983225, + (GLfloat) 0.111854, (GLfloat) - 0.162201, (GLfloat) - 0.980398, + (GLfloat) 0.101426, (GLfloat) - 0.160983, (GLfloat) - 0.981732, + (GLfloat) 0.117566, (GLfloat) - 0.537019, (GLfloat) - 0.835338, + (GLfloat) 0.146549, (GLfloat) - 0.540970, (GLfloat) - 0.828175, + (GLfloat) 0.055888, (GLfloat) - 0.173264, (GLfloat) - 0.983288, + (GLfloat) 0.045018, (GLfloat) - 0.171643, (GLfloat) - 0.984130, + (GLfloat) 0.088354, (GLfloat) - 0.160681, (GLfloat) - 0.983044, + (GLfloat) 0.078052, (GLfloat) - 0.158368, (GLfloat) - 0.984290, + (GLfloat) 0.157434, (GLfloat) - 0.535002, (GLfloat) - 0.830053, + (GLfloat) 0.189212, (GLfloat) - 0.540730, (GLfloat) - 0.819640, + (GLfloat) - 0.196440, (GLfloat) 0.495475, (GLfloat) 0.846118, + (GLfloat) - 0.220568, (GLfloat) 0.498423, (GLfloat) 0.838406, + (GLfloat) - 0.057093, (GLfloat) 0.164206, (GLfloat) 0.984772, + (GLfloat) - 0.067095, (GLfloat) 0.165750, (GLfloat) 0.983883, + (GLfloat) - 0.049583, (GLfloat) 0.189912, (GLfloat) 0.980548, + (GLfloat) - 0.035834, (GLfloat) 0.186611, (GLfloat) 0.981780, + (GLfloat) - 0.216090, (GLfloat) 0.523731, (GLfloat) 0.824021, + (GLfloat) - 0.187439, (GLfloat) 0.518039, (GLfloat) 0.834567, + (GLfloat) 0.117567, (GLfloat) - 0.537019, (GLfloat) 0.835337, + (GLfloat) 0.146549, (GLfloat) - 0.540970, (GLfloat) 0.828176, + (GLfloat) 0.189212, (GLfloat) - 0.540730, (GLfloat) 0.819640, + (GLfloat) 0.157434, (GLfloat) - 0.535002, (GLfloat) 0.830053, + (GLfloat) 0.088354, (GLfloat) - 0.160681, (GLfloat) 0.983044, + (GLfloat) 0.078052, (GLfloat) - 0.158368, (GLfloat) 0.984290, + (GLfloat) 0.045018, (GLfloat) - 0.171643, (GLfloat) 0.984130, + (GLfloat) 0.055888, (GLfloat) - 0.173264, (GLfloat) 0.983288, + (GLfloat) 0.280617, (GLfloat) - 0.529785, (GLfloat) 0.800363, + (GLfloat) 0.247012, (GLfloat) - 0.528861, (GLfloat) 0.811968, + (GLfloat) 0.111853, (GLfloat) - 0.162201, (GLfloat) 0.980398, + (GLfloat) 0.101425, (GLfloat) - 0.160983, (GLfloat) 0.981732, + (GLfloat) 0.094460, (GLfloat) - 0.156028, (GLfloat) 0.983225, + (GLfloat) 0.104568, (GLfloat) - 0.158182, (GLfloat) 0.981857, + (GLfloat) 0.197390, (GLfloat) - 0.535630, (GLfloat) 0.821059, + (GLfloat) 0.231068, (GLfloat) - 0.540483, (GLfloat) 0.809003, + (GLfloat) - 0.313656, (GLfloat) 0.500320, (GLfloat) 0.807031, + (GLfloat) - 0.288106, (GLfloat) 0.497578, (GLfloat) 0.818175, + (GLfloat) - 0.220552, (GLfloat) 0.520843, (GLfloat) 0.824669, + (GLfloat) - 0.250276, (GLfloat) 0.526446, (GLfloat) 0.812537, + (GLfloat) - 0.045425, (GLfloat) 0.193015, (GLfloat) 0.980144, + (GLfloat) - 0.060896, (GLfloat) 0.196690, (GLfloat) 0.978573, + (GLfloat) - 0.092818, (GLfloat) 0.182733, (GLfloat) 0.978771, + (GLfloat) - 0.079226, (GLfloat) 0.180631, (GLfloat) 0.980355, + (GLfloat) - 0.349743, (GLfloat) 0.793198, (GLfloat) - 0.498515, + (GLfloat) - 0.370416, (GLfloat) 0.791707, (GLfloat) - 0.485790, + (GLfloat) - 0.425027, (GLfloat) 0.892201, (GLfloat) - 0.152739, + (GLfloat) - 0.418180, (GLfloat) 0.894483, (GLfloat) - 0.158197, + (GLfloat) - 0.425590, (GLfloat) 0.893099, (GLfloat) - 0.145761, + (GLfloat) - 0.418336, (GLfloat) 0.895388, (GLfloat) - 0.152561, + (GLfloat) - 0.348153, (GLfloat) 0.802874, (GLfloat) - 0.483924, + (GLfloat) - 0.370992, (GLfloat) 0.802293, (GLfloat) - 0.467643, + (GLfloat) - 0.349743, (GLfloat) 0.793198, (GLfloat) 0.498515, + (GLfloat) - 0.370416, (GLfloat) 0.791707, (GLfloat) 0.485790, + (GLfloat) - 0.370992, (GLfloat) 0.802293, (GLfloat) 0.467643, + (GLfloat) - 0.348153, (GLfloat) 0.802874, (GLfloat) 0.483924, + (GLfloat) - 0.425590, (GLfloat) 0.893099, (GLfloat) 0.145761, + (GLfloat) - 0.418336, (GLfloat) 0.895388, (GLfloat) 0.152561, + (GLfloat) - 0.418180, (GLfloat) 0.894483, (GLfloat) 0.158197, + (GLfloat) - 0.425027, (GLfloat) 0.892201, (GLfloat) 0.152739, + (GLfloat) - 0.497325, (GLfloat) 0.745242, (GLfloat) 0.444165, + (GLfloat) - 0.479548, (GLfloat) 0.747889, (GLfloat) 0.459017, + (GLfloat) - 0.556394, (GLfloat) 0.819599, (GLfloat) 0.136684, + (GLfloat) - 0.551239, (GLfloat) 0.822088, (GLfloat) 0.142503, + (GLfloat) - 0.465768, (GLfloat) 0.872611, (GLfloat) 0.147004, + (GLfloat) - 0.472480, (GLfloat) 0.870146, (GLfloat) 0.140027, + (GLfloat) - 0.394421, (GLfloat) 0.789665, (GLfloat) 0.469959, + (GLfloat) - 0.416499, (GLfloat) 0.788420, (GLfloat) 0.452684, + (GLfloat) - 0.479547, (GLfloat) 0.747889, (GLfloat) - 0.459017, + (GLfloat) - 0.497325, (GLfloat) 0.745242, (GLfloat) - 0.444165, + (GLfloat) - 0.394421, (GLfloat) 0.789665, (GLfloat) - 0.469959, + (GLfloat) - 0.416498, (GLfloat) 0.788420, (GLfloat) - 0.452684, + (GLfloat) - 0.472480, (GLfloat) 0.870146, (GLfloat) - 0.140027, + (GLfloat) - 0.465768, (GLfloat) 0.872611, (GLfloat) - 0.147004, + (GLfloat) - 0.556394, (GLfloat) 0.819599, (GLfloat) - 0.136684, + (GLfloat) - 0.551239, (GLfloat) 0.822088, (GLfloat) - 0.142503, + (GLfloat) - 0.459423, (GLfloat) 0.314205, (GLfloat) - 0.830786, + (GLfloat) - 0.469135, (GLfloat) 0.308642, (GLfloat) - 0.827438, + (GLfloat) - 0.156023, (GLfloat) 0.098476, (GLfloat) - 0.982832, + (GLfloat) - 0.151547, (GLfloat) 0.101367, (GLfloat) - 0.983239, + (GLfloat) - 0.168365, (GLfloat) 0.083796, (GLfloat) - 0.982157, + (GLfloat) - 0.160419, (GLfloat) 0.086730, (GLfloat) - 0.983231, + (GLfloat) - 0.460048, (GLfloat) 0.328491, (GLfloat) - 0.824894, + (GLfloat) - 0.469062, (GLfloat) 0.325364, (GLfloat) - 0.821048, + (GLfloat) 0.495554, (GLfloat) - 0.246920, (GLfloat) - 0.832741, + (GLfloat) 0.477125, (GLfloat) - 0.265003, (GLfloat) - 0.837929, + (GLfloat) 0.446738, (GLfloat) - 0.363453, (GLfloat) - 0.817512, + (GLfloat) 0.441753, (GLfloat) - 0.366614, (GLfloat) - 0.818809, + (GLfloat) 0.138045, (GLfloat) - 0.145699, (GLfloat) - 0.979651, + (GLfloat) 0.135385, (GLfloat) - 0.146968, (GLfloat) - 0.979832, + (GLfloat) 0.154178, (GLfloat) - 0.091800, (GLfloat) - 0.983769, + (GLfloat) 0.160344, (GLfloat) - 0.086930, (GLfloat) - 0.983226, + (GLfloat) 0.316237, (GLfloat) - 0.497953, (GLfloat) - 0.807488, + (GLfloat) 0.343267, (GLfloat) - 0.493329, (GLfloat) - 0.799246, + (GLfloat) 0.113533, (GLfloat) - 0.172349, (GLfloat) - 0.978471, + (GLfloat) 0.101829, (GLfloat) - 0.173041, (GLfloat) - 0.979636, + (GLfloat) 0.123751, (GLfloat) - 0.168767, (GLfloat) - 0.977856, + (GLfloat) 0.114456, (GLfloat) - 0.171068, (GLfloat) - 0.978589, + (GLfloat) 0.385418, (GLfloat) - 0.444520, (GLfloat) - 0.808613, + (GLfloat) 0.397936, (GLfloat) - 0.439743, (GLfloat) - 0.805154, + (GLfloat) - 0.398435, (GLfloat) 0.428657, (GLfloat) - 0.810865, + (GLfloat) - 0.386943, (GLfloat) 0.429063, (GLfloat) - 0.816198, + (GLfloat) - 0.443045, (GLfloat) 0.369548, (GLfloat) - 0.816790, + (GLfloat) - 0.444436, (GLfloat) 0.369300, (GLfloat) - 0.816146, + (GLfloat) - 0.163680, (GLfloat) 0.101509, (GLfloat) - 0.981277, + (GLfloat) - 0.158806, (GLfloat) 0.102320, (GLfloat) - 0.981994, + (GLfloat) - 0.135291, (GLfloat) 0.136613, (GLfloat) - 0.981343, + (GLfloat) - 0.139056, (GLfloat) 0.136609, (GLfloat) - 0.980817, + (GLfloat) - 0.727675, (GLfloat) 0.496263, (GLfloat) - 0.473510, + (GLfloat) - 0.726249, (GLfloat) 0.505128, (GLfloat) - 0.466270, + (GLfloat) - 0.710606, (GLfloat) 0.534378, (GLfloat) - 0.457688, + (GLfloat) - 0.711650, (GLfloat) 0.528248, (GLfloat) - 0.463150, + (GLfloat) - 0.787870, (GLfloat) 0.599385, (GLfloat) - 0.141417, + (GLfloat) - 0.788753, (GLfloat) 0.597790, (GLfloat) - 0.143234, + (GLfloat) - 0.812157, (GLfloat) 0.564556, (GLfloat) - 0.147234, + (GLfloat) - 0.810846, (GLfloat) 0.567072, (GLfloat) - 0.144768, + (GLfloat) - 0.599894, (GLfloat) 0.659162, (GLfloat) - 0.453468, + (GLfloat) - 0.607958, (GLfloat) 0.656733, (GLfloat) - 0.446194, + (GLfloat) - 0.673258, (GLfloat) 0.726567, (GLfloat) - 0.137198, + (GLfloat) - 0.671022, (GLfloat) 0.728096, (GLfloat) - 0.140020, + (GLfloat) - 0.744575, (GLfloat) 0.652826, (GLfloat) - 0.139376, + (GLfloat) - 0.744638, (GLfloat) 0.652728, (GLfloat) - 0.139500, + (GLfloat) - 0.673012, (GLfloat) 0.585174, (GLfloat) - 0.452357, + (GLfloat) - 0.673042, (GLfloat) 0.585047, (GLfloat) - 0.452476, + (GLfloat) - 0.599894, (GLfloat) 0.659162, (GLfloat) 0.453468, + (GLfloat) - 0.607958, (GLfloat) 0.656733, (GLfloat) 0.446194, + (GLfloat) - 0.673012, (GLfloat) 0.585174, (GLfloat) 0.452357, + (GLfloat) - 0.673042, (GLfloat) 0.585047, (GLfloat) 0.452476, + (GLfloat) - 0.744638, (GLfloat) 0.652728, (GLfloat) 0.139500, + (GLfloat) - 0.744575, (GLfloat) 0.652826, (GLfloat) 0.139376, + (GLfloat) - 0.671022, (GLfloat) 0.728096, (GLfloat) 0.140020, + (GLfloat) - 0.673258, (GLfloat) 0.726567, (GLfloat) 0.137198, + (GLfloat) - 0.727676, (GLfloat) 0.496263, (GLfloat) 0.473510, + (GLfloat) - 0.726250, (GLfloat) 0.505128, (GLfloat) 0.466269, + (GLfloat) - 0.810846, (GLfloat) 0.567072, (GLfloat) 0.144768, + (GLfloat) - 0.812157, (GLfloat) 0.564556, (GLfloat) 0.147234, + (GLfloat) - 0.787870, (GLfloat) 0.599385, (GLfloat) 0.141417, + (GLfloat) - 0.788753, (GLfloat) 0.597789, (GLfloat) 0.143234, + (GLfloat) - 0.711650, (GLfloat) 0.528248, (GLfloat) 0.463150, + (GLfloat) - 0.710607, (GLfloat) 0.534378, (GLfloat) 0.457688, + (GLfloat) - 0.459423, (GLfloat) 0.314205, (GLfloat) 0.830786, + (GLfloat) - 0.469134, (GLfloat) 0.308642, (GLfloat) 0.827438, + (GLfloat) - 0.469062, (GLfloat) 0.325364, (GLfloat) 0.821048, + (GLfloat) - 0.460048, (GLfloat) 0.328491, (GLfloat) 0.824894, + (GLfloat) - 0.168365, (GLfloat) 0.083796, (GLfloat) 0.982157, + (GLfloat) - 0.160419, (GLfloat) 0.086730, (GLfloat) 0.983231, + (GLfloat) - 0.151547, (GLfloat) 0.101367, (GLfloat) 0.983239, + (GLfloat) - 0.156023, (GLfloat) 0.098476, (GLfloat) 0.982832, + (GLfloat) - 0.386943, (GLfloat) 0.429064, (GLfloat) 0.816198, + (GLfloat) - 0.398435, (GLfloat) 0.428657, (GLfloat) 0.810865, + (GLfloat) - 0.135291, (GLfloat) 0.136613, (GLfloat) 0.981343, + (GLfloat) - 0.139055, (GLfloat) 0.136609, (GLfloat) 0.980817, + (GLfloat) - 0.158806, (GLfloat) 0.102320, (GLfloat) 0.981994, + (GLfloat) - 0.163680, (GLfloat) 0.101509, (GLfloat) 0.981277, + (GLfloat) - 0.443045, (GLfloat) 0.369548, (GLfloat) 0.816790, + (GLfloat) - 0.444437, (GLfloat) 0.369300, (GLfloat) 0.816145, + (GLfloat) 0.316237, (GLfloat) - 0.497952, (GLfloat) 0.807488, + (GLfloat) 0.343268, (GLfloat) - 0.493329, (GLfloat) 0.799246, + (GLfloat) 0.397936, (GLfloat) - 0.439744, (GLfloat) 0.805154, + (GLfloat) 0.385418, (GLfloat) - 0.444521, (GLfloat) 0.808613, + (GLfloat) 0.123751, (GLfloat) - 0.168768, (GLfloat) 0.977856, + (GLfloat) 0.114455, (GLfloat) - 0.171068, (GLfloat) 0.978589, + (GLfloat) 0.101830, (GLfloat) - 0.173040, (GLfloat) 0.979637, + (GLfloat) 0.113533, (GLfloat) - 0.172348, (GLfloat) 0.978471, + (GLfloat) 0.477126, (GLfloat) - 0.265003, (GLfloat) 0.837929, + (GLfloat) 0.495553, (GLfloat) - 0.246921, (GLfloat) 0.832741, + (GLfloat) 0.154178, (GLfloat) - 0.091800, (GLfloat) 0.983769, + (GLfloat) 0.160344, (GLfloat) - 0.086930, (GLfloat) 0.983226, + (GLfloat) 0.135385, (GLfloat) - 0.146968, (GLfloat) 0.979832, + (GLfloat) 0.138045, (GLfloat) - 0.145699, (GLfloat) 0.979651, + (GLfloat) 0.446739, (GLfloat) - 0.363453, (GLfloat) 0.817512, + (GLfloat) 0.441753, (GLfloat) - 0.366614, (GLfloat) 0.818809, + (GLfloat) 0.786198, (GLfloat) - 0.394047, (GLfloat) 0.476047, + (GLfloat) 0.792547, (GLfloat) - 0.363224, (GLfloat) 0.489834, + (GLfloat) 0.707476, (GLfloat) - 0.538845, (GLfloat) 0.457301, + (GLfloat) 0.711142, (GLfloat) - 0.529032, (GLfloat) 0.463037, + (GLfloat) 0.801588, (GLfloat) - 0.580242, (GLfloat) 0.144141, + (GLfloat) 0.799043, (GLfloat) - 0.584300, (GLfloat) 0.141857, + (GLfloat) 0.903357, (GLfloat) - 0.400085, (GLfloat) 0.154524, + (GLfloat) 0.898654, (GLfloat) - 0.412515, (GLfloat) 0.149172, + (GLfloat) 0.471890, (GLfloat) - 0.763546, (GLfloat) 0.440814, + (GLfloat) 0.497278, (GLfloat) - 0.754424, (GLfloat) 0.428437, + (GLfloat) 0.515315, (GLfloat) - 0.846316, (GLfloat) 0.134909, + (GLfloat) 0.524719, (GLfloat) - 0.841405, (GLfloat) 0.129258, + (GLfloat) 0.671646, (GLfloat) - 0.728471, (GLfloat) 0.134984, + (GLfloat) 0.668271, (GLfloat) - 0.731195, (GLfloat) 0.136994, + (GLfloat) 0.610971, (GLfloat) - 0.657561, (GLfloat) 0.440826, + (GLfloat) 0.601302, (GLfloat) - 0.663396, (GLfloat) 0.445356, + (GLfloat) 0.497278, (GLfloat) - 0.754424, (GLfloat) - 0.428437, + (GLfloat) 0.471890, (GLfloat) - 0.763546, (GLfloat) - 0.440814, + (GLfloat) 0.610971, (GLfloat) - 0.657561, (GLfloat) - 0.440826, + (GLfloat) 0.601301, (GLfloat) - 0.663396, (GLfloat) - 0.445356, + (GLfloat) 0.668271, (GLfloat) - 0.731195, (GLfloat) - 0.136994, + (GLfloat) 0.671646, (GLfloat) - 0.728471, (GLfloat) - 0.134984, + (GLfloat) 0.515315, (GLfloat) - 0.846316, (GLfloat) - 0.134909, + (GLfloat) 0.524719, (GLfloat) - 0.841405, (GLfloat) - 0.129258, + (GLfloat) 0.792547, (GLfloat) - 0.363225, (GLfloat) - 0.489834, + (GLfloat) 0.786198, (GLfloat) - 0.394046, (GLfloat) - 0.476047, + (GLfloat) 0.903357, (GLfloat) - 0.400085, (GLfloat) - 0.154524, + (GLfloat) 0.898654, (GLfloat) - 0.412515, (GLfloat) - 0.149172, + (GLfloat) 0.799043, (GLfloat) - 0.584299, (GLfloat) - 0.141858, + (GLfloat) 0.801588, (GLfloat) - 0.580242, (GLfloat) - 0.144141, + (GLfloat) 0.707476, (GLfloat) - 0.538845, (GLfloat) - 0.457301, + (GLfloat) 0.711142, (GLfloat) - 0.529031, (GLfloat) - 0.463037, + (GLfloat) 0.844921, (GLfloat) - 0.202233, (GLfloat) 0.495188, + (GLfloat) 0.846624, (GLfloat) - 0.162790, (GLfloat) 0.506682, + (GLfloat) 0.967461, (GLfloat) - 0.195075, (GLfloat) 0.161136, + (GLfloat) 0.965076, (GLfloat) - 0.210256, (GLfloat) 0.156272, + (GLfloat) 0.933716, (GLfloat) - 0.317920, (GLfloat) 0.164623, + (GLfloat) 0.928870, (GLfloat) - 0.334244, (GLfloat) 0.159632, + (GLfloat) 0.801028, (GLfloat) - 0.328506, (GLfloat) 0.500438, + (GLfloat) 0.805814, (GLfloat) - 0.302226, (GLfloat) 0.509238, + (GLfloat) 0.844921, (GLfloat) - 0.202233, (GLfloat) - 0.495188, + (GLfloat) 0.846624, (GLfloat) - 0.162790, (GLfloat) - 0.506682, + (GLfloat) 0.805814, (GLfloat) - 0.302226, (GLfloat) - 0.509238, + (GLfloat) 0.801028, (GLfloat) - 0.328507, (GLfloat) - 0.500438, + (GLfloat) 0.933716, (GLfloat) - 0.317920, (GLfloat) - 0.164623, + (GLfloat) 0.928870, (GLfloat) - 0.334244, (GLfloat) - 0.159632, + (GLfloat) 0.965076, (GLfloat) - 0.210256, (GLfloat) - 0.156272, + (GLfloat) 0.967461, (GLfloat) - 0.195075, (GLfloat) - 0.161136, + (GLfloat) 0.116677, (GLfloat) - 0.971600, (GLfloat) - 0.205866, + (GLfloat) 0.095439, (GLfloat) - 0.979375, (GLfloat) - 0.178092, + (GLfloat) 0.145951, (GLfloat) - 0.986885, (GLfloat) - 0.068965, + (GLfloat) 0.134470, (GLfloat) - 0.988213, (GLfloat) - 0.073162, + (GLfloat) 0.572548, (GLfloat) - 0.810794, (GLfloat) - 0.121664, + (GLfloat) 0.603894, (GLfloat) - 0.784891, (GLfloat) - 0.138773, + (GLfloat) 0.437036, (GLfloat) - 0.822210, (GLfloat) - 0.364650, + (GLfloat) 0.472429, (GLfloat) - 0.800503, (GLfloat) - 0.368789, + (GLfloat) 0.095438, (GLfloat) - 0.979375, (GLfloat) 0.178092, + (GLfloat) 0.116677, (GLfloat) - 0.971600, (GLfloat) 0.205866, + (GLfloat) 0.472430, (GLfloat) - 0.800503, (GLfloat) 0.368789, + (GLfloat) 0.437036, (GLfloat) - 0.822210, (GLfloat) 0.364650, + (GLfloat) 0.603894, (GLfloat) - 0.784891, (GLfloat) 0.138773, + (GLfloat) 0.572548, (GLfloat) - 0.810794, (GLfloat) 0.121664, + (GLfloat) 0.134470, (GLfloat) - 0.988213, (GLfloat) 0.073162, + (GLfloat) 0.145951, (GLfloat) - 0.986885, (GLfloat) 0.068965, + (GLfloat) 0.531733, (GLfloat) - 0.073239, (GLfloat) - 0.843739, + (GLfloat) 0.511681, (GLfloat) - 0.104754, (GLfloat) - 0.852766, + (GLfloat) 0.176179, (GLfloat) 0.024438, (GLfloat) - 0.984055, + (GLfloat) 0.188717, (GLfloat) 0.040307, (GLfloat) - 0.981204, + (GLfloat) 0.150895, (GLfloat) - 0.104293, (GLfloat) - 0.983033, + (GLfloat) 0.147932, (GLfloat) - 0.109363, (GLfloat) - 0.982932, + (GLfloat) 0.481880, (GLfloat) - 0.227373, (GLfloat) - 0.846223, + (GLfloat) 0.480166, (GLfloat) - 0.230321, (GLfloat) - 0.846400, + (GLfloat) - 0.443443, (GLfloat) 0.349023, (GLfloat) - 0.825555, + (GLfloat) - 0.447255, (GLfloat) 0.345654, (GLfloat) - 0.824916, + (GLfloat) - 0.494732, (GLfloat) 0.167751, (GLfloat) - 0.852701, + (GLfloat) - 0.499143, (GLfloat) 0.160727, (GLfloat) - 0.851483, + (GLfloat) - 0.167121, (GLfloat) 0.020158, (GLfloat) - 0.985730, + (GLfloat) - 0.166487, (GLfloat) 0.021208, (GLfloat) - 0.985815, + (GLfloat) - 0.129817, (GLfloat) 0.178023, (GLfloat) - 0.975426, + (GLfloat) - 0.132948, (GLfloat) 0.174752, (GLfloat) - 0.975595, + (GLfloat) - 0.353563, (GLfloat) - 0.901143, (GLfloat) - 0.250869, + (GLfloat) - 0.351628, (GLfloat) - 0.891347, (GLfloat) - 0.286110, + (GLfloat) - 0.232284, (GLfloat) - 0.920192, (GLfloat) - 0.315104, + (GLfloat) - 0.236990, (GLfloat) - 0.922714, (GLfloat) - 0.304029, + (GLfloat) - 0.244093, (GLfloat) - 0.592931, (GLfloat) - 0.767366, + (GLfloat) - 0.249996, (GLfloat) - 0.572960, (GLfloat) - 0.780525, + (GLfloat) - 0.510472, (GLfloat) - 0.553764, (GLfloat) - 0.657848, + (GLfloat) - 0.520671, (GLfloat) - 0.533495, (GLfloat) - 0.666547, + (GLfloat) 0.010781, (GLfloat) - 0.964447, (GLfloat) - 0.264055, + (GLfloat) 0.040104, (GLfloat) - 0.958098, (GLfloat) - 0.283621, + (GLfloat) 0.223629, (GLfloat) - 0.775786, (GLfloat) - 0.590040, + (GLfloat) 0.262682, (GLfloat) - 0.745474, (GLfloat) - 0.612590, + (GLfloat) 0.033849, (GLfloat) - 0.640593, (GLfloat) - 0.767134, + (GLfloat) 0.004138, (GLfloat) - 0.677809, (GLfloat) - 0.735226, + (GLfloat) - 0.092889, (GLfloat) - 0.948124, (GLfloat) - 0.304029, + (GLfloat) - 0.096449, (GLfloat) - 0.944143, (GLfloat) - 0.315104, + (GLfloat) - 0.719211, (GLfloat) 0.510808, (GLfloat) - 0.470968, + (GLfloat) - 0.720697, (GLfloat) 0.504519, (GLfloat) - 0.475454, + (GLfloat) - 0.811897, (GLfloat) 0.564936, (GLfloat) - 0.147209, + (GLfloat) - 0.813044, (GLfloat) 0.562871, (GLfloat) - 0.148783, + (GLfloat) - 0.910433, (GLfloat) 0.380820, (GLfloat) - 0.161519, + (GLfloat) - 0.907768, (GLfloat) 0.388545, (GLfloat) - 0.158079, + (GLfloat) - 0.804000, (GLfloat) 0.309508, (GLfloat) - 0.507729, + (GLfloat) - 0.801647, (GLfloat) 0.326768, (GLfloat) - 0.500584, + (GLfloat) - 0.720697, (GLfloat) 0.504519, (GLfloat) 0.475454, + (GLfloat) - 0.719210, (GLfloat) 0.510808, (GLfloat) 0.470968, + (GLfloat) - 0.804000, (GLfloat) 0.309509, (GLfloat) 0.507729, + (GLfloat) - 0.801647, (GLfloat) 0.326768, (GLfloat) 0.500585, + (GLfloat) - 0.907768, (GLfloat) 0.388545, (GLfloat) 0.158079, + (GLfloat) - 0.910433, (GLfloat) 0.380820, (GLfloat) 0.161519, + (GLfloat) - 0.811897, (GLfloat) 0.564936, (GLfloat) 0.147209, + (GLfloat) - 0.813044, (GLfloat) 0.562871, (GLfloat) 0.148783, + (GLfloat) - 0.441947, (GLfloat) - 0.873099, (GLfloat) 0.205867, + (GLfloat) - 0.424648, (GLfloat) - 0.887670, (GLfloat) 0.178091, + (GLfloat) - 0.474684, (GLfloat) - 0.877450, (GLfloat) 0.068965, + (GLfloat) - 0.464350, (GLfloat) - 0.882625, (GLfloat) 0.073162, + (GLfloat) - 0.909934, (GLfloat) - 0.390292, (GLfloat) 0.140328, + (GLfloat) - 0.923715, (GLfloat) - 0.349249, (GLfloat) 0.157405, + (GLfloat) - 0.775101, (GLfloat) - 0.483039, (GLfloat) 0.407299, + (GLfloat) - 0.785487, (GLfloat) - 0.436754, (GLfloat) 0.438470, + (GLfloat) - 0.424649, (GLfloat) - 0.887669, (GLfloat) - 0.178092, + (GLfloat) - 0.441947, (GLfloat) - 0.873099, (GLfloat) - 0.205866, + (GLfloat) - 0.775100, (GLfloat) - 0.483039, (GLfloat) - 0.407299, + (GLfloat) - 0.785487, (GLfloat) - 0.436754, (GLfloat) - 0.438470, + (GLfloat) - 0.923715, (GLfloat) - 0.349249, (GLfloat) - 0.157405, + (GLfloat) - 0.909934, (GLfloat) - 0.390292, (GLfloat) - 0.140328, + (GLfloat) - 0.464350, (GLfloat) - 0.882625, (GLfloat) - 0.073162, + (GLfloat) - 0.474684, (GLfloat) - 0.877450, (GLfloat) - 0.068965, + (GLfloat) - 0.447255, (GLfloat) 0.345654, (GLfloat) 0.824916, + (GLfloat) - 0.443443, (GLfloat) 0.349023, (GLfloat) 0.825555, + (GLfloat) - 0.129817, (GLfloat) 0.178023, (GLfloat) 0.975426, + (GLfloat) - 0.132949, (GLfloat) 0.174752, (GLfloat) 0.975595, + (GLfloat) - 0.166487, (GLfloat) 0.021208, (GLfloat) 0.985815, + (GLfloat) - 0.167121, (GLfloat) 0.020158, (GLfloat) 0.985730, + (GLfloat) - 0.494732, (GLfloat) 0.167753, (GLfloat) 0.852701, + (GLfloat) - 0.499144, (GLfloat) 0.160728, (GLfloat) 0.851482, + (GLfloat) 0.531733, (GLfloat) - 0.073239, (GLfloat) 0.843739, + (GLfloat) 0.511681, (GLfloat) - 0.104754, (GLfloat) 0.852765, + (GLfloat) 0.480166, (GLfloat) - 0.230321, (GLfloat) 0.846400, + (GLfloat) 0.481881, (GLfloat) - 0.227371, (GLfloat) 0.846223, + (GLfloat) 0.150895, (GLfloat) - 0.104294, (GLfloat) 0.983033, + (GLfloat) 0.147933, (GLfloat) - 0.109363, (GLfloat) 0.982932, + (GLfloat) 0.188717, (GLfloat) 0.040307, (GLfloat) 0.981204, + (GLfloat) 0.176179, (GLfloat) 0.024438, (GLfloat) 0.984055, + (GLfloat) 0.040104, (GLfloat) - 0.958098, (GLfloat) 0.283620, + (GLfloat) 0.010781, (GLfloat) - 0.964447, (GLfloat) 0.264055, + (GLfloat) - 0.096449, (GLfloat) - 0.944143, (GLfloat) 0.315104, + (GLfloat) - 0.092889, (GLfloat) - 0.948124, (GLfloat) 0.304029, + (GLfloat) 0.004138, (GLfloat) - 0.677808, (GLfloat) 0.735227, + (GLfloat) 0.033849, (GLfloat) - 0.640593, (GLfloat) 0.767135, + (GLfloat) 0.223629, (GLfloat) - 0.775785, (GLfloat) 0.590040, + (GLfloat) 0.262682, (GLfloat) - 0.745474, (GLfloat) 0.612591, + (GLfloat) - 0.353563, (GLfloat) - 0.901143, (GLfloat) 0.250868, + (GLfloat) - 0.351627, (GLfloat) - 0.891347, (GLfloat) 0.286109, + (GLfloat) - 0.510472, (GLfloat) - 0.553764, (GLfloat) 0.657848, + (GLfloat) - 0.520671, (GLfloat) - 0.533495, (GLfloat) 0.666547, + (GLfloat) - 0.249996, (GLfloat) - 0.572959, (GLfloat) 0.780525, + (GLfloat) - 0.244093, (GLfloat) - 0.592931, (GLfloat) 0.767367, + (GLfloat) - 0.236991, (GLfloat) - 0.922714, (GLfloat) 0.304029, + (GLfloat) - 0.232284, (GLfloat) - 0.920192, (GLfloat) 0.315104, + (GLfloat) - 0.036947, (GLfloat) - 0.991593, (GLfloat) - 0.124011, + (GLfloat) - 0.048560, (GLfloat) - 0.989545, (GLfloat) - 0.135802, + (GLfloat) - 0.129266, (GLfloat) - 0.985532, (GLfloat) - 0.109621, + (GLfloat) - 0.133311, (GLfloat) - 0.984414, (GLfloat) - 0.114709, + (GLfloat) - 0.143769, (GLfloat) - 0.989058, (GLfloat) - 0.033079, + (GLfloat) - 0.140897, (GLfloat) - 0.989565, (GLfloat) - 0.030163, + (GLfloat) - 0.064478, (GLfloat) - 0.996956, (GLfloat) - 0.043834, + (GLfloat) - 0.059398, (GLfloat) - 0.997446, (GLfloat) - 0.039656, + (GLfloat) - 0.292813, (GLfloat) - 0.946477, (GLfloat) - 0.135802, + (GLfloat) - 0.304426, (GLfloat) - 0.944429, (GLfloat) - 0.124011, + (GLfloat) - 0.280390, (GLfloat) - 0.958885, (GLfloat) - 0.043834, + (GLfloat) - 0.285331, (GLfloat) - 0.957608, (GLfloat) - 0.039656, + (GLfloat) - 0.206051, (GLfloat) - 0.978076, (GLfloat) - 0.030163, + (GLfloat) - 0.203179, (GLfloat) - 0.978583, (GLfloat) - 0.033079, + (GLfloat) - 0.215602, (GLfloat) - 0.970309, (GLfloat) - 0.109621, + (GLfloat) - 0.211418, (GLfloat) - 0.970641, (GLfloat) - 0.114709, + (GLfloat) - 0.304426, (GLfloat) - 0.944429, (GLfloat) 0.124011, + (GLfloat) - 0.292813, (GLfloat) - 0.946477, (GLfloat) 0.135803, + (GLfloat) - 0.215602, (GLfloat) - 0.970309, (GLfloat) 0.109621, + (GLfloat) - 0.211418, (GLfloat) - 0.970641, (GLfloat) 0.114709, + (GLfloat) - 0.203179, (GLfloat) - 0.978583, (GLfloat) 0.033079, + (GLfloat) - 0.206051, (GLfloat) - 0.978076, (GLfloat) 0.030163, + (GLfloat) - 0.280390, (GLfloat) - 0.958885, (GLfloat) 0.043834, + (GLfloat) - 0.285331, (GLfloat) - 0.957608, (GLfloat) 0.039656, + (GLfloat) - 0.048560, (GLfloat) - 0.989545, (GLfloat) 0.135802, + (GLfloat) - 0.036947, (GLfloat) - 0.991593, (GLfloat) 0.124011, + (GLfloat) - 0.064478, (GLfloat) - 0.996956, (GLfloat) 0.043834, + (GLfloat) - 0.059398, (GLfloat) - 0.997446, (GLfloat) 0.039656, + (GLfloat) - 0.140897, (GLfloat) - 0.989565, (GLfloat) 0.030163, + (GLfloat) - 0.143769, (GLfloat) - 0.989058, (GLfloat) 0.033079, + (GLfloat) - 0.129266, (GLfloat) - 0.985532, (GLfloat) 0.109621, + (GLfloat) - 0.133311, (GLfloat) - 0.984414, (GLfloat) 0.114709, +}; + +static unsigned short int s1_3_POLS[] = +{ + 3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1, + 3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1, + 3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1, + 3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 24, 93, 85, 1, 3, 24, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 28, 80, 79, 1, 3, 28, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, + 3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1, + 3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1, + 3, 113, 17, 110, 1, 3, 110, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1, +3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1, + 3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1, + 3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1, + 3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1, + 3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 127, 37, 128, 1, 3, 128, 122, 127, 1, + 3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 123, 36, 130, 1, 3, 130, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 113, 32, 119, 1, 3, 119, 112, 113, 1, + 3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 128, 37, 131, 1, 3, 131, 112, 128, 1, + 3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1, +3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, + 3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1, + 3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1, + 3, 141, 19, 130, 1, 3, 130, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, + 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1, + 3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1, + 3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1, + 3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1, + 3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1, + 3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1, + 3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1, +3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1, + 3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1, + 3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1, + 3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1, + 3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1, + 3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1, + 3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1, + 3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1, + 3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1, + 3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1, + 3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1, + 3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1, + 3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1, +3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1, + 3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1, + 3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1, + 3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1, +3, 3, 203, 197, 1, 3, 3, 197, 206, 1, 3, 203, 55, 204, 1, 3, 204, 197, 203, 1, + 3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1, + 3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1, + 3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 55, 208, 172, 1, 3, 55, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, + 3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1, + 3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1, + 3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1, + 3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1, + 3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1, + 3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1, + 3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1, + 3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1, + 3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1, + 3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1, + 3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 60, 229, 179, 1, 3, 60, 179, 228, 1, + 3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1, +3, 2, 231, 223, 1, 3, 2, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1, + 3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 229, 60, 233, 1, 3, 233, 223, 229, 1, +3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 233, 60, 234, 1, 3, 234, 232, 233, 1, + 3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1, + 3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1, + 3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1, +3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1, + 3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1, +3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1, + 3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 239, 55, 203, 1, 3, 203, 202, 239, 1, + 3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1, + 3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1, + 3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1, + 3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 65, 253, 247, 1, 3, 65, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 68, 244, 243, 1, 3, 68, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, + 3, 246, 3, 206, 1, 3, 206, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1, + 3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1, +3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1, + 3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1, + 3, 267, 5, 264, 1, 3, 264, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, +3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1, +3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1, + 3, 58, 270, 213, 1, 3, 58, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1, +3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1, + 3, 58, 269, 218, 1, 3, 58, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1, + 3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, +3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1, + 3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1, + 3, 231, 2, 245, 1, 3, 245, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1, + 3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1, +3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, + 3, 285, 6, 278, 1, 3, 278, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_3 = +{ + 290, /* number of points */ + s1_3_PNTS, s1_3_normals, s1_3_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_3.c */ diff --git a/hacks/glx/s1_4.c b/hacks/glx/s1_4.c new file mode 100644 index 00000000..46e19cc2 --- /dev/null +++ b/hacks/glx/s1_4.c @@ -0,0 +1,1057 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_4.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_4" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_4_PNTS[] = +{ + (GLfloat) 0.691977, (GLfloat) 0.424648, (GLfloat) - 0.335934, + (GLfloat) 0.691977, (GLfloat) 0.424648, (GLfloat) - 0.664066, + (GLfloat) 0.910107, (GLfloat) 0.206343, (GLfloat) - 0.335934, + (GLfloat) 0.910107, (GLfloat) 0.206343, (GLfloat) - 0.664066, + (GLfloat) 0.820528, (GLfloat) 0.154011, (GLfloat) - 0.638667, + (GLfloat) 0.608078, (GLfloat) 0.332278, (GLfloat) - 0.638667, + (GLfloat) 0.608078, (GLfloat) 0.332278, (GLfloat) - 0.361333, + (GLfloat) 0.820528, (GLfloat) 0.154011, (GLfloat) - 0.361333, + (GLfloat) 1.065609, (GLfloat) 0.289676, (GLfloat) - 0.638205, + (GLfloat) 1.074101, (GLfloat) 0.505017, (GLfloat) - 0.638205, + (GLfloat) 1.074101, (GLfloat) 0.505017, (GLfloat) - 0.361795, + (GLfloat) 1.065609, (GLfloat) 0.289676, (GLfloat) - 0.361795, + (GLfloat) 1.235562, (GLfloat) 0.083949, (GLfloat) - 0.664066, + (GLfloat) 1.235562, (GLfloat) 0.083949, (GLfloat) - 0.335934, + (GLfloat) 1.331736, (GLfloat) 0.017726, (GLfloat) - 0.361333, + (GLfloat) 1.331736, (GLfloat) 0.017726, (GLfloat) - 0.638667, + (GLfloat) 1.431839, (GLfloat) 0.331232, (GLfloat) - 0.335934, + (GLfloat) 1.517309, (GLfloat) 0.223825, (GLfloat) - 0.361333, + (GLfloat) 1.431839, (GLfloat) 0.331232, (GLfloat) - 0.664066, + (GLfloat) 1.517309, (GLfloat) 0.223825, (GLfloat) - 0.638667, + (GLfloat) 1.243033, (GLfloat) - 0.034453, (GLfloat) - 0.500000, + (GLfloat) 1.136909, (GLfloat) 0.161755, (GLfloat) - 0.500000, + (GLfloat) 1.199875, (GLfloat) 0.038989, (GLfloat) - 0.500000, + (GLfloat) 1.400739, (GLfloat) 0.142695, (GLfloat) - 0.261940, + (GLfloat) 1.284897, (GLfloat) 0.013483, (GLfloat) - 0.325812, + (GLfloat) 1.438241, (GLfloat) 0.108423, (GLfloat) - 0.500000, + (GLfloat) 1.310688, (GLfloat) - 0.015661, (GLfloat) - 0.500000, + (GLfloat) 1.400739, (GLfloat) 0.142695, (GLfloat) - 0.738060, + (GLfloat) 1.284897, (GLfloat) 0.013483, (GLfloat) - 0.674188, + (GLfloat) 1.216443, (GLfloat) 0.317256, (GLfloat) - 0.300040, + (GLfloat) 1.333700, (GLfloat) 0.207591, (GLfloat) - 0.276273, + (GLfloat) 1.558444, (GLfloat) 0.319842, (GLfloat) - 0.500000, + (GLfloat) 1.515677, (GLfloat) 0.272720, (GLfloat) - 0.325812, + (GLfloat) 1.429500, (GLfloat) 0.116294, (GLfloat) - 0.322437, + (GLfloat) 1.295978, (GLfloat) 0.472757, (GLfloat) - 0.500000, + (GLfloat) 1.467526, (GLfloat) 0.376193, (GLfloat) - 0.500000, + (GLfloat) 1.515677, (GLfloat) 0.272720, (GLfloat) - 0.674188, + (GLfloat) 1.548313, (GLfloat) 0.248248, (GLfloat) - 0.500000, + (GLfloat) 1.216443, (GLfloat) 0.317256, (GLfloat) - 0.699960, + (GLfloat) 1.333700, (GLfloat) 0.207591, (GLfloat) - 0.723727, + (GLfloat) 1.429500, (GLfloat) 0.116294, (GLfloat) - 0.677562, + (GLfloat) 1.158118, (GLfloat) 0.203222, (GLfloat) - 0.646637, + (GLfloat) 0.998811, (GLfloat) 0.235426, (GLfloat) - 0.500000, + (GLfloat) 1.064065, (GLfloat) 0.250523, (GLfloat) - 0.500000, + (GLfloat) 1.158118, (GLfloat) 0.203222, (GLfloat) - 0.353363, + (GLfloat) 1.274769, (GLfloat) 0.431290, (GLfloat) - 0.646637, + (GLfloat) 0.920924, (GLfloat) 0.379919, (GLfloat) - 0.699960, + (GLfloat) 1.069855, (GLfloat) 0.397346, (GLfloat) - 0.688461, + (GLfloat) 0.920924, (GLfloat) 0.379919, (GLfloat) - 0.300040, + (GLfloat) 1.069855, (GLfloat) 0.397346, (GLfloat) - 0.311539, + (GLfloat) 1.274769, (GLfloat) 0.431290, (GLfloat) - 0.353363, + (GLfloat) 0.843038, (GLfloat) 0.524412, (GLfloat) - 0.500000, + (GLfloat) 1.075645, (GLfloat) 0.544169, (GLfloat) - 0.500000, + (GLfloat) 0.735693, (GLfloat) 0.265534, (GLfloat) - 0.738060, + (GLfloat) 0.801042, (GLfloat) 0.315496, (GLfloat) - 0.723727, + (GLfloat) 0.978041, (GLfloat) 0.273957, (GLfloat) - 0.646637, + (GLfloat) 0.863808, (GLfloat) 0.485881, (GLfloat) - 0.646637, + (GLfloat) 0.863808, (GLfloat) 0.485881, (GLfloat) - 0.353363, + (GLfloat) 0.555594, (GLfloat) 0.419060, (GLfloat) - 0.500000, + (GLfloat) 0.652318, (GLfloat) 0.464340, (GLfloat) - 0.500000, + (GLfloat) 0.978041, (GLfloat) 0.273957, (GLfloat) - 0.353363, + (GLfloat) 0.735693, (GLfloat) 0.265534, (GLfloat) - 0.261940, + (GLfloat) 0.801042, (GLfloat) 0.315496, (GLfloat) - 0.276273, + (GLfloat) 0.915792, (GLfloat) 0.112008, (GLfloat) - 0.500000, + (GLfloat) 0.949767, (GLfloat) 0.166652, (GLfloat) - 0.500000, + (GLfloat) 0.867858, (GLfloat) 0.153664, (GLfloat) - 0.674188, + (GLfloat) 0.702437, (GLfloat) 0.229003, (GLfloat) - 0.500000, + (GLfloat) 0.846018, (GLfloat) 0.123878, (GLfloat) - 0.500000, + (GLfloat) 0.867858, (GLfloat) 0.153664, (GLfloat) - 0.325812, + (GLfloat) 0.604310, (GLfloat) 0.378335, (GLfloat) - 0.674188, + (GLfloat) 0.709997, (GLfloat) 0.238013, (GLfloat) - 0.677562, + (GLfloat) 0.604310, (GLfloat) 0.378335, (GLfloat) - 0.325812, + (GLfloat) 0.573976, (GLfloat) 0.352148, (GLfloat) - 0.500000, + (GLfloat) 0.709997, (GLfloat) 0.238013, (GLfloat) - 0.322437, + (GLfloat) 1.231827, (GLfloat) 0.004686, (GLfloat) - 0.594296, + (GLfloat) 1.178115, (GLfloat) 0.109780, (GLfloat) - 0.584482, + (GLfloat) 1.208797, (GLfloat) 0.050229, (GLfloat) - 0.589491, + (GLfloat) 1.231827, (GLfloat) 0.004686, (GLfloat) - 0.405704, + (GLfloat) 1.221734, (GLfloat) - 0.007055, (GLfloat) - 0.500000, + (GLfloat) 1.279887, (GLfloat) - 0.026194, (GLfloat) - 0.587500, + (GLfloat) 1.253444, (GLfloat) - 0.022303, (GLfloat) - 0.594949, + (GLfloat) 1.312568, (GLfloat) 0.098620, (GLfloat) - 0.720025, + (GLfloat) 1.262105, (GLfloat) 0.039911, (GLfloat) - 0.672877, + (GLfloat) 1.312568, (GLfloat) 0.098620, (GLfloat) - 0.279975, + (GLfloat) 1.262105, (GLfloat) 0.039911, (GLfloat) - 0.327123, + (GLfloat) 1.279887, (GLfloat) - 0.026194, (GLfloat) - 0.412500, + (GLfloat) 1.253444, (GLfloat) - 0.022303, (GLfloat) - 0.405051, + (GLfloat) 1.178115, (GLfloat) 0.109780, (GLfloat) - 0.415518, + (GLfloat) 1.208797, (GLfloat) 0.050229, (GLfloat) - 0.410509, + (GLfloat) 1.373428, (GLfloat) 0.045002, (GLfloat) - 0.409500, + (GLfloat) 1.317700, (GLfloat) - 0.004566, (GLfloat) - 0.417500, + (GLfloat) 1.270418, (GLfloat) - 0.038526, (GLfloat) - 0.500000, + (GLfloat) 1.359179, (GLfloat) 0.061869, (GLfloat) - 0.294000, + (GLfloat) 1.309178, (GLfloat) 0.008154, (GLfloat) - 0.339125, + (GLfloat) 1.359179, (GLfloat) 0.061869, (GLfloat) - 0.706000, + (GLfloat) 1.309178, (GLfloat) 0.008154, (GLfloat) - 0.660875, + (GLfloat) 1.373428, (GLfloat) 0.045002, (GLfloat) - 0.590500, + (GLfloat) 1.317700, (GLfloat) - 0.004566, (GLfloat) - 0.582500, + (GLfloat) 1.236552, (GLfloat) 0.195985, (GLfloat) - 0.302876, + (GLfloat) 1.280170, (GLfloat) 0.140150, (GLfloat) - 0.291188, + (GLfloat) 1.433681, (GLfloat) 0.239521, (GLfloat) - 0.279975, + (GLfloat) 1.373124, (GLfloat) 0.169070, (GLfloat) - 0.264259, + (GLfloat) 1.337615, (GLfloat) 0.072243, (GLfloat) - 0.277994, + (GLfloat) 1.514422, (GLfloat) 0.333454, (GLfloat) - 0.405704, + (GLfloat) 1.484144, (GLfloat) 0.298229, (GLfloat) - 0.327123, + (GLfloat) 1.476277, (GLfloat) 0.191919, (GLfloat) - 0.294000, + (GLfloat) 1.463411, (GLfloat) 0.213552, (GLfloat) - 0.277994, + (GLfloat) 1.324207, (GLfloat) 0.325294, (GLfloat) - 0.302876, + (GLfloat) 1.387230, (GLfloat) 0.275032, (GLfloat) - 0.291188, + (GLfloat) 1.494540, (GLfloat) 0.179511, (GLfloat) - 0.409500, + (GLfloat) 1.483059, (GLfloat) 0.179084, (GLfloat) - 0.335375, + (GLfloat) 1.418631, (GLfloat) 0.126081, (GLfloat) - 0.278500, + (GLfloat) 1.555568, (GLfloat) 0.279982, (GLfloat) - 0.412500, + (GLfloat) 1.524471, (GLfloat) 0.247261, (GLfloat) - 0.339125, + (GLfloat) 1.372652, (GLfloat) 0.056465, (GLfloat) - 0.335375, + (GLfloat) 1.382643, (GLfloat) 0.411500, (GLfloat) - 0.415518, + (GLfloat) 1.458604, (GLfloat) 0.364953, (GLfloat) - 0.410509, + (GLfloat) 1.514422, (GLfloat) 0.333454, (GLfloat) - 0.594296, + (GLfloat) 1.524515, (GLfloat) 0.345196, (GLfloat) - 0.500000, + (GLfloat) 1.547582, (GLfloat) 0.308099, (GLfloat) - 0.405051, + (GLfloat) 1.433681, (GLfloat) 0.239521, (GLfloat) - 0.720025, + (GLfloat) 1.484144, (GLfloat) 0.298229, (GLfloat) - 0.672877, + (GLfloat) 1.555568, (GLfloat) 0.279982, (GLfloat) - 0.587500, + (GLfloat) 1.547582, (GLfloat) 0.308099, (GLfloat) - 0.594949, + (GLfloat) 1.382643, (GLfloat) 0.411500, (GLfloat) - 0.584482, + (GLfloat) 1.458604, (GLfloat) 0.364953, (GLfloat) - 0.589491, + (GLfloat) 1.494540, (GLfloat) 0.179511, (GLfloat) - 0.590500, + (GLfloat) 1.538011, (GLfloat) 0.240115, (GLfloat) - 0.582500, + (GLfloat) 1.566843, (GLfloat) 0.290687, (GLfloat) - 0.500000, + (GLfloat) 1.476277, (GLfloat) 0.191919, (GLfloat) - 0.706000, + (GLfloat) 1.524471, (GLfloat) 0.247261, (GLfloat) - 0.660875, + (GLfloat) 1.538011, (GLfloat) 0.240115, (GLfloat) - 0.417500, + (GLfloat) 1.324207, (GLfloat) 0.325294, (GLfloat) - 0.697124, + (GLfloat) 1.387230, (GLfloat) 0.275032, (GLfloat) - 0.708812, + (GLfloat) 1.373124, (GLfloat) 0.169070, (GLfloat) - 0.735741, + (GLfloat) 1.463411, (GLfloat) 0.213552, (GLfloat) - 0.722006, + (GLfloat) 1.337615, (GLfloat) 0.072243, (GLfloat) - 0.722006, + (GLfloat) 1.236552, (GLfloat) 0.195985, (GLfloat) - 0.697124, + (GLfloat) 1.280170, (GLfloat) 0.140150, (GLfloat) - 0.708812, + (GLfloat) 1.372652, (GLfloat) 0.056465, (GLfloat) - 0.664625, + (GLfloat) 1.418631, (GLfloat) 0.126081, (GLfloat) - 0.721500, + (GLfloat) 1.483059, (GLfloat) 0.179084, (GLfloat) - 0.664625, + (GLfloat) 1.436048, (GLfloat) 0.110398, (GLfloat) - 0.402250, + (GLfloat) 1.370641, (GLfloat) 0.037756, (GLfloat) - 0.500000, + (GLfloat) 1.501456, (GLfloat) 0.183040, (GLfloat) - 0.500000, + (GLfloat) 1.436048, (GLfloat) 0.110398, (GLfloat) - 0.597750, + (GLfloat) 1.200029, (GLfloat) 0.142107, (GLfloat) - 0.654883, + (GLfloat) 1.103513, (GLfloat) 0.226037, (GLfloat) - 0.576713, + (GLfloat) 1.142211, (GLfloat) 0.172121, (GLfloat) - 0.579984, + (GLfloat) 1.170811, (GLfloat) 0.099004, (GLfloat) - 0.500000, + (GLfloat) 1.027452, (GLfloat) 0.263727, (GLfloat) - 0.576713, + (GLfloat) 1.064451, (GLfloat) 0.260311, (GLfloat) - 0.575384, + (GLfloat) 1.103513, (GLfloat) 0.226037, (GLfloat) - 0.423287, + (GLfloat) 1.100538, (GLfloat) 0.216006, (GLfloat) - 0.500000, + (GLfloat) 1.127320, (GLfloat) 0.306289, (GLfloat) - 0.678998, + (GLfloat) 1.112441, (GLfloat) 0.256132, (GLfloat) - 0.640641, + (GLfloat) 1.127320, (GLfloat) 0.306289, (GLfloat) - 0.321002, + (GLfloat) 1.112441, (GLfloat) 0.256132, (GLfloat) - 0.359359, + (GLfloat) 1.142211, (GLfloat) 0.172121, (GLfloat) - 0.420016, + (GLfloat) 1.027452, (GLfloat) 0.263727, (GLfloat) - 0.423287, + (GLfloat) 1.064451, (GLfloat) 0.260311, (GLfloat) - 0.424615, + (GLfloat) 1.200029, (GLfloat) 0.142107, (GLfloat) - 0.345117, + (GLfloat) 1.360730, (GLfloat) 0.379173, (GLfloat) - 0.654883, + (GLfloat) 1.163029, (GLfloat) 0.426667, (GLfloat) - 0.678998, + (GLfloat) 1.248257, (GLfloat) 0.379456, (GLfloat) - 0.686629, + (GLfloat) 1.280379, (GLfloat) 0.260640, (GLfloat) - 0.711204, + (GLfloat) 0.979330, (GLfloat) 0.456830, (GLfloat) - 0.678998, + (GLfloat) 1.072171, (GLfloat) 0.456076, (GLfloat) - 0.675897, + (GLfloat) 1.145175, (GLfloat) 0.366478, (GLfloat) - 0.691783, + (GLfloat) 1.186836, (GLfloat) 0.506919, (GLfloat) - 0.576713, + (GLfloat) 1.177908, (GLfloat) 0.476825, (GLfloat) - 0.640641, + (GLfloat) 1.184630, (GLfloat) 0.255055, (GLfloat) - 0.686629, + (GLfloat) 1.008203, (GLfloat) 0.340968, (GLfloat) - 0.678998, + (GLfloat) 1.067539, (GLfloat) 0.338617, (GLfloat) - 0.675897, + (GLfloat) 1.280379, (GLfloat) 0.260640, (GLfloat) - 0.288796, + (GLfloat) 1.163029, (GLfloat) 0.426667, (GLfloat) - 0.321002, + (GLfloat) 1.248257, (GLfloat) 0.379456, (GLfloat) - 0.313371, + (GLfloat) 1.360730, (GLfloat) 0.379173, (GLfloat) - 0.345117, + (GLfloat) 1.184630, (GLfloat) 0.255055, (GLfloat) - 0.313371, + (GLfloat) 1.008203, (GLfloat) 0.340968, (GLfloat) - 0.321002, + (GLfloat) 1.067539, (GLfloat) 0.338617, (GLfloat) - 0.324103, + (GLfloat) 1.145175, (GLfloat) 0.366478, (GLfloat) - 0.308217, + (GLfloat) 1.186836, (GLfloat) 0.506919, (GLfloat) - 0.423287, + (GLfloat) 1.177908, (GLfloat) 0.476825, (GLfloat) - 0.359359, + (GLfloat) 0.979330, (GLfloat) 0.456830, (GLfloat) - 0.321002, + (GLfloat) 1.072171, (GLfloat) 0.456076, (GLfloat) - 0.324103, + (GLfloat) 1.389948, (GLfloat) 0.422275, (GLfloat) - 0.500000, + (GLfloat) 1.290676, (GLfloat) 0.462390, (GLfloat) - 0.579984, + (GLfloat) 1.290676, (GLfloat) 0.462390, (GLfloat) - 0.420016, + (GLfloat) 0.960081, (GLfloat) 0.534071, (GLfloat) - 0.423287, + (GLfloat) 1.075259, (GLfloat) 0.534381, (GLfloat) - 0.424615, + (GLfloat) 1.189812, (GLfloat) 0.516951, (GLfloat) - 0.500000, + (GLfloat) 0.960081, (GLfloat) 0.534071, (GLfloat) - 0.576713, + (GLfloat) 1.075259, (GLfloat) 0.534381, (GLfloat) - 0.575384, + (GLfloat) 0.808756, (GLfloat) 0.407522, (GLfloat) - 0.697124, + (GLfloat) 0.693423, (GLfloat) 0.349037, (GLfloat) - 0.720025, + (GLfloat) 0.741552, (GLfloat) 0.375033, (GLfloat) - 0.708812, + (GLfloat) 0.901933, (GLfloat) 0.290859, (GLfloat) - 0.697124, + (GLfloat) 0.855345, (GLfloat) 0.349190, (GLfloat) - 0.711204, + (GLfloat) 0.889770, (GLfloat) 0.437716, (GLfloat) - 0.686629, + (GLfloat) 0.746638, (GLfloat) 0.485298, (GLfloat) - 0.584482, + (GLfloat) 0.769932, (GLfloat) 0.456132, (GLfloat) - 0.654883, + (GLfloat) 0.964051, (GLfloat) 0.213083, (GLfloat) - 0.584482, + (GLfloat) 0.940757, (GLfloat) 0.242249, (GLfloat) - 0.654883, + (GLfloat) 0.952079, (GLfloat) 0.322122, (GLfloat) - 0.686629, + (GLfloat) 0.830643, (GLfloat) 0.226200, (GLfloat) - 0.720025, + (GLfloat) 0.860532, (GLfloat) 0.255958, (GLfloat) - 0.708812, + (GLfloat) 0.993766, (GLfloat) 0.398899, (GLfloat) - 0.691783, + (GLfloat) 1.020234, (GLfloat) 0.292692, (GLfloat) - 0.640641, + (GLfloat) 0.967299, (GLfloat) 0.505105, (GLfloat) - 0.640641, + (GLfloat) 0.848231, (GLfloat) 0.514780, (GLfloat) - 0.579984, + (GLfloat) 0.746638, (GLfloat) 0.485298, (GLfloat) - 0.415518, + (GLfloat) 0.738873, (GLfloat) 0.495020, (GLfloat) - 0.500000, + (GLfloat) 0.601944, (GLfloat) 0.430927, (GLfloat) - 0.594296, + (GLfloat) 0.662233, (GLfloat) 0.454417, (GLfloat) - 0.589491, + (GLfloat) 0.957675, (GLfloat) 0.543726, (GLfloat) - 0.500000, + (GLfloat) 0.967299, (GLfloat) 0.505105, (GLfloat) - 0.359359, + (GLfloat) 0.848231, (GLfloat) 0.514780, (GLfloat) - 0.420016, + (GLfloat) 0.601944, (GLfloat) 0.430927, (GLfloat) - 0.405704, + (GLfloat) 0.662233, (GLfloat) 0.454417, (GLfloat) - 0.410509, + (GLfloat) 0.808756, (GLfloat) 0.407522, (GLfloat) - 0.302876, + (GLfloat) 0.769932, (GLfloat) 0.456132, (GLfloat) - 0.345117, + (GLfloat) 0.889770, (GLfloat) 0.437716, (GLfloat) - 0.313371, + (GLfloat) 0.901933, (GLfloat) 0.290859, (GLfloat) - 0.302876, + (GLfloat) 0.855345, (GLfloat) 0.349190, (GLfloat) - 0.288796, + (GLfloat) 0.693423, (GLfloat) 0.349037, (GLfloat) - 0.279975, + (GLfloat) 0.741552, (GLfloat) 0.375033, (GLfloat) - 0.291188, + (GLfloat) 0.993766, (GLfloat) 0.398899, (GLfloat) - 0.308217, + (GLfloat) 1.020234, (GLfloat) 0.292692, (GLfloat) - 0.359359, + (GLfloat) 0.952079, (GLfloat) 0.322122, (GLfloat) - 0.313371, + (GLfloat) 0.830643, (GLfloat) 0.226200, (GLfloat) - 0.279975, + (GLfloat) 0.860532, (GLfloat) 0.255958, (GLfloat) - 0.291188, + (GLfloat) 0.964051, (GLfloat) 0.213083, (GLfloat) - 0.415518, + (GLfloat) 0.940757, (GLfloat) 0.242249, (GLfloat) - 0.345117, + (GLfloat) 0.993618, (GLfloat) 0.245059, (GLfloat) - 0.420016, + (GLfloat) 0.971816, (GLfloat) 0.203361, (GLfloat) - 0.500000, + (GLfloat) 0.922122, (GLfloat) 0.144310, (GLfloat) - 0.405704, + (GLfloat) 0.939852, (GLfloat) 0.176575, (GLfloat) - 0.410509, + (GLfloat) 1.029858, (GLfloat) 0.254072, (GLfloat) - 0.500000, + (GLfloat) 0.993618, (GLfloat) 0.245059, (GLfloat) - 0.579984, + (GLfloat) 0.922122, (GLfloat) 0.144310, (GLfloat) - 0.594296, + (GLfloat) 0.939852, (GLfloat) 0.176575, (GLfloat) - 0.589491, + (GLfloat) 0.933557, (GLfloat) 0.134073, (GLfloat) - 0.500000, + (GLfloat) 0.877985, (GLfloat) 0.117734, (GLfloat) - 0.412500, + (GLfloat) 0.903840, (GLfloat) 0.122594, (GLfloat) - 0.405051, + (GLfloat) 0.887817, (GLfloat) 0.175019, (GLfloat) - 0.327123, + (GLfloat) 0.887817, (GLfloat) 0.175019, (GLfloat) - 0.672877, + (GLfloat) 0.877985, (GLfloat) 0.117734, (GLfloat) - 0.587500, + (GLfloat) 0.903840, (GLfloat) 0.122594, (GLfloat) - 0.594949, + (GLfloat) 0.775446, (GLfloat) 0.175219, (GLfloat) - 0.590500, + (GLfloat) 0.837530, (GLfloat) 0.133890, (GLfloat) - 0.582500, + (GLfloat) 0.889078, (GLfloat) 0.106840, (GLfloat) - 0.500000, + (GLfloat) 0.787209, (GLfloat) 0.193905, (GLfloat) - 0.706000, + (GLfloat) 0.844199, (GLfloat) 0.147671, (GLfloat) - 0.660875, + (GLfloat) 0.787209, (GLfloat) 0.193905, (GLfloat) - 0.294000, + (GLfloat) 0.844199, (GLfloat) 0.147671, (GLfloat) - 0.339125, + (GLfloat) 0.775446, (GLfloat) 0.175219, (GLfloat) - 0.409500, + (GLfloat) 0.837530, (GLfloat) 0.133890, (GLfloat) - 0.417500, + (GLfloat) 0.762033, (GLfloat) 0.287619, (GLfloat) - 0.735741, + (GLfloat) 0.807717, (GLfloat) 0.204533, (GLfloat) - 0.722006, + (GLfloat) 0.636249, (GLfloat) 0.400218, (GLfloat) - 0.672877, + (GLfloat) 0.653151, (GLfloat) 0.306393, (GLfloat) - 0.706000, + (GLfloat) 0.664060, (GLfloat) 0.327000, (GLfloat) - 0.722006, + (GLfloat) 0.636792, (GLfloat) 0.291564, (GLfloat) - 0.590500, + (GLfloat) 0.648221, (GLfloat) 0.292739, (GLfloat) - 0.664625, + (GLfloat) 0.719399, (GLfloat) 0.249218, (GLfloat) - 0.721500, + (GLfloat) 0.562375, (GLfloat) 0.382563, (GLfloat) - 0.587500, + (GLfloat) 0.597724, (GLfloat) 0.354488, (GLfloat) - 0.660875, + (GLfloat) 0.774619, (GLfloat) 0.186679, (GLfloat) - 0.664625, + (GLfloat) 0.590509, (GLfloat) 0.441164, (GLfloat) - 0.500000, + (GLfloat) 0.567937, (GLfloat) 0.408940, (GLfloat) - 0.594949, + (GLfloat) 0.636249, (GLfloat) 0.400218, (GLfloat) - 0.327123, + (GLfloat) 0.562375, (GLfloat) 0.382563, (GLfloat) - 0.412500, + (GLfloat) 0.567937, (GLfloat) 0.408940, (GLfloat) - 0.405051, + (GLfloat) 0.636792, (GLfloat) 0.291564, (GLfloat) - 0.409500, + (GLfloat) 0.585310, (GLfloat) 0.345528, (GLfloat) - 0.417500, + (GLfloat) 0.549720, (GLfloat) 0.391595, (GLfloat) - 0.500000, + (GLfloat) 0.653151, (GLfloat) 0.306393, (GLfloat) - 0.294000, + (GLfloat) 0.597724, (GLfloat) 0.354488, (GLfloat) - 0.339125, + (GLfloat) 0.585310, (GLfloat) 0.345528, (GLfloat) - 0.582500, + (GLfloat) 0.762033, (GLfloat) 0.287619, (GLfloat) - 0.264259, + (GLfloat) 0.664060, (GLfloat) 0.327000, (GLfloat) - 0.277994, + (GLfloat) 0.807717, (GLfloat) 0.204533, (GLfloat) - 0.277994, + (GLfloat) 0.774619, (GLfloat) 0.186679, (GLfloat) - 0.335375, + (GLfloat) 0.719399, (GLfloat) 0.249218, (GLfloat) - 0.278500, + (GLfloat) 0.648221, (GLfloat) 0.292739, (GLfloat) - 0.335375, + (GLfloat) 0.704334, (GLfloat) 0.231264, (GLfloat) - 0.597750, + (GLfloat) 0.779215, (GLfloat) 0.168431, (GLfloat) - 0.500000, + (GLfloat) 0.629453, (GLfloat) 0.294096, (GLfloat) - 0.500000, + (GLfloat) 0.704334, (GLfloat) 0.231264, (GLfloat) - 0.402250, +}; + +static GLfloat s1_4_normals[] = +{ + (GLfloat) - 0.797489, (GLfloat) - 0.388285, (GLfloat) - 0.461786, + (GLfloat) - 0.806184, (GLfloat) - 0.357959, (GLfloat) - 0.471096, + (GLfloat) - 0.893364, (GLfloat) - 0.424111, (GLfloat) - 0.148429, + (GLfloat) - 0.889195, (GLfloat) - 0.434532, (GLfloat) - 0.143226, + (GLfloat) - 0.778943, (GLfloat) - 0.605569, (GLfloat) - 0.162894, + (GLfloat) - 0.772426, (GLfloat) - 0.614820, (GLfloat) - 0.159231, + (GLfloat) - 0.666558, (GLfloat) - 0.549876, (GLfloat) - 0.503327, + (GLfloat) - 0.677911, (GLfloat) - 0.530666, (GLfloat) - 0.508753, + (GLfloat) - 0.797489, (GLfloat) - 0.388284, (GLfloat) 0.461786, + (GLfloat) - 0.806184, (GLfloat) - 0.357959, (GLfloat) 0.471097, + (GLfloat) - 0.677911, (GLfloat) - 0.530666, (GLfloat) 0.508753, + (GLfloat) - 0.666558, (GLfloat) - 0.549876, (GLfloat) 0.503327, + (GLfloat) - 0.778943, (GLfloat) - 0.605569, (GLfloat) 0.162893, + (GLfloat) - 0.772426, (GLfloat) - 0.614820, (GLfloat) 0.159231, + (GLfloat) - 0.889195, (GLfloat) - 0.434532, (GLfloat) 0.143226, + (GLfloat) - 0.893364, (GLfloat) - 0.424111, (GLfloat) 0.148429, + (GLfloat) 0.506235, (GLfloat) - 0.837464, (GLfloat) 0.205866, + (GLfloat) 0.527758, (GLfloat) - 0.830515, (GLfloat) 0.178091, + (GLfloat) 0.492576, (GLfloat) - 0.867532, (GLfloat) 0.068965, + (GLfloat) 0.502441, (GLfloat) - 0.861510, (GLfloat) 0.073162, + (GLfloat) - 0.106119, (GLfloat) - 0.984780, (GLfloat) 0.137644, + (GLfloat) - 0.145376, (GLfloat) - 0.977399, (GLfloat) 0.153482, + (GLfloat) 0.021131, (GLfloat) - 0.914284, (GLfloat) 0.404523, + (GLfloat) - 0.012401, (GLfloat) - 0.903702, (GLfloat) 0.427982, + (GLfloat) 0.527757, (GLfloat) - 0.830515, (GLfloat) - 0.178092, + (GLfloat) 0.506235, (GLfloat) - 0.837464, (GLfloat) - 0.205866, + (GLfloat) 0.021132, (GLfloat) - 0.914284, (GLfloat) - 0.404523, + (GLfloat) - 0.012401, (GLfloat) - 0.903702, (GLfloat) - 0.427983, + (GLfloat) - 0.145376, (GLfloat) - 0.977399, (GLfloat) - 0.153482, + (GLfloat) - 0.106119, (GLfloat) - 0.984780, (GLfloat) - 0.137645, + (GLfloat) 0.502441, (GLfloat) - 0.861510, (GLfloat) - 0.073162, + (GLfloat) 0.492576, (GLfloat) - 0.867532, (GLfloat) - 0.068965, + (GLfloat) - 0.548436, (GLfloat) - 0.209256, (GLfloat) 0.809586, + (GLfloat) - 0.557133, (GLfloat) - 0.173326, (GLfloat) 0.812134, + (GLfloat) - 0.281454, (GLfloat) 0.011196, (GLfloat) 0.959509, + (GLfloat) - 0.287811, (GLfloat) 0.033884, (GLfloat) 0.957087, + (GLfloat) - 0.161493, (GLfloat) - 0.079455, (GLfloat) 0.983670, + (GLfloat) - 0.160469, (GLfloat) - 0.081504, (GLfloat) 0.983670, + (GLfloat) - 0.417652, (GLfloat) - 0.317957, (GLfloat) 0.851158, + (GLfloat) - 0.412553, (GLfloat) - 0.327906, (GLfloat) 0.849869, + (GLfloat) 0.183686, (GLfloat) 0.514678, (GLfloat) 0.837476, + (GLfloat) 0.191133, (GLfloat) 0.514047, (GLfloat) 0.836196, + (GLfloat) 0.305019, (GLfloat) 0.420960, (GLfloat) 0.854258, + (GLfloat) 0.309443, (GLfloat) 0.419398, (GLfloat) 0.853434, + (GLfloat) 0.070662, (GLfloat) 0.160554, (GLfloat) 0.984494, + (GLfloat) 0.072116, (GLfloat) 0.157712, (GLfloat) 0.984848, + (GLfloat) - 0.043552, (GLfloat) 0.248570, (GLfloat) 0.967634, + (GLfloat) - 0.045553, (GLfloat) 0.254642, (GLfloat) 0.965962, + (GLfloat) 0.833765, (GLfloat) - 0.473703, (GLfloat) 0.283620, + (GLfloat) 0.823611, (GLfloat) - 0.501937, (GLfloat) 0.264054, + (GLfloat) 0.753164, (GLfloat) - 0.577527, (GLfloat) 0.314971, + (GLfloat) 0.750976, (GLfloat) - 0.585768, (GLfloat) 0.304813, + (GLfloat) 0.524744, (GLfloat) - 0.282162, (GLfloat) 0.803137, + (GLfloat) 0.515479, (GLfloat) - 0.259037, (GLfloat) 0.816812, + (GLfloat) 0.731077, (GLfloat) - 0.100383, (GLfloat) 0.674870, + (GLfloat) 0.725771, (GLfloat) - 0.074391, (GLfloat) 0.683903, + (GLfloat) 0.576854, (GLfloat) - 0.777370, (GLfloat) 0.250869, + (GLfloat) 0.569572, (GLfloat) - 0.770539, (GLfloat) 0.286108, + (GLfloat) 0.204307, (GLfloat) - 0.721596, (GLfloat) 0.661481, + (GLfloat) 0.158422, (GLfloat) - 0.717392, (GLfloat) 0.678418, + (GLfloat) 0.308874, (GLfloat) - 0.483661, (GLfloat) 0.818944, + (GLfloat) 0.351163, (GLfloat) - 0.495655, (GLfloat) 0.794362, + (GLfloat) 0.653090, (GLfloat) - 0.688670, (GLfloat) 0.314971, + (GLfloat) 0.661058, (GLfloat) - 0.685633, (GLfloat) 0.304812, + (GLfloat) 0.403257, (GLfloat) 0.770775, (GLfloat) 0.493244, + (GLfloat) 0.393266, (GLfloat) 0.772882, (GLfloat) 0.497991, + (GLfloat) 0.471763, (GLfloat) 0.867363, (GLfloat) 0.158497, + (GLfloat) 0.475196, (GLfloat) 0.865916, (GLfloat) 0.156134, + (GLfloat) 0.590364, (GLfloat) 0.790041, (GLfloat) 0.165246, + (GLfloat) 0.597402, (GLfloat) 0.785461, (GLfloat) 0.161746, + (GLfloat) 0.528711, (GLfloat) 0.679696, (GLfloat) 0.508407, + (GLfloat) 0.514728, (GLfloat) 0.686399, (GLfloat) 0.513723, + (GLfloat) 0.403257, (GLfloat) 0.770775, (GLfloat) - 0.493244, + (GLfloat) 0.393266, (GLfloat) 0.772882, (GLfloat) - 0.497991, + (GLfloat) 0.514728, (GLfloat) 0.686399, (GLfloat) - 0.513723, + (GLfloat) 0.528711, (GLfloat) 0.679696, (GLfloat) - 0.508407, + (GLfloat) 0.590364, (GLfloat) 0.790041, (GLfloat) - 0.165246, + (GLfloat) 0.597402, (GLfloat) 0.785461, (GLfloat) - 0.161746, + (GLfloat) 0.475196, (GLfloat) 0.865916, (GLfloat) - 0.156134, + (GLfloat) 0.471763, (GLfloat) 0.867363, (GLfloat) - 0.158497, + (GLfloat) 0.885792, (GLfloat) - 0.415923, (GLfloat) - 0.205866, + (GLfloat) 0.881131, (GLfloat) - 0.438054, (GLfloat) - 0.178091, + (GLfloat) 0.914268, (GLfloat) - 0.399196, (GLfloat) - 0.068966, + (GLfloat) 0.909310, (GLfloat) - 0.409637, (GLfloat) - 0.073163, + (GLfloat) 0.961663, (GLfloat) 0.236259, (GLfloat) - 0.139234, + (GLfloat) 0.949193, (GLfloat) 0.273441, (GLfloat) - 0.155762, + (GLfloat) 0.901801, (GLfloat) 0.090517, (GLfloat) - 0.422565, + (GLfloat) 0.894672, (GLfloat) 0.141897, (GLfloat) - 0.423589, + (GLfloat) 0.881131, (GLfloat) - 0.438054, (GLfloat) 0.178091, + (GLfloat) 0.885792, (GLfloat) - 0.415923, (GLfloat) 0.205866, + (GLfloat) 0.894672, (GLfloat) 0.141897, (GLfloat) 0.423589, + (GLfloat) 0.901801, (GLfloat) 0.090518, (GLfloat) 0.422565, + (GLfloat) 0.949193, (GLfloat) 0.273441, (GLfloat) 0.155762, + (GLfloat) 0.961663, (GLfloat) 0.236259, (GLfloat) 0.139234, + (GLfloat) 0.909310, (GLfloat) - 0.409637, (GLfloat) 0.073163, + (GLfloat) 0.914268, (GLfloat) - 0.399196, (GLfloat) 0.068966, + (GLfloat) 0.191133, (GLfloat) 0.514047, (GLfloat) - 0.836196, + (GLfloat) 0.183686, (GLfloat) 0.514678, (GLfloat) - 0.837476, + (GLfloat) - 0.045553, (GLfloat) 0.254642, (GLfloat) - 0.965962, + (GLfloat) - 0.043552, (GLfloat) 0.248570, (GLfloat) - 0.967634, + (GLfloat) 0.070662, (GLfloat) 0.160554, (GLfloat) - 0.984494, + (GLfloat) 0.072116, (GLfloat) 0.157712, (GLfloat) - 0.984848, + (GLfloat) 0.305019, (GLfloat) 0.420960, (GLfloat) - 0.854258, + (GLfloat) 0.309443, (GLfloat) 0.419398, (GLfloat) - 0.853434, + (GLfloat) - 0.557133, (GLfloat) - 0.173326, (GLfloat) - 0.812134, + (GLfloat) - 0.548436, (GLfloat) - 0.209256, (GLfloat) - 0.809586, + (GLfloat) - 0.417652, (GLfloat) - 0.317957, (GLfloat) - 0.851158, + (GLfloat) - 0.412553, (GLfloat) - 0.327906, (GLfloat) - 0.849869, + (GLfloat) - 0.160469, (GLfloat) - 0.081504, (GLfloat) - 0.983670, + (GLfloat) - 0.161493, (GLfloat) - 0.079455, (GLfloat) - 0.983670, + (GLfloat) - 0.281454, (GLfloat) 0.011196, (GLfloat) - 0.959509, + (GLfloat) - 0.287811, (GLfloat) 0.033884, (GLfloat) - 0.957088, + (GLfloat) 0.576854, (GLfloat) - 0.777370, (GLfloat) - 0.250869, + (GLfloat) 0.569572, (GLfloat) - 0.770539, (GLfloat) - 0.286108, + (GLfloat) 0.653090, (GLfloat) - 0.688670, (GLfloat) - 0.314971, + (GLfloat) 0.661058, (GLfloat) - 0.685633, (GLfloat) - 0.304812, + (GLfloat) 0.351164, (GLfloat) - 0.495655, (GLfloat) - 0.794362, + (GLfloat) 0.308874, (GLfloat) - 0.483661, (GLfloat) - 0.818944, + (GLfloat) 0.204308, (GLfloat) - 0.721597, (GLfloat) - 0.661480, + (GLfloat) 0.158422, (GLfloat) - 0.717393, (GLfloat) - 0.678418, + (GLfloat) 0.823611, (GLfloat) - 0.501936, (GLfloat) - 0.264055, + (GLfloat) 0.833765, (GLfloat) - 0.473703, (GLfloat) - 0.283621, + (GLfloat) 0.731077, (GLfloat) - 0.100384, (GLfloat) - 0.674869, + (GLfloat) 0.725771, (GLfloat) - 0.074392, (GLfloat) - 0.683902, + (GLfloat) 0.515479, (GLfloat) - 0.259037, (GLfloat) - 0.816812, + (GLfloat) 0.524744, (GLfloat) - 0.282163, (GLfloat) - 0.803136, + (GLfloat) 0.753164, (GLfloat) - 0.577527, (GLfloat) - 0.314971, + (GLfloat) 0.750976, (GLfloat) - 0.585768, (GLfloat) - 0.304813, + (GLfloat) 0.639601, (GLfloat) - 0.758638, (GLfloat) 0.124011, + (GLfloat) 0.647491, (GLfloat) - 0.749875, (GLfloat) 0.135802, + (GLfloat) 0.708617, (GLfloat) - 0.697026, (GLfloat) 0.109621, + (GLfloat) 0.711116, (GLfloat) - 0.693654, (GLfloat) 0.114709, + (GLfloat) 0.722217, (GLfloat) - 0.690875, (GLfloat) 0.033080, + (GLfloat) 0.720265, (GLfloat) - 0.693043, (GLfloat) 0.030163, + (GLfloat) 0.664597, (GLfloat) - 0.745915, (GLfloat) 0.043834, + (GLfloat) 0.660896, (GLfloat) - 0.749429, (GLfloat) 0.039656, + (GLfloat) 0.813450, (GLfloat) - 0.565559, (GLfloat) 0.135803, + (GLfloat) 0.821340, (GLfloat) - 0.556796, (GLfloat) 0.124011, + (GLfloat) 0.811298, (GLfloat) - 0.582987, (GLfloat) 0.043835, + (GLfloat) 0.814407, (GLfloat) - 0.578938, (GLfloat) 0.039656, + (GLfloat) 0.764534, (GLfloat) - 0.643877, (GLfloat) 0.030163, + (GLfloat) 0.762583, (GLfloat) - 0.646044, (GLfloat) 0.033079, + (GLfloat) 0.767278, (GLfloat) - 0.631876, (GLfloat) 0.109621, + (GLfloat) 0.764186, (GLfloat) - 0.634714, (GLfloat) 0.114709, + (GLfloat) 0.821340, (GLfloat) - 0.556796, (GLfloat) - 0.124011, + (GLfloat) 0.813450, (GLfloat) - 0.565559, (GLfloat) - 0.135803, + (GLfloat) 0.767278, (GLfloat) - 0.631876, (GLfloat) - 0.109621, + (GLfloat) 0.764186, (GLfloat) - 0.634714, (GLfloat) - 0.114709, + (GLfloat) 0.762583, (GLfloat) - 0.646044, (GLfloat) - 0.033079, + (GLfloat) 0.764534, (GLfloat) - 0.643877, (GLfloat) - 0.030163, + (GLfloat) 0.811298, (GLfloat) - 0.582987, (GLfloat) - 0.043835, + (GLfloat) 0.814407, (GLfloat) - 0.578938, (GLfloat) - 0.039656, + (GLfloat) 0.647491, (GLfloat) - 0.749875, (GLfloat) - 0.135802, + (GLfloat) 0.639601, (GLfloat) - 0.758638, (GLfloat) - 0.124011, + (GLfloat) 0.664597, (GLfloat) - 0.745915, (GLfloat) - 0.043834, + (GLfloat) 0.660896, (GLfloat) - 0.749429, (GLfloat) - 0.039656, + (GLfloat) 0.720265, (GLfloat) - 0.693043, (GLfloat) - 0.030163, + (GLfloat) 0.722217, (GLfloat) - 0.690875, (GLfloat) - 0.033080, + (GLfloat) 0.708617, (GLfloat) - 0.697026, (GLfloat) - 0.109621, + (GLfloat) 0.711116, (GLfloat) - 0.693654, (GLfloat) - 0.114709, + (GLfloat) - 0.795834, (GLfloat) - 0.416890, (GLfloat) - 0.439148, + (GLfloat) - 0.804928, (GLfloat) - 0.376107, (GLfloat) - 0.458949, + (GLfloat) - 0.777496, (GLfloat) - 0.478056, (GLfloat) - 0.408610, + (GLfloat) - 0.791178, (GLfloat) - 0.423850, (GLfloat) - 0.440894, + (GLfloat) - 0.871703, (GLfloat) - 0.470947, (GLfloat) - 0.135440, + (GLfloat) - 0.863971, (GLfloat) - 0.488878, (GLfloat) - 0.120637, + (GLfloat) - 0.890766, (GLfloat) - 0.431382, (GLfloat) - 0.142987, + (GLfloat) - 0.885536, (GLfloat) - 0.445027, (GLfloat) - 0.133330, + (GLfloat) - 0.626883, (GLfloat) - 0.701314, (GLfloat) - 0.339376, + (GLfloat) - 0.543140, (GLfloat) - 0.727904, (GLfloat) - 0.418515, + (GLfloat) - 0.684101, (GLfloat) - 0.722860, (GLfloat) - 0.097361, + (GLfloat) - 0.656897, (GLfloat) - 0.743919, (GLfloat) - 0.122761, + (GLfloat) - 0.823965, (GLfloat) - 0.552405, (GLfloat) - 0.126218, + (GLfloat) - 0.810821, (GLfloat) - 0.575485, (GLfloat) - 0.106707, + (GLfloat) - 0.722436, (GLfloat) - 0.581233, (GLfloat) - 0.374506, + (GLfloat) - 0.749781, (GLfloat) - 0.512777, (GLfloat) - 0.418197, + (GLfloat) - 0.543140, (GLfloat) - 0.727904, (GLfloat) 0.418515, + (GLfloat) - 0.626883, (GLfloat) - 0.701314, (GLfloat) 0.339376, + (GLfloat) - 0.749781, (GLfloat) - 0.512777, (GLfloat) 0.418197, + (GLfloat) - 0.722436, (GLfloat) - 0.581233, (GLfloat) 0.374506, + (GLfloat) - 0.823965, (GLfloat) - 0.552405, (GLfloat) 0.126218, + (GLfloat) - 0.810821, (GLfloat) - 0.575485, (GLfloat) 0.106707, + (GLfloat) - 0.684101, (GLfloat) - 0.722860, (GLfloat) 0.097361, + (GLfloat) - 0.656897, (GLfloat) - 0.743919, (GLfloat) 0.122761, + (GLfloat) - 0.804928, (GLfloat) - 0.376106, (GLfloat) 0.458949, + (GLfloat) - 0.795834, (GLfloat) - 0.416890, (GLfloat) 0.439148, + (GLfloat) - 0.890766, (GLfloat) - 0.431382, (GLfloat) 0.142986, + (GLfloat) - 0.885536, (GLfloat) - 0.445027, (GLfloat) 0.133330, + (GLfloat) - 0.863971, (GLfloat) - 0.488878, (GLfloat) 0.120637, + (GLfloat) - 0.871703, (GLfloat) - 0.470947, (GLfloat) 0.135440, + (GLfloat) - 0.777496, (GLfloat) - 0.478056, (GLfloat) 0.408610, + (GLfloat) - 0.791178, (GLfloat) - 0.423850, (GLfloat) 0.440894, + (GLfloat) 0.229002, (GLfloat) 0.499702, (GLfloat) - 0.835378, + (GLfloat) 0.231853, (GLfloat) 0.486589, (GLfloat) - 0.842304, + (GLfloat) 0.233876, (GLfloat) 0.516110, (GLfloat) - 0.823973, + (GLfloat) 0.237238, (GLfloat) 0.494666, (GLfloat) - 0.836076, + (GLfloat) 0.010383, (GLfloat) 0.206054, (GLfloat) - 0.978486, + (GLfloat) 0.010515, (GLfloat) 0.204402, (GLfloat) - 0.978831, + (GLfloat) - 0.008079, (GLfloat) 0.222043, (GLfloat) - 0.975003, + (GLfloat) - 0.007459, (GLfloat) 0.217610, (GLfloat) - 0.976007, + (GLfloat) 0.144536, (GLfloat) 0.600180, (GLfloat) - 0.786698, + (GLfloat) 0.157013, (GLfloat) 0.570113, (GLfloat) - 0.806423, + (GLfloat) 0.037521, (GLfloat) 0.196979, (GLfloat) - 0.979689, + (GLfloat) 0.033902, (GLfloat) 0.207800, (GLfloat) - 0.977584, + (GLfloat) 0.024105, (GLfloat) 0.197695, (GLfloat) - 0.979967, + (GLfloat) 0.023654, (GLfloat) 0.201010, (GLfloat) - 0.979303, + (GLfloat) 0.210423, (GLfloat) 0.553707, (GLfloat) - 0.805687, + (GLfloat) 0.216765, (GLfloat) 0.524423, (GLfloat) - 0.823404, + (GLfloat) - 0.387850, (GLfloat) - 0.484551, (GLfloat) - 0.784081, + (GLfloat) - 0.344102, (GLfloat) - 0.564354, (GLfloat) - 0.750399, + (GLfloat) - 0.507279, (GLfloat) - 0.348613, (GLfloat) - 0.788123, + (GLfloat) - 0.488679, (GLfloat) - 0.433878, (GLfloat) - 0.756930, + (GLfloat) - 0.209869, (GLfloat) - 0.143196, (GLfloat) - 0.967187, + (GLfloat) - 0.216489, (GLfloat) - 0.097461, (GLfloat) - 0.971408, + (GLfloat) - 0.125932, (GLfloat) - 0.202782, (GLfloat) - 0.971092, + (GLfloat) - 0.140256, (GLfloat) - 0.165750, (GLfloat) - 0.976143, + (GLfloat) - 0.549569, (GLfloat) - 0.208003, (GLfloat) - 0.809141, + (GLfloat) - 0.543770, (GLfloat) - 0.257592, (GLfloat) - 0.798724, + (GLfloat) - 0.260213, (GLfloat) - 0.033756, (GLfloat) - 0.964961, + (GLfloat) - 0.263665, (GLfloat) - 0.004051, (GLfloat) - 0.964606, + (GLfloat) - 0.243217, (GLfloat) - 0.082726, (GLfloat) - 0.966438, + (GLfloat) - 0.245939, (GLfloat) - 0.044154, (GLfloat) - 0.968279, + (GLfloat) - 0.539327, (GLfloat) - 0.261873, (GLfloat) - 0.800343, + (GLfloat) - 0.532344, (GLfloat) - 0.329385, (GLfloat) - 0.779818, + (GLfloat) 0.231853, (GLfloat) 0.486589, (GLfloat) 0.842304, + (GLfloat) 0.229002, (GLfloat) 0.499702, (GLfloat) 0.835378, + (GLfloat) - 0.008079, (GLfloat) 0.222044, (GLfloat) 0.975003, + (GLfloat) - 0.007460, (GLfloat) 0.217609, (GLfloat) 0.976008, + (GLfloat) 0.010515, (GLfloat) 0.204402, (GLfloat) 0.978830, + (GLfloat) 0.010383, (GLfloat) 0.206054, (GLfloat) 0.978486, + (GLfloat) 0.233876, (GLfloat) 0.516110, (GLfloat) 0.823973, + (GLfloat) 0.237238, (GLfloat) 0.494666, (GLfloat) 0.836076, + (GLfloat) - 0.549569, (GLfloat) - 0.208003, (GLfloat) 0.809141, + (GLfloat) - 0.543770, (GLfloat) - 0.257592, (GLfloat) 0.798724, + (GLfloat) - 0.532344, (GLfloat) - 0.329384, (GLfloat) 0.779818, + (GLfloat) - 0.539327, (GLfloat) - 0.261873, (GLfloat) 0.800343, + (GLfloat) - 0.243217, (GLfloat) - 0.082726, (GLfloat) 0.966438, + (GLfloat) - 0.245939, (GLfloat) - 0.044154, (GLfloat) 0.968279, + (GLfloat) - 0.263665, (GLfloat) - 0.004051, (GLfloat) 0.964606, + (GLfloat) - 0.260214, (GLfloat) - 0.033755, (GLfloat) 0.964961, + (GLfloat) - 0.344101, (GLfloat) - 0.564354, (GLfloat) 0.750399, + (GLfloat) - 0.387850, (GLfloat) - 0.484551, (GLfloat) 0.784081, + (GLfloat) - 0.125932, (GLfloat) - 0.202782, (GLfloat) 0.971093, + (GLfloat) - 0.140255, (GLfloat) - 0.165749, (GLfloat) 0.976143, + (GLfloat) - 0.216489, (GLfloat) - 0.097462, (GLfloat) 0.971408, + (GLfloat) - 0.209869, (GLfloat) - 0.143196, (GLfloat) 0.967187, + (GLfloat) - 0.507278, (GLfloat) - 0.348612, (GLfloat) 0.788123, + (GLfloat) - 0.488678, (GLfloat) - 0.433878, (GLfloat) 0.756930, + (GLfloat) 0.144536, (GLfloat) 0.600181, (GLfloat) 0.786697, + (GLfloat) 0.157013, (GLfloat) 0.570113, (GLfloat) 0.806423, + (GLfloat) 0.216765, (GLfloat) 0.524422, (GLfloat) 0.823404, + (GLfloat) 0.210423, (GLfloat) 0.553707, (GLfloat) 0.805687, + (GLfloat) 0.024105, (GLfloat) 0.197695, (GLfloat) 0.979967, + (GLfloat) 0.023654, (GLfloat) 0.201010, (GLfloat) 0.979304, + (GLfloat) 0.033902, (GLfloat) 0.207800, (GLfloat) 0.977584, + (GLfloat) 0.037522, (GLfloat) 0.196978, (GLfloat) 0.979690, + (GLfloat) 0.429831, (GLfloat) 0.754772, (GLfloat) - 0.495545, + (GLfloat) 0.445178, (GLfloat) 0.753116, (GLfloat) - 0.484389, + (GLfloat) 0.504382, (GLfloat) 0.849100, (GLfloat) - 0.156932, + (GLfloat) 0.509098, (GLfloat) 0.847167, (GLfloat) - 0.152075, + (GLfloat) 0.473721, (GLfloat) 0.868820, (GLfloat) - 0.144012, + (GLfloat) 0.467781, (GLfloat) 0.870761, (GLfloat) - 0.151512, + (GLfloat) 0.426275, (GLfloat) 0.776501, (GLfloat) - 0.464043, + (GLfloat) 0.405841, (GLfloat) 0.776082, (GLfloat) - 0.482690, + (GLfloat) 0.445178, (GLfloat) 0.753116, (GLfloat) 0.484389, + (GLfloat) 0.429830, (GLfloat) 0.754772, (GLfloat) 0.495545, + (GLfloat) 0.426275, (GLfloat) 0.776501, (GLfloat) 0.464043, + (GLfloat) 0.405841, (GLfloat) 0.776082, (GLfloat) 0.482690, + (GLfloat) 0.467781, (GLfloat) 0.870761, (GLfloat) 0.151512, + (GLfloat) 0.473721, (GLfloat) 0.868820, (GLfloat) 0.144012, + (GLfloat) 0.504382, (GLfloat) 0.849100, (GLfloat) 0.156932, + (GLfloat) 0.509098, (GLfloat) 0.847167, (GLfloat) 0.152075, + (GLfloat) 0.229278, (GLfloat) 0.880155, (GLfloat) 0.415643, + (GLfloat) 0.209637, (GLfloat) 0.873049, (GLfloat) 0.440270, + (GLfloat) 0.229791, (GLfloat) 0.963838, (GLfloat) 0.134951, + (GLfloat) 0.235661, (GLfloat) 0.963590, (GLfloat) 0.126323, + (GLfloat) 0.380317, (GLfloat) 0.913635, (GLfloat) 0.143628, + (GLfloat) 0.386968, (GLfloat) 0.912260, (GLfloat) 0.134303, + (GLfloat) 0.360099, (GLfloat) 0.823680, (GLfloat) 0.438041, + (GLfloat) 0.336980, (GLfloat) 0.819830, (GLfloat) 0.462950, + (GLfloat) 0.229278, (GLfloat) 0.880155, (GLfloat) - 0.415643, + (GLfloat) 0.209637, (GLfloat) 0.873049, (GLfloat) - 0.440270, + (GLfloat) 0.336980, (GLfloat) 0.819830, (GLfloat) - 0.462951, + (GLfloat) 0.360099, (GLfloat) 0.823680, (GLfloat) - 0.438041, + (GLfloat) 0.380318, (GLfloat) 0.913635, (GLfloat) - 0.143628, + (GLfloat) 0.386968, (GLfloat) 0.912260, (GLfloat) - 0.134303, + (GLfloat) 0.235661, (GLfloat) 0.963590, (GLfloat) - 0.126323, + (GLfloat) 0.229791, (GLfloat) 0.963838, (GLfloat) - 0.134951, + (GLfloat) - 0.140641, (GLfloat) 0.581880, (GLfloat) - 0.801022, + (GLfloat) - 0.142183, (GLfloat) 0.582121, (GLfloat) - 0.800574, + (GLfloat) 0.051917, (GLfloat) 0.273318, (GLfloat) - 0.960522, + (GLfloat) 0.034217, (GLfloat) 0.274901, (GLfloat) - 0.960864, + (GLfloat) 0.048940, (GLfloat) 0.249448, (GLfloat) - 0.967151, + (GLfloat) 0.029460, (GLfloat) 0.256714, (GLfloat) - 0.966038, + (GLfloat) - 0.118911, (GLfloat) 0.595461, (GLfloat) - 0.794536, + (GLfloat) - 0.119035, (GLfloat) 0.595511, (GLfloat) - 0.794479, + (GLfloat) 0.515773, (GLfloat) - 0.229138, (GLfloat) - 0.825515, + (GLfloat) 0.492630, (GLfloat) - 0.312368, (GLfloat) - 0.812245, + (GLfloat) 0.432249, (GLfloat) - 0.426645, (GLfloat) - 0.794440, + (GLfloat) 0.467347, (GLfloat) - 0.336981, (GLfloat) - 0.817332, + (GLfloat) 0.202207, (GLfloat) - 0.074217, (GLfloat) - 0.976526, + (GLfloat) 0.254570, (GLfloat) - 0.084963, (GLfloat) - 0.963315, + (GLfloat) 0.231800, (GLfloat) - 0.012060, (GLfloat) - 0.972689, + (GLfloat) 0.278802, (GLfloat) - 0.009127, (GLfloat) - 0.960305, + (GLfloat) 0.001969, (GLfloat) - 0.610219, (GLfloat) - 0.792230, + (GLfloat) 0.016464, (GLfloat) - 0.619478, (GLfloat) - 0.784841, + (GLfloat) 0.038477, (GLfloat) - 0.206205, (GLfloat) - 0.977752, + (GLfloat) 0.042684, (GLfloat) - 0.210618, (GLfloat) - 0.976636, + (GLfloat) 0.147830, (GLfloat) - 0.145929, (GLfloat) - 0.978188, + (GLfloat) 0.187657, (GLfloat) - 0.166867, (GLfloat) - 0.967957, + (GLfloat) 0.332157, (GLfloat) - 0.490109, (GLfloat) - 0.805894, + (GLfloat) 0.291047, (GLfloat) - 0.549638, (GLfloat) - 0.783064, + (GLfloat) 0.018324, (GLfloat) 0.624772, (GLfloat) - 0.780593, + (GLfloat) 0.031411, (GLfloat) 0.609093, (GLfloat) - 0.792477, + (GLfloat) - 0.068754, (GLfloat) 0.615108, (GLfloat) - 0.785439, + (GLfloat) - 0.063190, (GLfloat) 0.611137, (GLfloat) - 0.788999, + (GLfloat) 0.050001, (GLfloat) 0.227113, (GLfloat) - 0.972584, + (GLfloat) 0.031314, (GLfloat) 0.240630, (GLfloat) - 0.970112, + (GLfloat) 0.046887, (GLfloat) 0.207201, (GLfloat) - 0.977174, + (GLfloat) 0.034344, (GLfloat) 0.223544, (GLfloat) - 0.974089, + (GLfloat) - 0.289358, (GLfloat) 0.846699, (GLfloat) - 0.446512, + (GLfloat) - 0.282981, (GLfloat) 0.846581, (GLfloat) - 0.450803, + (GLfloat) - 0.237609, (GLfloat) 0.869708, (GLfloat) - 0.432607, + (GLfloat) - 0.232787, (GLfloat) 0.868834, (GLfloat) - 0.436964, + (GLfloat) - 0.269102, (GLfloat) 0.953677, (GLfloat) - 0.134480, + (GLfloat) - 0.270832, (GLfloat) 0.953476, (GLfloat) - 0.132414, + (GLfloat) - 0.330792, (GLfloat) 0.933242, (GLfloat) - 0.140129, + (GLfloat) - 0.333075, (GLfloat) 0.932754, (GLfloat) - 0.137953, + (GLfloat) 0.010415, (GLfloat) 0.905793, (GLfloat) - 0.423593, + (GLfloat) 0.002305, (GLfloat) 0.910958, (GLfloat) - 0.412492, + (GLfloat) - 0.003726, (GLfloat) 0.991671, (GLfloat) - 0.128743, + (GLfloat) - 0.001231, (GLfloat) 0.992167, (GLfloat) - 0.124913, + (GLfloat) - 0.164759, (GLfloat) 0.977931, (GLfloat) - 0.128473, + (GLfloat) - 0.164919, (GLfloat) 0.977933, (GLfloat) - 0.128255, + (GLfloat) - 0.141914, (GLfloat) 0.895522, (GLfloat) - 0.421783, + (GLfloat) - 0.142144, (GLfloat) 0.895607, (GLfloat) - 0.421525, + (GLfloat) 0.010415, (GLfloat) 0.905793, (GLfloat) 0.423593, + (GLfloat) 0.002305, (GLfloat) 0.910958, (GLfloat) 0.412492, + (GLfloat) - 0.142144, (GLfloat) 0.895607, (GLfloat) 0.421525, + (GLfloat) - 0.141914, (GLfloat) 0.895522, (GLfloat) 0.421783, + (GLfloat) - 0.164759, (GLfloat) 0.977931, (GLfloat) 0.128473, + (GLfloat) - 0.164919, (GLfloat) 0.977933, (GLfloat) 0.128255, + (GLfloat) - 0.003726, (GLfloat) 0.991671, (GLfloat) 0.128743, + (GLfloat) - 0.001231, (GLfloat) 0.992167, (GLfloat) 0.124913, + (GLfloat) - 0.282980, (GLfloat) 0.846581, (GLfloat) 0.450803, + (GLfloat) - 0.289358, (GLfloat) 0.846699, (GLfloat) 0.446512, + (GLfloat) - 0.330792, (GLfloat) 0.933242, (GLfloat) 0.140129, + (GLfloat) - 0.333075, (GLfloat) 0.932754, (GLfloat) 0.137953, + (GLfloat) - 0.270832, (GLfloat) 0.953476, (GLfloat) 0.132414, + (GLfloat) - 0.269102, (GLfloat) 0.953677, (GLfloat) 0.134480, + (GLfloat) - 0.237609, (GLfloat) 0.869708, (GLfloat) 0.432607, + (GLfloat) - 0.232787, (GLfloat) 0.868834, (GLfloat) 0.436964, + (GLfloat) - 0.140641, (GLfloat) 0.581880, (GLfloat) 0.801022, + (GLfloat) - 0.142183, (GLfloat) 0.582121, (GLfloat) 0.800574, + (GLfloat) - 0.119034, (GLfloat) 0.595511, (GLfloat) 0.794479, + (GLfloat) - 0.118911, (GLfloat) 0.595461, (GLfloat) 0.794536, + (GLfloat) 0.048939, (GLfloat) 0.249448, (GLfloat) 0.967151, + (GLfloat) 0.029461, (GLfloat) 0.256714, (GLfloat) 0.966038, + (GLfloat) 0.034217, (GLfloat) 0.274901, (GLfloat) 0.960863, + (GLfloat) 0.051918, (GLfloat) 0.273319, (GLfloat) 0.960521, + (GLfloat) 0.031411, (GLfloat) 0.609093, (GLfloat) 0.792477, + (GLfloat) 0.018324, (GLfloat) 0.624772, (GLfloat) 0.780593, + (GLfloat) 0.046887, (GLfloat) 0.207200, (GLfloat) 0.977174, + (GLfloat) 0.034344, (GLfloat) 0.223543, (GLfloat) 0.974089, + (GLfloat) 0.031314, (GLfloat) 0.240631, (GLfloat) 0.970111, + (GLfloat) 0.050002, (GLfloat) 0.227113, (GLfloat) 0.972584, + (GLfloat) - 0.068754, (GLfloat) 0.615108, (GLfloat) 0.785440, + (GLfloat) - 0.063191, (GLfloat) 0.611137, (GLfloat) 0.788999, + (GLfloat) 0.001969, (GLfloat) - 0.610219, (GLfloat) 0.792230, + (GLfloat) 0.016464, (GLfloat) - 0.619478, (GLfloat) 0.784841, + (GLfloat) 0.332157, (GLfloat) - 0.490109, (GLfloat) 0.805894, + (GLfloat) 0.291047, (GLfloat) - 0.549638, (GLfloat) 0.783064, + (GLfloat) 0.147831, (GLfloat) - 0.145929, (GLfloat) 0.978188, + (GLfloat) 0.187656, (GLfloat) - 0.166866, (GLfloat) 0.967957, + (GLfloat) 0.042684, (GLfloat) - 0.210618, (GLfloat) 0.976636, + (GLfloat) 0.038477, (GLfloat) - 0.206204, (GLfloat) 0.977752, + (GLfloat) 0.515773, (GLfloat) - 0.229138, (GLfloat) 0.825515, + (GLfloat) 0.492630, (GLfloat) - 0.312368, (GLfloat) 0.812245, + (GLfloat) 0.231801, (GLfloat) - 0.012059, (GLfloat) 0.972689, + (GLfloat) 0.278802, (GLfloat) - 0.009127, (GLfloat) 0.960305, + (GLfloat) 0.254571, (GLfloat) - 0.084963, (GLfloat) 0.963315, + (GLfloat) 0.202207, (GLfloat) - 0.074217, (GLfloat) 0.976527, + (GLfloat) 0.467347, (GLfloat) - 0.336981, (GLfloat) 0.817332, + (GLfloat) 0.432250, (GLfloat) - 0.426645, (GLfloat) 0.794440, + (GLfloat) 0.731946, (GLfloat) - 0.508941, (GLfloat) 0.453029, + (GLfloat) 0.760718, (GLfloat) - 0.438585, (GLfloat) 0.478489, + (GLfloat) 0.696013, (GLfloat) - 0.585025, (GLfloat) 0.416308, + (GLfloat) 0.630794, (GLfloat) - 0.620580, (GLfloat) 0.465810, + (GLfloat) 0.757142, (GLfloat) - 0.637420, (GLfloat) 0.142942, + (GLfloat) 0.737097, (GLfloat) - 0.663598, (GLfloat) 0.127771, + (GLfloat) 0.847507, (GLfloat) - 0.509047, (GLfloat) 0.150342, + (GLfloat) 0.834151, (GLfloat) - 0.533962, (GLfloat) 0.138115, + (GLfloat) - 0.068175, (GLfloat) - 0.903325, (GLfloat) 0.423504, + (GLfloat) - 0.038664, (GLfloat) - 0.911816, (GLfloat) 0.408775, + (GLfloat) - 0.102320, (GLfloat) - 0.986404, (GLfloat) 0.128602, + (GLfloat) - 0.086898, (GLfloat) - 0.988753, (GLfloat) 0.121719, + (GLfloat) 0.488656, (GLfloat) - 0.861887, (GLfloat) 0.135524, + (GLfloat) 0.510932, (GLfloat) - 0.850761, (GLfloat) 0.123102, + (GLfloat) 0.415769, (GLfloat) - 0.794938, (GLfloat) 0.441826, + (GLfloat) 0.471036, (GLfloat) - 0.782278, (GLfloat) 0.407634, + (GLfloat) - 0.038664, (GLfloat) - 0.911816, (GLfloat) - 0.408775, + (GLfloat) - 0.068174, (GLfloat) - 0.903325, (GLfloat) - 0.423504, + (GLfloat) 0.415769, (GLfloat) - 0.794938, (GLfloat) - 0.441826, + (GLfloat) 0.471037, (GLfloat) - 0.782278, (GLfloat) - 0.407634, + (GLfloat) 0.510932, (GLfloat) - 0.850761, (GLfloat) - 0.123102, + (GLfloat) 0.488656, (GLfloat) - 0.861887, (GLfloat) - 0.135524, + (GLfloat) - 0.102320, (GLfloat) - 0.986404, (GLfloat) - 0.128602, + (GLfloat) - 0.086898, (GLfloat) - 0.988753, (GLfloat) - 0.121719, + (GLfloat) 0.760718, (GLfloat) - 0.438585, (GLfloat) - 0.478489, + (GLfloat) 0.731946, (GLfloat) - 0.508941, (GLfloat) - 0.453029, + (GLfloat) 0.847507, (GLfloat) - 0.509047, (GLfloat) - 0.150343, + (GLfloat) 0.834151, (GLfloat) - 0.533962, (GLfloat) - 0.138115, + (GLfloat) 0.737097, (GLfloat) - 0.663599, (GLfloat) - 0.127771, + (GLfloat) 0.757142, (GLfloat) - 0.637420, (GLfloat) - 0.142942, + (GLfloat) 0.630794, (GLfloat) - 0.620580, (GLfloat) - 0.465810, + (GLfloat) 0.696012, (GLfloat) - 0.585025, (GLfloat) - 0.416309, + (GLfloat) 0.774435, (GLfloat) - 0.417338, (GLfloat) 0.475479, + (GLfloat) 0.793442, (GLfloat) - 0.363272, (GLfloat) 0.488348, + (GLfloat) 0.884471, (GLfloat) - 0.440088, (GLfloat) 0.155030, + (GLfloat) 0.875885, (GLfloat) - 0.459272, (GLfloat) 0.147967, + (GLfloat) 0.768156, (GLfloat) - 0.618465, (GLfloat) 0.165642, + (GLfloat) 0.757446, (GLfloat) - 0.632850, (GLfloat) 0.160551, + (GLfloat) 0.645602, (GLfloat) - 0.572394, (GLfloat) 0.505533, + (GLfloat) 0.663605, (GLfloat) - 0.543212, (GLfloat) 0.514343, + (GLfloat) 0.774435, (GLfloat) - 0.417338, (GLfloat) - 0.475479, + (GLfloat) 0.793442, (GLfloat) - 0.363271, (GLfloat) - 0.488348, + (GLfloat) 0.663604, (GLfloat) - 0.543213, (GLfloat) - 0.514343, + (GLfloat) 0.645602, (GLfloat) - 0.572394, (GLfloat) - 0.505533, + (GLfloat) 0.768156, (GLfloat) - 0.618465, (GLfloat) - 0.165643, + (GLfloat) 0.757446, (GLfloat) - 0.632850, (GLfloat) - 0.160551, + (GLfloat) 0.875885, (GLfloat) - 0.459272, (GLfloat) - 0.147967, + (GLfloat) 0.884471, (GLfloat) - 0.440088, (GLfloat) - 0.155030, + (GLfloat) - 0.384755, (GLfloat) - 0.899768, (GLfloat) - 0.205866, + (GLfloat) - 0.407035, (GLfloat) - 0.895883, (GLfloat) - 0.178092, + (GLfloat) - 0.367045, (GLfloat) - 0.927643, (GLfloat) - 0.068965, + (GLfloat) - 0.377652, (GLfloat) - 0.923053, (GLfloat) - 0.073163, + (GLfloat) 0.147492, (GLfloat) - 0.980758, (GLfloat) - 0.127908, + (GLfloat) 0.187942, (GLfloat) - 0.971451, (GLfloat) - 0.144776, + (GLfloat) 0.017404, (GLfloat) - 0.922933, (GLfloat) - 0.384567, + (GLfloat) 0.060977, (GLfloat) - 0.919535, (GLfloat) - 0.388250, + (GLfloat) - 0.407035, (GLfloat) - 0.895883, (GLfloat) 0.178092, + (GLfloat) - 0.384755, (GLfloat) - 0.899768, (GLfloat) 0.205866, + (GLfloat) 0.060977, (GLfloat) - 0.919535, (GLfloat) 0.388250, + (GLfloat) 0.017405, (GLfloat) - 0.922933, (GLfloat) 0.384568, + (GLfloat) 0.187942, (GLfloat) - 0.971451, (GLfloat) 0.144776, + (GLfloat) 0.147492, (GLfloat) - 0.980758, (GLfloat) 0.127908, + (GLfloat) - 0.377652, (GLfloat) - 0.923053, (GLfloat) 0.073163, + (GLfloat) - 0.367045, (GLfloat) - 0.927643, (GLfloat) 0.068965, + (GLfloat) 0.525096, (GLfloat) - 0.217383, (GLfloat) - 0.822811, + (GLfloat) 0.542855, (GLfloat) - 0.154089, (GLfloat) - 0.825569, + (GLfloat) 0.263018, (GLfloat) 0.047234, (GLfloat) - 0.963634, + (GLfloat) 0.298263, (GLfloat) 0.059374, (GLfloat) - 0.952635, + (GLfloat) 0.152826, (GLfloat) - 0.078814, (GLfloat) - 0.985105, + (GLfloat) 0.157225, (GLfloat) - 0.076313, (GLfloat) - 0.984610, + (GLfloat) 0.407888, (GLfloat) - 0.328946, (GLfloat) - 0.851717, + (GLfloat) 0.393565, (GLfloat) - 0.338248, (GLfloat) - 0.854807, + (GLfloat) - 0.131636, (GLfloat) 0.588079, (GLfloat) - 0.798019, + (GLfloat) - 0.131727, (GLfloat) 0.588071, (GLfloat) - 0.798011, + (GLfloat) - 0.280070, (GLfloat) 0.459269, (GLfloat) - 0.842990, + (GLfloat) - 0.285882, (GLfloat) 0.456692, (GLfloat) - 0.842439, + (GLfloat) - 0.064116, (GLfloat) 0.179568, (GLfloat) - 0.981654, + (GLfloat) - 0.067311, (GLfloat) 0.177967, (GLfloat) - 0.981732, + (GLfloat) 0.071348, (GLfloat) 0.308885, (GLfloat) - 0.948419, + (GLfloat) 0.056168, (GLfloat) 0.305937, (GLfloat) - 0.950393, + (GLfloat) - 0.756765, (GLfloat) - 0.603631, (GLfloat) - 0.250870, + (GLfloat) - 0.750192, (GLfloat) - 0.596115, (GLfloat) - 0.286110, + (GLfloat) - 0.661260, (GLfloat) - 0.680768, (GLfloat) - 0.315104, + (GLfloat) - 0.666597, (GLfloat) - 0.680599, (GLfloat) - 0.304029, + (GLfloat) - 0.487239, (GLfloat) - 0.360038, (GLfloat) - 0.795595, + (GLfloat) - 0.481713, (GLfloat) - 0.339088, (GLfloat) - 0.808067, + (GLfloat) - 0.706427, (GLfloat) - 0.186136, (GLfloat) - 0.682872, + (GLfloat) - 0.704353, (GLfloat) - 0.163662, (GLfloat) - 0.690726, + (GLfloat) - 0.472887, (GLfloat) - 0.840626, (GLfloat) - 0.264056, + (GLfloat) - 0.444319, (GLfloat) - 0.849789, (GLfloat) - 0.283620, + (GLfloat) - 0.155246, (GLfloat) - 0.767829, (GLfloat) - 0.621561, + (GLfloat) - 0.107581, (GLfloat) - 0.759164, (GLfloat) - 0.641947, + (GLfloat) - 0.262880, (GLfloat) - 0.545316, (GLfloat) - 0.795943, + (GLfloat) - 0.306478, (GLfloat) - 0.563718, (GLfloat) - 0.767002, + (GLfloat) - 0.550890, (GLfloat) - 0.772860, (GLfloat) - 0.314972, + (GLfloat) - 0.559203, (GLfloat) - 0.770962, (GLfloat) - 0.304813, + (GLfloat) - 0.296632, (GLfloat) 0.840312, (GLfloat) - 0.453745, + (GLfloat) - 0.291339, (GLfloat) 0.841021, (GLfloat) - 0.455856, + (GLfloat) - 0.347498, (GLfloat) 0.926752, (GLfloat) - 0.142743, + (GLfloat) - 0.349577, (GLfloat) 0.926172, (GLfloat) - 0.141427, + (GLfloat) - 0.528222, (GLfloat) 0.834354, (GLfloat) - 0.157592, + (GLfloat) - 0.534297, (GLfloat) 0.830965, (GLfloat) - 0.154997, + (GLfloat) - 0.477964, (GLfloat) 0.727109, (GLfloat) - 0.492812, + (GLfloat) - 0.464577, (GLfloat) 0.733270, (GLfloat) - 0.496471, + (GLfloat) - 0.296632, (GLfloat) 0.840312, (GLfloat) 0.453745, + (GLfloat) - 0.291339, (GLfloat) 0.841021, (GLfloat) 0.455856, + (GLfloat) - 0.464577, (GLfloat) 0.733270, (GLfloat) 0.496471, + (GLfloat) - 0.477964, (GLfloat) 0.727109, (GLfloat) 0.492812, + (GLfloat) - 0.528222, (GLfloat) 0.834354, (GLfloat) 0.157592, + (GLfloat) - 0.534297, (GLfloat) 0.830965, (GLfloat) 0.154997, + (GLfloat) - 0.349577, (GLfloat) 0.926172, (GLfloat) 0.141427, + (GLfloat) - 0.347498, (GLfloat) 0.926752, (GLfloat) 0.142743, + (GLfloat) - 0.819286, (GLfloat) - 0.535153, (GLfloat) 0.205866, + (GLfloat) - 0.811591, (GLfloat) - 0.556420, (GLfloat) 0.178092, + (GLfloat) - 0.849813, (GLfloat) - 0.522553, (GLfloat) 0.068965, + (GLfloat) - 0.843450, (GLfloat) - 0.532202, (GLfloat) 0.073162, + (GLfloat) - 0.975674, (GLfloat) 0.164943, (GLfloat) 0.144407, + (GLfloat) - 0.965143, (GLfloat) 0.206428, (GLfloat) 0.160894, + (GLfloat) - 0.906538, (GLfloat) 0.014845, (GLfloat) 0.421862, + (GLfloat) - 0.890094, (GLfloat) 0.060087, (GLfloat) 0.451800, + (GLfloat) - 0.811591, (GLfloat) - 0.556419, (GLfloat) - 0.178092, + (GLfloat) - 0.819286, (GLfloat) - 0.535153, (GLfloat) - 0.205865, + (GLfloat) - 0.906538, (GLfloat) 0.014844, (GLfloat) - 0.421862, + (GLfloat) - 0.890094, (GLfloat) 0.060087, (GLfloat) - 0.451800, + (GLfloat) - 0.965143, (GLfloat) 0.206428, (GLfloat) - 0.160894, + (GLfloat) - 0.975674, (GLfloat) 0.164943, (GLfloat) - 0.144407, + (GLfloat) - 0.843450, (GLfloat) - 0.532202, (GLfloat) - 0.073162, + (GLfloat) - 0.849813, (GLfloat) - 0.522553, (GLfloat) - 0.068965, + (GLfloat) - 0.131727, (GLfloat) 0.588071, (GLfloat) 0.798011, + (GLfloat) - 0.131636, (GLfloat) 0.588079, (GLfloat) 0.798019, + (GLfloat) 0.071348, (GLfloat) 0.308886, (GLfloat) 0.948419, + (GLfloat) 0.056168, (GLfloat) 0.305937, (GLfloat) 0.950393, + (GLfloat) - 0.067311, (GLfloat) 0.177967, (GLfloat) 0.981732, + (GLfloat) - 0.064116, (GLfloat) 0.179568, (GLfloat) 0.981654, + (GLfloat) - 0.280070, (GLfloat) 0.459269, (GLfloat) 0.842990, + (GLfloat) - 0.285882, (GLfloat) 0.456692, (GLfloat) 0.842439, + (GLfloat) 0.542855, (GLfloat) - 0.154089, (GLfloat) 0.825569, + (GLfloat) 0.525096, (GLfloat) - 0.217383, (GLfloat) 0.822811, + (GLfloat) 0.393565, (GLfloat) - 0.338248, (GLfloat) 0.854807, + (GLfloat) 0.407888, (GLfloat) - 0.328946, (GLfloat) 0.851717, + (GLfloat) 0.152826, (GLfloat) - 0.078814, (GLfloat) 0.985105, + (GLfloat) 0.157225, (GLfloat) - 0.076313, (GLfloat) 0.984610, + (GLfloat) 0.298263, (GLfloat) 0.059374, (GLfloat) 0.952635, + (GLfloat) 0.263018, (GLfloat) 0.047234, (GLfloat) 0.963634, + (GLfloat) - 0.444319, (GLfloat) - 0.849789, (GLfloat) 0.283620, + (GLfloat) - 0.472887, (GLfloat) - 0.840626, (GLfloat) 0.264055, + (GLfloat) - 0.550890, (GLfloat) - 0.772861, (GLfloat) 0.314972, + (GLfloat) - 0.559203, (GLfloat) - 0.770962, (GLfloat) 0.304813, + (GLfloat) - 0.306478, (GLfloat) - 0.563718, (GLfloat) 0.767003, + (GLfloat) - 0.262880, (GLfloat) - 0.545316, (GLfloat) 0.795943, + (GLfloat) - 0.155245, (GLfloat) - 0.767828, (GLfloat) 0.621562, + (GLfloat) - 0.107581, (GLfloat) - 0.759164, (GLfloat) 0.641947, + (GLfloat) - 0.756765, (GLfloat) - 0.603631, (GLfloat) 0.250869, + (GLfloat) - 0.750192, (GLfloat) - 0.596115, (GLfloat) 0.286110, + (GLfloat) - 0.706427, (GLfloat) - 0.186135, (GLfloat) 0.682873, + (GLfloat) - 0.704352, (GLfloat) - 0.163662, (GLfloat) 0.690726, + (GLfloat) - 0.481713, (GLfloat) - 0.339088, (GLfloat) 0.808067, + (GLfloat) - 0.487239, (GLfloat) - 0.360037, (GLfloat) 0.795595, + (GLfloat) - 0.666597, (GLfloat) - 0.680599, (GLfloat) 0.304029, + (GLfloat) - 0.661260, (GLfloat) - 0.680768, (GLfloat) 0.315104, + (GLfloat) - 0.527794, (GLfloat) - 0.840271, (GLfloat) - 0.124011, + (GLfloat) - 0.536826, (GLfloat) - 0.832691, (GLfloat) - 0.135802, + (GLfloat) - 0.604714, (GLfloat) - 0.788863, (GLfloat) - 0.109621, + (GLfloat) - 0.607657, (GLfloat) - 0.785872, (GLfloat) - 0.114709, + (GLfloat) - 0.619037, (GLfloat) - 0.784665, (GLfloat) - 0.033079, + (GLfloat) - 0.616803, (GLfloat) - 0.786539, (GLfloat) - 0.030163, + (GLfloat) - 0.554318, (GLfloat) - 0.831150, (GLfloat) - 0.043834, + (GLfloat) - 0.550163, (GLfloat) - 0.834115, (GLfloat) - 0.039656, + (GLfloat) - 0.726822, (GLfloat) - 0.673266, (GLfloat) - 0.135802, + (GLfloat) - 0.735855, (GLfloat) - 0.665687, (GLfloat) - 0.124011, + (GLfloat) - 0.722267, (GLfloat) - 0.690224, (GLfloat) - 0.043834, + (GLfloat) - 0.725908, (GLfloat) - 0.686648, (GLfloat) - 0.039656, + (GLfloat) - 0.667483, (GLfloat) - 0.744014, (GLfloat) - 0.030163, + (GLfloat) - 0.665249, (GLfloat) - 0.745888, (GLfloat) - 0.033079, + (GLfloat) - 0.671871, (GLfloat) - 0.732511, (GLfloat) - 0.109621, + (GLfloat) - 0.668414, (GLfloat) - 0.734891, (GLfloat) - 0.114709, + (GLfloat) - 0.735855, (GLfloat) - 0.665687, (GLfloat) 0.124011, + (GLfloat) - 0.726822, (GLfloat) - 0.673266, (GLfloat) 0.135802, + (GLfloat) - 0.671871, (GLfloat) - 0.732511, (GLfloat) 0.109621, + (GLfloat) - 0.668414, (GLfloat) - 0.734891, (GLfloat) 0.114709, + (GLfloat) - 0.665249, (GLfloat) - 0.745888, (GLfloat) 0.033079, + (GLfloat) - 0.667483, (GLfloat) - 0.744014, (GLfloat) 0.030163, + (GLfloat) - 0.722267, (GLfloat) - 0.690224, (GLfloat) 0.043834, + (GLfloat) - 0.725908, (GLfloat) - 0.686648, (GLfloat) 0.039656, + (GLfloat) - 0.536826, (GLfloat) - 0.832691, (GLfloat) 0.135802, + (GLfloat) - 0.527794, (GLfloat) - 0.840271, (GLfloat) 0.124011, + (GLfloat) - 0.554318, (GLfloat) - 0.831150, (GLfloat) 0.043834, + (GLfloat) - 0.550163, (GLfloat) - 0.834115, (GLfloat) 0.039656, + (GLfloat) - 0.616803, (GLfloat) - 0.786539, (GLfloat) 0.030163, + (GLfloat) - 0.619037, (GLfloat) - 0.784665, (GLfloat) 0.033079, + (GLfloat) - 0.604714, (GLfloat) - 0.788863, (GLfloat) 0.109621, + (GLfloat) - 0.607657, (GLfloat) - 0.785872, (GLfloat) 0.114709, +}; + +static unsigned short int s1_4_POLS[] = +{ + 3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1, + 3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1, + 3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1, + 3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, + 3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1, + 3, 16, 104, 100, 1, 3, 16, 100, 108, 1, 3, 104, 32, 106, 1, 3, 106, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1, + 3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1, +3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1, + 3, 104, 16, 116, 1, 3, 116, 103, 104, 1, 3, 35, 118, 103, 1, 3, 35, 103, 116, 1, + 3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 32, 104, 103, 1, 3, 32, 103, 119, 1, + 3, 125, 18, 121, 1, 3, 121, 117, 125, 1, 3, 36, 123, 117, 1, 3, 36, 117, 121, 1, + 3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 35, 125, 117, 1, 3, 35, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1, + 3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1, + 3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1, + 3, 18, 133, 120, 1, 3, 18, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 135, 36, 121, 1, 3, 121, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1, +3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, +3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1, + 3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1, + 3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, + 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1, + 3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1, +3, 8, 151, 147, 1, 3, 8, 147, 155, 1, 3, 151, 43, 153, 1, 3, 153, 147, 151, 1, + 3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1, + 3, 11, 157, 152, 1, 3, 11, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1, + 3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 153, 43, 160, 1, 3, 160, 152, 153, 1, + 3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1, +3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1, + 3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1, + 3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1, + 3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1, + 3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1, + 3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1, + 3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1, + 3, 18, 125, 124, 1, 3, 18, 124, 162, 1, 3, 125, 35, 186, 1, 3, 186, 124, 125, 1, + 3, 34, 187, 124, 1, 3, 34, 124, 186, 1, 3, 187, 45, 162, 1, 3, 162, 124, 187, 1, + 3, 16, 177, 115, 1, 3, 16, 115, 116, 1, 3, 177, 50, 188, 1, 3, 188, 115, 177, 1, + 3, 34, 186, 115, 1, 3, 34, 115, 188, 1, 3, 186, 35, 116, 1, 3, 116, 115, 186, 1, + 3, 183, 10, 190, 1, 3, 190, 182, 183, 1, 3, 52, 191, 182, 1, 3, 52, 182, 190, 1, + 3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 50, 183, 182, 1, 3, 50, 182, 188, 1, + 3, 193, 9, 170, 1, 3, 170, 169, 193, 1, 3, 45, 187, 169, 1, 3, 45, 169, 170, 1, + 3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 52, 193, 169, 1, 3, 52, 169, 191, 1, + 3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1, + 3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1, + 3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1, + 3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1, + 3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1, + 3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, +3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1, + 3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1, + 3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 193, 52, 215, 1, 3, 215, 192, 193, 1, + 3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 56, 209, 192, 1, 3, 56, 192, 210, 1, + 3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 57, 217, 189, 1, 3, 57, 189, 216, 1, + 3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 215, 52, 190, 1, 3, 190, 189, 215, 1, +3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1, + 3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1, + 3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1, + 3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1, + 3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1, + 3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1, + 3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1, + 3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1, +3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1, + 3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1, + 3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1, + 3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1, +3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1, + 3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1, +3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1, + 3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1, + 3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1, + 3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1, + 3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1, + 3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 65, 253, 247, 1, 3, 65, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 68, 244, 243, 1, 3, 68, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, +3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1, + 3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1, +3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1, + 3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1, + 3, 267, 5, 264, 1, 3, 264, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, +3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 265, 70, 268, 1, 3, 268, 252, 265, 1, + 3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 59, 269, 213, 1, 3, 59, 213, 214, 1, + 3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1, + 3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1, + 3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 59, 219, 218, 1, 3, 59, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1, + 3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, +3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1, + 3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1, +3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1, + 3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1, +3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 283, 73, 284, 1, 3, 284, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, + 3, 285, 6, 278, 1, 3, 278, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_4 = +{ + 290, /* number of points */ + s1_4_PNTS, s1_4_normals, s1_4_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_4.c */ diff --git a/hacks/glx/s1_5.c b/hacks/glx/s1_5.c new file mode 100644 index 00000000..66751851 --- /dev/null +++ b/hacks/glx/s1_5.c @@ -0,0 +1,1057 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_5.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_5" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_5_PNTS[] = +{ + (GLfloat) 1.333479, (GLfloat) - 0.188456, (GLfloat) - 0.340079, + (GLfloat) 1.333479, (GLfloat) - 0.188456, (GLfloat) - 0.659921, + (GLfloat) 1.633195, (GLfloat) - 0.090616, (GLfloat) - 0.340079, + (GLfloat) 1.633195, (GLfloat) - 0.090616, (GLfloat) - 0.659921, + (GLfloat) 1.670754, (GLfloat) - 0.221475, (GLfloat) - 0.638667, + (GLfloat) 1.402870, (GLfloat) - 0.293254, (GLfloat) - 0.638667, + (GLfloat) 1.402870, (GLfloat) - 0.293254, (GLfloat) - 0.361333, + (GLfloat) 1.670754, (GLfloat) - 0.221475, (GLfloat) - 0.361333, + (GLfloat) 1.332183, (GLfloat) 0.266938, (GLfloat) - 0.619965, + (GLfloat) 1.190836, (GLfloat) 0.100363, (GLfloat) - 0.619965, + (GLfloat) 1.190836, (GLfloat) 0.100363, (GLfloat) - 0.380035, + (GLfloat) 1.332183, (GLfloat) 0.266938, (GLfloat) - 0.380035, + (GLfloat) 0.995497, (GLfloat) 0.593044, (GLfloat) - 0.659921, + (GLfloat) 0.995497, (GLfloat) 0.593044, (GLfloat) - 0.340079, + (GLfloat) 0.874620, (GLfloat) 0.619745, (GLfloat) - 0.361333, + (GLfloat) 0.874620, (GLfloat) 0.619745, (GLfloat) - 0.638667, + (GLfloat) 0.974692, (GLfloat) 0.281188, (GLfloat) - 0.340079, + (GLfloat) 0.874620, (GLfloat) 0.342412, (GLfloat) - 0.361333, + (GLfloat) 0.974692, (GLfloat) 0.281188, (GLfloat) - 0.659921, + (GLfloat) 0.874620, (GLfloat) 0.342412, (GLfloat) - 0.638667, + (GLfloat) 0.906869, (GLfloat) 0.713633, (GLfloat) - 0.500000, + (GLfloat) 1.161726, (GLfloat) 0.497346, (GLfloat) - 0.500000, + (GLfloat) 0.999280, (GLfloat) 0.649745, (GLfloat) - 0.500000, + (GLfloat) 0.905451, (GLfloat) 0.476683, (GLfloat) - 0.262505, + (GLfloat) 0.907098, (GLfloat) 0.650057, (GLfloat) - 0.326227, + (GLfloat) 0.856159, (GLfloat) 0.481079, (GLfloat) - 0.500000, + (GLfloat) 0.867922, (GLfloat) 0.658641, (GLfloat) - 0.500000, + (GLfloat) 0.905451, (GLfloat) 0.476683, (GLfloat) - 0.737495, + (GLfloat) 0.907098, (GLfloat) 0.650057, (GLfloat) - 0.673773, + (GLfloat) 1.114357, (GLfloat) 0.334395, (GLfloat) - 0.317564, + (GLfloat) 0.985095, (GLfloat) 0.437116, (GLfloat) - 0.281926, + (GLfloat) 0.904032, (GLfloat) 0.239732, (GLfloat) - 0.500000, + (GLfloat) 0.905018, (GLfloat) 0.303308, (GLfloat) - 0.326227, + (GLfloat) 0.867922, (GLfloat) 0.481079, (GLfloat) - 0.322437, + (GLfloat) 1.066987, (GLfloat) 0.171444, (GLfloat) - 0.500000, + (GLfloat) 0.970910, (GLfloat) 0.224487, (GLfloat) - 0.500000, + (GLfloat) 0.905018, (GLfloat) 0.303308, (GLfloat) - 0.673773, + (GLfloat) 0.867922, (GLfloat) 0.303516, (GLfloat) - 0.500000, + (GLfloat) 1.114357, (GLfloat) 0.334395, (GLfloat) - 0.682436, + (GLfloat) 0.985095, (GLfloat) 0.437116, (GLfloat) - 0.718074, + (GLfloat) 0.867922, (GLfloat) 0.481079, (GLfloat) - 0.677562, + (GLfloat) 1.149095, (GLfloat) 0.453892, (GLfloat) - 0.633787, + (GLfloat) 1.544380, (GLfloat) 0.092162, (GLfloat) - 0.500000, + (GLfloat) 1.357882, (GLfloat) 0.297224, (GLfloat) - 0.500000, + (GLfloat) 1.149095, (GLfloat) 0.453892, (GLfloat) - 0.366213, + (GLfloat) 1.079619, (GLfloat) 0.214898, (GLfloat) - 0.633787, + (GLfloat) 1.391060, (GLfloat) 0.010509, (GLfloat) - 0.682436, + (GLfloat) 1.261509, (GLfloat) 0.183650, (GLfloat) - 0.663589, + (GLfloat) 1.391060, (GLfloat) 0.010509, (GLfloat) - 0.317564, + (GLfloat) 1.261509, (GLfloat) 0.183650, (GLfloat) - 0.336411, + (GLfloat) 1.079619, (GLfloat) 0.214898, (GLfloat) - 0.366213, + (GLfloat) 1.237741, (GLfloat) - 0.071143, (GLfloat) - 0.500000, + (GLfloat) 1.165137, (GLfloat) 0.070077, (GLfloat) - 0.500000, + (GLfloat) 1.526344, (GLfloat) - 0.226473, (GLfloat) - 0.737495, + (GLfloat) 1.483337, (GLfloat) - 0.139536, (GLfloat) - 0.718074, + (GLfloat) 1.503495, (GLfloat) 0.070388, (GLfloat) - 0.633787, + (GLfloat) 1.278626, (GLfloat) - 0.049369, (GLfloat) - 0.633787, + (GLfloat) 1.278626, (GLfloat) - 0.049369, (GLfloat) - 0.366213, + (GLfloat) 1.297571, (GLfloat) - 0.288968, (GLfloat) - 0.500000, + (GLfloat) 1.278985, (GLfloat) - 0.206245, (GLfloat) - 0.500000, + (GLfloat) 1.503495, (GLfloat) 0.070388, (GLfloat) - 0.366213, + (GLfloat) 1.526344, (GLfloat) - 0.226473, (GLfloat) - 0.262505, + (GLfloat) 1.483337, (GLfloat) - 0.139536, (GLfloat) - 0.281926, + (GLfloat) 1.755118, (GLfloat) - 0.163978, (GLfloat) - 0.500000, + (GLfloat) 1.687689, (GLfloat) - 0.072827, (GLfloat) - 0.500000, + (GLfloat) 1.693578, (GLfloat) - 0.180157, (GLfloat) - 0.673773, + (GLfloat) 1.541590, (GLfloat) - 0.275196, (GLfloat) - 0.500000, + (GLfloat) 1.710058, (GLfloat) - 0.217878, (GLfloat) - 0.500000, + (GLfloat) 1.693578, (GLfloat) - 0.180157, (GLfloat) - 0.326227, + (GLfloat) 1.358796, (GLfloat) - 0.271614, (GLfloat) - 0.673773, + (GLfloat) 1.538546, (GLfloat) - 0.263835, (GLfloat) - 0.677562, + (GLfloat) 1.358796, (GLfloat) - 0.271614, (GLfloat) - 0.326227, + (GLfloat) 1.367033, (GLfloat) - 0.309791, (GLfloat) - 0.500000, + (GLfloat) 1.538546, (GLfloat) - 0.263835, (GLfloat) - 0.322437, + (GLfloat) 0.944384, (GLfloat) 0.679375, (GLfloat) - 0.593392, + (GLfloat) 1.071585, (GLfloat) 0.569561, (GLfloat) - 0.579959, + (GLfloat) 0.998334, (GLfloat) 0.635570, (GLfloat) - 0.587230, + (GLfloat) 0.944384, (GLfloat) 0.679375, (GLfloat) - 0.406608, + (GLfloat) 0.944762, (GLfloat) 0.694795, (GLfloat) - 0.500000, + (GLfloat) 0.883764, (GLfloat) 0.687079, (GLfloat) - 0.587500, + (GLfloat) 0.907078, (GLfloat) 0.697653, (GLfloat) - 0.594723, + (GLfloat) 0.941357, (GLfloat) 0.556014, (GLfloat) - 0.717914, + (GLfloat) 0.943249, (GLfloat) 0.633115, (GLfloat) - 0.671218, + (GLfloat) 0.941357, (GLfloat) 0.556014, (GLfloat) - 0.282086, + (GLfloat) 0.943249, (GLfloat) 0.633115, (GLfloat) - 0.328782, + (GLfloat) 0.883764, (GLfloat) 0.687079, (GLfloat) - 0.412500, + (GLfloat) 0.907078, (GLfloat) 0.697653, (GLfloat) - 0.405277, + (GLfloat) 1.071585, (GLfloat) 0.569561, (GLfloat) - 0.420041, + (GLfloat) 0.998334, (GLfloat) 0.635570, (GLfloat) - 0.412770, + (GLfloat) 0.861889, (GLfloat) 0.571579, (GLfloat) - 0.409500, + (GLfloat) 0.870135, (GLfloat) 0.645704, (GLfloat) - 0.417500, + (GLfloat) 0.882548, (GLfloat) 0.702579, (GLfloat) - 0.500000, + (GLfloat) 0.883764, (GLfloat) 0.568579, (GLfloat) - 0.294000, + (GLfloat) 0.884979, (GLfloat) 0.641954, (GLfloat) - 0.339125, + (GLfloat) 0.883764, (GLfloat) 0.568579, (GLfloat) - 0.706000, + (GLfloat) 0.884979, (GLfloat) 0.641954, (GLfloat) - 0.660875, + (GLfloat) 0.861889, (GLfloat) 0.571579, (GLfloat) - 0.590500, + (GLfloat) 0.870135, (GLfloat) 0.645704, (GLfloat) - 0.582500, + (GLfloat) 1.056455, (GLfloat) 0.468757, (GLfloat) - 0.313428, + (GLfloat) 0.990769, (GLfloat) 0.522168, (GLfloat) - 0.296464, + (GLfloat) 0.936818, (GLfloat) 0.370973, (GLfloat) - 0.282086, + (GLfloat) 0.939088, (GLfloat) 0.463494, (GLfloat) - 0.266520, + (GLfloat) 0.906322, (GLfloat) 0.571188, (GLfloat) - 0.278521, + (GLfloat) 0.933792, (GLfloat) 0.247612, (GLfloat) - 0.406608, + (GLfloat) 0.934927, (GLfloat) 0.293873, (GLfloat) - 0.328782, + (GLfloat) 0.883764, (GLfloat) 0.393579, (GLfloat) - 0.294000, + (GLfloat) 0.905187, (GLfloat) 0.382177, (GLfloat) - 0.278521, + (GLfloat) 1.033759, (GLfloat) 0.317550, (GLfloat) - 0.313428, + (GLfloat) 0.979421, (GLfloat) 0.352064, (GLfloat) - 0.296464, + (GLfloat) 0.861889, (GLfloat) 0.390579, (GLfloat) - 0.409500, + (GLfloat) 0.870135, (GLfloat) 0.398579, (GLfloat) - 0.335375, + (GLfloat) 0.882548, (GLfloat) 0.481079, (GLfloat) - 0.278500, + (GLfloat) 0.883764, (GLfloat) 0.275079, (GLfloat) - 0.412500, + (GLfloat) 0.884979, (GLfloat) 0.320204, (GLfloat) - 0.339125, + (GLfloat) 0.870135, (GLfloat) 0.563579, (GLfloat) - 0.335375, + (GLfloat) 1.018628, (GLfloat) 0.216746, (GLfloat) - 0.420041, + (GLfloat) 0.971855, (GLfloat) 0.238662, (GLfloat) - 0.412770, + (GLfloat) 0.933792, (GLfloat) 0.247612, (GLfloat) - 0.593392, + (GLfloat) 0.933414, (GLfloat) 0.232192, (GLfloat) - 0.500000, + (GLfloat) 0.904430, (GLfloat) 0.255712, (GLfloat) - 0.405277, + (GLfloat) 0.936818, (GLfloat) 0.370973, (GLfloat) - 0.717914, + (GLfloat) 0.934927, (GLfloat) 0.293873, (GLfloat) - 0.671218, + (GLfloat) 0.883764, (GLfloat) 0.275079, (GLfloat) - 0.587500, + (GLfloat) 0.904430, (GLfloat) 0.255712, (GLfloat) - 0.594723, + (GLfloat) 1.018628, (GLfloat) 0.216746, (GLfloat) - 0.579959, + (GLfloat) 0.971855, (GLfloat) 0.238662, (GLfloat) - 0.587230, + (GLfloat) 0.861889, (GLfloat) 0.390579, (GLfloat) - 0.590500, + (GLfloat) 0.870135, (GLfloat) 0.316454, (GLfloat) - 0.582500, + (GLfloat) 0.882548, (GLfloat) 0.259579, (GLfloat) - 0.500000, + (GLfloat) 0.883764, (GLfloat) 0.393579, (GLfloat) - 0.706000, + (GLfloat) 0.884979, (GLfloat) 0.320204, (GLfloat) - 0.660875, + (GLfloat) 0.870135, (GLfloat) 0.316454, (GLfloat) - 0.417500, + (GLfloat) 1.033759, (GLfloat) 0.317550, (GLfloat) - 0.686572, + (GLfloat) 0.979421, (GLfloat) 0.352064, (GLfloat) - 0.703536, + (GLfloat) 0.939088, (GLfloat) 0.463494, (GLfloat) - 0.733480, + (GLfloat) 0.905187, (GLfloat) 0.382177, (GLfloat) - 0.721479, + (GLfloat) 0.906322, (GLfloat) 0.571188, (GLfloat) - 0.721479, + (GLfloat) 1.056455, (GLfloat) 0.468757, (GLfloat) - 0.686572, + (GLfloat) 0.990769, (GLfloat) 0.522168, (GLfloat) - 0.703536, + (GLfloat) 0.870135, (GLfloat) 0.563579, (GLfloat) - 0.664625, + (GLfloat) 0.882548, (GLfloat) 0.481079, (GLfloat) - 0.721500, + (GLfloat) 0.870135, (GLfloat) 0.398579, (GLfloat) - 0.664625, + (GLfloat) 0.859111, (GLfloat) 0.481079, (GLfloat) - 0.402250, + (GLfloat) 0.859111, (GLfloat) 0.578829, (GLfloat) - 0.500000, + (GLfloat) 0.859111, (GLfloat) 0.383329, (GLfloat) - 0.500000, + (GLfloat) 0.859111, (GLfloat) 0.481079, (GLfloat) - 0.597750, + (GLfloat) 1.065911, (GLfloat) 0.531759, (GLfloat) - 0.646592, + (GLfloat) 1.253715, (GLfloat) 0.391468, (GLfloat) - 0.567669, + (GLfloat) 1.158568, (GLfloat) 0.486483, (GLfloat) - 0.572975, + (GLfloat) 1.073477, (GLfloat) 0.582162, (GLfloat) - 0.500000, + (GLfloat) 1.446226, (GLfloat) 0.186168, (GLfloat) - 0.567669, + (GLfloat) 1.351457, (GLfloat) 0.289652, (GLfloat) - 0.565436, + (GLfloat) 1.253715, (GLfloat) 0.391468, (GLfloat) - 0.432331, + (GLfloat) 1.258403, (GLfloat) 0.400600, (GLfloat) - 0.500000, + (GLfloat) 1.216209, (GLfloat) 0.318418, (GLfloat) - 0.657894, + (GLfloat) 1.239650, (GLfloat) 0.364075, (GLfloat) - 0.624059, + (GLfloat) 1.216209, (GLfloat) 0.318418, (GLfloat) - 0.342106, + (GLfloat) 1.239650, (GLfloat) 0.364075, (GLfloat) - 0.375941, + (GLfloat) 1.158568, (GLfloat) 0.486483, (GLfloat) - 0.427025, + (GLfloat) 1.446226, (GLfloat) 0.186168, (GLfloat) - 0.432331, + (GLfloat) 1.351457, (GLfloat) 0.289652, (GLfloat) - 0.434564, + (GLfloat) 1.065911, (GLfloat) 0.531759, (GLfloat) - 0.353408, + (GLfloat) 1.024302, (GLfloat) 0.254547, (GLfloat) - 0.646592, + (GLfloat) 1.159950, (GLfloat) 0.208844, (GLfloat) - 0.657894, + (GLfloat) 1.095409, (GLfloat) 0.269215, (GLfloat) - 0.670274, + (GLfloat) 1.045107, (GLfloat) 0.393153, (GLfloat) - 0.699898, + (GLfloat) 1.280017, (GLfloat) 0.059132, (GLfloat) - 0.657894, + (GLfloat) 1.222960, (GLfloat) 0.138221, (GLfloat) - 0.652683, + (GLfloat) 1.188080, (GLfloat) 0.263631, (GLfloat) - 0.669172, + (GLfloat) 1.122445, (GLfloat) 0.135794, (GLfloat) - 0.567669, + (GLfloat) 1.136509, (GLfloat) 0.163187, (GLfloat) - 0.624059, + (GLfloat) 1.133305, (GLfloat) 0.399575, (GLfloat) - 0.670274, + (GLfloat) 1.379742, (GLfloat) 0.135354, (GLfloat) - 0.657894, + (GLfloat) 1.300058, (GLfloat) 0.229080, (GLfloat) - 0.652683, + (GLfloat) 1.045107, (GLfloat) 0.393153, (GLfloat) - 0.300102, + (GLfloat) 1.159950, (GLfloat) 0.208844, (GLfloat) - 0.342106, + (GLfloat) 1.095409, (GLfloat) 0.269215, (GLfloat) - 0.329726, + (GLfloat) 1.024302, (GLfloat) 0.254547, (GLfloat) - 0.353408, + (GLfloat) 1.133305, (GLfloat) 0.399575, (GLfloat) - 0.329726, + (GLfloat) 1.379742, (GLfloat) 0.135354, (GLfloat) - 0.342106, + (GLfloat) 1.300058, (GLfloat) 0.229080, (GLfloat) - 0.347317, + (GLfloat) 1.188080, (GLfloat) 0.263631, (GLfloat) - 0.330828, + (GLfloat) 1.122445, (GLfloat) 0.135794, (GLfloat) - 0.432331, + (GLfloat) 1.136509, (GLfloat) 0.163187, (GLfloat) - 0.375941, + (GLfloat) 1.280017, (GLfloat) 0.059132, (GLfloat) - 0.342106, + (GLfloat) 1.222960, (GLfloat) 0.138221, (GLfloat) - 0.347317, + (GLfloat) 1.016736, (GLfloat) 0.204145, (GLfloat) - 0.500000, + (GLfloat) 1.070145, (GLfloat) 0.182308, (GLfloat) - 0.572975, + (GLfloat) 1.070145, (GLfloat) 0.182308, (GLfloat) - 0.427025, + (GLfloat) 1.213533, (GLfloat) 0.008318, (GLfloat) - 0.432331, + (GLfloat) 1.171562, (GLfloat) 0.077649, (GLfloat) - 0.434564, + (GLfloat) 1.117756, (GLfloat) 0.126662, (GLfloat) - 0.500000, + (GLfloat) 1.213533, (GLfloat) 0.008318, (GLfloat) - 0.567669, + (GLfloat) 1.171562, (GLfloat) 0.077649, (GLfloat) - 0.565436, + (GLfloat) 1.370721, (GLfloat) - 0.099359, (GLfloat) - 0.686572, + (GLfloat) 1.420971, (GLfloat) - 0.216460, (GLfloat) - 0.717914, + (GLfloat) 1.401596, (GLfloat) - 0.166219, (GLfloat) - 0.703536, + (GLfloat) 1.515124, (GLfloat) - 0.041541, (GLfloat) - 0.686572, + (GLfloat) 1.442923, (GLfloat) - 0.070450, (GLfloat) - 0.699898, + (GLfloat) 1.329732, (GLfloat) - 0.022152, (GLfloat) - 0.670274, + (GLfloat) 1.274453, (GLfloat) - 0.137904, (GLfloat) - 0.579959, + (GLfloat) 1.310553, (GLfloat) - 0.123450, (GLfloat) - 0.646592, + (GLfloat) 1.611392, (GLfloat) - 0.002996, (GLfloat) - 0.579959, + (GLfloat) 1.575292, (GLfloat) - 0.017451, (GLfloat) - 0.646592, + (GLfloat) 1.452388, (GLfloat) 0.043170, (GLfloat) - 0.670274, + (GLfloat) 1.599377, (GLfloat) - 0.164832, (GLfloat) - 0.717914, + (GLfloat) 1.565078, (GLfloat) - 0.112852, (GLfloat) - 0.703536, + (GLfloat) 1.329879, (GLfloat) 0.097243, (GLfloat) - 0.669172, + (GLfloat) 1.421294, (GLfloat) 0.167113, (GLfloat) - 0.624059, + (GLfloat) 1.238464, (GLfloat) 0.027373, (GLfloat) - 0.624059, + (GLfloat) 1.247962, (GLfloat) - 0.065700, (GLfloat) - 0.572975, + (GLfloat) 1.274453, (GLfloat) - 0.137904, (GLfloat) - 0.420041, + (GLfloat) 1.262419, (GLfloat) - 0.142723, (GLfloat) - 0.500000, + (GLfloat) 1.302034, (GLfloat) - 0.250880, (GLfloat) - 0.593392, + (GLfloat) 1.292609, (GLfloat) - 0.201797, (GLfloat) - 0.587230, + (GLfloat) 1.205222, (GLfloat) 0.001966, (GLfloat) - 0.500000, + (GLfloat) 1.238464, (GLfloat) 0.027373, (GLfloat) - 0.375941, + (GLfloat) 1.247962, (GLfloat) - 0.065700, (GLfloat) - 0.427025, + (GLfloat) 1.302034, (GLfloat) - 0.250880, (GLfloat) - 0.406608, + (GLfloat) 1.292609, (GLfloat) - 0.201797, (GLfloat) - 0.412770, + (GLfloat) 1.370721, (GLfloat) - 0.099359, (GLfloat) - 0.313428, + (GLfloat) 1.310553, (GLfloat) - 0.123450, (GLfloat) - 0.353408, + (GLfloat) 1.329732, (GLfloat) - 0.022152, (GLfloat) - 0.329726, + (GLfloat) 1.515124, (GLfloat) - 0.041541, (GLfloat) - 0.313428, + (GLfloat) 1.442923, (GLfloat) - 0.070450, (GLfloat) - 0.300102, + (GLfloat) 1.420971, (GLfloat) - 0.216460, (GLfloat) - 0.282086, + (GLfloat) 1.401596, (GLfloat) - 0.166219, (GLfloat) - 0.296464, + (GLfloat) 1.329879, (GLfloat) 0.097243, (GLfloat) - 0.330828, + (GLfloat) 1.421294, (GLfloat) 0.167113, (GLfloat) - 0.375941, + (GLfloat) 1.452388, (GLfloat) 0.043170, (GLfloat) - 0.329726, + (GLfloat) 1.599377, (GLfloat) - 0.164832, (GLfloat) - 0.282086, + (GLfloat) 1.565078, (GLfloat) - 0.112852, (GLfloat) - 0.296464, + (GLfloat) 1.611392, (GLfloat) - 0.002996, (GLfloat) - 0.420041, + (GLfloat) 1.575292, (GLfloat) - 0.017451, (GLfloat) - 0.353408, + (GLfloat) 1.534158, (GLfloat) 0.086718, (GLfloat) - 0.427025, + (GLfloat) 1.623426, (GLfloat) 0.001822, (GLfloat) - 0.500000, + (GLfloat) 1.718314, (GLfloat) - 0.130413, (GLfloat) - 0.406608, + (GLfloat) 1.674065, (GLfloat) - 0.077274, (GLfloat) - 0.412770, + (GLfloat) 1.454536, (GLfloat) 0.192520, (GLfloat) - 0.500000, + (GLfloat) 1.534158, (GLfloat) 0.086718, (GLfloat) - 0.572975, + (GLfloat) 1.718314, (GLfloat) - 0.130413, (GLfloat) - 0.593392, + (GLfloat) 1.674065, (GLfloat) - 0.077274, (GLfloat) - 0.587230, + (GLfloat) 1.733181, (GLfloat) - 0.126110, (GLfloat) - 0.500000, + (GLfloat) 1.733426, (GLfloat) - 0.195216, (GLfloat) - 0.412500, + (GLfloat) 1.739610, (GLfloat) - 0.167898, (GLfloat) - 0.405277, + (GLfloat) 1.673712, (GLfloat) - 0.143320, (GLfloat) - 0.328782, + (GLfloat) 1.673712, (GLfloat) - 0.143320, (GLfloat) - 0.671218, + (GLfloat) 1.733426, (GLfloat) - 0.195216, (GLfloat) - 0.587500, + (GLfloat) 1.739610, (GLfloat) - 0.167898, (GLfloat) - 0.594723, + (GLfloat) 1.627523, (GLfloat) - 0.246239, (GLfloat) - 0.590500, + (GLfloat) 1.696988, (GLfloat) - 0.219088, (GLfloat) - 0.582500, + (GLfloat) 1.748713, (GLfloat) - 0.192378, (GLfloat) - 0.500000, + (GLfloat) 1.618964, (GLfloat) - 0.225886, (GLfloat) - 0.706000, + (GLfloat) 1.689524, (GLfloat) - 0.205721, (GLfloat) - 0.660875, + (GLfloat) 1.618964, (GLfloat) - 0.225886, (GLfloat) - 0.294000, + (GLfloat) 1.689524, (GLfloat) - 0.205721, (GLfloat) - 0.339125, + (GLfloat) 1.627523, (GLfloat) - 0.246239, (GLfloat) - 0.409500, + (GLfloat) 1.696988, (GLfloat) - 0.219088, (GLfloat) - 0.417500, + (GLfloat) 1.510174, (GLfloat) - 0.190646, (GLfloat) - 0.733480, + (GLfloat) 1.617509, (GLfloat) - 0.201252, (GLfloat) - 0.721479, + (GLfloat) 1.346635, (GLfloat) - 0.237972, (GLfloat) - 0.671218, + (GLfloat) 1.449927, (GLfloat) - 0.271179, (GLfloat) - 0.706000, + (GLfloat) 1.435022, (GLfloat) - 0.251106, (GLfloat) - 0.721479, + (GLfloat) 1.452691, (GLfloat) - 0.293085, (GLfloat) - 0.590500, + (GLfloat) 1.458284, (GLfloat) - 0.283049, (GLfloat) - 0.664625, + (GLfloat) 1.534760, (GLfloat) - 0.249706, (GLfloat) - 0.721500, + (GLfloat) 1.335465, (GLfloat) - 0.301849, (GLfloat) - 0.587500, + (GLfloat) 1.378738, (GLfloat) - 0.288996, (GLfloat) - 0.660875, + (GLfloat) 1.617662, (GLfloat) - 0.240344, (GLfloat) - 0.664625, + (GLfloat) 1.287166, (GLfloat) - 0.255182, (GLfloat) - 0.500000, + (GLfloat) 1.312921, (GLfloat) - 0.284460, (GLfloat) - 0.594723, + (GLfloat) 1.346635, (GLfloat) - 0.237972, (GLfloat) - 0.328782, + (GLfloat) 1.335465, (GLfloat) - 0.301849, (GLfloat) - 0.412500, + (GLfloat) 1.312921, (GLfloat) - 0.284460, (GLfloat) - 0.405277, + (GLfloat) 1.452691, (GLfloat) - 0.293085, (GLfloat) - 0.409500, + (GLfloat) 1.378957, (GLfloat) - 0.304305, (GLfloat) - 0.417500, + (GLfloat) 1.320807, (GLfloat) - 0.307035, (GLfloat) - 0.500000, + (GLfloat) 1.449927, (GLfloat) - 0.271179, (GLfloat) - 0.294000, + (GLfloat) 1.378738, (GLfloat) - 0.288996, (GLfloat) - 0.339125, + (GLfloat) 1.378957, (GLfloat) - 0.304305, (GLfloat) - 0.582500, + (GLfloat) 1.510174, (GLfloat) - 0.190646, (GLfloat) - 0.266520, + (GLfloat) 1.435022, (GLfloat) - 0.251106, (GLfloat) - 0.278521, + (GLfloat) 1.617509, (GLfloat) - 0.201252, (GLfloat) - 0.278521, + (GLfloat) 1.617662, (GLfloat) - 0.240344, (GLfloat) - 0.335375, + (GLfloat) 1.534760, (GLfloat) - 0.249706, (GLfloat) - 0.278500, + (GLfloat) 1.458284, (GLfloat) - 0.283049, (GLfloat) - 0.335375, + (GLfloat) 1.540826, (GLfloat) - 0.272345, (GLfloat) - 0.597750, + (GLfloat) 1.635245, (GLfloat) - 0.247046, (GLfloat) - 0.500000, + (GLfloat) 1.446407, (GLfloat) - 0.297645, (GLfloat) - 0.500000, + (GLfloat) 1.540826, (GLfloat) - 0.272345, (GLfloat) - 0.402250, +}; + +static GLfloat s1_5_normals[] = +{ + (GLfloat) 0.600201, (GLfloat) 0.679955, (GLfloat) - 0.421211, + (GLfloat) 0.608958, (GLfloat) 0.677912, (GLfloat) - 0.411832, + (GLfloat) 0.631502, (GLfloat) 0.764222, (GLfloat) - 0.131036, + (GLfloat) 0.633915, (GLfloat) 0.762655, (GLfloat) - 0.128491, + (GLfloat) 0.439368, (GLfloat) 0.885949, (GLfloat) - 0.148491, + (GLfloat) 0.440253, (GLfloat) 0.885591, (GLfloat) - 0.148004, + (GLfloat) 0.401172, (GLfloat) 0.784782, (GLfloat) - 0.472417, + (GLfloat) 0.401344, (GLfloat) 0.784757, (GLfloat) - 0.472314, + (GLfloat) 0.608958, (GLfloat) 0.677912, (GLfloat) 0.411832, + (GLfloat) 0.600202, (GLfloat) 0.679955, (GLfloat) 0.421211, + (GLfloat) 0.401173, (GLfloat) 0.784782, (GLfloat) 0.472416, + (GLfloat) 0.401344, (GLfloat) 0.784757, (GLfloat) 0.472314, + (GLfloat) 0.440253, (GLfloat) 0.885591, (GLfloat) 0.148004, + (GLfloat) 0.439368, (GLfloat) 0.885949, (GLfloat) 0.148491, + (GLfloat) 0.631502, (GLfloat) 0.764222, (GLfloat) 0.131036, + (GLfloat) 0.633915, (GLfloat) 0.762655, (GLfloat) 0.128491, + (GLfloat) - 0.936578, (GLfloat) 0.283620, (GLfloat) 0.205866, + (GLfloat) - 0.947923, (GLfloat) 0.264055, (GLfloat) 0.178092, + (GLfloat) - 0.946548, (GLfloat) 0.315105, (GLfloat) 0.068965, + (GLfloat) - 0.949849, (GLfloat) 0.304029, (GLfloat) 0.073162, + (GLfloat) - 0.446501, (GLfloat) 0.882153, (GLfloat) 0.149808, + (GLfloat) - 0.408128, (GLfloat) 0.897939, (GLfloat) 0.164731, + (GLfloat) - 0.523643, (GLfloat) 0.729794, (GLfloat) 0.439543, + (GLfloat) - 0.481115, (GLfloat) 0.743166, (GLfloat) 0.465009, + (GLfloat) - 0.947923, (GLfloat) 0.264056, (GLfloat) - 0.178092, + (GLfloat) - 0.936578, (GLfloat) 0.283620, (GLfloat) - 0.205866, + (GLfloat) - 0.523644, (GLfloat) 0.729794, (GLfloat) - 0.439543, + (GLfloat) - 0.481115, (GLfloat) 0.743165, (GLfloat) - 0.465009, + (GLfloat) - 0.408128, (GLfloat) 0.897939, (GLfloat) - 0.164732, + (GLfloat) - 0.446501, (GLfloat) 0.882153, (GLfloat) - 0.149808, + (GLfloat) - 0.949849, (GLfloat) 0.304029, (GLfloat) - 0.073162, + (GLfloat) - 0.946548, (GLfloat) 0.315105, (GLfloat) - 0.068965, + (GLfloat) 0.509419, (GLfloat) 0.426080, (GLfloat) 0.747629, + (GLfloat) 0.498886, (GLfloat) 0.439986, (GLfloat) 0.746676, + (GLfloat) 0.381490, (GLfloat) 0.130964, (GLfloat) 0.915048, + (GLfloat) 0.367056, (GLfloat) 0.145561, (GLfloat) 0.918739, + (GLfloat) 0.169535, (GLfloat) 0.163155, (GLfloat) 0.971925, + (GLfloat) 0.178255, (GLfloat) 0.158993, (GLfloat) 0.971054, + (GLfloat) 0.289187, (GLfloat) 0.493355, (GLfloat) 0.820349, + (GLfloat) 0.295492, (GLfloat) 0.489598, (GLfloat) 0.820352, + (GLfloat) 0.072844, (GLfloat) - 0.526213, (GLfloat) 0.847227, + (GLfloat) 0.057982, (GLfloat) - 0.518213, (GLfloat) 0.853284, + (GLfloat) - 0.086528, (GLfloat) - 0.515478, (GLfloat) 0.852523, + (GLfloat) - 0.089419, (GLfloat) - 0.514364, (GLfloat) 0.852898, + (GLfloat) 0.052047, (GLfloat) - 0.167008, (GLfloat) 0.984581, + (GLfloat) 0.051822, (GLfloat) - 0.166918, (GLfloat) 0.984608, + (GLfloat) 0.242298, (GLfloat) - 0.179154, (GLfloat) 0.953517, + (GLfloat) 0.225634, (GLfloat) - 0.167006, (GLfloat) 0.959791, + (GLfloat) - 0.936578, (GLfloat) - 0.205866, (GLfloat) 0.283621, + (GLfloat) - 0.947923, (GLfloat) - 0.178092, (GLfloat) 0.264055, + (GLfloat) - 0.946548, (GLfloat) - 0.068965, (GLfloat) 0.315105, + (GLfloat) - 0.949849, (GLfloat) - 0.073162, (GLfloat) 0.304029, + (GLfloat) - 0.624880, (GLfloat) - 0.128758, (GLfloat) 0.770030, + (GLfloat) - 0.585268, (GLfloat) - 0.149307, (GLfloat) 0.796975, + (GLfloat) - 0.702251, (GLfloat) - 0.367360, (GLfloat) 0.609828, + (GLfloat) - 0.666949, (GLfloat) - 0.398310, (GLfloat) 0.629705, + (GLfloat) - 0.947923, (GLfloat) 0.178092, (GLfloat) 0.264055, + (GLfloat) - 0.936578, (GLfloat) 0.205866, (GLfloat) 0.283621, + (GLfloat) - 0.567140, (GLfloat) 0.430351, (GLfloat) 0.702247, + (GLfloat) - 0.540648, (GLfloat) 0.447171, (GLfloat) 0.712557, + (GLfloat) - 0.547735, (GLfloat) 0.144705, (GLfloat) 0.824043, + (GLfloat) - 0.571109, (GLfloat) 0.150867, (GLfloat) 0.806892, + (GLfloat) - 0.949849, (GLfloat) 0.073162, (GLfloat) 0.304029, + (GLfloat) - 0.946548, (GLfloat) 0.068965, (GLfloat) 0.315105, + (GLfloat) - 0.119299, (GLfloat) - 0.854945, (GLfloat) 0.504814, + (GLfloat) - 0.127336, (GLfloat) - 0.851794, (GLfloat) 0.508166, + (GLfloat) - 0.198715, (GLfloat) - 0.967024, (GLfloat) 0.159301, + (GLfloat) - 0.201251, (GLfloat) - 0.966323, (GLfloat) 0.160367, + (GLfloat) - 0.255603, (GLfloat) - 0.953134, (GLfloat) 0.161871, + (GLfloat) - 0.245412, (GLfloat) - 0.956309, (GLfloat) 0.158892, + (GLfloat) - 0.220327, (GLfloat) - 0.834921, (GLfloat) 0.504344, + (GLfloat) - 0.208789, (GLfloat) - 0.839323, (GLfloat) 0.501940, + (GLfloat) - 0.127336, (GLfloat) - 0.851794, (GLfloat) - 0.508166, + (GLfloat) - 0.119299, (GLfloat) - 0.854945, (GLfloat) - 0.504814, + (GLfloat) - 0.220327, (GLfloat) - 0.834921, (GLfloat) - 0.504344, + (GLfloat) - 0.208789, (GLfloat) - 0.839323, (GLfloat) - 0.501940, + (GLfloat) - 0.245412, (GLfloat) - 0.956309, (GLfloat) - 0.158892, + (GLfloat) - 0.255603, (GLfloat) - 0.953134, (GLfloat) - 0.161871, + (GLfloat) - 0.198715, (GLfloat) - 0.967024, (GLfloat) - 0.159301, + (GLfloat) - 0.201251, (GLfloat) - 0.966323, (GLfloat) - 0.160367, + (GLfloat) - 0.936578, (GLfloat) - 0.283621, (GLfloat) - 0.205866, + (GLfloat) - 0.947923, (GLfloat) - 0.264056, (GLfloat) - 0.178092, + (GLfloat) - 0.946548, (GLfloat) - 0.315105, (GLfloat) - 0.068965, + (GLfloat) - 0.949849, (GLfloat) - 0.304029, (GLfloat) - 0.073162, + (GLfloat) - 0.700995, (GLfloat) - 0.702740, (GLfloat) - 0.121503, + (GLfloat) - 0.672056, (GLfloat) - 0.727490, (GLfloat) - 0.138204, + (GLfloat) - 0.726368, (GLfloat) - 0.580019, (GLfloat) - 0.368737, + (GLfloat) - 0.700623, (GLfloat) - 0.608968, (GLfloat) - 0.371867, + (GLfloat) - 0.947923, (GLfloat) - 0.264056, (GLfloat) 0.178092, + (GLfloat) - 0.936578, (GLfloat) - 0.283621, (GLfloat) 0.205866, + (GLfloat) - 0.700623, (GLfloat) - 0.608968, (GLfloat) 0.371867, + (GLfloat) - 0.726368, (GLfloat) - 0.580019, (GLfloat) 0.368738, + (GLfloat) - 0.672055, (GLfloat) - 0.727490, (GLfloat) 0.138204, + (GLfloat) - 0.700994, (GLfloat) - 0.702740, (GLfloat) 0.121503, + (GLfloat) - 0.949849, (GLfloat) - 0.304029, (GLfloat) 0.073162, + (GLfloat) - 0.946548, (GLfloat) - 0.315105, (GLfloat) 0.068965, + (GLfloat) 0.072844, (GLfloat) - 0.526213, (GLfloat) - 0.847227, + (GLfloat) 0.057982, (GLfloat) - 0.518214, (GLfloat) - 0.853284, + (GLfloat) 0.225635, (GLfloat) - 0.167007, (GLfloat) - 0.959790, + (GLfloat) 0.242298, (GLfloat) - 0.179154, (GLfloat) - 0.953517, + (GLfloat) 0.052045, (GLfloat) - 0.167008, (GLfloat) - 0.984581, + (GLfloat) 0.051820, (GLfloat) - 0.166918, (GLfloat) - 0.984608, + (GLfloat) - 0.089420, (GLfloat) - 0.514364, (GLfloat) - 0.852897, + (GLfloat) - 0.086529, (GLfloat) - 0.515478, (GLfloat) - 0.852523, + (GLfloat) 0.498887, (GLfloat) 0.439986, (GLfloat) - 0.746675, + (GLfloat) 0.509419, (GLfloat) 0.426080, (GLfloat) - 0.747628, + (GLfloat) 0.289186, (GLfloat) 0.493355, (GLfloat) - 0.820349, + (GLfloat) 0.295491, (GLfloat) 0.489598, (GLfloat) - 0.820353, + (GLfloat) 0.178253, (GLfloat) 0.158994, (GLfloat) - 0.971054, + (GLfloat) 0.169534, (GLfloat) 0.163155, (GLfloat) - 0.971925, + (GLfloat) 0.381491, (GLfloat) 0.130963, (GLfloat) - 0.915048, + (GLfloat) 0.367056, (GLfloat) 0.145561, (GLfloat) - 0.918739, + (GLfloat) - 0.936578, (GLfloat) 0.205866, (GLfloat) - 0.283621, + (GLfloat) - 0.947923, (GLfloat) 0.178092, (GLfloat) - 0.264056, + (GLfloat) - 0.946548, (GLfloat) 0.068965, (GLfloat) - 0.315105, + (GLfloat) - 0.949849, (GLfloat) 0.073162, (GLfloat) - 0.304029, + (GLfloat) - 0.547736, (GLfloat) 0.144705, (GLfloat) - 0.824043, + (GLfloat) - 0.571109, (GLfloat) 0.150867, (GLfloat) - 0.806892, + (GLfloat) - 0.567141, (GLfloat) 0.430351, (GLfloat) - 0.702246, + (GLfloat) - 0.540648, (GLfloat) 0.447171, (GLfloat) - 0.712557, + (GLfloat) - 0.947923, (GLfloat) - 0.178092, (GLfloat) - 0.264056, + (GLfloat) - 0.936578, (GLfloat) - 0.205866, (GLfloat) - 0.283621, + (GLfloat) - 0.702251, (GLfloat) - 0.367360, (GLfloat) - 0.609828, + (GLfloat) - 0.666949, (GLfloat) - 0.398310, (GLfloat) - 0.629705, + (GLfloat) - 0.585269, (GLfloat) - 0.149307, (GLfloat) - 0.796974, + (GLfloat) - 0.624880, (GLfloat) - 0.128758, (GLfloat) - 0.770030, + (GLfloat) - 0.949849, (GLfloat) - 0.073162, (GLfloat) - 0.304029, + (GLfloat) - 0.946548, (GLfloat) - 0.068965, (GLfloat) - 0.315105, + (GLfloat) - 0.982944, (GLfloat) 0.135802, (GLfloat) 0.124011, + (GLfloat) - 0.982944, (GLfloat) 0.124011, (GLfloat) 0.135802, + (GLfloat) - 0.993006, (GLfloat) 0.043834, (GLfloat) 0.109621, + (GLfloat) - 0.992607, (GLfloat) 0.039656, (GLfloat) 0.114709, + (GLfloat) - 0.998998, (GLfloat) 0.030163, (GLfloat) 0.033079, + (GLfloat) - 0.998998, (GLfloat) 0.033079, (GLfloat) 0.030163, + (GLfloat) - 0.993006, (GLfloat) 0.109621, (GLfloat) 0.043834, + (GLfloat) - 0.992607, (GLfloat) 0.114709, (GLfloat) 0.039656, + (GLfloat) - 0.982944, (GLfloat) - 0.124011, (GLfloat) 0.135803, + (GLfloat) - 0.982944, (GLfloat) - 0.135802, (GLfloat) 0.124011, + (GLfloat) - 0.993006, (GLfloat) - 0.109621, (GLfloat) 0.043834, + (GLfloat) - 0.992607, (GLfloat) - 0.114709, (GLfloat) 0.039656, + (GLfloat) - 0.998998, (GLfloat) - 0.033079, (GLfloat) 0.030163, + (GLfloat) - 0.998998, (GLfloat) - 0.030163, (GLfloat) 0.033079, + (GLfloat) - 0.993006, (GLfloat) - 0.043834, (GLfloat) 0.109621, + (GLfloat) - 0.992607, (GLfloat) - 0.039656, (GLfloat) 0.114709, + (GLfloat) - 0.982944, (GLfloat) - 0.135802, (GLfloat) - 0.124011, + (GLfloat) - 0.982944, (GLfloat) - 0.124011, (GLfloat) - 0.135802, + (GLfloat) - 0.993006, (GLfloat) - 0.043834, (GLfloat) - 0.109621, + (GLfloat) - 0.992607, (GLfloat) - 0.039656, (GLfloat) - 0.114709, + (GLfloat) - 0.998998, (GLfloat) - 0.030163, (GLfloat) - 0.033079, + (GLfloat) - 0.998998, (GLfloat) - 0.033079, (GLfloat) - 0.030163, + (GLfloat) - 0.993006, (GLfloat) - 0.109621, (GLfloat) - 0.043834, + (GLfloat) - 0.992607, (GLfloat) - 0.114709, (GLfloat) - 0.039656, + (GLfloat) - 0.982944, (GLfloat) 0.124011, (GLfloat) - 0.135802, + (GLfloat) - 0.982944, (GLfloat) 0.135802, (GLfloat) - 0.124011, + (GLfloat) - 0.993006, (GLfloat) 0.109621, (GLfloat) - 0.043834, + (GLfloat) - 0.992607, (GLfloat) 0.114709, (GLfloat) - 0.039656, + (GLfloat) - 0.998998, (GLfloat) 0.033079, (GLfloat) - 0.030163, + (GLfloat) - 0.998998, (GLfloat) 0.030163, (GLfloat) - 0.033079, + (GLfloat) - 0.993006, (GLfloat) 0.043834, (GLfloat) - 0.109621, + (GLfloat) - 0.992607, (GLfloat) 0.039656, (GLfloat) - 0.114709, + (GLfloat) 0.642600, (GLfloat) 0.650149, (GLfloat) - 0.405429, + (GLfloat) 0.629315, (GLfloat) 0.651735, (GLfloat) - 0.423326, + (GLfloat) 0.650102, (GLfloat) 0.622930, (GLfloat) - 0.435116, + (GLfloat) 0.644794, (GLfloat) 0.639958, (GLfloat) - 0.417963, + (GLfloat) 0.686498, (GLfloat) 0.714292, (GLfloat) - 0.136042, + (GLfloat) 0.690339, (GLfloat) 0.711978, (GLfloat) - 0.128528, + (GLfloat) 0.670965, (GLfloat) 0.730702, (GLfloat) - 0.126017, + (GLfloat) 0.667564, (GLfloat) 0.732887, (GLfloat) - 0.131284, + (GLfloat) 0.646461, (GLfloat) 0.595725, (GLfloat) - 0.476656, + (GLfloat) 0.646365, (GLfloat) 0.610461, (GLfloat) - 0.457766, + (GLfloat) 0.713253, (GLfloat) 0.686364, (GLfloat) - 0.142034, + (GLfloat) 0.714947, (GLfloat) 0.683066, (GLfloat) - 0.149235, + (GLfloat) 0.700923, (GLfloat) 0.700421, (GLfloat) - 0.134601, + (GLfloat) 0.703355, (GLfloat) 0.696368, (GLfloat) - 0.142698, + (GLfloat) 0.650658, (GLfloat) 0.606520, (GLfloat) - 0.456922, + (GLfloat) 0.648063, (GLfloat) 0.624636, (GLfloat) - 0.435712, + (GLfloat) 0.646461, (GLfloat) 0.595725, (GLfloat) 0.476655, + (GLfloat) 0.646365, (GLfloat) 0.610461, (GLfloat) 0.457766, + (GLfloat) 0.648063, (GLfloat) 0.624636, (GLfloat) 0.435712, + (GLfloat) 0.650658, (GLfloat) 0.606520, (GLfloat) 0.456922, + (GLfloat) 0.700923, (GLfloat) 0.700421, (GLfloat) 0.134601, + (GLfloat) 0.703355, (GLfloat) 0.696368, (GLfloat) 0.142698, + (GLfloat) 0.714947, (GLfloat) 0.683066, (GLfloat) 0.149235, + (GLfloat) 0.713253, (GLfloat) 0.686364, (GLfloat) 0.142034, + (GLfloat) 0.642600, (GLfloat) 0.650149, (GLfloat) 0.405428, + (GLfloat) 0.629314, (GLfloat) 0.651735, (GLfloat) 0.423326, + (GLfloat) 0.667564, (GLfloat) 0.732887, (GLfloat) 0.131284, + (GLfloat) 0.670965, (GLfloat) 0.730702, (GLfloat) 0.126017, + (GLfloat) 0.686498, (GLfloat) 0.714292, (GLfloat) 0.136042, + (GLfloat) 0.690339, (GLfloat) 0.711978, (GLfloat) 0.128528, + (GLfloat) 0.650102, (GLfloat) 0.622930, (GLfloat) 0.435116, + (GLfloat) 0.644795, (GLfloat) 0.639958, (GLfloat) 0.417963, + (GLfloat) - 0.056496, (GLfloat) - 0.528883, (GLfloat) - 0.846813, + (GLfloat) - 0.064290, (GLfloat) - 0.519887, (GLfloat) - 0.851812, + (GLfloat) - 0.173805, (GLfloat) - 0.513816, (GLfloat) - 0.840110, + (GLfloat) - 0.175837, (GLfloat) - 0.508498, (GLfloat) - 0.842918, + (GLfloat) 0.089052, (GLfloat) - 0.185853, (GLfloat) - 0.978534, + (GLfloat) 0.093599, (GLfloat) - 0.208853, (GLfloat) - 0.973458, + (GLfloat) 0.164361, (GLfloat) - 0.176843, (GLfloat) - 0.970418, + (GLfloat) 0.176320, (GLfloat) - 0.196482, (GLfloat) - 0.964524, + (GLfloat) - 0.389065, (GLfloat) - 0.390805, (GLfloat) - 0.834206, + (GLfloat) - 0.391186, (GLfloat) - 0.409817, (GLfloat) - 0.824029, + (GLfloat) - 0.093477, (GLfloat) - 0.154476, (GLfloat) - 0.983565, + (GLfloat) - 0.093921, (GLfloat) - 0.156341, (GLfloat) - 0.983228, + (GLfloat) 0.000626, (GLfloat) - 0.183607, (GLfloat) - 0.983000, + (GLfloat) - 0.000487, (GLfloat) - 0.201385, (GLfloat) - 0.979512, + (GLfloat) - 0.285892, (GLfloat) - 0.471460, (GLfloat) - 0.834261, + (GLfloat) - 0.285514, (GLfloat) - 0.475831, (GLfloat) - 0.831905, + (GLfloat) 0.435732, (GLfloat) 0.380700, (GLfloat) - 0.815601, + (GLfloat) 0.428982, (GLfloat) 0.354155, (GLfloat) - 0.830993, + (GLfloat) 0.473609, (GLfloat) 0.392091, (GLfloat) - 0.788643, + (GLfloat) 0.469979, (GLfloat) 0.356952, (GLfloat) - 0.807283, + (GLfloat) 0.244505, (GLfloat) 0.073495, (GLfloat) - 0.966859, + (GLfloat) 0.248781, (GLfloat) 0.107298, (GLfloat) - 0.962598, + (GLfloat) 0.172068, (GLfloat) 0.089497, (GLfloat) - 0.981011, + (GLfloat) 0.177919, (GLfloat) 0.109952, (GLfloat) - 0.977883, + (GLfloat) 0.511512, (GLfloat) 0.425325, (GLfloat) - 0.746629, + (GLfloat) 0.520411, (GLfloat) 0.400470, (GLfloat) - 0.754185, + (GLfloat) 0.360534, (GLfloat) 0.109169, (GLfloat) - 0.926336, + (GLfloat) 0.349374, (GLfloat) 0.135180, (GLfloat) - 0.927181, + (GLfloat) 0.311593, (GLfloat) 0.086000, (GLfloat) - 0.946316, + (GLfloat) 0.308233, (GLfloat) 0.120081, (GLfloat) - 0.943702, + (GLfloat) 0.500412, (GLfloat) 0.409092, (GLfloat) - 0.763041, + (GLfloat) 0.503536, (GLfloat) 0.376115, (GLfloat) - 0.777811, + (GLfloat) - 0.064290, (GLfloat) - 0.519886, (GLfloat) 0.851813, + (GLfloat) - 0.056496, (GLfloat) - 0.528883, (GLfloat) 0.846813, + (GLfloat) 0.164361, (GLfloat) - 0.176843, (GLfloat) 0.970418, + (GLfloat) 0.176319, (GLfloat) - 0.196482, (GLfloat) 0.964524, + (GLfloat) 0.093599, (GLfloat) - 0.208853, (GLfloat) 0.973458, + (GLfloat) 0.089052, (GLfloat) - 0.185852, (GLfloat) 0.978534, + (GLfloat) - 0.173805, (GLfloat) - 0.513817, (GLfloat) 0.840110, + (GLfloat) - 0.175837, (GLfloat) - 0.508498, (GLfloat) 0.842918, + (GLfloat) 0.511512, (GLfloat) 0.425325, (GLfloat) 0.746629, + (GLfloat) 0.520411, (GLfloat) 0.400470, (GLfloat) 0.754186, + (GLfloat) 0.503536, (GLfloat) 0.376115, (GLfloat) 0.777810, + (GLfloat) 0.500412, (GLfloat) 0.409092, (GLfloat) 0.763041, + (GLfloat) 0.311592, (GLfloat) 0.086000, (GLfloat) 0.946316, + (GLfloat) 0.308233, (GLfloat) 0.120080, (GLfloat) 0.943702, + (GLfloat) 0.349373, (GLfloat) 0.135180, (GLfloat) 0.927181, + (GLfloat) 0.360533, (GLfloat) 0.109169, (GLfloat) 0.926336, + (GLfloat) 0.428982, (GLfloat) 0.354155, (GLfloat) 0.830993, + (GLfloat) 0.435731, (GLfloat) 0.380700, (GLfloat) 0.815602, + (GLfloat) 0.172068, (GLfloat) 0.089497, (GLfloat) 0.981011, + (GLfloat) 0.177918, (GLfloat) 0.109951, (GLfloat) 0.977883, + (GLfloat) 0.248781, (GLfloat) 0.107298, (GLfloat) 0.962598, + (GLfloat) 0.244505, (GLfloat) 0.073494, (GLfloat) 0.966859, + (GLfloat) 0.473609, (GLfloat) 0.392091, (GLfloat) 0.788643, + (GLfloat) 0.469979, (GLfloat) 0.356951, (GLfloat) 0.807283, + (GLfloat) - 0.389065, (GLfloat) - 0.390805, (GLfloat) 0.834206, + (GLfloat) - 0.391186, (GLfloat) - 0.409816, (GLfloat) 0.824029, + (GLfloat) - 0.285514, (GLfloat) - 0.475832, (GLfloat) 0.831905, + (GLfloat) - 0.285892, (GLfloat) - 0.471460, (GLfloat) 0.834261, + (GLfloat) 0.000626, (GLfloat) - 0.183607, (GLfloat) 0.983000, + (GLfloat) - 0.000486, (GLfloat) - 0.201385, (GLfloat) 0.979512, + (GLfloat) - 0.093921, (GLfloat) - 0.156340, (GLfloat) 0.983228, + (GLfloat) - 0.093477, (GLfloat) - 0.154476, (GLfloat) 0.983565, + (GLfloat) - 0.306817, (GLfloat) - 0.816247, (GLfloat) - 0.489494, + (GLfloat) - 0.306526, (GLfloat) - 0.816474, (GLfloat) - 0.489298, + (GLfloat) - 0.401007, (GLfloat) - 0.903402, (GLfloat) - 0.151850, + (GLfloat) - 0.400054, (GLfloat) - 0.903928, (GLfloat) - 0.151230, + (GLfloat) - 0.539523, (GLfloat) - 0.829080, (GLfloat) - 0.146769, + (GLfloat) - 0.536423, (GLfloat) - 0.831619, (GLfloat) - 0.143741, + (GLfloat) - 0.439125, (GLfloat) - 0.764873, (GLfloat) - 0.471315, + (GLfloat) - 0.443186, (GLfloat) - 0.759550, (GLfloat) - 0.476099, + (GLfloat) - 0.306817, (GLfloat) - 0.816247, (GLfloat) 0.489494, + (GLfloat) - 0.306526, (GLfloat) - 0.816474, (GLfloat) 0.489298, + (GLfloat) - 0.443186, (GLfloat) - 0.759550, (GLfloat) 0.476099, + (GLfloat) - 0.439125, (GLfloat) - 0.764873, (GLfloat) 0.471315, + (GLfloat) - 0.539523, (GLfloat) - 0.829080, (GLfloat) 0.146769, + (GLfloat) - 0.536423, (GLfloat) - 0.831619, (GLfloat) 0.143741, + (GLfloat) - 0.400054, (GLfloat) - 0.903928, (GLfloat) 0.151230, + (GLfloat) - 0.401007, (GLfloat) - 0.903402, (GLfloat) 0.151850, + (GLfloat) - 0.663042, (GLfloat) - 0.578347, (GLfloat) 0.475278, + (GLfloat) - 0.658558, (GLfloat) - 0.599157, (GLfloat) 0.455315, + (GLfloat) - 0.758279, (GLfloat) - 0.634927, (GLfloat) 0.147920, + (GLfloat) - 0.753882, (GLfloat) - 0.642163, (GLfloat) 0.138885, + (GLfloat) - 0.655091, (GLfloat) - 0.742671, (GLfloat) 0.138907, + (GLfloat) - 0.649182, (GLfloat) - 0.746545, (GLfloat) 0.145716, + (GLfloat) - 0.547340, (GLfloat) - 0.690985, (GLfloat) 0.472185, + (GLfloat) - 0.565022, (GLfloat) - 0.687356, (GLfloat) 0.456390, + (GLfloat) - 0.658558, (GLfloat) - 0.599157, (GLfloat) - 0.455315, + (GLfloat) - 0.663042, (GLfloat) - 0.578347, (GLfloat) - 0.475278, + (GLfloat) - 0.565022, (GLfloat) - 0.687356, (GLfloat) - 0.456390, + (GLfloat) - 0.547340, (GLfloat) - 0.690985, (GLfloat) - 0.472185, + (GLfloat) - 0.655091, (GLfloat) - 0.742671, (GLfloat) - 0.138907, + (GLfloat) - 0.649182, (GLfloat) - 0.746545, (GLfloat) - 0.145716, + (GLfloat) - 0.758279, (GLfloat) - 0.634927, (GLfloat) - 0.147920, + (GLfloat) - 0.753882, (GLfloat) - 0.642163, (GLfloat) - 0.138885, + (GLfloat) - 0.531808, (GLfloat) - 0.030854, (GLfloat) - 0.846303, + (GLfloat) - 0.547325, (GLfloat) - 0.021478, (GLfloat) - 0.836644, + (GLfloat) - 0.214400, (GLfloat) 0.129290, (GLfloat) - 0.968151, + (GLfloat) - 0.232550, (GLfloat) 0.136923, (GLfloat) - 0.962898, + (GLfloat) - 0.234685, (GLfloat) 0.079911, (GLfloat) - 0.968781, + (GLfloat) - 0.210181, (GLfloat) 0.075599, (GLfloat) - 0.974735, + (GLfloat) - 0.528653, (GLfloat) - 0.081793, (GLfloat) - 0.844888, + (GLfloat) - 0.538319, (GLfloat) - 0.109397, (GLfloat) - 0.835610, + (GLfloat) 0.375279, (GLfloat) 0.445115, (GLfloat) - 0.813043, + (GLfloat) 0.363044, (GLfloat) 0.448595, (GLfloat) - 0.816677, + (GLfloat) 0.362957, (GLfloat) 0.428038, (GLfloat) - 0.827675, + (GLfloat) 0.375627, (GLfloat) 0.426947, (GLfloat) - 0.822570, + (GLfloat) 0.060176, (GLfloat) 0.247143, (GLfloat) - 0.967109, + (GLfloat) 0.080139, (GLfloat) 0.245230, (GLfloat) - 0.966147, + (GLfloat) 0.077981, (GLfloat) 0.282100, (GLfloat) - 0.956211, + (GLfloat) 0.061364, (GLfloat) 0.287374, (GLfloat) - 0.955851, + (GLfloat) 0.394264, (GLfloat) 0.386154, (GLfloat) - 0.833931, + (GLfloat) 0.391969, (GLfloat) 0.379827, (GLfloat) - 0.837909, + (GLfloat) 0.108284, (GLfloat) 0.149184, (GLfloat) - 0.982863, + (GLfloat) 0.106809, (GLfloat) 0.145488, (GLfloat) - 0.983578, + (GLfloat) 0.087165, (GLfloat) 0.199761, (GLfloat) - 0.975960, + (GLfloat) 0.069423, (GLfloat) 0.198484, (GLfloat) - 0.977642, + (GLfloat) 0.378360, (GLfloat) 0.405238, (GLfloat) - 0.832242, + (GLfloat) 0.371158, (GLfloat) 0.404730, (GLfloat) - 0.835725, + (GLfloat) - 0.478648, (GLfloat) - 0.265386, (GLfloat) - 0.836939, + (GLfloat) - 0.486707, (GLfloat) - 0.296995, (GLfloat) - 0.821529, + (GLfloat) - 0.514523, (GLfloat) - 0.162550, (GLfloat) - 0.841929, + (GLfloat) - 0.525278, (GLfloat) - 0.195128, (GLfloat) - 0.828256, + (GLfloat) - 0.217558, (GLfloat) - 0.004195, (GLfloat) - 0.976038, + (GLfloat) - 0.206190, (GLfloat) 0.022881, (GLfloat) - 0.978244, + (GLfloat) - 0.182077, (GLfloat) - 0.080752, (GLfloat) - 0.979963, + (GLfloat) - 0.175153, (GLfloat) - 0.061621, (GLfloat) - 0.982611, + (GLfloat) - 0.843975, (GLfloat) - 0.195207, (GLfloat) - 0.499600, + (GLfloat) - 0.842535, (GLfloat) - 0.181717, (GLfloat) - 0.507064, + (GLfloat) - 0.827895, (GLfloat) - 0.272019, (GLfloat) - 0.490506, + (GLfloat) - 0.826118, (GLfloat) - 0.254451, (GLfloat) - 0.502777, + (GLfloat) - 0.933235, (GLfloat) - 0.321752, (GLfloat) - 0.159836, + (GLfloat) - 0.932223, (GLfloat) - 0.327025, (GLfloat) - 0.154968, + (GLfloat) - 0.954881, (GLfloat) - 0.249025, (GLfloat) - 0.161829, + (GLfloat) - 0.954307, (GLfloat) - 0.253099, (GLfloat) - 0.158871, + (GLfloat) - 0.754729, (GLfloat) - 0.466616, (GLfloat) - 0.461144, + (GLfloat) - 0.755670, (GLfloat) - 0.441894, (GLfloat) - 0.483419, + (GLfloat) - 0.851851, (GLfloat) - 0.501342, (GLfloat) - 0.151677, + (GLfloat) - 0.848780, (GLfloat) - 0.509248, (GLfloat) - 0.142264, + (GLfloat) - 0.902458, (GLfloat) - 0.401405, (GLfloat) - 0.156347, + (GLfloat) - 0.900638, (GLfloat) - 0.408254, (GLfloat) - 0.148931, + (GLfloat) - 0.801108, (GLfloat) - 0.337187, (GLfloat) - 0.494500, + (GLfloat) - 0.802422, (GLfloat) - 0.359565, (GLfloat) - 0.476269, + (GLfloat) - 0.754729, (GLfloat) - 0.466616, (GLfloat) 0.461144, + (GLfloat) - 0.755670, (GLfloat) - 0.441893, (GLfloat) 0.483419, + (GLfloat) - 0.802422, (GLfloat) - 0.359565, (GLfloat) 0.476269, + (GLfloat) - 0.801108, (GLfloat) - 0.337187, (GLfloat) 0.494500, + (GLfloat) - 0.902457, (GLfloat) - 0.401405, (GLfloat) 0.156348, + (GLfloat) - 0.900638, (GLfloat) - 0.408254, (GLfloat) 0.148931, + (GLfloat) - 0.848780, (GLfloat) - 0.509248, (GLfloat) 0.142264, + (GLfloat) - 0.851851, (GLfloat) - 0.501342, (GLfloat) 0.151677, + (GLfloat) - 0.842535, (GLfloat) - 0.181718, (GLfloat) 0.507064, + (GLfloat) - 0.843975, (GLfloat) - 0.195207, (GLfloat) 0.499600, + (GLfloat) - 0.954881, (GLfloat) - 0.249025, (GLfloat) 0.161829, + (GLfloat) - 0.954306, (GLfloat) - 0.253099, (GLfloat) 0.158871, + (GLfloat) - 0.932223, (GLfloat) - 0.327025, (GLfloat) 0.154968, + (GLfloat) - 0.933235, (GLfloat) - 0.321752, (GLfloat) 0.159836, + (GLfloat) - 0.827895, (GLfloat) - 0.272019, (GLfloat) 0.490506, + (GLfloat) - 0.826118, (GLfloat) - 0.254451, (GLfloat) 0.502777, + (GLfloat) - 0.547325, (GLfloat) - 0.021478, (GLfloat) 0.836644, + (GLfloat) - 0.531808, (GLfloat) - 0.030854, (GLfloat) 0.846303, + (GLfloat) - 0.538320, (GLfloat) - 0.109397, (GLfloat) 0.835610, + (GLfloat) - 0.528653, (GLfloat) - 0.081793, (GLfloat) 0.844888, + (GLfloat) - 0.210181, (GLfloat) 0.075599, (GLfloat) 0.974735, + (GLfloat) - 0.234685, (GLfloat) 0.079911, (GLfloat) 0.968781, + (GLfloat) - 0.214400, (GLfloat) 0.129290, (GLfloat) 0.968151, + (GLfloat) - 0.232550, (GLfloat) 0.136923, (GLfloat) 0.962898, + (GLfloat) - 0.486707, (GLfloat) - 0.296995, (GLfloat) 0.821529, + (GLfloat) - 0.478647, (GLfloat) - 0.265386, (GLfloat) 0.836939, + (GLfloat) - 0.182076, (GLfloat) - 0.080752, (GLfloat) 0.979963, + (GLfloat) - 0.175152, (GLfloat) - 0.061621, (GLfloat) 0.982611, + (GLfloat) - 0.206190, (GLfloat) 0.022882, (GLfloat) 0.978244, + (GLfloat) - 0.217558, (GLfloat) - 0.004194, (GLfloat) 0.976038, + (GLfloat) - 0.514523, (GLfloat) - 0.162550, (GLfloat) 0.841928, + (GLfloat) - 0.525277, (GLfloat) - 0.195127, (GLfloat) 0.828257, + (GLfloat) 0.394264, (GLfloat) 0.386154, (GLfloat) 0.833931, + (GLfloat) 0.391969, (GLfloat) 0.379827, (GLfloat) 0.837909, + (GLfloat) 0.378360, (GLfloat) 0.405238, (GLfloat) 0.832241, + (GLfloat) 0.371157, (GLfloat) 0.404730, (GLfloat) 0.835725, + (GLfloat) 0.069422, (GLfloat) 0.198484, (GLfloat) 0.977642, + (GLfloat) 0.087165, (GLfloat) 0.199761, (GLfloat) 0.975960, + (GLfloat) 0.106809, (GLfloat) 0.145488, (GLfloat) 0.983578, + (GLfloat) 0.108284, (GLfloat) 0.149183, (GLfloat) 0.982863, + (GLfloat) 0.375279, (GLfloat) 0.445115, (GLfloat) 0.813043, + (GLfloat) 0.363044, (GLfloat) 0.448594, (GLfloat) 0.816678, + (GLfloat) 0.061364, (GLfloat) 0.287374, (GLfloat) 0.955851, + (GLfloat) 0.077981, (GLfloat) 0.282099, (GLfloat) 0.956211, + (GLfloat) 0.060176, (GLfloat) 0.247143, (GLfloat) 0.967109, + (GLfloat) 0.080138, (GLfloat) 0.245229, (GLfloat) 0.966147, + (GLfloat) 0.375627, (GLfloat) 0.426947, (GLfloat) 0.822570, + (GLfloat) 0.362957, (GLfloat) 0.428038, (GLfloat) 0.827675, + (GLfloat) 0.646717, (GLfloat) 0.598054, (GLfloat) 0.473381, + (GLfloat) 0.647128, (GLfloat) 0.592930, (GLfloat) 0.479227, + (GLfloat) 0.644233, (GLfloat) 0.592287, (GLfloat) 0.483900, + (GLfloat) 0.644394, (GLfloat) 0.596473, (GLfloat) 0.478515, + (GLfloat) 0.743754, (GLfloat) 0.650774, (GLfloat) 0.152720, + (GLfloat) 0.743300, (GLfloat) 0.651663, (GLfloat) 0.151130, + (GLfloat) 0.748383, (GLfloat) 0.646124, (GLfloat) 0.149823, + (GLfloat) 0.749100, (GLfloat) 0.644879, (GLfloat) 0.151594, + (GLfloat) 0.643063, (GLfloat) 0.599196, (GLfloat) 0.476900, + (GLfloat) 0.642570, (GLfloat) 0.593487, (GLfloat) 0.484641, + (GLfloat) 0.726590, (GLfloat) 0.670731, (GLfloat) 0.148951, + (GLfloat) 0.727257, (GLfloat) 0.669291, (GLfloat) 0.152139, + (GLfloat) 0.736367, (GLfloat) 0.659214, (GLfloat) 0.152315, + (GLfloat) 0.736367, (GLfloat) 0.659216, (GLfloat) 0.152312, + (GLfloat) 0.642386, (GLfloat) 0.594552, (GLfloat) 0.483578, + (GLfloat) 0.642311, (GLfloat) 0.593780, (GLfloat) 0.484626, + (GLfloat) 0.642570, (GLfloat) 0.593487, (GLfloat) - 0.484641, + (GLfloat) 0.643063, (GLfloat) 0.599196, (GLfloat) - 0.476900, + (GLfloat) 0.642386, (GLfloat) 0.594552, (GLfloat) - 0.483577, + (GLfloat) 0.642311, (GLfloat) 0.593780, (GLfloat) - 0.484626, + (GLfloat) 0.736367, (GLfloat) 0.659216, (GLfloat) - 0.152312, + (GLfloat) 0.736367, (GLfloat) 0.659214, (GLfloat) - 0.152315, + (GLfloat) 0.726590, (GLfloat) 0.670731, (GLfloat) - 0.148951, + (GLfloat) 0.727257, (GLfloat) 0.669291, (GLfloat) - 0.152139, + (GLfloat) 0.646717, (GLfloat) 0.598054, (GLfloat) - 0.473381, + (GLfloat) 0.647128, (GLfloat) 0.592931, (GLfloat) - 0.479227, + (GLfloat) 0.749100, (GLfloat) 0.644879, (GLfloat) - 0.151594, + (GLfloat) 0.748383, (GLfloat) 0.646124, (GLfloat) - 0.149823, + (GLfloat) 0.743754, (GLfloat) 0.650774, (GLfloat) - 0.152720, + (GLfloat) 0.743300, (GLfloat) 0.651663, (GLfloat) - 0.151130, + (GLfloat) 0.644394, (GLfloat) 0.596473, (GLfloat) - 0.478515, + (GLfloat) 0.644234, (GLfloat) 0.592287, (GLfloat) - 0.483900, + (GLfloat) 0.648818, (GLfloat) 0.595244, (GLfloat) 0.474046, + (GLfloat) 0.647885, (GLfloat) 0.598960, (GLfloat) 0.470630, + (GLfloat) 0.751896, (GLfloat) 0.641953, (GLfloat) 0.150159, + (GLfloat) 0.751280, (GLfloat) 0.642895, (GLfloat) 0.149213, + (GLfloat) 0.855755, (GLfloat) 0.491872, (GLfloat) 0.160454, + (GLfloat) 0.854316, (GLfloat) 0.494902, (GLfloat) 0.158798, + (GLfloat) 0.746074, (GLfloat) 0.437172, (GLfloat) 0.502249, + (GLfloat) 0.745147, (GLfloat) 0.441097, (GLfloat) 0.500189, + (GLfloat) 0.647885, (GLfloat) 0.598960, (GLfloat) - 0.470630, + (GLfloat) 0.648818, (GLfloat) 0.595244, (GLfloat) - 0.474046, + (GLfloat) 0.746074, (GLfloat) 0.437172, (GLfloat) - 0.502249, + (GLfloat) 0.745147, (GLfloat) 0.441097, (GLfloat) - 0.500189, + (GLfloat) 0.854316, (GLfloat) 0.494902, (GLfloat) - 0.158798, + (GLfloat) 0.855755, (GLfloat) 0.491872, (GLfloat) - 0.160454, + (GLfloat) 0.751896, (GLfloat) 0.641953, (GLfloat) - 0.150159, + (GLfloat) 0.751280, (GLfloat) 0.642895, (GLfloat) - 0.149213, + (GLfloat) 0.516361, (GLfloat) - 0.831259, (GLfloat) - 0.205866, + (GLfloat) 0.500398, (GLfloat) - 0.847281, (GLfloat) - 0.178091, + (GLfloat) 0.549353, (GLfloat) - 0.832739, (GLfloat) - 0.068965, + (GLfloat) 0.539508, (GLfloat) - 0.838796, (GLfloat) - 0.073163, + (GLfloat) 0.955872, (GLfloat) - 0.254974, (GLfloat) - 0.145934, + (GLfloat) 0.962750, (GLfloat) - 0.217125, (GLfloat) - 0.161151, + (GLfloat) 0.832302, (GLfloat) - 0.349186, (GLfloat) - 0.430515, + (GLfloat) 0.834893, (GLfloat) - 0.309370, (GLfloat) - 0.455242, + (GLfloat) 0.500398, (GLfloat) - 0.847281, (GLfloat) 0.178091, + (GLfloat) 0.516361, (GLfloat) - 0.831259, (GLfloat) 0.205867, + (GLfloat) 0.832302, (GLfloat) - 0.349186, (GLfloat) 0.430515, + (GLfloat) 0.834893, (GLfloat) - 0.309369, (GLfloat) 0.455242, + (GLfloat) 0.962750, (GLfloat) - 0.217125, (GLfloat) 0.161151, + (GLfloat) 0.955872, (GLfloat) - 0.254973, (GLfloat) 0.145934, + (GLfloat) 0.539508, (GLfloat) - 0.838796, (GLfloat) 0.073163, + (GLfloat) 0.549353, (GLfloat) - 0.832739, (GLfloat) 0.068965, + (GLfloat) 0.365166, (GLfloat) 0.464177, (GLfloat) - 0.806966, + (GLfloat) 0.373210, (GLfloat) 0.459657, (GLfloat) - 0.805872, + (GLfloat) 0.064151, (GLfloat) 0.318725, (GLfloat) - 0.945674, + (GLfloat) 0.075117, (GLfloat) 0.311589, (GLfloat) - 0.947243, + (GLfloat) 0.127864, (GLfloat) 0.159455, (GLfloat) - 0.978890, + (GLfloat) 0.122956, (GLfloat) 0.165169, (GLfloat) - 0.978571, + (GLfloat) 0.446081, (GLfloat) 0.299065, (GLfloat) - 0.843547, + (GLfloat) 0.442539, (GLfloat) 0.302925, (GLfloat) - 0.844035, + (GLfloat) - 0.541197, (GLfloat) 0.047754, (GLfloat) - 0.839539, + (GLfloat) - 0.545743, (GLfloat) 0.029212, (GLfloat) - 0.837443, + (GLfloat) - 0.504199, (GLfloat) - 0.116458, (GLfloat) - 0.855699, + (GLfloat) - 0.503751, (GLfloat) - 0.117103, (GLfloat) - 0.855875, + (GLfloat) - 0.180218, (GLfloat) 0.028848, (GLfloat) - 0.983203, + (GLfloat) - 0.179757, (GLfloat) 0.028254, (GLfloat) - 0.983305, + (GLfloat) - 0.230218, (GLfloat) 0.184662, (GLfloat) - 0.955458, + (GLfloat) - 0.218138, (GLfloat) 0.174858, (GLfloat) - 0.960125, + (GLfloat) 0.043553, (GLfloat) - 0.957947, (GLfloat) - 0.283621, + (GLfloat) 0.073317, (GLfloat) - 0.961717, (GLfloat) - 0.264055, + (GLfloat) 0.178370, (GLfloat) - 0.932145, (GLfloat) - 0.315104, + (GLfloat) 0.175170, (GLfloat) - 0.936420, (GLfloat) - 0.304029, + (GLfloat) 0.021724, (GLfloat) - 0.600335, (GLfloat) - 0.799453, + (GLfloat) - 0.006371, (GLfloat) - 0.568607, (GLfloat) - 0.822585, + (GLfloat) - 0.212402, (GLfloat) - 0.727671, (GLfloat) - 0.652212, + (GLfloat) - 0.248701, (GLfloat) - 0.700487, (GLfloat) - 0.668929, + (GLfloat) 0.430757, (GLfloat) - 0.866899, (GLfloat) - 0.250869, + (GLfloat) 0.427975, (GLfloat) - 0.857309, (GLfloat) - 0.286110, + (GLfloat) 0.561354, (GLfloat) - 0.442015, (GLfloat) - 0.699646, + (GLfloat) 0.571558, (GLfloat) - 0.412112, (GLfloat) - 0.709567, + (GLfloat) 0.286734, (GLfloat) - 0.470609, (GLfloat) - 0.834453, + (GLfloat) 0.281923, (GLfloat) - 0.498471, (GLfloat) - 0.819784, + (GLfloat) 0.316508, (GLfloat) - 0.898548, (GLfloat) - 0.304029, + (GLfloat) 0.311600, (GLfloat) - 0.896446, (GLfloat) - 0.315104, + (GLfloat) - 0.857077, (GLfloat) - 0.113037, (GLfloat) - 0.502635, + (GLfloat) - 0.855920, (GLfloat) - 0.100677, (GLfloat) - 0.507214, + (GLfloat) - 0.973550, (GLfloat) - 0.162756, (GLfloat) - 0.160346, + (GLfloat) - 0.972585, (GLfloat) - 0.166359, (GLfloat) - 0.162491, + (GLfloat) - 0.942363, (GLfloat) - 0.290210, (GLfloat) - 0.166522, + (GLfloat) - 0.940343, (GLfloat) - 0.298398, (GLfloat) - 0.163441, + (GLfloat) - 0.819387, (GLfloat) - 0.257298, (GLfloat) - 0.512252, + (GLfloat) - 0.820563, (GLfloat) - 0.245585, (GLfloat) - 0.516105, + (GLfloat) - 0.857077, (GLfloat) - 0.113037, (GLfloat) 0.502635, + (GLfloat) - 0.855920, (GLfloat) - 0.100677, (GLfloat) 0.507214, + (GLfloat) - 0.820564, (GLfloat) - 0.245585, (GLfloat) 0.516104, + (GLfloat) - 0.819387, (GLfloat) - 0.257297, (GLfloat) 0.512252, + (GLfloat) - 0.942363, (GLfloat) - 0.290210, (GLfloat) 0.166522, + (GLfloat) - 0.940343, (GLfloat) - 0.298398, (GLfloat) 0.163441, + (GLfloat) - 0.973550, (GLfloat) - 0.162756, (GLfloat) 0.160346, + (GLfloat) - 0.972585, (GLfloat) - 0.166359, (GLfloat) 0.162491, + (GLfloat) - 0.031552, (GLfloat) - 0.978072, (GLfloat) 0.205866, + (GLfloat) - 0.009717, (GLfloat) - 0.983966, (GLfloat) 0.178091, + (GLfloat) - 0.059383, (GLfloat) - 0.995850, (GLfloat) 0.068965, + (GLfloat) - 0.047830, (GLfloat) - 0.996172, (GLfloat) 0.073163, + (GLfloat) - 0.608137, (GLfloat) - 0.782136, (GLfloat) 0.135767, + (GLfloat) - 0.575039, (GLfloat) - 0.805344, (GLfloat) 0.144053, + (GLfloat) - 0.440882, (GLfloat) - 0.803158, (GLfloat) 0.400699, + (GLfloat) - 0.474682, (GLfloat) - 0.782654, (GLfloat) 0.402654, + (GLfloat) - 0.009717, (GLfloat) - 0.983966, (GLfloat) - 0.178092, + (GLfloat) - 0.031552, (GLfloat) - 0.978072, (GLfloat) - 0.205866, + (GLfloat) - 0.474681, (GLfloat) - 0.782654, (GLfloat) - 0.402654, + (GLfloat) - 0.440881, (GLfloat) - 0.803159, (GLfloat) - 0.400699, + (GLfloat) - 0.608137, (GLfloat) - 0.782136, (GLfloat) - 0.135767, + (GLfloat) - 0.575039, (GLfloat) - 0.805344, (GLfloat) - 0.144053, + (GLfloat) - 0.047830, (GLfloat) - 0.996172, (GLfloat) - 0.073163, + (GLfloat) - 0.059383, (GLfloat) - 0.995850, (GLfloat) - 0.068965, + (GLfloat) - 0.545743, (GLfloat) 0.029212, (GLfloat) 0.837443, + (GLfloat) - 0.541197, (GLfloat) 0.047754, (GLfloat) 0.839539, + (GLfloat) - 0.218137, (GLfloat) 0.174858, (GLfloat) 0.960125, + (GLfloat) - 0.230218, (GLfloat) 0.184662, (GLfloat) 0.955458, + (GLfloat) - 0.180219, (GLfloat) 0.028850, (GLfloat) 0.983203, + (GLfloat) - 0.179757, (GLfloat) 0.028256, (GLfloat) 0.983305, + (GLfloat) - 0.503751, (GLfloat) - 0.117102, (GLfloat) 0.855875, + (GLfloat) - 0.504199, (GLfloat) - 0.116456, (GLfloat) 0.855699, + (GLfloat) 0.373209, (GLfloat) 0.459657, (GLfloat) 0.805872, + (GLfloat) 0.365166, (GLfloat) 0.464177, (GLfloat) 0.806966, + (GLfloat) 0.446081, (GLfloat) 0.299065, (GLfloat) 0.843547, + (GLfloat) 0.442539, (GLfloat) 0.302926, (GLfloat) 0.844035, + (GLfloat) 0.122955, (GLfloat) 0.165170, (GLfloat) 0.978571, + (GLfloat) 0.127864, (GLfloat) 0.159456, (GLfloat) 0.978889, + (GLfloat) 0.064151, (GLfloat) 0.318724, (GLfloat) 0.945674, + (GLfloat) 0.075117, (GLfloat) 0.311589, (GLfloat) 0.947243, + (GLfloat) 0.430757, (GLfloat) - 0.866899, (GLfloat) 0.250868, + (GLfloat) 0.427975, (GLfloat) - 0.857309, (GLfloat) 0.286110, + (GLfloat) 0.311600, (GLfloat) - 0.896446, (GLfloat) 0.315104, + (GLfloat) 0.316508, (GLfloat) - 0.898548, (GLfloat) 0.304029, + (GLfloat) 0.281923, (GLfloat) - 0.498471, (GLfloat) 0.819784, + (GLfloat) 0.286734, (GLfloat) - 0.470608, (GLfloat) 0.834453, + (GLfloat) 0.561354, (GLfloat) - 0.442014, (GLfloat) 0.699647, + (GLfloat) 0.571558, (GLfloat) - 0.412112, (GLfloat) 0.709567, + (GLfloat) 0.073318, (GLfloat) - 0.961717, (GLfloat) 0.264055, + (GLfloat) 0.043553, (GLfloat) - 0.957947, (GLfloat) 0.283620, + (GLfloat) - 0.212402, (GLfloat) - 0.727670, (GLfloat) 0.652213, + (GLfloat) - 0.248701, (GLfloat) - 0.700487, (GLfloat) 0.668929, + (GLfloat) - 0.006371, (GLfloat) - 0.568606, (GLfloat) 0.822585, + (GLfloat) 0.021725, (GLfloat) - 0.600335, (GLfloat) 0.799453, + (GLfloat) 0.175170, (GLfloat) - 0.936420, (GLfloat) 0.304028, + (GLfloat) 0.178370, (GLfloat) - 0.932145, (GLfloat) 0.315104, + (GLfloat) 0.385580, (GLfloat) - 0.914303, (GLfloat) - 0.124011, + (GLfloat) 0.374190, (GLfloat) - 0.917355, (GLfloat) - 0.135802, + (GLfloat) 0.299349, (GLfloat) - 0.947826, (GLfloat) - 0.109621, + (GLfloat) 0.295210, (GLfloat) - 0.948521, (GLfloat) - 0.114709, + (GLfloat) 0.287695, (GLfloat) - 0.957151, (GLfloat) - 0.033079, + (GLfloat) 0.290512, (GLfloat) - 0.956396, (GLfloat) - 0.030163, + (GLfloat) 0.362895, (GLfloat) - 0.930799, (GLfloat) - 0.043834, + (GLfloat) 0.367706, (GLfloat) - 0.929096, (GLfloat) - 0.039656, + (GLfloat) 0.134619, (GLfloat) - 0.981547, (GLfloat) - 0.135802, + (GLfloat) 0.123230, (GLfloat) - 0.984599, (GLfloat) - 0.124011, + (GLfloat) 0.151123, (GLfloat) - 0.987543, (GLfloat) - 0.043834, + (GLfloat) 0.146105, (GLfloat) - 0.988474, (GLfloat) - 0.039656, + (GLfloat) 0.226607, (GLfloat) - 0.973519, (GLfloat) - 0.030163, + (GLfloat) 0.229424, (GLfloat) - 0.972764, (GLfloat) - 0.033079, + (GLfloat) 0.214669, (GLfloat) - 0.970516, (GLfloat) - 0.109621, + (GLfloat) 0.218601, (GLfloat) - 0.969049, (GLfloat) - 0.114709, + (GLfloat) 0.123230, (GLfloat) - 0.984599, (GLfloat) 0.124011, + (GLfloat) 0.134619, (GLfloat) - 0.981547, (GLfloat) 0.135802, + (GLfloat) 0.214669, (GLfloat) - 0.970516, (GLfloat) 0.109621, + (GLfloat) 0.218601, (GLfloat) - 0.969049, (GLfloat) 0.114709, + (GLfloat) 0.229424, (GLfloat) - 0.972764, (GLfloat) 0.033079, + (GLfloat) 0.226607, (GLfloat) - 0.973519, (GLfloat) 0.030163, + (GLfloat) 0.151123, (GLfloat) - 0.987543, (GLfloat) 0.043834, + (GLfloat) 0.146105, (GLfloat) - 0.988474, (GLfloat) 0.039656, + (GLfloat) 0.374190, (GLfloat) - 0.917355, (GLfloat) 0.135803, + (GLfloat) 0.385580, (GLfloat) - 0.914303, (GLfloat) 0.124011, + (GLfloat) 0.362895, (GLfloat) - 0.930799, (GLfloat) 0.043834, + (GLfloat) 0.367706, (GLfloat) - 0.929096, (GLfloat) 0.039656, + (GLfloat) 0.290512, (GLfloat) - 0.956396, (GLfloat) 0.030163, + (GLfloat) 0.287695, (GLfloat) - 0.957151, (GLfloat) 0.033079, + (GLfloat) 0.299349, (GLfloat) - 0.947826, (GLfloat) 0.109621, + (GLfloat) 0.295210, (GLfloat) - 0.948521, (GLfloat) 0.114709, +}; + +static unsigned short int s1_5_POLS[] = +{ + 3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 76, 22, 78, 1, 3, 78, 74, 76, 1, + 3, 20, 80, 74, 1, 3, 20, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1, + 3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1, + 3, 20, 78, 77, 1, 3, 20, 77, 86, 1, 3, 78, 22, 88, 1, 3, 88, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, + 3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1, + 3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1, + 3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1, +3, 102, 23, 111, 1, 3, 111, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1, + 3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1, + 3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1, + 3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1, + 3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1, + 3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1, + 3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1, + 3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1, +3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, + 3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1, +3, 140, 27, 136, 1, 3, 136, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1, + 3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, +3, 76, 12, 146, 1, 3, 146, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1, + 3, 148, 21, 149, 1, 3, 149, 75, 148, 1, 3, 22, 76, 75, 1, 3, 22, 75, 149, 1, + 3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1, + 3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1, + 3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1, + 3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1, + 3, 161, 13, 88, 1, 3, 88, 87, 161, 1, 3, 22, 149, 87, 1, 3, 22, 87, 88, 1, + 3, 149, 21, 158, 1, 3, 158, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1, + 3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1, + 3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1, + 3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1, + 3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1, + 3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1, + 3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1, + 3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1, + 3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1, + 3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1, + 3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1, + 3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1, + 3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 50, 183, 182, 1, 3, 50, 182, 188, 1, +3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 45, 187, 169, 1, 3, 45, 169, 170, 1, + 3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1, +3, 1, 196, 194, 1, 3, 1, 194, 201, 1, 3, 196, 54, 198, 1, 3, 198, 194, 196, 1, + 3, 46, 199, 194, 1, 3, 46, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1, + 3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1, + 3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1, + 3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1, + 3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, +3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1, + 3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1, + 3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1, + 3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 192, 210, 56, 1, 3, 56, 209, 192, 1, + 3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 189, 216, 57, 1, 3, 57, 217, 189, 1, + 3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1, +3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1, + 3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1, +3, 0, 221, 220, 1, 3, 0, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1, + 3, 48, 224, 220, 1, 3, 48, 220, 222, 1, 3, 224, 62, 226, 1, 3, 226, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1, + 3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1, + 3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1, + 3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1, + 3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1, + 3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1, + 3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1, + 3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1, + 3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1, +3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1, + 3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1, + 3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1, + 3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1, +3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1, + 3, 63, 244, 236, 1, 3, 63, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1, +3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1, + 3, 63, 242, 240, 1, 3, 63, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, +3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1, + 3, 53, 259, 205, 1, 3, 53, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1, +3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 69, 262, 195, 1, 3, 69, 195, 260, 1, + 3, 262, 53, 258, 1, 3, 258, 195, 262, 1, 3, 54, 196, 195, 1, 3, 54, 195, 258, 1, +3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, + 3, 268, 4, 253, 1, 3, 253, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1, + 3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1, + 3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1, + 3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1, + 3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 276, 58, 273, 1, 3, 273, 272, 276, 1, 3, 71, 278, 272, 1, 3, 71, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 69, 270, 266, 1, 3, 69, 266, 267, 1, + 3, 270, 58, 276, 1, 3, 276, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, +3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 62, 280, 225, 1, 3, 62, 225, 226, 1, + 3, 280, 61, 281, 1, 3, 281, 225, 280, 1, 3, 71, 271, 225, 1, 3, 71, 225, 281, 1, +3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1, + 3, 61, 280, 230, 1, 3, 61, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1, + 3, 255, 7, 283, 1, 3, 283, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, +3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_5 = +{ + 290, /* number of points */ + s1_5_PNTS, s1_5_normals, s1_5_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_5.c */ diff --git a/hacks/glx/s1_6.c b/hacks/glx/s1_6.c new file mode 100644 index 00000000..7a31fe09 --- /dev/null +++ b/hacks/glx/s1_6.c @@ -0,0 +1,1057 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_6.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points, polygons, and normal vectors to render "s1_6" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_6_PNTS[] = +{ + (GLfloat) 1.339151, (GLfloat) - 0.510672, (GLfloat) - 0.339151, + (GLfloat) 1.339151, (GLfloat) - 0.510672, (GLfloat) - 0.660849, + (GLfloat) 1.660849, (GLfloat) - 0.510672, (GLfloat) - 0.339151, + (GLfloat) 1.660849, (GLfloat) - 0.510672, (GLfloat) - 0.660849, + (GLfloat) 1.638667, (GLfloat) - 0.642463, (GLfloat) - 0.638667, + (GLfloat) 1.361333, (GLfloat) - 0.642463, (GLfloat) - 0.638667, + (GLfloat) 1.361333, (GLfloat) - 0.642463, (GLfloat) - 0.361333, + (GLfloat) 1.638667, (GLfloat) - 0.642463, (GLfloat) - 0.361333, + (GLfloat) 1.589301, (GLfloat) - 0.085107, (GLfloat) - 0.624049, + (GLfloat) 1.356947, (GLfloat) - 0.122198, (GLfloat) - 0.624049, + (GLfloat) 1.356947, (GLfloat) - 0.122198, (GLfloat) - 0.375951, + (GLfloat) 1.589301, (GLfloat) - 0.085107, (GLfloat) - 0.375951, + (GLfloat) 1.460394, (GLfloat) 0.412133, (GLfloat) - 0.660849, + (GLfloat) 1.460394, (GLfloat) 0.412133, (GLfloat) - 0.339151, + (GLfloat) 1.370035, (GLfloat) 0.524394, (GLfloat) - 0.361333, + (GLfloat) 1.370035, (GLfloat) 0.524394, (GLfloat) - 0.638667, + (GLfloat) 1.226863, (GLfloat) 0.204423, (GLfloat) - 0.339151, + (GLfloat) 1.177383, (GLfloat) 0.324897, (GLfloat) - 0.361333, + (GLfloat) 1.226863, (GLfloat) 0.204423, (GLfloat) - 0.660849, + (GLfloat) 1.177383, (GLfloat) 0.324897, (GLfloat) - 0.638667, + (GLfloat) 1.460683, (GLfloat) 0.568581, (GLfloat) - 0.500000, + (GLfloat) 1.564666, (GLfloat) 0.208184, (GLfloat) - 0.500000, + (GLfloat) 1.502855, (GLfloat) 0.449898, (GLfloat) - 0.500000, + (GLfloat) 1.294932, (GLfloat) 0.399266, (GLfloat) - 0.262379, + (GLfloat) 1.416649, (GLfloat) 0.522728, (GLfloat) - 0.326134, + (GLfloat) 1.260429, (GLfloat) 0.437469, (GLfloat) - 0.500000, + (GLfloat) 1.392236, (GLfloat) 0.557026, (GLfloat) - 0.500000, + (GLfloat) 1.294932, (GLfloat) 0.399266, (GLfloat) - 0.737621, + (GLfloat) 1.416649, (GLfloat) 0.522728, (GLfloat) - 0.673866, + (GLfloat) 1.412872, (GLfloat) 0.126752, (GLfloat) - 0.313640, + (GLfloat) 1.343629, (GLfloat) 0.308278, (GLfloat) - 0.280660, + (GLfloat) 1.129180, (GLfloat) 0.229952, (GLfloat) - 0.500000, + (GLfloat) 1.174088, (GLfloat) 0.274960, (GLfloat) - 0.326134, + (GLfloat) 1.268890, (GLfloat) 0.429299, (GLfloat) - 0.322437, + (GLfloat) 1.261078, (GLfloat) 0.045321, (GLfloat) - 0.500000, + (GLfloat) 1.184403, (GLfloat) 0.166658, (GLfloat) - 0.500000, + (GLfloat) 1.174088, (GLfloat) 0.274960, (GLfloat) - 0.673866, + (GLfloat) 1.145545, (GLfloat) 0.301571, (GLfloat) - 0.500000, + (GLfloat) 1.412872, (GLfloat) 0.126752, (GLfloat) - 0.686360, + (GLfloat) 1.343629, (GLfloat) 0.308278, (GLfloat) - 0.719340, + (GLfloat) 1.268890, (GLfloat) 0.429299, (GLfloat) - 0.677562, + (GLfloat) 1.524188, (GLfloat) 0.186469, (GLfloat) - 0.636664, + (GLfloat) 1.682599, (GLfloat) - 0.328303, (GLfloat) - 0.500000, + (GLfloat) 1.631547, (GLfloat) - 0.078363, (GLfloat) - 0.500000, + (GLfloat) 1.524188, (GLfloat) 0.186469, (GLfloat) - 0.363336, + (GLfloat) 1.301556, (GLfloat) 0.067036, (GLfloat) - 0.636664, + (GLfloat) 1.497312, (GLfloat) - 0.330832, (GLfloat) - 0.686360, + (GLfloat) 1.473124, (GLfloat) - 0.103652, (GLfloat) - 0.669158, + (GLfloat) 1.497312, (GLfloat) - 0.330832, (GLfloat) - 0.313640, + (GLfloat) 1.473124, (GLfloat) - 0.103652, (GLfloat) - 0.330842, + (GLfloat) 1.301556, (GLfloat) 0.067036, (GLfloat) - 0.363336, + (GLfloat) 1.312026, (GLfloat) - 0.333361, (GLfloat) - 0.500000, + (GLfloat) 1.314701, (GLfloat) - 0.128942, (GLfloat) - 0.500000, + (GLfloat) 1.500000, (GLfloat) - 0.609501, (GLfloat) - 0.737621, + (GLfloat) 1.500000, (GLfloat) - 0.510672, (GLfloat) - 0.719340, + (GLfloat) 1.633189, (GLfloat) - 0.328978, (GLfloat) - 0.636664, + (GLfloat) 1.361436, (GLfloat) - 0.332687, (GLfloat) - 0.636664, + (GLfloat) 1.361436, (GLfloat) - 0.332687, (GLfloat) - 0.363336, + (GLfloat) 1.262379, (GLfloat) - 0.609501, (GLfloat) - 0.500000, + (GLfloat) 1.280660, (GLfloat) - 0.510672, (GLfloat) - 0.500000, + (GLfloat) 1.633189, (GLfloat) - 0.328978, (GLfloat) - 0.363336, + (GLfloat) 1.500000, (GLfloat) - 0.609501, (GLfloat) - 0.262379, + (GLfloat) 1.500000, (GLfloat) - 0.510672, (GLfloat) - 0.280660, + (GLfloat) 1.737621, (GLfloat) - 0.609501, (GLfloat) - 0.500000, + (GLfloat) 1.719340, (GLfloat) - 0.510672, (GLfloat) - 0.500000, + (GLfloat) 1.673866, (GLfloat) - 0.608893, (GLfloat) - 0.673866, + (GLfloat) 1.500000, (GLfloat) - 0.660924, (GLfloat) - 0.500000, + (GLfloat) 1.677562, (GLfloat) - 0.649161, (GLfloat) - 0.500000, + (GLfloat) 1.673866, (GLfloat) - 0.608893, (GLfloat) - 0.326134, + (GLfloat) 1.326134, (GLfloat) - 0.608893, (GLfloat) - 0.673866, + (GLfloat) 1.500000, (GLfloat) - 0.649161, (GLfloat) - 0.677562, + (GLfloat) 1.326134, (GLfloat) - 0.608893, (GLfloat) - 0.326134, + (GLfloat) 1.322438, (GLfloat) - 0.649161, (GLfloat) - 0.500000, + (GLfloat) 1.500000, (GLfloat) - 0.649161, (GLfloat) - 0.322437, + (GLfloat) 1.470529, (GLfloat) 0.515074, (GLfloat) - 0.593594, + (GLfloat) 1.521298, (GLfloat) 0.332708, (GLfloat) - 0.580972, + (GLfloat) 1.492239, (GLfloat) 0.440457, (GLfloat) - 0.587736, + (GLfloat) 1.470529, (GLfloat) 0.515074, (GLfloat) - 0.406406, + (GLfloat) 1.481548, (GLfloat) 0.525864, (GLfloat) - 0.500000, + (GLfloat) 1.423386, (GLfloat) 0.566478, (GLfloat) - 0.587500, + (GLfloat) 1.449724, (GLfloat) 0.556950, (GLfloat) - 0.594774, + (GLfloat) 1.382377, (GLfloat) 0.428753, (GLfloat) - 0.718387, + (GLfloat) 1.437472, (GLfloat) 0.482703, (GLfloat) - 0.671590, + (GLfloat) 1.382377, (GLfloat) 0.428753, (GLfloat) - 0.281613, + (GLfloat) 1.437472, (GLfloat) 0.482703, (GLfloat) - 0.328410, + (GLfloat) 1.423386, (GLfloat) 0.566478, (GLfloat) - 0.412500, + (GLfloat) 1.449724, (GLfloat) 0.556950, (GLfloat) - 0.405226, + (GLfloat) 1.521298, (GLfloat) 0.332708, (GLfloat) - 0.419028, + (GLfloat) 1.492239, (GLfloat) 0.440457, (GLfloat) - 0.412264, + (GLfloat) 1.327417, (GLfloat) 0.498590, (GLfloat) - 0.409500, + (GLfloat) 1.384841, (GLfloat) 0.546182, (GLfloat) - 0.417500, + (GLfloat) 1.433279, (GLfloat) 0.578472, (GLfloat) - 0.500000, + (GLfloat) 1.341069, (GLfloat) 0.481236, (GLfloat) - 0.294000, + (GLfloat) 1.392914, (GLfloat) 0.533174, (GLfloat) - 0.339125, + (GLfloat) 1.341069, (GLfloat) 0.481236, (GLfloat) - 0.706000, + (GLfloat) 1.392914, (GLfloat) 0.533174, (GLfloat) - 0.660875, + (GLfloat) 1.327417, (GLfloat) 0.498590, (GLfloat) - 0.590500, + (GLfloat) 1.384841, (GLfloat) 0.546182, (GLfloat) - 0.582500, + (GLfloat) 1.438984, (GLfloat) 0.272283, (GLfloat) - 0.311066, + (GLfloat) 1.407319, (GLfloat) 0.364926, (GLfloat) - 0.295283, + (GLfloat) 1.250150, (GLfloat) 0.299272, (GLfloat) - 0.281613, + (GLfloat) 1.316263, (GLfloat) 0.364012, (GLfloat) - 0.266014, + (GLfloat) 1.361260, (GLfloat) 0.466583, (GLfloat) - 0.278403, + (GLfloat) 1.161998, (GLfloat) 0.212951, (GLfloat) - 0.406406, + (GLfloat) 1.195055, (GLfloat) 0.245321, (GLfloat) - 0.328410, + (GLfloat) 1.219504, (GLfloat) 0.355352, (GLfloat) - 0.294000, + (GLfloat) 1.229040, (GLfloat) 0.331527, (GLfloat) - 0.278403, + (GLfloat) 1.315513, (GLfloat) 0.181646, (GLfloat) - 0.311066, + (GLfloat) 1.279939, (GLfloat) 0.251630, (GLfloat) - 0.295283, + (GLfloat) 1.201684, (GLfloat) 0.368389, (GLfloat) - 0.409500, + (GLfloat) 1.213173, (GLfloat) 0.368416, (GLfloat) - 0.335375, + (GLfloat) 1.279412, (GLfloat) 0.419138, (GLfloat) - 0.278500, + (GLfloat) 1.137187, (GLfloat) 0.270110, (GLfloat) - 0.412500, + (GLfloat) 1.169407, (GLfloat) 0.301726, (GLfloat) - 0.339125, + (GLfloat) 1.327792, (GLfloat) 0.487107, (GLfloat) - 0.335375, + (GLfloat) 1.233200, (GLfloat) 0.121222, (GLfloat) - 0.419028, + (GLfloat) 1.195018, (GLfloat) 0.176099, (GLfloat) - 0.412264, + (GLfloat) 1.161998, (GLfloat) 0.212951, (GLfloat) - 0.593594, + (GLfloat) 1.150979, (GLfloat) 0.202161, (GLfloat) - 0.500000, + (GLfloat) 1.140576, (GLfloat) 0.241160, (GLfloat) - 0.405226, + (GLfloat) 1.250150, (GLfloat) 0.299272, (GLfloat) - 0.718387, + (GLfloat) 1.195055, (GLfloat) 0.245321, (GLfloat) - 0.671590, + (GLfloat) 1.137187, (GLfloat) 0.270110, (GLfloat) - 0.587500, + (GLfloat) 1.140576, (GLfloat) 0.241160, (GLfloat) - 0.594774, + (GLfloat) 1.233200, (GLfloat) 0.121222, (GLfloat) - 0.580972, + (GLfloat) 1.195018, (GLfloat) 0.176099, (GLfloat) - 0.587736, + (GLfloat) 1.201684, (GLfloat) 0.368389, (GLfloat) - 0.590500, + (GLfloat) 1.156124, (GLfloat) 0.309340, (GLfloat) - 0.582500, + (GLfloat) 1.125545, (GLfloat) 0.259804, (GLfloat) - 0.500000, + (GLfloat) 1.219504, (GLfloat) 0.355352, (GLfloat) - 0.706000, + (GLfloat) 1.169407, (GLfloat) 0.301726, (GLfloat) - 0.660875, + (GLfloat) 1.156124, (GLfloat) 0.309340, (GLfloat) - 0.417500, + (GLfloat) 1.315513, (GLfloat) 0.181646, (GLfloat) - 0.688934, + (GLfloat) 1.279939, (GLfloat) 0.251630, (GLfloat) - 0.704717, + (GLfloat) 1.316263, (GLfloat) 0.364012, (GLfloat) - 0.733986, + (GLfloat) 1.229040, (GLfloat) 0.331527, (GLfloat) - 0.721597, + (GLfloat) 1.361260, (GLfloat) 0.466583, (GLfloat) - 0.721597, + (GLfloat) 1.438984, (GLfloat) 0.272283, (GLfloat) - 0.688934, + (GLfloat) 1.407319, (GLfloat) 0.364926, (GLfloat) - 0.704717, + (GLfloat) 1.327792, (GLfloat) 0.487107, (GLfloat) - 0.664625, + (GLfloat) 1.279412, (GLfloat) 0.419138, (GLfloat) - 0.721500, + (GLfloat) 1.213173, (GLfloat) 0.368416, (GLfloat) - 0.664625, + (GLfloat) 1.262552, (GLfloat) 0.435419, (GLfloat) - 0.402250, + (GLfloat) 1.330455, (GLfloat) 0.505735, (GLfloat) - 0.500000, + (GLfloat) 1.194650, (GLfloat) 0.365104, (GLfloat) - 0.500000, + (GLfloat) 1.262552, (GLfloat) 0.435419, (GLfloat) - 0.597750, + (GLfloat) 1.490430, (GLfloat) 0.310049, (GLfloat) - 0.648448, + (GLfloat) 1.588828, (GLfloat) 0.061527, (GLfloat) - 0.569694, + (GLfloat) 1.554547, (GLfloat) 0.202755, (GLfloat) - 0.574544, + (GLfloat) 1.531587, (GLfloat) 0.340261, (GLfloat) - 0.500000, + (GLfloat) 1.647861, (GLfloat) - 0.211045, (GLfloat) - 0.569694, + (GLfloat) 1.620986, (GLfloat) - 0.080049, (GLfloat) - 0.567663, + (GLfloat) 1.588828, (GLfloat) 0.061527, (GLfloat) - 0.430306, + (GLfloat) 1.599013, (GLfloat) 0.064899, (GLfloat) - 0.500000, + (GLfloat) 1.507354, (GLfloat) 0.034552, (GLfloat) - 0.662619, + (GLfloat) 1.558275, (GLfloat) 0.051411, (GLfloat) - 0.627772, + (GLfloat) 1.507354, (GLfloat) 0.034552, (GLfloat) - 0.337381, + (GLfloat) 1.558275, (GLfloat) 0.051411, (GLfloat) - 0.372228, + (GLfloat) 1.554547, (GLfloat) 0.202755, (GLfloat) - 0.425456, + (GLfloat) 1.647861, (GLfloat) - 0.211045, (GLfloat) - 0.430306, + (GLfloat) 1.620986, (GLfloat) - 0.080049, (GLfloat) - 0.432337, + (GLfloat) 1.490430, (GLfloat) 0.310049, (GLfloat) - 0.351552, + (GLfloat) 1.264067, (GLfloat) 0.143881, (GLfloat) - 0.648448, + (GLfloat) 1.385142, (GLfloat) - 0.005911, (GLfloat) - 0.662619, + (GLfloat) 1.352154, (GLfloat) 0.094180, (GLfloat) - 0.673936, + (GLfloat) 1.377249, (GLfloat) 0.226965, (GLfloat) - 0.702430, + (GLfloat) 1.421273, (GLfloat) - 0.224532, (GLfloat) - 0.662619, + (GLfloat) 1.409755, (GLfloat) - 0.113768, (GLfloat) - 0.657881, + (GLfloat) 1.446248, (GLfloat) 0.014320, (GLfloat) - 0.674234, + (GLfloat) 1.303667, (GLfloat) - 0.032887, (GLfloat) - 0.569694, + (GLfloat) 1.334220, (GLfloat) - 0.022771, (GLfloat) - 0.627772, + (GLfloat) 1.473590, (GLfloat) 0.159325, (GLfloat) - 0.673936, + (GLfloat) 1.557226, (GLfloat) - 0.216440, (GLfloat) - 0.662619, + (GLfloat) 1.536493, (GLfloat) - 0.093537, (GLfloat) - 0.657881, + (GLfloat) 1.377249, (GLfloat) 0.226965, (GLfloat) - 0.297570, + (GLfloat) 1.385142, (GLfloat) - 0.005911, (GLfloat) - 0.337381, + (GLfloat) 1.352154, (GLfloat) 0.094180, (GLfloat) - 0.326064, + (GLfloat) 1.264067, (GLfloat) 0.143881, (GLfloat) - 0.351552, + (GLfloat) 1.473590, (GLfloat) 0.159325, (GLfloat) - 0.326064, + (GLfloat) 1.557226, (GLfloat) - 0.216440, (GLfloat) - 0.337381, + (GLfloat) 1.536493, (GLfloat) - 0.093537, (GLfloat) - 0.342119, + (GLfloat) 1.446248, (GLfloat) 0.014320, (GLfloat) - 0.325766, + (GLfloat) 1.303667, (GLfloat) - 0.032887, (GLfloat) - 0.430306, + (GLfloat) 1.334220, (GLfloat) - 0.022771, (GLfloat) - 0.372228, + (GLfloat) 1.421273, (GLfloat) - 0.224532, (GLfloat) - 0.337381, + (GLfloat) 1.409755, (GLfloat) - 0.113768, (GLfloat) - 0.342119, + (GLfloat) 1.222911, (GLfloat) 0.113669, (GLfloat) - 0.500000, + (GLfloat) 1.271198, (GLfloat) 0.050750, (GLfloat) - 0.574544, + (GLfloat) 1.271198, (GLfloat) 0.050750, (GLfloat) - 0.425456, + (GLfloat) 1.330638, (GLfloat) - 0.229927, (GLfloat) - 0.430306, + (GLfloat) 1.325262, (GLfloat) - 0.127256, (GLfloat) - 0.432337, + (GLfloat) 1.293483, (GLfloat) - 0.036258, (GLfloat) - 0.500000, + (GLfloat) 1.330638, (GLfloat) - 0.229927, (GLfloat) - 0.569694, + (GLfloat) 1.325262, (GLfloat) - 0.127256, (GLfloat) - 0.567663, + (GLfloat) 1.419028, (GLfloat) - 0.429344, (GLfloat) - 0.688934, + (GLfloat) 1.406406, (GLfloat) - 0.569469, (GLfloat) - 0.718387, + (GLfloat) 1.412264, (GLfloat) - 0.510672, (GLfloat) - 0.704717, + (GLfloat) 1.580972, (GLfloat) - 0.429344, (GLfloat) - 0.688934, + (GLfloat) 1.500000, (GLfloat) - 0.429344, (GLfloat) - 0.702430, + (GLfloat) 1.423198, (GLfloat) - 0.331844, (GLfloat) - 0.673936, + (GLfloat) 1.311066, (GLfloat) - 0.429344, (GLfloat) - 0.580972, + (GLfloat) 1.351552, (GLfloat) - 0.429344, (GLfloat) - 0.648448, + (GLfloat) 1.688934, (GLfloat) - 0.429344, (GLfloat) - 0.580972, + (GLfloat) 1.648448, (GLfloat) - 0.429344, (GLfloat) - 0.648448, + (GLfloat) 1.571427, (GLfloat) - 0.329821, (GLfloat) - 0.673936, + (GLfloat) 1.593594, (GLfloat) - 0.569469, (GLfloat) - 0.718387, + (GLfloat) 1.587736, (GLfloat) - 0.510672, (GLfloat) - 0.704717, + (GLfloat) 1.489249, (GLfloat) - 0.220486, (GLfloat) - 0.674234, + (GLfloat) 1.613873, (GLfloat) - 0.213068, (GLfloat) - 0.627772, + (GLfloat) 1.364627, (GLfloat) - 0.227904, (GLfloat) - 0.627772, + (GLfloat) 1.324378, (GLfloat) - 0.333193, (GLfloat) - 0.574544, + (GLfloat) 1.311066, (GLfloat) - 0.429344, (GLfloat) - 0.419028, + (GLfloat) 1.297570, (GLfloat) - 0.429344, (GLfloat) - 0.500000, + (GLfloat) 1.281613, (GLfloat) - 0.569469, (GLfloat) - 0.593594, + (GLfloat) 1.295283, (GLfloat) - 0.510672, (GLfloat) - 0.587736, + (GLfloat) 1.319309, (GLfloat) - 0.230602, (GLfloat) - 0.500000, + (GLfloat) 1.364627, (GLfloat) - 0.227904, (GLfloat) - 0.372228, + (GLfloat) 1.324378, (GLfloat) - 0.333193, (GLfloat) - 0.425456, + (GLfloat) 1.281613, (GLfloat) - 0.569469, (GLfloat) - 0.406406, + (GLfloat) 1.295283, (GLfloat) - 0.510672, (GLfloat) - 0.412264, + (GLfloat) 1.419028, (GLfloat) - 0.429344, (GLfloat) - 0.311066, + (GLfloat) 1.351552, (GLfloat) - 0.429344, (GLfloat) - 0.351552, + (GLfloat) 1.423198, (GLfloat) - 0.331844, (GLfloat) - 0.326064, + (GLfloat) 1.580972, (GLfloat) - 0.429344, (GLfloat) - 0.311066, + (GLfloat) 1.500000, (GLfloat) - 0.429344, (GLfloat) - 0.297570, + (GLfloat) 1.406406, (GLfloat) - 0.569469, (GLfloat) - 0.281613, + (GLfloat) 1.412264, (GLfloat) - 0.510672, (GLfloat) - 0.295283, + (GLfloat) 1.489249, (GLfloat) - 0.220486, (GLfloat) - 0.325766, + (GLfloat) 1.613873, (GLfloat) - 0.213068, (GLfloat) - 0.372228, + (GLfloat) 1.571427, (GLfloat) - 0.329821, (GLfloat) - 0.326064, + (GLfloat) 1.593594, (GLfloat) - 0.569469, (GLfloat) - 0.281613, + (GLfloat) 1.587736, (GLfloat) - 0.510672, (GLfloat) - 0.295283, + (GLfloat) 1.688934, (GLfloat) - 0.429344, (GLfloat) - 0.419028, + (GLfloat) 1.648448, (GLfloat) - 0.429344, (GLfloat) - 0.351552, + (GLfloat) 1.670246, (GLfloat) - 0.328472, (GLfloat) - 0.425456, + (GLfloat) 1.702430, (GLfloat) - 0.429344, (GLfloat) - 0.500000, + (GLfloat) 1.718387, (GLfloat) - 0.569469, (GLfloat) - 0.406406, + (GLfloat) 1.704717, (GLfloat) - 0.510672, (GLfloat) - 0.412264, + (GLfloat) 1.659190, (GLfloat) - 0.210370, (GLfloat) - 0.500000, + (GLfloat) 1.670246, (GLfloat) - 0.328472, (GLfloat) - 0.574544, + (GLfloat) 1.718387, (GLfloat) - 0.569469, (GLfloat) - 0.593594, + (GLfloat) 1.704717, (GLfloat) - 0.510672, (GLfloat) - 0.587736, + (GLfloat) 1.733986, (GLfloat) - 0.569469, (GLfloat) - 0.500000, + (GLfloat) 1.706000, (GLfloat) - 0.633319, (GLfloat) - 0.412500, + (GLfloat) 1.721597, (GLfloat) - 0.609197, (GLfloat) - 0.405226, + (GLfloat) 1.671590, (GLfloat) - 0.569469, (GLfloat) - 0.328410, + (GLfloat) 1.671590, (GLfloat) - 0.569469, (GLfloat) - 0.671590, + (GLfloat) 1.706000, (GLfloat) - 0.633319, (GLfloat) - 0.587500, + (GLfloat) 1.721597, (GLfloat) - 0.609197, (GLfloat) - 0.594774, + (GLfloat) 1.590500, (GLfloat) - 0.655194, (GLfloat) - 0.590500, + (GLfloat) 1.664625, (GLfloat) - 0.646948, (GLfloat) - 0.582500, + (GLfloat) 1.721500, (GLfloat) - 0.634535, (GLfloat) - 0.500000, + (GLfloat) 1.587500, (GLfloat) - 0.633319, (GLfloat) - 0.706000, + (GLfloat) 1.660875, (GLfloat) - 0.632104, (GLfloat) - 0.660875, + (GLfloat) 1.587500, (GLfloat) - 0.633319, (GLfloat) - 0.294000, + (GLfloat) 1.660875, (GLfloat) - 0.632104, (GLfloat) - 0.339125, + (GLfloat) 1.590500, (GLfloat) - 0.655194, (GLfloat) - 0.409500, + (GLfloat) 1.664625, (GLfloat) - 0.646948, (GLfloat) - 0.417500, + (GLfloat) 1.500000, (GLfloat) - 0.569469, (GLfloat) - 0.733986, + (GLfloat) 1.594774, (GLfloat) - 0.609197, (GLfloat) - 0.721597, + (GLfloat) 1.328410, (GLfloat) - 0.569469, (GLfloat) - 0.671590, + (GLfloat) 1.412500, (GLfloat) - 0.633319, (GLfloat) - 0.706000, + (GLfloat) 1.405226, (GLfloat) - 0.609197, (GLfloat) - 0.721597, + (GLfloat) 1.409500, (GLfloat) - 0.655194, (GLfloat) - 0.590500, + (GLfloat) 1.417500, (GLfloat) - 0.646948, (GLfloat) - 0.664625, + (GLfloat) 1.500000, (GLfloat) - 0.634535, (GLfloat) - 0.721500, + (GLfloat) 1.294000, (GLfloat) - 0.633319, (GLfloat) - 0.587500, + (GLfloat) 1.339125, (GLfloat) - 0.632104, (GLfloat) - 0.660875, + (GLfloat) 1.582500, (GLfloat) - 0.646948, (GLfloat) - 0.664625, + (GLfloat) 1.266014, (GLfloat) - 0.569469, (GLfloat) - 0.500000, + (GLfloat) 1.278403, (GLfloat) - 0.609197, (GLfloat) - 0.594774, + (GLfloat) 1.328410, (GLfloat) - 0.569469, (GLfloat) - 0.328410, + (GLfloat) 1.294000, (GLfloat) - 0.633319, (GLfloat) - 0.412500, + (GLfloat) 1.278403, (GLfloat) - 0.609197, (GLfloat) - 0.405226, + (GLfloat) 1.409500, (GLfloat) - 0.655194, (GLfloat) - 0.409500, + (GLfloat) 1.335375, (GLfloat) - 0.646948, (GLfloat) - 0.417500, + (GLfloat) 1.278500, (GLfloat) - 0.634535, (GLfloat) - 0.500000, + (GLfloat) 1.412500, (GLfloat) - 0.633319, (GLfloat) - 0.294000, + (GLfloat) 1.339125, (GLfloat) - 0.632104, (GLfloat) - 0.339125, + (GLfloat) 1.335375, (GLfloat) - 0.646948, (GLfloat) - 0.582500, + (GLfloat) 1.500000, (GLfloat) - 0.569469, (GLfloat) - 0.266014, + (GLfloat) 1.405226, (GLfloat) - 0.609197, (GLfloat) - 0.278403, + (GLfloat) 1.594774, (GLfloat) - 0.609197, (GLfloat) - 0.278403, + (GLfloat) 1.582500, (GLfloat) - 0.646948, (GLfloat) - 0.335375, + (GLfloat) 1.500000, (GLfloat) - 0.634535, (GLfloat) - 0.278500, + (GLfloat) 1.417500, (GLfloat) - 0.646948, (GLfloat) - 0.335375, + (GLfloat) 1.500000, (GLfloat) - 0.657972, (GLfloat) - 0.597750, + (GLfloat) 1.597750, (GLfloat) - 0.657972, (GLfloat) - 0.500000, + (GLfloat) 1.402250, (GLfloat) - 0.657972, (GLfloat) - 0.500000, + (GLfloat) 1.500000, (GLfloat) - 0.657972, (GLfloat) - 0.402250, +}; + +static GLfloat s1_6_normals[] = +{ + (GLfloat) 0.863661, (GLfloat) 0.210849, (GLfloat) - 0.457857, + (GLfloat) 0.863729, (GLfloat) 0.215548, (GLfloat) - 0.455534, + (GLfloat) 0.952947, (GLfloat) 0.267284, (GLfloat) - 0.143006, + (GLfloat) 0.953156, (GLfloat) 0.266032, (GLfloat) - 0.143950, + (GLfloat) 0.887569, (GLfloat) 0.433517, (GLfloat) - 0.155833, + (GLfloat) 0.886526, (GLfloat) 0.436070, (GLfloat) - 0.154645, + (GLfloat) 0.784332, (GLfloat) 0.380163, (GLfloat) - 0.490203, + (GLfloat) 0.785458, (GLfloat) 0.376379, (GLfloat) - 0.491319, + (GLfloat) 0.863661, (GLfloat) 0.210849, (GLfloat) 0.457857, + (GLfloat) 0.863729, (GLfloat) 0.215548, (GLfloat) 0.455534, + (GLfloat) 0.785458, (GLfloat) 0.376379, (GLfloat) 0.491319, + (GLfloat) 0.784333, (GLfloat) 0.380162, (GLfloat) 0.490203, + (GLfloat) 0.887569, (GLfloat) 0.433517, (GLfloat) 0.155833, + (GLfloat) 0.886526, (GLfloat) 0.436070, (GLfloat) 0.154645, + (GLfloat) 0.953156, (GLfloat) 0.266032, (GLfloat) 0.143950, + (GLfloat) 0.952947, (GLfloat) 0.267284, (GLfloat) 0.143006, + (GLfloat) - 0.476698, (GLfloat) 0.854621, (GLfloat) 0.205866, + (GLfloat) - 0.498450, (GLfloat) 0.848428, (GLfloat) 0.178092, + (GLfloat) - 0.462000, (GLfloat) 0.884194, (GLfloat) 0.068965, + (GLfloat) - 0.472068, (GLfloat) 0.878521, (GLfloat) 0.073162, + (GLfloat) 0.299348, (GLfloat) 0.942240, (GLfloat) 0.150245, + (GLfloat) 0.334834, (GLfloat) 0.927714, (GLfloat) 0.165022, + (GLfloat) 0.146237, (GLfloat) 0.884155, (GLfloat) 0.443716, + (GLfloat) 0.183286, (GLfloat) 0.864289, (GLfloat) 0.468413, + (GLfloat) - 0.498450, (GLfloat) 0.848429, (GLfloat) - 0.178092, + (GLfloat) - 0.476698, (GLfloat) 0.854621, (GLfloat) - 0.205865, + (GLfloat) 0.146237, (GLfloat) 0.884155, (GLfloat) - 0.443716, + (GLfloat) 0.183286, (GLfloat) 0.864289, (GLfloat) - 0.468413, + (GLfloat) 0.334834, (GLfloat) 0.927714, (GLfloat) - 0.165022, + (GLfloat) 0.299348, (GLfloat) 0.942240, (GLfloat) - 0.150245, + (GLfloat) - 0.472068, (GLfloat) 0.878521, (GLfloat) - 0.073162, + (GLfloat) - 0.462000, (GLfloat) 0.884194, (GLfloat) - 0.068965, + (GLfloat) 0.601151, (GLfloat) 0.064321, (GLfloat) 0.796542, + (GLfloat) 0.602133, (GLfloat) 0.074603, (GLfloat) 0.794903, + (GLfloat) 0.305416, (GLfloat) - 0.098916, (GLfloat) 0.947067, + (GLfloat) 0.305705, (GLfloat) - 0.083664, (GLfloat) 0.948443, + (GLfloat) 0.204663, (GLfloat) 0.031235, (GLfloat) 0.978334, + (GLfloat) 0.206924, (GLfloat) 0.024347, (GLfloat) 0.978054, + (GLfloat) 0.503723, (GLfloat) 0.214462, (GLfloat) 0.836821, + (GLfloat) 0.504738, (GLfloat) 0.210719, (GLfloat) 0.837160, + (GLfloat) - 0.295242, (GLfloat) - 0.450841, (GLfloat) 0.842363, + (GLfloat) - 0.299933, (GLfloat) - 0.431633, (GLfloat) 0.850725, + (GLfloat) - 0.391261, (GLfloat) - 0.341115, (GLfloat) 0.854725, + (GLfloat) - 0.390827, (GLfloat) - 0.342109, (GLfloat) 0.854527, + (GLfloat) - 0.083295, (GLfloat) - 0.151964, (GLfloat) 0.984870, + (GLfloat) - 0.083124, (GLfloat) - 0.152402, (GLfloat) 0.984817, + (GLfloat) 0.015860, (GLfloat) - 0.266588, (GLfloat) 0.963680, + (GLfloat) 0.013989, (GLfloat) - 0.247700, (GLfloat) 0.968736, + (GLfloat) - 0.816724, (GLfloat) 0.502516, (GLfloat) 0.283619, + (GLfloat) - 0.805591, (GLfloat) 0.530375, (GLfloat) 0.264055, + (GLfloat) - 0.732550, (GLfloat) 0.603459, (GLfloat) 0.314971, + (GLfloat) - 0.730076, (GLfloat) 0.611620, (GLfloat) 0.304811, + (GLfloat) - 0.516849, (GLfloat) 0.314381, (GLfloat) 0.796261, + (GLfloat) - 0.502724, (GLfloat) 0.272837, (GLfloat) 0.820261, + (GLfloat) - 0.744687, (GLfloat) 0.181500, (GLfloat) 0.642261, + (GLfloat) - 0.739362, (GLfloat) 0.135764, (GLfloat) 0.659478, + (GLfloat) - 0.549371, (GLfloat) 0.797029, (GLfloat) 0.250869, + (GLfloat) - 0.542332, (GLfloat) 0.789948, (GLfloat) 0.286109, + (GLfloat) - 0.086395, (GLfloat) 0.693389, (GLfloat) 0.715365, + (GLfloat) - 0.059539, (GLfloat) 0.687907, (GLfloat) 0.723353, + (GLfloat) - 0.265868, (GLfloat) 0.473566, (GLfloat) 0.839672, + (GLfloat) - 0.289224, (GLfloat) 0.481874, (GLfloat) 0.827131, + (GLfloat) - 0.628658, (GLfloat) 0.711043, (GLfloat) 0.314972, + (GLfloat) - 0.636726, (GLfloat) 0.708286, (GLfloat) 0.304813, + (GLfloat) - 0.602622, (GLfloat) - 0.619862, (GLfloat) 0.502612, + (GLfloat) - 0.608832, (GLfloat) - 0.607495, (GLfloat) 0.510170, + (GLfloat) - 0.718752, (GLfloat) - 0.676658, (GLfloat) 0.159776, + (GLfloat) - 0.721882, (GLfloat) - 0.672658, (GLfloat) 0.162535, + (GLfloat) - 0.782122, (GLfloat) - 0.600854, (GLfloat) 0.165107, + (GLfloat) - 0.776469, (GLfloat) - 0.609074, (GLfloat) 0.161631, + (GLfloat) - 0.682182, (GLfloat) - 0.521915, (GLfloat) 0.512086, + (GLfloat) - 0.675579, (GLfloat) - 0.534280, (GLfloat) 0.508073, + (GLfloat) - 0.608832, (GLfloat) - 0.607495, (GLfloat) - 0.510170, + (GLfloat) - 0.602622, (GLfloat) - 0.619862, (GLfloat) - 0.502612, + (GLfloat) - 0.682182, (GLfloat) - 0.521915, (GLfloat) - 0.512086, + (GLfloat) - 0.675579, (GLfloat) - 0.534280, (GLfloat) - 0.508073, + (GLfloat) - 0.776469, (GLfloat) - 0.609074, (GLfloat) - 0.161631, + (GLfloat) - 0.782122, (GLfloat) - 0.600854, (GLfloat) - 0.165107, + (GLfloat) - 0.718752, (GLfloat) - 0.676658, (GLfloat) - 0.159776, + (GLfloat) - 0.721882, (GLfloat) - 0.672658, (GLfloat) - 0.162535, + (GLfloat) - 0.870738, (GLfloat) 0.446582, (GLfloat) - 0.205866, + (GLfloat) - 0.865307, (GLfloat) 0.468537, (GLfloat) - 0.178091, + (GLfloat) - 0.899779, (GLfloat) 0.430861, (GLfloat) - 0.068965, + (GLfloat) - 0.894461, (GLfloat) 0.441120, (GLfloat) - 0.073162, + (GLfloat) - 0.988176, (GLfloat) - 0.083362, (GLfloat) - 0.128682, + (GLfloat) - 0.982213, (GLfloat) - 0.119589, (GLfloat) - 0.144763, + (GLfloat) - 0.919779, (GLfloat) 0.029098, (GLfloat) - 0.391357, + (GLfloat) - 0.919364, (GLfloat) - 0.008818, (GLfloat) - 0.393310, + (GLfloat) - 0.865307, (GLfloat) 0.468537, (GLfloat) 0.178091, + (GLfloat) - 0.870738, (GLfloat) 0.446582, (GLfloat) 0.205866, + (GLfloat) - 0.919364, (GLfloat) - 0.008818, (GLfloat) 0.393310, + (GLfloat) - 0.919779, (GLfloat) 0.029098, (GLfloat) 0.391357, + (GLfloat) - 0.982213, (GLfloat) - 0.119589, (GLfloat) 0.144763, + (GLfloat) - 0.988176, (GLfloat) - 0.083362, (GLfloat) 0.128682, + (GLfloat) - 0.894461, (GLfloat) 0.441120, (GLfloat) 0.073162, + (GLfloat) - 0.899779, (GLfloat) 0.430861, (GLfloat) 0.068965, + (GLfloat) - 0.295242, (GLfloat) - 0.450841, (GLfloat) - 0.842362, + (GLfloat) - 0.299933, (GLfloat) - 0.431632, (GLfloat) - 0.850725, + (GLfloat) 0.013989, (GLfloat) - 0.247700, (GLfloat) - 0.968736, + (GLfloat) 0.015860, (GLfloat) - 0.266588, (GLfloat) - 0.963680, + (GLfloat) - 0.083295, (GLfloat) - 0.151964, (GLfloat) - 0.984870, + (GLfloat) - 0.083124, (GLfloat) - 0.152402, (GLfloat) - 0.984817, + (GLfloat) - 0.390828, (GLfloat) - 0.342108, (GLfloat) - 0.854527, + (GLfloat) - 0.391261, (GLfloat) - 0.341115, (GLfloat) - 0.854725, + (GLfloat) 0.602133, (GLfloat) 0.074603, (GLfloat) - 0.794903, + (GLfloat) 0.601151, (GLfloat) 0.064322, (GLfloat) - 0.796542, + (GLfloat) 0.503722, (GLfloat) 0.214463, (GLfloat) - 0.836821, + (GLfloat) 0.504737, (GLfloat) 0.210719, (GLfloat) - 0.837161, + (GLfloat) 0.206924, (GLfloat) 0.024347, (GLfloat) - 0.978054, + (GLfloat) 0.204663, (GLfloat) 0.031235, (GLfloat) - 0.978334, + (GLfloat) 0.305416, (GLfloat) - 0.098916, (GLfloat) - 0.947067, + (GLfloat) 0.305705, (GLfloat) - 0.083664, (GLfloat) - 0.948443, + (GLfloat) - 0.549371, (GLfloat) 0.797029, (GLfloat) - 0.250870, + (GLfloat) - 0.542332, (GLfloat) 0.789948, (GLfloat) - 0.286110, + (GLfloat) - 0.628658, (GLfloat) 0.711043, (GLfloat) - 0.314972, + (GLfloat) - 0.636726, (GLfloat) 0.708286, (GLfloat) - 0.304813, + (GLfloat) - 0.289225, (GLfloat) 0.481875, (GLfloat) - 0.827131, + (GLfloat) - 0.265869, (GLfloat) 0.473567, (GLfloat) - 0.839672, + (GLfloat) - 0.086396, (GLfloat) 0.693390, (GLfloat) - 0.715365, + (GLfloat) - 0.059540, (GLfloat) 0.687907, (GLfloat) - 0.723352, + (GLfloat) - 0.805592, (GLfloat) 0.530374, (GLfloat) - 0.264056, + (GLfloat) - 0.816724, (GLfloat) 0.502516, (GLfloat) - 0.283619, + (GLfloat) - 0.744687, (GLfloat) 0.181500, (GLfloat) - 0.642260, + (GLfloat) - 0.739363, (GLfloat) 0.135764, (GLfloat) - 0.659478, + (GLfloat) - 0.502724, (GLfloat) 0.272838, (GLfloat) - 0.820261, + (GLfloat) - 0.516850, (GLfloat) 0.314382, (GLfloat) - 0.796260, + (GLfloat) - 0.732550, (GLfloat) 0.603460, (GLfloat) - 0.314971, + (GLfloat) - 0.730076, (GLfloat) 0.611620, (GLfloat) - 0.304812, + (GLfloat) - 0.612735, (GLfloat) 0.780498, (GLfloat) 0.124010, + (GLfloat) - 0.620926, (GLfloat) 0.772016, (GLfloat) 0.135801, + (GLfloat) - 0.683860, (GLfloat) 0.721331, (GLfloat) 0.109621, + (GLfloat) - 0.686475, (GLfloat) 0.718049, (GLfloat) 0.114708, + (GLfloat) - 0.697666, (GLfloat) 0.715659, (GLfloat) 0.033080, + (GLfloat) - 0.695640, (GLfloat) 0.717757, (GLfloat) 0.030164, + (GLfloat) - 0.638159, (GLfloat) 0.768656, (GLfloat) 0.043833, + (GLfloat) - 0.634338, (GLfloat) 0.772038, (GLfloat) 0.039657, + (GLfloat) - 0.793216, (GLfloat) 0.593605, (GLfloat) 0.135802, + (GLfloat) - 0.801406, (GLfloat) 0.585123, (GLfloat) 0.124011, + (GLfloat) - 0.790459, (GLfloat) 0.610945, (GLfloat) 0.043833, + (GLfloat) - 0.793705, (GLfloat) 0.607008, (GLfloat) 0.039656, + (GLfloat) - 0.741597, (GLfloat) 0.670167, (GLfloat) 0.030164, + (GLfloat) - 0.739572, (GLfloat) 0.672265, (GLfloat) 0.033079, + (GLfloat) - 0.744759, (GLfloat) 0.658269, (GLfloat) 0.109621, + (GLfloat) - 0.741569, (GLfloat) 0.660997, (GLfloat) 0.114710, + (GLfloat) - 0.801406, (GLfloat) 0.585123, (GLfloat) - 0.124011, + (GLfloat) - 0.793216, (GLfloat) 0.593605, (GLfloat) - 0.135802, + (GLfloat) - 0.744759, (GLfloat) 0.658269, (GLfloat) - 0.109621, + (GLfloat) - 0.741569, (GLfloat) 0.660997, (GLfloat) - 0.114710, + (GLfloat) - 0.739572, (GLfloat) 0.672265, (GLfloat) - 0.033079, + (GLfloat) - 0.741597, (GLfloat) 0.670167, (GLfloat) - 0.030164, + (GLfloat) - 0.790459, (GLfloat) 0.610945, (GLfloat) - 0.043833, + (GLfloat) - 0.793705, (GLfloat) 0.607008, (GLfloat) - 0.039656, + (GLfloat) - 0.620926, (GLfloat) 0.772016, (GLfloat) - 0.135801, + (GLfloat) - 0.612735, (GLfloat) 0.780498, (GLfloat) - 0.124010, + (GLfloat) - 0.638159, (GLfloat) 0.768656, (GLfloat) - 0.043833, + (GLfloat) - 0.634338, (GLfloat) 0.772038, (GLfloat) - 0.039657, + (GLfloat) - 0.695640, (GLfloat) 0.717757, (GLfloat) - 0.030164, + (GLfloat) - 0.697666, (GLfloat) 0.715659, (GLfloat) - 0.033080, + (GLfloat) - 0.683860, (GLfloat) 0.721331, (GLfloat) - 0.109621, + (GLfloat) - 0.686475, (GLfloat) 0.718049, (GLfloat) - 0.114708, + (GLfloat) 0.864441, (GLfloat) 0.198220, (GLfloat) - 0.462008, + (GLfloat) 0.865832, (GLfloat) 0.204848, (GLfloat) - 0.456478, + (GLfloat) 0.861398, (GLfloat) 0.190399, (GLfloat) - 0.470894, + (GLfloat) 0.864411, (GLfloat) 0.198309, (GLfloat) - 0.462024, + (GLfloat) 0.959873, (GLfloat) 0.240404, (GLfloat) - 0.144397, + (GLfloat) 0.959903, (GLfloat) 0.238290, (GLfloat) - 0.147664, + (GLfloat) 0.957414, (GLfloat) 0.250909, (GLfloat) - 0.142837, + (GLfloat) 0.957562, (GLfloat) 0.249145, (GLfloat) - 0.144919, + (GLfloat) 0.850599, (GLfloat) 0.179835, (GLfloat) - 0.494106, + (GLfloat) 0.855506, (GLfloat) 0.187394, (GLfloat) - 0.482693, + (GLfloat) 0.963921, (GLfloat) 0.218904, (GLfloat) - 0.151448, + (GLfloat) 0.963730, (GLfloat) 0.216664, (GLfloat) - 0.155826, + (GLfloat) 0.961835, (GLfloat) 0.230558, (GLfloat) - 0.147363, + (GLfloat) 0.961732, (GLfloat) 0.228244, (GLfloat) - 0.151580, + (GLfloat) 0.856249, (GLfloat) 0.184340, (GLfloat) - 0.482552, + (GLfloat) 0.860720, (GLfloat) 0.192749, (GLfloat) - 0.471178, + (GLfloat) 0.850599, (GLfloat) 0.179835, (GLfloat) 0.494106, + (GLfloat) 0.855506, (GLfloat) 0.187394, (GLfloat) 0.482693, + (GLfloat) 0.860720, (GLfloat) 0.192749, (GLfloat) 0.471179, + (GLfloat) 0.856249, (GLfloat) 0.184340, (GLfloat) 0.482552, + (GLfloat) 0.961835, (GLfloat) 0.230558, (GLfloat) 0.147363, + (GLfloat) 0.961732, (GLfloat) 0.228244, (GLfloat) 0.151580, + (GLfloat) 0.963730, (GLfloat) 0.216664, (GLfloat) 0.155826, + (GLfloat) 0.963921, (GLfloat) 0.218904, (GLfloat) 0.151448, + (GLfloat) 0.865832, (GLfloat) 0.204848, (GLfloat) 0.456478, + (GLfloat) 0.864441, (GLfloat) 0.198220, (GLfloat) 0.462008, + (GLfloat) 0.957414, (GLfloat) 0.250909, (GLfloat) 0.142837, + (GLfloat) 0.957562, (GLfloat) 0.249144, (GLfloat) 0.144919, + (GLfloat) 0.959903, (GLfloat) 0.238290, (GLfloat) 0.147664, + (GLfloat) 0.959873, (GLfloat) 0.240404, (GLfloat) 0.144397, + (GLfloat) 0.861398, (GLfloat) 0.190399, (GLfloat) 0.470894, + (GLfloat) 0.864411, (GLfloat) 0.198309, (GLfloat) 0.462024, + (GLfloat) - 0.368470, (GLfloat) - 0.398468, (GLfloat) - 0.839912, + (GLfloat) - 0.366469, (GLfloat) - 0.378022, (GLfloat) - 0.850177, + (GLfloat) - 0.433076, (GLfloat) - 0.339336, (GLfloat) - 0.835043, + (GLfloat) - 0.426924, (GLfloat) - 0.323639, (GLfloat) - 0.844390, + (GLfloat) - 0.078376, (GLfloat) - 0.184951, (GLfloat) - 0.979617, + (GLfloat) - 0.089636, (GLfloat) - 0.204692, (GLfloat) - 0.974714, + (GLfloat) - 0.031836, (GLfloat) - 0.216104, (GLfloat) - 0.975851, + (GLfloat) - 0.037496, (GLfloat) - 0.237942, (GLfloat) - 0.970555, + (GLfloat) - 0.516334, (GLfloat) - 0.149595, (GLfloat) - 0.843220, + (GLfloat) - 0.522141, (GLfloat) - 0.155987, (GLfloat) - 0.838473, + (GLfloat) - 0.160863, (GLfloat) - 0.078983, (GLfloat) - 0.983811, + (GLfloat) - 0.162216, (GLfloat) - 0.080222, (GLfloat) - 0.983489, + (GLfloat) - 0.124313, (GLfloat) - 0.142798, (GLfloat) - 0.981914, + (GLfloat) - 0.134702, (GLfloat) - 0.155051, (GLfloat) - 0.978680, + (GLfloat) - 0.485511, (GLfloat) - 0.259251, (GLfloat) - 0.834906, + (GLfloat) - 0.481803, (GLfloat) - 0.253626, (GLfloat) - 0.838773, + (GLfloat) 0.539229, (GLfloat) 0.099743, (GLfloat) - 0.836232, + (GLfloat) 0.527244, (GLfloat) 0.088685, (GLfloat) - 0.845073, + (GLfloat) 0.560111, (GLfloat) 0.087128, (GLfloat) - 0.823823, + (GLfloat) 0.546849, (GLfloat) 0.072324, (GLfloat) - 0.834101, + (GLfloat) 0.201167, (GLfloat) - 0.045810, (GLfloat) - 0.978485, + (GLfloat) 0.215853, (GLfloat) - 0.030110, (GLfloat) - 0.975962, + (GLfloat) 0.175573, (GLfloat) - 0.002365, (GLfloat) - 0.984464, + (GLfloat) 0.184916, (GLfloat) 0.005715, (GLfloat) - 0.982738, + (GLfloat) 0.593439, (GLfloat) 0.077285, (GLfloat) - 0.801160, + (GLfloat) 0.587937, (GLfloat) 0.063575, (GLfloat) - 0.806405, + (GLfloat) 0.272897, (GLfloat) - 0.086428, (GLfloat) - 0.958153, + (GLfloat) 0.279890, (GLfloat) - 0.067483, (GLfloat) - 0.957657, + (GLfloat) 0.236530, (GLfloat) - 0.071307, (GLfloat) - 0.969004, + (GLfloat) 0.249518, (GLfloat) - 0.051953, (GLfloat) - 0.966975, + (GLfloat) 0.579087, (GLfloat) 0.080825, (GLfloat) - 0.811250, + (GLfloat) 0.568834, (GLfloat) 0.065408, (GLfloat) - 0.819847, + (GLfloat) - 0.366469, (GLfloat) - 0.378021, (GLfloat) 0.850177, + (GLfloat) - 0.368470, (GLfloat) - 0.398468, (GLfloat) 0.839912, + (GLfloat) - 0.031836, (GLfloat) - 0.216104, (GLfloat) 0.975851, + (GLfloat) - 0.037496, (GLfloat) - 0.237942, (GLfloat) 0.970555, + (GLfloat) - 0.089636, (GLfloat) - 0.204692, (GLfloat) 0.974714, + (GLfloat) - 0.078376, (GLfloat) - 0.184951, (GLfloat) 0.979617, + (GLfloat) - 0.433076, (GLfloat) - 0.339336, (GLfloat) 0.835043, + (GLfloat) - 0.426924, (GLfloat) - 0.323639, (GLfloat) 0.844389, + (GLfloat) 0.593439, (GLfloat) 0.077284, (GLfloat) 0.801160, + (GLfloat) 0.587937, (GLfloat) 0.063575, (GLfloat) 0.806405, + (GLfloat) 0.568834, (GLfloat) 0.065408, (GLfloat) 0.819847, + (GLfloat) 0.579087, (GLfloat) 0.080825, (GLfloat) 0.811249, + (GLfloat) 0.236530, (GLfloat) - 0.071307, (GLfloat) 0.969004, + (GLfloat) 0.249518, (GLfloat) - 0.051953, (GLfloat) 0.966975, + (GLfloat) 0.279890, (GLfloat) - 0.067483, (GLfloat) 0.957657, + (GLfloat) 0.272897, (GLfloat) - 0.086428, (GLfloat) 0.958153, + (GLfloat) 0.527244, (GLfloat) 0.088685, (GLfloat) 0.845073, + (GLfloat) 0.539229, (GLfloat) 0.099743, (GLfloat) 0.836232, + (GLfloat) 0.175573, (GLfloat) - 0.002365, (GLfloat) 0.984464, + (GLfloat) 0.184916, (GLfloat) 0.005715, (GLfloat) 0.982738, + (GLfloat) 0.215853, (GLfloat) - 0.030110, (GLfloat) 0.975962, + (GLfloat) 0.201167, (GLfloat) - 0.045810, (GLfloat) 0.978485, + (GLfloat) 0.560111, (GLfloat) 0.087128, (GLfloat) 0.823823, + (GLfloat) 0.546849, (GLfloat) 0.072324, (GLfloat) 0.834101, + (GLfloat) - 0.516334, (GLfloat) - 0.149595, (GLfloat) 0.843220, + (GLfloat) - 0.522141, (GLfloat) - 0.155986, (GLfloat) 0.838473, + (GLfloat) - 0.481803, (GLfloat) - 0.253626, (GLfloat) 0.838773, + (GLfloat) - 0.485511, (GLfloat) - 0.259250, (GLfloat) 0.834906, + (GLfloat) - 0.124313, (GLfloat) - 0.142798, (GLfloat) 0.981914, + (GLfloat) - 0.134702, (GLfloat) - 0.155051, (GLfloat) 0.978680, + (GLfloat) - 0.162216, (GLfloat) - 0.080222, (GLfloat) 0.983489, + (GLfloat) - 0.160863, (GLfloat) - 0.078982, (GLfloat) 0.983811, + (GLfloat) - 0.686861, (GLfloat) - 0.525025, (GLfloat) - 0.502564, + (GLfloat) - 0.684324, (GLfloat) - 0.536936, (GLfloat) - 0.493357, + (GLfloat) - 0.799089, (GLfloat) - 0.580700, (GLfloat) - 0.155709, + (GLfloat) - 0.801122, (GLfloat) - 0.576989, (GLfloat) - 0.159016, + (GLfloat) - 0.862913, (GLfloat) - 0.481876, (GLfloat) - 0.152238, + (GLfloat) - 0.863678, (GLfloat) - 0.479780, (GLfloat) - 0.154502, + (GLfloat) - 0.750556, (GLfloat) - 0.441554, (GLfloat) - 0.491625, + (GLfloat) - 0.750719, (GLfloat) - 0.448983, (GLfloat) - 0.484598, + (GLfloat) - 0.686861, (GLfloat) - 0.525025, (GLfloat) 0.502564, + (GLfloat) - 0.684324, (GLfloat) - 0.536936, (GLfloat) 0.493357, + (GLfloat) - 0.750719, (GLfloat) - 0.448983, (GLfloat) 0.484598, + (GLfloat) - 0.750556, (GLfloat) - 0.441554, (GLfloat) 0.491625, + (GLfloat) - 0.862913, (GLfloat) - 0.481876, (GLfloat) 0.152238, + (GLfloat) - 0.863678, (GLfloat) - 0.479780, (GLfloat) 0.154503, + (GLfloat) - 0.801122, (GLfloat) - 0.576990, (GLfloat) 0.159016, + (GLfloat) - 0.799089, (GLfloat) - 0.580700, (GLfloat) 0.155709, + (GLfloat) - 0.845506, (GLfloat) - 0.204102, (GLfloat) 0.493419, + (GLfloat) - 0.849139, (GLfloat) - 0.212205, (GLfloat) 0.483666, + (GLfloat) - 0.962881, (GLfloat) - 0.220433, (GLfloat) 0.155789, + (GLfloat) - 0.962834, (GLfloat) - 0.223594, (GLfloat) 0.151516, + (GLfloat) - 0.918492, (GLfloat) - 0.365350, (GLfloat) 0.151297, + (GLfloat) - 0.918584, (GLfloat) - 0.364876, (GLfloat) 0.151885, + (GLfloat) - 0.806201, (GLfloat) - 0.341087, (GLfloat) 0.483425, + (GLfloat) - 0.806184, (GLfloat) - 0.341015, (GLfloat) 0.483504, + (GLfloat) - 0.849139, (GLfloat) - 0.212204, (GLfloat) - 0.483666, + (GLfloat) - 0.845506, (GLfloat) - 0.204102, (GLfloat) - 0.493419, + (GLfloat) - 0.806201, (GLfloat) - 0.341087, (GLfloat) - 0.483425, + (GLfloat) - 0.806184, (GLfloat) - 0.341015, (GLfloat) - 0.483504, + (GLfloat) - 0.918584, (GLfloat) - 0.364876, (GLfloat) - 0.151885, + (GLfloat) - 0.918492, (GLfloat) - 0.365350, (GLfloat) - 0.151297, + (GLfloat) - 0.962881, (GLfloat) - 0.220433, (GLfloat) - 0.155789, + (GLfloat) - 0.962834, (GLfloat) - 0.223594, (GLfloat) - 0.151516, + (GLfloat) - 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324, + (GLfloat) - 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324, + (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280, + (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280, + (GLfloat) - 0.165393, (GLfloat) 0.154386, (GLfloat) - 0.974069, + (GLfloat) - 0.162365, (GLfloat) 0.156806, (GLfloat) - 0.974192, + (GLfloat) - 0.508257, (GLfloat) 0.155255, (GLfloat) - 0.847095, + (GLfloat) - 0.512203, (GLfloat) 0.151943, (GLfloat) - 0.845318, + (GLfloat) 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324, + (GLfloat) 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324, + (GLfloat) 0.506875, (GLfloat) 0.175794, (GLfloat) - 0.843904, + (GLfloat) 0.506455, (GLfloat) 0.176110, (GLfloat) - 0.844091, + (GLfloat) 0.160943, (GLfloat) 0.163176, (GLfloat) - 0.973381, + (GLfloat) 0.162221, (GLfloat) 0.162243, (GLfloat) - 0.973325, + (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280, + (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280, + (GLfloat) 0.521791, (GLfloat) 0.120579, (GLfloat) - 0.844509, + (GLfloat) 0.514604, (GLfloat) 0.123502, (GLfloat) - 0.848487, + (GLfloat) 0.164688, (GLfloat) 0.065494, (GLfloat) - 0.984169, + (GLfloat) 0.164274, (GLfloat) 0.065656, (GLfloat) - 0.984227, + (GLfloat) 0.162599, (GLfloat) 0.118143, (GLfloat) - 0.979594, + (GLfloat) 0.160323, (GLfloat) 0.119382, (GLfloat) - 0.979819, + (GLfloat) 0.509344, (GLfloat) 0.149891, (GLfloat) - 0.847409, + (GLfloat) 0.511715, (GLfloat) 0.148557, (GLfloat) - 0.846214, + (GLfloat) - 0.523595, (GLfloat) - 0.008036, (GLfloat) - 0.851929, + (GLfloat) - 0.537099, (GLfloat) - 0.019782, (GLfloat) - 0.843287, + (GLfloat) - 0.515557, (GLfloat) 0.088028, (GLfloat) - 0.852322, + (GLfloat) - 0.525730, (GLfloat) 0.079884, (GLfloat) - 0.846892, + (GLfloat) - 0.173169, (GLfloat) 0.095066, (GLfloat) - 0.980293, + (GLfloat) - 0.165823, (GLfloat) 0.100484, (GLfloat) - 0.981023, + (GLfloat) - 0.177991, (GLfloat) 0.018184, (GLfloat) - 0.983864, + (GLfloat) - 0.169802, (GLfloat) 0.024484, (GLfloat) - 0.985174, + (GLfloat) - 0.839324, (GLfloat) 0.204765, (GLfloat) - 0.503594, + (GLfloat) - 0.839323, (GLfloat) 0.204765, (GLfloat) - 0.503595, + (GLfloat) - 0.849441, (GLfloat) 0.151406, (GLfloat) - 0.505496, + (GLfloat) - 0.847954, (GLfloat) 0.148744, (GLfloat) - 0.508773, + (GLfloat) - 0.975887, (GLfloat) 0.146977, (GLfloat) - 0.161379, + (GLfloat) - 0.975827, (GLfloat) 0.145984, (GLfloat) - 0.162638, + (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047, + (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047, + (GLfloat) - 0.869115, (GLfloat) - 0.045798, (GLfloat) - 0.492485, + (GLfloat) - 0.862005, (GLfloat) - 0.035136, (GLfloat) - 0.505681, + (GLfloat) - 0.985988, (GLfloat) - 0.044696, (GLfloat) - 0.160715, + (GLfloat) - 0.986683, (GLfloat) - 0.048596, (GLfloat) - 0.155223, + (GLfloat) - 0.984333, (GLfloat) 0.067324, (GLfloat) - 0.162959, + (GLfloat) - 0.984743, (GLfloat) 0.069793, (GLfloat) - 0.159404, + (GLfloat) - 0.856976, (GLfloat) 0.069431, (GLfloat) - 0.510658, + (GLfloat) - 0.861737, (GLfloat) 0.075800, (GLfloat) - 0.501660, + (GLfloat) - 0.869115, (GLfloat) - 0.045798, (GLfloat) 0.492485, + (GLfloat) - 0.862005, (GLfloat) - 0.035136, (GLfloat) 0.505681, + (GLfloat) - 0.856976, (GLfloat) 0.069431, (GLfloat) 0.510659, + (GLfloat) - 0.861738, (GLfloat) 0.075800, (GLfloat) 0.501660, + (GLfloat) - 0.984743, (GLfloat) 0.069793, (GLfloat) 0.159404, + (GLfloat) - 0.984333, (GLfloat) 0.067324, (GLfloat) 0.162959, + (GLfloat) - 0.986683, (GLfloat) - 0.048596, (GLfloat) 0.155223, + (GLfloat) - 0.985988, (GLfloat) - 0.044696, (GLfloat) 0.160715, + (GLfloat) - 0.839324, (GLfloat) 0.204766, (GLfloat) 0.503594, + (GLfloat) - 0.839323, (GLfloat) 0.204765, (GLfloat) 0.503595, + (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047, + (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047, + (GLfloat) - 0.975887, (GLfloat) 0.146977, (GLfloat) 0.161379, + (GLfloat) - 0.975827, (GLfloat) 0.145984, (GLfloat) 0.162638, + (GLfloat) - 0.847954, (GLfloat) 0.148744, (GLfloat) 0.508773, + (GLfloat) - 0.849441, (GLfloat) 0.151406, (GLfloat) 0.505496, + (GLfloat) - 0.503594, (GLfloat) 0.204766, (GLfloat) 0.839324, + (GLfloat) - 0.503595, (GLfloat) 0.204765, (GLfloat) 0.839323, + (GLfloat) - 0.512203, (GLfloat) 0.151943, (GLfloat) 0.845318, + (GLfloat) - 0.508258, (GLfloat) 0.155255, (GLfloat) 0.847095, + (GLfloat) - 0.165393, (GLfloat) 0.154386, (GLfloat) 0.974069, + (GLfloat) - 0.162365, (GLfloat) 0.156806, (GLfloat) 0.974192, + (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280, + (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280, + (GLfloat) - 0.537099, (GLfloat) - 0.019782, (GLfloat) 0.843287, + (GLfloat) - 0.523595, (GLfloat) - 0.008036, (GLfloat) 0.851930, + (GLfloat) - 0.177991, (GLfloat) 0.018183, (GLfloat) 0.983864, + (GLfloat) - 0.169802, (GLfloat) 0.024484, (GLfloat) 0.985174, + (GLfloat) - 0.165823, (GLfloat) 0.100484, (GLfloat) 0.981023, + (GLfloat) - 0.173169, (GLfloat) 0.095066, (GLfloat) 0.980293, + (GLfloat) - 0.515557, (GLfloat) 0.088028, (GLfloat) 0.852322, + (GLfloat) - 0.525730, (GLfloat) 0.079884, (GLfloat) 0.846892, + (GLfloat) 0.514604, (GLfloat) 0.123503, (GLfloat) 0.848487, + (GLfloat) 0.521791, (GLfloat) 0.120579, (GLfloat) 0.844509, + (GLfloat) 0.509344, (GLfloat) 0.149891, (GLfloat) 0.847409, + (GLfloat) 0.511715, (GLfloat) 0.148557, (GLfloat) 0.846214, + (GLfloat) 0.160323, (GLfloat) 0.119382, (GLfloat) 0.979819, + (GLfloat) 0.162599, (GLfloat) 0.118143, (GLfloat) 0.979594, + (GLfloat) 0.164688, (GLfloat) 0.065494, (GLfloat) 0.984169, + (GLfloat) 0.164275, (GLfloat) 0.065655, (GLfloat) 0.984227, + (GLfloat) 0.503594, (GLfloat) 0.204766, (GLfloat) 0.839324, + (GLfloat) 0.503595, (GLfloat) 0.204765, (GLfloat) 0.839323, + (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280, + (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280, + (GLfloat) 0.160943, (GLfloat) 0.163176, (GLfloat) 0.973381, + (GLfloat) 0.162221, (GLfloat) 0.162243, (GLfloat) 0.973325, + (GLfloat) 0.506455, (GLfloat) 0.176110, (GLfloat) 0.844090, + (GLfloat) 0.506875, (GLfloat) 0.175794, (GLfloat) 0.843904, + (GLfloat) 0.839324, (GLfloat) 0.204766, (GLfloat) 0.503594, + (GLfloat) 0.839323, (GLfloat) 0.204765, (GLfloat) 0.503595, + (GLfloat) 0.842767, (GLfloat) 0.188271, (GLfloat) 0.504280, + (GLfloat) 0.842301, (GLfloat) 0.187401, (GLfloat) 0.505381, + (GLfloat) 0.968491, (GLfloat) 0.190085, (GLfloat) 0.160914, + (GLfloat) 0.968481, (GLfloat) 0.189712, (GLfloat) 0.161414, + (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047, + (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047, + (GLfloat) 0.850151, (GLfloat) 0.182077, (GLfloat) 0.494055, + (GLfloat) 0.846712, (GLfloat) 0.177186, (GLfloat) 0.501681, + (GLfloat) 0.966795, (GLfloat) 0.202453, (GLfloat) 0.155950, + (GLfloat) 0.966634, (GLfloat) 0.200782, (GLfloat) 0.159079, + (GLfloat) 0.968271, (GLfloat) 0.191230, (GLfloat) 0.160881, + (GLfloat) 0.968343, (GLfloat) 0.192206, (GLfloat) 0.159274, + (GLfloat) 0.844217, (GLfloat) 0.179436, (GLfloat) 0.505074, + (GLfloat) 0.845886, (GLfloat) 0.181962, (GLfloat) 0.501364, + (GLfloat) 0.846712, (GLfloat) 0.177186, (GLfloat) - 0.501682, + (GLfloat) 0.850151, (GLfloat) 0.182077, (GLfloat) - 0.494055, + (GLfloat) 0.844217, (GLfloat) 0.179436, (GLfloat) - 0.505074, + (GLfloat) 0.845886, (GLfloat) 0.181962, (GLfloat) - 0.501365, + (GLfloat) 0.968343, (GLfloat) 0.192206, (GLfloat) - 0.159274, + (GLfloat) 0.968271, (GLfloat) 0.191230, (GLfloat) - 0.160881, + (GLfloat) 0.966795, (GLfloat) 0.202453, (GLfloat) - 0.155950, + (GLfloat) 0.966634, (GLfloat) 0.200782, (GLfloat) - 0.159079, + (GLfloat) 0.839324, (GLfloat) 0.204765, (GLfloat) - 0.503594, + (GLfloat) 0.839323, (GLfloat) 0.204765, (GLfloat) - 0.503595, + (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047, + (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047, + (GLfloat) 0.968491, (GLfloat) 0.190085, (GLfloat) - 0.160914, + (GLfloat) 0.968481, (GLfloat) 0.189713, (GLfloat) - 0.161414, + (GLfloat) 0.842301, (GLfloat) 0.187401, (GLfloat) - 0.505381, + (GLfloat) 0.842767, (GLfloat) 0.188271, (GLfloat) - 0.504280, + (GLfloat) 0.831768, (GLfloat) 0.243104, (GLfloat) 0.499061, + (GLfloat) 0.831768, (GLfloat) 0.243103, (GLfloat) 0.499062, + (GLfloat) 0.957902, (GLfloat) 0.238609, (GLfloat) 0.159651, + (GLfloat) 0.957902, (GLfloat) 0.238611, (GLfloat) 0.159650, + (GLfloat) 0.982539, (GLfloat) 0.084307, (GLfloat) 0.165861, + (GLfloat) 0.982460, (GLfloat) 0.089222, (GLfloat) 0.163743, + (GLfloat) 0.853634, (GLfloat) 0.079021, (GLfloat) 0.514845, + (GLfloat) 0.854444, (GLfloat) 0.084251, (GLfloat) 0.512667, + (GLfloat) 0.831768, (GLfloat) 0.243103, (GLfloat) - 0.499062, + (GLfloat) 0.831768, (GLfloat) 0.243104, (GLfloat) - 0.499061, + (GLfloat) 0.853634, (GLfloat) 0.079020, (GLfloat) - 0.514845, + (GLfloat) 0.854444, (GLfloat) 0.084251, (GLfloat) - 0.512667, + (GLfloat) 0.982460, (GLfloat) 0.089222, (GLfloat) - 0.163743, + (GLfloat) 0.982539, (GLfloat) 0.084307, (GLfloat) - 0.165861, + (GLfloat) 0.957902, (GLfloat) 0.238609, (GLfloat) - 0.159651, + (GLfloat) 0.957902, (GLfloat) 0.238611, (GLfloat) - 0.159650, + (GLfloat) 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163, + (GLfloat) 0.811943, (GLfloat) - 0.566920, (GLfloat) - 0.139104, + (GLfloat) 0.830641, (GLfloat) - 0.534923, (GLfloat) - 0.154571, + (GLfloat) 0.677706, (GLfloat) - 0.609532, (GLfloat) - 0.411322, + (GLfloat) 0.690948, (GLfloat) - 0.577758, (GLfloat) - 0.434496, + (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092, + (GLfloat) 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) 0.677707, (GLfloat) - 0.609531, (GLfloat) 0.411322, + (GLfloat) 0.690948, (GLfloat) - 0.577758, (GLfloat) 0.434496, + (GLfloat) 0.830641, (GLfloat) - 0.534923, (GLfloat) 0.154571, + (GLfloat) 0.811943, (GLfloat) - 0.566920, (GLfloat) 0.139104, + (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073163, + (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) 0.499061, (GLfloat) 0.243103, (GLfloat) - 0.831768, + (GLfloat) 0.499061, (GLfloat) 0.243104, (GLfloat) - 0.831768, + (GLfloat) 0.159650, (GLfloat) 0.238610, (GLfloat) - 0.957902, + (GLfloat) 0.159651, (GLfloat) 0.238610, (GLfloat) - 0.957902, + (GLfloat) 0.165862, (GLfloat) 0.084307, (GLfloat) - 0.982539, + (GLfloat) 0.163744, (GLfloat) 0.089222, (GLfloat) - 0.982460, + (GLfloat) 0.514845, (GLfloat) 0.079019, (GLfloat) - 0.853634, + (GLfloat) 0.512666, (GLfloat) 0.084251, (GLfloat) - 0.854444, + (GLfloat) - 0.499061, (GLfloat) 0.243104, (GLfloat) - 0.831768, + (GLfloat) - 0.499061, (GLfloat) 0.243103, (GLfloat) - 0.831768, + (GLfloat) - 0.514845, (GLfloat) 0.079019, (GLfloat) - 0.853634, + (GLfloat) - 0.512666, (GLfloat) 0.084251, (GLfloat) - 0.854444, + (GLfloat) - 0.163744, (GLfloat) 0.089222, (GLfloat) - 0.982460, + (GLfloat) - 0.165862, (GLfloat) 0.084307, (GLfloat) - 0.982539, + (GLfloat) - 0.159650, (GLfloat) 0.238610, (GLfloat) - 0.957902, + (GLfloat) - 0.159651, (GLfloat) 0.238610, (GLfloat) - 0.957902, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) - 0.139105, (GLfloat) - 0.566920, (GLfloat) - 0.811943, + (GLfloat) - 0.154572, (GLfloat) - 0.534923, (GLfloat) - 0.830641, + (GLfloat) - 0.411321, (GLfloat) - 0.609532, (GLfloat) - 0.677706, + (GLfloat) - 0.434496, (GLfloat) - 0.577758, (GLfloat) - 0.690948, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621, + (GLfloat) 0.411321, (GLfloat) - 0.609532, (GLfloat) - 0.677706, + (GLfloat) 0.434496, (GLfloat) - 0.577758, (GLfloat) - 0.690948, + (GLfloat) 0.154572, (GLfloat) - 0.534923, (GLfloat) - 0.830641, + (GLfloat) 0.139105, (GLfloat) - 0.566920, (GLfloat) - 0.811943, + (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105, + (GLfloat) - 0.831768, (GLfloat) 0.243104, (GLfloat) - 0.499061, + (GLfloat) - 0.831768, (GLfloat) 0.243103, (GLfloat) - 0.499062, + (GLfloat) - 0.957902, (GLfloat) 0.238609, (GLfloat) - 0.159651, + (GLfloat) - 0.957902, (GLfloat) 0.238611, (GLfloat) - 0.159650, + (GLfloat) - 0.982539, (GLfloat) 0.084307, (GLfloat) - 0.165861, + (GLfloat) - 0.982460, (GLfloat) 0.089222, (GLfloat) - 0.163743, + (GLfloat) - 0.853634, (GLfloat) 0.079020, (GLfloat) - 0.514845, + (GLfloat) - 0.854444, (GLfloat) 0.084251, (GLfloat) - 0.512667, + (GLfloat) - 0.831768, (GLfloat) 0.243103, (GLfloat) 0.499062, + (GLfloat) - 0.831768, (GLfloat) 0.243104, (GLfloat) 0.499061, + (GLfloat) - 0.853634, (GLfloat) 0.079021, (GLfloat) 0.514845, + (GLfloat) - 0.854444, (GLfloat) 0.084251, (GLfloat) 0.512667, + (GLfloat) - 0.982460, (GLfloat) 0.089222, (GLfloat) 0.163743, + (GLfloat) - 0.982539, (GLfloat) 0.084307, (GLfloat) 0.165861, + (GLfloat) - 0.957902, (GLfloat) 0.238609, (GLfloat) 0.159651, + (GLfloat) - 0.957902, (GLfloat) 0.238611, (GLfloat) 0.159650, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866, + (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073163, + (GLfloat) - 0.811943, (GLfloat) - 0.566920, (GLfloat) 0.139104, + (GLfloat) - 0.830641, (GLfloat) - 0.534923, (GLfloat) 0.154571, + (GLfloat) - 0.677707, (GLfloat) - 0.609531, (GLfloat) 0.411322, + (GLfloat) - 0.690948, (GLfloat) - 0.577758, (GLfloat) 0.434496, + (GLfloat) - 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092, + (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866, + (GLfloat) - 0.677706, (GLfloat) - 0.609532, (GLfloat) - 0.411322, + (GLfloat) - 0.690948, (GLfloat) - 0.577758, (GLfloat) - 0.434496, + (GLfloat) - 0.830641, (GLfloat) - 0.534923, (GLfloat) - 0.154571, + (GLfloat) - 0.811943, (GLfloat) - 0.566920, (GLfloat) - 0.139104, + (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163, + (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965, + (GLfloat) - 0.499061, (GLfloat) 0.243104, (GLfloat) 0.831769, + (GLfloat) - 0.499061, (GLfloat) 0.243103, (GLfloat) 0.831768, + (GLfloat) - 0.159650, (GLfloat) 0.238610, (GLfloat) 0.957902, + (GLfloat) - 0.159651, (GLfloat) 0.238610, (GLfloat) 0.957902, + (GLfloat) - 0.165862, (GLfloat) 0.084307, (GLfloat) 0.982539, + (GLfloat) - 0.163744, (GLfloat) 0.089222, (GLfloat) 0.982460, + (GLfloat) - 0.514844, (GLfloat) 0.079021, (GLfloat) 0.853634, + (GLfloat) - 0.512667, (GLfloat) 0.084251, (GLfloat) 0.854444, + (GLfloat) 0.499061, (GLfloat) 0.243103, (GLfloat) 0.831768, + (GLfloat) 0.499061, (GLfloat) 0.243104, (GLfloat) 0.831769, + (GLfloat) 0.514844, (GLfloat) 0.079021, (GLfloat) 0.853634, + (GLfloat) 0.512667, (GLfloat) 0.084251, (GLfloat) 0.854444, + (GLfloat) 0.163744, (GLfloat) 0.089222, (GLfloat) 0.982460, + (GLfloat) 0.165862, (GLfloat) 0.084307, (GLfloat) 0.982539, + (GLfloat) 0.159650, (GLfloat) 0.238610, (GLfloat) 0.957902, + (GLfloat) 0.159651, (GLfloat) 0.238610, (GLfloat) 0.957902, + (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283621, + (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) 0.139105, (GLfloat) - 0.566920, (GLfloat) 0.811943, + (GLfloat) 0.154572, (GLfloat) - 0.534923, (GLfloat) 0.830641, + (GLfloat) 0.411321, (GLfloat) - 0.609531, (GLfloat) 0.677707, + (GLfloat) 0.434496, (GLfloat) - 0.577757, (GLfloat) 0.690948, + (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055, + (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283621, + (GLfloat) - 0.411321, (GLfloat) - 0.609531, (GLfloat) 0.677707, + (GLfloat) - 0.434496, (GLfloat) - 0.577757, (GLfloat) 0.690948, + (GLfloat) - 0.154572, (GLfloat) - 0.534923, (GLfloat) 0.830641, + (GLfloat) - 0.139105, (GLfloat) - 0.566920, (GLfloat) 0.811943, + (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029, + (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105, + (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802, + (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709, + (GLfloat) - 0.135803, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, + (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802, + (GLfloat) 0.135803, (GLfloat) - 0.982944, (GLfloat) 0.124011, + (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834, + (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656, + (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163, + (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079, + (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621, + (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709, +}; + +static unsigned short int s1_6_POLS[] = +{ + 3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1, + 3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1, + 3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1, + 3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1, + 3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1, + 3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1, + 3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1, + 3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1, + 3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1, + 3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1, + 3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1, + 3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1, + 3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1, + 3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1, + 3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1, +3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1, + 3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1, + 3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1, + 3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1, + 3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1, + 3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1, + 3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1, + 3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1, + 3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1, + 3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1, + 3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1, + 3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1, +3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1, +3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1, + 3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1, + 3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1, + 3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1, + 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1, + 3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1, + 3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1, + 3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1, + 3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1, + 3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1, + 3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1, +3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1, + 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1, + 3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1, + 3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1, + 3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1, + 3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1, + 3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1, + 3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1, +3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1, + 3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1, + 3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1, + 3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1, + 3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1, +3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1, + 3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1, + 3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1, + 3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1, + 3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1, + 3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1, + 3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1, + 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1, + 3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1, + 3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1, + 3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1, + 3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1, + 3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1, + 3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1, + 3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1, + 3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1, + 3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1, + 3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1, +3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1, + 3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1, + 3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1, + 3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1, + 3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1, + 3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1, +3, 8, 173, 172, 1, 3, 8, 172, 208, 1, 3, 173, 47, 207, 1, 3, 207, 172, 173, 1, + 3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1, +3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1, + 3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1, + 3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1, + 3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1, + 3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1, + 3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1, + 3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1, + 3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1, + 3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1, + 3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1, + 3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1, + 3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1, + 3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1, + 3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1, + 3, 11, 228, 179, 1, 3, 11, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1, + 3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 227, 49, 180, 1, 3, 180, 179, 227, 1, + 3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1, + 3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1, + 3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1, + 3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1, + 3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1, + 3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1, +3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1, + 3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1, + 3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1, + 3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1, +3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1, + 3, 63, 244, 236, 1, 3, 63, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1, +3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1, + 3, 63, 242, 240, 1, 3, 63, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1, +3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1, + 3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1, +3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1, + 3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1, +3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1, + 3, 53, 259, 205, 1, 3, 53, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1, +3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1, + 3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1, +3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1, + 3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1, +3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1, + 3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1, +3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1, + 3, 58, 270, 213, 1, 3, 58, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1, +3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1, + 3, 58, 269, 218, 1, 3, 58, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1, +3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1, + 3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1, +3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1, + 3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1, +3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1, + 3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1, +3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1, + 3, 61, 280, 230, 1, 3, 61, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1, +3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1, + 3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1, +3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1, + 3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1, +3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1, + 3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1, +3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1, + 3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1, +3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1, + 3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1, +3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1, + 3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1, + + 0 +}; + +struct lwo LWO_s1_6 = +{ + 290, /* number of points */ + s1_6_PNTS, s1_6_normals, s1_6_POLS, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_6.c */ diff --git a/hacks/glx/s1_b.c b/hacks/glx/s1_b.c new file mode 100644 index 00000000..5aca3911 --- /dev/null +++ b/hacks/glx/s1_b.c @@ -0,0 +1,537 @@ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)s1_b.c 4.2 97/04/20 xlockmore"; + +#endif + +/*- + * Points to render "s1_b" in 3D. + * + * Generated by lw2ogl. Link this with your program but do + * not edit by hand. + */ + +#ifndef STANDALONE +#include "xlock.h" +#endif + +#ifdef USE_GL + +#ifdef STANDALONE +#include +#endif +#include +#include "buildlwo.h" + +static GLfloat s1_b_PNTS[] = +{ + (GLfloat) - 0.137893, (GLfloat) 0.043508, (GLfloat) - 0.125711, + (GLfloat) - 0.095845, (GLfloat) - 0.165656, (GLfloat) 0.072892, + (GLfloat) - 0.093165, (GLfloat) 0.152051, (GLfloat) 0.327744, + (GLfloat) - 0.003795, (GLfloat) 0.001470, (GLfloat) - 0.102225, + (GLfloat) 0.152845, (GLfloat) - 0.430757, (GLfloat) - 0.031907, + (GLfloat) - 0.118828, (GLfloat) 0.399389, (GLfloat) 0.091047, + (GLfloat) - 0.169137, (GLfloat) - 0.181241, (GLfloat) - 0.288763, + (GLfloat) 0.048660, (GLfloat) 0.018262, (GLfloat) - 0.035049, + (GLfloat) 0.008859, (GLfloat) 0.208004, (GLfloat) - 0.059048, + (GLfloat) - 0.009212, (GLfloat) - 0.042229, (GLfloat) - 0.000692, + (GLfloat) - 0.040025, (GLfloat) 0.115695, (GLfloat) 0.178962, + (GLfloat) - 0.198525, (GLfloat) 0.018630, (GLfloat) 0.257202, + (GLfloat) 0.205081, (GLfloat) - 0.244569, (GLfloat) 0.136314, + (GLfloat) - 0.214336, (GLfloat) - 0.149946, (GLfloat) - 0.006872, + (GLfloat) 0.245675, (GLfloat) - 0.227316, (GLfloat) - 0.184201, + (GLfloat) - 0.001494, (GLfloat) 0.259139, (GLfloat) - 0.260652, + (GLfloat) 0.070243, (GLfloat) 0.038750, (GLfloat) 0.069425, + (GLfloat) - 0.033229, (GLfloat) - 0.259151, (GLfloat) 0.298856, + (GLfloat) 0.088773, (GLfloat) - 0.065324, (GLfloat) 0.260294, + (GLfloat) 0.009195, (GLfloat) 0.078651, (GLfloat) 0.055543, + (GLfloat) - 0.090795, (GLfloat) 0.025672, (GLfloat) 0.056988, + (GLfloat) - 0.163707, (GLfloat) - 0.011627, (GLfloat) - 0.096395, + (GLfloat) 0.068886, (GLfloat) 0.257031, (GLfloat) - 0.264175, + (GLfloat) - 0.018086, (GLfloat) - 0.285526, (GLfloat) 0.152989, + (GLfloat) - 0.017489, (GLfloat) 0.031671, (GLfloat) 0.000107, + (GLfloat) - 0.075583, (GLfloat) - 0.097617, (GLfloat) 0.030074, + (GLfloat) 0.129221, (GLfloat) - 0.087628, (GLfloat) 0.171748, + (GLfloat) - 0.007530, (GLfloat) - 0.084194, (GLfloat) 0.186045, + (GLfloat) 0.474638, (GLfloat) 0.004818, (GLfloat) 0.200460, + (GLfloat) 0.016796, (GLfloat) 0.096614, (GLfloat) - 0.221351, + (GLfloat) 0.187032, (GLfloat) 0.031017, (GLfloat) 0.039986, + (GLfloat) - 0.142119, (GLfloat) - 0.105297, (GLfloat) - 0.100849, + (GLfloat) 0.142768, (GLfloat) - 0.313960, (GLfloat) - 0.349716, + (GLfloat) - 0.146805, (GLfloat) 0.140482, (GLfloat) 0.035653, + (GLfloat) 0.039939, (GLfloat) - 0.051822, (GLfloat) - 0.017672, + (GLfloat) 0.057111, (GLfloat) - 0.075686, (GLfloat) - 0.103478, + (GLfloat) 0.049696, (GLfloat) - 0.135070, (GLfloat) 0.055097, + (GLfloat) 0.030271, (GLfloat) 0.075412, (GLfloat) - 0.103571, + (GLfloat) 0.100158, (GLfloat) - 0.022917, (GLfloat) 0.073895, + (GLfloat) 0.085544, (GLfloat) - 0.273613, (GLfloat) 0.092456, + (GLfloat) 0.077489, (GLfloat) - 0.309836, (GLfloat) - 0.003664, + (GLfloat) - 0.017590, (GLfloat) - 0.127869, (GLfloat) 0.153118, + (GLfloat) - 0.157014, (GLfloat) - 0.242184, (GLfloat) 0.070478, + (GLfloat) - 0.018167, (GLfloat) - 0.133639, (GLfloat) - 0.174937, + (GLfloat) - 0.106973, (GLfloat) - 0.189783, (GLfloat) 0.038622, + (GLfloat) - 0.000096, (GLfloat) 0.104429, (GLfloat) - 0.032589, + (GLfloat) - 0.032036, (GLfloat) - 0.021493, (GLfloat) 0.279829, + (GLfloat) - 0.093181, (GLfloat) - 0.058024, (GLfloat) 0.182239, + (GLfloat) 0.012941, (GLfloat) - 0.010409, (GLfloat) 0.088080, + (GLfloat) 0.256718, (GLfloat) - 0.118137, (GLfloat) - 0.078847, + (GLfloat) - 0.113382, (GLfloat) 0.135060, (GLfloat) 0.269946, + (GLfloat) 0.175810, (GLfloat) - 0.026321, (GLfloat) 0.013860, + (GLfloat) - 0.110606, (GLfloat) - 0.023553, (GLfloat) - 0.255525, + (GLfloat) 0.007163, (GLfloat) 0.068674, (GLfloat) 0.010214, + (GLfloat) 0.031631, (GLfloat) - 0.170381, (GLfloat) - 0.174604, + (GLfloat) 0.117242, (GLfloat) 0.014353, (GLfloat) - 0.021215, + (GLfloat) 0.090315, (GLfloat) 0.161755, (GLfloat) 0.074427, + (GLfloat) 0.285616, (GLfloat) 0.335824, (GLfloat) - 0.083891, + (GLfloat) - 0.145763, (GLfloat) 0.109292, (GLfloat) 0.121340, + (GLfloat) - 0.147459, (GLfloat) - 0.041936, (GLfloat) 0.010427, + (GLfloat) - 0.082626, (GLfloat) 0.151300, (GLfloat) - 0.030875, + (GLfloat) 0.217154, (GLfloat) - 0.288504, (GLfloat) - 0.202483, + (GLfloat) 0.026532, (GLfloat) - 0.106796, (GLfloat) 0.121041, + (GLfloat) 0.046695, (GLfloat) - 0.033673, (GLfloat) - 0.043721, + (GLfloat) 0.135596, (GLfloat) 0.217426, (GLfloat) - 0.219631, + (GLfloat) 0.137627, (GLfloat) 0.026335, (GLfloat) - 0.082390, + (GLfloat) - 0.031665, (GLfloat) - 0.115897, (GLfloat) 0.077834, + (GLfloat) - 0.214922, (GLfloat) - 0.162169, (GLfloat) 0.073035, + (GLfloat) - 0.076108, (GLfloat) 0.200481, (GLfloat) 0.036119, + (GLfloat) 0.012715, (GLfloat) - 0.161921, (GLfloat) 0.179804, + (GLfloat) 0.140409, (GLfloat) - 0.165899, (GLfloat) - 0.005149, + (GLfloat) - 0.054606, (GLfloat) 0.011149, (GLfloat) 0.045768, + (GLfloat) 0.116640, (GLfloat) - 0.180314, (GLfloat) 0.045320, + (GLfloat) 0.342166, (GLfloat) 0.295895, (GLfloat) - 0.049250, + (GLfloat) - 0.133242, (GLfloat) 0.129064, (GLfloat) 0.136969, + (GLfloat) 0.137520, (GLfloat) - 0.387145, (GLfloat) 0.132137, + (GLfloat) 0.023302, (GLfloat) 0.194298, (GLfloat) - 0.066187, + (GLfloat) 0.089302, (GLfloat) 0.128683, (GLfloat) - 0.072530, + (GLfloat) - 0.141374, (GLfloat) 0.035924, (GLfloat) - 0.079354, + (GLfloat) - 0.209233, (GLfloat) 0.018987, (GLfloat) - 0.004193, + (GLfloat) 0.156295, (GLfloat) - 0.034087, (GLfloat) 0.344315, + (GLfloat) - 0.005946, (GLfloat) 0.039791, (GLfloat) 0.071862, + (GLfloat) 0.076043, (GLfloat) - 0.094430, (GLfloat) 0.090122, + (GLfloat) 0.127394, (GLfloat) 0.031466, (GLfloat) - 0.028015, + (GLfloat) - 0.061000, (GLfloat) 0.169741, (GLfloat) - 0.127635, + (GLfloat) - 0.015117, (GLfloat) - 0.160883, (GLfloat) - 0.095443, + (GLfloat) - 0.185998, (GLfloat) - 0.182942, (GLfloat) 0.056857, + (GLfloat) 0.016499, (GLfloat) - 0.308118, (GLfloat) - 0.075513, + (GLfloat) 0.024971, (GLfloat) - 0.301226, (GLfloat) - 0.027251, + (GLfloat) - 0.035944, (GLfloat) 0.061566, (GLfloat) 0.013883, + (GLfloat) 0.007215, (GLfloat) 0.046198, (GLfloat) - 0.227891, + (GLfloat) 0.189165, (GLfloat) 0.079471, (GLfloat) - 0.067849, + (GLfloat) 0.026963, (GLfloat) 0.027982, (GLfloat) - 0.050419, + (GLfloat) - 0.050896, (GLfloat) 0.069604, (GLfloat) - 0.196938, + (GLfloat) 0.064274, (GLfloat) - 0.205263, (GLfloat) 0.297868, + (GLfloat) - 0.047543, (GLfloat) 0.147822, (GLfloat) 0.166593, + (GLfloat) 0.010318, (GLfloat) - 0.002148, (GLfloat) 0.029434, + (GLfloat) 0.036107, (GLfloat) - 0.523568, (GLfloat) - 0.118442, + (GLfloat) - 0.199410, (GLfloat) 0.233526, (GLfloat) - 0.161289, + (GLfloat) - 0.047441, (GLfloat) - 0.013973, (GLfloat) 0.112998, + (GLfloat) - 0.043494, (GLfloat) - 0.181796, (GLfloat) 0.065864, + (GLfloat) - 0.074984, (GLfloat) 0.177758, (GLfloat) - 0.156470, + (GLfloat) 0.225216, (GLfloat) 0.081058, (GLfloat) - 0.169876, + (GLfloat) - 0.041510, (GLfloat) 0.025763, (GLfloat) - 0.231350, + (GLfloat) 0.259015, (GLfloat) 0.274641, (GLfloat) 0.018290, + (GLfloat) 0.039196, (GLfloat) 0.010028, (GLfloat) 0.072771, + (GLfloat) 0.031646, (GLfloat) 0.075290, (GLfloat) 0.039258, + (GLfloat) 0.052930, (GLfloat) - 0.034809, (GLfloat) 0.165429, + (GLfloat) - 0.072511, (GLfloat) 0.095786, (GLfloat) - 0.222144, + (GLfloat) 0.038706, (GLfloat) 0.032296, (GLfloat) - 0.002495, + (GLfloat) 0.011675, (GLfloat) - 0.061944, (GLfloat) 0.082555, + (GLfloat) - 0.168400, (GLfloat) 0.074113, (GLfloat) 0.049321, + (GLfloat) 0.001263, (GLfloat) - 0.207436, (GLfloat) 0.013949, + (GLfloat) - 0.027045, (GLfloat) 0.015697, (GLfloat) - 0.047831, + (GLfloat) 0.121989, (GLfloat) - 0.043014, (GLfloat) - 0.004426, + (GLfloat) 0.238374, (GLfloat) - 0.320060, (GLfloat) - 0.111754, + (GLfloat) 0.095077, (GLfloat) 0.014640, (GLfloat) 0.070665, + (GLfloat) - 0.084367, (GLfloat) 0.016444, (GLfloat) 0.000788, + (GLfloat) - 0.117804, (GLfloat) 0.113550, (GLfloat) 0.087029, + (GLfloat) - 0.109080, (GLfloat) - 0.155795, (GLfloat) 0.040085, + (GLfloat) - 0.020370, (GLfloat) 0.118787, (GLfloat) 0.101787, + (GLfloat) 0.140877, (GLfloat) - 0.144829, (GLfloat) 0.107720, + (GLfloat) - 0.247002, (GLfloat) - 0.454632, (GLfloat) 0.070535, + (GLfloat) - 0.016278, (GLfloat) - 0.111440, (GLfloat) 0.270110, + (GLfloat) - 0.017624, (GLfloat) - 0.146232, (GLfloat) 0.154626, + (GLfloat) 0.214030, (GLfloat) 0.041025, (GLfloat) - 0.170250, + (GLfloat) 0.010009, (GLfloat) - 0.159290, (GLfloat) - 0.076895, + (GLfloat) 0.116168, (GLfloat) 0.156775, (GLfloat) - 0.077935, + (GLfloat) 0.199355, (GLfloat) 0.081120, (GLfloat) 0.003352, + (GLfloat) 0.054178, (GLfloat) - 0.036863, (GLfloat) - 0.004573, + (GLfloat) - 0.015149, (GLfloat) 0.057005, (GLfloat) - 0.008878, + (GLfloat) 0.374758, (GLfloat) - 0.007823, (GLfloat) - 0.078051, + (GLfloat) - 0.034977, (GLfloat) 0.026837, (GLfloat) 0.035441, + (GLfloat) 0.101867, (GLfloat) 0.121954, (GLfloat) 0.040450, + (GLfloat) - 0.136911, (GLfloat) 0.010061, (GLfloat) 0.082698, + (GLfloat) 0.121665, (GLfloat) - 0.589852, (GLfloat) 0.106401, + (GLfloat) - 0.064574, (GLfloat) 0.098679, (GLfloat) 0.059336, + (GLfloat) 0.103037, (GLfloat) - 0.075263, (GLfloat) 0.172586, + (GLfloat) - 0.217492, (GLfloat) - 0.170584, (GLfloat) - 0.025846, + (GLfloat) 0.260366, (GLfloat) 0.002117, (GLfloat) 0.041535, + (GLfloat) - 0.024112, (GLfloat) - 0.023437, (GLfloat) - 0.088146, + (GLfloat) - 0.007767, (GLfloat) 0.061738, (GLfloat) 0.116208, + (GLfloat) 0.253471, (GLfloat) 0.113278, (GLfloat) 0.231012, + (GLfloat) - 0.011399, (GLfloat) 0.116962, (GLfloat) - 0.037465, + (GLfloat) 0.233898, (GLfloat) 0.226108, (GLfloat) 0.077176, + (GLfloat) - 0.004640, (GLfloat) 0.209191, (GLfloat) - 0.091738, + (GLfloat) 0.093995, (GLfloat) 0.328937, (GLfloat) 0.245098, + (GLfloat) 0.155739, (GLfloat) - 0.327971, (GLfloat) - 0.115265, + (GLfloat) 0.125306, (GLfloat) 0.174931, (GLfloat) 0.130030, + (GLfloat) 0.005005, (GLfloat) - 0.022310, (GLfloat) 0.120651, + (GLfloat) 0.046982, (GLfloat) - 0.058839, (GLfloat) - 0.097958, + (GLfloat) - 0.059618, (GLfloat) - 0.068114, (GLfloat) 0.070137, + (GLfloat) 0.053184, (GLfloat) - 0.081163, (GLfloat) 0.000020, + (GLfloat) 0.188066, (GLfloat) - 0.082942, (GLfloat) - 0.013689, + (GLfloat) - 0.161390, (GLfloat) - 0.335891, (GLfloat) - 0.060737, + (GLfloat) 0.131189, (GLfloat) 0.036733, (GLfloat) - 0.093511, + (GLfloat) - 0.002496, (GLfloat) - 0.059035, (GLfloat) - 0.084055, + (GLfloat) 0.109820, (GLfloat) - 0.235531, (GLfloat) 0.130865, + (GLfloat) 0.018909, (GLfloat) 0.062351, (GLfloat) 0.111532, + (GLfloat) 0.123548, (GLfloat) 0.094008, (GLfloat) 0.056761, + (GLfloat) 0.106710, (GLfloat) - 0.049834, (GLfloat) - 0.147748, + (GLfloat) 0.102940, (GLfloat) - 0.113169, (GLfloat) 0.191710, + (GLfloat) - 0.028647, (GLfloat) 0.128038, (GLfloat) - 0.104189, + (GLfloat) 0.107226, (GLfloat) - 0.220633, (GLfloat) - 0.147310, + (GLfloat) - 0.205747, (GLfloat) 0.063433, (GLfloat) - 0.026135, + (GLfloat) - 0.064614, (GLfloat) 0.096963, (GLfloat) - 0.080108, + (GLfloat) - 0.083255, (GLfloat) 0.113008, (GLfloat) - 0.089852, + (GLfloat) 0.180961, (GLfloat) - 0.269100, (GLfloat) 0.115523, + (GLfloat) 0.044722, (GLfloat) - 0.023285, (GLfloat) 0.024813, + (GLfloat) 0.078986, (GLfloat) 0.037242, (GLfloat) 0.005124, + (GLfloat) 0.115141, (GLfloat) 0.124478, (GLfloat) - 0.034603, + (GLfloat) 0.022454, (GLfloat) 0.155937, (GLfloat) - 0.096183, + (GLfloat) 0.175318, (GLfloat) 0.007233, (GLfloat) - 0.138507, + (GLfloat) 0.019182, (GLfloat) - 0.037869, (GLfloat) 0.074242, + (GLfloat) 0.058218, (GLfloat) 0.212269, (GLfloat) - 0.003886, + (GLfloat) - 0.188525, (GLfloat) - 0.075703, (GLfloat) 0.075643, + (GLfloat) - 0.029085, (GLfloat) - 0.076746, (GLfloat) - 0.273473, + (GLfloat) - 0.105590, (GLfloat) - 0.238524, (GLfloat) - 0.087465, + (GLfloat) 0.086122, (GLfloat) - 0.340807, (GLfloat) - 0.192851, + (GLfloat) - 0.247936, (GLfloat) - 0.003160, (GLfloat) 0.082106, + (GLfloat) 0.137988, (GLfloat) - 0.041876, (GLfloat) - 0.012086, + (GLfloat) - 0.140714, (GLfloat) - 0.138827, (GLfloat) - 0.064179, + (GLfloat) - 0.059380, (GLfloat) 0.015642, (GLfloat) 0.113841, + (GLfloat) - 0.031501, (GLfloat) 0.007130, (GLfloat) - 0.125767, + (GLfloat) 0.021294, (GLfloat) - 0.021957, (GLfloat) - 0.069365, + (GLfloat) - 0.012419, (GLfloat) 0.019780, (GLfloat) - 0.077459, + (GLfloat) 0.085524, (GLfloat) 0.087513, (GLfloat) - 0.107484, + (GLfloat) - 0.303263, (GLfloat) 0.263672, (GLfloat) - 0.220649, + (GLfloat) - 0.090267, (GLfloat) - 0.376337, (GLfloat) - 0.127634, + (GLfloat) 0.087681, (GLfloat) 0.015985, (GLfloat) - 0.029860, + (GLfloat) 0.119257, (GLfloat) 0.140347, (GLfloat) 0.194003, + (GLfloat) 0.066270, (GLfloat) 0.127178, (GLfloat) - 0.003765, + (GLfloat) 0.037563, (GLfloat) - 0.110829, (GLfloat) 0.000382, + (GLfloat) 0.034295, (GLfloat) - 0.045737, (GLfloat) 0.045204, + (GLfloat) 0.017365, (GLfloat) - 0.072708, (GLfloat) 0.056698, + (GLfloat) 0.045238, (GLfloat) 0.187956, (GLfloat) - 0.055878, + (GLfloat) - 0.132755, (GLfloat) 0.017969, (GLfloat) - 0.041205, + (GLfloat) 0.189702, (GLfloat) - 0.020780, (GLfloat) - 0.077422, + (GLfloat) 0.210419, (GLfloat) 0.178041, (GLfloat) - 0.005855, + (GLfloat) 0.104527, (GLfloat) - 0.304323, (GLfloat) 0.002581, + (GLfloat) 0.043359, (GLfloat) - 0.060695, (GLfloat) - 0.011878, + (GLfloat) - 0.000267, (GLfloat) 0.020510, (GLfloat) - 0.046383, + (GLfloat) 0.252891, (GLfloat) 0.074246, (GLfloat) - 0.047689, + (GLfloat) - 0.069874, (GLfloat) 0.118962, (GLfloat) - 0.052781, + (GLfloat) 0.086188, (GLfloat) 0.068354, (GLfloat) - 0.213621, + (GLfloat) 0.086637, (GLfloat) - 0.171519, (GLfloat) 0.006447, + (GLfloat) 0.196785, (GLfloat) - 0.086044, (GLfloat) - 0.068059, + (GLfloat) 0.100401, (GLfloat) 0.243886, (GLfloat) - 0.142258, + (GLfloat) 0.173010, (GLfloat) 0.303375, (GLfloat) - 0.060085, + (GLfloat) - 0.041181, (GLfloat) - 0.097467, (GLfloat) 0.073776, + (GLfloat) - 0.013471, (GLfloat) - 0.133299, (GLfloat) - 0.143570, + (GLfloat) - 0.302092, (GLfloat) - 0.158342, (GLfloat) 0.230719, + (GLfloat) 0.074434, (GLfloat) - 0.143530, (GLfloat) 0.294895, + (GLfloat) - 0.165626, (GLfloat) 0.200869, (GLfloat) - 0.130737, + (GLfloat) 0.102444, (GLfloat) 0.277067, (GLfloat) 0.078210, + (GLfloat) - 0.183696, (GLfloat) - 0.010502, (GLfloat) - 0.150481, + (GLfloat) - 0.070029, (GLfloat) - 0.019635, (GLfloat) - 0.059141, + (GLfloat) - 0.005930, (GLfloat) 0.069199, (GLfloat) - 0.013126, + (GLfloat) - 0.119333, (GLfloat) - 0.007972, (GLfloat) 0.119489, + (GLfloat) 0.033072, (GLfloat) 0.081756, (GLfloat) - 0.034481, + (GLfloat) - 0.108282, (GLfloat) - 0.065310, (GLfloat) 0.146009, + (GLfloat) 0.080950, (GLfloat) 0.111320, (GLfloat) 0.004291, + (GLfloat) 0.071208, (GLfloat) - 0.112941, (GLfloat) 0.028135, + (GLfloat) - 0.024632, (GLfloat) 0.190525, (GLfloat) - 0.285626, + (GLfloat) - 0.105040, (GLfloat) 0.044008, (GLfloat) 0.020236, + (GLfloat) - 0.017815, (GLfloat) - 0.076684, (GLfloat) - 0.065840, + (GLfloat) 0.083563, (GLfloat) 0.100873, (GLfloat) - 0.141154, + (GLfloat) - 0.062066, (GLfloat) - 0.010894, (GLfloat) 0.066110, + (GLfloat) - 0.056763, (GLfloat) 0.024777, (GLfloat) - 0.176209, + (GLfloat) - 0.014442, (GLfloat) 0.052861, (GLfloat) 0.013010, + (GLfloat) - 0.157546, (GLfloat) - 0.118279, (GLfloat) - 0.237648, + (GLfloat) - 0.234497, (GLfloat) - 0.158049, (GLfloat) 0.102635, + (GLfloat) 0.061685, (GLfloat) - 0.052695, (GLfloat) - 0.042243, + (GLfloat) 0.093961, (GLfloat) - 0.025060, (GLfloat) 0.046602, + (GLfloat) 0.004395, (GLfloat) 0.150912, (GLfloat) 0.191784, + (GLfloat) 0.067299, (GLfloat) - 0.059575, (GLfloat) 0.161018, + (GLfloat) - 0.233155, (GLfloat) - 0.109721, (GLfloat) 0.194653, + (GLfloat) 0.217444, (GLfloat) 0.221231, (GLfloat) - 0.201241, + (GLfloat) - 0.033689, (GLfloat) - 0.341937, (GLfloat) - 0.099231, + (GLfloat) 0.042771, (GLfloat) - 0.028862, (GLfloat) 0.067736, + (GLfloat) 0.110240, (GLfloat) 0.274029, (GLfloat) - 0.157689, + (GLfloat) - 0.055994, (GLfloat) 0.144729, (GLfloat) 0.090901, + (GLfloat) 0.211192, (GLfloat) 0.058165, (GLfloat) - 0.149872, + (GLfloat) 0.102735, (GLfloat) - 0.044061, (GLfloat) - 0.044795, + (GLfloat) - 0.042153, (GLfloat) - 0.010955, (GLfloat) 0.014341, + (GLfloat) - 0.011649, (GLfloat) 0.099072, (GLfloat) - 0.086419, + (GLfloat) - 0.018920, (GLfloat) 0.000640, (GLfloat) - 0.031729, + (GLfloat) - 0.216886, (GLfloat) - 0.057512, (GLfloat) 0.071195, + (GLfloat) - 0.188150, (GLfloat) 0.049292, (GLfloat) 0.258489, + (GLfloat) - 0.023494, (GLfloat) 0.021489, (GLfloat) 0.199785, + (GLfloat) - 0.045818, (GLfloat) 0.066753, (GLfloat) - 0.035593, + (GLfloat) 0.010986, (GLfloat) 0.166767, (GLfloat) 0.275085, + (GLfloat) - 0.177039, (GLfloat) 0.010372, (GLfloat) 0.167936, + (GLfloat) - 0.423239, (GLfloat) 0.027466, (GLfloat) - 0.126114, + (GLfloat) - 0.102035, (GLfloat) 0.282640, (GLfloat) 0.022622, + (GLfloat) - 0.023997, (GLfloat) 0.176943, (GLfloat) 0.093272, + (GLfloat) - 0.090009, (GLfloat) 0.015338, (GLfloat) 0.250857, + (GLfloat) 0.011095, (GLfloat) 0.006703, (GLfloat) 0.057076, + (GLfloat) 0.133423, (GLfloat) 0.234639, (GLfloat) - 0.070260, + (GLfloat) - 0.295994, (GLfloat) 0.185615, (GLfloat) 0.117148, + (GLfloat) 0.235480, (GLfloat) 0.066195, (GLfloat) 0.078641, + (GLfloat) - 0.026545, (GLfloat) 0.093931, (GLfloat) 0.008019, + (GLfloat) 0.181656, (GLfloat) - 0.088719, (GLfloat) 0.045959, + (GLfloat) - 0.076308, (GLfloat) - 0.164584, (GLfloat) 0.018271, + (GLfloat) 0.092026, (GLfloat) 0.201866, (GLfloat) - 0.106051, + (GLfloat) 0.019876, (GLfloat) 0.050967, (GLfloat) 0.176081, + (GLfloat) - 0.018546, (GLfloat) 0.138749, (GLfloat) - 0.008255, + (GLfloat) - 0.026049, (GLfloat) - 0.068465, (GLfloat) - 0.055467, + (GLfloat) - 0.260245, (GLfloat) 0.221833, (GLfloat) - 0.048541, + (GLfloat) - 0.169783, (GLfloat) 0.354992, (GLfloat) - 0.017943, + (GLfloat) - 0.306063, (GLfloat) 0.074787, (GLfloat) 0.101971, + (GLfloat) 0.215973, (GLfloat) 0.107558, (GLfloat) - 0.008808, + (GLfloat) 0.390235, (GLfloat) - 0.275652, (GLfloat) - 0.117085, + (GLfloat) 0.033898, (GLfloat) 0.046047, (GLfloat) - 0.108977, + (GLfloat) - 0.263507, (GLfloat) - 0.091765, (GLfloat) - 0.250234, + (GLfloat) - 0.044613, (GLfloat) 0.149563, (GLfloat) 0.027937, + (GLfloat) - 0.015397, (GLfloat) - 0.040254, (GLfloat) 0.065692, + (GLfloat) - 0.017531, (GLfloat) - 0.013504, (GLfloat) 0.004021, + (GLfloat) 0.054665, (GLfloat) - 0.018996, (GLfloat) - 0.006954, + (GLfloat) 0.033068, (GLfloat) 0.219349, (GLfloat) - 0.194079, + (GLfloat) - 0.057780, (GLfloat) 0.011881, (GLfloat) 0.084904, + (GLfloat) 0.139243, (GLfloat) - 0.109890, (GLfloat) 0.039145, + (GLfloat) 0.223272, (GLfloat) 0.208110, (GLfloat) 0.165882, + (GLfloat) - 0.008046, (GLfloat) 0.103847, (GLfloat) 0.278718, + (GLfloat) - 0.035499, (GLfloat) 0.112662, (GLfloat) - 0.088418, + (GLfloat) - 0.053118, (GLfloat) 0.053871, (GLfloat) - 0.054706, + (GLfloat) 0.118632, (GLfloat) 0.086431, (GLfloat) - 0.022494, + (GLfloat) 0.014943, (GLfloat) 0.039622, (GLfloat) 0.047307, + (GLfloat) 0.006570, (GLfloat) 0.093461, (GLfloat) 0.058982, + (GLfloat) 0.031448, (GLfloat) 0.325716, (GLfloat) - 0.047305, + (GLfloat) - 0.193710, (GLfloat) 0.087226, (GLfloat) 0.051790, + (GLfloat) 0.116154, (GLfloat) - 0.080023, (GLfloat) - 0.106643, + (GLfloat) 0.156514, (GLfloat) - 0.222710, (GLfloat) 0.275425, + (GLfloat) - 0.084294, (GLfloat) - 0.101851, (GLfloat) 0.425222, + (GLfloat) 0.030344, (GLfloat) - 0.141370, (GLfloat) - 0.282460, + (GLfloat) 0.003022, (GLfloat) 0.108996, (GLfloat) - 0.229152, + (GLfloat) - 0.133040, (GLfloat) 0.061025, (GLfloat) - 0.128942, + (GLfloat) - 0.077348, (GLfloat) 0.013363, (GLfloat) - 0.072511, + (GLfloat) - 0.050317, (GLfloat) 0.452190, (GLfloat) 0.094114, + (GLfloat) 0.053309, (GLfloat) - 0.143722, (GLfloat) 0.249884, + (GLfloat) - 0.257016, (GLfloat) 0.100544, (GLfloat) 0.012236, + (GLfloat) - 0.022056, (GLfloat) - 0.212133, (GLfloat) 0.023533, + (GLfloat) 0.153299, (GLfloat) 0.031763, (GLfloat) 0.034577, + (GLfloat) 0.161729, (GLfloat) 0.084914, (GLfloat) 0.050770, + (GLfloat) 0.320438, (GLfloat) 0.112175, (GLfloat) 0.135015, + (GLfloat) - 0.040717, (GLfloat) 0.073400, (GLfloat) 0.080543, + (GLfloat) - 0.226004, (GLfloat) 0.143154, (GLfloat) 0.170139, + (GLfloat) 0.009756, (GLfloat) 0.068337, (GLfloat) 0.132111, + (GLfloat) 0.380191, (GLfloat) 0.233715, (GLfloat) 0.026664, + (GLfloat) - 0.018016, (GLfloat) 0.265426, (GLfloat) - 0.110691, + (GLfloat) 0.041281, (GLfloat) 0.056674, (GLfloat) - 0.119834, + (GLfloat) 0.170794, (GLfloat) - 0.112611, (GLfloat) 0.094839, + (GLfloat) 0.216318, (GLfloat) 0.002081, (GLfloat) 0.154653, + (GLfloat) - 0.036815, (GLfloat) 0.024332, (GLfloat) 0.172587, + (GLfloat) - 0.064554, (GLfloat) 0.160699, (GLfloat) 0.101229, + (GLfloat) 0.114451, (GLfloat) 0.016039, (GLfloat) 0.293489, + (GLfloat) 0.023010, (GLfloat) - 0.028932, (GLfloat) 0.014800, + (GLfloat) - 0.290527, (GLfloat) 0.172553, (GLfloat) 0.129526, + (GLfloat) - 0.048159, (GLfloat) - 0.181222, (GLfloat) 0.305871, + (GLfloat) 0.065351, (GLfloat) - 0.399962, (GLfloat) - 0.030479, + (GLfloat) 0.334123, (GLfloat) - 0.120149, (GLfloat) 0.241310, + (GLfloat) - 0.203728, (GLfloat) - 0.155627, (GLfloat) 0.140805, + (GLfloat) 0.061022, (GLfloat) - 0.016097, (GLfloat) 0.131688, + (GLfloat) 0.045050, (GLfloat) - 0.313782, (GLfloat) - 0.279077, + (GLfloat) 0.034252, (GLfloat) - 0.135512, (GLfloat) - 0.087765, + (GLfloat) 0.276236, (GLfloat) 0.036449, (GLfloat) 0.418332, + (GLfloat) - 0.122146, (GLfloat) 0.050998, (GLfloat) 0.131453, + (GLfloat) - 0.087629, (GLfloat) 0.330142, (GLfloat) 0.061353, + (GLfloat) 0.228676, (GLfloat) 0.093309, (GLfloat) - 0.009307, + (GLfloat) 0.435264, (GLfloat) 0.186185, (GLfloat) - 0.127484, + (GLfloat) 0.156565, (GLfloat) 0.013842, (GLfloat) - 0.103874, + (GLfloat) - 0.274053, (GLfloat) - 0.084119, (GLfloat) 0.096687, + (GLfloat) - 0.027947, (GLfloat) - 0.051152, (GLfloat) - 0.078997, + (GLfloat) 0.013399, (GLfloat) 0.194440, (GLfloat) 0.072030, + (GLfloat) 0.000082, (GLfloat) 0.130666, (GLfloat) 0.052218, + (GLfloat) 0.064984, (GLfloat) - 0.136859, (GLfloat) 0.092204, + (GLfloat) 0.109060, (GLfloat) 0.424779, (GLfloat) - 0.111867, + (GLfloat) 0.061748, (GLfloat) 0.160827, (GLfloat) - 0.068538, + (GLfloat) 0.062960, (GLfloat) 0.059638, (GLfloat) - 0.181514, + (GLfloat) 0.018961, (GLfloat) 0.072298, (GLfloat) 0.003517, + (GLfloat) - 0.099508, (GLfloat) - 0.225455, (GLfloat) - 0.021791, + (GLfloat) 0.001955, (GLfloat) - 0.320555, (GLfloat) 0.159506, + (GLfloat) - 0.057735, (GLfloat) - 0.054327, (GLfloat) - 0.095525, + (GLfloat) 0.319748, (GLfloat) - 0.146158, (GLfloat) - 0.198384, + (GLfloat) - 0.158741, (GLfloat) - 0.265443, (GLfloat) 0.036635, + (GLfloat) - 0.093089, (GLfloat) - 0.358379, (GLfloat) - 0.110549, + (GLfloat) - 0.049805, (GLfloat) 0.022246, (GLfloat) - 0.036724, + (GLfloat) 0.223000, (GLfloat) 0.247522, (GLfloat) - 0.232652, + (GLfloat) - 0.249441, (GLfloat) - 0.248325, (GLfloat) - 0.071169, + (GLfloat) 0.000369, (GLfloat) 0.094598, (GLfloat) - 0.162153, + (GLfloat) - 0.133873, (GLfloat) - 0.188473, (GLfloat) 0.272734, + (GLfloat) 0.046594, (GLfloat) 0.069766, (GLfloat) 0.015561, + (GLfloat) 0.111582, (GLfloat) - 0.239786, (GLfloat) 0.034658, + (GLfloat) 0.093232, (GLfloat) 0.183507, (GLfloat) - 0.011298, + (GLfloat) - 0.226805, (GLfloat) 0.514871, (GLfloat) - 0.064144, + (GLfloat) 0.085949, (GLfloat) 0.031412, (GLfloat) 0.042790, + (GLfloat) - 0.043755, (GLfloat) - 0.290797, (GLfloat) - 0.159142, + (GLfloat) 0.056671, (GLfloat) 0.167837, (GLfloat) 0.016536, + (GLfloat) - 0.034538, (GLfloat) 0.072185, (GLfloat) 0.066973, + (GLfloat) - 0.021211, (GLfloat) 0.064120, (GLfloat) - 0.174756, + (GLfloat) 0.090627, (GLfloat) - 0.055253, (GLfloat) 0.109457, + (GLfloat) 0.019686, (GLfloat) 0.004469, (GLfloat) - 0.096316, + (GLfloat) - 0.038864, (GLfloat) - 0.135083, (GLfloat) 0.244529, + (GLfloat) 0.034613, (GLfloat) - 0.069587, (GLfloat) 0.144533, + (GLfloat) - 0.100009, (GLfloat) - 0.057516, (GLfloat) - 0.079338, + (GLfloat) - 0.178026, (GLfloat) 0.085994, (GLfloat) 0.061804, + (GLfloat) - 0.189256, (GLfloat) 0.342739, (GLfloat) 0.043372, + (GLfloat) - 0.046206, (GLfloat) 0.168946, (GLfloat) - 0.133904, + (GLfloat) 0.015314, (GLfloat) - 0.090127, (GLfloat) - 0.058530, + (GLfloat) 0.169657, (GLfloat) - 0.097086, (GLfloat) 0.013746, + (GLfloat) 0.185131, (GLfloat) - 0.089445, (GLfloat) 0.347806, + (GLfloat) - 0.264432, (GLfloat) - 0.170170, (GLfloat) - 0.335858, + (GLfloat) - 0.086511, (GLfloat) 0.248252, (GLfloat) - 0.169698, + (GLfloat) 0.002287, (GLfloat) - 0.028338, (GLfloat) - 0.266432, + (GLfloat) - 0.085060, (GLfloat) 0.001974, (GLfloat) - 0.032789, + (GLfloat) 0.192750, (GLfloat) - 0.007081, (GLfloat) 0.098197, + (GLfloat) 0.012577, (GLfloat) 0.034983, (GLfloat) - 0.003058, + (GLfloat) - 0.039249, (GLfloat) 0.038498, (GLfloat) 0.067306, + (GLfloat) 0.021988, (GLfloat) 0.379705, (GLfloat) - 0.054619, + (GLfloat) - 0.151707, (GLfloat) 0.051034, (GLfloat) - 0.016003, + (GLfloat) - 0.057048, (GLfloat) 0.075729, (GLfloat) - 0.213397, + (GLfloat) - 0.137847, (GLfloat) 0.130600, (GLfloat) 0.046198, + (GLfloat) 0.024786, (GLfloat) 0.049556, (GLfloat) - 0.045772, + (GLfloat) - 0.082533, (GLfloat) 0.155397, (GLfloat) - 0.096145, + (GLfloat) 0.049152, (GLfloat) 0.270979, (GLfloat) - 0.147022, + (GLfloat) 0.061153, (GLfloat) - 0.104531, (GLfloat) - 0.103623, + (GLfloat) - 0.142997, (GLfloat) - 0.232885, (GLfloat) 0.040538, + (GLfloat) 0.048806, (GLfloat) - 0.013095, (GLfloat) - 0.003505, + (GLfloat) - 0.095063, (GLfloat) 0.241414, (GLfloat) - 0.202255, + (GLfloat) 0.108558, (GLfloat) - 0.147584, (GLfloat) 0.162682, + (GLfloat) 0.217105, (GLfloat) 0.252340, (GLfloat) - 0.114830, + (GLfloat) - 0.188028, (GLfloat) 0.417252, (GLfloat) - 0.077456, + (GLfloat) - 0.112855, (GLfloat) 0.105192, (GLfloat) 0.073968, + (GLfloat) - 0.186972, (GLfloat) 0.164022, (GLfloat) - 0.073415, + (GLfloat) - 0.074349, (GLfloat) - 0.324874, (GLfloat) - 0.056645, + (GLfloat) 0.327855, (GLfloat) - 0.271424, (GLfloat) - 0.141142, + (GLfloat) 0.151049, (GLfloat) 0.155239, (GLfloat) - 0.083116, + (GLfloat) 0.035395, (GLfloat) - 0.133176, (GLfloat) - 0.095112, + (GLfloat) 0.127283, (GLfloat) - 0.011837, (GLfloat) 0.199750, + (GLfloat) - 0.120775, (GLfloat) 0.103698, (GLfloat) 0.063302, + (GLfloat) 0.014222, (GLfloat) 0.198468, (GLfloat) 0.137537, + (GLfloat) - 0.269656, (GLfloat) 0.120644, (GLfloat) - 0.153958, + (GLfloat) - 0.136743, (GLfloat) - 0.119817, (GLfloat) - 0.073747, + (GLfloat) - 0.068156, (GLfloat) - 0.138484, (GLfloat) 0.033507, + (GLfloat) - 0.106835, (GLfloat) 0.114964, (GLfloat) 0.023924, + (GLfloat) - 0.222525, (GLfloat) 0.330321, (GLfloat) - 0.007431, + (GLfloat) - 0.011739, (GLfloat) 0.095156, (GLfloat) 0.139086, + (GLfloat) 0.146766, (GLfloat) 0.037685, (GLfloat) 0.136122, + (GLfloat) - 0.086532, (GLfloat) - 0.081295, (GLfloat) 0.009434, + (GLfloat) 0.189439, (GLfloat) 0.290592, (GLfloat) - 0.048317, + (GLfloat) 0.139152, (GLfloat) 0.224931, (GLfloat) 0.355509, + (GLfloat) 0.017162, (GLfloat) - 0.016825, (GLfloat) 0.094198, + (GLfloat) - 0.237595, (GLfloat) 0.205475, (GLfloat) - 0.041412, + (GLfloat) 0.050511, (GLfloat) 0.094900, (GLfloat) 0.252891, + (GLfloat) - 0.012538, (GLfloat) - 0.014082, (GLfloat) 0.064629, + (GLfloat) - 0.059810, (GLfloat) 0.020665, (GLfloat) - 0.260979, + (GLfloat) 0.073490, (GLfloat) - 0.242270, (GLfloat) 0.085847, + (GLfloat) 0.049499, (GLfloat) - 0.045617, (GLfloat) - 0.015894, + (GLfloat) - 0.121040, (GLfloat) 0.004350, (GLfloat) 0.381603, + (GLfloat) - 0.062798, (GLfloat) 0.055006, (GLfloat) 0.077472, + (GLfloat) - 0.156846, (GLfloat) - 0.033342, (GLfloat) 0.035284, + (GLfloat) 0.105383, (GLfloat) 0.002776, (GLfloat) - 0.046394, + (GLfloat) 0.247612, (GLfloat) 0.310528, (GLfloat) 0.046188, + (GLfloat) - 0.144567, (GLfloat) - 0.197996, (GLfloat) 0.083309, + (GLfloat) - 0.317845, (GLfloat) - 0.014793, (GLfloat) - 0.041608, + (GLfloat) - 0.169858, (GLfloat) 0.102631, (GLfloat) 0.283962, + (GLfloat) - 0.168757, (GLfloat) 0.093105, (GLfloat) 0.050325, + (GLfloat) - 0.013639, (GLfloat) 0.285100, (GLfloat) 0.047089, + (GLfloat) 0.216644, (GLfloat) 0.102018, (GLfloat) 0.031983, + (GLfloat) 0.046988, (GLfloat) 0.081482, (GLfloat) 0.021865, + (GLfloat) 0.124995, (GLfloat) - 0.193086, (GLfloat) 0.127870, + (GLfloat) 0.009153, (GLfloat) 0.178713, (GLfloat) - 0.077949, + (GLfloat) - 0.235371, (GLfloat) - 0.046817, (GLfloat) - 0.125764, + (GLfloat) - 0.089381, (GLfloat) 0.289172, (GLfloat) - 0.129356, + (GLfloat) 0.312993, (GLfloat) 0.120426, (GLfloat) 0.296957, + (GLfloat) - 0.106431, (GLfloat) 0.117096, (GLfloat) 0.156971, + (GLfloat) 0.030001, (GLfloat) 0.244577, (GLfloat) 0.085119, + (GLfloat) 0.002958, (GLfloat) - 0.035469, (GLfloat) - 0.084615, + (GLfloat) - 0.052248, (GLfloat) - 0.004298, (GLfloat) - 0.129170, + (GLfloat) - 0.158458, (GLfloat) 0.059061, (GLfloat) - 0.041780, + (GLfloat) - 0.007117, (GLfloat) - 0.174211, (GLfloat) 0.098819, + (GLfloat) - 0.158387, (GLfloat) 0.060840, (GLfloat) - 0.064818, + (GLfloat) 0.117241, (GLfloat) - 0.050754, (GLfloat) - 0.027945, + (GLfloat) - 0.014301, (GLfloat) 0.146402, (GLfloat) - 0.118414, + (GLfloat) 0.186611, (GLfloat) - 0.162182, (GLfloat) - 0.150909, + (GLfloat) - 0.106992, (GLfloat) 0.286109, (GLfloat) - 0.055512, + (GLfloat) 0.109689, (GLfloat) - 0.346409, (GLfloat) 0.072611, + (GLfloat) - 0.009694, (GLfloat) - 0.038102, (GLfloat) 0.098565, + (GLfloat) - 0.034598, (GLfloat) 0.323300, (GLfloat) 0.020962, + (GLfloat) - 0.149219, (GLfloat) 0.040596, (GLfloat) - 0.114206, + (GLfloat) 0.164744, (GLfloat) 0.048081, (GLfloat) 0.105464, + (GLfloat) 0.036214, (GLfloat) 0.099523, (GLfloat) 0.038595, + (GLfloat) 0.056537, (GLfloat) 0.036271, (GLfloat) 0.003042, + (GLfloat) - 0.157110, (GLfloat) 0.001614, (GLfloat) - 0.133994, + (GLfloat) - 0.104357, (GLfloat) - 0.032004, (GLfloat) 0.262334, + (GLfloat) 0.041215, (GLfloat) - 0.010418, (GLfloat) - 0.037968, + (GLfloat) 0.223491, (GLfloat) - 0.387946, (GLfloat) 0.117291, + (GLfloat) - 0.344434, (GLfloat) 0.110318, (GLfloat) - 0.031448, + (GLfloat) 0.123562, (GLfloat) - 0.315729, (GLfloat) 0.164533, + (GLfloat) 0.008207, (GLfloat) 0.042004, (GLfloat) 0.050014, + (GLfloat) - 0.191339, (GLfloat) - 0.069291, (GLfloat) - 0.220065, + (GLfloat) 0.023845, (GLfloat) 0.009474, (GLfloat) 0.035598, + (GLfloat) - 0.173295, (GLfloat) - 0.036604, (GLfloat) - 0.193323, + (GLfloat) - 0.040347, (GLfloat) - 0.106063, (GLfloat) - 0.055559, + (GLfloat) - 0.071543, (GLfloat) 0.136487, (GLfloat) 0.105697, + (GLfloat) - 0.179027, (GLfloat) - 0.071852, (GLfloat) 0.117512, + (GLfloat) 0.064769, (GLfloat) - 0.345895, (GLfloat) 0.012833, + (GLfloat) 0.044800, (GLfloat) - 0.032357, (GLfloat) - 0.042161, + (GLfloat) 0.243586, (GLfloat) 0.392499, (GLfloat) - 0.180641, + (GLfloat) - 0.148924, (GLfloat) - 0.181446, (GLfloat) 0.146644, + (GLfloat) - 0.042773, (GLfloat) 0.045843, (GLfloat) - 0.176893, + (GLfloat) 0.025938, (GLfloat) 0.058109, (GLfloat) 0.242063, + (GLfloat) - 0.028489, (GLfloat) - 0.024828, (GLfloat) 0.161289, + (GLfloat) 0.073899, (GLfloat) - 0.081205, (GLfloat) - 0.023751, + (GLfloat) 0.026149, (GLfloat) 0.051399, (GLfloat) - 0.072348, + (GLfloat) 0.024308, (GLfloat) - 0.041819, (GLfloat) - 0.030578, + (GLfloat) - 0.077778, (GLfloat) 0.010272, (GLfloat) 0.066967, + (GLfloat) - 0.139184, (GLfloat) - 0.018983, (GLfloat) 0.035150, + (GLfloat) - 0.061359, (GLfloat) - 0.152358, (GLfloat) - 0.072849, + (GLfloat) 0.043101, (GLfloat) 0.028278, (GLfloat) 0.077387, + (GLfloat) 0.065599, (GLfloat) - 0.049676, (GLfloat) 0.043708, + (GLfloat) - 0.255767, (GLfloat) 0.023510, (GLfloat) - 0.076982, + (GLfloat) 0.020468, (GLfloat) - 0.040630, (GLfloat) 0.208424, + (GLfloat) 0.044922, (GLfloat) 0.025184, (GLfloat) 0.004764, + (GLfloat) 0.107432, (GLfloat) - 0.009356, (GLfloat) 0.239863, + (GLfloat) - 0.005475, (GLfloat) 0.158400, (GLfloat) 0.089743, + (GLfloat) 0.018352, (GLfloat) 0.134559, (GLfloat) 0.221650, + (GLfloat) 0.094423, (GLfloat) 0.129390, (GLfloat) - 0.031274, + (GLfloat) 0.048541, (GLfloat) 0.100595, (GLfloat) - 0.155938, + (GLfloat) - 0.016298, (GLfloat) - 0.036518, (GLfloat) - 0.149178, + (GLfloat) - 0.329953, (GLfloat) - 0.327602, (GLfloat) - 0.150086, + (GLfloat) 0.148403, (GLfloat) - 0.363334, (GLfloat) 0.028237, + (GLfloat) - 0.305790, (GLfloat) - 0.009844, (GLfloat) - 0.075571, + (GLfloat) - 0.045131, (GLfloat) 0.152595, (GLfloat) 0.228720, + (GLfloat) 0.039725, (GLfloat) - 0.127469, (GLfloat) 0.066522, + (GLfloat) - 0.078576, (GLfloat) - 0.349749, (GLfloat) - 0.146881, + (GLfloat) 0.013160, (GLfloat) - 0.040312, (GLfloat) 0.129980, + (GLfloat) 0.221142, (GLfloat) - 0.106068, (GLfloat) 0.254967, + (GLfloat) 0.180912, (GLfloat) - 0.207357, (GLfloat) - 0.196999, + (GLfloat) 0.098219, (GLfloat) 0.085231, (GLfloat) 0.121963, +}; + +struct lwo LWO_s1_b = +{ + 500, /* number of points */ + s1_b_PNTS, 0L, 0L, 0L +}; + +#endif /* USE_GL */ + +/* End of s1_b.c */ diff --git a/hacks/glx/sproingies.c b/hacks/glx/sproingies.c new file mode 100644 index 00000000..e48c639a --- /dev/null +++ b/hacks/glx/sproingies.c @@ -0,0 +1,820 @@ +/* -*- Mode: C; tab-width: 4 -*- + * sproingies.c --- 3D sproingies + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)sproingies.c 4.04 97/07/26 xlockmore"; +#endif +/* Copyright 1996 by Ed Mackey, 12/7/96 freely distributable. + * 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. + */ + +#ifdef STANDALONE +# include "xlockmoreI.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +#include +#include +#include "buildlwo.h" + +#define MAXSPROING 100 +#define T_COUNT 40 +#define BOOM_FRAME 50 + +struct sPosColor { + int x, y, z, frame, life; + GLfloat r, g, b; +}; + +typedef struct { + int rotx, roty, dist, wireframe, flatshade, groundlevel, + maxsproingies, mono; + int sframe, target_rx, target_ry, target_dist, target_count; + GLuint sproingies[6], TopsSides, SproingieBoom; + struct sPosColor *positions; +} sp_instance; + +static sp_instance *si_list = NULL; +static int active_screens = 0; + +void SproingieSwap(void); + +extern struct lwo LWO_s1_1, LWO_s1_2, LWO_s1_3, LWO_s1_4; +extern struct lwo LWO_s1_5, LWO_s1_6, LWO_s1_b; + +static int +myrand(int range) +{ + return ((int) (((float) range) * LRAND() / (MAXRAND))); +} + +static GLuint +build_TopsSides(int wireframe) +{ + GLuint dl_num; + GLfloat mat_color[4] = + {0.0, 0.0, 0.0, 1.0}; + + dl_num = glGenLists(2); + if (!dl_num) + return (0); /* 0 means out of display lists. */ + + /* Surface: Tops */ + glNewList(dl_num, GL_COMPILE); + mat_color[0] = 0.392157; + mat_color[1] = 0.784314; + mat_color[2] = 0.941176; + if (wireframe) + glColor3fv(mat_color); + else { + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color); + } + glEndList(); + + /* Surface: Sides */ + glNewList(dl_num + 1, GL_COMPILE); + mat_color[0] = 0.156863; + mat_color[1] = 0.156863; + mat_color[2] = 0.392157; + if (wireframe) + glColor3fv(mat_color); + else { + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color); + } + glEndList(); + return (dl_num); +} + +static void +LayGround(int sx, int sy, int sz, int width, int height, sp_instance * si) +{ + int x, y, z, w, h; + GLenum begin_polygon; + + if (si->wireframe) + begin_polygon = GL_LINE_LOOP; + else + begin_polygon = GL_POLYGON; + + if (!si->wireframe) { + if (!si->mono) + glCallList(si->TopsSides); /* Render the tops */ + glNormal3f(0.0, 1.0, 0.0); + + for (h = 0; h < height; ++h) { + x = sx + h; + y = sy - (h << 1); + z = sz + h; + for (w = 0; w < width; ++w) { + glBegin(begin_polygon); + glVertex3i(x, y, z); + glVertex3i(x, y, z - 1); + glVertex3i(x + 1, y, z - 1); + glVertex3i(x + 1, y, z); + glEnd(); + glBegin(begin_polygon); + glVertex3i(x + 1, y - 1, z); + glVertex3i(x + 1, y - 1, z - 1); + glVertex3i(x + 2, y - 1, z - 1); + glVertex3i(x + 2, y - 1, z); + glEnd(); + ++x; + --z; + } + } + } + if (!si->mono) + glCallList(si->TopsSides + 1); /* Render the sides */ + if (!si->wireframe) + glNormal3f(0.0, 0.0, 1.0); + + for (h = 0; h < height; ++h) { + x = sx + h; + y = sy - (h << 1); + z = sz + h; + for (w = 0; w < width; ++w) { + glBegin(begin_polygon); + glVertex3i(x, y, z); + glVertex3i(x + 1, y, z); + glVertex3i(x + 1, y - 1, z); + glVertex3i(x, y - 1, z); + glEnd(); + glBegin(begin_polygon); + glVertex3i(x + 1, y - 1, z); + glVertex3i(x + 2, y - 1, z); + glVertex3i(x + 2, y - 2, z); + glVertex3i(x + 1, y - 2, z); +/*- + * PURIFY 4.0.1 reports an unitialized memory read on the next line when using + * MesaGL 2.2 and -mono. This has been fixed in MesaGL 2.3 and later. */ + glEnd(); + ++x; + --z; + } + } + + /* Render the other sides */ + if (!si->wireframe) + glNormal3f(1.0, 0.0, 0.0); + + for (h = 0; h < height; ++h) { + x = sx + h; + y = sy - (h << 1); + z = sz + h; + for (w = 0; w < width; ++w) { + glBegin(begin_polygon); + glVertex3i(x + 1, y, z); + glVertex3i(x + 1, y, z - 1); + glVertex3i(x + 1, y - 1, z - 1); + glVertex3i(x + 1, y - 1, z); + glEnd(); + glBegin(begin_polygon); + glVertex3i(x + 2, y - 1, z); + glVertex3i(x + 2, y - 1, z - 1); + glVertex3i(x + 2, y - 2, z - 1); + glVertex3i(x + 2, y - 2, z); + glEnd(); + ++x; + --z; + } + } + + if (si->wireframe) { + if (!si->mono) + glCallList(si->TopsSides); /* Render the tops */ + + for (h = 0; h < height; ++h) { + x = sx + h; + y = sy - (h << 1); + z = sz + h; + for (w = 0; w < width; ++w) { + glBegin(begin_polygon); + glVertex3i(x, y, z); + glVertex3i(x, y, z - 1); + glVertex3i(x + 1, y, z - 1); + glVertex3i(x + 1, y, z); + glEnd(); + glBegin(begin_polygon); + glVertex3i(x + 1, y - 1, z); + glVertex3i(x + 1, y - 1, z - 1); + glVertex3i(x + 2, y - 1, z - 1); + glVertex3i(x + 2, y - 1, z); + glEnd(); + ++x; + --z; + } + } + } +} + +#define RESET_SPROINGIE (-30 + myrand(28)) + +static void +AdvanceSproingie(int t, sp_instance * si) +{ + int g_higher, g_back, t2; + struct sPosColor *thisSproingie = &(si->positions[t]); + struct sPosColor *S2 = &(si->positions[0]); + + if (thisSproingie->life > 0) { + if ((++(thisSproingie->frame)) > 11) { + if (thisSproingie->frame >= BOOM_FRAME) { + if ((thisSproingie->r -= 0.08) < 0.0) + thisSproingie->r = 0.0; + if ((thisSproingie->g -= 0.08) < 0.0) + thisSproingie->g = 0.0; + if ((thisSproingie->b -= 0.08) < 0.0) + thisSproingie->b = 0.0; + if ((--(thisSproingie->life)) < 1) { + thisSproingie->life = RESET_SPROINGIE; + } + return; + } + thisSproingie->x += 1; + thisSproingie->y -= 2; + thisSproingie->z += 1; + thisSproingie->frame = 0; + + for (t2 = 0; t2 < si->maxsproingies; ++t2) { + if ((t2 != t) && (thisSproingie->x == S2->x) && + (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) && + (S2->life > 10) && (S2->frame < 6)) { +#if 0 + if (thisSproingie->life > S2->life) { + S2->life = 10; + } else { +#endif + if (thisSproingie->life > 10) { + thisSproingie->life = 10; + thisSproingie->frame = BOOM_FRAME; + if ((thisSproingie->r += 0.5) > 1.0) + thisSproingie->r = 1.0; + if ((thisSproingie->g += 0.5) > 1.0) + thisSproingie->g = 1.0; + if ((thisSproingie->b += 0.5) > 1.0) + thisSproingie->b = 1.0; + } +#if 0 + } +#endif + } + ++S2; + } + } + if (!((thisSproingie->life == 10) && + (thisSproingie->frame > 0) && + (thisSproingie->frame < BOOM_FRAME))) { + if ((--(thisSproingie->life)) < 1) { + thisSproingie->life = RESET_SPROINGIE; + } else if (thisSproingie->life < 9) { + thisSproingie->frame -= 2; + } + } /* else wait here for frame 0 to come about. */ + } else if (++(thisSproingie->life) >= 0) { + if (t > 1) { + g_higher = -3 + myrand(5); + g_back = -2 + myrand(5); + } else if (t == 1) { + g_higher = -2 + myrand(3); + g_back = -1 + myrand(3); + } else { + g_higher = -1; + g_back = 0; + } + + thisSproingie->x = (-g_higher - g_back); + thisSproingie->y = (g_higher << 1); + thisSproingie->z = (g_back - g_higher); + thisSproingie->life = 40 + myrand(200); + thisSproingie->frame = -10; + thisSproingie->r = (GLfloat) (40 + myrand(200)) / 255.0; + thisSproingie->g = (GLfloat) (40 + myrand(200)) / 255.0; + thisSproingie->b = (GLfloat) (40 + myrand(200)) / 255.0; + + for (t2 = 0; t2 < si->maxsproingies; ++t2) { + if ((t2 != t) && (thisSproingie->x == S2->x) && + (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) && + (S2->life > 10) && (S2->frame < 0)) { + /* If one is already being born, just wait. */ + thisSproingie->life = -1; + } + ++S2; + } + } +} + +static void +NextSproingie(int screen) +{ + sp_instance *si = &si_list[screen]; + int ddx, t; + struct sPosColor *thisSproingie = &(si->positions[0]); + + if (++si->sframe > 11) { + si->sframe = 0; + for (t = 0; t < si->maxsproingies; ++t) { + thisSproingie->x -= 1; + thisSproingie->y += 2; + thisSproingie->z -= 1; + ++thisSproingie; + } + } + for (t = 0; t < si->maxsproingies; ++t) { + AdvanceSproingie(t, si); + } + + if (si->target_count < 0) { /* track to current target */ + if (si->target_rx < si->rotx) + --si->rotx; + else if (si->target_rx > si->rotx) + ++si->rotx; + + if (si->target_ry < si->roty) + --si->roty; + else if (si->target_ry > si->roty) + ++si->roty; + + ddx = (si->target_dist - si->dist) / 8; + if (ddx) + si->dist += ddx; + else if (si->target_dist < si->dist) + --si->dist; + else if (si->target_dist > si->dist) + ++si->dist; + + if ((si->target_rx == si->rotx) && (si->target_ry == si->roty) && + (si->target_dist == si->dist)) { + si->target_count = T_COUNT; + if (si->target_dist <= 32) + si->target_count >>= 2; + } + } else if (--si->target_count < 0) { /* make up new target */ + si->target_rx = myrand(100) - 35; + si->target_ry = -myrand(90); + si->target_dist = 32 << myrand(2); /* could be 32, 64, or 128, (previously or 256) */ + + if (si->target_dist >= si->dist) /* no duplicate distances */ + si->target_dist <<= 1; + } + /* Otherwise just hang loose for a while here */ +} + +#ifdef __AUXFUNCS__ +void +PrintEm(void) +{ + int t, count = 0; + + for (t = 0; t < maxsproingies; ++t) { + if (positions[t].life > 0) + ++count; + } + (void) printf("RotX: %d, RotY: %d, Dist: %d. Targets: X %d, Y %d, D %d. Visible: %d\n", + rotx, roty, dist, target_rx, target_ry, target_dist, count); +} + +void +ResetEm(void) +{ + int t; + + for (t = 0; t < maxsproingies; ++t) { + positions[t].x = 0; + positions[t].y = 0; + positions[t].z = 0; + positions[t].life = -2; + positions[t].frame = 0; + } +} + +void +distAdd(void) +{ + if (dist < (1 << 16 << 4)) + dist <<= 1; +} + +void +distSubtract(void) +{ + if (dist > 1) + dist >>= 1; +} + +void +rotxAdd(void) +{ + rotx = (rotx + 5) % 360; +} + +void +rotxSubtract(void) +{ + rotx = (rotx - 5) % 360; +} + +void +rotyAdd(void) +{ + roty = (roty + 5) % 360; +} + +void +rotySubtract(void) +{ + roty = (roty - 5) % 360; +} + +void +rotxBAdd(void) +{ + rotx = (rotx + 45) % 360; +} + +void +rotxBSubtract(void) +{ + rotx = (rotx - 45) % 360; +} + +void +rotyBAdd(void) +{ + roty = (roty + 45) % 360; +} + +void +rotyBSubtract(void) +{ + roty = (roty - 45) % 360; +} + +#endif + +static void +RenderSproingie(int t, sp_instance * si) +{ + GLfloat scale, pointsize, mat_color[4] = + {0.0, 0.0, 0.0, 1.0}; + GLdouble clipplane[4] = + {0.0, 1.0, 0.0, 0.0}; + struct sPosColor *thisSproingie = &(si->positions[t]); + + if (thisSproingie->life < 1) + return; + + glPushMatrix(); + + if (!si->mono) { + mat_color[0] = thisSproingie->r; + mat_color[1] = thisSproingie->g; + mat_color[2] = thisSproingie->b; + if (si->wireframe) + glColor3fv(mat_color); + else { + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color); + } + } + if (thisSproingie->frame < 0) { + glEnable(GL_CLIP_PLANE0); + glTranslatef((GLfloat) (thisSproingie->x), + (GLfloat) (thisSproingie->y) + + ((GLfloat) (thisSproingie->frame) / 9.0), + (GLfloat) (thisSproingie->z)); + clipplane[3] = ((GLdouble) (thisSproingie->frame) / 9.0) + + (si->wireframe ? 0.0 : 0.1); + glClipPlane(GL_CLIP_PLANE0, clipplane); + glCallList(si->sproingies[0]); + glDisable(GL_CLIP_PLANE0); + } else if (thisSproingie->frame >= BOOM_FRAME) { + glTranslatef((GLfloat) (thisSproingie->x) + 0.5, + (GLfloat) (thisSproingie->y) + 0.5, + (GLfloat) (thisSproingie->z) - 0.5); + scale = (GLfloat) (1 << (thisSproingie->frame - BOOM_FRAME)); + glScalef(scale, scale, scale); + if (!si->wireframe) { + if (!si->mono) + glColor3fv(mat_color); + glDisable(GL_LIGHTING); + } + pointsize = (GLfloat) ((BOOM_FRAME + 8) - thisSproingie->frame) - + (si->dist / 64.0); + glPointSize((pointsize < 1.0) ? 1.0 : pointsize); +/*- + * PURIFY 4.0.1 reports an unitialized memory read on the next line when using + * MesaGL 2.2. This has been tracked to MesaGL 2.2 src/points.c line 313. */ + glCallList(si->SproingieBoom); + glPointSize(1.0); + if (!si->wireframe) { + glEnable(GL_LIGHTING); + } + } else if (thisSproingie->frame > 5) { + glTranslatef((GLfloat) (thisSproingie->x + 1), + (GLfloat) (thisSproingie->y - 1), (GLfloat) (thisSproingie->z - 1)); + glRotatef((GLfloat) - 90.0, 0.0, 1.0, 0.0); + glCallList(si->sproingies[thisSproingie->frame - 6]); + } else { + glTranslatef((GLfloat) (thisSproingie->x), (GLfloat) (thisSproingie->y), + (GLfloat) (thisSproingie->z)); + glCallList(si->sproingies[thisSproingie->frame]); + } + + glPopMatrix(); + +} + +static void +ComputeGround(sp_instance * si) +{ + int g_higher, g_back, g_width, g_height; + + /* higher: x-1, y+2, z-1 */ + /* back: x-1, y, z+1 */ + + if (si->groundlevel == 0) { + g_back = 2; + g_width = 5; + } else if (si->groundlevel == 1) { + g_back = 4; + g_width = 8; + } else { + g_back = 8; + g_width = 16; + } + + if ((g_higher = si->dist >> 3) < 4) + g_higher = 4; + if (g_higher > 16) + g_higher = 16; + g_height = g_higher << 1; + + if (si->rotx < -10) + g_higher += (g_higher >> 2); + else if (si->rotx > 10) + g_higher -= (g_higher >> 2); + +#if 0 + if (si->dist > 128) { + ++g_higher; + ++g_back; + g_back <<= 1; + } else if (si->dist > 64) { + ++g_higher; + ++g_back; + } else if (si->dist > 32) { + /* nothing special */ + } else { + if (g_higher > 2) { + g_higher = g_back = 4; + } + } +#endif + + /* startx, starty, startz, width, height */ + LayGround((-g_higher - g_back), (g_higher << 1), (g_back - g_higher), + (g_width), (g_height), si); +} + +void +DisplaySproingies(int screen) +{ + sp_instance *si = &si_list[screen]; + int t; + GLfloat position[] = + {8.0, 5.0, -2.0, 0.1}; + + if (si->wireframe) + glClear(GL_COLOR_BUFFER_BIT); + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + glTranslatef(0.0, 0.0, -(GLfloat) (si->dist) / 16.0); /* viewing transform */ + glRotatef((GLfloat) si->rotx, 1.0, 0.0, 0.0); + glRotatef((GLfloat) si->roty, 0.0, 1.0, 0.0); + + if (!si->wireframe) + glLightfv(GL_LIGHT0, GL_POSITION, position); + +#if 0 /* Show light pos */ + glPushMatrix(); + glTranslatef(position[0], position[1], position[2]); + glColor3f(1.0, 1.0, 1.0); + if (!si->wireframe) { + glDisable(GL_LIGHTING); + } + glCallList(si->SproingieBoom); + if (!si->wireframe) { + glEnable(GL_LIGHTING); + } + glPopMatrix(); +#endif + + glTranslatef((GLfloat) si->sframe * (-1.0 / 12.0) - 0.75, + (GLfloat) si->sframe * (2.0 / 12.0) - 0.5, + (GLfloat) si->sframe * (-1.0 / 12.0) + 0.75); + + if (si->wireframe) + ComputeGround(si); + + for (t = 0; t < si->maxsproingies; ++t) { + RenderSproingie(t, si); + } + + if (!si->wireframe) + ComputeGround(si); + + glPopMatrix(); + glFlush(); + + SproingieSwap(); +} + +void +NextSproingieDisplay(int screen) +{ + NextSproingie(screen); + DisplaySproingies(screen); +} + +#if 0 +void +ReshapeSproingies(int w, int h) +{ + glViewport(0, 0, w, h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 0.1, 2000.0); /* was 200000.0 */ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +#endif + +void +CleanupSproingies(int screen) +{ + sp_instance *si = &si_list[screen]; + int t; + + if (si->SproingieBoom) { + for (t = 0; t < 6; ++t) + glDeleteLists(si->sproingies[t], 1); + + glDeleteLists(si->TopsSides, 2); + glDeleteLists(si->SproingieBoom, 1); + + --active_screens; + si->SproingieBoom = 0; + } + if (si->positions) { + (void) free((void *) (si->positions)); + si->positions = NULL; + } + if ((active_screens == 0) && si_list) { + (void) free((void *) (si_list)); + si_list = NULL; + } +} + +void +InitSproingies(int wfmode, int grnd, int mspr, int screen, int numscreens, + int mono) +{ + GLfloat ambient[] = + {0.2, 0.2, 0.2, 1.0}; + GLfloat position[] = + {10.0, 1.0, 1.0, 10.0}; + GLfloat mat_diffuse[] = + {0.6, 0.6, 0.6, 1.0}; + GLfloat mat_specular[] = + {0.8, 0.8, 0.8, 1.0}; + GLfloat mat_shininess[] = + {50.0}; + + sp_instance *si; + int t; + + if (si_list == NULL) { + if ((si_list = (sp_instance *) calloc(numscreens, + sizeof (sp_instance))) == NULL) + return; + } + si = &si_list[screen]; + + active_screens++; + CleanupSproingies(screen); + + if (mspr < 0) + mspr = 0; + if (mspr >= MAXSPROING) + mspr = MAXSPROING - 1; + + si->rotx = 0; + si->roty = -45; + si->dist = (16 << 2); + si->sframe = 0; + si->target_count = 0; + si->mono = mono; + + si->wireframe = si->flatshade = 0; + + if (wfmode == 2) + si->flatshade = 1; + else if (wfmode) + si->wireframe = 1; + + si->groundlevel = grnd; + si->maxsproingies = mspr; + + if (si->maxsproingies) { + si->positions = (struct sPosColor *) calloc(si->maxsproingies, + sizeof (struct sPosColor)); + + if (!(si->positions)) + si->maxsproingies = 0; + } + for (t = 0; t < si->maxsproingies; ++t) { + si->positions[t].x = 0; + si->positions[t].y = 0; + si->positions[t].z = 0; + si->positions[t].life = (-t * ((si->maxsproingies > 19) ? 1 : 4)) - 2; + si->positions[t].frame = 0; + } + +#if 0 /* Test boom */ + si->positions[0].x = 0; + si->positions[0].y = 0; + si->positions[0].z = 0; + si->positions[0].life = 10; + si->positions[0].frame = BOOM_FRAME; + si->positions[0].r = 0.656863; + si->positions[0].g = 1.0; + si->positions[0].b = 0.656863; +#endif + + if (!(si->TopsSides = build_TopsSides(si->wireframe))) + (void) fprintf(stderr, "build_TopsSides\n"); + + if (!(si->sproingies[0] = BuildLWO(si->wireframe, &LWO_s1_1))) + (void) fprintf(stderr, "BuildLWO - 1\n"); + if (!(si->sproingies[1] = BuildLWO(si->wireframe, &LWO_s1_2))) + (void) fprintf(stderr, "BuildLWO - 2\n"); + if (!(si->sproingies[2] = BuildLWO(si->wireframe, &LWO_s1_3))) + (void) fprintf(stderr, "BuildLWO - 3\n"); + if (!(si->sproingies[3] = BuildLWO(si->wireframe, &LWO_s1_4))) + (void) fprintf(stderr, "BuildLWO - 4\n"); + if (!(si->sproingies[4] = BuildLWO(si->wireframe, &LWO_s1_5))) + (void) fprintf(stderr, "BuildLWO - 5\n"); + if (!(si->sproingies[5] = BuildLWO(si->wireframe, &LWO_s1_6))) + (void) fprintf(stderr, "BuildLWO - 6\n"); + + if (!(si->SproingieBoom = BuildLWO(si->wireframe, &LWO_s1_b))) + (void) fprintf(stderr, "BuildLWO - b\n"); + + if (si->wireframe) { + glShadeModel(GL_FLAT); + glDisable(GL_LIGHTING); + } else { + if (si->flatshade) { + glShadeModel(GL_FLAT); + position[0] = 1.0; + position[3] = 0.0; + } + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glDepthFunc(GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_POSITION, position); + + glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); + + /* glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); */ + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + glFrontFace(GL_CW); + /* glEnable(GL_NORMALIZE); */ + } +} + +#endif + +/* End of sproingies.c */ diff --git a/hacks/glx/sproingiewrap.c b/hacks/glx/sproingiewrap.c new file mode 100644 index 00000000..6fb283e5 --- /dev/null +++ b/hacks/glx/sproingiewrap.c @@ -0,0 +1,227 @@ +/* -*- Mode: C; tab-width: 4 -*- + * sproingies.c --- 3D sproingies + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)sproingiewrap.c 4.04 97/07/28 xlockmore"; +#endif +/* + * sproingiewrap.c - Copyright 1996 Sproingie Technologies Incorporated. + * Source and binary freely distributable under the + * terms in xlock.c + * + * 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. + * + *************************************************************************** + * Programming: Ed Mackey, http://www.early.com/~emackey/ + * Sproingie 3D objects modeled by: Al Mackey, al@iam.com + * (using MetaNURBS in NewTek's Lightwave 3D v5). + * + * Revision History: + * 26-Apr-97: Added glPointSize() calls around explosions, plus other fixes. + * 28-Mar-97: Added size support. + * 22-Mar-97: Updated to use glX interface instead of xmesa one. + * Also, support for multiscreens added. + * 20-Mar-97: Updated for xlockmore v4.02alpha7 and higher, using + * xlockmore's built-in Mesa/OpenGL support instead of + * my own. Submitted for inclusion in xlockmore. + * 09-Dec-96: Written. + * + * Ed Mackey + */ + +/*- + * The sproingies have six "real" frames, (s1_1 to s1_6) that show a + * sproingie jumping off a block, headed down and to the right. But + * the program thinks of sproingies as having twelve "virtual" frames, + * with the latter six being copies of the first, only lowered and + * rotated by 90 degrees (jumping to the left). So after going + * through 12 frames, a sproingie has gone down two rows but not + * moved horizontally. + * + * To have the sproingies randomly choose left/right jumps at each + * block, the program should go back to thinking of only 6 frames, + * and jumping down only one row when it is done. Then it can pick a + * direction for the next row. + * + * (Falling off the end might not be so bad either. :) ) + */ + +#ifdef STANDALONE +# define PROGCLASS "Sproingies" +# define HACK_INIT init_sproingies +# define HACK_DRAW draw_sproingies +# define sproingies_opts xlockmore_opts +# define DEFAULTS "*count: 5 \n" \ + "*cycles: 0 \n" \ + "*delay: 100 \n" \ + "*size: 0 \n" \ + "*wireframe: False \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +ModeSpecOpt sproingies_opts = { + 0, NULL, 0, NULL, NULL }; + +#define MINSIZE 32 + +#include +#include + +void NextSproingie(int screen); +void NextSproingieDisplay(int screen); +void DisplaySproingies(int screen); +#if 0 +void ReshapeSproingies(int w, int h); +#endif +void CleanupSproingies(int screen); +void InitSproingies(int wfmode, int grnd, int mspr, int screen, int numscreens, int mono); + +typedef struct { + GLfloat view_rotx, view_roty, view_rotz; + GLint gear1, gear2, gear3; + GLfloat angle; + GLuint limit; + GLuint count; + GLXContext glx_context; + int mono; +} sproingiesstruct; + +static sproingiesstruct *sproingies = NULL; + +static Display *swap_display; +static Window swap_window; + +void +SproingieSwap(void) +{ + glFinish(); + glXSwapBuffers(swap_display, swap_window); +} + + +/* ARGSUSED */ +void +draw_sproingies(ModeInfo * mi) +{ + sproingiesstruct *sp = &sproingies[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glDrawBuffer(GL_BACK); + glXMakeCurrent(display, window, sp->glx_context); + + swap_display = display; + swap_window = window; + + NextSproingieDisplay(MI_SCREEN(mi)); /* It will swap. */ +} + +void +refresh_sproingies(ModeInfo * mi) +{ + /* No need to do anything here... The whole screen is updated + * every frame anyway. Otherwise this would be just like + * draw_sproingies, above, but replace NextSproingieDisplay(...) + * with DisplaySproingies(...). + */ +} + +void +release_sproingies(ModeInfo * mi) +{ + if (sproingies != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + sproingiesstruct *sp = &sproingies[screen]; + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), sp->glx_context); + CleanupSproingies(MI_SCREEN(mi)); + } + + /* Don't destroy the glXContext. init_GL does that. */ + + (void) free((void *) sproingies); + sproingies = NULL; + } +} + +void +init_sproingies(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + int screen = MI_SCREEN(mi); + + int cycles = MI_CYCLES(mi); + int batchcount = MI_BATCHCOUNT(mi); + int size = MI_SIZE(mi); + + sproingiesstruct *sp; + int wfmode = 0, grnd, mspr, w, h; + + if (sproingies == NULL) { + if ((sproingies = (sproingiesstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (sproingiesstruct))) == NULL) + return; + } + sp = &sproingies[screen]; + + sp->mono = (MI_WIN_IS_MONO(mi) ? 1 : 0); + + sp->glx_context = init_GL(mi); + + if ((cycles & 1) || MI_WIN_IS_WIREFRAME(mi) || sp->mono) + wfmode = 1; + grnd = (cycles >> 1); + if (grnd > 2) + grnd = 2; + + mspr = batchcount; + if (mspr > 100) + mspr = 100; + + /* wireframe, ground, maxsproingies */ + InitSproingies(wfmode, grnd, mspr, MI_SCREEN(mi), MI_NUM_SCREENS(mi), sp->mono); + + /* Viewport is specified size if size >= MINSIZE && size < screensize */ + if (size == 0) { + w = MI_WIN_WIDTH(mi); + h = MI_WIN_HEIGHT(mi); + } else if (size < MINSIZE) { + w = MINSIZE; + h = MINSIZE; + } else { + w = (size > MI_WIN_WIDTH(mi)) ? MI_WIN_WIDTH(mi) : size; + h = (size > MI_WIN_HEIGHT(mi)) ? MI_WIN_HEIGHT(mi) : size; + } + + glViewport((MI_WIN_WIDTH(mi) - w) / 2, (MI_WIN_HEIGHT(mi) - h) / 2, w, h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 0.1, 2000.0); /* was 200000.0 */ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + swap_display = display; + swap_window = window; + DisplaySproingies(MI_SCREEN(mi)); +} + +#endif + +/* End of sproingiewrap.c */ diff --git a/hacks/glx/superquadrics.c b/hacks/glx/superquadrics.c new file mode 100644 index 00000000..7e1d33e2 --- /dev/null +++ b/hacks/glx/superquadrics.c @@ -0,0 +1,757 @@ +/* -*- Mode: C; tab-width: 4 -*- + * superquadrics.c --- 3D mathematical shapes + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)superquadrics.c 4.04 97/07/28 xlockmore"; +#endif +/* 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. + * + * Superquadrics were invented by Dr. Alan Barr of Caltech University. + * They were first published in "Computer Graphics and Applications", + * volume 1, number 1, 1981, in the article "Superquadrics and Angle- + * Preserving Transformations." Dr. Barr based the Superquadrics on + * Piet Hein's "super ellipses." Super ellipses are like 2D ellipses, + * except that the formula includes an exponent, raising its X and Y + * values to a (fractional) power, and allowing them to gradually + * change from round to square edges. Superquadrics extend this + * idea into 3 dimensions, using two exponents to modify a + * quadric surface in a similar fashion. + * + * Revision History: + * 30-Mar-97: Turned into a module for xlockmore 4.02 alpha. The code + * is almost unrecognizable now from the first revision, except for + * a few remaining two-letter variable names. I still don't have + * the normal vectors working right (I wrote the buggy normal vector + * code myself, can you tell?) + * 07-Jan-97: A legend reborn; Superquadrics make an appearance as a + * real OpenGL program written in C. I can even render them with + * proper lighting and specular highlights. Gee, they look almost + * as good now as the original color plates of them that my uncle + * showed me as a child in 1981. I don't know what computer hardware + * he was using at the time, but it's taken a couple decades for the + * PC clone hardware to catch up to it. + * 05-Jan-97: After almost a decade, Superquadrics had almost faded away + * into the myths and folklore of all the things my brother and I played + * with on computers when we were kids with too much time on our hands. + * I had since gotten involved in Unix, OpenGL, and other things. + * A sudden flash of inspiration caused me to dig out the old Pascal + * source code, run it through p2c, and start ripping away the old + * wireframe rendering code, to be replaced by OpenGL. + * Late 1989 or early 1990: Around this time I did the Turbo Pascal + * port of the Superquadrics. Unfortunately, many of the original variable + * names remained the same from the C= 64 original. This was unfortunate + * because BASIC on the c64 only allowed 2-letter, global variable names. + * But the speed improvement over BASIC was very impressive at the time. + * Thanksgiving, 1987: Written. My uncle Al, who invented Superquadrics some + * years earlier, came to visit us. I was a high school kid at the time, + * with nothing more than a Commodore 64. Somehow we wrote this program, + * (he did the math obviously, I just coded it into BASIC for the c64). + * Yeah, 320x200 resolution, colorless white wireframe, and half an hour + * rendering time per superquadric. PLOT x,y. THOSE were the days. + * In the following years I would port Superquadrics to AppleBASIC, + * AmigaBASIC, and then Turbo Pascal for IBM clones. 5 minutes on a 286! + * Talk about fast rendering! But these days, when my Pentium 166 runs + * the same program, the superquadric will already be waiting on the + * screen before my monitor can change frequency from text to graphics + * mode. Can't time the number of minutes that way! Darn ;) + * + * Ed Mackey + */ + +/*- + * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock. + * otherwise caddr_t is not defined correctly + */ + +#include + +#ifdef STANDALONE +# define PROGCLASS "Superquadrics" +# define HACK_INIT init_superquadrics +# define HACK_DRAW draw_superquadrics +# define superquadrics_opts xlockmore_opts +# define DEFAULTS "*count: 25 \n" \ + "*cycles: 40 \n" \ + "*delay: 100 \n" \ + "*wireframe: False \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#ifdef USE_GL + +/*- + * Note for low-CPU-speed machines: If your frame rate is so low that + * attempts at animation appear futile, try using "-cycles 1", which puts + * Superquadrics into kind of a slide-show mode. It will still use up + * all of your CPU power, but it may look nicer. + */ + +#define DEF_SPINSPEED "5.0" + +static float spinspeed; + +static XrmOptionDescRec opts[] = +{ + {"-spinspeed", ".superquadrics.spinspeed", XrmoptionSepArg, (caddr_t) NULL} +}; +static argtype vars[] = +{ + {(caddr_t *) & spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float} +}; +static OptionStruct desc[] = +{ + {"-spinspeed num", "speed of rotation, in degrees per frame"} +}; + +ModeSpecOpt superquadrics_opts = +{1, opts, 1, vars, desc}; + +#include + +#define MaxRes 50 +#define MinRes 5 + +typedef double dimi[MaxRes + 1]; + +typedef struct { + double xExponent, yExponent; + GLfloat r[4], g[4], b[4]; + long Mode; + int rotx, rotz; +} state; + +typedef struct { + GLXContext glx_context; + int dist, wireframe, flatshade, shownorms, maxcount, maxwait; + int counter, viewcount, viewwait, mono; + GLfloat curmat[4][4], rotx, roty, rotz, spinspeed; + /* In dimi: the first letter stands for cosine/sine, the second + * stands for North, South, East, or West. I think. + */ + dimi cs, se, sw, sn, ss, ce, cw, cn, Prevxx, Prevyy, Prevzz, + Prevxn, Prevyn, Prevzn; + double xExponent, yExponent, Mode; + int resolution; + state now, later; +} superquadricsstruct; + +static superquadricsstruct *superquadrics = NULL; + +#define CLIP_NORMALS 10000.0 + +static void ReshapeSuperquadrics(int w, int h); + +static int +myrand(int range) +{ + return ((int) (((float) range) * LRAND() / (MAXRAND))); +} + +static float +myrandreal(void) +{ + return (LRAND() / (MAXRAND)); +} + +/* Some old, old, OLD code follows. Ahh this takes me back..... */ + +/* Output from p2c, the Pascal-to-C translator */ +/* From input file "squad.pas" */ + +static double +XtoY(double x, double y) +{ + double z, a; + + /* This is NOT your typical raise-X-to-the-Y-power function. Do not attempt + * to replace this with a standard exponent function. If you must, just + * replace the "a = exp(y * log(z));" line with something faster. + */ + + z = fabs(x); + if (z < 1e-20) { + a = 0.0; + return a; + } + a = exp(y * log(z)); + if (a > CLIP_NORMALS) + a = CLIP_NORMALS; + if (x < 0) + a = -a; + return a; +} + + +static double +Sine(double x, double e) +{ + /* This is just the sine wave raised to the exponent. BUT, you can't + * raise negative numbers to fractional exponents. So we have a special + * XtoY routune which handles it in a way useful to superquadrics. + */ + + return (XtoY(sin(x), e)); +} + + +static double +Cosine(double x, double e) +{ + return (XtoY(cos(x), e)); +} + + +static void +MakeUpStuff(int allstuff, superquadricsstruct * sp) +{ + static int pats[4][4] = + { + {0, 0, 0, 0}, + {0, 1, 0, 1}, + {0, 0, 1, 1}, + {0, 1, 1, 0} + }; + + int dostuff; + int t, pat; + GLfloat r, g, b, r2, g2, b2; + + /* randomize it. */ + + if (sp->maxcount < 2) + allstuff = 1; + dostuff = allstuff * 15; + if (!dostuff) { + dostuff = myrand(3) + 1; + if (myrand(2) || (dostuff & 1)) + dostuff |= 4; + if (myrand(2)) + dostuff |= 8; + } + if (dostuff & 1) { + sp->later.xExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1; + sp->later.yExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1; + + /* Increase the 2.0 .. 2.5 range to 2.0 .. 3.0 */ + if (sp->later.xExponent > 2.0) + sp->later.xExponent = (sp->later.xExponent * 2.0) - 2.0; + if (sp->later.yExponent > 2.0) + sp->later.yExponent = (sp->later.yExponent * 2.0) - 2.0; + } + if (dostuff & 2) { + do { + sp->later.Mode = myrand(3L) + 1; + } while (!allstuff && (sp->later.Mode == sp->now.Mode)); + /* On init: make sure it can stay in mode 1 if it feels like it. */ + } + if (dostuff & 4) { + if (sp->mono) { + b = g = r = (GLfloat) (140 + myrand(100)) / 255.0; + b2 = g2 = r2 = ((r > 0.69) ? (1.0 - r) : r); + } else { + r = (GLfloat) (40 + myrand(200)) / 255.0; + g = (GLfloat) (40 + myrand(200)) / 255.0; + b = (GLfloat) (40 + myrand(200)) / 255.0; + + r2 = ((myrand(4) && ((r < 0.31) || (r > 0.69))) ? (1.0 - r) : r); + g2 = ((myrand(4) && ((g < 0.31) || (g > 0.69))) ? (1.0 - g) : g); + b2 = ((myrand(4) && ((b < 0.31) || (b > 0.69))) ? (1.0 - b) : b); + } + + pat = myrand(4); + for (t = 0; t < 4; ++t) { + sp->later.r[t] = pats[pat][t] ? r : r2; + sp->later.g[t] = pats[pat][t] ? g : g2; + sp->later.b[t] = pats[pat][t] ? b : b2; + } + } + if (dostuff & 8) { + sp->later.rotx = myrand(360) - 180; + sp->later.rotz = myrand(160) - 80; + } +} + +static void +inputs(superquadricsstruct * sp) +{ + int iv; + double u, v, mode3, cn3, inverter2, flatu, flatv; + + if (sp->Mode < 1.000001) { + mode3 = 1.0; + cn3 = 0.0; + inverter2 = 1.0; + } else if (sp->Mode < 2.000001) { + mode3 = 1.0; + cn3 = (sp->Mode - 1.0) * 1.5; + inverter2 = (sp->Mode - 1.0) * -2.0 + 1.0; + } else { + mode3 = (sp->Mode - 1.0); + cn3 = (sp->Mode - 2.0) / 2.0 + 1.5; + inverter2 = -1.0; + } + + if (sp->flatshade) { + flatu = M_PI / (sp->resolution - 1); + flatv = mode3 * M_PI / ((sp->resolution - 1) * 2); + } else { + flatu = flatv = 0.0; + } + + /* (void) printf("Calculating....\n"); */ + for (iv = 1; iv <= sp->resolution; iv++) { + + /* u ranges from PI down to -PI */ + u = (1 - iv) * 2 * M_PI / (sp->resolution - 1) + M_PI; + + /* v ranges from PI/2 down to -PI/2 */ + v = (1 - iv) * mode3 * M_PI / (sp->resolution - 1) + M_PI * (mode3 / 2.0); + + /* Use of xExponent */ + sp->se[iv] = Sine(u, sp->xExponent); + sp->ce[iv] = Cosine(u, sp->xExponent); + sp->sn[iv] = Sine(v, sp->yExponent); + sp->cn[iv] = Cosine(v, sp->yExponent) * inverter2 + cn3; + + /* Normal vector computations only */ + sp->sw[iv] = Sine(u + flatu, 2 - sp->xExponent); + sp->cw[iv] = Cosine(u + flatu, 2 - sp->xExponent); + sp->ss[iv] = Sine(v + flatv, 2 - sp->yExponent) * inverter2; + sp->cs[iv] = Cosine(v + flatv, 2 - sp->yExponent); + } /* next */ + + /* Now fix up the endpoints */ + sp->se[sp->resolution] = sp->se[1]; + sp->ce[sp->resolution] = sp->ce[1]; + + if (sp->Mode > 2.999999) { + sp->sn[sp->resolution] = sp->sn[1]; + sp->cn[sp->resolution] = sp->cn[1]; + } +} + + +static void +DoneScale(superquadricsstruct * sp) +{ + double xx, yy, zz, xp = 0, yp = 0, zp = 0, xn, yn, zn, xnp = 0, + ynp = 0, znp = 0; + int ih, iv; + + /* Hey don't knock my 2-letter variable names. Simon's BASIC rules, man! ;-> */ + /* Just kidding..... */ + int toggle = 0; + + for (ih = 1; ih <= sp->resolution; ih++) { + toggle ^= 2; + for (iv = 1; iv <= sp->resolution; iv++) { + toggle ^= 1; + if (sp->wireframe) + glColor3f(sp->curmat[toggle][0], sp->curmat[toggle][1], sp->curmat[toggle][2]); + else + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sp->curmat[toggle]); + + xx = sp->cn[iv] * sp->ce[ih]; + zz = sp->cn[iv] * sp->se[ih]; + yy = sp->sn[iv]; + + if (sp->wireframe) { + if ((ih > 1) || (iv > 1)) { + glBegin(GL_LINES); + if (ih > 1) { + glVertex3f(xx, yy, zz); + glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]); + } + if (iv > 1) { + glVertex3f(xx, yy, zz); + glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]); + } +/* PURIFY 4.0.1 reports an unitialized memory read on the next line when using + * MesaGL 2.2 and -mono. This has been fixed in MesaGL 2.3 and later. */ + glEnd(); + } + } else { + if ((sp->cs[iv] > 1e+10) || (sp->cs[iv] < -1e+10)) { + xn = sp->cs[iv]; + zn = sp->cs[iv]; + yn = sp->ss[iv]; + } else { + xn = sp->cs[iv] * sp->cw[ih]; + zn = sp->cs[iv] * sp->sw[ih]; + yn = sp->ss[iv]; + } + if ((ih > 1) && (iv > 1)) { + glNormal3f(xn, yn, zn); + glBegin(GL_POLYGON); + glVertex3f(xx, yy, zz); + if (!sp->flatshade) + glNormal3f(sp->Prevxn[iv], sp->Prevyn[iv], sp->Prevzn[iv]); + glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]); + if (!sp->flatshade) + glNormal3f(xnp, ynp, znp); + glVertex3f(xp, yp, zp); + if (!sp->flatshade) + glNormal3f(sp->Prevxn[iv - 1], sp->Prevyn[iv - 1], sp->Prevzn[iv - 1]); + glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]); + glEnd(); + } + if (sp->shownorms) { + if (!sp->flatshade) + glShadeModel(GL_FLAT); + glDisable(GL_LIGHTING); + glBegin(GL_LINES); + glVertex3f(xx, yy, zz); + glVertex3f(xx + xn, yy + yn, zz + zn); + glEnd(); + if (!sp->flatshade) + glShadeModel(GL_SMOOTH); + glEnable(GL_LIGHTING); + } + xnp = sp->Prevxn[iv]; + ynp = sp->Prevyn[iv]; + znp = sp->Prevzn[iv]; + sp->Prevxn[iv] = xn; + sp->Prevyn[iv] = yn; + sp->Prevzn[iv] = zn; + } + + xp = sp->Prevxx[iv]; + yp = sp->Prevyy[iv]; + zp = sp->Prevzz[iv]; + sp->Prevxx[iv] = xx; + sp->Prevyy[iv] = yy; + sp->Prevzz[iv] = zz; + + } /* next */ + } /* next */ +} + +/**** End of really old code ****/ + +static void +SetCull(int init, superquadricsstruct * sp) +{ + static int cullmode; + + if (init) { + cullmode = 0; + return; + } + if (sp->Mode < 1.0001) { + if (cullmode != 1) { + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + cullmode = 1; + } + } else if (sp->Mode > 2.9999) { + if (cullmode != 2) { + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); + cullmode = 2; + } + } else { + if (cullmode) { + glDisable(GL_CULL_FACE); + cullmode = 0; + } + } +} + +static void +SetCurrentShape(superquadricsstruct * sp) +{ + int t; + + sp->xExponent = sp->now.xExponent = sp->later.xExponent; + sp->yExponent = sp->now.yExponent = sp->later.yExponent; + + for (t = 0; t < 4; ++t) { + sp->curmat[t][0] = sp->now.r[t] = sp->later.r[t]; + sp->curmat[t][1] = sp->now.g[t] = sp->later.g[t]; + sp->curmat[t][2] = sp->now.b[t] = sp->later.b[t]; + } + + sp->Mode = (double) (sp->now.Mode = sp->later.Mode); + sp->rotx = sp->now.rotx = sp->later.rotx; + sp->rotz = sp->now.rotz = sp->later.rotz; + + sp->counter = -sp->maxwait; + + inputs(sp); +} + +static void +NextSuperquadric(superquadricsstruct * sp) +{ + double fnow, flater; + int t; + + sp->roty -= sp->spinspeed; + while (sp->roty >= 360.0) + sp->roty -= 360.0; + while (sp->roty < 0.0) + sp->roty += 360.0; + + --sp->viewcount; + + if (sp->counter > 0) { + if (--sp->counter == 0) { + SetCurrentShape(sp); + if (sp->counter == 0) { /* Happens if sp->maxwait == 0 */ + MakeUpStuff(0, sp); + sp->counter = sp->maxcount; + } + } else { + fnow = (double) sp->counter / (double) sp->maxcount; + flater = (double) (sp->maxcount - sp->counter) / (double) sp->maxcount; + sp->xExponent = sp->now.xExponent * fnow + sp->later.xExponent * flater; + sp->yExponent = sp->now.yExponent * fnow + sp->later.yExponent * flater; + + for (t = 0; t < 4; ++t) { + sp->curmat[t][0] = sp->now.r[t] * fnow + sp->later.r[t] * flater; + sp->curmat[t][1] = sp->now.g[t] * fnow + sp->later.g[t] * flater; + sp->curmat[t][2] = sp->now.b[t] * fnow + sp->later.b[t] * flater; + } + + sp->Mode = (double) sp->now.Mode * fnow + (double) sp->later.Mode * flater; + sp->rotx = (double) sp->now.rotx * fnow + (double) sp->later.rotx * flater; + sp->rotz = (double) sp->now.rotz * fnow + (double) sp->later.rotz * flater; + + inputs(sp); + } + } else { + if (++sp->counter >= 0) { + MakeUpStuff(0, sp); + sp->counter = sp->maxcount; + } + } +} + +static void +DisplaySuperquadrics(superquadricsstruct * sp) +{ + glDrawBuffer(GL_BACK); + if (sp->wireframe) + glClear(GL_COLOR_BUFFER_BIT); + else + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (sp->viewcount < 1) { + sp->viewcount = sp->viewwait; + ReshapeSuperquadrics(-1, -1); + } + glPushMatrix(); + glTranslatef(0.0, 0.0, -((GLfloat) (sp->dist) / 16.0) - (sp->Mode * 3.0 - 1.0)); /* viewing transform */ + glRotatef(sp->rotx, 1.0, 0.0, 0.0); /* pitch */ + glRotatef(sp->rotz, 0.0, 0.0, 1.0); /* bank */ + glRotatef(sp->roty, 0.0, 1.0, 0.0); /* "spin", like heading but comes after P & B */ + + SetCull(0, sp); + + DoneScale(sp); + + glPopMatrix(); + + /* Remember to flush & swap the buffers after calling this function! */ +} + +static void +NextSuperquadricDisplay(superquadricsstruct * sp) +{ + NextSuperquadric(sp); + DisplaySuperquadrics(sp); +} + +#define MINSIZE 200 +static void +ReshapeSuperquadrics(int w, int h) +{ + static int last_w = 0, last_h = 0; + int maxsize, cursize; + + if (w < 0) { + w = last_w; + h = last_h; + } else { + last_w = w; + last_h = h; + } + maxsize = (w < h) ? w : h; + if (maxsize <= MINSIZE) { + cursize = maxsize; + } else { + cursize = myrand(maxsize - MINSIZE) + MINSIZE; + } + if ((w > cursize) && (h > cursize)) { + glViewport(myrand(w - cursize), myrand(h - cursize), cursize, cursize); + w = h = cursize; + } else { + glViewport(0, 0, w, h); + } + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(30.0, (GLfloat) w / (GLfloat) h, 0.1, 200.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +static void +InitSuperquadrics(int wfmode, int snorm, int res, int count, float speed, superquadricsstruct * sp) +{ + GLfloat ambient[] = + {0.4, 0.4, 0.4, 1.0}; + GLfloat position[] = + {10.0, 1.0, 1.0, 10.0}; + GLfloat mat_diffuse[] = + {1.0, 0.5, 0.5, 1.0}; + GLfloat mat_specular[] = + {0.8, 0.8, 0.8, 1.0}; + GLfloat mat_shininess[] = + {50.0}; + + int t; + + for (t = 0; t < 4; ++t) + sp->curmat[t][3] = 1.0; + + sp->rotx = 35.0; + sp->roty = 0.0; + sp->rotz = 0.0; + sp->dist = (16 << 3); + sp->wireframe = sp->flatshade = sp->shownorms = 0; + sp->maxcount = count; + if (sp->maxcount < 1) + sp->maxcount = 1; + sp->maxwait = sp->maxcount >> 1; + SetCull(1, sp); + + sp->spinspeed = speed; + sp->viewcount = sp->viewwait = (sp->maxcount < 2) ? 1 : (sp->maxcount << 3); + + if (res < MinRes) + res = MinRes; + if (res > MaxRes) + res = MaxRes; + sp->resolution = res; + + if (wfmode == 2) + sp->flatshade = 1; + else if (wfmode) + sp->wireframe = 1; + + if (snorm) + sp->shownorms = 1; + + if (sp->wireframe) { + glShadeModel(GL_FLAT); + glDisable(GL_LIGHTING); + glColor3f(mat_diffuse[0], mat_diffuse[1], mat_diffuse[2]); + } else { + if (sp->flatshade) { + glShadeModel(GL_FLAT); + position[0] = 1.0; + position[3] = 0.0; + } + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glDepthFunc(GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_POSITION, position); + + /*glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse); */ + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); + + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); + + glFrontFace(GL_CW); + glEnable(GL_NORMALIZE); + } + + MakeUpStuff(1, sp); + SetCurrentShape(sp); + MakeUpStuff(1, sp); /* Initialize it */ + sp->counter = sp->maxcount; +} + +/* End of superquadrics main functions */ + +void +init_superquadrics(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + int screen = MI_SCREEN(mi); + + superquadricsstruct *sp; + + if (superquadrics == NULL) { + if ((superquadrics = (superquadricsstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (superquadricsstruct))) == NULL) + return; + } + sp = &superquadrics[screen]; + sp->mono = (MI_WIN_IS_MONO(mi) ? 1 : 0); + + sp->glx_context = init_GL(mi); + + InitSuperquadrics(MI_WIN_IS_WIREFRAME(mi) || sp->mono, 0, + MI_BATCHCOUNT(mi), MI_CYCLES(mi), spinspeed, sp); + ReshapeSuperquadrics(MI_WIN_WIDTH(mi), MI_WIN_HEIGHT(mi)); + + DisplaySuperquadrics(sp); + glFinish(); + glXSwapBuffers(display, window); +} + +void +refresh_superquadrics(ModeInfo * mi) +{ + /* Nothing happens here */ +} + +void +draw_superquadrics(ModeInfo * mi) +{ + superquadricsstruct *sp = &superquadrics[MI_SCREEN(mi)]; + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + glXMakeCurrent(display, window, sp->glx_context); + + NextSuperquadricDisplay(sp); + + glFinish(); + glXSwapBuffers(display, window); +} + +void +release_superquadrics(ModeInfo * mi) +{ + if (superquadrics != NULL) { + + /* Don't destroy the glXContext. init_GL does that. */ + + (void) free((void *) superquadrics); + superquadrics = NULL; + } +} + + +#endif + +/* End of superquadrics.c */ diff --git a/hacks/glx/xlock-gl.c b/hacks/glx/xlock-gl.c new file mode 100644 index 00000000..28ee7ca3 --- /dev/null +++ b/hacks/glx/xlock-gl.c @@ -0,0 +1,173 @@ +/* xlock-gc.c --- xscreensaver compatibility layer for xlockmore GL modules. + * xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This file, along with xlockmore.h, make it possible to compile an xlockmore + * GL module into a standalone program, and thus use it with xscreensaver. + * By Jamie Zawinski on 31-May-97. + */ + +#include +#include "screenhack.h" +#include "xlockmoreI.h" + +#include +#include + +/* Gag -- we use this to turn X errors from glXCreateContext() into + something that will actually make sense to the user. + */ +static XErrorHandler orig_ehandler = 0; +static Bool got_error = 0; + +static int +BadValue_ehandler (Display *dpy, XErrorEvent *error) +{ + if (error->error_code == BadValue) + { + got_error = True; + return 0; + } + else + return orig_ehandler (dpy, error); +} + + +GLXContext +init_GL(ModeInfo * mi) +{ + Display *dpy = mi->dpy; + Window window = mi->window; + Screen *screen = mi->xgwa.screen; + Visual *visual = mi->xgwa.visual; + GLXContext glx_context = 0; + XVisualInfo vi_in, *vi_out; + int out_count; + + vi_in.screen = screen_number (screen); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + + { + XSync (dpy, False); + orig_ehandler = XSetErrorHandler (BadValue_ehandler); + glx_context = glXCreateContext (dpy, vi_out, 0, GL_TRUE); + XSync (dpy, False); + XSetErrorHandler (orig_ehandler); + if (got_error) + glx_context = 0; + } + + XFree((char *) vi_out); + + if (!glx_context) + { + fprintf(stderr, "%s: couldn't create GL context for visual 0x%x.\n", + progname, (unsigned int) XVisualIDFromVisual (visual)); + exit(1); + } + + glXMakeCurrent (dpy, window, glx_context); + + { + GLboolean rgba_mode = 0; + glGetBooleanv(GL_RGBA_MODE, &rgba_mode); + if (!rgba_mode) + { + glIndexi (WhitePixelOfScreen (screen)); + glClearIndex (BlackPixelOfScreen (screen)); + } + } + + return (glx_context); +} + + +Visual * +get_gl_visual (Screen *screen, char *name, char *class) +{ + char *string = get_string_resource (name, class); + XVisualInfo *vi = 0; + Bool done_once = False; + + AGAIN: + if (!string || !*string || + !strcmp (string, "best") || + !strcmp (string, "color") || + !strcmp (string, "default")) + { + Display *dpy = DisplayOfScreen (screen); + int screen_num = screen_number (screen); + int attrs[20]; + int i = 0; + Bool dbuf_p = !get_boolean_resource ("noBuffer", "NoBuffer"); + + done_once = True; + + attrs[i++] = GLX_RGBA; + attrs[i++] = GLX_RED_SIZE; attrs[i++] = 1; + attrs[i++] = GLX_GREEN_SIZE; attrs[i++] = 1; + attrs[i++] = GLX_BLUE_SIZE; attrs[i++] = 1; + attrs[i++] = GLX_DEPTH_SIZE; attrs[i++] = 1; + if (dbuf_p) + attrs[i++] = GLX_DOUBLEBUFFER; + attrs[i++] = 0; + + vi = glXChooseVisual (dpy, screen_num, attrs); + if (vi) goto DONE; + + /* Try without double-buffering. */ + attrs[i - 1] = 0; + vi = glXChooseVisual (dpy, screen_num, attrs); + if (vi) goto DONE; + + /* Try mono. */ + i = 0; + if (dbuf_p) + attrs[i++] = GLX_DOUBLEBUFFER; + attrs[i++] = 0; + vi = glXChooseVisual (dpy, screen_num, attrs); + if (vi) goto DONE; + + /* Try mono without double-buffering. */ + attrs[0] = 0; + vi = glXChooseVisual (dpy, screen_num, attrs); + } + + DONE: + { + Visual *v; + if (vi) + { + v = vi->visual; + XFree (vi); + } + else + { + v = get_visual (screen, string, False, True); + if (!v) + { + if (done_once) + v = DefaultVisualOfScreen (screen); + else + { + free (string); + string = 0; + goto AGAIN; + } + } + } + + free (string); + return v; + } +} diff --git a/hacks/goop.c b/hacks/goop.c new file mode 100644 index 00000000..079ebc61 --- /dev/null +++ b/hacks/goop.c @@ -0,0 +1,534 @@ +/* xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include "screenhack.h" +#include "spline.h" +#include "alpha.h" + + +/* This is pretty compute-intensive, probably due to the large number of + polygon fills. I tried introducing a scaling factor to make the spline + code emit fewer line segments, but that made the edges very rough. + However, tuning *maxVelocity, *elasticity and *delay can result in much + smoother looking animation. I tuned these for a 1280x1024 Indy display, + but I don't know whether these values will be reasonable for a slower + machine... + + The more planes the better -- SGIs have a 12-bit pseudocolor display + (4096 colormap cells) which is mostly useless, except for this program, + where it means you can have 11 or 12 mutually-transparent objects instead + of only 7 or 8. But, if you are using the 12-bit visual, you should crank + down the velocity and elasticity, or server slowness will cause the + animation to look jerky (yes, it's sad but true, SGI's X server is + perceptibly slower when using plane masks on a 12-bit visual than on an + 8-bit visual.) Using -max-velocity 0.5 -elasticity 0.9 seems to work ok + on my Indy R5k with visual 0x27 and the bottom-of-the-line 24-bit graphics + board. + + It might look better if each blob had an outline, which was a *slightly* + darker color than the center, to give them a bit more definition -- but + that would mean using two planes per blob. (Or maybe allocating the + outline colors outside of the plane-space? Then the outlines wouldn't be + transparent, but maybe that wouldn't be so noticeable?) + + Oh, for an alpha channel... maybe I should rewrite this in GL. Then the + blobs could have thickness, and curved edges with specular reflections... + */ + + +#define SCALE 10000 /* fixed-point math, for sub-pixel motion */ +#define DEF_COUNT 12 /* When planes and count are 0, how many blobs. */ + + +#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n)))) +#define RANDSIGN() ((random() & 1) ? 1 : -1) + +struct blob { + long x, y; /* position of midpoint */ + long dx, dy; /* velocity and direction */ + double torque; /* rotational speed */ + double th; /* angle of rotation */ + long elasticity; /* how fast they deform */ + long max_velocity; /* speed limit */ + long min_r, max_r; /* radius range */ + int npoints; /* control points */ + long *r; /* radii */ + spline *spline; +}; + +struct layer { + int nblobs; + struct blob **blobs; + Pixmap pixmap; + unsigned long pixel; + GC gc; +}; + +enum goop_mode { + transparent, + opaque, + xor, + outline +}; + +struct goop { + enum goop_mode mode; + int width, height; + int nlayers; + struct layer **layers; + unsigned long background; + Pixmap pixmap; + GC pixmap_gc; + GC window_gc; +}; + + +static struct blob * +make_blob (int maxx, int maxy, int size) +{ + struct blob *b = (struct blob *) calloc(1, sizeof(*b)); + int i; + int mid; + + maxx *= SCALE; + maxy *= SCALE; + size *= SCALE; + + b->max_r = size/2; + b->min_r = size/10; + + if (b->min_r < (5*SCALE)) b->min_r = (5*SCALE); + mid = ((b->min_r + b->max_r) / 2); + + b->torque = get_float_resource ("torque", "Torque"); + b->elasticity = SCALE * get_float_resource ("elasticity", "Elasticity"); + b->max_velocity = SCALE * get_float_resource ("maxVelocity", "MaxVelocity"); + + b->x = RAND(maxx); + b->y = RAND(maxy); + + b->dx = RAND(b->max_velocity) * RANDSIGN(); + b->dy = RAND(b->max_velocity) * RANDSIGN(); + b->th = frand(M_PI+M_PI) * RANDSIGN(); + b->npoints = (random() % 5) + 5; + + b->spline = make_spline (b->npoints); + b->r = (long *) malloc (sizeof(*b->r) * b->npoints); + for (i = 0; i < b->npoints; i++) + b->r[i] = ((random() % mid) + (mid/2)) * RANDSIGN(); + return b; +} + +static void +throb_blob (struct blob *b) +{ + int i; + double frac = ((M_PI+M_PI) / b->npoints); + + for (i = 0; i < b->npoints; i++) + { + long r = b->r[i]; + long ra = (r > 0 ? r : -r); + double th = (b->th > 0 ? b->th : -b->th); + long x, y; + + /* place control points evenly around perimiter, shifted by theta */ + x = b->x + ra * cos (i * frac + th); + y = b->y + ra * sin (i * frac + th); + + b->spline->control_x[i] = x / SCALE; + b->spline->control_y[i] = y / SCALE; + + /* alter the radius by a random amount, in the direction in which + it had been going (the sign of the radius indicates direction.) */ + ra += (RAND(b->elasticity) * (r > 0 ? 1 : -1)); + r = ra * (r >= 0 ? 1 : -1); + + /* If we've reached the end (too long or too short) reverse direction. */ + if ((ra > b->max_r && r >= 0) || + (ra < b->min_r && r < 0)) + r = -r; + /* And reverse direction in mid-course once every 50 times. */ + else if (! (random() % 50)) + r = -r; + + b->r[i] = r; + } +} + +static void +move_blob (struct blob *b, int maxx, int maxy) +{ + maxx *= SCALE; + maxy *= SCALE; + + b->x += b->dx; + b->y += b->dy; + + /* If we've reached the edge of the box, reverse direction. */ + if ((b->x > maxx && b->dx >= 0) || + (b->x < 0 && b->dx < 0)) + { + b->dx = -b->dx; + } + if ((b->y > maxy && b->dy >= 0) || + (b->y < 0 && b->dy < 0)) + { + b->dy = -b->dy; + } + + /* Alter velocity randomly. */ + if (! (random() % 10)) + { + b->dx += (RAND(b->max_velocity/2) * RANDSIGN()); + b->dy += (RAND(b->max_velocity/2) * RANDSIGN()); + + /* Throttle velocity */ + if (b->dx > b->max_velocity || b->dx < -b->max_velocity) + b->dx /= 2; + if (b->dy > b->max_velocity || b->dy < -b->max_velocity) + b->dy /= 2; + } + + { + double th = b->th; + double d = (b->torque == 0 ? 0 : frand(b->torque)); + if (th < 0) + th = -(th + d); + else + th += d; + + if (th > (M_PI+M_PI)) + th -= (M_PI+M_PI); + else if (th < 0) + th += (M_PI+M_PI); + + b->th = (b->th > 0 ? th : -th); + } + + /* Alter direction of rotation randomly. */ + if (! (random() % 100)) + b->th *= -1; +} + +static void +draw_blob (Display *dpy, Drawable drawable, GC gc, struct blob *b, + Bool fill_p) +{ + compute_closed_spline (b->spline); +#ifdef DEBUG + { + int i; + for (i = 0; i < b->npoints; i++) + XDrawLine (dpy, drawable, gc, b->x/SCALE, b->y/SCALE, + b->spline->control_x[i], b->spline->control_y[i]); + } +#else + if (fill_p) + XFillPolygon (dpy, drawable, gc, b->spline->points, b->spline->n_points, + Nonconvex, CoordModeOrigin); + else +#endif + XDrawLines (dpy, drawable, gc, b->spline->points, b->spline->n_points, + CoordModeOrigin); +} + + +static struct layer * +make_layer (Display *dpy, Window window, int width, int height, int nblobs) +{ + int i; + struct layer *layer = (struct layer *) calloc(1, sizeof(*layer)); + int blob_min, blob_max; + XGCValues gcv; + layer->nblobs = nblobs; + + layer->blobs = (struct blob **) malloc(sizeof(*layer->blobs)*layer->nblobs); + + blob_max = (width < height ? width : height) / 2; + blob_min = (blob_max * 2) / 3; + for (i = 0; i < layer->nblobs; i++) + layer->blobs[i] = make_blob (width, height, + (random() % (blob_max-blob_min)) + blob_min); + + layer->pixmap = XCreatePixmap (dpy, window, width, height, 1); + layer->gc = XCreateGC (dpy, layer->pixmap, 0, &gcv); + + return layer; +} + +static void +draw_layer_plane (Display *dpy, struct layer *layer, int width, int height) +{ + int i; + XSetForeground (dpy, layer->gc, 1L); + XFillRectangle (dpy, layer->pixmap, layer->gc, 0, 0, width, height); + XSetForeground (dpy, layer->gc, 0L); + for (i = 0; i < layer->nblobs; i++) + { + throb_blob (layer->blobs[i]); + move_blob (layer->blobs[i], width, height); + draw_blob (dpy, layer->pixmap, layer->gc, layer->blobs[i], True); + } +} + + +static void +draw_layer_blobs (Display *dpy, Drawable drawable, GC gc, + struct layer *layer, int width, int height, + Bool fill_p) +{ + int i; + for (i = 0; i < layer->nblobs; i++) + { + throb_blob (layer->blobs[i]); + move_blob (layer->blobs[i], width, height); + draw_blob (dpy, drawable, gc, layer->blobs[i], fill_p); + } +} + + +static struct goop * +make_goop (Display *dpy, Window window, Colormap cmap, + int width, int height, long depth) +{ + int i; + struct goop *goop = (struct goop *) calloc(1, sizeof(*goop)); + XGCValues gcv; + int nblobs = get_integer_resource ("count", "Count"); + + unsigned long *plane_masks = 0; + unsigned long base_pixel = 0; + + goop->mode = (get_boolean_resource("xor", "Xor") + ? xor + : (get_boolean_resource("transparent", "Transparent") + ? transparent + : opaque)); + + goop->width = width; + goop->height = height; + + + goop->nlayers = get_integer_resource ("planes", "Planes"); + if (goop->nlayers <= 0) + goop->nlayers = (random() % (depth-2)) + 2; + goop->layers = (struct layer **) malloc(sizeof(*goop->layers)*goop->nlayers); + + + if (mono_p && goop->mode == transparent) + goop->mode = opaque; + + /* Try to allocate some color planes before committing to nlayers. + */ + if (goop->mode == transparent) + { + Bool additive_p = get_boolean_resource ("additive", "Additive"); + int nplanes = goop->nlayers; + allocate_alpha_colors (dpy, cmap, &nplanes, additive_p, &plane_masks, + &base_pixel); + if (nplanes > 1) + goop->nlayers = nplanes; + else + { + fprintf (stderr, + "%s: couldn't allocate any color planes; turning transparency off.\n", + progname); + goop->mode = opaque; + } + } + + { + int lblobs[32]; + int total = DEF_COUNT; + memset (lblobs, 0, sizeof(lblobs)); + if (nblobs <= 0) + while (total) + for (i = 0; total && i < goop->nlayers; i++) + lblobs[i]++, total--; + for (i = 0; i < goop->nlayers; i++) + goop->layers[i] = make_layer (dpy, window, width, height, + (nblobs > 0 ? nblobs : lblobs[i])); + } + + if (goop->mode == transparent && plane_masks) + { + for (i = 0; i < goop->nlayers; i++) + goop->layers[i]->pixel = base_pixel | plane_masks[i]; + goop->background = base_pixel; + } + if (plane_masks) + free (plane_masks); + + if (goop->mode != transparent) + { + XColor color; + color.flags = DoRed|DoGreen|DoBlue; + + goop->background = + get_pixel_resource ("background", "Background", dpy,cmap); + + for (i = 0; i < goop->nlayers; i++) + { + int H = random() % 360; /* range 0-360 */ + double S = ((double) (random()%70) + 30)/100.0; /* range 30%-100% */ + double V = ((double) (random()%34) + 66)/100.0; /* range 66%-100% */ + hsv_to_rgb (H, S, V, &color.red, &color.green, &color.blue); + if (XAllocColor (dpy, cmap, &color)) + goop->layers[i]->pixel = color.pixel; + else + goop->layers[i]->pixel = + WhitePixelOfScreen(DefaultScreenOfDisplay(dpy)); + } + } + + goop->pixmap = XCreatePixmap (dpy, window, width, height, + (goop->mode == xor ? 1L : depth)); + + gcv.background = goop->background; + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.line_width = get_integer_resource ("thickness","Thickness"); + goop->pixmap_gc = XCreateGC (dpy, goop->pixmap, GCLineWidth, &gcv); + goop->window_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + + return goop; +} + +static struct goop * +init_goop (Display *dpy, Window window) +{ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + + return make_goop (dpy, window, xgwa.colormap, + xgwa.width, xgwa.height, xgwa.depth); +} + +static void +run_goop (Display *dpy, Window window, struct goop *goop) +{ + int i; + + switch (goop->mode) + { + case transparent: + + for (i = 0; i < goop->nlayers; i++) + draw_layer_plane (dpy, goop->layers[i], goop->width, goop->height); + + XSetForeground (dpy, goop->pixmap_gc, goop->background); + XSetPlaneMask (dpy, goop->pixmap_gc, AllPlanes); + XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0, + goop->width, goop->height); + XSetForeground (dpy, goop->pixmap_gc, ~0L); + for (i = 0; i < goop->nlayers; i++) + { + XSetPlaneMask (dpy, goop->pixmap_gc, goop->layers[i]->pixel); +/* + XSetForeground (dpy, goop->pixmap_gc, ~0L); + XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0, + goop->width, goop->height); + XSetForeground (dpy, goop->pixmap_gc, 0L); + */ + draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc, + goop->layers[i], goop->width, goop->height, + True); + } + XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0, + goop->width, goop->height, 0, 0); + break; + + case xor: + XSetFunction (dpy, goop->pixmap_gc, GXcopy); + XSetForeground (dpy, goop->pixmap_gc, 0); + XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0, + goop->width, goop->height); + XSetFunction (dpy, goop->pixmap_gc, GXxor); + XSetForeground (dpy, goop->pixmap_gc, 1); + for (i = 0; i < goop->nlayers; i++) + draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc, + goop->layers[i], goop->width, goop->height, + (goop->mode != outline)); + XCopyPlane (dpy, goop->pixmap, window, goop->window_gc, 0, 0, + goop->width, goop->height, 0, 0, 1L); + break; + + case opaque: + case outline: + XSetForeground (dpy, goop->pixmap_gc, goop->background); + XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0, + goop->width, goop->height); + for (i = 0; i < goop->nlayers; i++) + { + XSetForeground (dpy, goop->pixmap_gc, goop->layers[i]->pixel); + draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc, + goop->layers[i], goop->width, goop->height, + (goop->mode != outline)); + } + XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0, + goop->width, goop->height, 0, 0); + break; + + default: + abort (); + break; + } +} + + +char *progclass = "Goop"; + +char *defaults [] = { + "Goop.background: black", /* to placate SGI */ + "Goop.foreground: white", + "*delay: 12000", + "*transparent: true", + "*additive: true", + "*xor: false", + "*count: 0", + "*planes: 0", + "*thickness: 5", + "*torque: 0.0075", + "*elasticity: 1.8", + "*maxVelocity: 1.2", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-planes", ".planes", XrmoptionSepArg, 0 }, + { "-transparent", ".transparent", XrmoptionNoArg, "True" }, + { "-non-transparent", ".transparent", XrmoptionNoArg, "False" }, + { "-additive", ".additive", XrmoptionNoArg, "True" }, + { "-subtractive", ".additive", XrmoptionNoArg, "false" }, + { "-xor", ".xor", XrmoptionNoArg, "true" }, + { "-no-xor", ".xor", XrmoptionNoArg, "false" }, + { "-thickness", ".thickness", XrmoptionSepArg, 0 }, + { "-torque", ".torque", XrmoptionSepArg, 0 }, + { "-elasticity", ".elasticity", XrmoptionSepArg, 0 }, + { "-max-velocity", ".maxVelocity", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + struct goop *g = init_goop (dpy, window); + int delay = get_integer_resource ("delay", "Integer"); + while (1) + { + run_goop (dpy, window, g); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/goop.1 b/hacks/goop.man similarity index 100% rename from local/man/man.1/goop.1 rename to hacks/goop.man diff --git a/hacks/grav.c b/hacks/grav.c new file mode 100644 index 00000000..528bb1b9 --- /dev/null +++ b/hacks/grav.c @@ -0,0 +1,322 @@ +/* -*- Mode: C; tab-width: 4 -*- + * grav --- simulation of a planetary system. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)grav.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1993 Greg Bowering + * + * 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. + * + * Revision history: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 11-Jul-94: color version + * 06-Oct-93: by Greg Bowering + */ + +#ifdef STANDALONE +# define PROGCLASS "Grav" +# define HACK_INIT init_grav +# define HACK_DRAW draw_grav +# define grav_opts xlockmore_opts +# define DEFAULTS "*count: 12 \n" \ + "*delay: 10000 \n" \ + "*ncolors: 64 \n" +# define BRIGHT_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +#define GRAV -0.02 /* Gravitational constant */ +#define DIST 16.0 +#define COLLIDE 0.0001 +#define ALMOST 15.99 +#define HALF 0.5 +/* #define INTRINSIC_RADIUS 200.0 */ +#define INTRINSIC_RADIUS ((float) (gp->height/5)) +#define STARRADIUS (unsigned int)(gp->height/(2*DIST)) +#define AVG_RADIUS (INTRINSIC_RADIUS/DIST) +#define RADIUS (unsigned int)(INTRINSIC_RADIUS/(POS(Z)+DIST)) + +#define XR HALF*ALMOST +#define YR HALF*ALMOST +#define ZR HALF*ALMOST + +#define VR 0.04 + +#define DIMENSIONS 3 +#define X 0 +#define Y 1 +#define Z 2 + +#define DAMP 0.999999 +#define MaxA 0.1 /* Maximum acceleration (w/ damping) */ + +#define POS(c) planet->P[c] +#define VEL(c) planet->V[c] +#define ACC(c) planet->A[c] + +#define Planet(x,y)\ + if ((x) >= 0 && (y) >= 0 && (x) <= gp->width && (y) <= gp->height) {\ + if (planet->ri < 2)\ + XDrawPoint(display, window, gc, (x), (y));\ + else\ + XFillArc(display, window, gc,\ + (x) - planet->ri / 2, (y) - planet->ri / 2, planet->ri, planet->ri,\ + 0, 23040);\ + } + +#define FLOATRAND(min,max) ((min)+(LRAND()/MAXRAND)*((max)-(min))) + +#define DEF_DECAY "False" /* Damping for decaying orbits */ +#define DEF_TRAIL "False" /* For trails (works good in mono only) */ + +static Bool decay; +static Bool trail; + +static XrmOptionDescRec opts[] = +{ + {"-decay", ".grav.decay", XrmoptionNoArg, (caddr_t) "on"}, + {"+decay", ".grav.decay", XrmoptionNoArg, (caddr_t) "off"}, + {"-trail", ".grav.trail", XrmoptionNoArg, (caddr_t) "on"}, + {"+trail", ".grav.trail", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & decay, "decay", "Decay", DEF_DECAY, t_Bool}, + {(caddr_t *) & trail, "trail", "Trail", DEF_TRAIL, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-/+decay", "turn on/off decaying orbits"}, + {"-/+trail", "turn on/off trail dots"} +}; + +ModeSpecOpt grav_opts = { 4, opts, 2, vars, desc }; + +typedef struct { + double P[DIMENSIONS], V[DIMENSIONS], A[DIMENSIONS]; + int xi, yi, ri; + unsigned long colors; +} planetstruct; + +typedef struct { + int width, height; + int x, y, sr, nplanets; + unsigned long starcolor; + planetstruct *planets; +} gravstruct; + +static gravstruct *gravs = NULL; + +static void +init_planet(ModeInfo * mi, planetstruct * planet) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + gravstruct *gp = &gravs[MI_SCREEN(mi)]; + + if (MI_NPIXELS(mi) > 2) + planet->colors = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))); + else + planet->colors = MI_WIN_WHITE_PIXEL(mi); + /* Initialize positions */ + POS(X) = FLOATRAND(-XR, XR); + POS(Y) = FLOATRAND(-YR, YR); + POS(Z) = FLOATRAND(-ZR, ZR); + + if (POS(Z) > -ALMOST) { + planet->xi = (int) + ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST))); + planet->yi = (int) + ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST))); + } else + planet->xi = planet->yi = -1; + planet->ri = RADIUS; + + /* Initialize velocities */ + VEL(X) = FLOATRAND(-VR, VR); + VEL(Y) = FLOATRAND(-VR, VR); + VEL(Z) = FLOATRAND(-VR, VR); + + /* Draw planets */ + Planet(planet->xi, planet->yi); +} + +static void +draw_planet(ModeInfo * mi, planetstruct * planet) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + gravstruct *gp = &gravs[MI_SCREEN(mi)]; + double D; /* A distance variable to work with */ + register unsigned char cmpt; + + D = POS(X) * POS(X) + POS(Y) * POS(Y) + POS(Z) * POS(Z); + if (D < COLLIDE) + D = COLLIDE; + D = sqrt(D); + D = D * D * D; + for (cmpt = X; cmpt < DIMENSIONS; cmpt++) { + ACC(cmpt) = POS(cmpt) * GRAV / D; + if (decay) { + if (ACC(cmpt) > MaxA) + ACC(cmpt) = MaxA; + else if (ACC(cmpt) < -MaxA) + ACC(cmpt) = -MaxA; + VEL(cmpt) = VEL(cmpt) + ACC(cmpt); + VEL(cmpt) *= DAMP; + } else { + /* update velocity */ + VEL(cmpt) = VEL(cmpt) + ACC(cmpt); + } + /* update position */ + POS(cmpt) = POS(cmpt) + VEL(cmpt); + } + + gp->x = planet->xi; + gp->y = planet->yi; + + if (POS(Z) > -ALMOST) { + planet->xi = (int) + ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST))); + planet->yi = (int) + ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST))); + } else + planet->xi = planet->yi = -1; + + /* Mask */ + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + Planet(gp->x, gp->y); + if (trail) { + XSetForeground(display, gc, planet->colors); + XDrawPoint(display, MI_WINDOW(mi), gc, gp->x, gp->y); + } + /* Move */ + gp->x = planet->xi; + gp->y = planet->yi; + planet->ri = RADIUS; + + /* Redraw */ + XSetForeground(display, gc, planet->colors); + Planet(gp->x, gp->y); +} + +void +init_grav(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + gravstruct *gp; + unsigned char ball; + + if (gravs == NULL) { + if ((gravs = (gravstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (gravstruct))) == NULL) + return; + } + gp = &gravs[MI_SCREEN(mi)]; + + gp->width = MI_WIN_WIDTH(mi); + gp->height = MI_WIN_HEIGHT(mi); + + gp->sr = STARRADIUS; + + gp->nplanets = MI_BATCHCOUNT(mi); + if (gp->nplanets < 0) { + if (gp->planets) { + (void) free((void *) gp->planets); + gp->planets = NULL; + } + gp->nplanets = NRAND(-gp->nplanets) + 1; /* Add 1 so its not too boring */ + } + if (!gp->planets) + gp->planets = (planetstruct *) calloc(gp->nplanets, sizeof (planetstruct)); + + XClearWindow(display, MI_WINDOW(mi)); + + if (MI_NPIXELS(mi) > 2) + gp->starcolor = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))); + else + gp->starcolor = MI_WIN_WHITE_PIXEL(mi); + for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) + init_planet(mi, &gp->planets[ball]); + + /* Draw centrepoint */ + XDrawArc(display, MI_WINDOW(mi), gc, + gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr, + 0, 23040); +} + +void +draw_grav(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + gravstruct *gp = &gravs[MI_SCREEN(mi)]; + register unsigned char ball; + + /* Mask centrepoint */ + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + XDrawArc(display, window, gc, + gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr, + 0, 23040); + + /* Resize centrepoint */ + switch (NRAND(4)) { + case 0: + if (gp->sr < (int) STARRADIUS) + gp->sr++; + break; + case 1: + if (gp->sr > 2) + gp->sr--; + } + + /* Draw centrepoint */ + XSetForeground(display, gc, gp->starcolor); + XDrawArc(display, window, gc, + gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr, + 0, 23040); + + for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) + draw_planet(mi, &gp->planets[ball]); +} + +void +release_grav(ModeInfo * mi) +{ + if (gravs != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + gravstruct *gp = &gravs[screen]; + + if (gp->planets) + (void) free((void *) gp->planets); + } + (void) free((void *) gravs); + gravs = NULL; + } +} + +void +refresh_grav(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/grav.1 b/hacks/grav.man similarity index 100% rename from local/man/man.1/grav.1 rename to hacks/grav.man diff --git a/hacks/greynetic.c b/hacks/greynetic.c new file mode 100644 index 00000000..c3f5fbaf --- /dev/null +++ b/hacks/greynetic.c @@ -0,0 +1,182 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include "screenhack.h" + +#define NBITS 12 + +#ifndef VMS +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#else /* VMS */ +# include "sys$common:[decw$include.bitmaps]stipple.xbm" +# include "sys$common:[decw$include.bitmaps]cross_weave.xbm" +# include "sys$common:[decw$include.bitmaps]dimple1.xbm" +# include "sys$common:[decw$include.bitmaps]dimple3.xbm" +# include "sys$common:[decw$include.bitmaps]flipped_gray.xbm" +# include "sys$common:[decw$include.bitmaps]gray1.xbm" +# include "sys$common:[decw$include.bitmaps]gray3.xbm" +# include "sys$common:[decw$include.bitmaps]hlines2.xbm" +# include "sys$common:[decw$include.bitmaps]light_gray.xbm" +# include "sys$common:[decw$include.bitmaps]root_weave.xbm" +# include "sys$common:[decw$include.bitmaps]vlines2.xbm" +# include "sys$common:[decw$include.bitmaps]vlines3.xbm" +#endif /* VMS */ + +static Pixmap pixmaps [NBITS]; +static GC gc; +static int delay; +static unsigned long fg, bg, pixels [512]; +static int npixels; + +static void +init_greynetic (Display *dpy, Window window) +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + npixels = 0; + gcv.foreground= fg= get_pixel_resource("foreground","Foreground", dpy, cmap); + gcv.background= bg= get_pixel_resource("background","Background", dpy, cmap); + gcv.fill_style= FillOpaqueStippled; + gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCFillStyle, &gcv); + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + i = 0; +#define BITS(n,w,h) \ + pixmaps [i++] = XCreatePixmapFromBitmapData (dpy, window, n, w, h, 1, 0, 1) + + BITS (stipple_bits, stipple_width, stipple_height); + BITS (cross_weave_bits, cross_weave_width, cross_weave_height); + BITS (dimple1_bits, dimple1_width, dimple1_height); + BITS (dimple3_bits, dimple3_width, dimple3_height); + BITS (flipped_gray_bits, flipped_gray_width, flipped_gray_height); + BITS (gray1_bits, gray1_width, gray1_height); + BITS (gray3_bits, gray3_width, gray3_height); + BITS (hlines2_bits, hlines2_width, hlines2_height); + BITS (light_gray_bits, light_gray_width, light_gray_height); + BITS (root_weave_bits, root_weave_width, root_weave_height); + BITS (vlines2_bits, vlines2_width, vlines2_height); + BITS (vlines3_bits, vlines3_width, vlines3_height); +} + +static void +greynetic (Display *dpy, Window window) +{ + static int tick = 500, xlim, ylim; + static Colormap cmap; + int x, y, w, h, i; + XGCValues gcv; + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + for (i = 0; i < 10; i++) /* minimize area, but don't try too hard */ + { + w = 50 + random () % (xlim - 50); + h = 50 + random () % (ylim - 50); + if (w + h < xlim && w + h < ylim) + break; + } + x = random () % (xlim - w); + y = random () % (ylim - h); + gcv.stipple = pixmaps [random () % NBITS]; + if (mono_p) + { + MONO: + if (random () & 1) + gcv.foreground = fg, gcv.background = bg; + else + gcv.foreground = bg, gcv.background = fg; + } + else + { + XColor fgc, bgc; + if (npixels == sizeof (pixels) / sizeof (unsigned long)) + goto REUSE; + fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue; + fgc.red = random (); + fgc.green = random (); + fgc.blue = random (); + bgc.red = random (); + bgc.green = random (); + bgc.blue = random (); + if (! XAllocColor (dpy, cmap, &fgc)) + goto REUSE; + pixels [npixels++] = fgc.pixel; + gcv.foreground = fgc.pixel; + if (! XAllocColor (dpy, cmap, &bgc)) + goto REUSE; + pixels [npixels++] = bgc.pixel; + gcv.background = bgc.pixel; + goto DONE; + REUSE: + if (npixels <= 0) + { + mono_p = 1; + goto MONO; + } + gcv.foreground = pixels [random () % npixels]; + gcv.background = pixels [random () % npixels]; + DONE: + ; + } + XChangeGC (dpy, gc, GCStipple|GCForeground|GCBackground, &gcv); + XFillRectangle (dpy, window, gc, x, y, w, h); + XSync (dpy, True); +} + + +char *progclass = "Greynetic"; + +char *defaults [] = { + "Greynetic.background: black", /* to placate SGI */ + "Greynetic.foreground: white", + "*delay: 0", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_greynetic (dpy, window); + while (1) + { + greynetic (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/greynetic.1 b/hacks/greynetic.man similarity index 100% rename from local/man/man.1/greynetic.1 rename to hacks/greynetic.man diff --git a/hacks/halo.c b/hacks/halo.c new file mode 100644 index 00000000..470a9e90 --- /dev/null +++ b/hacks/halo.c @@ -0,0 +1,450 @@ +/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* I wanted to lay down new circles with TV:ALU-ADD instead of TV:ALU-XOR, + but X doesn't support arithmetic combinations of pixmaps!! What losers. + I suppose I could crank out the 2's compliment math by hand, but that's + a real drag... + + This would probably look good with shapes other than circles as well. + + */ + +#include "screenhack.h" +#include + +struct circle { + int x, y, radius; + int increment; + int dx, dy; +}; + +static enum color_mode { + seuss_mode, ramp_mode, random_mode +} cmode; + + +static struct circle *circles; +static int count, global_count; +static Pixmap pixmap, buffer; +static int width, height, global_inc; +static int delay, delay2, cycle_delay; +static unsigned long fg_pixel, bg_pixel; +static GC draw_gc, erase_gc, copy_gc, merge_gc; +static Bool anim_p; +static Colormap cmap; + +static int ncolors; +static XColor *colors; +static Bool cycle_p; +static int fg_index; +static int bg_index; + + +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +static void +init_circles_1 (Display *dpy, Window window) +{ + int i; + count = (global_count ? global_count + : (3 + (random () % max (1, (min (width, height) / 50))) + + (random () % max (1, (min (width, height) / 50))))); + circles = (struct circle *) malloc (count * sizeof (struct circle)); + for (i = 0; i < count; i++) + { + circles [i].x = 10 + random () % (width - 20); + circles [i].y = 10 + random () % (height - 20); + if (global_inc) + circles [i].increment = global_inc; + else + { /* prefer smaller increments to larger ones */ + int j = 8; + int inc = ((random()%j) + (random()%j) + (random()%j)) - ((j*3)/2); + if (inc < 0) inc = -inc + 3; + circles [i].increment = inc + 3; + } + circles [i].radius = random () % circles [i].increment; + circles [i].dx = ((random () % 3) - 1) * (1 + random () % 5); + circles [i].dy = ((random () % 3) - 1) * (1 + random () % 5); + } +} + +static void +init_circles (Display *dpy, Window window) +{ + XGCValues gcv; + XWindowAttributes xgwa; + char *mode_str = 0; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + global_count = get_integer_resource ("count", "Integer"); + if (global_count < 0) global_count = 0; + global_inc = get_integer_resource ("increment", "Integer"); + if (global_inc < 0) global_inc = 0; + anim_p = get_boolean_resource ("animate", "Boolean"); + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer") * 1000000; + cycle_delay = get_integer_resource ("cycleDelay", "Integer"); + mode_str = get_string_resource ("colorMode", "ColorMode"); + if (! mode_str) cmode = random_mode; + else if (!strcmp (mode_str, "seuss")) cmode = seuss_mode; + else if (!strcmp (mode_str, "ramp")) cmode = ramp_mode; + else if (!strcmp (mode_str, "random")) cmode = random_mode; + else { + fprintf (stderr, + "%s: colorMode must be seuss, ramp, or random, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + if (mono_p) cmode = seuss_mode; + if (cmode == random_mode) + cmode = ((random()&3) == 1) ? ramp_mode : seuss_mode; + + if (cmode == ramp_mode) + anim_p = False; /* This combo doesn't work right... */ + + ncolors = get_integer_resource ("colors", "Colors"); + if (ncolors < 2) ncolors = 2; + if (ncolors <= 2) mono_p = True; + + if (mono_p) + colors = 0; + else + colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1)); + + cycle_p = mono_p ? False : get_boolean_resource ("cycle", "Cycle"); + + + if (mono_p) + ; + else if (random() % (cmode == seuss_mode ? 2 : 10)) + make_uniform_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, &cycle_p, True); + else + make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, &cycle_p, True); + + if (ncolors <= 2) mono_p = True; + if (mono_p) cycle_p = False; + if (mono_p) cmode = seuss_mode; + + if (mono_p) + { + fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap); + } + else + { + fg_index = 0; + bg_index = ncolors / 4; + if (fg_index == bg_index) bg_index++; + fg_pixel = colors[fg_index].pixel; + bg_pixel = colors[bg_index].pixel; + } + + width = max (50, xgwa.width); + height = max (50, xgwa.height); + +#ifdef DEBUG + width/=2; height/=2; +#endif + + pixmap = XCreatePixmap (dpy, window, width, height, 1); + if (cmode == seuss_mode) + buffer = XCreatePixmap (dpy, window, width, height, 1); + else + buffer = 0; + + gcv.foreground = 1; + gcv.background = 0; + draw_gc = XCreateGC (dpy, pixmap, GCForeground | GCBackground, &gcv); + gcv.foreground = 0; + erase_gc = XCreateGC (dpy, pixmap, GCForeground, &gcv); + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + copy_gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv); + + if (cmode == seuss_mode) + { + gcv.foreground = 1; + gcv.background = 0; + gcv.function = GXxor; + merge_gc = XCreateGC (dpy, pixmap, + GCForeground | GCBackground | GCFunction, &gcv); + } + else + { + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gcv.function = GXcopy; + merge_gc = XCreateGC (dpy, window, + GCForeground | GCBackground | GCFunction, &gcv); + } + + init_circles_1 (dpy, window); + XClearWindow (dpy, window); + if (buffer) XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height); +} + +static void +run_circles (Display *dpy, Window window) +{ + int i; + static int iterations = 0; + static int oiterations = 0; + static Bool first_time_p = True; + Bool done = False; + Bool inhibit_sleep = False; + XFillRectangle (dpy, pixmap, erase_gc, 0, 0, width, height); + for (i = 0; i < count; i++) + { + int radius = circles [i].radius; + int inc = circles [i].increment; + + if (! (iterations & 1)) /* never stop on an odd number of iterations */ + ; + else if (radius == 0) /* eschew inf */ + ; + else if (radius < 0) /* stop when the circles are points */ + done = True; + else /* stop when the circles fill the window */ + { + /* Probably there's a simpler way to ask the musical question, + "is this square completely enclosed by this circle," but I've + forgotten too much trig to know it... (That's not really the + right question anyway, but the right question is too hard.) */ + double x1 = ((double) (-circles [i].x)) / ((double) radius); + double y1 = ((double) (-circles [i].y)) / ((double) radius); + double x2 = ((double) (width - circles [i].x)) / ((double) radius); + double y2 = ((double) (height - circles [i].y)) / ((double) radius); + x1 *= x1; x2 *= x2; y1 *= y1; y2 *= y2; + if ((x1 + y1) < 1 && (x2 + y2) < 1 && (x1 + y2) < 1 && (x2 + y1) < 1) + done = True; + } + + if (radius > 0 && + (cmode == seuss_mode || /* drawing all circles, or */ + circles [0].increment < 0)) /* on the way back in */ + { + XFillArc (dpy, + (cmode == seuss_mode ? pixmap : window), + (cmode == seuss_mode ? draw_gc : merge_gc), + circles [i].x - radius, circles [i].y - radius, + radius * 2, radius * 2, 0, 360*64); + } + circles [i].radius += inc; + } + + if (cycle_p && cmode != seuss_mode) + { + struct timeval now; + static struct timeval then = { 0, }; + unsigned long diff; +#ifdef GETTIMEOFDAY_TWO_ARGS + struct timezone tzp; + gettimeofday(&now, &tzp); +#else + gettimeofday(&now); +#endif + diff = (((now.tv_sec - then.tv_sec) * 1000000) + + (now.tv_usec - then.tv_usec)); + if (diff > cycle_delay) + { + rotate_colors (dpy, cmap, colors, ncolors, 1); + then = now; + } + } + + if (anim_p && !first_time_p) + inhibit_sleep = !done; + + if (done) + { + if (anim_p) + { + first_time_p = False; + for (i = 0; i < count; i++) + { + circles [i].x += circles [i].dx; + circles [i].y += circles [i].dy; + circles [i].radius %= circles [i].increment; + if (circles [i].x < 0 || circles [i].x >= width) + { + circles [i].dx = -circles [i].dx; + circles [i].x += (2 * circles [i].dx); + } + if (circles [i].y < 0 || circles [i].y >= height) + { + circles [i].dy = -circles [i].dy; + circles [i].y += (2 * circles [i].dy); + } + } + } + else if (circles [0].increment < 0) + { + /* We've zoomed out and the screen is blank -- re-pick the + center points, and shift the colors. + */ + free (circles); + init_circles_1 (dpy, window); + if (! mono_p) + { + fg_index = (fg_index + 1) % ncolors; + bg_index = (fg_index + (ncolors/2)) % ncolors; + XSetForeground (dpy, copy_gc, colors [fg_index].pixel); + XSetBackground (dpy, copy_gc, colors [bg_index].pixel); + } + } +#if 1 + /* Sometimes go out from the inside instead of the outside */ + else if ((random () % 10) == 0) + { +# if 0 + if (! mono_p) + { + unsigned long swap = fg_index; + fg_index = bg_index; + bg_index = swap; + XSetForeground (dpy, copy_gc, colors [fg_index].pixel); + XSetBackground (dpy, copy_gc, colors [bg_index].pixel); + } +# endif + iterations = 0; /* ick */ + for (i = 0; i < count; i++) + circles [i].radius %= circles [i].increment; + } +#endif + else + { + oiterations = iterations; + for (i = 0; i < count; i++) + { + circles [i].increment = -circles [i].increment; + circles [i].radius += (2 * circles [i].increment); + } + } + } + + if (buffer) + XCopyPlane (dpy, pixmap, buffer, merge_gc, 0, 0, width, height, 0, 0, 1); + else if (cmode != seuss_mode) + { + + if (!mono_p) + { + fg_index++; + bg_index++; + if (fg_index >= ncolors) fg_index = 0; + if (bg_index >= ncolors) bg_index = 0; + XSetForeground (dpy, merge_gc, colors [fg_index].pixel); + } + + if (circles [0].increment >= 0) + inhibit_sleep = True; + else if (done && cmode == seuss_mode) + XFillRectangle (dpy, window, merge_gc, 0, 0, width, height); + } + else + XCopyPlane (dpy, pixmap, window, merge_gc, 0, 0, width, height, 0, 0, 1); + + /* buffer is only used in seuss-mode or anim-mode */ + if (buffer && (anim_p + ? (done || (first_time_p && (iterations & 1))) + : (iterations & 1))) + { + XCopyPlane (dpy, buffer, window, copy_gc, 0, 0, width, height, 0, 0, 1); + XSync (dpy, True); + if (anim_p && done) + XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height); + } + +#ifdef DEBUG + XCopyPlane (dpy, pixmap, window, copy_gc, 0,0,width,height,width,height, 1); + if (buffer) + XCopyPlane (dpy, buffer, window, copy_gc, 0,0,width,height,0,height, 1); + XSync (dpy, True); +#endif + + if (done) + iterations = 0; + else + iterations++; + + if (delay && !inhibit_sleep) + { + static Bool really_first_p = True; + int direction = 1; + int d = delay; + if (done && cycle_p && cmode != seuss_mode && !really_first_p) + { + d = delay2; + if (! (random() % 10)) + direction = -1; + } + if (done) + really_first_p = False; + + XSync(dpy, False); + + if (cycle_p && cycle_delay) + { + int i = 0; + while (i < d) + { + rotate_colors (dpy, cmap, colors, ncolors, direction); + usleep(cycle_delay); + i += cycle_delay; + } + } + else + usleep (d); + } +} + + +char *progclass = "Halo"; + +char *defaults [] = { + "Halo.background: black", /* to placate SGI */ + "Halo.foreground: white", + "*colorMode: random", + "*colors: 100", + "*cycle: true", + "*count: 0", + "*delay: 100000", + "*delay2: 20", + "*cycleDelay: 100000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { "-animate", ".animate", XrmoptionNoArg, "True" }, + { "-mode", ".colorMode", XrmoptionSepArg, 0 }, + { "-colors", ".colors", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_circles (dpy, window); + while (1) + run_circles (dpy, window); +} diff --git a/local/man/man.1/halo.1 b/hacks/halo.man similarity index 100% rename from local/man/man.1/halo.1 rename to hacks/halo.man diff --git a/hacks/helix.c b/hacks/helix.c new file mode 100644 index 00000000..758c5557 --- /dev/null +++ b/hacks/helix.c @@ -0,0 +1,302 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Algorithm from a Mac program by Chris Tate, written in 1988 or so. */ + +/* 10-May-97: merged ellipse code by Dan Stromberg + * as found in xlockmore 4.03a10. + * 1992: jwz created. + */ + +#include +#include "screenhack.h" + +static double sins [360]; +static double coss [360]; + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; + +static void +init_helix (Display *dpy, Window window) +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + + for (i = 0; i < 360; i++) + { + sins [i] = sin ((((double) i) / 180.0) * M_PI); + coss [i] = cos ((((double) i) / 180.0) * M_PI); + } +} + +static int +gcd (int a, int b) +{ + while (b > 0) + { + int tmp; + tmp = a % b; + a = b; + b = tmp; + } + return (a < 0 ? -a : a); +} + +static void +helix (Display *dpy, Window window, + int radius1, int radius2, int d_angle, + int factor1, int factor2, int factor3, int factor4) +{ + XWindowAttributes xgwa; + int width, height; + int xmid, ymid; + int x1, y1, x2, y2, angle, limit; + int i; + + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + + xmid = width / 2; + ymid = height / 2; + x1 = xmid; + y1 = ymid + radius2; + x2 = xmid; + y2 = ymid + radius1; + angle = 0; + limit = 1 + (360 / gcd (360, d_angle)); + + for (i = 0; i < limit; i++) + { + int tmp; +#define pmod(x,y) (tmp=((x) % (y)), (tmp >= 0 ? tmp : (tmp + (y)))) + + x1 = xmid + (((double) radius1) * sins [pmod ((angle * factor1), 360)]); + y1 = ymid + (((double) radius2) * coss [pmod ((angle * factor2), 360)]); + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + x2 = xmid + (((double) radius2) * sins [pmod ((angle * factor3), 360)]); + y2 = ymid + (((double) radius1) * coss [pmod ((angle * factor4), 360)]); + + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + angle += d_angle; + XFlush (dpy); + } +} + +static void +trig (Display *dpy, Window window, + int d_angle, int factor1, int factor2, + int offset, int d_angle_offset, int dir, int density) +{ + XWindowAttributes xgwa; + int width, height; + int xmid, ymid; + int x1, y1, x2, y2; + int tmp, angle; + Colormap cmap; + + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + width = xgwa.width; + height = xgwa.height; + + xmid = width / 2; + ymid = height / 2; + + while (d_angle >= -360 && d_angle <= 360) + { + angle = d_angle + d_angle_offset; + x1 = (sins [pmod(angle * factor1, 360)] * xmid) + xmid; + y1 = (coss [pmod(angle * factor1, 360)] * ymid) + ymid; + x2 = (sins [pmod(angle * factor2 + offset, 360)] * xmid) + xmid; + y2 = (coss [pmod(angle * factor2 + offset, 360)] * ymid) + ymid; + XDrawLine(dpy, window, draw_gc, x1, y1, x2, y2); + tmp = (int) 360 / (2 * density * factor1 * factor2); + if (tmp == 0) /* Do not want it getting stuck... */ + tmp = 1; /* Would not need if floating point */ + d_angle += dir * tmp; + } +} + +#define min(a,b) ((a)<(b)?(a):(b)) + +static void +random_helix (Display *dpy, Window window, XColor *color, Bool *got_color) +{ + Colormap cmap; + int width, height; + int radius, radius1, radius2, d_angle, factor1, factor2, factor3, factor4; + double divisor; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + radius = min (width, height) / 2; + + d_angle = 0; + factor1 = 2; + factor2 = 2; + factor3 = 2; + factor4 = 2; + + divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1)); + + if ((random () & 1) == 0) + { + radius1 = radius; + radius2 = radius / divisor; + } + else + { + radius2 = radius; + radius1 = radius / divisor; + } + + while (gcd (360, d_angle) >= 2) + d_angle = random () % 360; + +#define random_factor() \ + (((random() % 7) ? ((random() & 1) + 1) : 3) \ + * (((random() & 1) * 2) - 1)) + + while (gcd (gcd (gcd (factor1, factor2), factor3), factor4) != 1) + { + factor1 = random_factor (); + factor2 = random_factor (); + factor3 = random_factor (); + factor4 = random_factor (); + } + + if (mono_p) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &color->red, &color->green, &color->blue); + if ((*got_color = XAllocColor (dpy, cmap, color))) + XSetForeground (dpy, draw_gc, color->pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + } + helix (dpy, window, radius1, radius2, d_angle, + factor1, factor2, factor3, factor4); +} + +static void +random_trig (Display *dpy, Window window, XColor *color, Bool *got_color) +{ + Colormap cmap; + int width, height; + int radius, d_angle, factor1, factor2; + int offset, d_angle_offset, dir, density; + + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + radius = min (width, height) / 2; + + d_angle = 0; + factor1 = (random() % 8) + 1; + do { + factor2 = (random() % 8) + 1; + } while (factor1 == factor2); + + dir = (random() & 1) ? 1 : -1; + d_angle_offset = random() % 360; + offset = ((random() % ((360 / 4) - 1)) + 1) / 4; + density = 1 << ((random() % 4) + 4); /* Higher density, higher angles */ + + if (mono_p) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &color->red, &color->green, &color->blue); + if ((*got_color = XAllocColor (dpy, cmap, color))) + XSetForeground (dpy, draw_gc, color->pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + } + trig (dpy, window, d_angle, factor1, factor2, + offset, d_angle_offset, dir, density); +} + +static void +random_helix_or_trig (Display *dpy, Window window) +{ + int i; + Bool free_color = False; + XColor color; + int width, height; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + if (random() & 1) + random_helix(dpy, window, &color, &free_color); + else + random_trig(dpy, window, &color, &free_color); + + XSync (dpy, True); + sleep (5); + + for (i = 0; i < height; i++) + { + int y = (random () % height); + XDrawLine (dpy, window, erase_gc, 0, y, width, y); + XFlush (dpy); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dpy, window); + if (free_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0); + XSync (dpy, True); + sleep (1); +} + + +char *progclass = "Helix"; + +char *defaults [] = { + "Helix.background: black", /* to placate SGI */ + 0 +}; + +XrmOptionDescRec options [] = { { 0, } }; + +void +screenhack (Display *dpy, Window window) +{ + init_helix (dpy, window); + while (1) + random_helix_or_trig (dpy, window); +} diff --git a/local/man/man.1/helix.1 b/hacks/helix.man similarity index 100% rename from local/man/man.1/helix.1 rename to hacks/helix.man diff --git a/hacks/hopalong.c b/hacks/hopalong.c new file mode 100644 index 00000000..8b56155d --- /dev/null +++ b/hacks/hopalong.c @@ -0,0 +1,255 @@ +/* -*- Mode: C; tab-width: 4 -*- + * hop --- real plane fractals. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)hop.c 4.02 97/04/01 xlockmore"; +#endif + +/* Copyright (c) 1988-91 by Patrick J. Naughton. + * + * 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. + * + * Revision History: + * Changes of David Bagley + * 10-May-97: jwz@netscape.com: ported from xlockmore 4.03a10 to be a + * standalone program and thus usable with xscreensaver + * (I threw away my 1992 port and started over.) + * 27-Jul-95: added Peter de Jong's hop from Scientific American + * July 87 p. 111. Sometimes they are amazing but there are a + * few duds (I did not see a pattern in the parameters). + * 29-Mar-95: changed name from hopalong to hop + * 09-Dec-94: added sine hop + * + * (12-Aug-92: jwz@lucid.com: made xlock version run standalone.) + * + * Changes of Patrick J. Naughton + * 29-Oct-90: fix bad (int) cast. + * 29-Jul-90: support for multiple screens. + * 08-Jul-90: new timing and colors and new algorithm for fractals. + * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors. + * 08-Oct-89: Fixed long standing typo bug in RandomInitHop(); + * Fixed bug in memory allocation in init_hop(); + * Moved seconds() to an extern. + * Got rid of the % mod since .mod is slow on a sparc. + * 20-Sep-89: Lint. + * 31-Aug-88: Forked from xlock.c for modularity. + * 23-Mar-88: Coded HOPALONG routines from Scientific American Sept. 86 p. 14. + */ + +#ifdef STANDALONE +# define PROGCLASS "Hopalong" +# define HACK_INIT init_hop +# define HACK_DRAW draw_hop +# define HACK_FREE release_hop +# define hop_opts xlockmore_opts +# define DEFAULTS "*count: 1000 \n" \ + "*cycles: 2500 \n" \ + "*delay: 10000 \n" \ + "*ncolors: 200 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +static Bool jong; +static Bool sine; + +#define DEF_JONG "False" +#define DEF_SINE "False" + +static XrmOptionDescRec opts[] = +{ + {"-jong", ".hop.jong", XrmoptionNoArg, (caddr_t) "on"}, + {"+jong", ".hop.jong", XrmoptionNoArg, (caddr_t) "off"}, + {"-sine", ".hop.sine", XrmoptionNoArg, (caddr_t) "on"}, + {"+sine", ".hop.sine", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & jong, "jong", "Jong", DEF_JONG, t_Bool}, + {(caddr_t *) & sine, "sine", "Sine", DEF_SINE, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-/+jong", "turn on/off jong format"}, + {"-/+sine", "turn on/off sine format"} +}; + +ModeSpecOpt hop_opts = { 4, opts, 2, vars, desc }; + + +#define SQRT 0 +#define JONG 1 +#define SINE 2 +#ifdef OFFENDING +#define OPS 2 /* Sine might be too close to a Swastika for some... */ +#else +#define OPS 3 +#endif + +typedef struct { + int centerx; + int centery; /* center of the screen */ + double a; + double b; + double c; + double d; + double i; + double j; /* hopalong parameters */ + int inc; + int pix; + int op; + int count; + int bufsize; +} hopstruct; + +static hopstruct *hops = NULL; +static XPoint *pointBuffer = 0; /* pointer for XDrawPoints */ + +void +init_hop(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + hopstruct *hp; + double range; + + if (hops == NULL) { + if ((hops = (hopstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (hopstruct))) == NULL) + return; + } + hp = &hops[MI_SCREEN(mi)]; + + hp->centerx = MI_WIN_WIDTH(mi) / 2; + hp->centery = MI_WIN_HEIGHT(mi) / 2; + /* Make the other operations less common since they are less interesting */ + if (MI_WIN_IS_FULLRANDOM(mi)) { + hp->op = NRAND(OPS+2); /* jwz: make the others a bit more likely. */ + if (hp->op >= OPS) + hp->op = SQRT; + } else { + hp->op = SQRT; + if (jong) + hp->op = JONG; + else if (sine) + hp->op = SINE; + } + switch (hp->op) { + case SQRT: + range = sqrt((double) hp->centerx * hp->centerx + + (double) hp->centery * hp->centery) / (10.0 + NRAND(10)); + + hp->a = (LRAND() / MAXRAND) * range - range / 2.0; + hp->b = (LRAND() / MAXRAND) * range - range / 2.0; + hp->c = (LRAND() / MAXRAND) * range - range / 2.0; + if (LRAND() & 1) + hp->c = 0.0; + break; + case JONG: + hp->a = (LRAND() / MAXRAND) * 2.0 * M_PI - M_PI; + hp->b = (LRAND() / MAXRAND) * 2.0 * M_PI - M_PI; + hp->c = (LRAND() / MAXRAND) * 2.0 * M_PI - M_PI; + hp->d = (LRAND() / MAXRAND) * 2.0 * M_PI - M_PI; + break; + case SINE: + hp->a = M_PI + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.7; + break; + } + if (MI_NPIXELS(mi) > 2) + hp->pix = NRAND(MI_NPIXELS(mi)); + hp->i = hp->j = 0.0; + hp->inc = (int) ((LRAND() / MAXRAND) * 200) - 100; + hp->bufsize = MI_BATCHCOUNT(mi); + + if (!pointBuffer) + pointBuffer = (XPoint *) malloc(hp->bufsize * sizeof (XPoint)); + + XClearWindow(display, MI_WINDOW(mi)); + + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + hp->count = 0; +} + + +void +draw_hop(ModeInfo * mi) +{ + hopstruct *hp = &hops[MI_SCREEN(mi)]; + double oldj, oldi; + XPoint *xp = pointBuffer; + int k = hp->bufsize; + + hp->inc++; + if (MI_NPIXELS(mi) > 2) { + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, hp->pix)); + if (++hp->pix >= MI_NPIXELS(mi)) + hp->pix = 0; + } + while (k--) { + oldj = hp->j; + switch (hp->op) { + case SQRT: + oldi = hp->i + hp->inc; + hp->j = hp->a - hp->i; + hp->i = oldj + ((hp->i < 0) + ? sqrt(fabs(hp->b * oldi - hp->c)) + : -sqrt(fabs(hp->b * oldi - hp->c))); + xp->x = hp->centerx + (int) (hp->i + hp->j); + xp->y = hp->centery - (int) (hp->i - hp->j); + break; + case JONG: + if (hp->centerx > 0) + oldi = hp->i + 4 * hp->inc / hp->centerx; + else + oldi = hp->i; + hp->j = sin(hp->c * hp->i) - cos(hp->d * hp->j); + hp->i = sin(hp->a * oldj) - cos(hp->b * oldi); + xp->x = hp->centerx + (int) (hp->centerx * (hp->i + hp->j) / 4.0); + xp->y = hp->centery - (int) (hp->centery * (hp->i - hp->j) / 4.0); + break; + case SINE: + oldi = hp->i + hp->inc; + hp->j = hp->a - hp->i; + hp->i = oldj - sin(oldi); + xp->x = hp->centerx + (int) (hp->i + hp->j); + xp->y = hp->centery - (int) (hp->i - hp->j); + break; + } + xp++; + } + XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), + pointBuffer, hp->bufsize, CoordModeOrigin); + if (++hp->count > MI_CYCLES(mi)) + init_hop(mi); +} + +void +release_hop(ModeInfo * mi) +{ + if (hops != NULL) { + (void) free((void *) hops); + hops = NULL; + } + if (pointBuffer) { + (void) free((void *) pointBuffer); + pointBuffer = NULL; + } +} + +void +refresh_hop(ModeInfo * mi) +{ + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} diff --git a/local/man/man.1/hopalong.1 b/hacks/hopalong.man similarity index 100% rename from local/man/man.1/hopalong.1 rename to hacks/hopalong.man diff --git a/hacks/hypercube.c b/hacks/hypercube.c new file mode 100644 index 00000000..9c0def91 --- /dev/null +++ b/hacks/hypercube.c @@ -0,0 +1,328 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This code derived from TI Explorer Lisp code by Joe Keane, Fritz Mueller, + * and Jamie Zawinski. + */ + +#include +#include "screenhack.h" + +static Display *dpy; +static Window window; +static GC color0, color1, color2, color3, color4, color5, color6, color7; +static GC black; + +static int delay; + +static int observer_z; +static int x_offset, y_offset; +static int unit_pixels; + +struct point_state { + int old_x, old_y; + int new_x, new_y; + Bool same_p; +}; + +static void +move_line (struct point_state *state0, struct point_state *state1, GC gc) +{ + if (state0->same_p && state1->same_p) + return; + if (mono_p) + { + XDrawLine (dpy, window, black, + state0->old_x, state0->old_y, state1->old_x, state1->old_y); + XDrawLine (dpy, window, gc, + state0->new_x, state0->new_y, state1->new_x, state1->new_y); + } + else + { + XSegment segments [2]; + segments [0].x1 = state0->old_x; segments [0].y1 = state0->old_y; + segments [0].x2 = state1->old_x; segments [0].y2 = state1->old_y; + segments [1].x1 = state0->new_x; segments [1].y1 = state0->new_y; + segments [1].x2 = state1->new_x; segments [1].y2 = state1->new_y; + XDrawSegments (dpy, window, gc, segments, 2); + } +} + +static void +hyper (double xy, double xz, double yz, double xw, double yw, double zw) +{ + double cos_xy = cos (xy), sin_xy = sin (xy); + double cos_xz = cos (xz), sin_xz = sin (xz); + double cos_yz = cos (yz), sin_yz = sin (yz); + double cos_xw = cos (xw), sin_xw = sin (xw); + double cos_yw = cos (yw), sin_yw = sin (yw); + double cos_zw = cos (zw), sin_zw = sin (zw); + + double ax = 1.0, ay = 0.0, az = 0.0, aw = 0.0; + double bx = 0.0, by = 1.0, bz = 0.0, bw = 0.0; + double cx = 0.0, cy = 0.0, cz = 1.0, cw = 0.0; + double dx = 0.0, dy = 0.0, dz = 0.0, dw = 1.0; + + double _tmp0_, _tmp1_; + + struct point_state points [16]; + memset (points, 0, sizeof (points)); + +#define mmmm (&points[0]) +#define mmmp (&points[1]) +#define mmpm (&points[2]) +#define mmpp (&points[3]) +#define mpmm (&points[4]) +#define mpmp (&points[5]) +#define mppm (&points[6]) +#define mppp (&points[7]) +#define pmmm (&points[8]) +#define pmmp (&points[9]) +#define pmpm (&points[10]) +#define pmpp (&points[11]) +#define ppmm (&points[12]) +#define ppmp (&points[13]) +#define pppm (&points[14]) +#define pppp (&points[15]) + + while (1) + { + double temp_mult; + +#define compute(a,b,c,d,point_state) \ + temp_mult = (unit_pixels / (((a*az) + (b*bz) + (c*cz) + (d*dz) + \ + (a*aw) + (b*bw) + (c*cw) + (d*dw)) \ + - observer_z)); \ + point_state->old_x = point_state->new_x; \ + point_state->old_y = point_state->new_y; \ + point_state->new_x = ((((a*ax) + (b*bx) + (c*cx) + (d*dx)) * temp_mult) \ + + x_offset); \ + point_state->new_y = ((((a*ay) + (b*by) + (c*cy) + (d*dy)) * temp_mult) \ + + y_offset); \ + point_state->same_p = (point_state->old_x == point_state->new_x && \ + point_state->old_y == point_state->new_y); + + compute (-1, -1, -1, -1, mmmm); + compute (-1, -1, -1, 1, mmmp); + compute (-1, -1, 1, -1, mmpm); + compute (-1, -1, 1, 1, mmpp); + compute (-1, 1, -1, -1, mpmm); + compute (-1, 1, -1, 1, mpmp); + compute (-1, 1, 1, -1, mppm); + compute (-1, 1, 1, 1, mppp); + compute ( 1, -1, -1, -1, pmmm); + compute ( 1, -1, -1, 1, pmmp); + compute ( 1, -1, 1, -1, pmpm); + compute ( 1, -1, 1, 1, pmpp); + compute ( 1, 1, -1, -1, ppmm); + compute ( 1, 1, -1, 1, ppmp); + compute ( 1, 1, 1, -1, pppm); + compute ( 1, 1, 1, 1, pppp); + + move_line (mmmm, mmmp, color0); + move_line (mmmm, mmpm, color0); + move_line (mmpm, mmpp, color0); + move_line (mmmp, mmpp, color0); + + move_line (pmmm, pmmp, color1); + move_line (pmmm, pmpm, color1); + move_line (pmpm, pmpp, color1); + move_line (pmmp, pmpp, color1); + + move_line (mpmm, mpmp, color2); + move_line (mpmm, mppm, color2); + move_line (mppm, mppp, color2); + move_line (mpmp, mppp, color2); + + move_line (mmpp, mppp, color3); + move_line (mmpp, pmpp, color3); + move_line (pmpp, pppp, color3); + move_line (mppp, pppp, color3); + + move_line (mmmm, mpmm, color4); + move_line (mmmm, pmmm, color4); + move_line (mpmm, ppmm, color4); + move_line (pmmm, ppmm, color4); + + move_line (mmmp, mpmp, color5); + move_line (mmmp, pmmp, color5); + move_line (pmmp, ppmp, color5); + move_line (mpmp, ppmp, color5); + + move_line (mmpm, mppm, color6); + move_line (mmpm, pmpm, color6); + move_line (pmpm, pppm, color6); + move_line (mppm, pppm, color6); + + move_line (ppmm, ppmp, color7); + move_line (ppmm, pppm, color7); + move_line (pppm, pppp, color7); + move_line (ppmp, pppp, color7); + + /* If you get error messages about the following forms, and you think you're + using an ANSI C conforming compiler, then you're mistaken. Possibly you're + mixing an ANSI compiler with a non-ANSI preprocessor, or vice versa. + Regardless, your system is broken; it's not a bug in this program. + */ +#if defined(__STDC__) || defined(__ANSI_CPP__) +# define rotate(name,dim0,dim1,cos,sin) \ + _tmp0_ = ((name##dim0 * cos) + (name##dim1 * sin)); \ + _tmp1_ = ((name##dim1 * cos) - (name##dim0 * sin)); \ + name##dim0 = _tmp0_; \ + name##dim1 = _tmp1_; + +# define rotates(dim0,dim1) \ + if (sin_##dim0##dim1 != 0) { \ + rotate(a, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(b, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(c, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(d, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + } + +#else /* !__STDC__, courtesy of Andreas Luik */ +# define rotate(name,dim0,dim1,cos,sin) \ + _tmp0_ = ((name/**/dim0 * cos) + (name/**/dim1 * sin)); \ + _tmp1_ = ((name/**/dim1 * cos) - (name/**/dim0 * sin)); \ + name/**/dim0 = _tmp0_; \ + name/**/dim1 = _tmp1_; + +# define rotates(dim0,dim1) \ + if (sin_/**/dim0/**/dim1 != 0) { \ + rotate(a,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(b,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(c,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(d,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + } +#endif /* !__STDC__ */ + + rotates (x,y); + rotates (x,z); + rotates (y,z); + rotates (x,w); + rotates (y,w); + rotates (z,w); + + XSync (dpy, True); + if (delay) usleep (delay); + } +} + + +char *progclass = "Hypercube"; + +char *defaults [] = { + "Hypercube.background: black", /* to placate SGI */ + "Hypercube.foreground: white", + "*color0: red", + "*color1: orange", + "*color2: yellow", + "*color3: white", + "*color4: green", + "*color5: cyan", + "*color6: dodgerblue", + "*color7: magenta", + + "*xw: 0.000", + "*xy: 0.010", + "*xz: 0.005", + "*yw: 0.010", + "*yz: 0.000", + "*zw: 0.000", + + "*observer-z: 5", + "*delay: 100000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-color0", ".color0", XrmoptionSepArg, 0 }, + { "-color1", ".color1", XrmoptionSepArg, 0 }, + { "-color2", ".color2", XrmoptionSepArg, 0 }, + { "-color3", ".color3", XrmoptionSepArg, 0 }, + { "-color4", ".color4", XrmoptionSepArg, 0 }, + { "-color5", ".color5", XrmoptionSepArg, 0 }, + { "-color6", ".color6", XrmoptionSepArg, 0 }, + { "-color7", ".color7", XrmoptionSepArg, 0 }, + + { "-xw", ".xw", XrmoptionSepArg, 0 }, + { "-xy", ".xy", XrmoptionSepArg, 0 }, + { "-xz", ".xz", XrmoptionSepArg, 0 }, + { "-yw", ".yw", XrmoptionSepArg, 0 }, + { "-yz", ".yz", XrmoptionSepArg, 0 }, + { "-zw", ".zw", XrmoptionSepArg, 0 }, + + { "-observer-z", ".observer-z", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *d, Window w) +{ + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + double xy, xz, yz, xw, yw, zw; + unsigned long bg; + + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + + x_offset = xgwa.width / 2; + y_offset = xgwa.height / 2; + unit_pixels = xgwa.width < xgwa.height ? xgwa.width : xgwa.height; + + xy = get_float_resource ("xy", "Float"); + xz = get_float_resource ("xz", "Float"); + yz = get_float_resource ("yz", "Float"); + xw = get_float_resource ("xw", "Float"); + yw = get_float_resource ("yw", "Float"); + zw = get_float_resource ("zw", "Float"); + + observer_z = get_integer_resource ("observer-z", "Integer"); + + delay = get_integer_resource ("delay", "Integer"); + + bg = get_pixel_resource ("background", "Background", dpy, cmap); + + if (mono_p) + { + gcv.function = GXcopy; + gcv.foreground = bg; + black = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv); + gcv.foreground = get_pixel_resource ("foreground", "Foreground", + dpy, cmap); + color0 = color1 = color2 = color3 = color4 = color5 = color6 = color7 = + XCreateGC (dpy, window, GCForeground|GCFunction, &gcv); + } + else + { + black = 0; + gcv.function = GXxor; +#define make_gc(color,name) \ + gcv.foreground = bg ^ get_pixel_resource ((name), "Foreground", \ + dpy, cmap); \ + color = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv) + + make_gc (color0,"color0"); + make_gc (color1,"color1"); + make_gc (color2,"color2"); + make_gc (color3,"color3"); + make_gc (color4,"color4"); + make_gc (color5,"color5"); + make_gc (color6,"color6"); + make_gc (color7,"color7"); + } + + hyper (xy, xz, yz, xw, yw, zw); +} diff --git a/local/man/man.1/hypercube.1 b/hacks/hypercube.man similarity index 100% rename from local/man/man.1/hypercube.1 rename to hacks/hypercube.man diff --git a/hacks/ifs.c b/hacks/ifs.c new file mode 100644 index 00000000..7e55af51 --- /dev/null +++ b/hacks/ifs.c @@ -0,0 +1,478 @@ +/* -*- Mode: C; tab-width: 4 -*- + * ifs --- Modified iterated functions system. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)ifs.c 4.02 97/04/01 xlockmore"; +#endif + +/* Copyright (c) 1997 by Massimino Pascal (Pascal.Massimon@ens.fr) + * + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +#ifdef STANDALONE +# define PROGCLASS "IFS" +# define HACK_INIT init_ifs +# define HACK_DRAW draw_ifs +# define ifs_opts xlockmore_opts +# define DEFAULTS "*delay: 20000 \n" \ + "*ncolors: 100 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt ifs_opts = { + 0, NULL, 0, NULL, NULL }; + +/*****************************************************/ +/*****************************************************/ + +typedef float DBL; +typedef short int F_PT; + +/* typedef float F_PT; */ + +/*****************************************************/ + +#define FIX 12 +#define UNIT ( 1<c_x = Gauss_Rand(0.0, .8, 4.0); + Cur->c_y = Gauss_Rand(0.0, .8, 4.0); + Cur->r = Gauss_Rand(F->r_mean, F->dr_mean, 3.0); + Cur->r2 = Half_Gauss_Rand(0.0, F->dr2_mean, 2.0); + Cur->A = Gauss_Rand(0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur->A2 = Gauss_Rand(0.0, 360.0, 4.0) * (M_PI / 180.0); + Cur++; + } +} + +/***************************************************************/ + +void +init_ifs(ModeInfo * mi) +{ + int i; + FRACTAL *Fractal; + + if (Root == NULL) { + Root = (FRACTAL *) calloc( + MI_NUM_SCREENS(mi), sizeof (FRACTAL)); + if (Root == NULL) + return; + } + Fractal = &Root[MI_SCREEN(mi)]; + + if (Fractal->Max_Pt) { + free(Fractal->Buffer1); + free(Fractal->Buffer2); + } + i = (NRAND(4)) + 2; /* Number of centers */ + switch (i) { + case 3: + Fractal->Depth = MAX_DEPTH_3; + Fractal->r_mean = .6; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 4: + Fractal->Depth = MAX_DEPTH_4; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + case 5: + Fractal->Depth = MAX_DEPTH_5; + Fractal->r_mean = .5; + Fractal->dr_mean = .4; + Fractal->dr2_mean = .3; + break; + + default: + case 2: + Fractal->Depth = MAX_DEPTH_2; + Fractal->r_mean = .7; + Fractal->dr_mean = .3; + Fractal->dr2_mean = .4; + break; + } + /* (void) fprintf( stderr, "N=%d\n", i ); */ + Fractal->Nb_Simi = i; + Fractal->Max_Pt = Fractal->Nb_Simi - 1; + for (i = 0; i <= Fractal->Depth + 2; ++i) + Fractal->Max_Pt *= Fractal->Nb_Simi; + + Fractal->Buffer1 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint)); + if (Fractal->Buffer1 == NULL) + goto Abort; + Fractal->Buffer2 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint)); + if (Fractal->Buffer2 == NULL) + goto Abort; + + Fractal->Speed = 6; + Fractal->Width = MI_WIN_WIDTH(mi); + Fractal->Height = MI_WIN_HEIGHT(mi); + Fractal->Cur_Pt = 0; + Fractal->Count = 0; + Fractal->Lx = (Fractal->Width - 1) / 2; + Fractal->Ly = (Fractal->Height - 1) / 2; + Fractal->Col = NRAND(MI_NPIXELS(mi) - 1) + 1; + + Random_Simis(Fractal, Fractal->Components, 5 * MAX_SIMI); + + Fractal->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi), + Fractal->Width, Fractal->Height, 1); + if (Fractal->dbuf) + { + XGCValues gcv; + gcv.foreground = 0; + gcv.background = 0; + gcv.function = GXcopy; + Fractal->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Fractal->dbuf, + GCForeground|GCBackground|GCFunction, + &gcv); + XFillRectangle(MI_DISPLAY(mi), Fractal->dbuf, + Fractal->dbuf_gc, 0,0, Fractal->Width, Fractal->Height); + + XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy); + } + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + return; + + Abort: + if (Fractal->Buffer1 != NULL) + free(Fractal->Buffer1); + if (Fractal->Buffer2 != NULL) + free(Fractal->Buffer2); + Fractal->Buffer1 = NULL; + Fractal->Buffer2 = NULL; + Fractal->Max_Pt = 0; + return; +} + + +/***************************************************************/ + +#ifndef __GNUC__ +# define inline /* */ +#endif + +static inline void +Transform(SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y) +{ + F_PT xx, yy; + + xo = xo - Simi->Cx; + xo = (xo * Simi->R) / UNIT; + yo = yo - Simi->Cy; + yo = (yo * Simi->R) / UNIT; + + xx = xo - Simi->Cx; + xx = (xx * Simi->R2) / UNIT; + yy = -yo - Simi->Cy; + yy = (yy * Simi->R2) / UNIT; + + *x = ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) / UNIT) + Simi->Cx; + *y = ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) / UNIT) + Simi->Cy; +} + +/***************************************************************/ + +static void +Trace(F_PT xo, F_PT yo) +{ + F_PT x, y, i; + SIMI *Cur; + + Cur = Cur_F->Components; + for (i = Cur_F->Nb_Simi; i; --i, Cur++) { + Transform(Cur, xo, yo, &x, &y); + Buf->x = Lx + (x * Lx / (UNIT * 2)); + Buf->y = Ly - (y * Ly / (UNIT * 2)); + Buf++; + Cur_Pt++; + + if (D && ((x - xo) >> 4) && ((y - yo) >> 4)) { + D--; + Trace(x, y); + D++; + } + } +} + +static void +Draw_Fractal(FRACTAL * F) +{ + int i, j; + F_PT x, y, xo, yo; + SIMI *Cur, *Simi; + + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + Cur->Cx = DBL_To_F_PT(Cur->c_x); + Cur->Cy = DBL_To_F_PT(Cur->c_y); + + Cur->Ct = DBL_To_F_PT(cos(Cur->A)); + Cur->St = DBL_To_F_PT(sin(Cur->A)); + Cur->Ct2 = DBL_To_F_PT(cos(Cur->A2)); + Cur->St2 = DBL_To_F_PT(sin(Cur->A2)); + + Cur->R = DBL_To_F_PT(Cur->r); + Cur->R2 = DBL_To_F_PT(Cur->r2); + } + + + Cur_Pt = 0; + Cur_F = F; + Buf = F->Buffer2; + Lx = F->Lx; + Ly = F->Ly; + D = F->Depth; + for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) { + xo = Cur->Cx; + yo = Cur->Cy; + for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) { + if (Simi == Cur) + continue; + Transform(Simi, xo, yo, &x, &y); + Trace(x, y); + } + } + + /* Erase previous */ + + if (F->Cur_Pt) { + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(The_MI)); + if (F->dbuf) /* jwz */ + { + XSetForeground(display, F->dbuf_gc, 0); +/* XDrawPoints(display, F->dbuf, F->dbuf_gc, F->Buffer1, F->Cur_Pt, + CoordModeOrigin); */ + XFillRectangle(display, F->dbuf, F->dbuf_gc, 0, 0, + F->Width, F->Height); + } + else + XDrawPoints(display, window, gc, F->Buffer1, F->Cur_Pt, + CoordModeOrigin); + } + if (Max_Colors < 2) + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(The_MI)); + else + XSetForeground(display, gc, MI_PIXEL(The_MI, F->Col % Max_Colors)); + if (Cur_Pt) { + if (F->dbuf) + { + XSetForeground(display, F->dbuf_gc, 1); + XDrawPoints(display, F->dbuf, F->dbuf_gc, F->Buffer2, Cur_Pt, + CoordModeOrigin); + } + else + XDrawPoints(display, window, gc, F->Buffer2, Cur_Pt, CoordModeOrigin); + } + + if (F->dbuf) + XCopyPlane(display, F->dbuf, window, gc, 0,0,F->Width,F->Height,0,0, 1); + + F->Cur_Pt = Cur_Pt; + Buf = F->Buffer1; + F->Buffer1 = F->Buffer2; + F->Buffer2 = Buf; +} + + +void +draw_ifs(ModeInfo * mi) +{ + int i; + FRACTAL *F; + DBL u, uu, v, vv, u0, u1, u2, u3; + SIMI *S, *S1, *S2, *S3, *S4; + + The_MI = mi; + display = MI_DISPLAY(mi); + window = MI_WINDOW(mi); + gc = MI_GC(mi); + Max_Colors = MI_NPIXELS(mi); + + F = &Root[MI_SCREEN(mi)]; + + u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; + uu = u * u; + v = 1.0 - u; + vv = v * v; + u0 = vv * v; + u1 = 3.0 * vv * u; + u2 = 3.0 * v * uu; + u3 = u * uu; + + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; + S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; + S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; + S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; + S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; + S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; + } + + Draw_Fractal(F); + + if (F->Count >= 1000 / F->Speed) { + S = F->Components; + S1 = S + F->Nb_Simi; + S2 = S1 + F->Nb_Simi; + S3 = S2 + F->Nb_Simi; + S4 = S3 + F->Nb_Simi; + + for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { + S2->c_x = 2.0 * S4->c_x - S3->c_x; + S2->c_y = 2.0 * S4->c_y - S3->c_y; + S2->r = 2.0 * S4->r - S3->r; + S2->r2 = 2.0 * S4->r2 - S3->r2; + S2->A = 2.0 * S4->A - S3->A; + S2->A2 = 2.0 * S4->A2 - S3->A2; + + *S1 = *S4; + } + Random_Simis(F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); + + Random_Simis(F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); + + F->Count = 0; + } else + F->Count++; + + F->Col++; +} + + +/***************************************************************/ + +void +release_ifs(ModeInfo * mi) +{ + int i; + + if (Root == NULL) + return; + + for (i = 0; i < MI_NUM_SCREENS(mi); ++i) { + if (Root[i].Buffer1 != NULL) + free(Root[i].Buffer1); + if (Root[i].Buffer2 != NULL) + free(Root[i].Buffer2); + if (Root[i].dbuf) + XFreePixmap(MI_DISPLAY(mi), Root[i].dbuf); + if (Root[i].dbuf_gc) + XFreeGC(MI_DISPLAY(mi), Root[i].dbuf_gc); + } + free(Root); + Root = NULL; +} diff --git a/local/man/man.1/ifs.1 b/hacks/ifs.man similarity index 100% rename from local/man/man.1/ifs.1 rename to hacks/ifs.man diff --git a/hacks/imsmap.c b/hacks/imsmap.c new file mode 100644 index 00000000..54e8a774 --- /dev/null +++ b/hacks/imsmap.c @@ -0,0 +1,502 @@ +/* imsmap, Copyright (c) 1992 Juergen Nickelsen + * Derived from code by Markus Schirmer, TU Berlin. + * + * 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. + * + * Revision History: + * 24-aug-92: jwz: hacked. + * 17-May-97: jwz: hacked more. + */ + +#include +#include +#include /* for gettimeofday() */ + +#include +#include + +#include "screenhack.h" + +#define NSTEPS 7 +#define COUNT (1 << NSTEPS) +#define CELL(c, r) cell[((unsigned int)(c)) + ((unsigned int) (r)) * xmax] + +static enum mode_t { MODE_H, MODE_S, MODE_V, MODE_RANDOM } mode; + +static GC gc, gc2; +static XWindowAttributes xgwa; + +#if defined(sun) && !__STDC__ /* sun cc doesn't know "signed char" */ +#define signed /**/ +#endif + +static Colormap cmap; +static int ncolors; +static XColor *colors; +static Bool cycle_p; +static int cycle_direction; +static Bool extra_krinkly_p; + +static int delay, cycle_delay; +static signed char *cell = NULL; +static int xmax, ymax; +static int iterations; + +static void +init_map (Display *dpy, Window window) +{ + unsigned long fg_pixel = 0, bg_pixel = 0; + int fg_h, bg_h; + double fg_s, fg_v, bg_s, bg_v; + + enum mode_t this_mode; + static Bool rv_p; + + XGCValues gcv; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + + if (!ncolors) + { + char *mode_str = get_string_resource ("mode", "Mode"); + rv_p = get_boolean_resource ("reverseVideo", "ReverseVideo"); + cycle_p = get_boolean_resource ("cycle", "Cycle"); + ncolors = get_integer_resource ("ncolors", "Integer"); + delay = get_integer_resource ("delay", "Integer"); + cycle_delay = get_integer_resource ("cycleDelay", "Integer"); + iterations = get_integer_resource ("iterations", "Integer"); + if (iterations < 0) iterations = 0; + else if (iterations > 7) iterations = 7; + + if (ncolors <= 2) ncolors = 0; + if (ncolors == 0) mono_p = True; + + fg_pixel = get_pixel_resource ("background", "Background", dpy, cmap); + bg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + + if (fg_pixel == bg_pixel) + { + XColor black, white; + black.red = black.green = black.blue = 0; + white.red = white.green = white.blue = 0xFFFF; + black.flags = white.flags = DoRed|DoGreen|DoBlue; + XAllocColor(dpy, cmap, &black); + XAllocColor(dpy, cmap, &white); + if (bg_pixel == black.pixel) + fg_pixel = white.pixel; + else + fg_pixel = black.pixel; + } + + if (mono_p) cycle_p = False; + + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + gcv.foreground = bg_pixel; + gc2 = XCreateGC (dpy, window, GCForeground, &gcv); + + if (!mode_str || !strcmp (mode_str, "random")) + mode = MODE_RANDOM; + else if (!strcmp (mode_str, "h") || !strcmp (mode_str, "hue")) + mode = MODE_H; + else if (!strcmp (mode_str, "s") || !strcmp (mode_str, "saturation")) + mode = MODE_S; + else if (!strcmp (mode_str, "v") || !strcmp (mode_str, "value")) + mode = MODE_V; + else + { + fprintf (stderr, + "%s: mode must be hue, saturation, value, or random, not \"%s\"\n", + progname, mode_str); + mode = MODE_RANDOM; + } + } + + this_mode = mode; + if (!mono_p && mode == MODE_RANDOM) + switch (random () % 6) { + case 0: this_mode = MODE_H; break; + case 1: this_mode = MODE_S; break; + case 2: this_mode = MODE_V; break; + default: break; + } + + if (mono_p) + extra_krinkly_p = !(random() % 15); + else + extra_krinkly_p = !(random() % 5); + + if (!mono_p) + { + double distance, fg_H, bg_H, dh; + + RETRY: + fg_h = random() % 360; + fg_s = frand(1.0); + fg_v = frand(1.0); + + bg_h = fg_h; + bg_s = fg_s; + bg_v = fg_v; + + switch (this_mode) + { + case MODE_H: + bg_h = random() % 360; + if (fg_v < 0.4) + goto RETRY; + distance = fg_h - bg_h; + if (distance < 0) + distance = -distance; + if (distance > 360) + distance = 180 - (distance - 180); + if (distance < 30) + goto RETRY; + break; + + case MODE_S: + bg_s = frand(1.0); + if (fg_v < 0.4) + goto RETRY; + distance = fg_s - bg_s; + if (distance < 0) + distance = -distance; + if (distance < 0.2) + goto RETRY; + break; + + case MODE_V: + bg_v = frand(1.0); + distance = fg_v - bg_v; + if (distance < 0) + distance = -distance; + if (distance < 0.4) + goto RETRY; + break; + + default: + bg_h = random() % 360; + bg_s = frand(1.0); + bg_v = frand(1.0); + + fg_H = ((double) fg_h) / 360; + bg_H = ((double) bg_h) / 360; + dh = fg_H - bg_H; + if (dh < 0) dh = -dh; + if (dh > 0.5) dh = 0.5 - (dh - 0.5); + distance = sqrt ((dh * dh) + + ((fg_s - bg_s) * (fg_s - bg_s)) + + ((fg_v - bg_v) * (fg_v - bg_v))); + if (distance < 0.2) + goto RETRY; + } + + cycle_p = True; + if (colors) + free_colors (dpy, cmap, colors, ncolors); + else + colors = (XColor *) malloc (ncolors * sizeof(*colors)); + + cycle_direction = (random() & 1 ? 1 : -1); + + RETRY_NON_WRITABLE: + { + int n = ncolors; + make_color_ramp (dpy, cmap, + fg_h, fg_s, fg_v, + bg_h, bg_s, bg_v, + colors, &n, + True, True, cycle_p); + if (n == 0 && cycle_p) + { + cycle_p = False; + goto RETRY_NON_WRITABLE; + } + ncolors = n; + } + + if (ncolors <= 0) + mono_p = 1; + } + + if (mono_p) + { + static Bool done = False; + static XColor c[50]; + colors = c; + cycle_p = False; + ncolors = sizeof(c)/sizeof(*c); + if (!done) + { + int i; + done = True; + colors[0].pixel = fg_pixel; + for (i = 1; i < ncolors; i++) + colors[i].pixel = bg_pixel; + } + } + + XSetForeground (dpy, gc, colors[1].pixel); + XFillRectangle (dpy, window, gc, 0, 0, xgwa.width, xgwa.height); +} + + +#define HEIGHT_TO_PIXEL(height) \ + ((height) < 0 \ + ? (extra_krinkly_p \ + ? ncolors - ((-(height)) % ncolors) \ + : 0) \ + : ((height) >= ncolors \ + ? (extra_krinkly_p \ + ? (height) % ncolors \ + : ncolors-1) \ + : (height))) + + +static unsigned int +set (unsigned int l, + unsigned int c, + unsigned int size, + int height) +{ + int rang = 1 << (NSTEPS - size); + height = height + (random () % rang) - rang / 2; + height = HEIGHT_TO_PIXEL(height); + CELL (l, c) = height; + return colors[height].pixel; +} + +static void +floyd_steinberg (Display *dpy, Window window) +{ + int x, y, err; + + /* Instead of repeatedly calling XPutPixel(), we make an Image and then + send its bits over all at once. This consumes much less network + bandwidth. The image we create is Wx1 intead of WxH, so that we + don't use enormous amounts of memory. + */ + XImage *image = + XCreateImage (dpy, xgwa.visual, + 1, XYBitmap, 0, /* depth, format, offset */ + (char *) calloc ((xmax + 8) / 8, 1), /* data */ + xmax, 1, 8, 0); /* w, h, pad, bpl */ + + XSetForeground (dpy, gc, colors[0].pixel); + XSetBackground (dpy, gc, colors[1].pixel); + + for (y = 0; y < ymax - 1; y++) + { + for (x = 0; x < xmax - 1; x++) + { + if (CELL(x, y) < 0) + { + err = CELL (x, y); + XPutPixel (image, x, 0, 1); + } + else + { + err = CELL (x, y) - 1; + XPutPixel (image, x, 0, 0); + } + /* distribute error */ + CELL (x, y+1) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y+1) += (int) (((float) err) * 1.0/4.0); + } + XPutImage (dpy, window, gc, image, 0, 0, 0, y, xmax, 1); + } + XDestroyImage (image); +} + +static void +draw (Display *dpy, Window window, + int x, int y, unsigned long pixel, int grid_size) +{ + static unsigned int last_pixel, last_valid = 0; + if (! (last_valid && pixel == last_pixel)) + XSetForeground (dpy, gc, pixel); + last_valid = 1, last_pixel = pixel; + if (grid_size == 1) + XDrawPoint (dpy, window, gc, x, y); + else + XFillRectangle (dpy, window, gc, x, y, grid_size, grid_size); +} + + +static void +draw_map (Display *dpy, Window window) +{ + int xstep, ystep, xnextStep, ynextStep; + int x, y, i, x1, x2, y1, y2; + unsigned int pixel, qpixels [4]; + + int backwards = random() & 1; + + xmax = xgwa.width; + ymax = xgwa.height; + + cell = (signed char *) calloc (xmax * ymax, 1); + if (cell == NULL) + exit (1); + + CELL (0, 0) = 0; + xstep = (backwards ? -COUNT : COUNT); + ystep = COUNT; + for (i = 0; i < iterations; i++) + { + xnextStep = xstep / 2; + ynextStep = ystep / 2; + for (x = (backwards ? xmax-1 : 0); + (backwards ? x >= 0 : x < xmax); + x += xstep) + { + x1 = x + xnextStep; + if (x1 < 0) + x1 = xmax-1; + else if (x1 >= xmax) + x1 = 0; + + x2 = x + xstep; + if (x2 < 0) + x2 = xmax-1; + else if (x2 >= xmax) + x2 = 0; + + for (y = 0; y < ymax; y += ystep) + { + y1 = y + ynextStep; + if (y1 < 0) + y1 = ymax-1; + else if (y1 >= ymax) + y1 = 0; + + y2 = y + ystep; + if (y2 < 0) + y2 = ymax-1; + else if (y2 >= ymax) + y2 = 0; + + qpixels [0] = colors [HEIGHT_TO_PIXEL (CELL (x, y))].pixel; + qpixels [1] = colors [HEIGHT_TO_PIXEL (CELL (x, y2))].pixel; + qpixels [2] = colors [HEIGHT_TO_PIXEL (CELL (x2, y))].pixel; + qpixels [3] = colors [HEIGHT_TO_PIXEL (CELL (x2, y2))].pixel; + + pixel = set (x, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (dpy, window, x, y1, pixel, ynextStep); + + pixel = set (x1, y, i, + ((int) CELL (x, y) + (int) CELL (x2, y) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (dpy, window, x1, y, pixel, ynextStep); + + pixel = set (x1, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + + (int) CELL (x2, y) + (int) CELL (x2, y2) + 2) + / 4); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (dpy, window, x1, y1, pixel, ynextStep); + + + if (cycle_p) + { + struct timeval now; + static struct timeval then = { 0, }; + unsigned long diff; +#ifdef GETTIMEOFDAY_TWO_ARGS + struct timezone tzp; + gettimeofday(&now, &tzp); +#else + gettimeofday(&now); +#endif + diff = (((now.tv_sec - then.tv_sec) * 1000000) + + (now.tv_usec - then.tv_usec)); + if (diff > cycle_delay) + { + rotate_colors (dpy, cmap, colors, ncolors, + cycle_direction); + then = now; + } + } + } + } + xstep = xnextStep; + ystep = ynextStep; + if (!mono_p) + XSync (dpy, True); + } + if (mono_p) + /* in mono-mode, we do all the drawing at the end */ + floyd_steinberg (dpy, window); + + free (cell); + XSync (dpy, True); +} + + +char *progclass = "Imsmap"; + +char *defaults [] = { + "Imsmap.background: black", /* to placate SGI */ + "Imsmap.foreground: black", + "*mode: random", + "*ncolors: 50", + "*iterations: 7", + "*delay: 10", + "*cycleDelay: 100000", + "*cycle: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" }, + { 0, 0, 0, 0 } +}; + + +void +screenhack (Display *dpy, Window window) +{ + while (1) + { + init_map (dpy, window); + draw_map (dpy, window); + if (delay) + { + if (cycle_p) + { + time_t start = time((time_t) 0); + while (start + delay > time((time_t) 0)) + { + rotate_colors (dpy, cmap, colors, ncolors, + cycle_direction); + if (cycle_delay) usleep(cycle_delay); + } + } + else + sleep (delay); + } + } +} diff --git a/local/man/man.1/imsmap.1 b/hacks/imsmap.man similarity index 100% rename from local/man/man.1/imsmap.1 rename to hacks/imsmap.man diff --git a/hacks/julia.c b/hacks/julia.c new file mode 100644 index 00000000..680a5b19 --- /dev/null +++ b/hacks/julia.c @@ -0,0 +1,420 @@ +/* -*- Mode: C; tab-width: 4 -*- + * julia --- continuously varying Julia set. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)julia.c 4.03 97/04/10 xlockmore"; +#endif + +/* Copyright (c) 1995 Sean McCullough . + * + * 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. + * + * Revision History: + * 28-May-97: jwz@netscape.com: added interactive frobbing with the mouse. + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 02-Dec-95: snagged boilerplate from hop.c + * used ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration + * to plot the julia set, and sinusoidially varied parameter for set + * and plotted parameter with a circle. + */ + +/*- + * One thing to note is that batchcount is the *depth* of the search tree, + * so the number of points computed is 2^batchcount - 1. I use 8 or 9 + * on a dx266 and it looks okay. The sinusoidal variation of the parameter + * might not be as interesting as it could, but it still gives an idea of + * the effect of the parameter. + */ + +#ifdef STANDALONE +# define PROGCLASS "Julia" +# define HACK_INIT init_julia +# define HACK_DRAW draw_julia +# define julia_opts xlockmore_opts +# define DEFAULTS "*count: 1000 \n" \ + "*cycles: 20 \n" \ + "*delay: 10000 \n" \ + "*ncolors: 200 \n" +# define UNIFORM_COLORS +# include "xlockmore.h" /* in xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* in xlockmore distribution */ +#endif /* !STANDALONE */ + + +static Bool track_p; + +#define DEF_MOUSE "False" + +static XrmOptionDescRec opts[] = +{ + {"-mouse", ".julia.mouse", XrmoptionNoArg, (caddr_t) "on"}, + {"+mouse", ".julia.mouse", XrmoptionNoArg, (caddr_t) "off"}, +}; +static argtype vars[] = +{ + {(caddr_t *) & track_p, "mouse", "Mouse", DEF_MOUSE, t_Bool}, +}; +static OptionStruct desc[] = +{ + {"-/+mouse", "turn on/off mouse tracking"}, +}; + +ModeSpecOpt julia_opts = { 2, opts, 1, vars, desc }; + + +#define numpoints ((0x2<depth)-1) + +typedef struct { + int centerx; + int centery; /* center of the screen */ + double cr; + double ci; /* julia params */ + int depth; + int inc; + int circsize; + int erase; + int pix; + long itree; + int buffer; + int nbuffers; + int redrawing, redrawpos; + Pixmap pixmap; + Cursor cursor; + GC stippledGC; + XPoint **pointBuffer; /* pointer for XDrawPoints */ + +} juliastruct; + +static juliastruct *julias = NULL; + +/* How many segments to draw per cycle when redrawing */ +#define REDRAWSTEP 3 + +static void +apply(juliastruct * jp, register double xr, register double xi, int d) +{ + double theta, r; + + jp->pointBuffer[jp->buffer][jp->itree].x = + (int) (0.5 * xr * jp->centerx + jp->centerx); + jp->pointBuffer[jp->buffer][jp->itree].y = + (int) (0.5 * xi * jp->centery + jp->centery); + jp->itree++; + + if (d > 0) { + xi -= jp->ci; + xr -= jp->cr; + +/* Avoid atan2: DOMAIN error message */ + if (xi == 0.0 && xr == 0.0) + theta = 0.0; + else + theta = atan2(xi, xr) / 2.0; + + /*r = pow(xi * xi + xr * xr, 0.25); */ + r = sqrt(sqrt(xi * xi + xr * xr)); /* 3 times faster */ + + xr = r * cos(theta); + xi = r * sin(theta); + + d--; + apply(jp, xr, xi, d); + apply(jp, -xr, -xi, d); + } +} + +static void +incr(ModeInfo * mi, juliastruct * jp) +{ + int cx, cy; + + if (track_p) + { + Window r, c; + int rx, ry; + unsigned int m; + XQueryPointer(MI_DISPLAY(mi), MI_WINDOW(mi), + &r, &c, &rx, &ry, &cx, &cy, &m); + if (cx <= 0 || cy <= 0 || + cx >= MI_WIN_WIDTH(mi) || cy >= MI_WIN_HEIGHT(mi)) + goto NOTRACK; + } + + if (track_p) + { + jp->cr = ((double) (cx + 2 - jp->centerx)) * 2 / jp->centerx; + jp->ci = ((double) (cy + 2 - jp->centery)) * 2 / jp->centery; + } + else + { + NOTRACK: + jp->cr = 1.5 * (sin(M_PI * (jp->inc / 300.0)) * + sin(jp->inc * M_PI / 200.0)); + jp->ci = 1.5 * (cos(M_PI * (jp->inc / 300.0)) * + cos(jp->inc * M_PI / 200.0)); + + jp->cr += 0.5 * cos(M_PI * jp->inc / 400.0); + jp->ci += 0.5 * sin(M_PI * jp->inc / 400.0); + } +} + +void +init_julia(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + juliastruct *jp; + XGCValues gcv; + int i; + + if (julias == NULL) { + if ((julias = (juliastruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (juliastruct))) == NULL) + return; + } + jp = &julias[MI_SCREEN(mi)]; + + jp->centerx = MI_WIN_WIDTH(mi) / 2; + jp->centery = MI_WIN_HEIGHT(mi) / 2; + + jp->depth = MI_BATCHCOUNT(mi); + if (jp->depth > 10) + jp->depth = 10; + + + if (track_p && !jp->cursor) + { + Pixmap bit; + XColor black; + black.red = black.green = black.blue = 0; + black.flags = DoRed|DoGreen|DoBlue; + bit = XCreatePixmapFromBitmapData (display, window, "\000", 1, 1, + MI_WIN_BLACK_PIXEL(mi), + MI_WIN_BLACK_PIXEL(mi), 1); + jp->cursor = XCreatePixmapCursor (display, bit, bit, &black, &black, + 0, 0); + XFreePixmap (display, bit); + } + + if (jp->pixmap != None && + jp->circsize != (MIN(jp->centerx, jp->centery) / 60) * 2 + 1) { + XFreePixmap(display, jp->pixmap); + jp->pixmap = None; + } + if (jp->pixmap == None) { + GC fg_gc = None, bg_gc = None; + + jp->circsize = (MIN(jp->centerx, jp->centery) / 96) * 2 + 1; + jp->pixmap = XCreatePixmap(display, window, jp->circsize, jp->circsize, 1); + gcv.foreground = 1; + fg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv); + gcv.foreground = 0; + bg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv); + XFillRectangle(display, jp->pixmap, bg_gc, + 0, 0, jp->circsize, jp->circsize); + if (jp->circsize < 2) + XDrawPoint(display, jp->pixmap, fg_gc, 0, 0); + else + XFillArc(display, jp->pixmap, fg_gc, + 0, 0, jp->circsize, jp->circsize, 0, 23040); + if (fg_gc != None) + XFreeGC(display, fg_gc); + if (bg_gc != None) + XFreeGC(display, bg_gc); + } + + if (MI_WIN_IS_INROOT(mi)) + ; + else if (jp->circsize > 0) + XDefineCursor (display, window, jp->cursor); + else + XUndefineCursor (display, window); + + if (!jp->stippledGC) { + gcv.foreground = MI_WIN_BLACK_PIXEL(mi); + gcv.background = MI_WIN_BLACK_PIXEL(mi); + if ((jp->stippledGC = XCreateGC(display, window, + GCForeground | GCBackground, &gcv)) == None) + return; + } + if (MI_NPIXELS(mi) > 2) + jp->pix = NRAND(MI_NPIXELS(mi)); + jp->inc = ((LRAND() & 1) * 2 - 1) * NRAND(200); + jp->nbuffers = (MI_CYCLES(mi) + 1); + if (!jp->pointBuffer) + jp->pointBuffer = (XPoint **) calloc(jp->nbuffers, sizeof (XPoint *)); + for (i = 0; i < jp->nbuffers; ++i) + if (jp->pointBuffer[i]) + (void) memset((char *) jp->pointBuffer[i], 0, + numpoints * sizeof (XPoint)); + else + jp->pointBuffer[i] = (XPoint *) calloc(numpoints, sizeof (XPoint)); + jp->buffer = 0; + jp->redrawing = 0; + jp->erase = 0; + XClearWindow(display, window); +} + + +/* hack: moved here by jwz. */ +#define ERASE_IMAGE(d,w,g,x,y,xl,yl,xs,ys) \ +if (yly) \ +(y>yl-ys)?XFillRectangle(d,w,g,xl,y+ys,xs,yl-y): \ +XFillRectangle(d,w,g,xl,yl,xs,ys); \ +if (xlx) \ +(x>xl-xs)?XFillRectangle(d,w,g,x+xs,yl,xl-x,ys): \ +XFillRectangle(d,w,g,xl,yl,xs,ys) + + +void +draw_julia(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + juliastruct *jp = &julias[MI_SCREEN(mi)]; + double r, theta; + register double xr = 0.0, xi = 0.0; + int k = 64, rnd = 0, i, j; + XPoint *xp = jp->pointBuffer[jp->buffer], old_circle, new_circle; + + old_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2; + old_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2; + incr(mi, jp); + new_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2; + new_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2; + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + ERASE_IMAGE(display, window, gc, new_circle.x, new_circle.y, + old_circle.x, old_circle.y, jp->circsize, jp->circsize); + /* draw a circle at the c-parameter so you can see it's effect on the + structure of the julia set */ + XSetTSOrigin(display, jp->stippledGC, new_circle.x, new_circle.y); + XSetForeground(display, jp->stippledGC, MI_WIN_WHITE_PIXEL(mi)); + XSetStipple(display, jp->stippledGC, jp->pixmap); + XSetFillStyle(display, jp->stippledGC, FillOpaqueStippled); + XFillRectangle(display, window, jp->stippledGC, new_circle.x, new_circle.y, + jp->circsize, jp->circsize); + XFlush(display); + if (jp->erase == 1) { + XDrawPoints(display, window, gc, + jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin); + } + jp->inc++; + if (MI_NPIXELS(mi) > 2) { + XSetForeground(display, gc, MI_PIXEL(mi, jp->pix)); + if (++jp->pix >= MI_NPIXELS(mi)) + jp->pix = 0; + } else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + while (k--) { + + /* save calls to LRAND by using bit shifts over and over on the same + int for 32 iterations, then get a new random int */ + if (!(k % 32)) + rnd = LRAND(); + + /* complex sqrt: x^0.5 = radius^0.5*(cos(theta/2) + i*sin(theta/2)) */ + + xi -= jp->ci; + xr -= jp->cr; + + /* Avoid atan2: DOMAIN error message */ + if (xi == 0.0 && xr == 0.0) + theta = 0.0; + else + theta = atan2(xi, xr) / 2.0; + + /*r = pow(xi * xi + xr * xr, 0.25); */ + r = sqrt(sqrt(xi * xi + xr * xr)); /* 3 times faster */ + + xr = r * cos(theta); + xi = r * sin(theta); + + if ((rnd >> (k % 32)) & 0x1) { + xi = -xi; + xr = -xr; + } + xp->x = jp->centerx + (int) ((jp->centerx >> 1) * xr); + xp->y = jp->centery + (int) ((jp->centery >> 1) * xi); + xp++; + } + + jp->itree = 0; + apply(jp, xr, xi, jp->depth); + + XDrawPoints(display, window, gc, + jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin); + + jp->buffer++; + if (jp->buffer > jp->nbuffers - 1) { + jp->buffer -= jp->nbuffers; + jp->erase = 1; + } + if (jp->redrawing) { + for (i = 0; i < REDRAWSTEP; i++) { + j = (jp->buffer - jp->redrawpos + jp->nbuffers) % jp->nbuffers; + XDrawPoints(display, window, gc, + jp->pointBuffer[j], numpoints, CoordModeOrigin); + + if (++(jp->redrawpos) >= jp->nbuffers) { + jp->redrawing = 0; + break; + } + } + } +} + +void +release_julia(ModeInfo * mi) +{ + if (julias != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + Display *display = MI_DISPLAY(mi); + juliastruct *jp = &julias[screen]; + int buffer; + + if (jp->pointBuffer) { + for (buffer = 0; buffer < jp->nbuffers; buffer++) + if (jp->pointBuffer[buffer]) + (void) free((void *) jp->pointBuffer[buffer]); + (void) free((void *) jp->pointBuffer); + } + if (jp->stippledGC != None) + XFreeGC(display, jp->stippledGC); + if (jp->pixmap != None) + XFreePixmap(display, jp->pixmap); + if (jp->cursor) + XFreeCursor (display, jp->cursor); + } + (void) free((void *) julias); + julias = NULL; + } +} + +void +refresh_julia(ModeInfo * mi) +{ + juliastruct *jp = &julias[MI_SCREEN(mi)]; + + jp->redrawing = 1; + jp->redrawpos = 0; +} diff --git a/local/man/man.1/julia.1 b/hacks/julia.man similarity index 100% rename from local/man/man.1/julia.1 rename to hacks/julia.man diff --git a/hacks/kaleidescope.c b/hacks/kaleidescope.c new file mode 100644 index 00000000..c6d7a981 --- /dev/null +++ b/hacks/kaleidescope.c @@ -0,0 +1,464 @@ +/* kaleidescope, Copyright (c) 1997 Ron Tapia + * + * 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 above, for lack of a better copyright statement in easy reach + * was just lifted from the xscreensaver source. + * + * One of the odd things about this hack is that the radial motion of the + * segments depends on roundoff error alone. + * + * I tried to make the source easy to add other shapes. So far, I've + * only messed with elipses and I couldn't do much with them that looked + * cool. A nice addition would be to add some sort of spline based shapes. + * Maybe rectangles would look nice. + * + */ + + +#include +#include +#include +#include +#include "spline.h" +#include "screenhack.h" + +#define NEWX(x,y) ((x*g.costheta) + (y*g.sintheta)) +#define NEWY(x,y) ((y*g.costheta) - (x*g.sintheta)) + + +typedef struct { + int xoff, yoff; /* offset of origin xmax/2, ymax/2 */ + int xmax, ymax; /* width, height of window */ + float costheta, sintheta; + int symmetry; + int ntrails; + int nsegments; + int narcs; + int nobjects; + int local_rotation; + int global_rotation; + int spring_constant; + Colormap cmap; + GC draw_gc; + GC erase_gc; + unsigned int default_fg_pixel; + Display *dpy; + Window window; + unsigned long delay; + unsigned short redmin,redrange,greenmin,greenrange,bluemin,bluerange; + int color_mode; +} GLOBAL; + +typedef struct Obj OBJECT; +struct Obj { + int type; + int time; + void (*propogate) (OBJECT *); + void (*draw) (OBJECT *); + void (*init) (OBJECT *); + void *cur; +}; + +typedef struct KSEGMENT { + struct KSEGMENT *next; + XColor color; + int drawn; + short int x1,y1,x2,y2; /* these are in the natural coordinate system */ + XSegment *xsegments; /* these are in the X coordinate system */ +} Ksegment; + +/* BEGIN global variables */ + +GLOBAL g; +OBJECT *objects; + +char *progclass = "Kaleidescope"; +char *defaults [] = { + "Kaleidescope.background: black", /* to placate SGI */ + "Kaleidescope.foreground: white", + "*color_mode: nice", + "*symmetry: 11", + "*ntrails: 100", + "*nsegments: 7", + "*local_rotation: -59", + "*global_rotation: 1", + "*spring_constant: 5", + "*delay: 20000", + "*redmin: 30000", + "*redrange: 20000", + "*greenmin: 30000", + "*greenrange: 20000", + "*bluemin: 30000", + "*bluerange: 20000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-color_mode", ".color_mode", XrmoptionSepArg, 0 }, + { "-symmetry", ".symmetry", XrmoptionSepArg, 0 }, + { "-nsegments", ".nsegments", XrmoptionSepArg, 0 }, + { "-ntrails", ".ntrails", XrmoptionSepArg, 0 }, + { "-local_rotation", ".local_rotation", XrmoptionSepArg, 0 }, + { "-global_rotation", ".global_rotation", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-spring_constant", ".spring_constant", XrmoptionSepArg, 0 }, + { "-redmin", ".redmin", XrmoptionSepArg, 0 }, + { "-redrange", ".redmin", XrmoptionSepArg, 0 }, + { "-bluemin", ".bluemin", XrmoptionSepArg, 0 }, + { "-bluerange", ".bluerange", XrmoptionSepArg, 0 }, + { "-greenmin", ".greenmin", XrmoptionSepArg, 0 }, + { "-greenrange", ".greenrange", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +/* END global variables */ + +static void +krandom_color(XColor *color) +{ + int r; + r = ya_random() % 3; + + if((g.color_mode == 0) || (g.color_mode == 1)) { + + color->blue = ((r = ya_random()) % g.bluerange) + g.bluemin; + color->green = ((r = ya_random()) % g.greenrange) + g.greenmin; + color->red = ((r = ya_random()) % g.redrange) + g.redmin; + + if(!XAllocColor(g.dpy, g.cmap, color)) { + color->pixel = g.default_fg_pixel; + } + return; + } else { + color->pixel = g.default_fg_pixel; + return; + } +} + + +static void +kcopy_color(XColor *to, XColor *from) +{ + to->red = from->red; + to->green = from->green; + to->blue = from->blue; + to->pixel = from->pixel; +} + +static void +kcycle_color(XColor *color, + unsigned short redstep, + unsigned short greenstep, + unsigned short bluestep) +{ + unsigned short red,green,blue; + + if (! g.color_mode) { + XColor copy; + color->flags = DoRed|DoGreen|DoBlue; + color->red = (red = color->red) - redstep; + color->green = (green = color->green) - greenstep; + color->blue = (blue = color->blue) - bluestep; + copy = *color; + + if(!XAllocColor(g.dpy, g.cmap, color)) { + /* printf("couldn't alloc color...\n"); */ + color->pixel = g.default_fg_pixel; + } + copy.pixel = color->pixel; + *color = copy; + + color->red = red - redstep; + color->green = green- greenstep; + color->blue = blue - bluestep; + return; + } +} + + +static Ksegment * +create_ksegment (void) +{ + Ksegment *seg, *prev; + XColor new_color; + int i; + unsigned short redstep,bluestep,greenstep; + + krandom_color(&new_color); + + redstep = new_color.red/(2 * g.ntrails); + greenstep = new_color.green/(2 * g.ntrails); + bluestep = new_color.blue/(2 * g.ntrails); + + seg = (Ksegment *) malloc(sizeof(Ksegment)); + seg->xsegments = (XSegment *) malloc(g.symmetry * sizeof(XSegment)); + + prev = seg; + for(i=0; i< (g.ntrails - 1); i++) { + + kcycle_color(&new_color,redstep,greenstep,bluestep); + + kcopy_color(&(prev->color), &new_color); + + prev->next = (Ksegment*)malloc(sizeof(Ksegment)); + (prev->next)->xsegments = (XSegment*)malloc(g.symmetry * sizeof(XSegment)); + prev->drawn = 0; + prev = (prev->next); + } + + prev->drawn = 0; + prev->next = seg; + kcopy_color(&(prev->color), &new_color); + + return seg; +} + +static void +init_ksegment (OBJECT *obj) +{ + + /* Give the segment some random values */ + ((Ksegment *)obj->cur)->x1 = ya_random() % g.xoff; + ((Ksegment *)obj->cur)->y1 = ya_random() % g.yoff; + ((Ksegment *)obj->cur)->x2 = ya_random() % g.xoff; + ((Ksegment *)obj->cur)->y2 = ya_random() % g.yoff; +} + + +static void +draw_ksegment (OBJECT *obj) +{ + register short x1, y1, x2, y2; + int dx, dy; + int i; + static int counter=0; + + counter++; + + x1 = ((Ksegment *)obj->cur)->x1; /* in the natural coordinate system */ + y1 = ((Ksegment *)obj->cur)->y1; + x2 = ((Ksegment *)obj->cur)->x2; + y2 = ((Ksegment *)obj->cur)->y2; + + dx = x2 - x1; + dy = y2 - y1; + + /* maybe throw away values and start over */ + if( ((dx*dx) + (dy * dy)) < 100) { + init_ksegment (obj); + x1 = ((Ksegment *)obj->cur)->x1; /* in the natural coordinate system */ + y1 = ((Ksegment *)obj->cur)->y1; + x2 = ((Ksegment *)obj->cur)->x2; + y2 = ((Ksegment *)obj->cur)->y2; + } + + for (i=0; icur)->xsegments)[i].x1 = NEWX(x1,y1); + (((Ksegment *)obj->cur)->xsegments)[i].y1 = NEWY(x1,y1); + (((Ksegment *)obj->cur)->xsegments)[i].x2 = NEWX(x2,y2); + (((Ksegment *)obj->cur)->xsegments)[i].y2 = NEWY(x2,y2); + + (((Ksegment *)obj->cur)->xsegments)[i].x1 = (x1 = (((Ksegment *)obj->cur)->xsegments)[i].x1) + g.xoff; + (((Ksegment *)obj->cur)->xsegments)[i].y1 = (y1 = (((Ksegment *)obj->cur)->xsegments)[i].y1) + g.yoff; + (((Ksegment *)obj->cur)->xsegments)[i].x2 = (x2 = (((Ksegment *)obj->cur)->xsegments)[i].x2) + g.xoff; + (((Ksegment *)obj->cur)->xsegments)[i].y2 = (y2 = (((Ksegment *)obj->cur)->xsegments)[i].y2) + g.yoff; + } + + XSetForeground(g.dpy, g.draw_gc, (((Ksegment *)obj->cur)->color).pixel); + + XDrawSegments(g.dpy, g.window, g.draw_gc, ((Ksegment *)obj->cur)->xsegments, g.symmetry); + ((Ksegment *)obj->cur)->drawn = 1; + + if (((((Ksegment *)obj->cur)->next)->drawn) != 0) { + XDrawSegments(g.dpy, g.window, g.erase_gc, ((Ksegment *)obj->cur)->next->xsegments, g.symmetry); + } +} + +static void +propogate_ksegment(OBJECT *obj) +{ + int t; + short int x1,y1,x2,y2; + short int midx,midy,nmidx,nmidy; + float lsin, lcos, gsin, gcos; + + lsin = sin((2*M_PI/10000)*g.local_rotation); + lcos = cos((2*M_PI/10000)*g.local_rotation); + gsin = sin((2*M_PI/10000)*g.global_rotation); + gcos = cos((2*M_PI/10000)*g.global_rotation); + + t=obj->time; + obj->time = t + 1; + + x1 = ((Ksegment *) obj->cur)->x1; + y1 = ((Ksegment *) obj->cur)->y1; + x2 = ((Ksegment *) obj->cur)->x2; + y2 = ((Ksegment *) obj->cur)->y2; + + midx = (x1 + x2)/2; + midy = (y1 + y2)/2; + + nmidx = midx*gcos + midy*gsin; + nmidy = midy*gcos - midx*gsin; + + x1 = x1 - midx; + x2 = x2 - midx; + y1 = y1 - midy; + y2 = y2 - midy; + + + /* This is where we move to the next ksegment... */ + obj->cur = ((Ksegment *)obj->cur)->next; + + ((Ksegment *)obj->cur)->x1 = ((x1*lcos) + (y1*lsin)) + nmidx; + ((Ksegment *)obj->cur)->y1 = ((y1*lcos) - (x1*lsin)) + nmidy; + ((Ksegment *)obj->cur)->x2 = ((x2*lcos) + (y2*lsin)) + nmidx; + ((Ksegment *)obj->cur)->y2 = ((y2*lcos) - (x2*lsin)) + nmidy; + + return ; +} + +static void +init_objects (void) +{ + int i; + for (i=0; i + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + */ + +#ifdef STANDALONE +# define PROGCLASS "Laser" +# define HACK_INIT init_laser +# define HACK_DRAW draw_laser +# define laser_opts xlockmore_opts +# define DEFAULTS "*count: 10 \n" \ + "*cycles: 200 \n" \ + "*delay: 40000 \n" \ + "*ncolors: 64 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt laser_opts = { + 0, NULL, 0, NULL, NULL }; + +#define MINREDRAW 3 /* Number of redrawn on each frame */ +#define MAXREDRAW 8 + +#define MINLASER 1 /* Laser number */ + +#define MINWIDTH 2 /* Laser ray width range */ +#define MAXWIDTH 40 + +#define MINSPEED 2 /* Speed range */ +#define MAXSPEED 17 + +#define MINDIST 10 /* Minimal distance from edges */ + +#define COLORSTEP 2 /* Laser color step */ + +#define RANGE_RAND(min,max) ((min) + LRAND() % ((max) - (min))) + +typedef enum { + TOP, RIGHT, BOTTOM, LEFT +} border; + +typedef struct { + int bx; /* border x */ + int by; /* border y */ + border bn; /* active border */ + int dir; /* direction */ + int speed; /* laser velocity from MINSPEED to MAXSPEED */ + int sx[MAXWIDTH]; /* x stack */ + int sy[MAXWIDTH]; /* x stack */ + XGCValues gcv; /* for color */ +} laserstruct; + +typedef struct { + int width; + int height; + int cx; /* center x */ + int cy; /* center y */ + int lw; /* laser width */ + int ln; /* laser number */ + int lr; /* laser redraw */ + int sw; /* stack width */ + int so; /* stack offset */ + int time; /* up time */ + GC stippledGC; + XGCValues gcv_black; /* for black color */ + laserstruct *laser; +} lasersstruct; + +static lasersstruct *lasers = NULL; + + +void +init_laser(ModeInfo * mi) +{ + int i, c = 0; + lasersstruct *lp; + + if (lasers == NULL) { + if ((lasers = (lasersstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (lasersstruct))) == NULL) + return; + } + lp = &lasers[MI_SCREEN(mi)]; + + lp->width = MI_WIN_WIDTH(mi); + lp->height = MI_WIN_HEIGHT(mi); + lp->time = 0; + + lp->ln = MI_BATCHCOUNT(mi); + if (lp->ln < -MINLASER) { + /* if lp->ln is random ... the size can change */ + if (lp->laser != NULL) { + (void) free((void *) lp->laser); + lp->laser = NULL; + } + lp->ln = NRAND(-lp->ln - MINLASER + 1) + MINLASER; + } else if (lp->ln < MINLASER) + lp->ln = MINLASER; + + if (!lp->laser) { + lp->laser = (laserstruct *) malloc(lp->ln * sizeof (laserstruct)); + } + if (lp->stippledGC == NULL) { + XGCValues gcv; + + gcv.foreground = MI_WIN_WHITE_PIXEL(mi); + gcv.background = MI_WIN_BLACK_PIXEL(mi); + lp->gcv_black.foreground = MI_WIN_BLACK_PIXEL(mi); + lp->stippledGC = XCreateGC(MI_DISPLAY(mi), MI_WINDOW(mi), + GCForeground | GCBackground, &gcv); + } + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + + if (MINDIST < lp->width - MINDIST) + lp->cx = RANGE_RAND(MINDIST, lp->width - MINDIST); + else + lp->cx = RANGE_RAND(0, lp->width); + if (MINDIST < lp->height - MINDIST) + lp->cy = RANGE_RAND(MINDIST, lp->height - MINDIST); + else + lp->cy = RANGE_RAND(0, lp->height); + lp->lw = RANGE_RAND(MINWIDTH, MAXWIDTH); + lp->lr = RANGE_RAND(MINREDRAW, MAXREDRAW); + lp->sw = 0; + lp->so = 0; + + if (MI_NPIXELS(mi) > 2) + c = NRAND(MI_NPIXELS(mi)); + + for (i = 0; i < lp->ln; i++) { + laserstruct *l = &lp->laser[i]; + + l->bn = (border) NRAND(4); + + switch (l->bn) { + case TOP: + l->bx = NRAND(lp->width); + l->by = 0; + break; + case RIGHT: + l->bx = lp->width; + l->by = NRAND(lp->height); + break; + case BOTTOM: + l->bx = NRAND(lp->width); + l->by = lp->height; + break; + case LEFT: + l->bx = 0; + l->by = NRAND(lp->height); + } + + l->dir = LRAND() & 1; + l->speed = ((RANGE_RAND(MINSPEED, MAXSPEED) * lp->width) / 1000) + 1; + if (MI_NPIXELS(mi) > 2) { + l->gcv.foreground = MI_PIXEL(mi, c); + c = (c + COLORSTEP) % MI_NPIXELS(mi); + } else + l->gcv.foreground = MI_WIN_WHITE_PIXEL(mi); + } +} + +static void +draw_laser_once(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + lasersstruct *lp = &lasers[MI_SCREEN(mi)]; + int i; + + for (i = 0; i < lp->ln; i++) { + laserstruct *l = &lp->laser[i]; + + if (lp->sw >= lp->lw) { + XChangeGC(display, lp->stippledGC, GCForeground, &(lp->gcv_black)); + XDrawLine(display, MI_WINDOW(mi), lp->stippledGC, + lp->cx, lp->cy, + l->sx[lp->so], l->sy[lp->so]); + } + if (l->dir) { + switch (l->bn) { + case TOP: + l->bx -= l->speed; + if (l->bx < 0) { + l->by = -l->bx; + l->bx = 0; + l->bn = LEFT; + } + break; + case RIGHT: + l->by -= l->speed; + if (l->by < 0) { + l->bx = lp->width + l->by; + l->by = 0; + l->bn = TOP; + } + break; + case BOTTOM: + l->bx += l->speed; + if (l->bx >= lp->width) { + l->by = lp->height - l->bx % lp->width; + l->bx = lp->width; + l->bn = RIGHT; + } + break; + case LEFT: + l->by += l->speed; + if (l->by >= lp->height) { + l->bx = l->by % lp->height; + l->by = lp->height; + l->bn = BOTTOM; + } + } + } else { + switch (l->bn) { + case TOP: + l->bx += l->speed; + if (l->bx >= lp->width) { + l->by = l->bx % lp->width; + l->bx = lp->width; + l->bn = RIGHT; + } + break; + case RIGHT: + l->by += l->speed; + if (l->by >= lp->height) { + l->bx = lp->width - l->by % lp->height; + l->by = lp->height; + l->bn = BOTTOM; + } + break; + case BOTTOM: + l->bx -= l->speed; + if (l->bx < 0) { + l->by = lp->height + l->bx; + l->bx = 0; + l->bn = LEFT; + } + break; + case LEFT: + l->by -= l->speed; + if (l->by < 0) { + l->bx = -l->bx; + l->by = 0; + l->bn = TOP; + } + } + } + + XChangeGC(display, lp->stippledGC, GCForeground, &l->gcv); + XDrawLine(display, MI_WINDOW(mi), lp->stippledGC, + lp->cx, lp->cy, l->bx, l->by); + + l->sx[lp->so] = l->bx; + l->sy[lp->so] = l->by; + + } + + if (lp->sw < lp->lw) + ++lp->sw; + + lp->so = (lp->so + 1) % lp->lw; +} + +void +draw_laser(ModeInfo * mi) +{ + lasersstruct *lp = &lasers[MI_SCREEN(mi)]; + int i; + + for (i = 0; i < lp->lr; i++) + draw_laser_once(mi); + + if (++lp->time > MI_CYCLES(mi)) + init_laser(mi); +} + +void +release_laser(ModeInfo * mi) +{ + if (lasers != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + lasersstruct *lp = &lasers[screen]; + + if (lp->laser != NULL) + (void) free((void *) lp->laser); + if (lp->stippledGC != NULL) + XFreeGC(MI_DISPLAY(mi), lp->stippledGC); + } + (void) free((void *) lasers); + lasers = NULL; + } +} + +void +refresh_laser(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/laser.1 b/hacks/laser.man similarity index 100% rename from local/man/man.1/laser.1 rename to hacks/laser.man diff --git a/hacks/lightning.c b/hacks/lightning.c new file mode 100644 index 00000000..baa255dd --- /dev/null +++ b/hacks/lightning.c @@ -0,0 +1,580 @@ +/* -*- Mode: C; tab-width: 4 -*- + * lightning --- fractal lightning bolts. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)lightning.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1996 by Keith Romberg . + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 14-Jul-96: Cleaned up code. + * 27-Jun-96: Written and submitted by Keith Romberg . + */ + +#ifdef STANDALONE +# define PROGCLASS "Lightning" +# define HACK_INIT init_lightning +# define HACK_DRAW draw_lightning +# define lightning_opts xlockmore_opts +# define DEFAULTS "*delay: 10000 \n" \ + "*ncolors: 200 \n" +# define BRIGHT_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt lightning_opts = { + 0, NULL, 0, NULL, NULL }; + +/*---------------------------- defines -------------------------------*/ + +#define BOLT_NUMBER 4 +#define BOLT_ITERATION 4 +#define LONG_FORK_ITERATION 3 +#define MEDIUM_FORK_ITERATION 2 +#define SMALL_FORK_ITERATION 1 + +#define WIDTH_VARIATION 30 +#define HEIGHT_VARIATION 15 + +#define DELAY_TIME_AMOUNT 15 +#define MULTI_DELAY_TIME_BASE 5 + +#define MAX_WIGGLES 16 +#define WIGGLE_BASE 8 +#define WIGGLE_AMOUNT 14 + +#define RANDOM_FORK_PROBILITY 4 + +#define FIRST_LEVEL_STRIKE 0 +#define LEVEL_ONE_STRIKE 1 +#define LEVEL_TWO_STRIKE 2 + +#define BOLT_VERTICIES ((1<= 51) && (multi_prob < 75)) + result = 2; + else if ((multi_prob >= 76) && (multi_prob < 92)) + result = 3; + else + result = BOLT_NUMBER; /* 4 */ + + return (result); +} + +/*-------------------------------------------------------------------------*/ + +static int +flashing_strike(void) +{ + int tmp = NRAND(FLASH_PROBILITY); + + if (tmp <= FLASH_PROBILITY) + return (1); + return (0); +} + +/*-------------------------------------------------------------------------*/ + +static void +flash_duration(int *start, int *end, int total_duration) +{ + int mid, d; + + mid = total_duration / MAX_FLASH_AMOUNT; + d = NRAND(total_duration / MAX_FLASH_AMOUNT) / 2; + *start = mid - d; + *end = mid + d; +} + +/*-------------------------------------------------------------------------*/ + +static void +random_storm(Storm * st) +{ + int i, j, tmp; + XPoint p; + + for (i = 0; i < st->multi_strike; i++) { + st->bolts[i].end1.x = NRAND(st->scr_width); + st->bolts[i].end1.y = 0; + st->bolts[i].end2.x = NRAND(st->scr_width); + st->bolts[i].end2.y = st->scr_height; + st->bolts[i].wiggle_number = WIGGLE_BASE + NRAND(MAX_WIGGLES); + if ((st->bolts[i].flash = flashing_strike())) + flash_duration(&(st->bolts[i].flash_begin), &(st->bolts[i].flash_stop), + st->bolts[i].wiggle_number); + else + st->bolts[i].flash_begin = st->bolts[i].flash_stop = 0; + st->bolts[i].wiggle_amount = WIGGLE_AMOUNT; + if (i == 0) + st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT); + else + st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT) + + (MULTI_DELAY_TIME_BASE * i); + st->bolts[i].strike_level = FIRST_LEVEL_STRIKE; + tmp = 0; + generate(st->bolts[i].end1, st->bolts[i].end2, BOLT_ITERATION, + st->bolts[i].middle, &tmp); + st->bolts[i].fork_number = 0; + st->bolts[i].visible = 0; + for (j = 0; j < BOLT_VERTICIES; j++) { + if (st->bolts[i].fork_number >= 2) + break; + if (NRAND(100) < RANDOM_FORK_PROBILITY) { + p.x = NRAND(st->scr_width); + p.y = st->scr_height; + st->bolts[i].forks_start[st->bolts[i].fork_number] = j; + create_fork(&(st->bolts[i].branch[st->bolts[i].fork_number]), + st->bolts[i].middle[j], p, j); + st->bolts[i].fork_number++; + } + } + } +} + +static void +generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index) +{ + XPoint mid; + + mid.x = (A.x + B.x) / 2 + NRAND(WIDTH_VARIATION) - WIDTH_VARIATION / 2; + mid.y = (A.y + B.y) / 2 + NRAND(HEIGHT_VARIATION) - HEIGHT_VARIATION / 2; + + if (!iter) { + verts[*index].x = mid.x; + verts[*index].y = mid.y; + (*index)++; + return; + } + generate(A, mid, iter - 1, verts, index); + generate(mid, B, iter - 1, verts, index); +} + +/*------------------------------------------------------------------------*/ + +static void +create_fork(Fork * f, XPoint start, XPoint end, int level) +{ + int tmp = 1; + + f->ForkVerticies[0].x = start.x; + f->ForkVerticies[0].y = start.y; + + if (level <= 6) { + generate(start, end, LONG_FORK_ITERATION, f->ForkVerticies, &tmp); + f->num_used = 9; + } else if ((level > 6) && (level <= 11)) { + generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp); + f->num_used = 5; + } else { + if (distance(start, end) > 100) { + generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp); + f->num_used = 5; + } else { + generate(start, end, SMALL_FORK_ITERATION, f->ForkVerticies, &tmp); + f->num_used = 3; + } + } + + f->ForkVerticies[f->num_used - 1].x = end.x; + f->ForkVerticies[f->num_used - 1].y = end.y; +} + +/*------------------------------------------------------------------------*/ + +static void +update_bolt(Lightning * bolt, int time) +{ + wiggle_bolt(bolt); + if ((bolt->wiggle_amount == 0) && (bolt->wiggle_number > 2)) + bolt->wiggle_number = 0; + if (((time % 3) == 0)) + bolt->wiggle_amount++; + + if (((time >= bolt->delay_time) && (time < bolt->flash_begin)) || + (time > bolt->flash_stop)) + bolt->visible = 1; + else + bolt->visible = 0; + + if (time == bolt->delay_time) + bolt->strike_level = FIRST_LEVEL_STRIKE; + else if (time == (bolt->delay_time + 1)) + bolt->strike_level = LEVEL_ONE_STRIKE; + else if ((time > (bolt->delay_time + 1)) && + (time <= (bolt->delay_time + bolt->flash_begin - 2))) + bolt->strike_level = LEVEL_TWO_STRIKE; + else if (time == (bolt->delay_time + bolt->flash_begin - 1)) + bolt->strike_level = LEVEL_ONE_STRIKE; + else if (time == (bolt->delay_time + bolt->flash_stop + 1)) + bolt->strike_level = LEVEL_ONE_STRIKE; + else + bolt->strike_level = LEVEL_TWO_STRIKE; +} + +/*------------------------------------------------------------------------*/ + +static void +draw_bolt(Lightning * bolt, ModeInfo * mi) +{ + if (bolt->visible) { + if (bolt->strike_level == FIRST_LEVEL_STRIKE) + first_strike(*bolt, mi); + else if (bolt->strike_level == LEVEL_ONE_STRIKE) + level1_strike(*bolt, mi); + else + level2_strike(*bolt, mi); + } +} + +/*------------------------------------------------------------------------*/ + +static void +first_strike(Lightning bolt, ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + int i; + + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XDrawLine(display, window, gc, + bolt.end1.x, bolt.end1.y, bolt.middle[0].x, bolt.middle[0].y); + draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 0); + XDrawLine(display, window, gc, + bolt.middle[BOLT_VERTICIES - 1].x, bolt.middle[BOLT_VERTICIES - 1].y, + bolt.end2.x, bolt.end2.y); + + for (i = 0; i < bolt.fork_number; i++) + draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used, + gc, 0); +} + +/*------------------------------------------------------------------------*/ + +static void +draw_line(ModeInfo * mi, XPoint * points, int number, GC to_use, int offset) +{ + int i; + + for (i = 0; i < number - 1; i++) { + if (points[i].y <= points[i + 1].y) + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x + offset, + points[i].y, points[i + 1].x + offset, points[i + 1].y); + else { + if (points[i].x < points[i + 1].x) + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x + + offset, points[i].y + offset, points[i + 1].x + offset, + points[i + 1].y + offset); + else + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x - + offset, points[i].y + offset, points[i + 1].x - offset, + points[i + 1].y + offset); + } + } +} + +/*------------------------------------------------------------------------*/ + +static void +level1_strike(Lightning bolt, ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + Storm *st = &Helga[MI_SCREEN(mi)]; + GC gc = MI_GC(mi); + int i; + + if (MI_NPIXELS(mi) > 2) /* color */ + XSetForeground(display, gc, MI_PIXEL(mi, st->color)); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XDrawLine(display, window, gc, + bolt.end1.x - 1, bolt.end1.y, bolt.middle[0].x - 1, bolt.middle[0].y); + draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -1); + XDrawLine(display, window, gc, + bolt.middle[BOLT_VERTICIES - 1].x - 1, + bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 1, bolt.end2.y); + XDrawLine(display, window, gc, + bolt.end1.x + 1, bolt.end1.y, bolt.middle[0].x + 1, bolt.middle[0].y); + draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 1); + XDrawLine(display, window, gc, + bolt.middle[BOLT_VERTICIES - 1].x + 1, + bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 1, bolt.end2.y); + + for (i = 0; i < bolt.fork_number; i++) { + draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used, + gc, -1); + draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used, + gc, 1); + } + first_strike(bolt, mi); +} + +/*------------------------------------------------------------------------*/ + +static int +distance(XPoint a, XPoint b) +{ + return ((int) sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y))); +} + +/*------------------------------------------------------------------------*/ + +static void +level2_strike(Lightning bolt, ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + Storm *st = &Helga[MI_SCREEN(mi)]; + GC gc = MI_GC(mi); + int i; + + /* This was originally designed to be a little darker then the + level1 strike. This was changed to get it to work on + multiscreens and to add more color variety. I tried + stippling but it did not look good. */ + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, st->color)); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XDrawLine(display, window, gc, + bolt.end1.x - 2, bolt.end1.y, bolt.middle[0].x - 2, bolt.middle[0].y); + draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -2); + XDrawLine(display, window, gc, + bolt.middle[BOLT_VERTICIES - 1].x - 2, + bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 2, bolt.end2.y); + + XDrawLine(display, window, gc, + bolt.end1.x + 2, bolt.end1.y, bolt.middle[0].x + 2, bolt.middle[0].y); + draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 2); + XDrawLine(display, window, gc, + bolt.middle[BOLT_VERTICIES - 1].x + 2, + bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 2, bolt.end2.y); + + for (i = 0; i < bolt.fork_number; i++) { + draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used, + gc, -2); + draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used, + gc, 2); + } + level1_strike(bolt, mi); +} + +/*------------------------------------------------------------------------*/ + +static int +storm_active(Storm * st) +{ + int i, atleast_1 = 0; + + for (i = 0; i < st->multi_strike; i++) + if (st->bolts[i].wiggle_number > 0) + atleast_1++; + + return (atleast_1); +} + +/*------------------------------------------------------------------------*/ + +static void +wiggle_bolt(Lightning * bolt) +{ + int i; + + wiggle_line(bolt->middle, BOLT_VERTICIES, bolt->wiggle_amount); + bolt->end2.x += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2; + bolt->end2.y += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2; + + for (i = 0; i < bolt->fork_number; i++) { + wiggle_line(bolt->branch[i].ForkVerticies, bolt->branch[i].num_used, + bolt->wiggle_amount); + bolt->branch[i].ForkVerticies[0].x = bolt->middle[bolt->forks_start[i]].x; + bolt->branch[i].ForkVerticies[0].y = bolt->middle[bolt->forks_start[i]].y; + } + + if (bolt->wiggle_amount > 1) + bolt->wiggle_amount -= 1; + else + bolt->wiggle_amount = 0; +} + +/*------------------------------------------------------------------------*/ + +static void +wiggle_line(XPoint * p, int number, int amount) +{ + int i; + + for (i = 0; i < number; i++) { + p[i].x += NRAND(amount) - amount / 2; + p[i].y += NRAND(amount) - amount / 2; + } +} + +/*------------------------------------------------------------------------*/ + +void +init_lightning(ModeInfo * mi) +{ + Storm *st; + + if (Helga == NULL) { + if ((Helga = (Storm *) calloc(MI_NUM_SCREENS(mi), + sizeof (Storm))) == NULL) + return; + } + st = &Helga[MI_SCREEN(mi)]; + + st->scr_width = MI_WIN_WIDTH(mi); + st->scr_height = MI_WIN_HEIGHT(mi); + + st->multi_strike = setup_multi_strike(); + random_storm(st); + st->stage = 0; +} + +/*------------------------------------------------------------------------*/ + +void +draw_lightning(ModeInfo * mi) +{ + Storm *st = &Helga[MI_SCREEN(mi)]; + int i; + + switch (st->stage) { + case 0: + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + st->color = NRAND(MI_NPIXELS(mi)); + st->draw_time = 0; + if (storm_active(st)) + st->stage++; + else + st->stage = 3; + break; + case 1: + for (i = 0; i < st->multi_strike; i++) { + if (st->bolts[i].visible) + draw_bolt(&(st->bolts[i]), mi); + update_bolt(&(st->bolts[i]), st->draw_time); + } + st->draw_time++; + XFlush(MI_DISPLAY(mi)); + MI_PAUSE(mi) = 60000; + st->stage++; + break; + case 2: + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + if (storm_active(st)) + st->stage = 1; + else + st->stage++; + break; + case 3: + MI_PAUSE(mi) = 1000000; + init_lightning(mi); + break; + } +} + +void +release_lightning(ModeInfo * mi) +{ + if (Helga != NULL) { + (void) free((void *) Helga); + Helga = NULL; + } +} + +void +refresh_lightning(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/lightning.1 b/hacks/lightning.man similarity index 100% rename from local/man/man.1/lightning.1 rename to hacks/lightning.man diff --git a/hacks/link_axp.com b/hacks/link_axp.com new file mode 100644 index 00000000..942dd7ae --- /dev/null +++ b/hacks/link_axp.com @@ -0,0 +1,103 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_axp_12.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_axp_12.opt/opt +$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_axp_12.opt/opt +$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_axp_12.opt/opt +$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_axp_12.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp_12.opt/opt +$ link/exe=deco.exe screenhack,deco,vms_axp_12.opt/opt +$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_axp_12.opt/opt +$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_axp_12.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_axp_12.opt/opt +$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_axp_12.opt/opt +$ link/exe=fract.exe screenhack-xlock,fract,xlockmore,vms_axp_12.opt/opt +$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_axp_12.opt/opt +$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_axp_12.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_axp_12.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_axp_12.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_axp_12.opt/opt +$ link/exe=hopalong.exe screenhack-xlock,hopalong,xlockmore,vms_axp_12.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_axp_12.opt/opt +$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_axp_12.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_axp_12.opt/opt +$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_axp_12.opt/opt +$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp_12.opt/opt +$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_axp_12.opt/opt +$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_axp_12.opt/opt +$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_axp_12.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_axp_12.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_axp_12.opt/opt +$ link/exe=moire.exe screenhack,moire,vms_axp_12.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_axp_12.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_axp_12.opt/opt +$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_axp_12.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_axp_12.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_axp_12.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_axp_12.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_axp_12.opt/opt +$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_axp_12.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp_12.opt/opt +$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_axp_12.opt/opt +$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_axp_12.opt/opt +$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_axp_12.opt/opt +$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_axp_12.opt/opt +$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_axp_12.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_axp_12.opt/opt +$ link/exe=goop.exe screenhack,goop,vms_axp_12.opt/opt +$ link/exe=starfish.exe screenhack,starfish,vms_axp_12.opt/opt +$ link/exe=munch.exe screenhack,munch,vms_axp_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_axp.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_axp.opt/opt +$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_axp.opt/opt +$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_axp.opt/opt +$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_axp.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp.opt/opt +$ link/exe=deco.exe screenhack,deco,vms_axp.opt/opt +$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_axp.opt/opt +$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_axp.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_axp.opt/opt +$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_axp.opt/opt +$ link/exe=fract.exe screenhack-xlock,fract,xlockmore,vms_axp.opt/opt +$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_axp.opt/opt +$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_axp.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_axp.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_axp.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_axp.opt/opt +$ link/exe=hopalong.exe screenhack-xlock,hopalong,xlockmore,vms_axp.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_axp.opt/opt +$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_axp.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_axp.opt/opt +$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_axp.opt/opt +$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp.opt/opt +$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_axp.opt/opt +$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_axp.opt/opt +$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_axp.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_axp.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_axp.opt/opt +$ link/exe=moire.exe screenhack,moire,vms_axp.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_axp.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_axp.opt/opt +$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_axp.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_axp.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_axp.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_axp.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_axp.opt/opt +$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_axp.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp.opt/opt +$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_axp.opt/opt +$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_axp.opt/opt +$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_axp.opt/opt +$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_axp.opt/opt +$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_axp.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_axp.opt/opt +$ link/exe=goop.exe screenhack,goop,vms_axp.opt/opt +$ link/exe=starfish.exe screenhack,starfish,vms_axp.opt/opt +$ link/exe=munch.exe screenhack,munch,vms_axp.opt/opt +$ endif diff --git a/hacks/link_decc.com b/hacks/link_decc.com new file mode 100644 index 00000000..daf6a3b5 --- /dev/null +++ b/hacks/link_decc.com @@ -0,0 +1,103 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_decc_12.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_decc_12.opt/opt +$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_decc_12.opt/opt +$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_decc_12.opt/opt +$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_decc_12.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc_12.opt/opt +$ link/exe=deco.exe screenhack,deco,vms_decc_12.opt/opt +$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_decc_12.opt/opt +$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_decc_12.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_decc_12.opt/opt +$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_decc_12.opt/opt +$ link/exe=fract.exe screenhack-xlock,fract,xlockmore,vms_decc_12.opt/opt +$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_decc_12.opt/opt +$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_decc_12.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_decc_12.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_decc_12.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_decc_12.opt/opt +$ link/exe=hopalong.exe screenhack-xlock,hopalong,xlockmore,vms_decc_12.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_decc_12.opt/opt +$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_decc_12.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_decc_12.opt/opt +$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_decc_12.opt/opt +$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc_12.opt/opt +$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_decc_12.opt/opt +$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_decc_12.opt/opt +$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_decc_12.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_decc_12.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_decc_12.opt/opt +$ link/exe=moire.exe screenhack,moire,vms_decc_12.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_decc_12.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_decc_12.opt/opt +$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_decc_12.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_decc_12.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_decc_12.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_decc_12.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_decc_12.opt/opt +$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_decc_12.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc_12.opt/opt +$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_decc_12.opt/opt +$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_decc_12.opt/opt +$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_decc_12.opt/opt +$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_decc_12.opt/opt +$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_decc_12.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_decc_12.opt/opt +$ link/exe=goop.exe screenhack,goop,vms_decc_12.opt/opt +$ link/exe=starfish.exe screenhack,starfish,vms_decc_12.opt/opt +$ link/exe=munch.exe screenhack,munch,vms_decc_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_decc.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_decc.opt/opt +$ link/exe=bouboule.exe screenhack-xlock,bouboule,xlockmore,vms_decc.opt/opt +$ link/exe=braid.exe screenhack-xlock,braid,xlockmore,vms_decc.opt/opt +$ link/exe=bubbles.exe screenhack,bubbles,bubbles_default,vms_decc.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc.opt/opt +$ link/exe=deco.exe screenhack,deco,vms_decc.opt/opt +$ link/exe=drift.exe screenhack-xlock,drift,xlockmore,vms_decc.opt/opt +$ link/exe=flag.exe screenhack-xlock,flag,xlockmore,vms_decc.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_decc.opt/opt +$ link/exe=forest.exe screenhack-xlock,forest,xlockmore,vms_decc.opt/opt +$ link/exe=fract.exe screenhack-xlock,fract,xlockmore,vms_decc.opt/opt +$ link/exe=galaxy.exe screenhack-xlock,galaxy,xlockmore,vms_decc.opt/opt +$ link/exe=grav.exe screenhack-xlock,grav,xlockmore,vms_decc.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_decc.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_decc.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_decc.opt/opt +$ link/exe=hopalong.exe screenhack-xlock,hopalong,xlockmore,vms_decc.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_decc.opt/opt +$ link/exe=ifs.exe screenhack-xlock,ifs,xlockmore,vms_decc.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_decc.opt/opt +$ link/exe=julia.exe screenhack-xlock,julia,xlockmore,vms_decc.opt/opt +$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc.opt/opt +$ link/exe=laser.exe screenhack-xlock,laser,xlockmore,vms_decc.opt/opt +$ link/exe=lightning.exe screenhack-xlock,lightning,xlockmore,vms_decc.opt/opt +$ link/exe=lisa.exe screenhack-xlock,lisa,xlockmore,vms_decc.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_decc.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_decc.opt/opt +$ link/exe=moire.exe screenhack,moire,vms_decc.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_decc.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_decc.opt/opt +$ link/exe=penrose.exe screenhack-xlock,penrose,xlockmore,vms_decc.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_decc.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_decc.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_decc.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_decc.opt/opt +$ link/exe=sierpinski.exe screenhack-xlock,sierpinski,xlockmore,vms_decc.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc.opt/opt +$ link/exe=slip.exe screenhack-xlock,slip,xlockmore,vms_decc.opt/opt +$ link/exe=sphere.exe screenhack-xlock,sphere,xlockmore,vms_decc.opt/opt +$ link/exe=spiral.exe screenhack-xlock,spiral,xlockmore,vms_decc.opt/opt +$ link/exe=strange.exe screenhack-xlock,strange,xlockmore,vms_decc.opt/opt +$ link/exe=swirl.exe screenhack-xlock,swirl,xlockmore,vms_decc.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_decc.opt/opt +$ link/exe=goop.exe screenhack,goop,vms_decc.opt/opt +$ link/exe=starfish.exe screenhack,starfish,vms_decc.opt/opt +$ link/exe=munch.exe screenhack,munch,vms_decc.opt/opt +$ endif diff --git a/hacks/lisa.c b/hacks/lisa.c new file mode 100644 index 00000000..5859b77e --- /dev/null +++ b/hacks/lisa.c @@ -0,0 +1,477 @@ +/* -*- Mode: C; tab-width: 4 -*- + * lisa.c --- animated full-loop lisajous figures + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)lisa.c 4.03 97/05/10 xlockmore"; +#endif + +/* Copyright (c) 1997 by Caleb Cullen. + * + * 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. + * + * Revision History: + * 10-May-97: Compatible with xscreensaver + * + * The inspiration for this program, Lasp, was written by Adam B. Roach + * in 1990, assisted by me, Caleb Cullen. It was written first in C, then + * in assembly, and used pre-calculated data tables to graph lisajous + * figures on 386 machines and lower. This version bears only superficial + * resemblances to the original Lasp. + * + * The `lissie' module's source code was studied as an example of how + * to incorporate a new module into xlock. Resemblances to it are + * expected, but not intended to be plaigiaristic. + */ + +#ifdef STANDALONE +# define PROGCLASS "Lisa" +# define HACK_INIT init_lisa +# define HACK_DRAW draw_lisa +# define lisa_opts xlockmore_opts +# define DEFAULTS "*count: 1 \n" \ + "*cycles: 256 \n" \ + "*delay: 25000 \n" \ + "*size: -1 \n" \ + "*ncolors: 200 \n" +# define UNIFORM_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt lisa_opts = { + 0, NULL, 0, NULL, NULL }; + +#define DRAWLINES 1 +#define TWOLOOPS 1 +#define ADDITIVE "True" +#define XVMAX 10 /* Maximum velocities */ +#define YVMAX 10 +#define LISAMAXFUNCS 2 +#define NUMSTDFUNCS 10 +#define MAXCYCLES 3 +#define lisasetcolor() \ +if (MI_NPIXELS(mi) > 2) { \ + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, loop->color)); \ + if (++(loop->color) >= MI_NPIXELS(mi)) { loop->color=0; } \ + } else { XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); } +#define getRadius(context) \ + ((context->width > context->height)?context->height:context->width) * 3 / 8 +#define checkRadius(loop, context) \ + if ((context->height / 2 > MI_SIZE(mi)) && (context->width / 2 > MI_SIZE(mi))) \ + loop->radius = MI_SIZE(mi); \ + if ((loop->radius < 0) || \ + (loop->radius > loop->center.x) || \ + (loop->radius > loop->center.y)) loop->radius = getRadius(context) + + +typedef struct lisafunc_struct { + double xcoeff[2], ycoeff[2]; + int nx, ny; + int index; +} lisafuncs; + +typedef struct lisa_struct { + int radius, color, dx, dy, nsteps, nfuncs, melting; + double pistep, phi, theta; + XPoint center, *lastpoint; + lisafuncs *function[LISAMAXFUNCS]; +} lisas; + +typedef struct lisacontext_struct { + lisas *lisajous; + int width, height, nlisajous, loopcount; + int maxcycles; +} lisacons; + +static lisacons *Lisa = NULL; +static Bool additive; + +#ifndef STANDALONE +static XrmOptionDescRec lisa_xrm_opts[] = +{ + {"-additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "True"}, + {"+additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "False"} +}; + +static argtype lisa_vars[] = +{ + {(caddr_t *) & additive, "additive", "Additive", ADDITIVE, t_Bool} +}; + +static OptionStruct lisa_vars_desc[] = +{ + {"-/+additive", "turn on/off additive functions mode"} +}; + +ModeSpecOpt lisa_opts = +{2, lisa_xrm_opts, 1, lisa_vars, lisa_vars_desc}; +#endif /* STANDALONE */ + + +void refresh_lisa(ModeInfo * mi); +void change_lisa(ModeInfo * mi); + + +static lisafuncs Function[NUMSTDFUNCS] = +{ + { + {1.0, 2.0}, + {1.0, 2.0}, 2, 2, 0}, + { + {1.0, 2.0}, + {1.0, 1.0}, 2, 2, 1}, + { + {1.0, 3.0}, + {1.0, 2.0}, 2, 2, 2}, + { + {1.0, 3.0}, + {1.0, 3.0}, 2, 2, 3}, + { + {2.0, 4.0}, + {1.0, 2.0}, 2, 2, 4}, + { + {1.0, 4.0}, + {1.0, 3.0}, 2, 2, 5}, + { + {1.0, 4.0}, + {1.0, 4.0}, 2, 2, 6}, + { + {1.0, 5.0}, + {1.0, 5.0}, 2, 2, 7}, + { + {2.0, 5.0}, + {2.0, 5.0}, 2, 2, 8}, + { + {1.0, 0.0}, + {1.0, 0.0}, 1, 1, 9} +}; + +static void +drawlisa(ModeInfo * mi, lisas * loop) +{ + XPoint *np; + XPoint *lp = loop->lastpoint; + lisacons *lc = &Lisa[MI_SCREEN(mi)]; + lisafuncs **lf = loop->function; + int phase = lc->loopcount % loop->nsteps; + int pctr, fctr, xctr, yctr; + double xprod, yprod, xsum, ysum; + + /* Allocate the np array */ + np = (XPoint *) calloc(loop->nsteps, sizeof (XPoint)); + + /* Update the center */ + loop->center.x += loop->dx; + loop->center.y += loop->dy; + checkRadius(loop, lc); + if ((loop->center.x - loop->radius) <= 0) { + loop->center.x = loop->radius; + loop->dx = NRAND(XVMAX); + } else if ((loop->center.x + loop->radius) >= lc->width) { + loop->center.x = lc->width - loop->radius; + loop->dx = -NRAND(XVMAX); + }; + if ((loop->center.y - loop->radius) <= 0) { + loop->center.y = loop->radius; + loop->dy = NRAND(YVMAX); + } else if ((loop->center.y + loop->radius) >= lc->height) { + loop->center.y = lc->height - loop->radius; + loop->dy = -NRAND(YVMAX); + }; + + /* Now draw the points, and erase the ones from the last cycle */ + + for (pctr = 0; pctr < loop->nsteps; pctr++) { + fctr = loop->nfuncs; + loop->phi = (double) (pctr - phase) * loop->pistep; + loop->theta = (double) (pctr + phase) * loop->pistep; + xsum = ysum = 0; + while (fctr--) { + xctr = lf[fctr]->nx; + yctr = lf[fctr]->ny; + if (additive) { + xprod = yprod = 0.0; + while (xctr--) + xprod += sin(lf[fctr]->xcoeff[xctr] * loop->theta); + while (yctr--) + yprod += sin(lf[fctr]->ycoeff[yctr] * loop->phi); + if (loop->melting) { + if (fctr) { + xsum += xprod \ + *(double) (loop->nsteps - loop->melting) \ + /(double) loop->nsteps; + ysum += yprod \ + *(double) (loop->nsteps - loop->melting) \ + /(double) loop->nsteps; + } else { + xsum += xprod \ + *(double) loop->melting \ + /(double) loop->nsteps; + ysum += yprod \ + *(double) loop->melting \ + /(double) loop->nsteps; + } + } else { + xsum = xprod; + ysum = yprod; + } + if (!fctr) { + xsum = xsum \ + *(double) loop->radius \ + /(double) lf[fctr]->nx; + ysum = ysum \ + *(double) loop->radius \ + /(double) lf[fctr]->ny; + } + } else { + if (loop->melting) { + if (fctr) { + yprod = xprod = (double) loop->radius \ + *(double) (loop->nsteps - loop->melting) \ + /(double) (loop->nsteps); + } else { + yprod = xprod = (double) loop->radius \ + *(double) (loop->melting) \ + /(double) (loop->nsteps); + } + } else { + xprod = yprod = (double) loop->radius; + } + while (xctr--) + xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta); + while (yctr--) + yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi); + xsum += xprod; + ysum += yprod; + } + } + if ((loop->nfuncs > 1) && (!loop->melting)) { + xsum /= (double) loop->nfuncs; + ysum /= (double) loop->nfuncs; + } + xsum += (double) loop->center.x; + ysum += (double) loop->center.y; + + np[pctr].x = (int) ceil(xsum); + np[pctr].y = (int) ceil(ysum); + } + if (loop->melting) { + if (!--loop->melting) { + loop->nfuncs = 1; + loop->function[0] = loop->function[1]; + } + } + for (pctr = 0; pctr < loop->nsteps; pctr++) { + +#if defined DRAWLINES + /* erase the last cycle's point */ + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \ + MI_GC(mi), lp[pctr].x, lp[pctr].y, \ + lp[(pctr + 1) % loop->nsteps].x, \ + lp[(pctr + 1) % loop->nsteps].y); + + /* Set the new color */ + lisasetcolor(); + + /* plot this cycle's point */ + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \ + MI_GC(mi), np[pctr].x, np[pctr].y, \ + np[(pctr + 1) % loop->nsteps].x, \ + np[(pctr + 1) % loop->nsteps].y); +#else + /* erase the last cycle's point */ + XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \ + MI_GC(mi), lp[pctr].x, lp[pctr].y); + + /* Set the new color */ + lisasetcolor(); + + /* plot this cycle's point */ + XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \ + MI_GC(mi), np[pctr].x, np[pctr].y); +#endif + } + (void) free((void *) lp); + loop->lastpoint = np; +} + +static void +initlisa(ModeInfo * mi, lisas * loop) +{ + lisacons *lc = &Lisa[MI_SCREEN(mi)]; + lisafuncs **lf = loop->function; + XPoint *lp; + int phase, pctr, fctr, xctr, yctr; + double xprod, yprod, xsum, ysum; + + if (MI_NPIXELS(mi) > 2) { + loop->color = 0; + } else + loop->color = MI_WIN_WHITE_PIXEL(mi); + loop->nsteps = MI_CYCLES(mi); + if (loop->nsteps == 0) + loop->nsteps = 1; + lc->maxcycles = (MAXCYCLES * loop->nsteps) - 1; + loop->melting = 0; + loop->nfuncs = 1; + loop->pistep = 2.0 * M_PI / (double) loop->nsteps; + loop->center.x = lc->width / 2; + loop->center.y = lc->height / 2; + loop->radius = MI_SIZE(mi); + checkRadius(loop, lc); + loop->dx = NRAND(XVMAX); + loop->dy = NRAND(YVMAX); + loop->dx++; + loop->dy++; + lf[0] = &Function[lc->loopcount % NUMSTDFUNCS]; + if ((lp = loop->lastpoint = (XPoint *) + calloc(loop->nsteps, sizeof (XPoint))) == NULL) + return; + phase = lc->loopcount % loop->nsteps; + + for (pctr = 0; pctr < loop->nsteps; pctr++) { + loop->phi = (double) (pctr - phase) * loop->pistep; + loop->theta = (double) (pctr + phase) * loop->pistep; + fctr = loop->nfuncs; + xsum = ysum = 0.0; + while (fctr--) { + xprod = yprod = (double) loop->radius; + xctr = lf[fctr]->nx; + yctr = lf[fctr]->ny; + while (xctr--) + xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta); + while (yctr--) + yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi); + xsum += xprod; + ysum += yprod; + } + if (loop->nfuncs > 1) { + xsum /= 2.0; + ysum /= 2.0; + } + xsum += (double) loop->center.x; + ysum += (double) loop->center.y; + + lp[pctr].x = (int) ceil(xsum); + lp[pctr].y = (int) ceil(ysum); + } + for (pctr = 0; pctr < loop->nsteps; pctr++) { + /* Set the color */ + lisasetcolor(); +#if defined DRAWLINES + XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \ + MI_GC(mi), lp[pctr].x, lp[pctr].y, \ + lp[(pctr + 1) % loop->nsteps].x, \ + lp[(pctr + 1) % loop->nsteps].y); +#else + XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), \ + lp[pctr].x, lp[pctr].y); +#endif + } +} + +void +init_lisa(ModeInfo * mi) +{ + lisacons *lc; + int lctr; + + if (Lisa == NULL) { + if ((Lisa = (lisacons *) calloc(MI_NUM_SCREENS(mi), sizeof (lisacons))) \ + == NULL) + return; + } + lc = &Lisa[MI_SCREEN(mi)]; + lc->width = MI_WIN_WIDTH(mi); + lc->height = MI_WIN_HEIGHT(mi); + lc->nlisajous = MI_BATCHCOUNT(mi); + lc->loopcount = 0; + + if (lc->lisajous == NULL) { + if ((lc->lisajous = (lisas *) calloc(lc->nlisajous, sizeof (lisas))) \ + == NULL) + return; + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + for (lctr = 0; lctr < lc->nlisajous; lctr++) { + initlisa(mi, &lc->lisajous[lctr]); + lc->loopcount++; + } + } else { + refresh_lisa(mi); + } + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} + +void +draw_lisa(ModeInfo * mi) +{ + lisacons *lc = &Lisa[MI_SCREEN(mi)]; + + if (++lc->loopcount > lc->maxcycles) { + change_lisa(mi); + } + refresh_lisa(mi); +} + +void +refresh_lisa(ModeInfo * mi) +{ + lisacons *lc = &Lisa[MI_SCREEN(mi)]; + int lctr; + + for (lctr = 0; lctr < lc->nlisajous; lctr++) { + drawlisa(mi, &lc->lisajous[lctr]); + } +} + +void +release_lisa(ModeInfo * mi) +{ + lisacons *lc; + int lctr, sctr; + + if (Lisa) { + for (sctr = 0; sctr < MI_NUM_SCREENS(mi); sctr++) { + lc = &Lisa[sctr]; + while (lc->lisajous) { + for (lctr = 0; lctr < lc->nlisajous; lctr++) { + (void) free(lc->lisajous[lctr].lastpoint); + } + (void) free(lc->lisajous); + lc->lisajous = NULL; + } + } + (void) free(Lisa); + Lisa = NULL; + } +} + +void +change_lisa(ModeInfo * mi) +{ + lisacons *lc = &Lisa[MI_SCREEN(mi)]; + lisas *loop; + int lctr; + + lc->loopcount = 0; + for (lctr = 0; lctr < lc->nlisajous; lctr++) { + loop = &lc->lisajous[lctr]; + loop->function[1] = &Function[(loop->function[0]->index + 1) % + NUMSTDFUNCS]; + loop->melting = loop->nsteps - 1; + loop->nfuncs = 2; + } +} diff --git a/local/man/man.1/lisa.1 b/hacks/lisa.man similarity index 100% rename from local/man/man.1/lisa.1 rename to hacks/lisa.man diff --git a/hacks/lmorph.c b/hacks/lmorph.c new file mode 100644 index 00000000..0c7571ac --- /dev/null +++ b/hacks/lmorph.c @@ -0,0 +1,498 @@ + +/************************************************************************** + * + * FILE lmorph.c + * MODULE OF xscreensaver + * + * DESCRIPTION Bilinear interpolation for morphing line shapes. + * + * WRITTEN BY Sverre H. Huseby Glenn T. Lines + * Maridalsvn. 122, leil 101 Frysjavn. 3, 5. etg. + * N-0461 Oslo N-0883 Oslo + * Norway Norway + * + * Phone: +47 22 71 99 08 Phone: +47 22 23 71 99 + * E-mail: sverrehu@ifi.uio.no E-mail: gtl@si.sintef.no + * + * The original idea, and the bilinear interpolation + * mathematics used, emerged in the head of the wise + * Glenn Terje Lines. + * + * MODIFICATIONS march 1995 + * * Converted from an MS-Windows program to X Window. + * + **************************************************************************/ + +#include +#include +#include +#include +#include "screenhack.h" + +/************************************************************************** + * * + * P R I V A T E D A T A * + * * + **************************************************************************/ + +/* Define MARGINS to make some space around the figure */ +#define MARGINS /**/ + +#define MAXFIGS 20 +#define TWO_PI (2.0 * M_PI) +#define RND(x) (random() % (x)) +static int + cFig = 0, /* Number of figure arrays. */ + cPoint, /* Number of points in each array. */ + nWork, /* Current work array number. */ + nFrom, /* Current from array number. */ + nTo; /* Current to array number. */ +static long + delay; /* usecs to wait between updates. */ +static XPoint + *aWork[2], /* Working arrays. */ + *a[MAXFIGS], /* The figure arrays. */ + *aTmp, /* Used as source when interrupting morph */ + *aPrev, /* Previous points displayed. */ + *aCurr, /* The current points displayed. */ + *aFrom, /* Figure converting from. */ + *aTo; /* Figure converting to. */ +static double + gam, + maxGamma = 1.0, + delta_gam; +static GC + gcDraw, gcClear; +static Display + *dpy; +static Window + window; + + + +/************************************************************************** + * * + * P U B L I C D A T A * + * * + **************************************************************************/ + +char *progclass = "LMorph"; + +char *defaults [] = { + "LMorph.background: black", + "LMorph.foreground: green", + "*points: 150", + "*steps: 0", + "*delay: 50000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-steps", ".steps", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + + +/************************************************************************** + * * + * P R I V A T E F U N C T I O N S * + * * + **************************************************************************/ + +static void * +xmalloc(size_t size) +{ + void *ret; + + if ((ret = malloc(size)) == NULL) { + fprintf(stderr, "lmorph: out of memory\n"); + exit(1); + } + return ret; +} + + + +static double frnd (void) +{ + /* + * Hm. for some reason the second line (using RAND_MAX) didn't + * work on some machines, so I always use the first. + */ +#ifndef dont_use_RAND_MAX + return (double) (random() & 0x7FFF) / 0x7FFF; +#else /* RAND_MAX */ + return ((double) random()) / RAND_MAX; +#endif /* RAND_MAX */ +} + + + +static void initPointArrays (void) +{ + XWindowAttributes wa; + int q, w, + mx, my, /* Max screen coordinates. */ + mp, /* Max point number. */ + s, rx, ry, + marginx, marginy; + double scalex, scaley; + + XGetWindowAttributes(dpy, window, &wa); + mx = wa.width - 1; + my = wa.height - 1; + mp = cPoint - 1; + + aWork[0] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aWork[1] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aTmp = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + + + /* + * Figure 0 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + s = cPoint / 4; + for (q = 0; q < s; q++) { + a[cFig][q].x = ((double) q / s) * mx; + a[cFig][q].y = 0; + a[cFig][s + q].x = mx; + a[cFig][s + q].y = ((double) q / s) * my; + a[cFig][2 * s + q].x = mx - ((double) q / s) * mx; + a[cFig][2 * s + q].y = my; + a[cFig][3 * s + q].x = 0; + a[cFig][3 * s + q].y = my - ((double) q / s) * my; + } + for (q = 4 * s; q < cPoint; q++) + a[cFig][q].x = a[cFig][q].y = 0; + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 1 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / cPoint) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 2 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(1 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 3 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(3 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(1 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 4 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (1 - 0.1 * frnd()) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (1 - 0.1 * frnd()) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 5 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 6 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 7 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * cos(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * sin(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 8 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - cos(((double) q / mp) * 3 * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 9 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(2 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 10 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 11 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 - ry * cos(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 12 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * 5 * TWO_PI)) * my / 2.0; + } + ++cFig; + +#ifdef MARGINS + /* + * Make some space around the figures. + */ + marginx = (mx + 1) / 10; + marginy = (my + 1) / 10; + scalex = (double) ((mx + 1) - 2.0 * marginx) / (mx + 1.0); + scaley = (double) ((my + 1) - 2.0 * marginy) / (my + 1.0); + for (q = 0; q < cFig; q++) + for (w = 0; w < cPoint; w++) { + a[q][w].x = marginx + a[q][w].x * scalex; + a[q][w].y = marginy + a[q][w].y * scaley; + } +#endif +} + + + +static void createPoints (void) +{ + int q; + XPoint *pa = aCurr, *pa1 = aFrom, *pa2 = aTo; + long lg, l1g; + + + lg = 8192L * gam, l1g = 8192L * (1.0 - gam); + for (q = 0; q < cPoint; q++) { + pa->x = (short) ((l1g * pa1->x + lg * pa2->x) / 8192L); + pa->y = (short) ((l1g * pa1->y + lg * pa2->y) / 8192L); + ++pa; + ++pa1; + ++pa2; + } +} + + +static void drawImage (void) +{ + register int q; + XPoint *old0, *old1, *new0, *new1; + + /* + * Problem: update the window without too much flickering. I do + * this by handling each linesegment separately. First remove a + * line, then draw the new line. The problem is that this leaves + * small black pixels on the figure. To fix this, I draw the + * entire figure using XDrawLines() afterwards. + */ + if (aPrev) { + old0 = aPrev; + old1 = aPrev + 1; + new0 = aCurr; + new1 = aCurr + 1; + for (q = cPoint - 1; q; q--) { + XDrawLine(dpy, window, gcClear, + old0->x, old0->y, old1->x, old1->y); + XDrawLine(dpy, window, gcDraw, + new0->x, new0->y, new1->x, new1->y); + ++old0; + ++old1; + ++new0; + ++new1; + } + } + XDrawLines(dpy, window, gcDraw, aCurr, cPoint, CoordModeOrigin); + XFlush(dpy); +} + +static void initLMorph (void) +{ + int steps; + XGCValues gcv; + XWindowAttributes wa; + Colormap cmap; + + cPoint = get_integer_resource("points", "Integer"); + steps = get_integer_resource("steps", "Integer"); + delay = get_integer_resource("delay", "Integer"); + + if (steps <= 0) + steps = (random() % 400) + 100; + + delta_gam = 1.0 / steps; + XGetWindowAttributes(dpy, window, &wa); + cmap = wa.colormap; + gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap); + gcDraw = XCreateGC(dpy, window, GCForeground, &gcv); + XSetForeground(dpy, gcDraw, gcv.foreground); + gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap); + gcClear = XCreateGC(dpy, window, GCForeground, &gcv); + XClearWindow(dpy, window); + + srandom(time(NULL)); + initPointArrays(); + aCurr = aWork[nWork = 0]; + aPrev = NULL; + gam = 2.0; + nTo = RND(cFig); +} + +static void animateLMorph (void) +{ + if (gam > maxGamma) { + gam = 0.0; + if (maxGamma == 1.0) { + nFrom = nTo; + aFrom = a[nFrom]; + } else { + memcpy(aTmp, aCurr, cPoint * sizeof(XPoint)); + aFrom = aTmp; + nFrom = -1; + } + do { + nTo = RND(cFig); + } while (nTo == nFrom); + aTo = a[nTo]; + if (RND(2)) { + /* + * Reverse the array to get more variation. + */ + int i1, i2; + XPoint p; + + for (i1 = 0, i2 = cPoint - 1; i1 < cPoint / 2; i1++, i2--) { + p = aTo[i1]; + aTo[i1] = aTo[i2]; + aTo[i2] = p; + } + } + /* + * It may be nice to interrupt the next run. + */ + if (RND(3) > 0) + maxGamma = 0.1 + 0.7 * (RND(1001) / 1000.0); + else + maxGamma = 1.0; + } + + createPoints(); + drawImage(); + aPrev = aCurr; + aCurr = aWork[nWork ^= 1]; + + gam += delta_gam; +} + + + +/************************************************************************** + * * + * P U B L I C F U N C T I O N S * + * * + **************************************************************************/ + +void +screenhack(Display *disp, Window win) +{ + dpy = disp; + window = win; + initLMorph(); + for (;;) { + animateLMorph(); + screenhack_usleep(delay); + } +} diff --git a/local/man/man.1/lmorph.1 b/hacks/lmorph.man similarity index 100% rename from local/man/man.1/lmorph.1 rename to hacks/lmorph.man diff --git a/hacks/maze.c b/hacks/maze.c new file mode 100644 index 00000000..22af1d6a --- /dev/null +++ b/hacks/maze.c @@ -0,0 +1,791 @@ +/****************************************************************************** + * [ maze ] ... + * + * modified: [ 8-11-95 ] Ed James + * added fill of dead-end box to solve_maze while loop. + * modified: [ 3-7-93 ] Jamie Zawinski + * added the XRoger logo, cleaned up resources, made + * grid size a parameter. + * modified: [ 3-3-93 ] Jim Randell + * Added the colour stuff and integrated it with jwz's + * screenhack stuff. There's still some work that could + * be done on this, particularly allowing a resource to + * specify how big the squares are. + * modified: [ 10-4-88 ] Richard Hess ...!uunet!cimshop!rhess + * [ Revised primary execution loop within main()... + * [ Extended X event handler, check_events()... + * modified: [ 1-29-88 ] Dave Lemke lemke@sun.com + * [ Hacked for X11... + * [ Note the word "hacked" -- this is extremely ugly, but at + * [ least it does the job. NOT a good programming example + * [ for X. + * original: [ 6/21/85 ] Martin Weiss Sun Microsystems [ SunView ] + * + ****************************************************************************** + Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA. + + All Rights Reserved + + 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, and that the names of Sun or MIT not be + used in advertising or publicity pertaining to distribution of the + software without specific prior written permission. Sun and M.I.T. + make no representations about the suitability of this software for + any purpose. It is provided "as is" without any express or implied warranty. + + SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT + OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + OR PERFORMANCE OF THIS SOFTWARE. + *****************************************************************************/ + +#include "screenhack.h" + +#define XROGER + +static int solve_delay, pre_solve_delay, post_solve_delay; + +#include +#include +#include +#ifndef VMS +# include +#else /* VMS */ +# include "sys$common:[decw$include.bitmaps]gray1.xbm" +#endif /* VMS */ + +#define MAX_MAZE_SIZE_X 500 +#define MAX_MAZE_SIZE_Y 500 + +#define MOVE_LIST_SIZE (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y) + +#define WALL_TOP 0x8000 +#define WALL_RIGHT 0x4000 +#define WALL_BOTTOM 0x2000 +#define WALL_LEFT 0x1000 + +#define DOOR_IN_TOP 0x800 +#define DOOR_IN_RIGHT 0x400 +#define DOOR_IN_BOTTOM 0x200 +#define DOOR_IN_LEFT 0x100 +#define DOOR_IN_ANY 0xF00 + +#define DOOR_OUT_TOP 0x80 +#define DOOR_OUT_RIGHT 0x40 +#define DOOR_OUT_BOTTOM 0x20 +#define DOOR_OUT_LEFT 0x10 + +#define START_SQUARE 0x2 +#define END_SQUARE 0x1 + +#define border_x (0) +#define border_y (0) + +#define get_random(x) (random() % (x)) + +static int logo_x, logo_y; + +#ifdef XROGER +# define logo_width 128 +# define logo_height 128 +#else +# include +# define logo_width xlogo64_width +# define logo_height xlogo64_height +# define logo_bits xlogo64_bits +#endif + +static unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y]; + +static struct { + unsigned char x; + unsigned char y; + unsigned char dir; +} move_list[MOVE_LIST_SIZE], save_path[MOVE_LIST_SIZE], path[MOVE_LIST_SIZE]; + +static int maze_size_x, maze_size_y; +static int sqnum, cur_sq_x, cur_sq_y, path_length; +static int start_x, start_y, start_dir, end_x, end_y, end_dir; +static int grid_width, grid_height; + +static Display *dpy; +static Window win; +static GC gc, cgc, tgc, logo_gc; +static Pixmap logo_map; + +static int x = 0, y = 0, restart = 0, stop = 1, state = 1; + +static int +check_events (void) /* X event handler [ rhess ] */ +{ + XEvent e; + + if (XPending(dpy)) { + XNextEvent(dpy, &e); + switch (e.type) { + + case ButtonPress: + switch (e.xbutton.button) { + case 3: + exit (0); + break; + case 2: + stop = !stop ; + if (state == 5) state = 4 ; + else { + restart = 1; + stop = 0; + } + break; + default: + restart = 1 ; + stop = 0 ; + break; + } + break; + + case ConfigureNotify: + restart = 1; + break; + case UnmapNotify: + stop = 1; + XClearWindow (dpy, win); + XSync (dpy, False); + break; + case Expose: + restart = 1; + break; + } + return(1); + } + return(0); +} + + +static void +set_maze_sizes (int width, int height) +{ + maze_size_x = width / grid_width; + maze_size_y = height / grid_height; +} + + +static void +initialize_maze (void) /* draw the surrounding wall and start/end squares */ +{ + register int i, j, wall; + + /* initialize all squares */ + for ( i=0; i> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + cur_sq_x = i; + cur_sq_y = j; + start_x = i; + start_y = j; + start_dir = wall; + sqnum = 0; + + /* set end square */ + wall = (wall + 2)%4; + switch (wall) { + case 0: + i = get_random(maze_size_x); + j = 0; + break; + case 1: + i = maze_size_x - 1; + j = get_random(maze_size_y); + break; + case 2: + i = get_random(maze_size_x); + j = maze_size_y - 1; + break; + case 3: + i = 0; + j = get_random(maze_size_y); + break; + } + maze[i][j] |= END_SQUARE; + maze[i][j] |= ( DOOR_OUT_TOP >> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + end_x = i; + end_y = j; + end_dir = wall; + + /* set logo */ + if ((maze_size_x > 15) && (maze_size_y > 15)) + { + int logow = 1 + logo_width / grid_width; + int logoh = 1 + logo_height / grid_height; + /* not closer than 3 grid units from a wall */ + logo_x = get_random (maze_size_x - logow - 6) + 3; + logo_y = get_random (maze_size_y - logoh - 6) + 3; + for (i=0; i> newdoor ); + + switch (newdoor) { + case 0: cur_sq_y--; + break; + case 1: cur_sq_x++; + break; + case 2: cur_sq_y++; + break; + case 3: cur_sq_x--; + break; + } + sqnum++; + + /* mark the in door */ + maze[cur_sq_x][cur_sq_y] |= ( DOOR_IN_TOP >> ((newdoor+2)%4) ); + + /* if end square set path length and save path */ + if ( maze[cur_sq_x][cur_sq_y] & END_SQUARE ) { + path_length = sqnum; + for ( i=0; i> start_dir); + maze[end_x][end_y] |= (WALL_TOP >> end_dir); + + /* initialize search path */ + i = 0; + path[i].x = end_x; + path[i].y = end_y; + path[i].dir = -1; + + /* do it */ + while (1) { + if ( ++path[i].dir >= 4 ) { + XFillRectangle(dpy, win, cgc, + border_x + bw + grid_width * (int)(path[i].x), + border_y + bw + grid_height * (int)(path[i].y), + grid_width - (bw+bw), grid_height - (bw+bw)); + i--; + draw_solid_square( (int)(path[i].x), (int)(path[i].y), + (int)(path[i].dir), cgc); + } + else if ( ! (maze[path[i].x][path[i].y] & + (WALL_TOP >> path[i].dir)) && + ( (i == 0) || ( (path[i].dir != + (int)(path[i-1].dir+2)%4) ) ) ) { + enter_square(i); + i++; + if ( maze[path[i].x][path[i].y] & START_SQUARE ) { + return; + } + } + if (check_events()) return; + /* Abort solve on expose - cheapo repaint strategy */ + if (solve_delay) usleep (solve_delay); + } +} + + +static void +enter_square (int n) /* move into a neighboring square */ +{ + draw_solid_square( (int)path[n].x, (int)path[n].y, + (int)path[n].dir, tgc); + + path[n+1].dir = -1; + switch (path[n].dir) { + case 0: path[n+1].x = path[n].x; + path[n+1].y = path[n].y - 1; + break; + case 1: path[n+1].x = path[n].x + 1; + path[n+1].y = path[n].y; + break; + case 2: path[n+1].x = path[n].x; + path[n+1].y = path[n].y + 1; + break; + case 3: path[n+1].x = path[n].x - 1; + path[n+1].y = path[n].y; + break; + } +} + + +/* + * jmr additions for Jamie Zawinski's screensaver stuff, + * note that the code above this has probably been hacked about in some + * arbitrary way. + */ + +char *progclass = "Maze"; + +char *defaults[] = { + "Maze.background: black", /* to placate SGI */ + "Maze.foreground: white", /* to placate SGI */ + "*gridSize: 0", + "*solveDelay: 5000", + "*preDelay: 2000000", + "*postDelay: 4000000", + "*liveColor: green", + "*deadColor: red", +#ifdef XROGER + "*logoColor: red3", +#endif + 0 +}; + +XrmOptionDescRec options[] = { + { "-grid-size", ".gridSize", XrmoptionSepArg, 0 }, + { "-solve-delay", ".solveDelay", XrmoptionSepArg, 0 }, + { "-pre-delay", ".preDelay", XrmoptionSepArg, 0 }, + { "-post-delay", ".postDelay", XrmoptionSepArg, 0 }, + { "-live-color", ".liveColor", XrmoptionSepArg, 0 }, + { "-dead-color", ".deadColor", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +#ifdef XROGER +extern void skull (Display *, Window, GC, GC, int, int, int, int); +#endif + +void +screenhack(Display *display, Window window) +{ + Pixmap gray; + int size, root; + XWindowAttributes xgwa; + unsigned long bg, fg, pfg, pbg, lfg; + + size = get_integer_resource ("gridSize", "Dimension"); + root = get_boolean_resource("root", "Boolean"); + solve_delay = get_integer_resource ("solveDelay", "Integer"); + pre_solve_delay = get_integer_resource ("preDelay", "Integer"); + post_solve_delay = get_integer_resource ("postDelay", "Integer"); + + if (size < 2) size = 7 + (random () % 30); + grid_width = grid_height = size; + bw = (size > 6 ? 3 : (size-1)/2); + + dpy = display; win = window; /* the maze stuff uses global variables */ + + XGetWindowAttributes (dpy, win, &xgwa); + + x = 0; + y = 0; + + set_maze_sizes (xgwa.width, xgwa.height); + + if (! root) + XSelectInput (dpy, win, ExposureMask|ButtonPressMask|StructureNotifyMask); + + gc = XCreateGC(dpy, win, 0, 0); + cgc = XCreateGC(dpy, win, 0, 0); + tgc = XCreateGC(dpy,win,0,0); + logo_gc = XCreateGC(dpy, win, 0, 0); + + gray = XCreateBitmapFromData (dpy,win,gray1_bits,gray1_width,gray1_height); + + bg = get_pixel_resource ("background","Background", dpy, xgwa.colormap); + fg = get_pixel_resource ("foreground","Foreground", dpy, xgwa.colormap); + lfg = get_pixel_resource ("logoColor", "Foreground", dpy, xgwa.colormap); + pfg = get_pixel_resource ("liveColor", "Foreground", dpy, xgwa.colormap); + pbg = get_pixel_resource ("deadColor", "Foreground", dpy, xgwa.colormap); + if (mono_p) lfg = pfg = fg; + + if (lfg == bg) + lfg = ((bg == WhitePixel (dpy, DefaultScreen (dpy))) + ? BlackPixel (dpy, DefaultScreen (dpy)) + : WhitePixel (dpy, DefaultScreen (dpy))); + + XSetForeground (dpy, gc, fg); + XSetBackground (dpy, gc, bg); + XSetForeground (dpy, cgc, pbg); + XSetBackground (dpy, cgc, bg); + XSetForeground (dpy, tgc, pfg); + XSetBackground (dpy, tgc, bg); + XSetForeground (dpy, logo_gc, lfg); + XSetBackground (dpy, logo_gc, bg); + + XSetStipple (dpy, cgc, gray); + XSetFillStyle (dpy, cgc, FillOpaqueStippled); + +#ifdef XROGER + { + int w, h; + XGCValues gcv; + GC draw_gc, erase_gc; + /* round up to grid size */ + w = ((logo_width / grid_width) + 1) * grid_width; + h = ((logo_height / grid_height) + 1) * grid_height; + logo_map = XCreatePixmap (dpy, win, w, h, 1); + gcv.foreground = 1L; + draw_gc = XCreateGC (dpy, logo_map, GCForeground, &gcv); + gcv.foreground = 0L; + erase_gc= XCreateGC (dpy, logo_map, GCForeground, &gcv); + XFillRectangle (dpy, logo_map, erase_gc, 0, 0, w, h); + skull (dpy, logo_map, draw_gc, erase_gc, 5, 0, w-10, h-10); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); + } +#else + if (!(logo_map = XCreateBitmapFromData (dpy, win, logo_bits, + logo_width, logo_height))) + { + fprintf (stderr, "Can't create logo pixmap\n"); + exit (1); + } +#endif + XMapRaised(dpy, win); + srandom(getpid()); + + restart = root; + + while (1) { /* primary execution loop [ rhess ] */ + if (check_events()) continue ; + if (restart || stop) goto pop; + switch (state) { + case 1: + initialize_maze(); + break; + case 2: + XClearWindow(dpy, win); + draw_maze_border(); + break; + case 3: + create_maze(); + break; + case 4: + XSync (dpy, False); + usleep (pre_solve_delay); + break; + case 5: + solve_maze(); + break; + case 6: + XSync (dpy, False); + usleep (post_solve_delay); + state = 0 ; + break; + default: + abort (); + } + ++state; + pop: + if (restart) + { + static XWindowAttributes wattr; + restart = 0; + stop = 0; + state = 1; + XGetWindowAttributes (dpy, win, &wattr); + set_maze_sizes (wattr.width, wattr.height); + XClearWindow (dpy, win); + XSync (dpy, False); + } + } +} diff --git a/local/man/man.1/maze.1 b/hacks/maze.man similarity index 100% rename from local/man/man.1/maze.1 rename to hacks/maze.man diff --git a/hacks/moire.c b/hacks/moire.c new file mode 100644 index 00000000..7d9798c2 --- /dev/null +++ b/hacks/moire.c @@ -0,0 +1,193 @@ +/* xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * Concept snarfed from Michael D. Bayne in + * http://www.go2net.com/internet/deep/1997/04/16/body.html + */ + +#include "screenhack.h" +#include +#include + +int offset = 0; +XColor *colors = 0; +int ncolors = 0; +GC gc = 0; +unsigned long fg_pixel = 0; +unsigned long bg_pixel = 0; + +static void +init_moire (Display *dpy, Window window) +{ + int oncolors; + int i; + int fgh, bgh; + double fgs, fgv, bgs, bgv; + XWindowAttributes xgwa; + XColor fgc, bgc; + XGCValues gcv; + XGetWindowAttributes (dpy, window, &xgwa); + + offset = get_integer_resource ("offset", "Integer"); + if (offset < 2) offset = 2; + + MONO: + if (colors) + { + for (i = 0; i < ncolors; i++) + XFreeColors (dpy, xgwa.colormap, &colors[i].pixel, 1, 0); + free(colors); + colors = 0; + } + + if (mono_p) + { + fg_pixel = WhitePixelOfScreen (DefaultScreenOfDisplay(dpy)); + bg_pixel = BlackPixelOfScreen (DefaultScreenOfDisplay(dpy)); + } + else + { + fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, + xgwa.colormap); + bg_pixel = get_pixel_resource ("background", "Background", dpy, + xgwa.colormap); + } + + if (mono_p) + { + offset *= 20; /* compensate for lack of shading */ + gcv.foreground = fg_pixel; + } + else + { + ncolors = get_integer_resource ("ncolors", "Integer"); + if (ncolors < 2) ncolors = 2; + oncolors = ncolors; + + fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue; + if (get_boolean_resource("random","Boolean")) + { + fgc.red = random() & 0xFFFF; + fgc.green = random() & 0xFFFF; + fgc.blue = random() & 0xFFFF; + bgc.red = random() & 0xFFFF; + bgc.green = random() & 0xFFFF; + bgc.blue = random() & 0xFFFF; + } + else + { + fgc.pixel = fg_pixel; + bgc.pixel = bg_pixel; + XQueryColor (dpy, xgwa.colormap, &fgc); + XQueryColor (dpy, xgwa.colormap, &bgc); + } + rgb_to_hsv (fgc.red, fgc.green, fgc.blue, &fgh, &fgs, &fgv); + rgb_to_hsv (bgc.red, bgc.green, bgc.blue, &bgh, &bgs, &bgv); + + colors = (XColor *) malloc (sizeof (XColor) * (ncolors+2)); + memset(colors, 0, (sizeof (XColor) * (ncolors+2))); + make_color_ramp (dpy, xgwa.colormap, + fgh, fgs, fgv, bgh, bgs, bgv, + colors, &ncolors, + True, True, False); + if (ncolors != oncolors) + fprintf(stderr, "%s: got %d of %d requested colors.\n", + progname, ncolors, oncolors); + + if (ncolors <= 2) + { + mono_p = True; + goto MONO; + } + + gcv.foreground = colors[0].pixel; + } + gc = XCreateGC (dpy, window, GCForeground, &gcv); +} + + +static void +moire (Display *dpy, Window window, int offset, XColor *colors, int ncolors) +{ + long x, y, xo, yo; + int factor = (random() % offset) + 1; + XGCValues gcv; + XWindowAttributes xgwa; + XImage *image; + int depth; + XGetWindowAttributes (dpy, window, &xgwa); + + xo = (random() % xgwa.width) - xgwa.width/2; + yo = (random() % xgwa.height) - xgwa.height/2; + + depth = visual_depth(DefaultScreenOfDisplay(dpy), xgwa.visual); + image = XCreateImage (dpy, xgwa.visual, + depth, ZPixmap, 0, /* depth, format, offset */ + 0, xgwa.width, 1, 8, 0); /* data, w, h, pad, bpl */ + + image->data = (char *) malloc (((xgwa.width + 1) * depth / 8) + * 2 /* uh, I dunno... */ + ); + + for (y = 0; y < xgwa.height; y++) + { + for (x = 0; x < xgwa.width; x++) + { + double xx = x + xo; + double yy = y + yo; + double i = ((xx * xx) + (yy * yy)) / (double) factor; + if (mono_p) + gcv.foreground = ((((long) i) & 1) ? fg_pixel : bg_pixel); + else + gcv.foreground = colors[((long) i) % ncolors].pixel; + XPutPixel (image, x, 0, gcv.foreground); + } + XPutImage (dpy, window, gc, image, 0, 0, 0, y, xgwa.width, 1); + XSync(dpy, False); + } + if (image->data) free(image->data); + image->data = 0; + XDestroyImage (image); +} + + +char *progclass = "Moire"; + +char *defaults [] = { + "Moire.background: blue", /* to placate SGI */ + "Moire.foreground: red", + "*random: true", + "*delay: 5", + "*ncolors: 64", + "*offset: 50", + 0 +}; + +XrmOptionDescRec options [] = { + { "-random", ".random", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-offset", ".offset", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + int delay = get_integer_resource ("delay", "Integer"); + while (1) + { + init_moire (dpy, window); + moire (dpy, window, offset, colors, ncolors); + XSync (dpy, True); + if (delay) + sleep(delay); + } +} diff --git a/local/man/man.1/moire.1 b/hacks/moire.man similarity index 100% rename from local/man/man.1/moire.1 rename to hacks/moire.man diff --git a/hacks/munch.c b/hacks/munch.c new file mode 100644 index 00000000..d1f2ea6b --- /dev/null +++ b/hacks/munch.c @@ -0,0 +1,256 @@ +/* munch.c + * A munching squares implementation for X + * Tim Showalter + * + * Copyright 1997, Tim Showalter + * Permission is granted to copy, modify, and use this as long + * as this notice remains intact. No warranties are expressed or implied. + * CMU Sucks. + * + * Some code stolen from / This is meant to work with + * xscreensaver, Copyright (c) 1992, 1995, 1996 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Munching Squares is this simplistic, silly screen hack (according + to HAKMEM, discovered by Jackson Wright in 1962) where you take + Y = X XOR T and graph it over and over. According to HAKMEM, it + takes 5 instructions of PDP-1 assembly. This is a little more + complicated than that, mostly X's fault, but it does some other + random things. + + http://www.inwap.com/pdp10/hbaker/hakmem/hacks.html#item146 + */ + +#include +/*#include */ +#include "screenhack.h" + +/* flags for random things. Must be < log2(random's maximum), incidentially. + */ +#define SHIFT_KX (0x01) +#define SHIFT_KT (0x02) +#define SHIFT_KY (0x04) +#define GRAV (0x08) + +char *progclass = "Munch"; + +char *defaults [] = { + "Munch.background: black", /* to placate SGI */ + "Munch.foreground: white", + "*delay: 5000", + "*hold: 100000", + "*clear: 50", + "*logminwidth: 7", + "*shift: True", + "*xor: True", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-hold", ".hold", XrmoptionSepArg, 0 }, + { "-clear", ".clear", XrmoptionSepArg, "true" }, + { "-shift", ".shift", XrmoptionNoArg, "true" }, + { "-no-shift", ".shift", XrmoptionNoArg, "false" }, + { "-logminwidth", ".logminwidth", XrmoptionSepArg, 0 }, + { "-xor", ".xor", XrmoptionNoArg, "true" }, + { "-no-xor", ".xor", XrmoptionNoArg, "false" }, + { 0, 0, 0, 0 } +}; + + +static GC gc; +/* only configurable things right now */ +static int delay, hold, clear, logminwidth, shiftk, xor; + +static void munchOnce (Display* dpy, Window w, + int width, /* pixels */ + int atX, int atY, /* pixels */ + int kX, int kT, int kY, /* pixels */ + int grav /* 0 or not */) { + + int x, y, t; + static Colormap cmap; + XWindowAttributes xgwa; + XColor fgc; + int drawX, drawY; + + /* + fprintf(stderr,"Doing width %d at %d %d shift %d %d %d grav %d\n", + width, atX, atY, kX, kT, kY, grav); + */ + + XGetWindowAttributes (dpy, w, &xgwa); + + if (!mono_p) { + /* XXX there are probably bugs with this. */ + cmap = xgwa.colormap; + + fgc.red = random() % 65535; + fgc.green = random() % 65535; + fgc.blue = random() % 65535; + + if (XAllocColor(dpy, cmap, &fgc)) { + XSetForeground(dpy, gc, fgc.pixel); + } + } + + /* Finally draw this munching square. */ + for(t = 0; t < width; t++) { + for(x = 0; x < width; x++) { + /* figure out the next point */ + y = ((x ^ ((t + kT) % width)) + kY) % width; + + drawX = ((x + kX) % width) + atX; + drawY = (grav ? y + atY : atY + width - 1 - y); + + /* used to be bugs where it would draw partially offscreen. + while that might be a pretty feature, I didn't want it to do + that yet. if these trigger, please let me know. + */ +/* assert(drawX >= 0 && drawX < xgwa.width); + assert(drawY >= 0 && drawY < xgwa.height); +*/ + + XDrawPoint(dpy, w, gc, drawX, drawY); + /* XXX may want to change this to XDrawPoints, + but it's fast enough without it for the moment. */ + + } + + /* we've drawn one pass' worth of points. let the server catch up + or this won't be interesting to watch at all. we call this here + in the hopes of having one whole sequence of dots appear at the + same time (one for each value of x, surprisingly enough) + */ + XSync(dpy, False); + if (delay) usleep(delay); + } +} + +/* + * dumb way to get # of digits in number. Probably faster than actually + * doing a log and a division, maybe. + */ +static int dumb_log_2(int k) { + int r = -1; + while (k > 0) { + k >>= 1; r++; + } + return r; +} + +/* This parses arguments, initializes the window, etc., and finally starts + * calling munchOnce ad infinitum. + */ +void +screenhack (dpy, w) Display *dpy; Window w; +{ + int logmaxwidth; + int maxwidth; + XWindowAttributes xgwa; + Colormap cmap; + XGCValues gcv; + int n = 0; /* number of squares before we have to clear */ + int randflags; + int thiswidth; + + /* get the dimensions of the window */ + XGetWindowAttributes (dpy, w, &xgwa); + + /* We need a square; limit on screen size? */ + /* we want a power of 2 for the width or the munch doesn't fill up. + */ + logmaxwidth = (int) + dumb_log_2(xgwa.height < xgwa.width ? xgwa.height : xgwa.width); + + maxwidth = 1 << logmaxwidth; + + if (logmaxwidth < logminwidth) { + /* off-by-one error here? Anyone running on < 640x480? */ + fprintf(stderr, "munch: screen too small; use -logminwidth\n"); + fprintf(stderr, "\t(width is %d; log is %d; log must be at least " + "%d)\n", + (xgwa.height < xgwa.width ? xgwa.height : xgwa.width), + logmaxwidth, logminwidth); + exit(0); + } + + /* create the gc */ + cmap = xgwa.colormap; + gcv.foreground= get_pixel_resource("foreground","Foreground", + dpy, cmap); + gcv.background= get_pixel_resource("background","Background", + dpy, cmap); + + gc = XCreateGC(dpy, w, GCForeground|GCBackground, &gcv); + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + hold = get_integer_resource ("hold", "Integer"); + if (hold < 0) hold = 0; + + clear = get_integer_resource ("clear", "Integer"); + if (clear < 0) clear = 0; + + logminwidth = get_integer_resource ("logminwidth", "Integer"); + if (logminwidth < 2) logminwidth = 2; + + shiftk = get_boolean_resource("shift", "Boolean"); + + xor = get_boolean_resource("xor", "Boolean"); + + /* always draw xor on mono. */ + if (mono_p || xor) { + XSetFunction(dpy, gc, GXxor); + } + + for(;;) { + /* saves some calls to random. big deal */ + randflags = random(); + + /* choose size -- power of two */ + thiswidth = 1 << (logminwidth + + (random() % (1 + logmaxwidth - logminwidth))); + + munchOnce(dpy, w, + thiswidth, /* Width, in pixels */ + + /* draw at this location */ + (random() % (xgwa.width <= thiswidth ? 1 + : xgwa.width - thiswidth)), + (random() % (xgwa.height <= thiswidth ? 1 + : xgwa.width - thiswidth)), + + /* wrap-around by these values; no need to % + as we end up doing that later anyway*/ + ((shiftk && (randflags & SHIFT_KX)) + ? (random() % thiswidth) : 0), + ((shiftk && (randflags & SHIFT_KT)) + ? (random() % thiswidth) : 0), + ((shiftk && (randflags & SHIFT_KY)) + ? (random() % thiswidth) : 0), + + /* set the gravity of the munch, or rather, + which direction we draw stuff in. */ + (randflags & GRAV) + ); + + if (hold) usleep(hold); + + if (clear && ++n >= clear) { + XClearWindow(dpy, w); + n = 0; + } + } +} diff --git a/local/man/man.1/munch.1 b/hacks/munch.man similarity index 100% rename from local/man/man.1/munch.1 rename to hacks/munch.man diff --git a/hacks/noseguy.c b/hacks/noseguy.c new file mode 100644 index 00000000..a84ee6b6 --- /dev/null +++ b/hacks/noseguy.c @@ -0,0 +1,720 @@ +/* xscreensaver, Copyright (c) 1992, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Make a little guy with a big nose and a hat wanter around the screen, + spewing out messages. Derived from xnlock by Dan Heller . + */ + +#include "screenhack.h" +#include + +extern FILE *popen (const char *, const char *); +extern int pclose (FILE *); + +#define font_height(font) (font->ascent + font->descent) +#define FONT_NAME "-*-times-*-*-*-*-18-*-*-*-*-*-*-*" + +static Display *dpy; +static Window window; +static int Width, Height; +static GC fg_gc, bg_gc, text_fg_gc, text_bg_gc; +static char *words; +static char *get_words (void); +static int x, y; +static XFontStruct *font; +static char *def_words = "I'm out running around."; +static void walk (int dir); +static void talk (int erase); +static void talk_1 (void); +static int think (void); +static unsigned long interval; +static unsigned long look (void); +static Pixmap left1, left2, right1, right2; +static Pixmap left_front, right_front, front, down; + +static char *program, *orig_program, *filename, *text; + +#define FROM_ARGV 1 +#define FROM_PROGRAM 2 +#define FROM_FILE 3 +#define FROM_RESRC 4 +static int getwordsfrom; + +#define IS_MOVING 1 +#define GET_PASSWD 2 +static int state; /* indicates states: walking or getting passwd */ + +static void (*next_fn) (void); + +#ifdef HAVE_XPM +# include + +# include "noses/nose-f1.xpm" +# include "noses/nose-f2.xpm" +# include "noses/nose-f3.xpm" +# include "noses/nose-f4.xpm" +# include "noses/nose-l1.xpm" +# include "noses/nose-l2.xpm" +# include "noses/nose-r1.xpm" +# include "noses/nose-r2.xpm" +#else +# include "noses/nose-f1.xbm" +# include "noses/nose-f2.xbm" +# include "noses/nose-f3.xbm" +# include "noses/nose-f4.xbm" +# include "noses/nose-l1.xbm" +# include "noses/nose-l2.xbm" +# include "noses/nose-r1.xbm" +# include "noses/nose-r2.xbm" +#endif + +static void +init_images (void) +{ + static Pixmap *images[] = { + &left1, &left2, &right1, &right2, + &left_front, &right_front, &front, &down + }; + int i; +#ifdef HAVE_XPM + static char **bits[] = { + nose_l1_xpm, nose_l2_xpm, nose_r1_xpm, nose_r2_xpm, + nose_f2_xpm, nose_f3_xpm, nose_f1_xpm, nose_f4_xpm + }; + for (i = 0; i < sizeof (images) / sizeof(*images); i++) + { + XWindowAttributes xgwa; + XpmAttributes xpmattrs; + Pixmap pixmap = 0; + int result; + xpmattrs.valuemask = 0; + + XGetWindowAttributes (dpy, window, &xgwa); + +# ifdef XpmCloseness + xpmattrs.valuemask |= XpmCloseness; + xpmattrs.closeness = 40000; +# endif +# ifdef XpmVisual + xpmattrs.valuemask |= XpmVisual; + xpmattrs.visual = xgwa.visual; +# endif +# ifdef XpmDepth + xpmattrs.valuemask |= XpmDepth; + xpmattrs.depth = xgwa.depth; +# endif +# ifdef XpmColormap + xpmattrs.valuemask |= XpmColormap; + xpmattrs.colormap = xgwa.colormap; +# endif + + result = XpmCreatePixmapFromData(dpy, window, bits[i], + &pixmap, 0 /* mask */, &xpmattrs); + if (!pixmap || (result != XpmSuccess && result != XpmColorError)) + { + fprintf (stderr, "%s: Can't load nose images\n", progname); + exit (1); + } + *images[i] = pixmap; + } +#else + static unsigned char *bits[] = { + nose_l1_bits, nose_l2_bits, nose_r1_bits, nose_r2_bits, + nose_f2_bits, nose_f3_bits, nose_f1_bits, nose_f4_bits + }; + + for (i = 0; i < sizeof (images) / sizeof(*images); i++) + if (!(*images[i] = + XCreatePixmapFromBitmapData(dpy, window, + (char *) bits[i], 64, 64, 1, 0, 1))) + { + fprintf (stderr, "%s: Can't load nose images\n", progname); + exit (1); + } +#endif +} + +#define LEFT 001 +#define RIGHT 002 +#define DOWN 004 +#define UP 010 +#define FRONT 020 +#define X_INCR 3 +#define Y_INCR 2 + +static void +move (void) +{ + static int length, + dir; + + if (!length) + { + register int tries = 0; + dir = 0; + if ((random() & 1) && think()) + { + talk(0); /* sets timeout to itself */ + return; + } + if (!(random() % 3) && (interval = look())) + { + next_fn = move; + return; + } + interval = 20 + random() % 100; + do + { + if (!tries) + length = Width / 100 + random() % 90, tries = 8; + else + tries--; + switch (random() % 8) + { + case 0: + if (x - X_INCR * length >= 5) + dir = LEFT; + break; + case 1: + if (x + X_INCR * length <= Width - 70) + dir = RIGHT; + break; + case 2: + if (y - (Y_INCR * length) >= 5) + dir = UP, interval = 40; + break; + case 3: + if (y + Y_INCR * length <= Height - 70) + dir = DOWN, interval = 20; + break; + case 4: + if (x - X_INCR * length >= 5 && y - (Y_INCR * length) >= 5) + dir = (LEFT | UP); + break; + case 5: + if (x + X_INCR * length <= Width - 70 && + y - Y_INCR * length >= 5) + dir = (RIGHT | UP); + break; + case 6: + if (x - X_INCR * length >= 5 && + y + Y_INCR * length <= Height - 70) + dir = (LEFT | DOWN); + break; + case 7: + if (x + X_INCR * length <= Width - 70 && + y + Y_INCR * length <= Height - 70) + dir = (RIGHT | DOWN); + break; + default: + /* No Defaults */ + break; + } + } while (!dir); + } + walk(dir); + --length; + next_fn = move; +} + +#ifdef HAVE_XPM +# define COPY(dpy,frame,window,gc,x,y,w,h,x2,y2) \ + XCopyArea (dpy,frame,window,gc,x,y,w,h,x2,y2) +#else +# define COPY(dpy,frame,window,gc,x,y,w,h,x2,y2) \ + XCopyPlane(dpy,frame,window,gc,x,y,w,h,x2,y2,1L) +#endif + +static void +walk(int dir) +{ + register int incr = 0; + static int lastdir; + static int up = 1; + static Pixmap frame; + + if (dir & (LEFT | RIGHT)) + { /* left/right movement (mabye up/down too) */ + up = -up; /* bouncing effect (even if hit a wall) */ + if (dir & LEFT) + { + incr = X_INCR; + frame = (up < 0) ? left1 : left2; + } + else + { + incr = -X_INCR; + frame = (up < 0) ? right1 : right2; + } + if ((lastdir == FRONT || lastdir == DOWN) && dir & UP) + { + + /* + * workaround silly bug that leaves screen dust when guy is + * facing forward or down and moves up-left/right. + */ + COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y); + XFlush(dpy); + } + /* note that maybe neither UP nor DOWN is set! */ + if (dir & UP && y > Y_INCR) + y -= Y_INCR; + else if (dir & DOWN && y < Height - 64) + y += Y_INCR; + } + /* Explicit up/down movement only (no left/right) */ + else if (dir == UP) + COPY(dpy, front, window, fg_gc, 0, 0, 64, 64, x, y -= Y_INCR); + else if (dir == DOWN) + COPY(dpy, down, window, fg_gc, 0, 0, 64, 64, x, y += Y_INCR); + else if (dir == FRONT && frame != front) + { + if (up > 0) + up = -up; + if (lastdir & LEFT) + frame = left_front; + else if (lastdir & RIGHT) + frame = right_front; + else + frame = front; + COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y); + } + if (dir & LEFT) + while (--incr >= 0) + { + COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, --x, y + up); + XFlush(dpy); + } + else if (dir & RIGHT) + while (++incr <= 0) + { + COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, ++x, y + up); + XFlush(dpy); + } + lastdir = dir; +} + +static int +think (void) +{ + if (random() & 1) + walk(FRONT); + if (random() & 1) + { + if (getwordsfrom == FROM_PROGRAM) + words = get_words(); + return 1; + } + return 0; +} + +#define MAXLINES 40 + +static void +talk(int force_erase) +{ + int width = 0, + height, + Z, + total = 0; + static int X, + Y, + talking; + static struct + { + int x, + y, + width, + height; + } s_rect; + register char *p, + *p2; + char buf[BUFSIZ], + args[MAXLINES][256]; + + /* clear what we've written */ + if (talking || force_erase) + { + if (!talking) + return; + XFillRectangle(dpy, window, bg_gc, s_rect.x - 5, s_rect.y - 5, + s_rect.width + 10, s_rect.height + 10); + talking = 0; + if (!force_erase) + next_fn = move; + interval = 0; + { + /* might as well check the window for size changes now... */ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + } + return; + } + talking = 1; + walk(FRONT); + p = strcpy(buf, words); + + if (!(p2 = strchr(p, '\n')) || !p2[1]) + { + total = strlen (words); + strcpy (args[0], words); + width = XTextWidth(font, words, total); + height = 0; + } + else + /* p2 now points to the first '\n' */ + for (height = 0; p; height++) + { + int w; + *p2 = 0; + if ((w = XTextWidth(font, p, p2 - p)) > width) + width = w; + total += p2 - p; /* total chars; count to determine reading + * time */ + (void) strcpy(args[height], p); + if (height == MAXLINES - 1) + { + puts("Message too long!"); + break; + } + p = p2 + 1; + if (!(p2 = strchr(p, '\n'))) + break; + } + height++; + + /* + * Figure out the height and width in pixels (height, width) extend the + * new box by 15 pixels on the sides (30 total) top and bottom. + */ + s_rect.width = width + 30; + s_rect.height = height * font_height(font) + 30; + if (x - s_rect.width - 10 < 5) + s_rect.x = 5; + else if ((s_rect.x = x + 32 - (s_rect.width + 15) / 2) + + s_rect.width + 15 > Width - 5) + s_rect.x = Width - 15 - s_rect.width; + if (y - s_rect.height - 10 < 5) + s_rect.y = y + 64 + 5; + else + s_rect.y = y - 5 - s_rect.height; + + XFillRectangle(dpy, window, text_bg_gc, + s_rect.x, s_rect.y, s_rect.width, s_rect.height); + + /* make a box that's 5 pixels thick. Then add a thin box inside it */ + XSetLineAttributes(dpy, text_fg_gc, 5, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x, s_rect.y, s_rect.width - 1, s_rect.height - 1); + XSetLineAttributes(dpy, text_fg_gc, 0, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x + 7, s_rect.y + 7, s_rect.width - 15, s_rect.height - 15); + + X = 15; + Y = 15 + font_height(font); + + /* now print each string in reverse order (start at bottom of box) */ + for (Z = 0; Z < height; Z++) + { + XDrawString(dpy, window, text_fg_gc, s_rect.x + X, s_rect.y + Y, + args[Z], strlen(args[Z])); + Y += font_height(font); + } + interval = (total / 15) * 1000; + if (interval < 2000) interval = 2000; + next_fn = talk_1; +} + +static void talk_1 (void) +{ + talk(0); +} + + +static unsigned long +look (void) +{ + if (random() % 3) + { + COPY(dpy, (random() & 1) ? down : front, window, fg_gc, + 0, 0, 64, 64, x, y); + return 1000L; + } + if (!(random() % 5)) + return 0; + if (random() % 3) + { + COPY(dpy, (random() & 1) ? left_front : right_front, + window, fg_gc, 0, 0, 64, 64, x, y); + return 1000L; + } + if (!(random() % 5)) + return 0; + COPY(dpy, (random() & 1) ? left1 : right1, window, fg_gc, + 0, 0, 64, 64, x, y); + return 1000L; +} + + +static void +init_words (void) +{ + char *mode = get_string_resource ("mode", "Mode"); + + program = get_string_resource ("program", "Program"); + filename = get_string_resource ("filename", "Filename"); + text = get_string_resource ("text", "Text"); + + if (program) /* get stderr on stdout, so it shows up on the window */ + { + orig_program = program; + program = (char *) malloc (strlen (program) + 10); + strcpy (program, "( "); + strcat (program, orig_program); + strcat (program, " ) 2>&1"); + } + + if (!mode || !strcmp (mode, "program")) + getwordsfrom = FROM_PROGRAM; + else if (!strcmp (mode, "file")) + getwordsfrom = FROM_FILE; + else if (!strcmp (mode, "string")) + getwordsfrom = FROM_RESRC; + else + { + fprintf (stderr, + "%s: mode must be program, file, or string, not %s\n", + progname, mode); + exit (1); + } + + if (getwordsfrom == FROM_PROGRAM && !program) + { + fprintf (stderr, "%s: no program specified.\n", progname); + exit (1); + } + if (getwordsfrom == FROM_FILE && !filename) + { + fprintf (stderr, "%s: no file specified.\n", progname); + exit (1); + } + + words = get_words(); +} + +static int first_time = 1; + +static char * +get_words (void) +{ + FILE *pp; + static char buf[BUFSIZ]; + register char *p = buf; + + buf[0] = '\0'; + + switch (getwordsfrom) + { + case FROM_PROGRAM: +#ifndef VMS + if ((pp = popen(program, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) pclose(pp); + if (! buf[0]) + sprintf (buf, "\"%s\" produced no output!", orig_program); + else if (!first_time && + (strstr (buf, ": not found") || + strstr (buf, ": Not found"))) + switch (random () % 20) + { + case 1: strcat (buf, "( Get with the program, bub. )\n"); + break; + case 2: strcat (buf, + "( I blow my nose at you, you silly person! ) \n"); break; + case 3: strcat (buf, + "\nThe resource you want to\nset is `noseguy.program'\n"); + break; + case 4: + strcat(buf,"\nHelp!! Help!!\nAAAAAAGGGGHHH!! \n\n"); break; + case 5: strcpy (buf, "You have new mail.\n"); break; + case 6: + strcat(buf,"( Hello? Are you paying attention? )\n");break; + case 7: + strcat (buf, "sh: what kind of fool do you take me for? \n"); + break; + } + first_time = 0; + p = buf; + } + else + { + perror(program); + p = def_words; + } + break; +#endif /* VMS */ + case FROM_FILE: + if ((pp = fopen(filename, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) fclose(pp); + if (! buf[0]) + sprintf (buf, "file \"%s\" is empty!", filename); + p = buf; + } + else + { + sprintf (buf, "couldn't read file \"%s\"!", filename); + p = buf; + } + break; + case FROM_RESRC: + p = text; + break; + default: + p = def_words; + break; + } + + if (!p || *p == '\0') + p = def_words; + return p; +} + + + +char *progclass = "Noseguy"; + +char *defaults [] = { + "Noseguy.background: black", /* to placate SGI */ + "Noseguy.foreground: gray80", +#ifndef VMS + "*mode: program", +#else + "*mode: string", +#endif + "*program: " ZIPPY_PROGRAM, + "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-program", ".program", XrmoptionSepArg, 0 }, + { "-text", ".text", XrmoptionSepArg, 0 }, + { "-filename", ".filename", XrmoptionSepArg, 0 }, + { "-font", ".font", XrmoptionSepArg, 0 }, + { "-text-foreground", ".textForeground", XrmoptionSepArg, 0 }, + { "-text-background", ".textBackground", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + + +static void +noseguy_init (Display *d, Window w) +{ + unsigned long fg, bg, text_fg, text_bg; + XWindowAttributes xgwa; + Colormap cmap; + char *fontname = get_string_resource ("font", "Font"); + char **list; + int foo, i; + XGCValues gcvalues; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + cmap = xgwa.colormap; + + init_words(); + init_images(); + + if (!fontname || !(font = XLoadQueryFont(dpy, fontname))) + { + list = XListFonts(dpy, FONT_NAME, 32767, &foo); + for (i = 0; i < foo; i++) + if ((font = XLoadQueryFont(dpy, list[i]))) + break; + if (!font) + { + fprintf (stderr, "%s: Can't find a large font.", progname); + exit (1); + } + XFreeFontNames(list); + } + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + text_fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + text_bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + /* notice when unspecified */ + if (! get_string_resource ("textForeground", "Foreground")) + text_fg = bg; + if (! get_string_resource ("textBackground", "Background")) + text_bg = fg; + + gcvalues.font = font->fid; + gcvalues.graphics_exposures = False; + gcvalues.foreground = fg; + gcvalues.background = bg; + fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = bg; + gcvalues.background = fg; + bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_fg; + gcvalues.background = text_bg; + text_fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_bg; + gcvalues.background = text_fg; + text_bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + x = Width / 2; + y = Height / 2; + state = IS_MOVING; +} + +void +screenhack (Display *d, Window w) +{ + noseguy_init (d, w); + next_fn = move; + while (1) + { + next_fn(); + XSync (dpy, True); + usleep (interval * 1000); + } +} + diff --git a/local/man/man.1/noseguy.1 b/hacks/noseguy.man similarity index 100% rename from local/man/man.1/noseguy.1 rename to hacks/noseguy.man diff --git a/hacks/noses/nose-f1.xbm b/hacks/noses/nose-f1.xbm new file mode 100644 index 00000000..543af3e4 --- /dev/null +++ b/hacks/noses/nose-f1.xbm @@ -0,0 +1,38 @@ +#define nose_f1_width 64 +#define nose_f1_height 64 +static unsigned char nose_f1_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0xc0,0x1f,0x00,0x20,0x00,0x00,0x08,0x00,0x30,0x60,0x00,0x20,0x00, + 0x00,0xf8,0xff,0x0f,0x80,0xff,0x3f,0x00,0x00,0x00,0x02,0x02,0x00,0x82,0x00, + 0x00,0x00,0x00,0x03,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x08, + 0x01,0x00,0x00,0x80,0x80,0x00,0x00,0x08,0x02,0x00,0x00,0x80,0x40,0x00,0x00, + 0x10,0x02,0x00,0x00,0x40,0x40,0x00,0x00,0x10,0x04,0x00,0x00,0x40,0x20,0x00, + 0x00,0x20,0x04,0x00,0x00,0x60,0x20,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x20, + 0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x08,0x00,0x00,0x10, + 0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00, + 0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00, + 0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10, + 0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10,0x00,0x00,0x30,0x00,0x01,0x00,0x04, + 0x18,0x00,0x00,0x20,0x00,0x02,0x00,0x02,0x08,0x00,0x00,0x20,0x00,0x0c,0x80, + 0x01,0x08,0x00,0x00,0x60,0x00,0x30,0x60,0x00,0x0c,0x00,0x00,0x40,0x00,0xc0, + 0x1f,0x00,0x04,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xc0,0x0f,0x00,0x00,0x00, + 0x00,0x40,0x10,0x20,0x10,0x00,0x00,0x00,0x00,0x20,0x60,0x30,0x20,0x00,0x00, + 0x00,0x00,0x20,0xc0,0x18,0x20,0x00,0x00,0xc0,0x7f,0x10,0x80,0x0d,0x40,0xe0, + 0x01,0x70,0xc0,0x18,0x00,0x05,0x40,0x1c,0x06,0x10,0x00,0x0f,0x00,0x05,0x80, + 0x07,0x08,0x08,0x00,0x06,0x00,0x05,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x05, + 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80, + 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00, + 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00, + 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84, + 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08, + 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-f1.xpm b/hacks/noses/nose-f1.xpm new file mode 100644 index 00000000..a6e03bfb --- /dev/null +++ b/hacks/noses/nose-f1.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_f1_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXX. ", +" .................ooooooooooo............... ", +" .OOOOOOO.ooooooooooooooo.OOOOO. ", +" ..OOOOOO.ooooooooooooooooo.OOOO.. ", +" .OOOOOO.ooooooooooooooooooo.OOOO. ", +" .OOOOOOO.ooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooooo.OOOO. ", +" .OOOOOOO.ooooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooooooo.OOOO. ", +" ..OOOOOO.ooooooooooooooooooooooo.OOOO.. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOOOOO.ooooooooooooooooooo.OOOOOOOO. ", +" .OOOOOOOOOO.ooooooooooooooooooo.OOOOOOOO. ", +" ..OOOOOOOOOO.ooooooooooooooooo.OOOOOOOO.. ", +" .OOOOOOOOOOO.ooooooooooooooo.OOOOOOOOO. ", +" .OOOOOOOOOOOO..ooooooooooo..OOOOOOOOOO. ", +" ..OOOOOOOOOOOOO..ooooooo..OOOOOOOOOOO.. ", +" .OOOOOOOOOOOOOOO.......OOOOOOOOOOOOO. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ................................ ", +" ", +" ..... ...... ", +" .+++++. .++++++. ", +" .+++++++.. ..+++++++. ", +" .++++++++.. ..++++++++. ", +" ......... .++++++++++.. ..++++++++++. .... ", +" ...+++++++.. ..+++++++++++. .+++++++++++. ...++++.. ", +" .+++++++++++....@+++++++++++. .+++++++++++@....++++++++. ", +" .+++++++++++++..@@+++++++++++. .++++++++++@@..++++++++++. ", +" .+++++++++++++++..@++++++++++. .+++++++++@@..++++++++++++. ", +" .+++++++++++++++++..@+++++++++. .++++++++@..++++++++++++++. ", +" .++++++++++++++++++++++++++++. .+++++++..++++++++++++++++. ", +" .++++++++++++++++++++++++++++. .+++++++++++++++++++++++++. ", +" .+++++++++++++++++++++++++++. .++++++++++++++++++++++++. ", +" .+@.++++++++++++++++++++++++. .++++++++++++++++++++.+++. ", +" .+@.++++++++++++++++++++++++. .++++++++++++++++++++.@++. ", +" .+@@.+++++++++++++++++++++++. .+++++++++++++++++++.@@+. ", +" .++@@..+++++++++++++++++++++.. ..+++++++++++++++++..@@++. ", +" .++@@++++++++++++++++++++++@. .@++++++++++++++++++@@++. ", +" ..@@@@@@@@@@@@@@@@@@@@@@@@@. .@@@@@@@@@@@@@@@@@@@@@@. ", +" ........................... ....................... ", +" ", +" "}; diff --git a/hacks/noses/nose-f2.xbm b/hacks/noses/nose-f2.xbm new file mode 100644 index 00000000..6851b201 --- /dev/null +++ b/hacks/noses/nose-f2.xbm @@ -0,0 +1,38 @@ +#define nose_f2_width 64 +#define nose_f2_height 64 +static unsigned char nose_f2_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0xe0,0x0f,0x00,0x20,0x00,0x00,0x08,0x00,0x18,0x30,0x00,0x20,0x00, + 0x00,0xf8,0xff,0x07,0xc0,0xff,0x3f,0x00,0x00,0x00,0x02,0x01,0x00,0x81,0x00, + 0x00,0x00,0x00,0x83,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x41,0x00,0x00,0x04, + 0x01,0x00,0x00,0x80,0x40,0x00,0x00,0x04,0x02,0x00,0x00,0x80,0x20,0x00,0x00, + 0x08,0x02,0x00,0x00,0x40,0x20,0x00,0x00,0x08,0x04,0x00,0x00,0x40,0x10,0x00, + 0x00,0x10,0x04,0x00,0x00,0x60,0x10,0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x10, + 0x00,0x00,0x10,0x08,0x00,0x00,0x30,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10, + 0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00, + 0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00, + 0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x04,0x10, + 0x00,0x00,0x30,0x40,0x00,0x00,0x04,0x10,0x00,0x00,0x20,0x80,0x00,0x00,0x02, + 0x18,0x00,0x00,0x20,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x60,0x00,0x06,0xc0, + 0x00,0x08,0x00,0x00,0x80,0x00,0x18,0x30,0x00,0x0c,0x00,0x00,0x80,0x00,0xe0, + 0x0f,0x00,0x04,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00, + 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xe0,0x00,0x07,0x02,0x10,0x00,0x00, + 0x00,0x30,0x00,0x8c,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x90,0x00,0x20,0x00, + 0x00,0x00,0x04,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20, + 0x00,0x00,0x00,0x42,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x02, + 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x06,0x20,0x00,0x00,0x00,0x21,0x00,0x00, + 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x03,0x00, + 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00, + 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-f2.xpm b/hacks/noses/nose-f2.xpm new file mode 100644 index 00000000..3763b58d --- /dev/null +++ b/hacks/noses/nose-f2.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_f2_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXXX. ", +" ................ooooooooooo................ ", +" .OOOOOO.ooooooooooooooo.OOOOOO. ", +" ..OOOOO.ooooooooooooooooo.OOOOO.. ", +" .OOOOO.ooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooo.OOOOOO. ", +" .OOOOO.ooooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooooo.OOOOOO. ", +" .OOOOO.ooooooooooooooooooooooo.OOOOO. ", +" ..OOOOO.ooooooooooooooooooooooo.OOOOO.. ", +" .OOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" ..OOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOOO. ", +" ..OOOOOOOO.ooooooooooooooooooo.OOOOOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooo.OOOOOOOOO.. ", +" .OOOOOOOOOO.ooooooooooooooo.OOOOOOOOOO. ", +" ..OOOOOOOOOO..ooooooooooo..OOOOOOOOOOO. ", +" .OOOOOOOOOOO..ooooooo..OOOOOOOOOOOO.. ", +" .OOOOOOOOOOOOO.......OOOOOOOOOOOOOO. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ................................ ", +" ", +" ......... ", +" ........ .+++++++++. ", +" ...++++++++... .++++++++++. ", +" ..++++++++++++.. ..++++++++++++. ", +" ..++++++++++++++++. .@++++++++++++. ", +" .++++@..+++++++++++..@@++++++++++++. ", +" .++++..++++++++++++++..@++++++++++++. ", +" .+++@.+++++++++++++++++.@+++++++++++. ", +" .+++@.+++++++++++++++++++.@++++++++++. ", +" .+++@.+++++++++++++++++++..++++++++++. ", +" .+++@.+++++++++++++++++++++++++++++++. ", +" .++++++++++++++++++++++++++++++++++++@. ", +" ..@++++++++++++++++++++++++++++++++++@. ", +" .@@+++++++++++++++++++++++++++++++++@. ", +" .@@++++++++++++++++++++++++++++++++@@. ", +" .@@@++++++++++++++++++++++++++++++@. ", +" ..@@@++++++++++++++++++++@@@++++@@. ", +" ...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +" .............................. ", +" ", +" ", +" "}; diff --git a/hacks/noses/nose-f3.xbm b/hacks/noses/nose-f3.xbm new file mode 100644 index 00000000..e70f2293 --- /dev/null +++ b/hacks/noses/nose-f3.xbm @@ -0,0 +1,38 @@ +#define nose_f3_width 64 +#define nose_f3_height 64 +static unsigned char nose_f3_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0xf0,0x07,0x00,0x10,0x00,0x00,0x04,0x00,0x0c,0x18,0x00,0x10,0x00, + 0x00,0xfc,0xff,0x03,0xe0,0xff,0x1f,0x00,0x00,0x00,0x81,0x00,0x80,0x40,0x00, + 0x00,0x00,0x80,0x41,0x00,0x00,0xc1,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x82, + 0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x02,0x01,0x00,0x00,0x40,0x10,0x00,0x00, + 0x04,0x01,0x00,0x00,0x20,0x10,0x00,0x00,0x04,0x02,0x00,0x00,0x20,0x08,0x00, + 0x00,0x08,0x02,0x00,0x00,0x30,0x08,0x00,0x00,0x08,0x06,0x00,0x00,0x10,0x08, + 0x00,0x00,0x08,0x04,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x0c,0x00,0x00,0x08, + 0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00, + 0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00, + 0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x08, + 0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x0c,0x00,0x00,0x18,0x40,0x00,0x00,0x01, + 0x04,0x00,0x00,0x10,0x80,0x00,0x80,0x00,0x04,0x00,0x00,0x10,0x00,0x03,0x60, + 0x00,0x06,0x00,0x00,0x30,0x00,0x0c,0x18,0x00,0x01,0x00,0x00,0x20,0x00,0xf0, + 0x07,0x00,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x40,0x00, + 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0x40,0xe0,0x00,0x07,0x00, + 0x00,0x00,0x04,0x80,0x31,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x09,0x00,0x30, + 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x20,0x00,0x00,0x00,0x04,0x00,0x03,0x00, + 0x43,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x42,0x00,0x00,0x00,0x04,0x40,0x00, + 0x00,0x84,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00, + 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-f3.xpm b/hacks/noses/nose-f3.xpm new file mode 100644 index 00000000..c60c5f37 --- /dev/null +++ b/hacks/noses/nose-f3.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_f3_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXXX. ", +" ................ooooooooooo................ ", +" .OOOOOO.ooooooooooooooo.OOOOOO. ", +" ..OOOOO.ooooooooooooooooo.OOOOO.. ", +" .OOOOO.ooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooo.OOOOOO. ", +" .OOOOO.ooooooooooooooooooooo.OOOOO. ", +" .OOOOOO.ooooooooooooooooooooo.OOOOOO. ", +" .OOOOO.ooooooooooooooooooooooo.OOOOO. ", +" ..OOOOO.ooooooooooooooooooooooo.OOOOO.. ", +" .OOOOOO.ooooooooooooooooooooooo.OOOOOO. ", +" .OOOOOO.ooooooooooooooooooooooo.OOOOOO.. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO. ", +" .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOOO. ", +" .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOO.. ", +" ..OOOOOOOOO.ooooooooooooooooo.OOOOOOOOO. ", +" .OOOOOOOOOO.ooooooooooooooo.OOOOOOOOOO. ", +" .OOOOOOOOOOO..ooooooooooo..OOOOOOOOOO.. ", +" ..OOOOOOOOOOOO..ooooooo..OOOOOOOOOOO. ", +" .OOOOOOOOOOOOOO.......OOOOOOOOOOOOO. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ................................ ", +" ", +" ......... ", +" .+++++++++. ........ ", +" .++++++++++. ...++++++++... ", +" .++++++++++++.. ..++++++++++++.. ", +" .++++++++++++@. .++++++++++++++++.. ", +" .++++++++++++@@..+++++++++++..@++++. ", +" .++++++++++++@..++++++++++++++..++++. ", +" .+++++++++++@.+++++++++++++++++.@+++. ", +" .++++++++++@.+++++++++++++++++++.@+++. ", +" .++++++++++..+++++++++++++++++++.@+++. ", +" .+++++++++++++++++++++++++++++++.@+++. ", +" .@++++++++++++++++++++++++++++++++++++. ", +" .@++++++++++++++++++++++++++++++++++@.. ", +" .@+++++++++++++++++++++++++++++++++@@. ", +" .@@++++++++++++++++++++++++++++++++@@. ", +" .@++++++++++++++++++++++++++++++@@@. ", +" .@@++++@@@++++++++++++++++++++@@@.. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@... ", +" .............................. ", +" ", +" ", +" "}; diff --git a/hacks/noses/nose-f4.xbm b/hacks/noses/nose-f4.xbm new file mode 100644 index 00000000..024eead8 --- /dev/null +++ b/hacks/noses/nose-f4.xbm @@ -0,0 +1,38 @@ +#define nose_f4_width 64 +#define nose_f4_height 64 +static unsigned char nose_f4_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x1e,0x00, + 0x00,0x00,0x00,0x38,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, + 0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x40,0x00,0x00,0x00, + 0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x80, + 0x1f,0x00,0x40,0x00,0x00,0x08,0x00,0x60,0x60,0x00,0x80,0x00,0x00,0x08,0x00, + 0x10,0x80,0x00,0x80,0x00,0x00,0x04,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x04, + 0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x18,0x80,0x01,0x00,0x02,0x00, + 0x02,0x00,0x68,0x60,0x01,0x00,0x02,0x00,0x02,0x00,0x88,0x1f,0x01,0x00,0x02, + 0x00,0x02,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x10,0x80,0x00,0x00, + 0x03,0x00,0x06,0x00,0x60,0x60,0x00,0x80,0x02,0x00,0x0c,0x00,0x80,0x1f,0x00, + 0x40,0x01,0x00,0x14,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00, + 0x00,0x90,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0xa0,0x01,0x00, + 0x00,0x00,0x26,0x00,0x00,0x40,0x1e,0x00,0x00,0xc0,0x11,0x00,0x00,0x80,0xe1, + 0x03,0x00,0x3c,0x0c,0x00,0x00,0x00,0x0e,0xfc,0xff,0x83,0x03,0x00,0x00,0x00, + 0xf0,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x00, + 0x00,0x80,0x03,0x00,0x0c,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x14,0x00,0x00, + 0x00,0x00,0x60,0x04,0x00,0x12,0x00,0x00,0xc0,0x7f,0x10,0x04,0x00,0x22,0xe0, + 0x01,0x70,0xc0,0x18,0x08,0x00,0x61,0x1c,0x06,0x10,0x00,0x0f,0x30,0xc0,0x80, + 0x07,0x08,0x08,0x00,0x06,0xc0,0x3f,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x02, + 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80, + 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00, + 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00, + 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84, + 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08, + 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-f4.xpm b/hacks/noses/nose-f4.xpm new file mode 100644 index 00000000..faa52e03 --- /dev/null +++ b/hacks/noses/nose-f4.xpm @@ -0,0 +1,73 @@ +/* XPM */ +static char * nose_f4_xpm[] = { +"64 64 6 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ............... ", +" ....XXXXXXXXXXXXXXX.... ", +" ...XXXXXXXXXXXXXXXXXXXXXXX... ", +" ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX..XXXXXX..XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXX.XXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX..XXXXXXXXXX..XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.X..XXXXXX..X.XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.XXX......XXX.XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXX.XXXXXXXXXX.XXXXXXXXXXXXXXXX.. ", +" ..XXXXXXXXXXXXXXXXXX..XXXXXX..XXXXXXXXXXXXXXXX. . ", +" ..XXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXX.X. ", +" .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. ", +" .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. ", +" .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX. ", +" .X..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX. ", +" .XX....XXXXXXXXXXXXXXXXXXXXXXXXX...XXX. ", +" ..XXXX.....XXXXXXXXXXXXXXXX....XXXX.. ", +" ...XXXXXX................XXXXX... ", +" .....XXXXXXXXXXXXXXXXXX.... ", +" ................... ", +" ...oooooooooooooooo.. ", +" .+.oooooooooooooooo.+. ", +" ..+++.oooooooooooooo.++. ", +" ......... .+++++.oooooooooooooo.+++. .... ", +" ...+++++++.. ..++++++.oooooooooooo.++++.. ...++++.. ", +" .+++++++++++....@+++++++..oooooooo..++++++@....++++++++. ", +" .+++++++++++++..@@+++++++++........+++++++@@..++++++++++. ", +" .+++++++++++++++..@+++++++++++.++++++++++@@..++++++++++++. ", +" .+++++++++++++++++..++++++++++. .+++++++++..++++++++++++++. ", +" .++++++++++++++++++++++++++++. .+++++++..++++++++++++++++. ", +" .++++++++++++++++++++++++++++. .+++++++++++++++++++++++++. ", +" .+++++++++++++++++++++++++++. .++++++++++++++++++++++++. ", +" .+@.++++++++++++++++++++++++. .++++++++++++++++++++.+++. ", +" .++.++++++++++++++++++++++++. .++++++++++++++++++++.@+@. ", +" .@+@.+++++++++++++++++++++++. .+++++++++++++++++++.@+@. ", +" .@@+@..++++++++++++++++++++@.. ..@++++++++++++++++..@++@. ", +" .@@+++++++++++++++++++++++@@. .@@+++++++++++++++++++@@. ", +" ..@@@@@@@@@@@@@@@@@@@@@@@@@. .@@@@@@@@@@@@@@@@@@@@@@. ", +" ........................... ....................... ", +" ", +" "}; diff --git a/hacks/noses/nose-l1.xbm b/hacks/noses/nose-l1.xbm new file mode 100644 index 00000000..e3cb7030 --- /dev/null +++ b/hacks/noses/nose-l1.xbm @@ -0,0 +1,38 @@ +#define nose_l1_width 64 +#define nose_l1_height 64 +static unsigned char nose_l1_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00, + 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00, + 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00, + 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00, + 0x18,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x40,0x00,0x80,0x00,0x00, + 0x00,0x08,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x00,0x01,0x20,0x00, + 0x00,0x00,0x04,0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0xf8,0x07, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00, + 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xc0,0x00,0x03,0x03,0x10,0x00,0x00, + 0x00,0x30,0x00,0x0c,0x01,0x20,0x00,0x00,0x00,0x08,0x00,0x98,0x00,0x20,0x00, + 0x00,0x00,0x0c,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20, + 0x00,0x00,0x00,0x42,0x00,0x80,0x00,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01, + 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00, + 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00, + 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00, + 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-l1.xpm b/hacks/noses/nose-l1.xpm new file mode 100644 index 00000000..205d18be --- /dev/null +++ b/hacks/noses/nose-l1.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_l1_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" ......OOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ...ooOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" ..oooOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooooOOOOOOOOOOOOOOo.OOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .ooooOOOOOOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooooooOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .oooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ..oooooooo..OOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" ........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .............................. ", +" ", +" ......... ", +" ........ .+++++++++. ", +" ...++++++++... .++++++++++. ", +" ..++++++++++++.. ..++++++++++++. ", +" ..++++++++++++++++. .@++++++++++++. ", +" .++++@..+++++++++++..@@++++++++++++. ", +" .++++..++++++++++++++..@++++++++++++. ", +" .+++@.+++++++++++++++++.@+++++++++++. ", +" .+++@.+++++++++++++++++++.@++++++++++. ", +" .+++@.+++++++++++++++++++..++++++++++. ", +" .+++@.+++++++++++++++++++++++++++++++. ", +" .++++++++++++++++++++++++++++++++++++@. ", +" ..@++++++++++++++++++++++++++++++++++@. ", +" .@@+++++++++++++++++++++++++++++++++@. ", +" .@@++++++++++++++++++++++++++++++++@@. ", +" .@@@++++++++++++++++++++++++++++++@. ", +" ..@@@++++++++++++++++++++@@@++++@@. ", +" ...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +" .............................. ", +" ", +" ", +" "}; diff --git a/hacks/noses/nose-l2.xbm b/hacks/noses/nose-l2.xbm new file mode 100644 index 00000000..fa39343b --- /dev/null +++ b/hacks/noses/nose-l2.xbm @@ -0,0 +1,38 @@ +#define nose_l2_width 64 +#define nose_l2_height 64 +static unsigned char nose_l2_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00, + 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00, + 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00, + 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00, + 0x18,0x00,0x10,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x20,0x00,0x80,0x00,0x00, + 0x00,0x08,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x80,0x00,0x20,0x00, + 0x00,0x00,0xe4,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x26,0x03,0x00,0xfc,0x07, + 0x00,0x00,0x00,0x12,0x0c,0x00,0x00,0xf8,0xff,0xff,0xff,0x11,0x10,0x80,0x1f, + 0x00,0x00,0x00,0x00,0x08,0x20,0x60,0x60,0xc0,0x07,0x00,0x00,0x04,0x40,0x10, + 0xc0,0x20,0x08,0x00,0x1f,0x02,0x40,0x08,0x00,0x21,0x10,0xc0,0x60,0x02,0x40, + 0x04,0x00,0x12,0x20,0x20,0x80,0x02,0x20,0xc2,0x00,0x14,0x40,0x18,0x00,0x03, + 0x20,0x22,0x00,0x0c,0x80,0x04,0x03,0x02,0x10,0x12,0x00,0x08,0x80,0x86,0x00, + 0x04,0x10,0x12,0x00,0x10,0x80,0x42,0x00,0x18,0x08,0x12,0x00,0x10,0x40,0x42, + 0x00,0x00,0x04,0x02,0x00,0x20,0x40,0x42,0x00,0x00,0x04,0x02,0x00,0x00,0x20, + 0x42,0x00,0x00,0x02,0x04,0x00,0x00,0x20,0x02,0x00,0x00,0x01,0x04,0x00,0x00, + 0x20,0x02,0x00,0x00,0x01,0x08,0x00,0x00,0x20,0x04,0x00,0x80,0x00,0x10,0x00, + 0x00,0x20,0x0c,0x00,0x80,0x00,0x60,0x00,0x00,0x10,0x08,0x00,0x40,0x00,0x80, + 0xff,0xff,0x0f,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x0f,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-l2.xpm b/hacks/noses/nose-l2.xpm new file mode 100644 index 00000000..f08a72eb --- /dev/null +++ b/hacks/noses/nose-l2.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_l2_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" ......OOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" ...ooOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" ..oooOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .ooooOOOOOOOOOOOOOOo.OOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .ooooOOOOOOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooooooOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO. ", +" .oooooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO.. ", +" .oooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOOO. ... ", +" ..oooooooo..OOOOOOOOOOOOOOOOOOOOOOOOOOOO.. .++.. ", +" ........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO. .+++++.. ", +" .............................. .+++++++. ", +" ...... .+++++++++. ", +" ..++++++.. ..... .++++++++++@. ", +" .+++++++++.. .+++++. ..... .+++++++++++@. ", +" .++++++++++++. .++++++. ..+++++.. .++++++++++@@. ", +" .++++++++++++++. .++++++++. .+++++++++. .@+++++++++@. ", +" .++++..++++++++++. .+++++++++. ..+++++++++++..@++++++++@@. ", +" .+++.@@++++++++++..@++++++++++. .+++++..+++++++.@@+++++++@. ", +" .++.@+++++++++++++.@@+++++++++. ..++++.@@++++++++.@@+++++@@. ", +" .++.@++++++++++++++.@+++++++++. .++++.@+++++++++++..++++@@. ", +" .++.@++++++++++++++.@++++++++. .++++.@+++++++++++++++++@. ", +" .@++++++++++++++++++.@+++++++. .++++.@++++++++++++++++@@. ", +" .@@+++++++++++++++++++++++++. .++++.@+++++++++++++++@@. ", +" .@++++++++++++++++++++++++@. .+++++++++++++++++++++@. ", +" .@@+++++++++++++++++++++++@. .++++++++++++++++++++@@. ", +" .@@++++++++++++++++++++++@. .+++++++++++++++++++@. ", +" .@@@+++++++++++++++++++@@. ..+++++++++++++++++@@. ", +" ..@@@@@@@@@@@@@@@@@@@@@. .@@@+++@@@++++++@@@. ", +" ..................... ..@@@@@@@@@@@@@@.. ", +" .............. ", +" ", +" ", +" ", +" "}; diff --git a/hacks/noses/nose-r1.xbm b/hacks/noses/nose-r1.xbm new file mode 100644 index 00000000..72df86c2 --- /dev/null +++ b/hacks/noses/nose-r1.xbm @@ -0,0 +1,38 @@ +#define nose_r1_width 64 +#define nose_r1_height 64 +static unsigned char nose_r1_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00, + 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f, + 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c, + 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00, + 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x00,0x80,0x00, + 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x01,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x20,0x00,0x00, + 0x00,0x04,0x80,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x40,0x00, + 0x00,0x00,0xe0,0x1f,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0xc0,0xc0,0x00,0x03,0x00, + 0x00,0x00,0x04,0x80,0x30,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x19,0x00,0x10, + 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x30,0x00,0x00,0x00,0x04,0x00,0x03,0x00, + 0x43,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x04,0x80,0x00, + 0x00,0x84,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00, + 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-r1.xpm b/hacks/noses/nose-r1.xpm new file mode 100644 index 00000000..901dd428 --- /dev/null +++ b/hacks/noses/nose-r1.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_r1_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO...... ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOoo... ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOooo.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOO.oOOOOOOOOOOOOOOoooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOOOOOOoooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOooooooo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..oooooooo.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO........ ", +" .............................. ", +" ", +" ......... ", +" .+++++++++. ........ ", +" .++++++++++. ...++++++++... ", +" .++++++++++++.. ..++++++++++++.. ", +" .++++++++++++@. .++++++++++++++++.. ", +" .++++++++++++@@..+++++++++++..@++++. ", +" .++++++++++++@..++++++++++++++..++++. ", +" .+++++++++++@.+++++++++++++++++.@+++. ", +" .++++++++++@.+++++++++++++++++++.@+++. ", +" .++++++++++..+++++++++++++++++++.@+++. ", +" .+++++++++++++++++++++++++++++++.@+++. ", +" .@++++++++++++++++++++++++++++++++++++. ", +" .@++++++++++++++++++++++++++++++++++@.. ", +" .@+++++++++++++++++++++++++++++++++@@. ", +" .@@++++++++++++++++++++++++++++++++@@. ", +" .@++++++++++++++++++++++++++++++@@@. ", +" .@@++++@@@++++++++++++++++++++@@@.. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@... ", +" .............................. ", +" ", +" ", +" "}; diff --git a/hacks/noses/nose-r2.xbm b/hacks/noses/nose-r2.xbm new file mode 100644 index 00000000..eb750ca7 --- /dev/null +++ b/hacks/noses/nose-r2.xbm @@ -0,0 +1,38 @@ +#define nose_r2_width 64 +#define nose_r2_height 64 +static unsigned char nose_r2_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00, + 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f, + 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c, + 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00, + 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x00,0x80,0x00, + 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00, + 0x01,0x00,0x04,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x27,0x00,0x00, + 0x00,0x04,0x00,0x01,0xc0,0x64,0x00,0x00,0x00,0x18,0xc0,0x00,0x30,0x48,0x00, + 0x00,0x00,0xe0,0x3f,0x00,0x08,0x88,0xff,0xff,0xff,0x1f,0x00,0x00,0x04,0x10, + 0x00,0x00,0x00,0x00,0xf8,0x01,0x02,0x20,0x00,0x00,0xe0,0x03,0x06,0x06,0x02, + 0x40,0xf8,0x00,0x10,0x04,0x03,0x08,0x02,0x40,0x06,0x03,0x08,0x84,0x00,0x10, + 0x04,0x40,0x01,0x04,0x04,0x48,0x00,0x20,0x04,0xc0,0x00,0x18,0x02,0x28,0x00, + 0x43,0x08,0x40,0xc0,0x20,0x01,0x30,0x00,0x44,0x08,0x20,0x00,0x61,0x01,0x10, + 0x00,0x48,0x10,0x18,0x00,0x42,0x01,0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02, + 0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02,0x04,0x00,0x40,0x40,0x00,0x00,0x42, + 0x04,0x00,0x00,0x40,0x80,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x80,0x00,0x00, + 0x40,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x20,0x04,0x00,0x00,0x10,0x00,0x01, + 0x00,0x30,0x04,0x00,0x00,0x08,0x00,0x02,0x00,0x10,0x08,0x00,0x00,0x06,0x00, + 0x0c,0x00,0x0c,0xf0,0xff,0xff,0x01,0x00,0xf0,0xff,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose-r2.xpm b/hacks/noses/nose-r2.xpm new file mode 100644 index 00000000..ddf0edaf --- /dev/null +++ b/hacks/noses/nose-r2.xpm @@ -0,0 +1,74 @@ +/* XPM */ +static char * nose_r2_xpm[] = { +"64 64 7 1", +" c black m black", +". c black m white", +"X c gray m black", +"o c yellow m black", +"O c yellow2 m black", +"+ c purple m black", +"@ c purple3 m black", +" ", +" ", +" ", +" ", +" ", +" ", +" ..................... ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ........................................... ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO...... ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOoo... ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOooo.. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOO.oOOOOOOOOOOOOOOoooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOOOOOOoooo. ", +" .OOOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOooooooo. ", +" ..OOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooooo. ", +" ... .OOOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooo. ", +" ..++. ..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..oooooooo.. ", +" ..+++++. .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO........ ", +" .+++++++. .............................. ", +" .+++++++++. ...... ", +" .@++++++++++. ..... ..++++++.. ", +" .@+++++++++++. ..... .+++++. ..+++++++++. ", +" .@@++++++++++. ..+++++.. .++++++. .++++++++++++. ", +" .@+++++++++@. .+++++++++. .++++++++. .++++++++++++++. ", +" .@@++++++++@..+++++++++++.. .+++++++++. .++++++++++..++++. ", +" .@+++++++@@.+++++++..+++++. .++++++++++@..++++++++++@@.+++. ", +" .@@+++++@@.++++++++@@.++++.. .+++++++++@@.+++++++++++++@.++. ", +" .@@++++..+++++++++++@.++++. .+++++++++@.++++++++++++++@.++. ", +" .@+++++++++++++++++@.++++. .++++++++@.++++++++++++++@.++. ", +" .@@++++++++++++++++@.++++. .+++++++@.++++++++++++++++++@. ", +" .@@+++++++++++++++@.++++. .+++++++++++++++++++++++++@@. ", +" .@+++++++++++++++++++++. .@++++++++++++++++++++++++@. ", +" .@@++++++++++++++++++++. .@+++++++++++++++++++++++@@. ", +" .@+++++++++++++++++++. .@++++++++++++++++++++++@@. ", +" .@@+++++++++++++++++.. .@@+++++++++++++++++++@@@. ", +" .@@@++++++@@@+++@@@. .@@@@@@@@@@@@@@@@@@@@@.. ", +" ..@@@@@@@@@@@@@@.. ..................... ", +" .............. ", +" ", +" ", +" ", +" "}; diff --git a/hacks/pedal.c b/hacks/pedal.c new file mode 100644 index 00000000..ab9dccb0 --- /dev/null +++ b/hacks/pedal.c @@ -0,0 +1,380 @@ +/* + * pedal + * + * Based on a program for some old PDP-11 Graphics Display Processors + * at CMU. + * + * X version by + * + * Dale Moore + * 24-Jun-1994 + * + * Copyright (c) 1994, by Carnegie Mellon University. Permission to use, + * copy, modify, distribute, and sell this software and its documentation + * for any purpose is hereby granted without fee, provided fnord 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 fnord this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + */ + +#include +#include +#include "screenhack.h" + +/* If MAXLINES is too big, we might not be able to get it + * to the X server in the 2byte length field. Must be less + * than 16k + */ +#define MAXLINES (16 * 1024) +#define MAXPOINTS MAXLINES +XPoint *points; + +/* + * If the pedal has only this many lines, it must be ugly and we dont + * want to see it. + */ +#define MINLINES 7 + +static int sizex, sizey; +static int delay; +static int fadedelay; +static int maxlines; +static GC gc; +static XColor foreground, background; +static Colormap cmap; + +static Bool fade_p; + + +/* + * Routine (Macro actually) + * mysin + * Description: + * Assume that degrees is .. oh 360... meaning that + * there are 360 degress in a circle. Then this function + * would return the sin of the angle in degrees. But lets + * say that they are really big degrees, with 4 big degrees + * the same as one regular degree. Then this routine + * would be called mysin(t, 90) and would return sin(t degrees * 4) + */ +#define mysin(t, degrees) sin(t * 2 * M_PI / (degrees)) +#define mycos(t, degrees) cos(t * 2 * M_PI / (degrees)) + +/* + * Macro: + * rand_range + * Description: + * Return a random number between a inclusive and b exclusive. + * rand (3, 6) returns 3 or 4 or 5, but not 6. + */ +#define rand_range(a, b) (a + random() % (b - a)) + + +static int +gcd(int m, int n) /* Greatest Common Divisor (also Greates common factor). */ +{ + int r; + + for (;;) { + r = m % n; + if (r == 0) return (n); + m = n; + n = r; + } +} + +static int numlines (int a, int b, int d) +/* + * Description: + * + * Given parameters a and b, how many lines will we have to draw? + * + * Algorithm: + * + * This algorithm assumes that r = sin (theta * a), where we + * evaluate theta on multiples of b. + * + * LCM (i, j) = i * j / GCD (i, j); + * + * So, at LCM (b, 360) we start over again. But since we + * got to LCM (b, 360) by steps of b, the number of lines is + * LCM (b, 360) / b. + * + * If a is odd, then at 180 we cross over and start the + * negative. Someone should write up an elegant way of proving + * this. Why? Because I'm not convinced of it myself. + * + */ +{ +#define odd(x) (x & 1) +#define even(x) (!odd(x)) + if ( odd(a) && odd(b) && even(d)) d /= 2; + return (d / gcd (d, b)); +#undef odd +} + +static int +compute_pedal(XPoint *points, int maxpoints) +/* + * Description: + * + * Basically, it's combination spirograph and string art. + * Instead of doing lines, we just use a complex polygon, + * and use an even/odd rule for filling in between. + * + * The spirograph, in mathematical terms is a polar + * plot of the form r = sin (theta * c); + * The string art of this is that we evaluate that + * function only on certain multiples of theta. That is + * we let theta advance in some random increment. And then + * we draw a straight line between those two adjacent points. + * + * Eventually, the lines will start repeating themselves + * if we've evaluated theta on some rational portion of the + * whole. + * + * The number of lines generated is limited to the + * ratio of the increment we put on theta to the whole. + * If we say that there are 360 degrees in a circle, then we + * will never have more than 360 lines. + * + * Return: + * + * The number of points. + * + */ +{ + int a, b, d; /* These describe a unique pedal */ + + double r; + int theta = 0; + XPoint *pp = points; + int count; + int numpoints; + + /* Just to make sure that this division is not done inside the loop */ + int h_width = sizex / 2, h_height = sizey / 2 ; + + for (;;) { + d = rand_range (MINLINES, maxlines); + + a = rand_range (1, d); + b = rand_range (1, d); + numpoints = numlines(a, b, d); + if (numpoints > MINLINES) break; + } + + /* it might be nice to try to move as much sin and cos computing + * (or at least the argument computing) out of the loop. + */ + for (count = numpoints; count-- ; ) + { + r = mysin (theta * a, d); + + /* Convert from polar to cartesian coordinates */ + /* We could round the results, but coercing seems just fine */ + pp->x = mysin (theta, d) * r * h_width + h_width; + pp->y = mycos (theta, d) * r * h_height + h_height; + + /* Advance index into array */ + pp++; + + /* Advance theta */ + theta += b; + theta %= d; + } + + return(numpoints); +} + +static void +init_pedal (Display *dpy, Window window) +{ + XGCValues gcv; + XWindowAttributes xgwa; + + fade_p = !mono_p; + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + fadedelay = get_integer_resource ("fadedelay", "Integer"); + if (fadedelay < 0) fadedelay = 0; + + maxlines = get_integer_resource ("maxlines", "Integer"); + if (maxlines < MINLINES) maxlines = MINLINES; + else if (maxlines > MAXLINES) maxlines = MAXLINES; + + points = (XPoint *)malloc(sizeof(XPoint) * maxlines); + + XGetWindowAttributes (dpy, window, &xgwa); + sizex = xgwa.width; + sizey = xgwa.height; + + if ((xgwa.visual->class != GrayScale) && (xgwa.visual->class != PseudoColor)) + fade_p = False; + + cmap = xgwa.colormap; + + gcv.function = GXcopy; + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.background = get_pixel_resource ("background", "Background", dpy, cmap); + gc = XCreateGC (dpy, window, GCForeground | GCBackground |GCFunction, &gcv); + + if (fade_p) + { + int status; + foreground.pixel = gcv.foreground; + XQueryColor (dpy, cmap, &foreground); + + status = XAllocColorCells ( + dpy, + cmap, + 0, + NULL, + 0, + &foreground.pixel, + 1); + if (status) + { + XStoreColor ( dpy, cmap, &foreground); + XSetForeground (dpy, gc, foreground.pixel); + + background.pixel = gcv.background; + XQueryColor (dpy, cmap, &background); + } + else + { + /* If we cant allocate a color cell, then just forget the + * whole fade business. + */ + fade_p = False; + } + } +} + +static void +fade_foreground (Display *dpy, Colormap cmap, + XColor from, XColor to, int steps) +/* + * This routine assumes that we have a writeable colormap. + * That means that the default colormap is not full, and that + * the visual class is PseudoColor or GrayScale. + */ +{ + int i; + XColor inbetween; + int udelay = fadedelay / (steps + 1); + + inbetween = foreground; + for (i = 0; i <= steps; i++ ) + { + inbetween.red = from.red + (to.red - from.red) * i / steps ; + inbetween.green = from.green + (to.green - from.green) * i / steps ; + inbetween.blue = from.blue + (to.blue - from.blue) * i / steps ; + XStoreColor (dpy, cmap, &inbetween); + /* If we don't sync, these can bunch up */ + XSync(dpy, 0); + usleep(udelay); + } +} + +static void +pedal (Display *dpy, Window window) +/* + * Since the XFillPolygon doesn't require that the last + * point == first point, the number of points is the same + * as the number of lines. We just let XFillPolygon supply + * the line from the last point to the first point. + * + */ +{ + int numpoints; + + numpoints = compute_pedal(points, maxlines); + + /* Fade out, make foreground the same as background */ + if (fade_p) + fade_foreground (dpy, cmap, foreground, background, 32); + + /* Clear the window of previous garbage */ + XClearWindow (dpy, window); + + XFillPolygon ( + dpy, + window, + gc, + points, + numpoints, + Complex, + CoordModeOrigin); + + /* Pick a new foreground color (added by jwz) */ + if (! mono_p) + { + XColor color; + hsv_to_rgb (random()%360, 1.0, 1.0, + &color.red, &color.green, &color.blue); + XSync(dpy, 0); + if (fade_p) + { + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + /* don't do this here -- let fade_foreground() bring it up! */ + /* XStoreColor (dpy, cmap, &foreground); */ + } + else if (XAllocColor (dpy, cmap, &color)) + { + XSetForeground (dpy, gc, color.pixel); + XFreeColors (dpy, cmap, &foreground.pixel, 1, 0); + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + foreground.pixel = color.pixel; + } + XSync(dpy, 0); + } + + /* Fade in by bringing the foreground back from background */ + if (fade_p) + fade_foreground (dpy, cmap, background, foreground, 32); +} + + +char *progclass = "Pedal"; + +/* + * If we are trying to save the screen, the background + * should be dark. + */ +char *defaults [] = { + "Pedal.background: black", /* to placate SGI */ + "Pedal.foreground: white", + "*delay: 5", + "*fadedelay: 200000", + "*maxlines: 1000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-fadedelay", ".fadedelay", XrmoptionSepArg, 0 }, + { "-maxlines", ".maxlines", XrmoptionSepArg, 0 }, + { "-foreground", ".foreground", XrmoptionSepArg, 0 }, + { "-background", ".background", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_pedal (dpy, window); + for (;;) { + pedal (dpy, window); + XSync(dpy, 0); + if (delay) sleep (delay); + } +} diff --git a/local/man/man.1/pedal.1 b/hacks/pedal.man similarity index 100% rename from local/man/man.1/pedal.1 rename to hacks/pedal.man diff --git a/hacks/penrose.c b/hacks/penrose.c new file mode 100644 index 00000000..ff8791e6 --- /dev/null +++ b/hacks/penrose.c @@ -0,0 +1,1267 @@ +/* -*- Mode: C; tab-width: 4 -*- + * penrose --- quasiperiodic tilings. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)penrose.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1996 by Timo Korvola + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 09-Sep-96: Written. + */ + +/*- +Be careful, this probably still has a few bugs (many of which may only +appear with a very low probability). These are seen with -verbose . +If one of these are hit penrose will reinitialize. +*/ + +/*- + * See Onoda, Steinhardt, DiVincenzo and Socolar in + * Phys. Rev. Lett. 60, #25, 1988 or + * Strandburg in Computers in Physics, Sep/Oct 1991. + * + * This implementation uses the simpler version of the growth + * algorithm, i.e., if there are no forced vertices, a randomly chosen + * tile is added to a randomly chosen vertex (no preference for those + * 108 degree angles). + * + * There are two essential differences to the algorithm presented in + * the literature: First, we do not allow the tiling to enclose an + * untiled area. Whenever this is in danger of happening, we just + * do not add the tile, hoping for a better random choice the next + * time. Second, when choosing a vertex randomly, we will take + * one that lies withing the viewport if available. If this seems to + * cause enclosures in the forced rule case, we will allow invisible + * vertices to be chosen. + * + * Tiling is restarted whenever one of the following happens: there + * are no incomplete vertices within the viewport or the tiling has + * extended a window's length beyond the edge of the window + * horizontally or vertically or forced rule choice has failed 100 + * times due to areas about to become enclosed. + * + */ + +#ifdef STANDALONE +# define PROGCLASS "Penrose" +# define HACK_INIT init_penrose +# define HACK_DRAW draw_penrose +# define penrose_opts xlockmore_opts +# define DEFAULTS "*delay: 10000 \n" \ + "*size: 40 \n" \ + "*ncolors: 64 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + + +/*- + * Annoyingly the ANSI C library people have reserved all identifiers + * ending with _t for future use. Hence we use _c as a suffix for + * typedefs (c for class, although this is not C++). + */ + +#define MINSIZE 5 + +/*- + * In theory one could fit 10 tiles to a single vertex. However, the + * vertex rules only allow at most seven tiles to meet at a vertex. + */ + +#define CELEBRATE 31415927 /* This causes a pause, an error occurred. */ +#define COMPLETION 3141593 /* This causes a pause, an error occurred. */ + +#define MAX_TILES_PER_VERTEX 7 +#define N_VERTEX_RULES 8 +#define ALLOC_NODE( type) ((type *)malloc( sizeof( type))) +#define DEF_AMMANN "False" + +static Bool ammann; + +static XrmOptionDescRec opts[] = +{ + {"-ammann", ".penrose.ammann", XrmoptionNoArg, (caddr_t) "on"}, + {"+ammann", ".penrose.ammann", XrmoptionNoArg, (caddr_t) "off"} +}; +static argtype vars[] = +{ + {(caddr_t *) & ammann, "ammann", "Ammann", DEF_AMMANN, t_Bool} +}; +static OptionStruct desc[] = +{ + {"-/+ammann", "turn on/off Ammann lines"} +}; + +ModeSpecOpt penrose_opts = { 2, opts, 1, vars, desc }; + + +/*- + * These are used to specify directions. They can also be used in bit + * masks to specify a combination of directions. + */ +#define S_LEFT 1 +#define S_RIGHT 2 + + +/*- + * We do not actually maintain objects corresponding to the tiles since + * we do not really need them and they would only consume memory and + * cause additional bookkeeping. Instead we only have vertices, and + * each vertex lists the type of each adjacent tile as well as the + * position of the vertex on the tile (hereafter refered to as + * "corner"). These positions are numbered in counterclockwise order + * so that 0 is where two double arrows meet (see one of the + * articles). The tile type and vertex number are stored in a single + * integer (we use char, and even most of it remains unused). + * + * The primary use of tile objects would be draw traversal, but we do + * not currently do redraws at all (we just start over). + */ +#define VT_CORNER_MASK 0x3 +#define VT_TYPE_MASK 0x4 +#define VT_THIN 0 +#define VT_THICK 0x4 +#define VT_BITS 3 +#define VT_TOTAL_MASK 0x7 + +typedef unsigned char vertex_type_c; + +/*- + * These allow one to compute the types of the other corners of the tile. If + * you are standing at a vertex of type vt looking towards the middle of the + * tile, VT_LEFT( vt) is the vertex on your left etc. + */ +#define VT_LEFT( vt) ((((vt) - 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK))) +#define VT_RIGHT( vt) ((((vt) + 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK))) +#define VT_FAR( vt) ((vt) ^ 2) + + +/*- + * Since we do not do redraws, we only store the vertices we need. These are + * the ones with still some empty space around them for the growth algorithm + * to fill. + * + * Here we use a doubly chained ring-like structure as vertices often need + * to be removed or inserted (they are kept in geometrical order + * circling the tiled area counterclockwise). The ring is refered to by + * a pointer to one more or less random node. When deleting nodes one + * must make sure that this pointer continues to refer to a valid + * node. A vertex count is maintained to make it easier to pick + * vertices randomly. + */ +typedef struct forced_node forced_node_c; + +typedef struct fringe_node { + struct fringe_node *prev; + struct fringe_node *next; + /* These are numbered counterclockwise. The gap, if any, lies + between the last and first tiles. */ + vertex_type_c tiles[MAX_TILES_PER_VERTEX]; + int n_tiles; + /* A bit mask used to indicate vertex rules that are still applicable for + completing this vertex. Initialize this to (1 << N_VERTEX_RULES) - 1, + i.e., all ones, and the rule matching functions will automatically mask + out rules that no longer match. */ + unsigned char rule_mask; + /* If the vertex is on the forced vertex list, this points to the + pointer to the appropriate node in the list. To remove the + vertex from the list just set *list_ptr to the next node, + deallocate and decrement node count. */ + struct forced_node **list_ptr; + /* Screen coordinates. */ + XPoint loc; + /* We also keep track of 5D coordinates to avoid rounding errors. + These are in units of edge length. */ + int fived[5]; + /* This is used to quickly check if a vertex is visible. */ + unsigned char off_screen; +} fringe_node_c; + +typedef struct { + fringe_node_c *nodes; + /* This does not count off-screen nodes. */ + int n_nodes; +} fringe_c; + + +/*- + * The forced vertex pool contains vertices where at least one + * side of the tiled region can only be extended in one way. Note + * that this does not necessarily mean that there would only be one + * applicable rule. forced_sides are specified using S_LEFT and + * S_RIGHT as if looking at the untiled region from the vertex. + */ +struct forced_node { + fringe_node_c *vertex; + unsigned forced_sides; + struct forced_node *next; +}; + +typedef struct { + forced_node_c *first; + int n_nodes, n_visible; +} forced_pool_c; + + +/* This is the data related to the tiling of one screen. */ +typedef struct { + int width, height; + XPoint origin; + int edge_length; + fringe_c fringe; + forced_pool_c forced; + int done, failures; + int thick_color, thin_color; +} tiling_c; + +static tiling_c *tilings; /* = {0} */ + + +/* The tiles are listed in counterclockwise order. */ +typedef struct { + vertex_type_c tiles[MAX_TILES_PER_VERTEX]; + int n_tiles; +} vertex_rule_c; + +static vertex_rule_c vertex_rules[N_VERTEX_RULES] = +{ + { + {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2}, 5}, + { + {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0}, 5}, + { + {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THIN | 0}, 4}, + { + {VT_THICK | 2, VT_THICK | 2, VT_THIN | 1, VT_THIN | 3, VT_THICK | 2, + VT_THIN | 1, VT_THIN | 3}, 7}, + { + {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, + VT_THIN | 1, VT_THIN | 3}, 6}, + { + {VT_THICK | 1, VT_THICK | 3, VT_THIN | 2}, 3}, + { + {VT_THICK | 0, VT_THIN | 0, VT_THIN | 0}, 3}, + { + {VT_THICK | 2, VT_THIN | 1, VT_THICK | 3, VT_THICK | 1, VT_THIN | 3}, 5} +}; + + +/* Match information returned by match_rules. */ +typedef struct { + int rule; + int pos; +} rule_match_c; + + +/* Occasionally floating point coordinates are needed. */ +typedef struct { + float x, y; +} fcoord_c; + + +/* All angles are measured in multiples of 36 degrees. */ +typedef int angle_c; + +static angle_c vtype_angles[] = +{4, 1, 4, 1, 2, 3, 2, 3}; + +#define vtype_angle( v) (vtype_angles[ v]) + + +/* Direction angle of an edge. */ +static angle_c +vertex_dir(ModeInfo * mi, fringe_node_c * vertex, unsigned side) +{ + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + fringe_node_c *v2 = + (side == S_LEFT ? vertex->next : vertex->prev); + register int i; + + for (i = 0; i < 5; i++) + switch (v2->fived[i] - vertex->fived[i]) { + case 1: + return 2 * i; + case -1: + return (2 * i + 5) % 10; + } + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, + "Weirdness in vertex_dir (this has been reported)\n"); + for (i = 0; i < 5; i++) + (void) fprintf(stderr, "v2->fived[%d]=%d, vertex->fived[%d]=%d\n", + i, v2->fived[i], i, vertex->fived[i]); + } + MI_PAUSE(mi) = CELEBRATE; + return 0; +} + + +/* Move one step to a given direction. */ +static void +add_unit_vec(angle_c dir, int *fived) +{ + static int dir2i[] = + {0, 3, 1, 4, 2}; + + while (dir < 0) + dir += 10; + fived[dir2i[dir % 5]] += (dir % 2 ? -1 : 1); +} + + +/* For comparing coordinates. */ +#define fived_equal( f1, f2) (!memcmp( (f1), (f2), 5 * sizeof( int))) + + +/*- + * This computes screen coordinates from 5D representation. Note that X + * uses left-handed coordinates (y increases downwards). + */ +static XPoint +fived_to_loc(int fived[], tiling_c * tp) +{ + static fcoord_c fived_table[5] = + { + {.0, .0}}; + float fifth = 8 * atan(1.) / 5; + register int i; + register float r; + register fcoord_c offset = + {.0, .0}; + XPoint pt = tp->origin; + + if (fived_table[0].x == .0) + for (i = 0; i < 5; i++) { + fived_table[i].x = cos(fifth * i); + fived_table[i].y = sin(fifth * i); + } + for (i = 0; i < 5; i++) { + r = fived[i] * tp->edge_length; + offset.x += r * fived_table[i].x; + offset.y -= r * fived_table[i].y; + } + pt.x += (int) (offset.x + .5); + pt.y += (int) (offset.y + .5); + return pt; +} + + +/* Mop up dynamic data for one screen. */ +static void +release_screen(tiling_c * tp) +{ + register fringe_node_c *fp1, *fp2; + register forced_node_c *lp1, *lp2; + + if (tp->fringe.nodes == 0) + return; + fp1 = tp->fringe.nodes; + do { + fp2 = fp1; + fp1 = fp1->next; + (void) free((char *) fp2); + } while (fp1 != tp->fringe.nodes); + tp->fringe.nodes = 0; + for (lp1 = tp->forced.first; lp1 != 0;) { + lp2 = lp1; + lp1 = lp1->next; + (void) free((char *) lp2); + } + tp->forced.first = 0; +} + + +/* Called to init the mode. */ +void +init_penrose(ModeInfo * mi) +{ + tiling_c *tp; + fringe_node_c *fp; + int i, size; + + if (tilings == NULL) { + if ((tilings = (tiling_c *) calloc(MI_NUM_SCREENS(mi), + sizeof (tiling_c))) == NULL) + return; + } + tp = &tilings[MI_SCREEN(mi)]; + tp->done = False; + tp->failures = 0; + tp->width = MI_WIN_WIDTH(mi); + tp->height = MI_WIN_HEIGHT(mi); + if (MI_NPIXELS(mi) > 2) { + tp->thick_color = NRAND(MI_NPIXELS(mi)); + /* Insure good contrast */ + tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color + + MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi); + } + size = MI_SIZE(mi); + if (size < -MINSIZE) + tp->edge_length = NRAND(MIN(-size, MAX(MINSIZE, + MIN(tp->width, tp->height) / 2)) - MINSIZE + 1) + MINSIZE; + else if (size < MINSIZE) { + if (!size) + tp->edge_length = MAX(MINSIZE, MIN(tp->width, tp->height) / 2); + else + tp->edge_length = MINSIZE; + } else + tp->edge_length = MIN(size, MAX(MINSIZE, + MIN(tp->width, tp->height) / 2)); + tp->origin.x = (tp->width / 2 + NRAND(tp->width)) / 2; + tp->origin.y = (tp->height / 2 + NRAND(tp->height)) / 2; + tp->fringe.n_nodes = 2; + if (tp->fringe.nodes != 0) + release_screen(tp); + if (tp->fringe.nodes != 0 || tp->forced.first != 0) { + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in init_penrose()\n"); + (void) fprintf(stderr, "tp->fringe.nodes = 0 && tp->forced.first = 0\n"); + } + release_screen(tp); /* Try again */ + tp->done = True; + } + tp->forced.n_nodes = tp->forced.n_visible = 0; + fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c); + if (fp == 0) { + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in init_penrose()\n"); + (void) fprintf(stderr, "fp = 0\n"); + } + fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c); + tp->done = True; + } + /* First vertex. */ + fp->rule_mask = (1 << N_VERTEX_RULES) - 1; + fp->list_ptr = 0; + fp->prev = fp->next = ALLOC_NODE(fringe_node_c); + if (fp->next == 0) { + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in init_penrose()\n"); + (void) fprintf(stderr, "fp->next = 0\n"); + } + fp->prev = fp->next = ALLOC_NODE(fringe_node_c); + tp->done = True; + } + fp->n_tiles = 0; + fp->loc = tp->origin; + fp->off_screen = False; + for (i = 0; i < 5; i++) + fp->fived[i] = 0; + + /* Second vertex. */ + *(fp->next) = *fp; + fp->next->prev = fp->next->next = fp; + fp = fp->next; + i = NRAND(5); + fp->fived[i] = 2 * NRAND(2) - 1; + fp->loc = fived_to_loc(fp->fived, tp); + /* That's it! We have created our first edge. */ +} + +/*- + * This attempts to match the configuration of vertex with the vertex + * rules. The return value is a total match count. If matches is + * non-null, it will be used to store information about the matches + * and must be large enough to contain it. To play it absolutely + * safe, allocate room for MAX_TILES_PER_VERTEX * N_VERTEX_RULES + * entries when searching all matches. The rule mask of vertex will + * be applied and rules masked out will not be searched. Only strict + * subsequences match. If first_only is true, the search stops when + * the first match is found. Otherwise all matches will be found and + * the rule_mask of vertex will be updated, which also happens in + * single-match mode if no match is found. + */ +static int +match_rules(fringe_node_c * vertex, rule_match_c * matches, int first_only) +{ + /* I will assume that I can fit all the relevant bits in vertex->tiles + into one unsigned long. With 3 bits per element and at most 7 + elements this means 21 bits, which should leave plenty of room. + After packing the bits the rest is just integer comparisons and + some bit shuffling. This is essentially Rabin-Karp without + congruence arithmetic. */ + register int i, j; + int hits = 0, good_rules[N_VERTEX_RULES], n_good = 0; + unsigned long + vertex_hash = 0, lower_bits_mask = ~(VT_TOTAL_MASK << VT_BITS * (vertex->n_tiles - 1)); + unsigned new_rule_mask = 0; + + for (i = 0; i < N_VERTEX_RULES; i++) + if (vertex->n_tiles >= vertex_rules[i].n_tiles) + vertex->rule_mask &= ~(1 << i); + else if (vertex->rule_mask & 1 << i) + good_rules[n_good++] = i; + for (i = 0; i < vertex->n_tiles; i++) + vertex_hash |= (unsigned long) vertex->tiles[i] << (VT_BITS * i); + + for (j = 0; j < n_good; j++) { + unsigned long rule_hash = 0; + vertex_rule_c *vr = vertex_rules + good_rules[j]; + + for (i = 0; i < vertex->n_tiles; i++) + rule_hash |= (unsigned long) vr->tiles[i] << (VT_BITS * i); + if (rule_hash == vertex_hash) { + if (matches != 0) { + matches[hits].rule = good_rules[j]; + matches[hits].pos = 0; + } + hits++; + if (first_only) + return hits; + else + new_rule_mask |= 1 << good_rules[j]; + } + for (i = vr->n_tiles - 1; i > 0; i--) { + rule_hash = vr->tiles[i] | (rule_hash & lower_bits_mask) << VT_BITS; + if (vertex_hash == rule_hash) { + if (matches != 0) { + matches[hits].rule = good_rules[j]; + matches[hits].pos = i; + } + hits++; + if (first_only) + return hits; + else + new_rule_mask |= 1 << good_rules[j]; + } + } + } + vertex->rule_mask = new_rule_mask; + return hits; +} + + +/*- + * find_completions finds the possible ways to add a tile to a vertex. + * The return values is the number of such possibilities. You must + * first call match_rules to produce matches and n_matches. sides + * specifies which side of the vertex to extend and can be S_LEFT or + * S_RIGHT. If results is non-null, it should point to an array large + * enough to contain the results, which will be stored there. + * MAX_COMPL elements will always suffice. If first_only is true we + * stop as soon as we find one possibility (NOT USED). + */ +#define MAX_COMPL 2 + +static int +find_completions(fringe_node_c * vertex, rule_match_c * matches, int n_matches, + unsigned side, vertex_type_c * results /*, int first_only */ ) +{ + int n_res = 0, cont; + register int i, j; + vertex_type_c buf[MAX_COMPL]; + + if (results == 0) + results = buf; + if (n_matches <= 0) + return 0; + for (i = 0; i < n_matches; i++) { + vertex_rule_c *rule = vertex_rules + matches[i].rule; + int pos = (matches[i].pos + + (side == S_RIGHT ? vertex->n_tiles : rule->n_tiles - 1)) + % rule->n_tiles; + vertex_type_c vtype = rule->tiles[pos]; + + cont = 1; + for (j = 0; j < n_res; j++) + if (vtype == results[j]) { + cont = 0; + break; + } + if (cont) + results[n_res++] = vtype; + } + return n_res; +} + + +/*- + * Draw a tile on the display. Vertices must be given in a + * counterclockwise order. vtype is the vertex type of v1 (and thus + * also gives the tile type). + */ +static void +draw_tile(fringe_node_c * v1, fringe_node_c * v2, + fringe_node_c * v3, fringe_node_c * v4, + vertex_type_c vtype, ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + XPoint pts[5]; + vertex_type_c corner = vtype & VT_CORNER_MASK; + + if (v1->off_screen && v2->off_screen && v3->off_screen && v4->off_screen) + return; + pts[corner] = v1->loc; + pts[VT_RIGHT(corner)] = v2->loc; + pts[VT_FAR(corner)] = v3->loc; + pts[VT_LEFT(corner)] = v4->loc; + pts[4] = pts[0]; + if (MI_NPIXELS(mi) > 2) { + if ((vtype & VT_TYPE_MASK) == VT_THICK) + XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color)); + else + XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color)); + } else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XFillPolygon(display, window, gc, pts, 4, Convex, CoordModeOrigin); + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + XDrawLines(display, window, gc, pts, 5, CoordModeOrigin); + + if (ammann) { + /* Draw some Ammann lines for debugging purposes. This will probably + fail miserably on a b&w display. */ + + if ((vtype & VT_TYPE_MASK) == VT_THICK) { + static float r = .0; + + if (r == .0) { + float pi10 = 2 * atan(1.) / 5; + + r = 1 - sin(pi10) / (2 * sin(3 * pi10)); + } + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color)); + else { + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter); + } + XDrawLine(display, window, gc, + (int) (r * pts[3].x + (1 - r) * pts[0].x + .5), + (int) (r * pts[3].y + (1 - r) * pts[0].y + .5), + (int) (r * pts[1].x + (1 - r) * pts[0].x + .5), + (int) (r * pts[1].y + (1 - r) * pts[0].y + .5)); + if (MI_NPIXELS(mi) <= 2) + XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter); + } else { + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color)); + else { + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter); + } + XDrawLine(display, window, gc, + (int) ((pts[3].x + pts[2].x) / 2 + .5), + (int) ((pts[3].y + pts[2].y) / 2 + .5), + (int) ((pts[1].x + pts[2].x) / 2 + .5), + (int) ((pts[1].y + pts[2].y) / 2 + .5)); + if (MI_NPIXELS(mi) <= 2) + XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter); + } + } +} + +/*- + * Update the status of this vertex on the forced vertex queue. If + * the vertex has become untileable set tp->done. This is supposed + * to detect dislocations -- never call this routine with a completely + * tiled vertex. + * + * Check for untileable vertices in check_vertex and stop tiling as + * soon as one finds one. I don't know if it is possible to run out + * of forced vertices while untileable vertices exist (or will + * cavities inevitably appear). If this can happen, add_random_tile + * might get called with an untileable vertex, causing ( n <= 1). + * (This is what the tp->done checks for). + * + * A MI_PAUSE celebrates the dislocation. + */ +static void +check_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp) +{ + rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES]; + int n_hits = match_rules(vertex, hits, False); + unsigned forced_sides = 0; + + if (vertex->rule_mask == 0) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Dislocation occured!\n"); + } + MI_PAUSE(mi) = CELEBRATE; /* Should be able to recover */ + } + if (1 == find_completions(vertex, hits, n_hits, S_LEFT, 0 /*, False */ )) + forced_sides |= S_LEFT; + if (1 == find_completions(vertex, hits, n_hits, S_RIGHT, 0 /*, False */ )) + forced_sides |= S_RIGHT; + if (forced_sides == 0) { + if (vertex->list_ptr != 0) { + forced_node_c *node = *vertex->list_ptr; + + *vertex->list_ptr = node->next; + if (node->next != 0) + node->next->vertex->list_ptr = vertex->list_ptr; + free(node); + tp->forced.n_nodes--; + if (!vertex->off_screen) + tp->forced.n_visible--; + vertex->list_ptr = 0; + } + } else { + forced_node_c *node; + + if (vertex->list_ptr == 0) { + node = ALLOC_NODE(forced_node_c); + node->vertex = vertex; + node->next = tp->forced.first; + if (tp->forced.first != 0) + tp->forced.first->vertex->list_ptr = &(node->next); + tp->forced.first = node; + vertex->list_ptr = &(tp->forced.first); + tp->forced.n_nodes++; + if (!vertex->off_screen) + tp->forced.n_visible++; + } else + node = *vertex->list_ptr; + node->forced_sides = forced_sides; + } +} + + +/*- + * Delete this vertex. If the vertex is a member of the forced vertex queue, + * also remove that entry. We assume that the vertex is no longer + * connected to the fringe. Note that tp->fringe.nodes must not point to + * the vertex being deleted. + */ +static void +delete_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp) +{ + if (tp->fringe.nodes == vertex) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in delete_penrose()\n"); + (void) fprintf(stderr, "tp->fringe.nodes == vertex\n"); + } + MI_PAUSE(mi) = CELEBRATE; + } + if (vertex->list_ptr != 0) { + forced_node_c *node = *vertex->list_ptr; + + *vertex->list_ptr = node->next; + if (node->next != 0) + node->next->vertex->list_ptr = vertex->list_ptr; + free(node); + tp->forced.n_nodes--; + if (!vertex->off_screen) + tp->forced.n_visible--; + } + if (!vertex->off_screen) + tp->fringe.n_nodes--; + free(vertex); +} + + +/* Check whether the addition of a tile of type vtype would completely fill * + the space available at vertex. */ +static int +fills_vertex(ModeInfo * mi, vertex_type_c vtype, fringe_node_c * vertex) +{ + return + (vertex_dir(mi, vertex, S_LEFT) - vertex_dir(mi, vertex, S_RIGHT) + - vtype_angle(vtype)) % 10 == 0; +} + + +/*- + * If you were to add a tile of type vtype to a specified side of + * vertex, fringe_changes tells you which other vertices it would + * attach to. The addresses of these vertices will be stored in the + * last three arguments. Null is stored if the corresponding vertex + * would need to be allocated. + * + * The function also analyzes which vertices would be swallowed by the tiling + * and thus cut off from the fringe. The result is returned as a bit pattern. + */ +#define FC_BAG 1 /* Total enclosure. Should never occur. */ +#define FC_NEW_RIGHT 2 +#define FC_NEW_FAR 4 +#define FC_NEW_LEFT 8 +#define FC_NEW_MASK 0xe +#define FC_CUT_THIS 0x10 +#define FC_CUT_RIGHT 0x20 +#define FC_CUT_FAR 0x40 +#define FC_CUT_LEFT 0x80 +#define FC_CUT_MASK 0xf0 +#define FC_TOTAL_MASK 0xff + +static unsigned +fringe_changes(ModeInfo * mi, fringe_node_c * vertex, + unsigned side, vertex_type_c vtype, + fringe_node_c ** right, fringe_node_c ** far, + fringe_node_c ** left) +{ + fringe_node_c *v, *f = NULL; + unsigned result = FC_NEW_FAR; /* We clear this later if necessary. */ + + if (far) + *far = 0; + if (fills_vertex(mi, vtype, vertex)) { + result |= FC_CUT_THIS; + } else if (side == S_LEFT) { + result |= FC_NEW_RIGHT; + if (right) + *right = 0; + } else { + result |= FC_NEW_LEFT; + if (left) + *left = 0; + } + + if (!(result & FC_NEW_LEFT)) { + v = vertex->next; + if (left) + *left = v; + if (fills_vertex(mi, VT_LEFT(vtype), v)) { + result = (result & ~FC_NEW_FAR) | FC_CUT_LEFT; + f = v->next; + if (far) + *far = f; + } + } + if (!(result & FC_NEW_RIGHT)) { + v = vertex->prev; + if (right) + *right = v; + if (fills_vertex(mi, VT_RIGHT(vtype), v)) { + result = (result & ~FC_NEW_FAR) | FC_CUT_RIGHT; + f = v->prev; + if (far) + *far = f; + } + } + if (!(result & FC_NEW_FAR) + && fills_vertex(mi, VT_FAR(vtype), f)) { + result |= FC_CUT_FAR; + result &= (~FC_NEW_LEFT & ~FC_NEW_RIGHT); + if (right && (result & FC_CUT_LEFT)) + *right = f->next; + if (left && (result & FC_CUT_RIGHT)) + *left = f->prev; + } + if (((result & FC_CUT_LEFT) && (result & FC_CUT_RIGHT)) + || ((result & FC_CUT_THIS) && (result & FC_CUT_FAR))) + result |= FC_BAG; + return result; +} + + +/* A couple of lesser helper functions for add_tile. */ +static void +add_vtype(fringe_node_c * vertex, unsigned side, vertex_type_c vtype) +{ + if (side == S_RIGHT) + vertex->tiles[vertex->n_tiles++] = vtype; + else { + register int i; + + for (i = vertex->n_tiles; i > 0; i--) + vertex->tiles[i] = vertex->tiles[i - 1]; + vertex->tiles[0] = vtype; + vertex->n_tiles++; + } +} + +static fringe_node_c * +alloc_vertex(ModeInfo * mi, angle_c dir, fringe_node_c * from, tiling_c * tp) +{ + fringe_node_c *v = ALLOC_NODE(fringe_node_c); + + if (v == 0) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in alloc_vertex()\n"); + (void) fprintf(stderr, "v = 0\n"); + } + MI_PAUSE(mi) = CELEBRATE; + } + *v = *from; + add_unit_vec(dir, v->fived); + v->loc = fived_to_loc(v->fived, tp); + if (v->loc.x < 0 || v->loc.y < 0 + || v->loc.x >= tp->width || v->loc.y >= tp->height) { + v->off_screen = True; + if (v->loc.x < -tp->width || v->loc.y < -tp->height + || v->loc.x >= 2 * tp->width || v->loc.y >= 2 * tp->height) + tp->done = True; + } else { + v->off_screen = False; + tp->fringe.n_nodes++; + } + v->n_tiles = 0; + v->rule_mask = (1 << N_VERTEX_RULES) - 1; + v->list_ptr = 0; + return v; +} + +/* + * Add a tile described by vtype to the side of vertex. This must be + * allowed by the rules -- we do not check it here. New vertices are + * allocated as necessary. The fringe and the forced vertex pool are updated. + * The new tile is drawn on the display. + * + * One thing we do check here is whether the new tile causes an untiled + * area to become enclosed by the tiling. If this would happen, the tile + * is not added. The return value is true iff a tile was added. + */ +static int +add_tile(ModeInfo * mi, + fringe_node_c * vertex, unsigned side, vertex_type_c vtype) +{ + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + + fringe_node_c + * left = 0, + *right = 0, + *far = 0, + *node; + unsigned fc = fringe_changes(mi, vertex, side, vtype, &right, &far, &left); + + vertex_type_c + ltype = VT_LEFT(vtype), + rtype = VT_RIGHT(vtype), + ftype = VT_FAR(vtype); + + /* By our conventions vertex->next lies to the left of vertex and + vertex->prev to the right. */ + + /* This should never occur. */ + if (fc & FC_BAG) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_tile()\n"); + (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG); + } + } + if (side == S_LEFT) { + if (right == 0) + right = alloc_vertex(mi, + vertex_dir(mi, vertex, S_LEFT) - vtype_angle(vtype), vertex, tp); + if (far == 0) + far = alloc_vertex(mi, + vertex_dir(mi, left, S_RIGHT) + vtype_angle(ltype), left, tp); + } else { + if (left == 0) + left = alloc_vertex(mi, + vertex_dir(mi, vertex, S_RIGHT) + vtype_angle(vtype), vertex, tp); + if (far == 0) + far = alloc_vertex(mi, + vertex_dir(mi, right, S_LEFT) - vtype_angle(rtype), right, tp); + } + + /* Having allocated the new vertices, but before joining them with + the rest of the fringe, check if vertices with same coordinates + already exist. If any such are found, give up. */ + node = tp->fringe.nodes; + do { + if (((fc & FC_NEW_LEFT) && fived_equal(node->fived, left->fived)) + || ((fc & FC_NEW_RIGHT) && fived_equal(node->fived, right->fived)) + || ((fc & FC_NEW_FAR) && fived_equal(node->fived, far->fived))) { + /* Better luck next time. */ + if (fc & FC_NEW_LEFT) + delete_vertex(mi, left, tp); + if (fc & FC_NEW_RIGHT) + delete_vertex(mi, right, tp); + if (fc & FC_NEW_FAR) + delete_vertex(mi, far, tp); + return False; + } + node = node->next; + } while (node != tp->fringe.nodes); + + /* Rechain. */ + if (!(fc & FC_CUT_THIS)) + if (side == S_LEFT) { + vertex->next = right; + right->prev = vertex; + } else { + vertex->prev = left; + left->next = vertex; + } + if (!(fc & FC_CUT_FAR)) { + if (!(fc & FC_CUT_LEFT)) { + far->next = left; + left->prev = far; + } + if (!(fc & FC_CUT_RIGHT)) { + far->prev = right; + right->next = far; + } + } + draw_tile(vertex, right, far, left, vtype, mi); + + /* Delete vertices that are no longer on the fringe. Check the others. */ + if (fc & FC_CUT_THIS) { + tp->fringe.nodes = far; + delete_vertex(mi, vertex, tp); + } else { + add_vtype(vertex, side, vtype); + check_vertex(mi, vertex, tp); + tp->fringe.nodes = vertex; + } + if (fc & FC_CUT_FAR) + delete_vertex(mi, far, tp); + else { + add_vtype(far, fc & FC_CUT_RIGHT ? S_LEFT : S_RIGHT, ftype); + check_vertex(mi, far, tp); + } + if (fc & FC_CUT_LEFT) + delete_vertex(mi, left, tp); + else { + add_vtype(left, fc & FC_CUT_FAR ? S_LEFT : S_RIGHT, ltype); + check_vertex(mi, left, tp); + } + if (fc & FC_CUT_RIGHT) + delete_vertex(mi, right, tp); + else { + add_vtype(right, fc & FC_CUT_FAR ? S_RIGHT : S_LEFT, rtype); + check_vertex(mi, right, tp); + } + return True; +} + + +/*- + * Add a forced tile to a given forced vertex. Basically an easy job, + * since we know what to add. But it might fail if adding the tile + * would cause some untiled area to become enclosed. There is also another + * more exotic culprit: we might have a dislocation. Fortunately, they + * are very rare (the PRL article reported that perfect tilings of over + * 2^50 tiles had been generated). There is a version of the algorithm + * that doesn't produce dislocations, but it's a lot hairier than the + * simpler version I used. + */ +static int +add_forced_tile(ModeInfo * mi, forced_node_c * node) +{ + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + unsigned side; + vertex_type_c vtype; + rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES]; + int n; + + if (node->forced_sides == (S_LEFT | S_RIGHT)) + side = NRAND(2) ? S_LEFT : S_RIGHT; + else + side = node->forced_sides; + n = match_rules(node->vertex, hits, True); + n = find_completions(node->vertex, hits, n, side, &vtype /*, True */ ); + if (n <= 0) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_forced_tile()\n"); + (void) fprintf(stderr, "n = %d\n", n); + } + } + return add_tile(mi, node->vertex, side, vtype); +} + + +/*- + * Whether the addition of a tile of vtype on the given side of vertex + * would conform to the rules. The efficient way to do this would be + * to add the new tile and then use the same type of search as in + * match_rules. However, this function is not a performance + * bottleneck (only needed for random tile additions, which are + * relatively infrequent), so I will settle for a simpler implementation. + */ +static int +legal_move(fringe_node_c * vertex, unsigned side, vertex_type_c vtype) +{ + rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES]; + vertex_type_c legal_vt[MAX_COMPL]; + int n_hits, n_legal, i; + + n_hits = match_rules(vertex, hits, False); + n_legal = find_completions(vertex, hits, n_hits, side, legal_vt /*, False */ ); + for (i = 0; i < n_legal; i++) + if (legal_vt[i] == vtype) + return True; + return False; +} + + +/*- + * Add a randomly chosen tile to a given vertex. This requires more checking + * as we must make sure the new tile conforms to the vertex rules at every + * vertex it touches. */ +static void +add_random_tile(fringe_node_c * vertex, ModeInfo * mi) +{ + fringe_node_c *right, *left, *far; + int i, j, n, n_hits, n_good; + unsigned side, fc, no_good, s; + vertex_type_c vtypes[MAX_COMPL]; + rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES]; + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + + if (MI_NPIXELS(mi) > 2) { + tp->thick_color = NRAND(MI_NPIXELS(mi)); + /* Insure good contrast */ + tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color + + MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi); + } else + tp->thick_color = tp->thin_color = MI_WIN_WHITE_PIXEL(mi); + n_hits = match_rules(vertex, hits, False); + side = NRAND(2) ? S_LEFT : S_RIGHT; + n = find_completions(vertex, hits, n_hits, side, vtypes /*, False */ ); + /* One answer would mean a forced tile. */ + if (n <= 0) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_random_tile()\n"); + (void) fprintf(stderr, "n = %d\n", n); + } + } + no_good = 0; + n_good = n; + for (i = 0; i < n; i++) { + fc = fringe_changes(mi, vertex, side, vtypes[i], &right, &far, &left); + if (fc & FC_BAG) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_random_tile()\n"); + (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG); + } + } + if (right) { + s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_LEFT)) ? S_RIGHT : S_LEFT); + if (!legal_move(right, s, VT_RIGHT(vtypes[i]))) { + no_good |= (1 << i); + n_good--; + continue; + } + } + if (left) { + s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_RIGHT)) ? S_LEFT : S_RIGHT); + if (!legal_move(left, s, VT_LEFT(vtypes[i]))) { + no_good |= (1 << i); + n_good--; + continue; + } + } + if (far) { + s = ((fc & FC_CUT_LEFT) ? S_RIGHT : S_LEFT); + if (!legal_move(far, s, VT_FAR(vtypes[i]))) { + no_good |= (1 << i); + n_good--; + } + } + } + if (n_good <= 0) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_random_tile()\n"); + (void) fprintf(stderr, "n_good = %d\n", n_good); + } + } + n = NRAND(n_good); + for (i = j = 0; i <= n; i++, j++) + while (no_good & (1 << j)) + j++; + + i = add_tile(mi, vertex, side, vtypes[j - 1]); + if (!i) { + tp->done = True; + if (MI_WIN_IS_VERBOSE(mi)) { + (void) fprintf(stderr, "Weirdness in add_random_tile()\n"); + (void) fprintf(stderr, "i = %d\n", i); + } + } +} + +/* One step of the growth algorithm. */ +void +draw_penrose(ModeInfo * mi) +{ + tiling_c *tp = &tilings[MI_SCREEN(mi)]; + int i = 0, n; + forced_node_c *p = tp->forced.first; + + if (tp->done || tp->failures >= 100) { + init_penrose(mi); + return; + } + /* Check for the initial "2-gon". */ + if (tp->fringe.nodes->prev == tp->fringe.nodes->next) { + vertex_type_c vtype = VT_TOTAL_MASK & LRAND(); + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + (void) add_tile(mi, tp->fringe.nodes, S_LEFT, vtype); + return; + } + /* No visible nodes left. */ + if (tp->fringe.n_nodes == 0) { + tp->done = True; + MI_PAUSE(mi) = COMPLETION; /* Just finished drawing */ + return; + } + if (tp->forced.n_visible > 0 && tp->failures < 10) { + n = NRAND(tp->forced.n_visible); + for (;;) { + while (p->vertex->off_screen) + p = p->next; + if (i++ < n) + p = p->next; + else + break; + } + } else if (tp->forced.n_nodes > 0) { + n = NRAND(tp->forced.n_nodes); + while (i++ < n) + p = p->next; + } else { + fringe_node_c *p = tp->fringe.nodes; + + n = NRAND(tp->fringe.n_nodes); + i = 0; + for (; i <= n; i++) + do { + p = p->next; + } while (p->off_screen); + add_random_tile(p, mi); + tp->failures = 0; + return; + } + if (add_forced_tile(mi, p)) + tp->failures = 0; + else + tp->failures++; +} + + +/* Total clean-up. */ +void +release_penrose(ModeInfo * mi) +{ + if (tilings != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + tiling_c *tp = &tilings[screen]; + + release_screen(tp); + } + (void) free((void *) tilings); + tilings = NULL; + } +} diff --git a/local/man/man.1/penrose.1 b/hacks/penrose.man similarity index 100% rename from local/man/man.1/penrose.1 rename to hacks/penrose.man diff --git a/hacks/pyro.c b/hacks/pyro.c new file mode 100644 index 00000000..3b0a1d2d --- /dev/null +++ b/hacks/pyro.c @@ -0,0 +1,248 @@ +/* xscreensaver, Copyright (c) 1992, 1994, 1996 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Draw some fireworks. Inspired from TI Explorer Lisp code by + John S. Pezaris + */ + +#include "screenhack.h" + +struct projectile { + int x, y; /* position */ + int dx, dy; /* velocity */ + int decay; + int size; + int fuse; + Bool primary; + Bool dead; + XColor color; + struct projectile *next_free; +}; + +static struct projectile *projectiles, *free_projectiles; + +static struct projectile * +get_projectile (void) +{ + struct projectile *p; + if (free_projectiles) + { + p = free_projectiles; + free_projectiles = p->next_free; + p->next_free = 0; + p->dead = False; + return p; + } + else + return 0; +} + +static void +free_projectile (struct projectile *p) +{ + p->next_free = free_projectiles; + free_projectiles = p; + p->dead = True; +} + +static void +launch (int xlim, int ylim, int g, + Display *dpy, Colormap cmap) +{ + struct projectile *p = get_projectile (); + int x, dx, xxx; + if (! p) return; + + do { + x = (random () % xlim); + dx = 30000 - (random () % 60000); + xxx = x + (dx * 200); + } while (xxx <= 0 || xxx >= xlim); + + p->x = x; + p->y = ylim; + p->dx = dx; + p->size = 8000; + p->decay = 0; + p->dy = (random () % 4000) - 13000; + p->fuse = ((((random () % 500) + 500) * abs (p->dy / g)) / 1000); + p->primary = True; + + if (! mono_p) + { + hsv_to_rgb (random () % 360, 1.0, 1.0, + &p->color.red, &p->color.green, &p->color.blue); + p->color.flags = DoRed | DoGreen | DoBlue; + if (!XAllocColor (dpy, cmap, &p->color)) + { + p->color.pixel = WhitePixel (dpy, DefaultScreen (dpy)); + p->color.red = p->color.green = p->color.blue = 0xFFFF; + } + } +} + +static struct projectile * +shrapnel (struct projectile *parent, Display *dpy, Colormap cmap) +{ + struct projectile *p = get_projectile (); + if (! p) return 0; + p->x = parent->x; + p->y = parent->y; + p->dx = (random () % 5000) - 2500 + parent->dx; + p->dy = (random () % 5000) - 2500 + parent->dy; + p->decay = (random () % 50) - 60; + p->size = (parent->size * 2) / 3; + p->fuse = 0; + p->primary = False; + + p->color = parent->color; + if (! mono_p) + XAllocColor (dpy, cmap, &p->color); /* dup the lock */ + + return p; +} + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; + +static int how_many, frequency, scatter; + +static Colormap +init_pyro (Display *dpy, Window window) +{ + int i; + Colormap cmap; + XGCValues gcv; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + how_many = get_integer_resource ("count", "Integer"); + frequency = get_integer_resource ("frequency", "Integer"); + scatter = get_integer_resource ("scatter", "Integer"); + if (how_many <= 0) how_many = 100; + if (frequency <= 0) frequency = 30; + if (scatter <= 0) scatter = 20; + projectiles = 0; + free_projectiles = 0; + projectiles = (struct projectile *) + calloc (how_many, sizeof (struct projectile)); + for (i = 0; i < how_many; i++) + free_projectile (&projectiles [i]); + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + XClearWindow (dpy, window); + return cmap; +} + +static void +pyro (Display *dpy, Window window, Colormap cmap) +{ + XWindowAttributes xgwa; + static int xlim, ylim, real_xlim, real_ylim; + int g = 100; + int i; + + if ((random () % frequency) == 0) + { + XGetWindowAttributes (dpy, window, &xgwa); + real_xlim = xgwa.width; + real_ylim = xgwa.height; + xlim = real_xlim * 1000; + ylim = real_ylim * 1000; + launch (xlim, ylim, g, dpy, cmap); + } + + XSync (dpy, True); + usleep (10000); + + for (i = 0; i < how_many; i++) + { + struct projectile *p = &projectiles [i]; + int old_x, old_y, old_size; + int size, x, y; + if (p->dead) continue; + old_x = p->x >> 10; + old_y = p->y >> 10; + old_size = p->size >> 10; + size = (p->size += p->decay) >> 10; + x = (p->x += p->dx) >> 10; + y = (p->y += p->dy) >> 10; + p->dy += (p->size >> 6); + if (p->primary) p->fuse--; + + /* erase old one */ + XFillRectangle (dpy, window, erase_gc, old_x, old_y, + old_size, old_size); + + if ((p->primary ? (p->fuse > 0) : (p->size > 0)) && + x < real_xlim && + y < real_ylim && + x > 0 && + y > 0) + { + if (mono_p || p->primary) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + XSetForeground (dpy, draw_gc, p->color.pixel); + + if /*(p->primary)*/ (size > 2) + XFillArc (dpy, window, draw_gc, x, y, size, size, 0, 360*64); + else + XFillRectangle (dpy, window, draw_gc, x, y, size, size); + } + else + { + free_projectile (p); + if (! mono_p) + if (p->color.pixel != WhitePixel (dpy, DefaultScreen (dpy))) + XFreeColors (dpy, cmap, &p->color.pixel, 1, 0); + } + + if (p->primary && p->fuse <= 0) + { + int j = (random () % scatter) + (scatter/2); + while (j--) + shrapnel (p, dpy, cmap); + } + } +} + + +char *progclass = "Pyro"; + +char *defaults [] = { + "Pyro.background: black", /* to placate SGI */ + "Pyro.foreground: white", + "*count: 100", + "*frequency: 30", + "*scatter: 20", + "*geometry: 800x500", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-frequency", ".frequency", XrmoptionSepArg, 0 }, + { "-scatter", ".scatter", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + Colormap cmap = init_pyro (dpy, window); + while (1) + pyro (dpy, window, cmap); +} diff --git a/local/man/man.1/pyro.1 b/hacks/pyro.man similarity index 100% rename from local/man/man.1/pyro.1 rename to hacks/pyro.man diff --git a/hacks/qix.c b/hacks/qix.c new file mode 100644 index 00000000..ed3ac0a0 --- /dev/null +++ b/hacks/qix.c @@ -0,0 +1,510 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include "screenhack.h" +#include "alpha.h" +#include + +#define MAXPOLY 16 +#define SCALE 6 + +struct qpoint { + long x, y; + long dx, dy; +}; + +struct qline { + struct qpoint *p; + XColor color; + Bool dead; +}; + +struct qix { + int id; + int fp; + int nlines; + int npoly; + struct qline *lines; +}; + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; +static long maxx, maxy, max_spread, max_size; +static int color_shift; +static Bool random_p, solid_p, xor_p, transparent_p, gravity_p; +static int delay; +static int count; +static Colormap cmap; +static int npoly; + +static GC *gcs[2]; + +static void +get_geom (Display *dpy, Window window) +{ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + maxx = ((long)(xgwa.width+1)<nlines = nlines; + qix->lines = (struct qline *) calloc (qix->nlines, sizeof (struct qline)); + qix->npoly = npoly; + for (i = 0; i < qix->nlines; i++) + qix->lines[i].p = (struct qpoint *) + calloc(qix->npoly, sizeof(struct qpoint)); + + if (!mono_p && !transparent_p) + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &qix->lines[0].color.red, &qix->lines[0].color.green, + &qix->lines[0].color.blue); + if (!XAllocColor (dpy, cmap, &qix->lines[0].color)) + { + qix->lines[0].color.pixel = default_fg_pixel; + XQueryColor (dpy, cmap, &qix->lines[0].color); + if (!XAllocColor (dpy, cmap, &qix->lines[0].color)) + abort (); + } + } + + if (max_size == 0) + { + for (i = 0; i < qix->npoly; i++) + { + qix->lines[0].p[i].x = random () % maxx; + qix->lines[0].p[i].y = random () % maxy; + } + } + else + { + /*assert(qix->npoly == 2);*/ + qix->lines[0].p[0].x = random () % maxx; + qix->lines[0].p[0].y = random () % maxy; + qix->lines[0].p[1].x = qix->lines[0].p[0].x + (random () % (max_size/2)); + qix->lines[0].p[1].y = qix->lines[0].p[0].y + (random () % (max_size/2)); + if (qix->lines[0].p[1].x > maxx) qix->lines[0].p[1].x = maxx; + if (qix->lines[0].p[1].y > maxy) qix->lines[0].p[1].y = maxy; + } + + for (i = 0; i < qix->npoly; i++) + { + qix->lines[0].p[i].dx = (random () % (max_spread + 1)) - (max_spread /2); + qix->lines[0].p[i].dy = (random () % (max_spread + 1)) - (max_spread /2); + } + qix->lines[0].dead = True; + + for (i = 1; i < qix->nlines; i++) + { + for(j=0; jnpoly; j++) + qix->lines[i].p[j] = qix->lines[0].p[j]; + qix->lines[i].color = qix->lines[0].color; + qix->lines[i].dead = qix->lines[0].dead; + + if (!mono_p && !transparent_p) + if (!XAllocColor (dpy, cmap, &qix->lines[i].color)) + abort (); + } + return qix; +} + + + + +static struct qix ** +init_qix (Display *dpy, Window window) +{ + int nlines; + struct qix **qixes; + XGCValues gcv; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + count = get_integer_resource ("count", "Integer"); + if (count <= 0) count = 1; + nlines = get_integer_resource ("segments", "Integer"); + if (nlines <= 0) nlines = 20; + npoly = get_integer_resource("poly", "Integer"); + if (npoly <= 2) npoly = 2; + if (npoly > MAXPOLY) npoly = MAXPOLY; + get_geom (dpy, window); + max_spread = get_integer_resource ("spread", "Integer"); + if (max_spread <= 0) max_spread = 10; + max_spread <<= SCALE; + max_size = get_integer_resource ("size", "Integer"); + if (max_size < 0) max_size = 0; + max_size <<= SCALE; + random_p = get_boolean_resource ("random", "Boolean"); + solid_p = get_boolean_resource ("solid", "Boolean"); + xor_p = get_boolean_resource ("xor", "Boolean"); + transparent_p = get_boolean_resource ("transparent", "Boolean"); + gravity_p = get_boolean_resource("gravity", "Boolean"); + delay = get_integer_resource ("delay", "Integer"); + color_shift = get_integer_resource ("colorShift", "Integer"); + if (color_shift < 0 || color_shift >= 360) color_shift = 5; + if (delay < 0) delay = 0; + + /* Clear up ambiguities regarding npoly */ + if (solid_p) + { + if (npoly != 2) + fprintf(stderr, "%s: Can't have -solid and -poly; using -poly 2\n", + progname); + npoly = 2; + } + if (npoly > 2) + { + if (max_size) + fprintf(stderr, "%s: Can't have -poly and -size; using -size 0\n", + progname); + max_size = 0; + } + + if (count == 1 && transparent_p) + transparent_p = False; /* it's a no-op */ + + if (transparent_p && CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) + { + fprintf (stderr, "%s: -transparent only works on color displays.\n", + progname); + transparent_p = False; + } + + if (xor_p && !transparent_p) + mono_p = True; + + gcs[0] = gcs[1] = 0; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + + if (transparent_p) + { + Bool additive_p = get_boolean_resource ("additive", "Boolean"); + unsigned long *plane_masks = 0; + unsigned long base_pixel; + int nplanes = count; + int i; + + allocate_alpha_colors (dpy, cmap, &nplanes, additive_p, &plane_masks, + &base_pixel); + + if (nplanes <= 1) + { + fprintf (stderr, + "%s: couldn't allocate any color planes; turning -transparent off.\n", + progname); + transparent_p = False; + if (xor_p) + goto NON_TRANSPARENT_XOR; + else + goto NON_TRANSPARENT; + } + else if (nplanes != count) + { + fprintf (stderr, + "%s: only allocated %d color planes (instead of %d).\n", + progname, nplanes, count); + count = nplanes; + } + + gcs[0] = (GC *) malloc (count * sizeof (GC)); + gcs[1] = xor_p ? gcs[0] : (GC *) malloc (count * sizeof (GC)); + + + for (i = 0; i < count; i++) + { + gcv.plane_mask = plane_masks [i]; + gcv.foreground = ~0; + if (xor_p) + { + gcv.function = GXxor; + gcs [0][i] = XCreateGC (dpy, window, + GCForeground|GCFunction|GCPlaneMask, + &gcv); + } + else + { + gcs [0][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask, + &gcv); + gcv.foreground = 0; + gcs [1][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask, + &gcv); + } + } + + XSetWindowBackground (dpy, window, base_pixel); + XClearWindow (dpy, window); + } + else if (xor_p) + { + NON_TRANSPARENT_XOR: + gcv.function = GXxor; + gcv.foreground = + (default_fg_pixel ^ get_pixel_resource ("background", "Background", + dpy, cmap)); + draw_gc = erase_gc = XCreateGC(dpy,window,GCForeground|GCFunction,&gcv); + } + else + { + NON_TRANSPARENT: + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", + dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + } + + qixes = (struct qix **) malloc ((count + 1) * sizeof (struct qix *)); + qixes [count] = 0; + while (count--) + { + qixes [count] = init_one_qix (dpy, window, nlines, npoly); + qixes [count]->id = count; + } + return qixes; +} + +static void +free_qline (Display *dpy, Window window, Colormap cmap, + struct qline *qline, + struct qline *prev, + struct qix *qix) +{ + int i; + if (qline->dead || !prev) + ; + else if (solid_p) + { + XPoint points [4]; + /*assert(qix->npoly == 2);*/ + points [0].x = qline->p[0].x >> SCALE; + points [0].y = qline->p[0].y >> SCALE; + points [1].x = qline->p[1].x >> SCALE; + points [1].y = qline->p[1].y >> SCALE; + points [2].x = prev->p[1].x >> SCALE; + points [2].y = prev->p[1].y >> SCALE; + points [3].x = prev->p[0].x >> SCALE; + points [3].y = prev->p[0].y >> SCALE; + XFillPolygon (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc), + points, 4, Complex, CoordModeOrigin); + } + else + { + /* XDrawLine (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc), + qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/ + static XPoint points[MAXPOLY+1]; + for(i = 0; i < qix->npoly; i++) + { + points[i].x = qline->p[i].x >> SCALE; + points[i].y = qline->p[i].y >> SCALE; + } + points[qix->npoly] = points[0]; + XDrawLines(dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc), + points, qix->npoly+1, CoordModeOrigin); + } + + if (!mono_p && !transparent_p) + XFreeColors (dpy, cmap, &qline->color.pixel, 1, 0); + + qline->dead = True; +} + +static void +add_qline (Display *dpy, Window window, Colormap cmap, + struct qline *qline, + struct qline *prev_qline, + struct qix *qix) +{ + int i; + + for(i=0; inpoly; i++) + qline->p[i] = prev_qline->p[i]; + qline->color = prev_qline->color; + qline->dead = prev_qline->dead; + +#define wiggle(point,delta,max) \ + if (random_p) delta += (random () % (1 << (SCALE+1))) - (1 << SCALE); \ + if (delta > max_spread) delta = max_spread; \ + else if (delta < -max_spread) delta = -max_spread; \ + point += delta; \ + if (point < 0) point = 0, delta = -delta, point += delta<<1; \ + else if (point > max) point = max, delta = -delta, point += delta<<1; + + if (gravity_p) + for(i=0; inpoly; i++) + qline->p[i].dy += 3; + + for (i = 0; i < qix->npoly; i++) + { + wiggle (qline->p[i].x, qline->p[i].dx, maxx); + wiggle (qline->p[i].y, qline->p[i].dy, maxy); + } + + if (max_size) + { + /*assert(qix->npoly == 2);*/ + if (qline->p[0].x - qline->p[1].x > max_size) + qline->p[0].x = qline->p[1].x + max_size + - (random_p ? random() % max_spread : 0); + else if (qline->p[1].x - qline->p[0].x > max_size) + qline->p[1].x = qline->p[0].x + max_size + - (random_p ? random() % max_spread : 0); + if (qline->p[0].y - qline->p[1].y > max_size) + qline->p[0].y = qline->p[1].y + max_size + - (random_p ? random() % max_spread : 0); + else if (qline->p[1].y - qline->p[0].y > max_size) + qline->p[1].y = qline->p[0].y + max_size + - (random_p ? random() % max_spread : 0); + } + + if (!mono_p && !transparent_p) + { + XColor desired; + + int h; + double s, v; + rgb_to_hsv (qline->color.red, qline->color.green, qline->color.blue, + &h, &s, &v); + h = (h + color_shift) % 360; + hsv_to_rgb (h, s, v, + &qline->color.red, &qline->color.green, &qline->color.blue); + + qline->color.flags = DoRed | DoGreen | DoBlue; + desired = qline->color; + if (XAllocColor (dpy, cmap, &qline->color)) + { + /* XAllocColor returns the actual RGB that the hardware let us + allocate. Restore the requested values into the XColor struct + so that limited-resolution hardware doesn't cause the cycle to + get "stuck". */ + qline->color.red = desired.red; + qline->color.green = desired.green; + qline->color.blue = desired.blue; + } + else + { + qline->color = prev_qline->color; + if (!XAllocColor (dpy, cmap, &qline->color)) + abort (); /* same color should work */ + } + XSetForeground (dpy, draw_gc, qline->color.pixel); + } + if (! solid_p) + { + /* XDrawLine (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc), + qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/ + static XPoint points[MAXPOLY+1]; + for (i = 0; i < qix->npoly; i++) + { + points[i].x = qline->p[i].x >> SCALE; + points[i].y = qline->p[i].y >> SCALE; + } + points[qix->npoly] = points[0]; + XDrawLines(dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc), + points, qix->npoly+1, CoordModeOrigin); + } + else if (!prev_qline->dead) + { + XPoint points [4]; + points [0].x = qline->p[0].x >> SCALE; + points [0].y = qline->p[0].y >> SCALE; + points [1].x = qline->p[1].x >> SCALE; + points [1].y = qline->p[1].y >> SCALE; + points [2].x = prev_qline->p[1].x >> SCALE; + points [2].y = prev_qline->p[1].y >> SCALE; + points [3].x = prev_qline->p[0].x >> SCALE; + points [3].y = prev_qline->p[0].y >> SCALE; + XFillPolygon (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc), + points, 4, Complex, CoordModeOrigin); + } + + qline->dead = False; +} + +static void +qix1 (Display *dpy, Window window, struct qix *qix) +{ + int ofp = qix->fp - 1; + static int gtick = 0; + if (ofp < 0) ofp = qix->nlines - 1; + if (gtick++ == 500) + get_geom (dpy, window), gtick = 0; + free_qline (dpy, window, cmap, &qix->lines [qix->fp], + &qix->lines[(qix->fp + 1) % qix->nlines], qix); + add_qline (dpy, window, cmap, &qix->lines[qix->fp], &qix->lines[ofp], qix); + if ((++qix->fp) >= qix->nlines) + qix->fp = 0; +} + + +char *progclass = "Qix"; + +char *defaults [] = { + "Qix.background: black", /* to placate SGI */ + "Qix.foreground: white", + "*count: 1", + "*segments: 50", + "*poly: 2", + "*spread: 8", + "*size: 0", + "*colorShift: 3", + "*solid: false", + "*delay: 10000", + "*random: true", + "*xor: false", + "*transparent:false", + "*gravity: false", + "*additive: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-segments", ".segments", XrmoptionSepArg, 0 }, + { "-poly", ".poly", XrmoptionSepArg, 0 }, + { "-spread", ".spread", XrmoptionSepArg, 0 }, + { "-size", ".size", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-color-shift", ".colorShift", XrmoptionSepArg, 0 }, + { "-random", ".random", XrmoptionNoArg, "true" }, + { "-linear", ".random", XrmoptionNoArg, "false" }, + { "-solid", ".solid", XrmoptionNoArg, "true" }, + { "-hollow", ".solid", XrmoptionNoArg, "false" }, + { "-xor", ".xor", XrmoptionNoArg, "true" }, + { "-no-xor", ".xor", XrmoptionNoArg, "false" }, + { "-transparent", ".transparent", XrmoptionNoArg, "true" }, + { "-non-transparent", ".transparent", XrmoptionNoArg, "false" }, + { "-gravity", ".gravity", XrmoptionNoArg, "true" }, + { "-no-gravity", ".gravity", XrmoptionNoArg, "false" }, + { "-additive", ".additive", XrmoptionNoArg, "true" }, + { "-subtractive", ".additive", XrmoptionNoArg, "false" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + struct qix **q1 = init_qix (dpy, window); + struct qix **qn; + while (1) + for (qn = q1; *qn; qn++) + { + qix1 (dpy, window, *qn); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/qix.1 b/hacks/qix.man similarity index 100% rename from local/man/man.1/qix.1 rename to hacks/qix.man diff --git a/hacks/rocks.c b/hacks/rocks.c new file mode 100644 index 00000000..55abbd84 --- /dev/null +++ b/hacks/rocks.c @@ -0,0 +1,478 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Flying through an asteroid field. Based on TI Explorer Lisp code by + John Nguyen + */ + +#include +#include +#include "screenhack.h" + +#define MIN_ROCKS 1 +#define MIN_DEPTH 2 /* rocks disappear when they get this close */ +#define MAX_DEPTH 60 /* this is where rocks appear */ +#define MIN_SIZE 3 /* how small where pixmaps are not used */ +#define MAX_SIZE 200 /* how big (in pixels) rocks are at depth 1 */ +#define DEPTH_SCALE 100 /* how many ticks there are between depths */ +#define SIN_RESOLUTION 1000 + +#define MAX_DEP 0.3 /* how far the displacement can be (percent) */ +#define DIRECTION_CHANGE_RATE 60 +#define MAX_DEP_SPEED 5 /* Maximum speed for movement */ +#define MOVE_STYLE 0 /* Only 0 and 1. Distinguishes the fact that + these are the rocks that are moving (1) + or the rocks source (0). */ + +/* there's not much point in the above being user-customizable, but those + numbers might want to be tweaked for displays with an order of magnitude + higher resolution or compute power. + */ + +static double sins [SIN_RESOLUTION]; +static double coss [SIN_RESOLUTION]; +static double depths [(MAX_DEPTH + 1) * DEPTH_SCALE]; + +static Display *dpy; +static Window window; +static int width, height, midx, midy; +static int dep_x, dep_y; +static float max_dep; +static GC draw_gc, erase_gc; +static Bool rotate_p; +static Bool move_p; +static int speed; +static Bool threed; +static GC threed_left_gc, threed_right_gc; +static double threed_delta; + +#define GETZDIFF(z) \ + (threed_delta * 40.0 * \ + (1.0 - ((MAX_DEPTH * DEPTH_SCALE / 2) / \ + ((z) + 20.0 * DEPTH_SCALE)))) + +struct rock { + int real_size; + int r; + int theta; + int depth; + int size, x, y; + int diff; +}; + +static struct rock *rocks; +static int nrocks; +static Pixmap pixmaps [MAX_SIZE]; +static int delay; + +static void rock_compute (struct rock *); +static void rock_draw (struct rock *, Bool draw_p); + +static void +rock_reset (struct rock *rock) +{ + rock->real_size = MAX_SIZE; + rock->r = (SIN_RESOLUTION * 0.7) + (random () % (30 * SIN_RESOLUTION)); + rock->theta = random () % SIN_RESOLUTION; + rock->depth = MAX_DEPTH * DEPTH_SCALE; + rock_compute (rock); + rock_draw (rock, True); +} + +static void +rock_tick (struct rock *rock, int d) +{ + if (rock->depth > 0) + { + rock_draw (rock, False); + rock->depth -= speed; + if (rotate_p) + { + rock->theta = (rock->theta + d) % SIN_RESOLUTION; + } + while (rock->theta < 0) + rock->theta += SIN_RESOLUTION; + if (rock->depth < (MIN_DEPTH * DEPTH_SCALE)) + rock->depth = 0; + else + { + rock_compute (rock); + rock_draw (rock, True); + } + } + else if ((random () % 40) == 0) + rock_reset (rock); +} + +static void +rock_compute (struct rock *rock) +{ + double factor = depths [rock->depth]; + double rsize = rock->real_size * factor; + + rock->size = (int) (rsize + 0.5); + rock->diff = (int) GETZDIFF(rock->depth); + rock->x = midx + (coss [rock->theta] * rock->r * factor); + rock->y = midy + (sins [rock->theta] * rock->r * factor); + + if (move_p) + { + double move_factor = (((double) MOVE_STYLE) - + (((double) rock->depth) / + (((double) (MAX_DEPTH + 1)) * + ((double) DEPTH_SCALE)))); + /* move_factor is 0 when the rock is close, 1 when far */ + rock->x += (((double) dep_x) * move_factor); + rock->y += (((double) dep_y) * move_factor); + } +} + +static void +rock_draw (rock, draw_p) + struct rock *rock; + Bool draw_p; +{ + GC gc = (draw_p + ? (threed ? erase_gc : draw_gc) + : erase_gc); + + if (rock->x <= 0 || rock->y <= 0 || rock->x >= width || rock->y >= height) + { + /* this means that if a rock were to go off the screen at 12:00, but + would have been visible at 3:00, it won't come back once the observer + rotates around so that the rock would have been visible again. + Oh well. + */ + if (!move_p) + rock->depth = 0; + return; + } + if (rock->size <= 1) + { + if (threed) + { + if (draw_p) gc = threed_left_gc; + XDrawPoint (dpy, window, gc, rock->x - rock->diff, rock->y); + if (draw_p) gc = threed_right_gc; + XDrawPoint (dpy, window, gc, rock->x + rock->diff, rock->y); + } + else + { + XDrawPoint (dpy, window, gc, rock->x, rock->y); + } + } + else if (rock->size <= MIN_SIZE || !draw_p) + { + if (threed) + { + if (draw_p) gc = threed_left_gc; + XFillRectangle(dpy, window, gc, + rock->x - rock->size / 2 - rock->diff, + rock->y - rock->size / 2, + rock->size, rock->size); + if (draw_p) gc = threed_right_gc; + XFillRectangle(dpy, window, gc, + rock->x - rock->size / 2 + rock->diff, + rock->y - rock->size / 2, + rock->size, rock->size); + } + else + { + XFillRectangle (dpy, window, gc, + rock->x - rock->size/2, rock->y - rock->size/2, + rock->size, rock->size); + } + } + else if (rock->size < MAX_SIZE) + { + if (threed) + { + gc = threed_left_gc; + XCopyPlane(dpy, pixmaps[rock->size], window, gc, + 0, 0, rock->size, rock->size, + rock->x - rock->size / 2 - rock->diff, + rock->y - rock->size / 2, 1L); + gc = threed_right_gc; + XCopyPlane(dpy, pixmaps[rock->size], window, gc, + 0, 0, rock->size, rock->size, + rock->x - rock->size / 2 + rock->diff, + rock->y - rock->size / 2, 1L); + } + else + { + XCopyPlane (dpy, pixmaps [rock->size], window, gc, + 0, 0, rock->size, rock->size, + rock->x - rock->size/2, rock->y - rock->size/2, + 1L); + } + } +} + + +static void +init_pixmaps (Display *dpy, Window window) +{ + int i; + XGCValues gcv; + GC fg_gc = 0, bg_gc = 0; + pixmaps [0] = pixmaps [1] = 0; + for (i = MIN_DEPTH; i < MAX_SIZE; i++) + { + int w = (1+(i/32))<<5; /* server might be faster if word-aligned */ + int h = i; + Pixmap p = XCreatePixmap (dpy, window, w, h, 1); + XPoint points [7]; + pixmaps [i] = p; + if (! p) + { + fprintf (stderr, "%s: couldn't allocate pixmaps", progname); + exit (1); + } + if (! fg_gc) + { /* must use drawable of pixmap, not window (fmh) */ + gcv.foreground = 1; + fg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + gcv.foreground = 0; + bg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + } + XFillRectangle (dpy, p, bg_gc, 0, 0, w, h); + points [0].x = i * 0.15; points [0].y = i * 0.85; + points [1].x = i * 0.00; points [1].y = i * 0.20; + points [2].x = i * 0.30; points [2].y = i * 0.00; + points [3].x = i * 0.40; points [3].y = i * 0.10; + points [4].x = i * 0.90; points [4].y = i * 0.10; + points [5].x = i * 1.00; points [5].y = i * 0.55; + points [6].x = i * 0.45; points [6].y = i * 1.00; + XFillPolygon (dpy, p, fg_gc, points, 7, Nonconvex, CoordModeOrigin); + } + XFreeGC (dpy, fg_gc); + XFreeGC (dpy, bg_gc); +} + + +static int +compute_move(int axe) /* 0 for x, 1 for y */ +{ + static int current_dep[2] = {0, 0}; + static int speed[2] = {0, 0}; + static short direction[2] = {0, 0}; + static int limit[2] = {0, 0}; + int change = 0; + + limit[0] = midx; + limit[1] = midy; + + current_dep[axe] += speed[axe]; /* We adjust the displacement */ + + if (current_dep[axe] > (int) (limit[axe] * max_dep)) + { + if (current_dep[axe] > limit[axe]) + current_dep[axe] = limit[axe]; + direction[axe] = -1; + } /* This is when we reach the upper screen limit */ + if (current_dep[axe] < (int) (-limit[axe] * max_dep)) + { + if (current_dep[axe] < -limit[axe]) + current_dep[axe] = -limit[axe]; + direction[axe] = 1; + } /* This is when we reach the lower screen limit */ + if (direction[axe] == 1) /* We adjust the speed */ + speed[axe] += 1; + else if (direction[axe] == -1) + speed[axe] -= 1; + + if (speed[axe] > MAX_DEP_SPEED) + speed[axe] = MAX_DEP_SPEED; + else if (speed[axe] < -MAX_DEP_SPEED) + speed[axe] = -MAX_DEP_SPEED; + + if (move_p && !(random() % DIRECTION_CHANGE_RATE)) + { + /* We change direction */ + change = random() & 1; + if (change != 1) + { + if (direction[axe] == 0) + direction[axe] = change - 1; /* 0 becomes either 1 or -1 */ + else + direction[axe] = 0; /* -1 or 1 become 0 */ + } + } + return (current_dep[axe]); +} + +static void +tick_rocks (int d) +{ + int i; + + if (move_p) + { + dep_x = compute_move(0); + dep_y = compute_move(1); + } + + for (i = 0; i < nrocks; i++) + rock_tick (&rocks [i], d); +} + + +static void +rocks_once (void) +{ + static int current_delta = 0; /* observer Z rotation */ + static int window_tick = 50; + static int new_delta = 0; + static int dchange_tick = 0; + + if (window_tick++ == 50) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + window_tick = 0; + width = xgwa.width; + height = xgwa.height; + midx = width/2; + midy = height/2; + } + + if (current_delta != new_delta) + { + if (dchange_tick++ == 5) + { + dchange_tick = 0; + if (current_delta < new_delta) + current_delta++; + else + current_delta--; + } + } + else + { + if (! (random() % 50)) + { + new_delta = ((random() % 11) - 5); + if (! (random() % 10)) + new_delta *= 5; + } + } + tick_rocks (current_delta); +} + +static void +init_rocks (Display *d, Window w) +{ + int i; + XGCValues gcv; + Colormap cmap; + XWindowAttributes xgwa; + unsigned int fg, bg; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + speed = get_integer_resource ("speed", "Integer"); + if (speed < 1) speed = 1; + if (speed > 100) speed = 100; + rotate_p = get_boolean_resource ("rotate", "Boolean"); + move_p = get_boolean_resource ("move", "Boolean"); + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + gcv.foreground = fg; + gcv.background = bg; + draw_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + gcv.foreground = bg; + gcv.background = fg; + erase_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + + max_dep = (move_p ? MAX_DEP : 0); + + for (i = 0; i < SIN_RESOLUTION; i++) + { + sins [i] = sin ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + coss [i] = cos ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + } + /* we actually only need i/speed of these, but wtf */ + for (i = 1; i < (sizeof (depths) / sizeof (depths[0])); i++) + depths [i] = atan (((double) 0.5) / (((double) i) / DEPTH_SCALE)); + depths [0] = M_PI/2; /* avoid division by 0 */ + + threed = get_boolean_resource("use3d", "Boolean"); + if (threed) + { + gcv.background = bg; + gcv.foreground = get_pixel_resource ("left3d", "Foreground", dpy, cmap); + threed_left_gc = XCreateGC (dpy, window, GCForeground|GCBackground,&gcv); + gcv.foreground = get_pixel_resource ("right3d", "Foreground", dpy, cmap); + threed_right_gc = XCreateGC (dpy, window,GCForeground|GCBackground,&gcv); + threed_delta = get_float_resource("delta3d", "Integer"); + } + + /* don't want any exposure events from XCopyPlane */ + XSetGraphicsExposures (dpy, draw_gc, False); + XSetGraphicsExposures (dpy, erase_gc, False); + + nrocks = get_integer_resource ("count", "Count"); + if (nrocks < 1) nrocks = 1; + rocks = (struct rock *) calloc (nrocks, sizeof (struct rock)); + init_pixmaps (dpy, window); + XClearWindow (dpy, window); +} + + + +char *progclass = "Rocks"; + +char *defaults [] = { + "Rocks.background: Black", /* to placate SGI */ + "Rocks.foreground: #E9967A", + "*count: 100", + "*delay: 50000", + "*speed: 100", + "*rotate: true", + "*move: true", + "*use3d: False", + "*left3d: Blue", + "*right3d: Red", + "*delta3d: 1.5", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-rotate", ".rotate", XrmoptionNoArg, "true" }, + { "-norotate", ".rotate", XrmoptionNoArg, "false" }, + { "-move", ".move", XrmoptionNoArg, "true" }, + { "-nomove", ".move", XrmoptionNoArg, "false" }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-speed", ".speed", XrmoptionSepArg, 0 }, + {"-3d", ".use3d", XrmoptionNoArg, "True"}, + {"-no-3d", ".use3d", XrmoptionNoArg, "False"}, + {"-left3d", ".left3d", XrmoptionSepArg, 0 }, + {"-right3d", ".right3d", XrmoptionSepArg, 0 }, + {"-delta3d", ".delta3d", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_rocks (dpy, window); + while (1) + { + rocks_once (); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/local/man/man.1/rocks.1 b/hacks/rocks.man similarity index 100% rename from local/man/man.1/rocks.1 rename to hacks/rocks.man diff --git a/hacks/rorschach.c b/hacks/rorschach.c new file mode 100644 index 00000000..eab13887 --- /dev/null +++ b/hacks/rorschach.c @@ -0,0 +1,134 @@ +/* xscreensaver, Copyright (c) 1992, 1996 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include "screenhack.h" + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; +static int iterations, offset; +static Bool xsym, ysym; + +static void +init_rorschach (Display *dpy, Window window) +{ + XGCValues gcv; + Colormap cmap; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + iterations = get_integer_resource ("iterations", "Integer"); + offset = get_integer_resource ("offset", "Integer"); + if (offset <= 0) offset = 3; + if (iterations < 10) iterations = 10; + xsym = get_boolean_resource ("xsymmetry", "Symmetry"); + ysym = get_boolean_resource ("ysymmetry", "Symmetry"); +} + +static void +hurm (Display *dpy, Window window) +{ + Colormap cmap; + XWindowAttributes xgwa; + int xlim, ylim, x, y, i, got_color = 0; + XPoint points [4]; + XColor color; + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + + if (! mono_p) + hsv_to_rgb (random()%360, 1.0, 1.0, &color.red, &color.green, &color.blue); + if ((!mono_p) && (got_color = XAllocColor (dpy, cmap, &color))) + XSetForeground (dpy, draw_gc, color.pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + + x = xlim/2; + y = ylim/2; + for (i = 0; i < iterations; i++) + { + int j = 0; + x += ((random () % (1 + (offset << 1))) - offset); + y += ((random () % (1 + (offset << 1))) - offset); + points [j].x = x; + points [j].y = y; + j++; + if (xsym) + { + points [j].x = xlim - x; + points [j].y = y; + j++; + } + if (ysym) + { + points [j].x = x; + points [j].y = ylim - y; + j++; + } + if (xsym && ysym) + { + points [j].x = xlim - x; + points [j].y = ylim - y; + j++; + } + XDrawPoints (dpy, window, draw_gc, points, j, CoordModeOrigin); + XSync (dpy, True); + } + sleep (5); + for (i = 0; i < (ylim >> 1); i++) + { + y = (random () % ylim); + XDrawLine (dpy, window, erase_gc, 0, y, xlim, y); + XFlush (dpy); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dpy, window); + if (got_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0); + XSync (dpy, True); + sleep (1); +} + + +char *progclass = "Rorschach"; + +char *defaults [] = { + "Rorschach.background: black", /* to placate SGI */ + "Rorschach.foreground: white", + "*xsymmetry: true", + "*ysymmetry: false", + "*iterations: 4000", + "*offset: 4", + 0 +}; + +XrmOptionDescRec options [] = { + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-offset", ".offset", XrmoptionSepArg, 0 }, + { "-xsymmetry", ".xsymmetry", XrmoptionNoArg, "true" }, + { "-ysymmetry", ".ysymmetry", XrmoptionNoArg, "true" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_rorschach (dpy, window); + while (1) + hurm (dpy, window); +} diff --git a/local/man/man.1/rorschach.1 b/hacks/rorschach.man similarity index 100% rename from local/man/man.1/rorschach.1 rename to hacks/rorschach.man diff --git a/hacks/screenhack.c b/hacks/screenhack.c new file mode 100644 index 00000000..8462d4e7 --- /dev/null +++ b/hacks/screenhack.c @@ -0,0 +1,325 @@ +/* xscreensaver, Copyright (c) 1992, 1995, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * And remember: X Windows is to graphics hacking as roman numerals are to + * the square root of pi. + */ + +/* This file contains simple code to open a window or draw on the root. + The idea being that, when writing a graphics hack, you can just link + with this .o to get all of the uninteresting junk out of the way. + + - create a procedure `screenhack(dpy, window)' + + - create a variable `char *progclass' which names this program's + resource class. + + - create a variable `char defaults []' for the default resources, and + null-terminate it. + + - create a variable `XrmOptionDescRec options[]' for the command-line, + and null-terminate it. + + And that's it... + */ + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_XMU +# ifndef VMS +# include +# else /* VMS */ +# include +# endif +#else +# include "xmu.h" +#endif +#include "screenhack.h" +#include "version.h" +#include "vroot.h" + +char *progname; +XrmDatabase db; +Bool mono_p; + +static XrmOptionDescRec default_options [] = { + { "-root", ".root", XrmoptionNoArg, "True" }, + { "-window", ".root", XrmoptionNoArg, "False" }, + { "-mono", ".mono", XrmoptionNoArg, "True" }, + { "-install", ".installColormap", XrmoptionNoArg, "True" }, + { "-noinstall",".installColormap", XrmoptionNoArg, "False" }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +static char *default_defaults[] = { + "*root: false", + "*geometry: 600x480", /* this should be .geometry, but nooooo... */ + "*mono: false", + "*installColormap: false", + "*visualID: default", + 0 +}; + +static XrmOptionDescRec *merged_options; +static int merged_options_size; +static char **merged_defaults; + +static void +merge_options (void) +{ + int def_opts_size, opts_size; + int def_defaults_size, defaults_size; + + for (def_opts_size = 0; default_options[def_opts_size].option; + def_opts_size++) + ; + for (opts_size = 0; options[opts_size].option; opts_size++) + ; + + merged_options_size = def_opts_size + opts_size; + merged_options = (XrmOptionDescRec *) + malloc ((merged_options_size + 1) * sizeof(*default_options)); + memcpy (merged_options, default_options, + (def_opts_size * sizeof(*default_options))); + memcpy (merged_options + def_opts_size, options, + ((opts_size + 1) * sizeof(*default_options))); + + for (def_defaults_size = 0; default_defaults[def_defaults_size]; + def_defaults_size++) + ; + for (defaults_size = 0; defaults[defaults_size]; defaults_size++) + ; + merged_defaults = (char **) + malloc ((def_defaults_size + defaults_size + 1) * sizeof (*defaults));; + memcpy (merged_defaults, default_defaults, + def_defaults_size * sizeof(*defaults)); + memcpy (merged_defaults + def_defaults_size, defaults, + (defaults_size + 1) * sizeof(*defaults)); +} + + +/* Make the X errors print out the name of this program, so we have some + clue which one has a bug when they die under the screensaver. + */ + +static int +screenhack_ehandler (Display *dpy, XErrorEvent *error) +{ + fprintf (stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, stderr)) + exit (-1); + else + fprintf (stderr, " (nonfatal.)\n"); + return 0; +} + +static Bool +MapNotify_event_p (Display *dpy, XEvent *event, XPointer window) +{ + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + + +#ifdef USE_GL +extern Visual *get_gl_visual (Screen *, const char *, const char *); +#endif + +#ifdef XLOCKMORE +extern void pre_merge_options (void); +#endif + + + +int +main (int argc, char **argv) +{ + XtAppContext app; + Widget toplevel; + Display *dpy; + Window window; + Visual *visual; + Colormap cmap; + Bool root_p; + XEvent event; + Boolean dont_clear /*, dont_map */; + char version[255]; + +#ifdef XLOCKMORE + pre_merge_options (); +#endif + merge_options (); + toplevel = XtAppInitialize (&app, progclass, merged_options, + merged_options_size, &argc, argv, + merged_defaults, 0, 0); + dpy = XtDisplay (toplevel); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + XSetErrorHandler (screenhack_ehandler); + + { + char *v = (char *) strdup(strchr(screensaver_id, ' ')); + char *s = (char *) strchr(v, ','); + *s = 0; + sprintf (version, "%s: from the XScreenSaver%s distribution.", + progclass, v); + free(v); + } + + if (argc > 1) + { + const char *s; + int i; + int x = 18; + int end = 78; + Bool help_p = !strcmp(argv[1], "-help"); + fprintf (stderr, "%s\n", version); + for (s = progclass; *s; s++) fprintf(stderr, " "); + fprintf (stderr, " http://people.netscape.com/jwz/xscreensaver/\n\n"); + + if (!help_p) + fprintf(stderr, "Unrecognised option: %s\n", argv[1]); + fprintf (stderr, "Options include: "); + for (i = 0; i < merged_options_size; i++) + { + char *sw = merged_options [i].option; + Bool argp = (merged_options [i].argKind == XrmoptionSepArg); + int size = strlen (sw) + (argp ? 6 : 0) + 2; + if (x + size >= end) + { + fprintf (stderr, "\n\t\t "); + x = 18; + } + x += size; + fprintf (stderr, "%s", sw); + if (argp) fprintf (stderr, " "); + if (i != merged_options_size - 1) fprintf (stderr, ", "); + } + fprintf (stderr, ".\n"); + exit (help_p ? 0 : 1); + } + + dont_clear = get_boolean_resource ("dontClearRoot", "Boolean"); +/*dont_map = get_boolean_resource ("dontMapWindow", "Boolean"); */ + mono_p = get_boolean_resource ("mono", "Boolean"); + if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) + mono_p = True; + + root_p = get_boolean_resource ("root", "Boolean"); + if (root_p) + { + XWindowAttributes xgwa; + window = RootWindowOfScreen (XtScreen (toplevel)); + XtDestroyWidget (toplevel); + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + visual = xgwa.visual; + } + else + { + Boolean def_visual_p; + Screen *screen = XtScreen (toplevel); + +#ifdef USE_GL + visual = get_gl_visual (screen, "visualID", "VisualID"); +#else + visual = get_visual_resource (screen, "visualID", "VisualID", False); +#endif + + if (toplevel->core.width <= 0) + toplevel->core.width = 600; + if (toplevel->core.height <= 0) + toplevel->core.height = 480; + + def_visual_p = (visual == DefaultVisualOfScreen (screen)); + + if (!def_visual_p) + { + unsigned int bg, bd; + Widget new; + + cmap = XCreateColormap (dpy, RootWindowOfScreen(screen), + visual, AllocNone); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap); + + new = XtVaAppCreateShell (progname, progclass, + topLevelShellWidgetClass, dpy, + XtNmappedWhenManaged, False, + XtNvisual, visual, + XtNdepth, visual_depth (screen, visual), + XtNwidth, toplevel->core.width, + XtNheight, toplevel->core.height, + XtNcolormap, cmap, + XtNbackground, (Pixel) bg, + XtNborderColor, (Pixel) bd, + 0); + XtDestroyWidget (toplevel); + toplevel = new; + XtRealizeWidget (toplevel); + window = XtWindow (toplevel); + } + else + { + XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0); + XtRealizeWidget (toplevel); + window = XtWindow (toplevel); + + if (get_boolean_resource ("installColormap", "InstallColormap")) + { + cmap = XCreateColormap (dpy, window, + DefaultVisualOfScreen (XtScreen (toplevel)), + AllocNone); + XSetWindowColormap (dpy, window, cmap); + } + else + { + cmap = DefaultColormap (dpy, DefaultScreen (dpy)); + } + } + +/* + if (dont_map) + { + XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0); + XtRealizeWidget (toplevel); + } + else +*/ + { + XtPopup (toplevel, XtGrabNone); + } + + XtVaSetValues(toplevel, XtNtitle, version, 0); + } + + if (!dont_clear) + { + XSetWindowBackground (dpy, window, + get_pixel_resource ("background", "Background", + dpy, cmap)); + XClearWindow (dpy, window); + } + + if (!root_p) + /* wait for it to be mapped */ + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + + XSync (dpy, False); + srandom ((int) time ((time_t *) 0)); + screenhack (dpy, window); /* doesn't return */ + return 0; +} diff --git a/hacks/screenhack.h b/hacks/screenhack.h new file mode 100644 index 00000000..a92cf70d --- /dev/null +++ b/hacks/screenhack.h @@ -0,0 +1,98 @@ +/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* Found in Don Hopkins' .plan file: + * + * The color situation is a total flying circus. The X approach to + * device independence is to treat everything like a MicroVax framebuffer + * on acid. A truely portable X application is required to act like the + * persistent customer in the Monty Python ``Cheese Shop'' sketch. Even + * the simplest applications must answer many difficult questions, like: + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR ROOT? + * root = RootWindow(display, DefaultScreen(display)); + * AND WHAT IS YOUR WINDOW? + * win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1, + * BlackPixel(display, DefaultScreen(display)), + * WhitePixel(display, DefaultScreen(display))) + * OH ALL RIGHT, YOU CAN GO ON. + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR COLORMAP? + * cmap = DefaultColormap(display, DefaultScreen(display)); + * AND WHAT IS YOUR FAVORITE COLOR? + * favorite_color = 0; / * Black. * / + * / * Whoops! No, I mean: * / + * favorite_color = BlackPixel(display, DefaultScreen(display)); + * / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * / + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR VISUAL? + * struct XVisualInfo vinfo; + * if (XMatchVisualInfo(display, DefaultScreen(display), + * 8, PseudoColor, &vinfo) != 0) + * visual = vinfo.visual; + * AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST? + * / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * / + * WHAT?! HOW AM I SUPPOSED TO KNOW THAT? + * AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm) + */ + +#ifndef __SCREENHACK_H__ +#define __SCREENHACK_H__ + +#include + +#include "config.h" + +#ifdef __hpux + /* Which of the ten billion standards does values.h belong to? + What systems always have it? */ +# include +#endif + +#include + +#include +#include +#include + +/* M_PI ought to have been defined in math.h, but... */ +#ifndef M_PI +# define M_PI 3.1415926535 +#endif + +#ifndef M_PI_2 +# define M_PI_2 1.5707963267 +#endif + +#include "yarandom.h" +#include "usleep.h" +#include "resources.h" +#include "hsv.h" +#include "colors.h" +#include "grabscreen.h" +#include "visual.h" + +extern Bool mono_p; +extern char *progname; +extern char *progclass; +extern XrmDatabase db; +extern XrmOptionDescRec options []; +extern char *defaults []; + +extern void screenhack (Display*,Window); + +#endif /* __SCREENHACK_H__ */ diff --git a/hacks/sierpinski.c b/hacks/sierpinski.c new file mode 100644 index 00000000..a75c3eb1 --- /dev/null +++ b/hacks/sierpinski.c @@ -0,0 +1,162 @@ +/* -*- Mode: C; tab-width: 4 -*- + * tri --- Sierpinski triangle fractal. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)tri.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1988-91 by Patrick J. Naughton. + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 05-Sep-96: Desmond Daignault Datatimes Incorporated + * . + */ + +#ifdef STANDALONE +# define PROGCLASS "Sierpinski" +# define HACK_INIT init_tri +# define HACK_DRAW draw_tri +# define tri_opts xlockmore_opts +# define DEFAULTS "*count: 2000 \n" \ + "*cycles: 100 \n" \ + "*delay: 400000 \n" \ + "*ncolors: 64 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt tri_opts = { + 0, NULL, 0, NULL, NULL }; + +typedef struct { + int width, height; + int time; + int px, py; + int total_npoints; + int npoints[3]; + unsigned long colors[3]; + XPoint *pointBuffer[3]; + XPoint vertex[3]; +} tristruct; + +static tristruct *tris = NULL; + +static void +startover(ModeInfo * mi) +{ + int j; + tristruct *tp = &tris[MI_SCREEN(mi)]; + + if (MI_NPIXELS(mi) > 2) { + tp->colors[0] = (NRAND(MI_NPIXELS(mi))); + tp->colors[1] = (tp->colors[0] + MI_NPIXELS(mi) / 7 + + NRAND(2 * MI_NPIXELS(mi) / 7)) % MI_NPIXELS(mi); + tp->colors[2] = (tp->colors[0] + 4 * MI_NPIXELS(mi) / 7 + + NRAND(2 * MI_NPIXELS(mi) / 7)) % MI_NPIXELS(mi); + } + for (j = 0; j < 3; j++) { + tp->vertex[j].x = NRAND(tp->width); + tp->vertex[j].y = NRAND(tp->height); + } + tp->px = NRAND(tp->width); + tp->py = NRAND(tp->height); + tp->time = 0; + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); +} + +void +init_tri(ModeInfo * mi) +{ + tristruct *tp; + int i; + + if (tris == NULL) { + if ((tris = (tristruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (tristruct))) == NULL) + return; + } + tp = &tris[MI_SCREEN(mi)]; + + tp->width = MI_WIN_WIDTH(mi); + tp->height = MI_WIN_HEIGHT(mi); + + tp->total_npoints = MI_BATCHCOUNT(mi); + if (tp->total_npoints < 1) + tp->total_npoints = 1; + for (i = 0; i < 3; i++) { + if (!tp->pointBuffer[i]) + tp->pointBuffer[i] = (XPoint *) malloc(tp->total_npoints * + sizeof (XPoint)); + } + startover(mi); +} + +void +draw_tri(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + tristruct *tp = &tris[MI_SCREEN(mi)]; + XPoint *xp[3]; + int i = 0, v; + + if (MI_NPIXELS(mi) <= 2) + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + for (i = 0; i < 3; i++) + xp[i] = tp->pointBuffer[i]; + for (i = 0; i < tp->total_npoints; i++) { + v = NRAND(3); + tp->px = (tp->px + tp->vertex[v].x) / 2; + tp->py = (tp->py + tp->vertex[v].y) / 2; + xp[v]->x = tp->px; + xp[v]->y = tp->py; + xp[v]++; + tp->npoints[v]++; + } + for (i = 0; i < 3; i++) { + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, tp->colors[i])); + XDrawPoints(display, MI_WINDOW(mi), gc, tp->pointBuffer[i], tp->npoints[i], + CoordModeOrigin); + tp->npoints[i] = 0; + } + if (++tp->time >= MI_CYCLES(mi)) + startover(mi); +} + +void +release_tri(ModeInfo * mi) +{ + if (tris != NULL) { + int screen, i; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + for (i = 0; i < 3; i++) + if (tris[screen].pointBuffer[i] != NULL) { + (void) free((void *) tris[screen].pointBuffer[i]); + } + } + (void) free((void *) tris); + tris = NULL; + } +} + +void +refresh_tri(ModeInfo * mi) +{ + /* Do nothing, it will refresh by itself */ +} diff --git a/local/man/man.1/sierpinski.1 b/hacks/sierpinski.man similarity index 100% rename from local/man/man.1/sierpinski.1 rename to hacks/sierpinski.man diff --git a/hacks/slidescreen.c b/hacks/slidescreen.c new file mode 100644 index 00000000..a3792cd0 --- /dev/null +++ b/hacks/slidescreen.c @@ -0,0 +1,265 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997 + * Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include "screenhack.h" + +static int grid_size; +static int pix_inc; +static int hole_x, hole_y; +static int bitmap_w, bitmap_h; +static int xoff, yoff; +static int grid_w, grid_h; +static int delay, delay2; +static GC gc; +int max_width, max_height; + +static void +init_slide (Display *dpy, Window window) +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + int border; + unsigned long fg; + Drawable d; + Colormap cmap; + Visual *visual; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + visual = xgwa.visual; + max_width = xgwa.width; + max_height = xgwa.height; + + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer"); + grid_size = get_integer_resource ("gridSize", "Integer"); + pix_inc = get_integer_resource ("pixelIncrement", "Integer"); + border = get_integer_resource ("internalBorderWidth", "InternalBorderWidth"); + fg = get_pixel_resource ("background", "Background", dpy, cmap); + + grab_screen_image (xgwa.screen, window); + + + /* Total kludge -- if grab_screen_image() installed a new colormap, assume + that pixel 0 is the one we should use. This further assumes that the + pixel is black, which overrides the user's -background setting, alas. + */ + XGetWindowAttributes (dpy, window, &xgwa); + if (cmap != xgwa.colormap) fg = 0; + + + if (delay < 0) delay = 0; + if (delay2 < 0) delay2 = 0; + if (pix_inc < 1) pix_inc = 1; + if (grid_size < 1) grid_size = 1; + + gcv.foreground = fg; + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCForeground |GCFunction | GCSubwindowMode, + &gcv); + + XGetWindowAttributes (dpy, window, &xgwa); + bitmap_w = xgwa.width; + bitmap_h = xgwa.height; + + grid_w = bitmap_w / grid_size; + grid_h = bitmap_h / grid_size; + hole_x = random () % grid_w; + hole_y = random () % grid_h; + xoff = (bitmap_w - (grid_w * grid_size)) / 2; + yoff = (bitmap_h - (grid_h * grid_size)) / 2; + + d = window; + + if (border) + { + for (i = 0; i <= bitmap_w; i += grid_size) + XFillRectangle (dpy, d, gc, xoff+i-border/2, yoff, border, bitmap_h); + for (i = 0; i <= bitmap_h; i += grid_size) + XFillRectangle (dpy, d, gc, xoff, yoff+i-border/2, bitmap_w, border); + } + + if (xoff) + { + XFillRectangle (dpy, d, gc, 0, 0, xoff, bitmap_h); + XFillRectangle (dpy, d, gc, bitmap_w - xoff, 0, xoff, bitmap_h); + } + if (yoff) + { + XFillRectangle (dpy, d, gc, 0, 0, bitmap_w, yoff); + XFillRectangle (dpy, d, gc, 0, bitmap_h - yoff, bitmap_w, yoff); + } + + XSync (dpy, True); + if (delay2) usleep (delay2 * 2); + for (i = 0; i < grid_size; i += pix_inc) + { + XPoint points [3]; + points[0].x = xoff + grid_size * hole_x; + points[0].y = yoff + grid_size * hole_y; + points[1].x = points[0].x + grid_size; + points[1].y = points[0].y; + points[2].x = points[0].x; + points[2].y = points[0].y + i; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[1].x = points[0].x; + points[1].y = points[0].y + grid_size; + points[2].x = points[0].x + i; + points[2].y = points[0].y + grid_size; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[0].x = points[1].x + grid_size; + points[0].y = points[1].y; + points[2].x = points[0].x; + points[2].y = points[0].y - i; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[1].x = points[0].x; + points[1].y = points[0].y - grid_size; + points[2].x = points[1].x - i; + points[2].y = points[1].y; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + XSync (dpy, True); + if (delay) usleep (delay); + } + + XFillRectangle (dpy, window, gc, + xoff + grid_size * hole_x, + yoff + grid_size * hole_y, + grid_size, grid_size); +} + +static void +slide1 (Display *dpy, Window window) +{ + /* this code is a total kludge, but who cares, it works... */ + int i, x, y, ix, iy, dx, dy, dir, w, h, size, inc; + static int last = -1; + do { + dir = random () % 4; + switch (dir) + { + case 0: dx = 0, dy = 1; break; + case 1: dx = -1, dy = 0; break; + case 2: dx = 0, dy = -1; break; + case 3: dx = 1, dy = 0; break; + default: abort (); + } + } while (dir == last || + hole_x + dx < 0 || hole_x + dx >= grid_w || + hole_y + dy < 0 || hole_y + dy >= grid_h); + if (grid_w > 1 && grid_h > 1) + last = (dir == 0 ? 2 : dir == 2 ? 0 : dir == 1 ? 3 : 1); + + switch (dir) + { + case 0: size = 1 + (random()%(grid_h - hole_y - 1)); h = size; w = 1; break; + case 1: size = 1 + (random()%hole_x); w = size; h = 1; break; + case 2: size = 1 + (random()%hole_y); h = size; w = 1; break; + case 3: size = 1 + (random()%(grid_w - hole_x - 1)); w = size; h = 1; break; + default: abort (); + } + + if (dx == -1) hole_x -= (size - 1); + else if (dy == -1) hole_y -= (size - 1); + + ix = x = xoff + (hole_x + dx) * grid_size; + iy = y = yoff + (hole_y + dy) * grid_size; + inc = pix_inc; + for (i = 0; i < grid_size; i += inc) + { + int fx, fy, tox, toy; + if (inc + i > grid_size) + inc = grid_size - i; + tox = x - dx * inc; + toy = y - dy * inc; + + fx = (x < 0 ? 0 : x > max_width ? max_width : x); + fy = (y < 0 ? 0 : y > max_height ? max_height : y); + tox = (tox < 0 ? 0 : tox > max_width ? max_width : tox); + toy = (toy < 0 ? 0 : toy > max_height ? max_height : toy); + + XCopyArea (dpy, window, window, gc, + fx, fy, + grid_size * w, grid_size * h, + tox, toy); + + x -= dx * inc; + y -= dy * inc; + switch (dir) + { + case 0: XFillRectangle (dpy, window, gc, + ix, y + grid_size * h, grid_size * w, iy - y); + break; + case 1: XFillRectangle (dpy, window, gc, ix, iy, x - ix, grid_size * h); + break; + case 2: XFillRectangle (dpy, window, gc, ix, iy, grid_size * w, y - iy); + break; + case 3: XFillRectangle (dpy, window, gc, + x + grid_size * w, iy, ix - x, grid_size * h); + break; + } + + XSync (dpy, True); + if (delay) usleep (delay); + } + switch (dir) + { + case 0: hole_y += size; break; + case 1: hole_x--; break; + case 2: hole_y--; break; + case 3: hole_x += size; break; + } +} + + +char *progclass = "SlidePuzzle"; + +char *defaults [] = { + "*dontClearRoot: True", + +#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ + "*visualID: Best", +#endif + + "*background: Black", + "*gridSize: 70", + "*pixelIncrement: 10", + "*internalBorderWidth: 1", + "*delay: 50000", + "*delay2: 1000000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-grid-size", ".gridSize", XrmoptionSepArg, 0 }, + { "-ibw", ".internalBorderWidth", XrmoptionSepArg, 0 }, + { "-increment", ".pixelIncrement", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + init_slide (dpy, window); + while (1) + { + slide1 (dpy, window); + if (delay2) usleep (delay2); + } +} diff --git a/local/man/man.1/slidescreen.1 b/hacks/slidescreen.man similarity index 100% rename from local/man/man.1/slidescreen.1 rename to hacks/slidescreen.man diff --git a/hacks/slip.c b/hacks/slip.c new file mode 100644 index 00000000..3b83e2bb --- /dev/null +++ b/hacks/slip.c @@ -0,0 +1,300 @@ +/* -*- Mode: C; tab-width: 4 -*- + * slip --- lots of blits. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)slip.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1992 by Scott Draves (spot@cs.cmu.edu) + * + * 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. + * + * Revision History: + * 12-May-97: jwz@netscape.com: turned into a standalone program. + * 01-Dec-95: Patched for VMS . + */ + +#ifdef STANDALONE +# define PROGCLASS "Slip" +# define HACK_INIT init_slip +# define HACK_DRAW draw_slip +# define slip_opts xlockmore_opts +# define DEFAULTS "*count: 35 \n" \ + "*cycles: 50 \n" \ + "*delay: 50000 \n" \ + "*ncolors: 200 \n" +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt slip_opts = { + 0, NULL, 0, NULL, NULL }; + +typedef struct { + int width, height; + int nblits_remaining; + int blit_width, blit_height; + int mode; + int first_time; + int backwards; +} slipstruct; +static slipstruct *slips = NULL; + +static short +halfrandom(int mv) +{ + static short lasthalf = 0; + unsigned long r; + + if (lasthalf) { + r = lasthalf; + lasthalf = 0; + } else { + r = LRAND(); + lasthalf = r >> 16; + } + return r % mv; +} + +static int +erandom(int mv) +{ + static int stage = 0; + static unsigned long r; + int res; + + if (0 == stage) { + r = LRAND(); + stage = 7; + } + res = r & 0xf; + r = r >> 4; + stage--; + if (res & 8) + return res & mv; + else + return -(res & mv); +} + +static void +prepare_screen(ModeInfo * mi, slipstruct * s) +{ + + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + int i, n, w = s->width / 20; + int not_solid = halfrandom(10); + +#ifdef STANDALONE /* jwz -- sometimes hack the desktop image! */ + if (halfrandom(5) == 0) + { + grab_screen_image(DefaultScreenOfDisplay (MI_DISPLAY(mi)), + MI_WINDOW(mi)); + return; + } +#endif + + s->backwards = LRAND() & 1; /* jwz: go the other way sometimes */ + + if (s->first_time || !halfrandom(5)) { + XClearWindow(display, MI_WINDOW(mi)); + n = 300; + } else { + if (halfrandom(5)) + return; + if (halfrandom(5)) + n = 100; + else + n = 2000; + } + + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi)))); + else if (halfrandom(2)) + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + else + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + + for (i = 0; i < n; i++) { + if (not_solid) + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi)))); + else if (halfrandom(2)) + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + else + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + XFillRectangle(display, MI_WINDOW(mi), gc, + halfrandom(s->width - w), + halfrandom(s->height - w), + w, w); + } + s->first_time = 0; +} + +static int +quantize(double d) +{ + int i = (int) floor(d); + double f = d - i; + + if ((LRAND() & 0xff) < f * 0xff) + i++; + return i; +} + +void +init_slip(ModeInfo * mi) +{ + slipstruct *sp; + + if (slips == NULL) { + if ((slips = (slipstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (slipstruct))) == NULL) + return; + } + sp = &slips[MI_SCREEN(mi)]; + + sp->width = MI_WIN_WIDTH(mi); + sp->height = MI_WIN_HEIGHT(mi); + + sp->blit_width = sp->width / 25; + sp->blit_height = sp->height / 25; + sp->nblits_remaining = 0; + sp->mode = 0; + sp->first_time = 1; + + /* no "NoExpose" events from XCopyArea wanted */ + XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False); +} + +void +draw_slip(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + GC gc = MI_GC(mi); + slipstruct *s = &slips[MI_SCREEN(mi)]; + int timer; + + timer = MI_BATCHCOUNT(mi) * MI_CYCLES(mi); + + while (timer--) { + int xi = halfrandom(s->width - s->blit_width); + int yi = halfrandom(s->height - s->blit_height); + double x, y, dx = 0, dy = 0, t, s1, s2; + + if (0 == s->nblits_remaining--) { + static lut[] = + {0, 0, 0, 1, 1, 1, 2}; + + prepare_screen(mi, s); + s->nblits_remaining = MI_BATCHCOUNT(mi) * + (2000 + halfrandom(1000) + halfrandom(1000)); + if (s->mode == 2) + s->mode = halfrandom(2); + else + s->mode = lut[halfrandom(7)]; + } + x = (2 * xi + s->blit_width) / (double) s->width - 1; + y = (2 * yi + s->blit_height) / (double) s->height - 1; + + /* (x,y) is in biunit square */ + switch (s->mode) { + case 0: + dx = x; + dy = y; + + if (dy < 0) { + dy += 0.04; + if (dy > 0) + dy = 0.00; + } + if (dy > 0) { + dy -= 0.04; + if (dy < 0) + dy = 0.00; + } + t = dx * dx + dy * dy + 1e-10; + s1 = 2 * dx * dx / t - 1; + s2 = 2 * dx * dy / t; + dx = s1 * 5; + dy = s2 * 5; + if (s->backwards) { /* jwz: go the other way sometimes */ + dx = -dx; + dy = -dy; + } + break; + case 1: + dx = erandom(3); + dy = erandom(3); + break; + case 2: + dx = x * 3; + dy = y * 3; + break; + } + { + int qx = xi + quantize(dx), qy = yi + quantize(dy); + int wrap; + + if (qx < 0 || qy < 0 || + qx >= s->width - s->blit_width || + qy >= s->height - s->blit_height) + continue; + + XCopyArea(display, window, window, gc, xi, yi, + s->blit_width, s->blit_height, + qx, qy); + + switch (s->mode) { + case 0: + /* wrap */ + wrap = s->width - (2 * s->blit_width); + if (qx > wrap) + XCopyArea(display, window, window, gc, qx, qy, + s->blit_width, s->blit_height, + qx - wrap, qy); + + if (qx < 2 * s->blit_width) + XCopyArea(display, window, window, gc, qx, qy, + s->blit_width, s->blit_height, + qx + wrap, qy); + + wrap = s->height - (2 * s->blit_height); + if (qy > wrap) + XCopyArea(display, window, window, gc, qx, qy, + s->blit_width, s->blit_height, + qx, qy - wrap); + + if (qy < 2 * s->blit_height) + XCopyArea(display, window, window, gc, qx, qy, + s->blit_width, s->blit_height, + qx, qy + wrap); + break; + case 1: + case 2: + break; + } + } + } +} + +void +release_slip(ModeInfo * mi) +{ + if (slips != NULL) { + (void) free((void *) slips); + slips = NULL; + } +} diff --git a/local/man/man.1/slip.1 b/hacks/slip.man similarity index 100% rename from local/man/man.1/slip.1 rename to hacks/slip.man diff --git a/hacks/sphere.c b/hacks/sphere.c new file mode 100644 index 00000000..728c7240 --- /dev/null +++ b/hacks/sphere.c @@ -0,0 +1,246 @@ +/* -*- Mode: C; tab-width: 4 -*- + * sphere.c --- draw a bunch of shaded spheres + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)sphere.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA. + * + * All Rights Reserved + * + * 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, and that the names of Sun or MIT not be used in advertising + * or publicity pertaining to distribution of the software without specific + * prior written permission. Sun and M.I.T. make no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without any express or implied warranty. + * + * SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * *************************************************************************** + * + * Revision History: + * 30-May-97: jwz@netscape.com: made it go vertically as well as horizontally. + * 27-May-97: jwz@netscape.com: turned into a standalone program. + * 2-Sep-93: xlock version (David Bagley bagleyd@bigfoot.com) + * 1988: Revised to use SunView canvas instead of gfxsw Sun Microsystems + * 1982: Orignal Algorithm Tom Duff Lucasfilm Ltd. + */ + +#ifdef STANDALONE +# define PROGCLASS "Sphere" +# define HACK_INIT init_sphere +# define HACK_DRAW draw_sphere +# define sphere_opts xlockmore_opts +# define DEFAULTS "*delay: 1000 \n" \ + "*ncolors: 64 \n" +# define BRIGHT_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt sphere_opts = { + 0, NULL, 0, NULL, NULL }; + +/*- + * (NX, NY, NZ) is the light source vector -- length should be 100 + */ +#define NX 48 +#define NY (-36) +#define NZ 80 +#define NR 100 +#define SQRT(a) ((int)sqrt((double)(a))) + +typedef struct { + int width, height; + int radius; + int x0; /* x center */ + int y0; /* y center */ + int color; + int x, y; + int dirx, diry; + int maxx, maxy; + XPoint *points; +} spherestruct; + +static spherestruct *spheres = NULL; + +void +init_sphere(ModeInfo * mi) +{ + spherestruct *sp; + + if (spheres == NULL) { + if ((spheres = (spherestruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (spherestruct))) == NULL) + return; + } + sp = &spheres[MI_SCREEN(mi)]; + + if (sp->points) { + (void) free((void *) sp->points); + sp->points = NULL; + } + sp->width = MI_WIN_WIDTH(mi); + sp->height = MI_WIN_HEIGHT(mi); + sp->points = (XPoint *) malloc(sp->height * sizeof (XPoint)); + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + + sp->dirx = 1; +} + +void +draw_sphere(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + spherestruct *sp = &spheres[MI_SCREEN(mi)]; + register minx = 0, maxx = 0, miny = 0, maxy = 0, npts = 0; + + if ((sp->dirx && ABS(sp->x) >= sp->radius) || + (sp->diry && ABS(sp->y) >= sp->radius)) { + sp->radius = NRAND(MIN(sp->width / 2, sp->height / 2) - 1) + 1; + + if (LRAND() & 1) { + sp->dirx = (LRAND() & 1) * 2 - 1; + sp->diry = 0; + } else { + sp->dirx = 0; + sp->diry = (LRAND() & 1) * 2 - 1; + } + sp->x0 = NRAND(sp->width); + sp->y0 = NRAND(sp->height); + + sp->x = -sp->radius * sp->dirx; + sp->y = -sp->radius * sp->diry; + + if (MI_NPIXELS(mi) > 2) + sp->color = NRAND(MI_NPIXELS(mi)); + } + if (sp->dirx == 1) { + if (sp->x0 + sp->x < 0) + sp->x = -sp->x0; + } else if (sp->dirx == -1) { + if (sp->x0 + sp->x >= sp->width) + sp->x = sp->width - sp->x0 - 1; + } + if (sp->diry == 1) { + if (sp->y0 + sp->y < 0) + sp->y = -sp->y0; + } else if (sp->diry == -1) { + if (sp->y0 + sp->y >= sp->height) + sp->y = sp->height - sp->y0 - 1; + } + if (sp->dirx) { + sp->maxy = SQRT(sp->radius * sp->radius - sp->x * sp->x); + miny = -sp->maxy; + if (sp->y0 - sp->maxy < 0) + miny = -sp->y0; + maxy = sp->maxy; + } + if (sp->diry) { + sp->maxx = SQRT(sp->radius * sp->radius - sp->y * sp->y); + minx = -sp->maxx; + if (sp->x0 - sp->maxx < 0) + minx = -sp->x0; + maxx = sp->maxx; + } + if (sp->dirx) { + if (sp->y0 + sp->maxy >= sp->height) + maxy = sp->height - sp->y0; + } + if (sp->diry) { + if (sp->x0 + sp->maxx >= sp->width) + maxx = sp->width - sp->x0; + } + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + + if (sp->dirx) + XDrawLine(display, MI_WINDOW(mi), gc, + sp->x0 + sp->x, sp->y0 + miny, sp->x0 + sp->x, sp->y0 + maxy); + if (sp->diry) + XDrawLine(display, MI_WINDOW(mi), gc, + sp->x0 + minx, sp->y0 + sp->y, sp->x0 + maxx, sp->y0 + sp->y); + + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, sp->color)); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + + if (sp->dirx) + for (sp->y = miny; sp->y <= maxy; sp->y++) + if ((NRAND(sp->radius * NR)) <= + (NX * sp->x + NY * sp->y + NZ * + SQRT(sp->radius * sp->radius - sp->x * sp->x - sp->y * sp->y))) { + sp->points[npts].x = sp->x + sp->x0; + sp->points[npts].y = sp->y + sp->y0; + npts++; + } + if (sp->diry) + for (sp->x = minx; sp->x <= maxx; sp->x++) + if ((NRAND(sp->radius * NR)) <= + (NX * sp->x + NY * sp->y + NZ * + SQRT(sp->radius * sp->radius - sp->x * sp->x - sp->y * sp->y))) { + sp->points[npts].x = sp->x + sp->x0; + sp->points[npts].y = sp->y + sp->y0; + npts++; + } + XDrawPoints(display, MI_WINDOW(mi), gc, sp->points, npts, CoordModeOrigin); + if (sp->dirx == 1) { + sp->x++; + if (sp->x0 + sp->x >= sp->width) + sp->x = sp->radius; + } else if (sp->dirx == -1) { + sp->x--; + if (sp->x0 + sp->x < 0) + sp->x = -sp->radius; + } + if (sp->diry == 1) { + sp->y++; + if (sp->y0 + sp->y >= sp->height) + sp->y = sp->radius; + } else if (sp->diry == -1) { + sp->y--; + if (sp->y0 + sp->y < 0) + sp->y = -sp->radius; + } +} + +void +release_sphere(ModeInfo * mi) +{ + if (spheres != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + spherestruct *sp = &spheres[screen]; + + if (sp->points) { + (void) free((void *) sp->points); + sp->points = NULL; + } + } + (void) free((void *) spheres); + spheres = NULL; + } +} + +void +refresh_sphere(ModeInfo * mi) +{ + spherestruct *sp = &spheres[MI_SCREEN(mi)]; + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + sp->x = -sp->radius; +} diff --git a/local/man/man.1/sphere.1 b/hacks/sphere.man similarity index 100% rename from local/man/man.1/sphere.1 rename to hacks/sphere.man diff --git a/hacks/spiral.c b/hacks/spiral.c new file mode 100644 index 00000000..24b2b73c --- /dev/null +++ b/hacks/spiral.c @@ -0,0 +1,300 @@ +/* -*- Mode: C; tab-width: 4 -*- + * spiral --- low cpu screen design. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)spiral.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1994 Darrick Brown. + * + * 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. + * + * Idea based on a graphics demo I saw a *LONG* time ago. + * + * See xlock.c for copying information. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * 24-Jul-95: Fix to allow cycles not to have an arbitrary value by + * Peter Schmitzberger (schmitz@coma.sbg.ac.at). + * 06-Mar-95: Finished cleaning up and final testing. + * Copyright (c) 1994 by Darrick Brown. + * + * 03-Mar-95: Cleaned up code. + * 12-Jul-94: Written. + */ + +#ifdef STANDALONE +# define PROGCLASS "Spiral" +# define HACK_INIT init_spiral +# define HACK_DRAW draw_spiral +# define spiral_opts xlockmore_opts +# define DEFAULTS "*count: 40 \n" \ + "*cycles: 350 \n" \ + "*delay: 50000 \n" \ + "*ncolors: 64 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt spiral_opts = { + 0, NULL, 0, NULL, NULL }; + +#define MAXTRAIL 512 /* The length of the trail */ +#define MAXDOTS 40 +#define MINDOTS 1 +#define TWOPI (2.0*M_PI) /* for convienence */ +#define JAGGINESS 4 /* This sets the "Craziness" of the spiral (I like 4) */ +#define SPEED 2.0 + +/* How many segments to draw per cycle when redrawing */ +#define REDRAWSTEP 3 + +typedef struct { + float hx, hy, ha, hr; +} Traildots; + +typedef struct { + Traildots *traildots; + float cx, cy; + float angle; + float radius; + float dr, da; + float dx, dy; + int erase; + int inc; + float colors; + int width, height; + float top, bottom, left, right; + int dots, nlength; + int redrawing, redrawpos; +} spiralstruct; + +static spiralstruct *spirals = NULL; + +static void draw_dots(ModeInfo * mi, int in); + +#define TFX(sp,x) ((int)((x/sp->right)*(float)sp->width)) +#define TFY(sp,y) ((int)((y/sp->top)*(float)sp->height)) + +static void +draw_dots(ModeInfo * mi, int in) +{ + + float i, inc; + float x, y; + + spiralstruct *sp = &spirals[MI_SCREEN(mi)]; + + inc = TWOPI / (float) sp->dots; + for (i = 0.0; i < TWOPI; i += inc) { + x = sp->traildots[in].hx + COSF(i + sp->traildots[in].ha) * + sp->traildots[in].hr; + y = sp->traildots[in].hy + SINF(i + sp->traildots[in].ha) * + sp->traildots[in].hr; + XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), + TFX(sp, x), TFY(sp, y)); + } +} + +void +init_spiral(ModeInfo * mi) +{ + spiralstruct *sp; + int i; + + if (spirals == NULL) { + if ((spirals = (spiralstruct *) calloc(MI_NUM_SCREENS(mi), + sizeof (spiralstruct))) == NULL) + return; + } + sp = &spirals[MI_SCREEN(mi)]; + + sp->width = MI_WIN_WIDTH(mi); + sp->height = MI_WIN_HEIGHT(mi); + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + + /* Init */ + sp->nlength = MI_CYCLES(mi); + + if (!sp->traildots) + sp->traildots = (Traildots *) malloc(sp->nlength * sizeof (Traildots)); + + /* initialize the allocated array */ + for (i = 0; i < sp->nlength; i++) { + sp->traildots[i].hx = 0.0; + sp->traildots[i].hy = 0.0; + sp->traildots[i].ha = 0.0; + sp->traildots[i].hr = 0.0; + } + sp->redrawing = 0; + + /* keep the window parameters proportional */ + sp->top = 10000.0; + sp->bottom = 0; + sp->right = (float) (sp->width) / (float) (sp->height) * (10000.0); + sp->left = 0; + + /* assign the initial values */ + sp->cx = (float) (5000.0 - NRAND(2000)) / 10000.0 * sp->right; + sp->cy = (float) (5000.0 - NRAND(2000)); + sp->radius = (float) (NRAND(200) + 200); + sp->angle = 0.0; + sp->dx = (float) (10 - NRAND(20)) * SPEED; + sp->dy = (float) (10 - NRAND(20)) * SPEED; + sp->dr = (float) ((NRAND(10) + 4) * (1 - (LRAND() & 1) * 2)); + sp->da = (float) NRAND(360) / 7200.0 + 0.01; + if (MI_NPIXELS(mi) > 2) + sp->colors = (float) NRAND(MI_NPIXELS(mi)); + sp->erase = 0; + sp->inc = 0; + sp->traildots[sp->inc].hx = sp->cx; + sp->traildots[sp->inc].hy = sp->cy; + sp->traildots[sp->inc].ha = sp->angle; + sp->traildots[sp->inc].hr = sp->radius; + sp->inc++; + + sp->dots = MI_BATCHCOUNT(mi); + if (sp->dots < -MINDOTS) + sp->dots = NRAND(sp->dots - MINDOTS + 1) + MINDOTS; + /* Absolute minimum */ + if (sp->dots < MINDOTS) + sp->dots = MINDOTS; +} + +void +draw_spiral(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + GC gc = MI_GC(mi); + spiralstruct *sp = &spirals[MI_SCREEN(mi)]; + int i, j; + + if (sp->erase == 1) { + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + draw_dots(mi, sp->inc); + } + sp->cx += sp->dx; + sp->traildots[sp->inc].hx = sp->cx; + + if ((sp->cx > 9000.0) || (sp->cx < 1000.0)) + sp->dx *= -1.0; + + sp->cy += sp->dy; + sp->traildots[sp->inc].hy = sp->cy; + + if ((sp->cy > 9000.0) || (sp->cy < 1000.0)) + sp->dy *= -1.0; + + sp->radius += sp->dr; + sp->traildots[sp->inc].hr = sp->radius; + + if ((sp->radius > 2500.0) && (sp->dr > 0.0)) + sp->dr *= -1.0; + else if ((sp->radius < 50.0) && (sp->radius < 0.0)) + sp->dr *= -1.0; + + /* Randomly give some variations to: */ + + /* spiral direction (if it is within the boundaries) */ + if ((NRAND(3000) < 1 * JAGGINESS) && + (((sp->cx > 2000.0) && (sp->cx < 8000.0)) && + ((sp->cy > 2000.0) && (sp->cy < 8000.0)))) { + sp->dx = (float) (10 - NRAND(20)) * SPEED; + sp->dy = (float) (10 - NRAND(20)) * SPEED; + } + /* The speed of the change in size of the spiral */ + if (NRAND(3000) < 1 * JAGGINESS) { + if (LRAND() & 1) + sp->dr += (float) (NRAND(3) + 1); + else + sp->dr -= (float) (NRAND(3) + 1); + + /* don't let it get too wild */ + if (sp->dr > 18.0) + sp->dr = 18.0; + else if (sp->dr < 4.0) + sp->dr = 4.0; + } + /* The speed of rotation */ + if (NRAND(3000) < 1 * JAGGINESS) + sp->da = (float) NRAND(360) / 7200.0 + 0.01; + + /* Reverse rotation */ + if (NRAND(3000) < 1 * JAGGINESS) + sp->da *= -1.0; + + sp->angle += sp->da; + sp->traildots[sp->inc].ha = sp->angle; + + if (sp->angle > TWOPI) + sp->angle -= TWOPI; + else if (sp->angle < 0.0) + sp->angle += TWOPI; + + sp->colors += (float) MI_NPIXELS(mi) / ((float) (2 * sp->nlength)); + if (sp->colors >= (float) MI_NPIXELS(mi)) + sp->colors = 0.0; + + if (MI_NPIXELS(mi) > 2) + XSetForeground(display, gc, MI_PIXEL(mi, (int) sp->colors)); + else + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + draw_dots(mi, sp->inc); + sp->inc++; + + if (sp->inc > sp->nlength - 1) { + sp->inc -= sp->nlength; + sp->erase = 1; + } + if (sp->redrawing) { + for (i = 0; i < REDRAWSTEP; i++) { + j = (sp->inc - sp->redrawpos + sp->nlength) % sp->nlength; + draw_dots(mi, j); + + if (++(sp->redrawpos) >= sp->nlength) { + sp->redrawing = 0; + break; + } + } + } +} + +void +release_spiral(ModeInfo * mi) +{ + if (spirals != NULL) { + int screen; + + for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) { + spiralstruct *sp = &spirals[screen]; + + if (sp->traildots) + (void) free((void *) sp->traildots); + } + (void) free((void *) spirals); + spirals = NULL; + } +} + +void +refresh_spiral(ModeInfo * mi) +{ + spiralstruct *sp = &spirals[MI_SCREEN(mi)]; + + sp->redrawing = 1; + sp->redrawpos = 0; +} diff --git a/local/man/man.1/spiral.1 b/hacks/spiral.man similarity index 100% rename from local/man/man.1/spiral.1 rename to hacks/spiral.man diff --git a/hacks/starfish.c b/hacks/starfish.c new file mode 100644 index 00000000..143ddf8b --- /dev/null +++ b/hacks/starfish.c @@ -0,0 +1,535 @@ +/* xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include +#include /* for gettimeofday() */ +#include "screenhack.h" +#include "spline.h" + + +static Colormap cmap; +static Bool cycle_p; +static XColor *colors; +static int ncolors; +static int fg_index; +static GC gc; + +#define SCALE 1000 /* fixed-point math, for sub-pixel motion */ + + +#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n)))) +#define RANDSIGN() ((random() & 1) ? 1 : -1) + +enum starfish_mode { + pulse, + zoom +}; + + +struct starfish { + enum starfish_mode mode; + Bool blob_p; + int skip; + long x, y; /* position of midpoint */ + double th; /* angle of rotation */ + double rotv; /* rotational velocity */ + double rota; /* rotational acceleration */ + long elasticity; /* how fast it deforms: radial velocity */ + double rot_max; + long min_r, max_r; /* radius range */ + int npoints; /* control points */ + long *r; /* radii */ + spline *spline; + XPoint *prev; + int n_prev; +}; + +static struct starfish * +make_starfish (int maxx, int maxy, int size) +{ + struct starfish *s = (struct starfish *) calloc(1, sizeof(*s)); + int i; + int mid; + + s->blob_p = get_boolean_resource ("blob", "Blob"); + s->elasticity = SCALE * get_float_resource ("thickness", "Thickness"); + + if (s->elasticity == 0) + /* bell curve from 0-15, avg 7.5 */ + s->elasticity = RAND(5*SCALE) + RAND(5*SCALE) + RAND(5*SCALE); + + s->rotv = get_float_resource ("rotation", "Rotation"); + if (s->rotv == -1) + /* bell curve from 0-12 degrees, avg 6 */ + s->rotv = frand(4) + frand(4) + frand(4); + + s->rotv /= 360; /* convert degrees to ratio */ + + if (s->blob_p) + { + s->elasticity *= 3; + s->rotv *= 3; + } + + s->rot_max = s->rotv * 2; + s->rota = 0.0004 + frand(0.0002); + + + if (! (random() % 20)) + size *= frand(0.35) + frand(0.35) + 0.3; + + { + static char skips[] = { 2, 2, 2, 2, + 3, 3, 3, + 6, 6, + 12 }; + s->skip = skips[random() % sizeof(skips)]; + } + + if (! (random() % (s->skip == 2 ? 3 : 12))) + s->mode = zoom; + else + s->mode = pulse; + + maxx *= SCALE; + maxy *= SCALE; + size *= SCALE; + + s->max_r = size; + s->min_r = 0; + + if (s->min_r < (5*SCALE)) s->min_r = (5*SCALE); + mid = ((s->min_r + s->max_r) / 2); + + s->x = maxx/2; + s->y = maxy/2; + + s->th = frand(M_PI+M_PI) * RANDSIGN(); + + { + static char sizes[] = { 3, 3, 3, 3, 3, + 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, + 8, 8, 8, + 10, + 35 }; + int nsizes = sizeof(sizes); + if (s->skip > 3) + nsizes -= 4; + s->npoints = s->skip * sizes[random() % nsizes]; + } + + s->spline = make_spline (s->npoints); + s->r = (long *) malloc (sizeof(*s->r) * s->npoints); + + for (i = 0; i < s->npoints; i++) + s->r[i] = ((i % s->skip) == 0) ? 0 : size; + + return s; +} + + +static void +free_starfish (struct starfish *s) +{ + if (s->r) free (s->r); + if (s->prev) free (s->prev); + if (s->spline) + { + if (s->spline->control_x) free (s->spline->control_x); + if (s->spline->control_y) free (s->spline->control_y); + if (s->spline->points) free (s->spline->points); + free (s->spline); + } + free (s); +} + + +static void +throb_starfish (struct starfish *s) +{ + int i; + double frac = ((M_PI+M_PI) / s->npoints); + + for (i = 0; i < s->npoints; i++) + { + long r = s->r[i]; + long ra = (r > 0 ? r : -r); + double th = (s->th > 0 ? s->th : -s->th); + long x, y; + long elasticity = s->elasticity; + + /* place control points evenly around perimiter, shifted by theta */ + x = s->x + ra * cos (i * frac + th); + y = s->y + ra * sin (i * frac + th); + + s->spline->control_x[i] = x / SCALE; + s->spline->control_y[i] = y / SCALE; + + if (s->mode == zoom && ((i % s->skip) == 0)) + continue; + + /* Slow down near the end points: move fastest in the middle. */ + { + double ratio = (double)ra / (double)(s->max_r - s->min_r); + if (ratio > 0.5) ratio = 1-ratio; /* flip */ + ratio *= 2; /* normalize */ + ratio = (ratio * 0.9) + 0.1; /* fudge */ + elasticity *= ratio; + } + + + /* Increase/decrease radius by elasticity */ + ra += (r >= 0 ? elasticity : -elasticity); + if ((i % s->skip) == 0) + ra += (elasticity / 2); + + r = ra * (r >= 0 ? 1 : -1); + + /* If we've reached the end (too long or too short) reverse direction. */ + if ((ra > s->max_r && r >= 0) || + (ra < s->min_r && r < 0)) + r = -r; + + s->r[i] = r; + } +} + + +static void +spin_starfish (struct starfish *s) +{ + double th = s->th; + if (th < 0) + th = -(th + s->rotv); + else + th += s->rotv; + + if (th > (M_PI+M_PI)) + th -= (M_PI+M_PI); + else if (th < 0) + th += (M_PI+M_PI); + + s->th = (s->th > 0 ? th : -th); + + s->rotv += s->rota; + + if (s->rotv > s->rot_max || + s->rotv < -s->rot_max) + { + s->rota = -s->rota; + } + /* If it stops, start it going in the other direction. */ + else if (s->rotv < 0) + { + if (random() & 1) + { + /* keep going in the same direction */ + s->rotv = 0; + if (s->rota < 0) + s->rota = -s->rota; + } + else + { + /* reverse gears */ + s->rotv = -s->rotv; + s->rota = -s->rota; + s->th = -s->th; + } + } + + + /* Alter direction of rotational acceleration randomly. */ + if (! (random() % 120)) + s->rota = -s->rota; + + /* Change acceleration very occasionally. */ + if (! (random() % 200)) + { + if (random() & 1) + s->rota *= 1.2; + else + s->rota *= 0.8; + } +} + + +static void +draw_starfish (Display *dpy, Drawable drawable, GC gc, struct starfish *s, + Bool fill_p) +{ + compute_closed_spline (s->spline); + if (s->prev) + { + XPoint *points = (XPoint *) + malloc (sizeof(XPoint) * (s->n_prev + s->spline->n_points + 2)); + int i = s->spline->n_points; + int j = s->n_prev; + memcpy (points, s->spline->points, (i * sizeof(*points))); + memcpy (points+i, s->prev, (j * sizeof(*points))); + + if (s->blob_p) + XClearWindow (dpy, drawable); + XFillPolygon (dpy, drawable, gc, points, i+j, Complex, CoordModeOrigin); + free (points); + + free (s->prev); + s->prev = 0; + } + + s->prev = (XPoint *) malloc (s->spline->n_points * sizeof(XPoint)); + memcpy (s->prev, s->spline->points, s->spline->n_points * sizeof(XPoint)); + s->n_prev = s->spline->n_points; + +#ifdef DEBUG + if (s->blob_p) + { + int i; + for (i = 0; i < s->npoints; i++) + XDrawLine (dpy, drawable, gc, s->x/SCALE, s->y/SCALE, + s->spline->control_x[i], s->spline->control_y[i]); + } +#endif +} + + +static struct starfish * +make_window_starfish (Display *dpy, Window window) +{ + XWindowAttributes xgwa; + int size; + Bool blob_p = get_boolean_resource ("blob", "Blob"); + XGetWindowAttributes (dpy, window, &xgwa); + size = (xgwa.width < xgwa.height ? xgwa.width : xgwa.height); + if (blob_p) size /= 2; + else size *= 1.3; + return make_starfish (xgwa.width, xgwa.height, size); +} + + +static struct starfish * +init_starfish (Display *dpy, Window window) +{ + static Bool first_time = True; + XGCValues gcv; + XWindowAttributes xgwa; + Bool blob_p = get_boolean_resource ("blob", "Blob"); + XGetWindowAttributes (dpy, window, &xgwa); + + cmap = xgwa.colormap; + cycle_p = get_boolean_resource ("cycle", "Cycle"); + + if (!first_time) + { + if (colors && ncolors) + free_colors (dpy, cmap, colors, ncolors); + if (colors) + free (colors); + colors = 0; + } + + ncolors = get_integer_resource ("colors", "Colors"); + if (ncolors < 2) ncolors = 2; + if (ncolors <= 2) mono_p = True; + + if (mono_p) + colors = 0; + else + colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1)); + + if (mono_p || blob_p) + cycle_p = False; + + if (mono_p) + ; + else if (random() % 3) + make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, &cycle_p, True); + else + make_uniform_colormap (dpy, xgwa.visual, cmap, colors, &ncolors, + True, &cycle_p, True); + + if (ncolors < 2) ncolors = 2; + if (ncolors <= 2) mono_p = True; + + if (mono_p) cycle_p = False; + + fg_index = 0; + + if (!mono_p && !blob_p) + { + gcv.foreground = colors[fg_index].pixel; + XSetWindowBackground (dpy, window, gcv.foreground); + } + + if (first_time) + { + XClearWindow (dpy, window); + first_time = False; + } + + gcv.fill_rule = EvenOddRule; + gc = XCreateGC (dpy, window, GCForeground | GCFillRule, &gcv); + + return make_window_starfish (dpy, window); +} + + + +static void +run_starfish (Display *dpy, Window window, struct starfish *s) +{ + throb_starfish (s); + spin_starfish (s); + draw_starfish (dpy, window, gc, s, False); + + if (mono_p) + { + static Bool init = False; + static unsigned long black, white; + if (!init) + { + black = get_pixel_resource ("background", "Background", dpy, cmap); + white = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + init = True; + fg_index = white; + XSetForeground (dpy, gc, fg_index); + } + else if (!s->blob_p) + { + fg_index = (fg_index == black ? white : black); + XSetForeground (dpy, gc, fg_index); + } + } + else + { + fg_index = (fg_index + 1) % ncolors; + XSetForeground (dpy, gc, colors [fg_index].pixel); + } +} + + + + +char *progclass = "Starfish"; + +char *defaults [] = { + "Starfish.background: black", /* to placate SGI */ + "Starfish.foreground: white", + "*delay: 10000", + "*cycleDelay: 100000", + "*thickness: 0", /* pixels, 0 = random */ + "*rotation: -1", /* degrees, -1 = "random" */ + "*colors: 200", + "*cycle: true", + "*duration: 30", + "*delay2: 5", + "*blob: false", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { "-thickness", ".thickness", XrmoptionSepArg, 0 }, + { "-rotation", ".rotation", XrmoptionSepArg, 0 }, + { "-colors", ".colors", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" }, + { "-duration", ".duration", XrmoptionSepArg, 0 }, + { "-blob", ".blob", XrmoptionNoArg, "True" }, + { "-no-blob", ".blob", XrmoptionNoArg, "False" }, + { 0, 0, 0, 0 } +}; + +void +screenhack (Display *dpy, Window window) +{ + struct starfish *s = init_starfish (dpy, window); + int delay = get_integer_resource ("delay", "Delay"); + int delay2 = get_integer_resource ("delay2", "Delay") * 1000000; + int cycle_delay = get_integer_resource ("cycleDelay", "Delay"); + int duration = get_seconds_resource ("duration", "Seconds"); + Bool blob_p = get_boolean_resource ("blob", "Blob"); + time_t start = time ((time_t) 0); + time_t now; + int direction = (random() % 1) ? 1 : -1; + + if (blob_p) + delay *= 3; + + while (1) + { + run_starfish (dpy, window, s); + XSync (dpy, True); + + if (cycle_p && cycle_delay) + { + if (cycle_delay <= delay) + { + int i = 0; + while (i < delay) + { + rotate_colors (dpy, cmap, colors, ncolors, direction); + usleep(cycle_delay); + i += cycle_delay; + } + } + else + { + static long tick = 0; + if (tick >= cycle_delay) + { + rotate_colors (dpy, cmap, colors, ncolors, direction); + tick = 0; + } + if (delay) + usleep(delay); + tick += delay; + } + + if (! (random() % 1000)) + direction = -direction; + } + else if (delay) + usleep (delay); + + if (duration > 0) + { + now = time ((time_t) 0); + if (start + duration < now) + { + start = now; + + free_starfish (s); + + if (delay2 && !blob_p) + { + int i = 0; + while (i < delay2) + { + rotate_colors (dpy, cmap, colors, ncolors, direction); + usleep(cycle_delay); + i += cycle_delay; + } + } + + /* Every now and then, pick new colors; otherwise, just build + a new starfish with the current colors. */ + if (! (random () % 10)) + s = init_starfish (dpy, window); + else + s = make_window_starfish(dpy, window); + } + } + } +} diff --git a/local/man/man.1/starfish.1 b/hacks/starfish.man similarity index 100% rename from local/man/man.1/starfish.1 rename to hacks/starfish.man diff --git a/hacks/strange.c b/hacks/strange.c new file mode 100644 index 00000000..71cd89cd --- /dev/null +++ b/hacks/strange.c @@ -0,0 +1,404 @@ +/* -*- Mode: C; tab-width: 4 -*- + * strange --- Strange attractors are not so hard to find... + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)strange.c 4.02 97/04/01 xlockmore"; +#endif + +/* Copyright (c) 1997 by Massimino Pascal (Pascal.Massimon@ens.fr) + * + * 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. + * + * Revision History: + * 10-May-97: jwz@netscape.com: turned into a standalone program. + * Made it render into an offscreen bitmap and then copy + * that onto the screen, to reduce flicker. + */ + +#ifdef STANDALONE +# define PROGCLASS "Strange" +# define HACK_INIT init_strange +# define HACK_DRAW draw_strange +# define strange_opts xlockmore_opts +# define DEFAULTS "*delay: 2000 \n" \ + "*ncolors: 100 \n" +# define SMOOTH_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt strange_opts = { + 0, NULL, 0, NULL, NULL }; + +/*****************************************************/ +/*****************************************************/ + +typedef float DBL; +typedef int PRM; + +#define UNIT (1<<12) +#define UNIT2 (1<<14) +/* #define UNIT2 (3140*UNIT/1000) */ + +#define SKIP_FIRST 100 +#define MAX_POINTS 5500 +#define DBL_To_PRM(x) (PRM)( (DBL)(UNIT)*(x) ) + + +#define DO_FOLD(a) (a)<0 ? -Fold[ (-(a))&(UNIT2-1) ] : Fold[ (a)&(UNIT2-1) ] + +/* + #define DO_FOLD(a) (a)<-UNIT2 ? -Fold[(-(a))%UNIT2] : (a)<0 ? -Fold[ -(a) ] + + : \ (a)>UNIT2 ? Fold[ (a)%UNIT2 ] : Fold[ (a) ] */ +/* #define DO_FOLD(a) DBL_To_PRM( sin( (DBL)(a)/UNIT ) ) */ +/* + #define DO_FOLD(a) (a)<0 ? DBL_To_PRM( exp( 16.0*(a)/UNIT2 ) )-1.0 : \ + DBL_To_PRM( 1.0-exp( -16.0*(a)/UNIT2 ) ) */ + +/******************************************************************/ + +#define MAX_PRM 3*5 + +typedef struct { + DBL Prm1[MAX_PRM], Prm2[MAX_PRM]; + void (*Iterate) (PRM, PRM, PRM *, PRM *); + XPoint *Buffer1, *Buffer2; + int Cur_Pt, Max_Pt; + int Col, Count, Speed; + int Width, Height; + Pixmap dbuf; /* jwz */ + GC dbuf_gc; +} ATTRACTOR; + +static ATTRACTOR *Root; +static PRM xmin, xmax, ymin, ymax; +static PRM Prm[MAX_PRM]; +static PRM *Fold = NULL; + +/******************************************************************/ +/******************************************************************/ + +static DBL Amp_Prm[MAX_PRM] = +{ + 1.0, 3.5, 3.5, 2.5, 4.7, + 1.0, 3.5, 3.6, 2.5, 4.7, + 1.0, 1.5, 2.2, 2.1, 3.5 +}; +static DBL Mid_Prm[MAX_PRM] = +{ + 0.0, 1.5, 0.0, .5, 1.5, + 0.0, 1.5, 0.0, .5, 1.5, + 0.0, 1.5, -1.0, -.5, 2.5, +}; + +static DBL +Gauss_Rand(DBL c, DBL A, DBL S) +{ + DBL y; + + y = (DBL) LRAND() / MAXRAND; + y = A * (1.0 - exp(-y * y * S)) / (1.0 - exp(-S)); + if (NRAND(2)) + return (c + y); + else + return (c - y); +} + +static void +Random_Prm(DBL * Prm) +{ + int i; + + for (i = 0; i < MAX_PRM; ++i) + Prm[i] = Gauss_Rand(Mid_Prm[i], Amp_Prm[i], 4.0); +} + +/***************************************************************/ + + /* 2 examples of non-linear map */ + +static void +Iterate_X2(PRM x, PRM y, PRM * xo, PRM * yo) +{ + PRM xx, yy, xy, x2y, y2x, Tmp; + + xx = (x * x) / UNIT; + x2y = (xx * y) / UNIT; + yy = (y * y) / UNIT; + y2x = (yy * x) / UNIT; + xy = (x * y) / UNIT; + + Tmp = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y; + Tmp = Prm[0] - y + (Tmp / UNIT); + *xo = DO_FOLD(Tmp); + Tmp = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x; + Tmp = Prm[5] + x + (Tmp / UNIT); + *yo = DO_FOLD(Tmp); +} + +static void +Iterate_X3(PRM x, PRM y, PRM * xo, PRM * yo) +{ + PRM xx, yy, xy, x2y, y2x, Tmp_x, Tmp_y, Tmp_z; + + xx = (x * x) / UNIT; + x2y = (xx * y) / UNIT; + yy = (y * y) / UNIT; + y2x = (yy * x) / UNIT; + xy = (x * y) / UNIT; + + Tmp_x = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y; + Tmp_x = Prm[0] - y + (Tmp_x / UNIT); + Tmp_x = DO_FOLD(Tmp_x); + + Tmp_y = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x; + Tmp_y = Prm[5] + x + (Tmp_y / UNIT); + + Tmp_y = DO_FOLD(Tmp_y); + + Tmp_z = Prm[11] * xx + Prm[12] * xy + Prm[13] * yy + Prm[14] * y2x; + Tmp_z = Prm[10] + x + (Tmp_z / UNIT); + Tmp_z = UNIT + Tmp_z * Tmp_z / UNIT; + + *xo = (Tmp_x * UNIT) / Tmp_z; + *yo = (Tmp_y * UNIT) / Tmp_z; +} + +static void (*Funcs[2]) (PRM, PRM, PRM *, PRM *) = { + Iterate_X2, Iterate_X3 +}; + +/***************************************************************/ + +void +draw_strange(ModeInfo * mi) +{ + int i, j, n, Max_Colors, Cur_Pt; + PRM x, y, xo, yo; + DBL u; + ATTRACTOR *A; + XPoint *Buf; + Display *display; + GC gc; + Window window; + DBL Lx, Ly; + void (*Iterate) (PRM, PRM, PRM *, PRM *); + + display = MI_DISPLAY(mi); + window = MI_WINDOW(mi); + gc = MI_GC(mi); + Max_Colors = MI_NPIXELS(mi); + + A = &Root[MI_SCREEN(mi)]; + + Cur_Pt = A->Cur_Pt; + Iterate = A->Iterate; + + u = (DBL) (A->Count) / 1000.0; + for (j = MAX_PRM - 1; j >= 0; --j) + Prm[j] = DBL_To_PRM((1.0 - u) * A->Prm1[j] + u * A->Prm2[j]); + + x = y = DBL_To_PRM(.0); + for (n = SKIP_FIRST; n; --n) { + (*Iterate) (x, y, &xo, &yo); + x = xo + NRAND(8) - 4; + y = yo + NRAND(8) - 4; + } + + xmax = 0; + xmin = UNIT * 4; + ymax = 0; + ymin = UNIT * 4; + A->Cur_Pt = 0; + Buf = A->Buffer2; + Lx = (DBL) A->Width / UNIT / 2.2; + Ly = (DBL) A->Height / UNIT / 2.2; + for (n = A->Max_Pt; n; --n) { + (*Iterate) (x, y, &xo, &yo); + Buf->x = (short) (Lx * (x + DBL_To_PRM(1.1))); + Buf->y = (short) (Ly * (DBL_To_PRM(1.1) - y)); + /* (void) fprintf( stderr, "X,Y: %d %d ", Buf->x, Buf->y ); */ + Buf++; + A->Cur_Pt++; + if (xo > xmax) + xmax = xo; + else if (xo < xmin) + xmin = xo; + if (yo > ymax) + ymax = yo; + else if (yo < ymin) + ymin = yo; + x = xo + NRAND(8) - 4; + y = yo + NRAND(8) - 4; + } + + XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); + + if (A->dbuf) /* jwz */ + { + XSetForeground(display, A->dbuf_gc, 0); +/* XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer1, + Cur_Pt,CoordModeOrigin);*/ + XFillRectangle(display, A->dbuf, A->dbuf_gc, 0,0, A->Width, A->Height); + } + else + XDrawPoints(display, window, gc, A->Buffer1, Cur_Pt, CoordModeOrigin); + + if (Max_Colors < 2) + XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi)); + else + XSetForeground(display, gc, MI_PIXEL(mi, A->Col % Max_Colors)); + + if (A->dbuf) + { + XSetForeground(display, A->dbuf_gc, 1); + XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer2, A->Cur_Pt, + CoordModeOrigin); + } + else + XDrawPoints(display, window, gc, A->Buffer2, A->Cur_Pt, CoordModeOrigin); + + if (A->dbuf) + XCopyPlane(display, A->dbuf, window, gc, 0,0,A->Width,A->Height,0,0, 1); + + Buf = A->Buffer1; + A->Buffer1 = A->Buffer2; + A->Buffer2 = Buf; + + if ((xmax - xmin < DBL_To_PRM(.2)) && (ymax - ymin < DBL_To_PRM(.2))) + A->Count += 4 * A->Speed; + else + A->Count += A->Speed; + if (A->Count >= 1000) { + for (i = MAX_PRM - 1; i >= 0; --i) + A->Prm1[i] = A->Prm2[i]; + Random_Prm(A->Prm2); + A->Count = 0; + } + A->Col++; +} + + +/***************************************************************/ + +void +init_strange(ModeInfo * mi) +{ + ATTRACTOR *Attractor; + + if (Root == NULL) { + Root = (ATTRACTOR *) calloc( + MI_NUM_SCREENS(mi), sizeof (ATTRACTOR)); + if (Root == NULL) + return; + } + if (Fold == NULL) { + int i; + + Fold = (PRM *) calloc(UNIT2 + 1, sizeof (PRM)); + if (Fold == NULL) + return; + for (i = 0; i <= UNIT2; ++i) { + DBL x; + + /* x = ( DBL )(i)/UNIT2; */ + /* x = sin( M_PI/2.0*x ); */ + /* x = sqrt( x ); */ + /* x = x*x; */ + /* x = x*(1.0-x)*4.0; */ + x = (DBL) (i) / UNIT; + x = sin(x); + Fold[i] = DBL_To_PRM(x); + } + } + Attractor = &Root[MI_SCREEN(mi)]; + + Attractor->Buffer1 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint)); + if (Attractor->Buffer1 == NULL) + goto Abort; + Attractor->Buffer2 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint)); + if (Attractor->Buffer2 == NULL) + goto Abort; + Attractor->Max_Pt = MAX_POINTS; + + Attractor->Width = MI_WIN_WIDTH(mi); + Attractor->Height = MI_WIN_HEIGHT(mi); + Attractor->Cur_Pt = 0; + Attractor->Count = 0; + Attractor->Col = NRAND(MI_NPIXELS(mi)); + Attractor->Speed = 4; + + Attractor->Iterate = Funcs[NRAND(2)]; + Random_Prm(Attractor->Prm1); + Random_Prm(Attractor->Prm2); + + Attractor->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi), + Attractor->Width, Attractor->Height, 1); + if (Attractor->dbuf) + { + XGCValues gcv; + gcv.foreground = 0; + gcv.background = 0; + gcv.function = GXcopy; + Attractor->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Attractor->dbuf, + GCForeground|GCBackground|GCFunction, + &gcv); + XFillRectangle(MI_DISPLAY(mi), Attractor->dbuf, + Attractor->dbuf_gc, 0,0, Attractor->Width, + Attractor->Height); + XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi)); + XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy); + } + + XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); + return; + + Abort: + if (Attractor->Buffer1 != NULL) + free(Attractor->Buffer1); + if (Attractor->Buffer2 != NULL) + free(Attractor->Buffer2); + Attractor->Buffer1 = NULL; + Attractor->Buffer2 = NULL; + Attractor->Cur_Pt = 0; + return; +} + +/***************************************************************/ + +void +release_strange(ModeInfo * mi) +{ + int i; + + if (Root == NULL) + return; + + for (i = 0; i < MI_NUM_SCREENS(mi); ++i) { + if (Root[i].Buffer1 != NULL) + free(Root[i].Buffer1); + if (Root[i].Buffer2 != NULL) + free(Root[i].Buffer2); + if (Root[i].dbuf) + XFreePixmap(MI_DISPLAY(mi), Root[i].dbuf); + if (Root[i].dbuf_gc) + XFreeGC(MI_DISPLAY(mi), Root[i].dbuf_gc); + } + free(Root); + Root = NULL; + if (Fold != NULL) + free(Fold); + Fold = NULL; +} diff --git a/local/man/man.1/strange.1 b/hacks/strange.man similarity index 100% rename from local/man/man.1/strange.1 rename to hacks/strange.man diff --git a/hacks/swirl.c b/hacks/swirl.c new file mode 100644 index 00000000..7f3764f0 --- /dev/null +++ b/hacks/swirl.c @@ -0,0 +1,1475 @@ +/* -*- Mode: C; tab-width: 4 -*- + * swirl --- swirly color-cycling patterns. + */ +#if !defined( lint ) && !defined( SABER ) +static const char sccsid[] = "@(#)swirl.c 4.00 97/01/01 xlockmore"; +#endif + +/* Copyright (c) 1994 M.Dobie + * + * 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. + * + * 13-May-97: jwz@netscape.com: turned into a standalone program. + * 21-Apr-95: improved startup time for TrueColour displays + * (limited to 16bpp to save memory) S.Early + * 09-Jan-95: fixed colour maps (more colourful) and the image now spirals + * outwards from the centre with a fixed number of points drawn + * every iteration. Thanks to M.Dobie . + * 1994: written. Copyright (c) 1994 M.Dobie + * based on original code by R.Taylor + */ + +#ifdef STANDALONE +# define PROGCLASS "Swirl" +# define HACK_INIT init_swirl +# define HACK_DRAW draw_swirl +# define swirl_opts xlockmore_opts +# define DEFAULTS "*count: 5 \n" \ + "*delay: 10000 \n" \ + "*ncolors: 200 \n" +# define SMOOTH_COLORS +# define WRITABLE_COLORS +# include "xlockmore.h" /* from the xscreensaver distribution */ +# include +#else /* !STANDALONE */ +# include "xlock.h" /* from the xlockmore distribution */ +#endif /* !STANDALONE */ + +ModeSpecOpt swirl_opts = { + 0, NULL, 0, NULL, NULL }; + +#include + +/****************************************************************/ + +#define MASS 4 /* maximum mass of a knot */ +#define MIN_RES 5 /* minimim resolution (>= MIN_RES) */ +#define MAX_RES 1 /* maximum resolution (>0) */ +#define TWO_PLANE_PCNT 30 /* probability for two plane mode (0-100) */ +#define RESTART 2500 /* number of cycles before restart */ +#define BATCH_DRAW 100 /* points to draw per iteration */ + +/* knot types */ +typedef enum { + NONE = 0, + ORBIT = (1 << 0), + WHEEL = (1 << 1), + PICASSO = (1 << 2), + RAY = (1 << 3), + HOOK = (1 << 4), + ALL = (1 << 5) +} KNOT_T; + +/* a knot */ +typedef struct Knot { + int x, y; /* position */ + int m; /* mass */ + KNOT_T t; /* type in the first (or only) plane */ + KNOT_T T; /* type in second plane if there is one */ + int M; /* mass in second plane if there is one */ +} KNOT , *KNOT_P; + +/* a colour specification */ +typedef struct Colour { + unsigned short r, g, b; +} COLOUR , *COLOUR_P; + +/* drawing direction */ +typedef enum { + DRAW_RIGHT, DRAW_DOWN, DRAW_LEFT, DRAW_UP +} DIR_T; + +/****************************************************************/ + +/* data associated with a swirl window */ +typedef struct swirl_data { + /* window paramaters */ + Window win; /* the window */ + int width, height; /* window size */ + int depth; /* depth */ + int rdepth; /* real depth (for XImage) */ + Visual *visual; /* visual */ + + /* swirl drawing parameters */ + int n_knots; /* number of knots */ + KNOT_P knots; /* knot details */ + KNOT_T knot_type; /* general type of knots */ + int resolution; /* drawing resolution, 1..5 */ + int max_resolution; /* maximum resolution, MAX_RES */ + int r; /* pixel step */ + Bool two_plane; /* two plane mode? */ + Bool first_plane; /* doing first plane? */ + int start_again; /* when to restart */ + + /* spiral drawing parameters */ + int x, y; /* current point */ + DIR_T direction; /* current direction */ + int dir_todo, dir_done; /* how many points in current direction? */ + int batch_todo, batch_done; /* how many points in this batch */ + Bool started, drawing; /* are we drawing? */ + + /* image stuff */ + unsigned char *image; /* image data */ + XImage *ximage; + + /* colours stuff */ + int colours; /* how many colours possible */ + int dcolours; /* how many colours for shading */ +#ifndef STANDALONE + Bool fixed_colourmap; /* fixed colourmap? */ +#endif /* !STANDALONE */ + Bool monochrome; /* monochrome? */ + Colormap cmap; /* colour map for the window */ + XColor *rgb_values; /* colour definitions array */ +#ifndef STANDALONE + int current_map; /* current colour map, 0..dcolours-1 */ + unsigned long fg, bg, white, black; /* black and white pixel values */ + int shift; /* colourmap shift */ + int dshift; /* colourmap shift while drawing */ + XColor fgcol, bgcol; /* foreground and background colour specs */ +#endif /* !STANDALONE */ + Bool off_screen; +} SWIRL , *SWIRL_P; + +#define SWIRLCOLOURS 13 + +#ifndef STANDALONE +/* basic colours */ +static COLOUR basic_colours[SWIRLCOLOURS]; +#endif /* !STANDALONE */ + +/* an array of swirls for each screen */ +static SWIRL_P swirls = NULL; + +/* + random_no + + Return a random integer between 0 and n inclusive + + - n is the maximum number + + Returns a random integer */ + +static int +random_no(unsigned int n) +{ + return ((int) ((n + 1) * (double) LRAND() / MAXRAND)); +} + +/****************************************************************/ + +/* + initialise_swirl + + Initialise all the swirl data + + - swirl is the swirl data */ + +static void +initialise_swirl(ModeInfo * mi, SWIRL_P swirl) +{ +#ifndef STANDALONE + Display *display = MI_DISPLAY(mi); +#endif /* !STANDALONE */ + + swirl->width = 0; /* width and height of window */ + swirl->height = 0; + swirl->depth = 1; + swirl->rdepth = 1; + swirl->visual = NULL; + swirl->resolution = MIN_RES + 1; /* current resolution */ + swirl->max_resolution = MAX_RES; /* maximum resolution */ + swirl->n_knots = 0; /* number of knots */ + swirl->knot_type = ALL; /* general type of knots */ + swirl->two_plane = False; /* two plane mode? */ + swirl->first_plane = False; /* doing first plane? */ + swirl->start_again = -1; /* restart counter */ + + /* drawing parameters */ + swirl->x = 0; + swirl->y = 0; + swirl->started = False; + swirl->drawing = False; + + /* image stuff */ + swirl->image = NULL; /* image data */ + swirl->ximage = NULL; + + /* colours stuff */ + swirl->colours = 0; /* how many colours possible */ + swirl->dcolours = 0; /* how many colours for shading */ + swirl->cmap = (Colormap) NULL; + swirl->rgb_values = NULL; /* colour definitions array */ +#ifndef STANDALONE + swirl->current_map = 0; /* current colour map, 0..dcolours-1 */ + + /* set up fg fb colour specs */ + swirl->white = MI_WIN_WHITE_PIXEL(mi); + swirl->black = MI_WIN_BLACK_PIXEL(mi); +#endif /* !STANDALONE */ + + +#ifdef STANDALONE +# define MI_COLORMAP MI_WIN_COLORMAP +#else /* !STANDALONE */ + swirl->fg = MI_FG_COLOR(mi); + swirl->bg = MI_BG_COLOR(mi); + swirl->fgcol.pixel = swirl->fg; + swirl->bgcol.pixel = swirl->bg; + XQueryColor(display, MI_COLORMAP(mi), &(swirl->fgcol)); + XQueryColor(display, MI_COLORMAP(mi), &(swirl->bgcol)); +#endif /* !STANDALONE */ +} + +/****************************************************************/ + +/* + * initialise_image + * + * Initialise the image for drawing to + * + * - swirl is the swirl data + */ +static void +initialise_image(Display * dpy, SWIRL_P swirl) +{ + unsigned int pad; + int bytes_per_line; + int image_depth = swirl->rdepth; + int data_depth = image_depth; + + /* On SGIs at least, using an XImage of depth 24 on a Visual of depth 24 + requires the XImage data to use 32 bits per pixel. I don't understand + how one is supposed to determine this -- maybe XListPixmapFormats? + But on systems that don't work this way, allocating 32 bpp instead of + 24 will be wasteful but non-fatal. -- jwz, 16-May-97. */ + if (data_depth >= 24 && data_depth < 32) + data_depth = 32; + + /* get the bitmap pad */ + pad = BitmapPad(dpy); + /* destroy the old image (destroy XImage and data) */ + if (swirl->ximage != NULL) + XDestroyImage(swirl->ximage); + + /* how many bytes per line? (bits rounded up to pad) */ + bytes_per_line = ((swirl->width * data_depth + pad - 1) / pad) * (pad / 8); + + /* allocate space for the image */ + swirl->image = (unsigned char *) calloc(bytes_per_line * swirl->height, 1); + + /* create an ximage with this */ + swirl->ximage = XCreateImage(dpy, swirl->visual, image_depth, ZPixmap, + 0, (char *) swirl->image, swirl->width, + swirl->height, pad, bytes_per_line); +} + +/****************************************************************/ + +#ifndef STANDALONE +/* + * initialise_colours + * + * Initialise the list of colours from which the colourmaps are derived + * + * - colours is the array to initialise + * - saturation is the saturation value to use 0->grey, + * 1.0->full saturation + */ +static void +initialise_colours(COLOUR * colours, float saturate) +{ + int i; + + /* start off fully saturated, medium and bright colours */ + colours[0].r = 0xA000; + colours[0].g = 0x0000; + colours[0].b = 0x0000; + colours[1].r = 0xD000; + colours[1].g = 0x0000; + colours[1].b = 0x0000; + colours[2].r = 0x0000; + colours[2].g = 0x6000; + colours[2].b = 0x0000; + colours[3].r = 0x0000; + colours[3].g = 0x9000; + colours[3].b = 0x0000; + colours[4].r = 0x0000; + colours[4].g = 0x0000; + colours[4].b = 0xC000; + colours[5].r = 0x0000; + colours[5].g = 0x0000; + colours[5].b = 0xF000; + colours[6].r = 0xA000; + colours[6].g = 0x6000; + colours[6].b = 0x0000; + colours[7].r = 0xD000; + colours[7].g = 0x9000; + colours[7].b = 0x0000; + colours[8].r = 0xA000; + colours[8].g = 0x0000; + colours[8].b = 0xC000; + colours[9].r = 0xD000; + colours[9].g = 0x0000; + colours[9].b = 0xF000; + colours[10].r = 0x0000; + colours[10].g = 0x6000; + colours[10].b = 0xC000; + colours[11].r = 0x0000; + colours[11].g = 0x9000; + colours[11].b = 0xF000; + colours[12].r = 0xA000; + colours[12].g = 0xA000; + colours[12].b = 0xA000; + + /* add white for low saturation */ + for (i = 0; i < SWIRLCOLOURS - 1; i++) { + unsigned short max_rg, max; + + /* what is the max intensity for this colour? */ + max_rg = (colours[i].r > colours[i].g) ? colours[i].r : colours[i].g; + max = (max_rg > colours[i].b) ? max_rg : colours[i].b; + + /* bring elements up to max as saturation approaches 0.0 */ + colours[i].r += (unsigned short) ((float) (1.0 - saturate) * + ((float) max - colours[i].r)); + colours[i].g += (unsigned short) ((float) (1.0 - saturate) * + ((float) max - colours[i].g)); + colours[i].b += (unsigned short) ((float) (1.0 - saturate) * + ((float) max - colours[i].b)); + } +} +#endif /* !STANDALONE */ + +/****************************************************************/ + +#ifndef STANDALONE +/* + * set_black_and_white + * + * Set the entries for foreground & background pixels and + * WhitePixel & BlackPixel in an array of colour specifications. + * + * - swirl is the swirl data + * - values is the array of specifications + */ +static void +set_black_and_white(SWIRL_P swirl, XColor * values) +{ + unsigned long white, black; + + /* where is black and white? */ + white = swirl->white; + black = swirl->black; + + /* set black and white up */ + values[white].flags = DoRed | DoGreen | DoBlue; + values[white].pixel = white; + values[white].red = 0xFFFF; + values[white].green = 0xFFFF; + values[white].blue = 0xFFFF; + values[black].flags = DoRed | DoGreen | DoBlue; + values[black].pixel = black; + values[black].red = 0; + values[black].green = 0; + values[black].blue = 0; + + /* copy the colour specs from the original entries */ + values[swirl->fg] = swirl->fgcol; + values[swirl->bg] = swirl->bgcol; +} + +/****************************************************************/ + +/* + * set_colour + * + * Set an entry in an array of XColor specifications. The given entry will be + * set to the given colour. If the entry corresponds to the foreground, + * background, WhitePixel, or BlackPixel it is ignored and the given colour + * is is put in the next entry. + * + * Therefore, the given colour may be placed up to four places after the + * specified entry in the array, if foreground, background, white, or black + * intervene. + * + * - swirl is the swirl data + * - value points to a pointer to the array entry. It gets updated to + * point to the next free entry. + * - pixel points to the current pixel number. It gets updated. + * - c points to the colour to add + */ +static void +set_colour(SWIRL_P swirl, XColor ** value, unsigned long *pixel, COLOUR_P c) +{ + Bool done; + unsigned long fg, bg, white, black; + + /* where are foreground, background, white, and black? */ + fg = swirl->fg; + bg = swirl->bg; + white = swirl->white; + black = swirl->black; + + /* haven't set it yet */ + done = False; + + /* try and set the colour */ + while (!done) { + (**value).flags = DoRed | DoGreen | DoBlue; + (**value).pixel = *pixel; + + /* white, black, fg, bg, or a colour? */ + if ((*pixel != fg) && (*pixel != bg) && + (*pixel != white) && (*pixel != black)) { + (**value).red = c->r; + (**value).green = c->g; + (**value).blue = c->b; + + /* now we've done it */ + done = True; + } + /* next pixel */ + (*value)++; + (*pixel)++; + } +} + +/****************************************************************/ + +/* + * get_colour + * + * Get an entry from an array of XColor specifications. The next colour from + * the array will be returned. Foreground, background, WhitePixel, or + * BlackPixel will be ignored. + * + * - swirl is the swirl data + * - value points the array entry. It is updated to point to the entry + * following the one returned. + * - c is set to the colour found + */ +static void +get_colour(SWIRL_P swirl, XColor ** value, COLOUR_P c) +{ + Bool done; + unsigned long fg, bg, white, black; + + /* where is white and black? */ + fg = swirl->fg; + bg = swirl->bg; + white = swirl->white; + black = swirl->black; + + /* haven't set it yet */ + done = False; + + /* try and set the colour */ + while (!done) { + /* black, white or a colour? */ + if (((*value)->pixel != fg) && ((*value)->pixel != bg) && + ((*value)->pixel != white) && ((*value)->pixel != black)) { + c->r = (*value)->red; + c->g = (*value)->green; + c->b = (*value)->blue; + + /* now we've done it */ + done = True; + } + /* next value */ + (*value)++; + } +} +#endif /* !STANDALONE */ + +/****************************************************************/ + +#ifndef STANDALONE +/* + * interpolate + * + * Generate n colours between c1 and c2. n XColors at *value are set up with + * ascending pixel values. + * + * If the pixel range includes BlackPixel or WhitePixel they are set to black + * and white respectively but otherwise ignored. Therefore, up to n+2 colours + * may actually be set by this function. + * + * - swirl is the swirl data + * - values points a pointer to an array of XColors to update + * - pixel points to the pixel number to start at + * - k n is the number of colours to generate + * - c1, c2 are the colours to interpolate between + */ +static void +interpolate(SWIRL_P swirl, XColor ** values, unsigned long *pixel, int n, COLOUR_P c1, COLOUR_P c2) +{ + int i, r, g, b; + COLOUR c; + unsigned short maxv; + + /* maximum value */ + maxv = (255 << 8); + + for (i = 0; i < n / 2 && (int) *pixel < swirl->colours; i++) { + /* work out the colour */ + r = c1->r + 2 * i * ((int) c2->r) / n; + c.r = (r > (int) maxv) ? maxv : r; + g = c1->g + 2 * i * ((int) c2->g) / n; + c.g = (g > (int) maxv) ? maxv : g; + b = c1->b + 2 * i * ((int) c2->b) / n; + c.b = (b > (int) maxv) ? maxv : b; + + /* set it up */ + set_colour(swirl, values, pixel, &c); + } + for (i = n / 2; i >= 0 && (int) *pixel < swirl->colours; i--) { + r = c2->r + 2 * i * ((int) c1->r) / n; + c.r = (r > (int) maxv) ? maxv : r; + g = c2->g + 2 * i * ((int) c1->g) / n; + c.g = (g > (int) maxv) ? maxv : g; + b = c2->b + 2 * i * ((int) c1->b) / n; + c.b = (b > (int) maxv) ? maxv : b; + + /* set it up */ + set_colour(swirl, values, pixel, &c); + } +} + +/****************************************************************/ + +/* + * basic_map + * + * Generate a `random' closed loop colourmap that occupies the whole colour + * map. + * + * - swirl is the swirl data + * - values is the array of colour definitions to set up + */ +static void +basic_map(SWIRL_P swirl, XColor * values) +{ + COLOUR c[3]; + int i; + unsigned short r1, g1, b1, r2, g2, b2, r3, g3, b3; + int L1, L2, L3, L; + unsigned long pixel; + XColor *value; + + /* start at the beginning of the colour map */ + pixel = 0; + value = values; + + /* choose 3 different basic colours at random */ + for (i = 0; i < 3;) { + int j; + Bool same; + + /* choose colour i */ + c[i] = basic_colours[random_no(SWIRLCOLOURS - 1)]; + + /* assume different */ + same = False; + + /* different from the rest? */ + for (j = 0; j < i; j++) + if ((c[i].r == c[j].r) && + (c[i].g == c[j].g) && + (c[i].b == c[j].b)) + same = True; + + /* ready for the next colour? */ + if (!same) + i++; + } + + /* extract components into variables */ + r1 = c[0].r; + g1 = c[0].g; + b1 = c[0].b; + r2 = c[1].r; + g2 = c[1].g; + b2 = c[1].b; + r3 = c[2].r; + g3 = c[2].g; + b3 = c[2].b; + + /* work out the lengths of each side of the triangle */ + L1 = (int) sqrt((((double) r1 - r2) * ((double) r1 - r2) + + ((double) g1 - g2) * ((double) g1 - g2) + + ((double) b1 - b2) * ((double) b1 - b2))); + + L2 = (int) sqrt((((double) r3 - r2) * ((double) r3 - r2) + + ((double) g3 - g2) * ((double) g3 - g2) + + ((double) b3 - b2) * ((double) b3 - b2))); + + L3 = (int) sqrt((((double) r1 - r3) * ((double) r1 - r3) + + ((double) g1 - g3) * ((double) g1 - g3) + + ((double) b1 - b3) * ((double) b1 - b3))); + + L = L1 + L2 + L3; + + /* allocate colours in proportion to the lengths of the sides */ + interpolate(swirl, &value, &pixel, + (int) ((double) swirl->dcolours * ((double) L1 / (double) L)) + 1, c, c + 1); + interpolate(swirl, &value, &pixel, + (int) ((double) swirl->dcolours * ((double) L2 / (double) L)) + 1, c + 1, c + 2); + interpolate(swirl, &value, &pixel, + (int) ((double) swirl->dcolours * ((double) L3 / (double) L)) + 1, c + 2, c); + + /* fill up any remaining slots (due to rounding) */ + while ((int) pixel < swirl->colours) { + /* repeat the last colour */ + set_colour(swirl, &value, &pixel, c); + } + + /* ensure black and white are correct */ + if (!swirl->fixed_colourmap) + set_black_and_white(swirl, values); +} + +/****************************************************************/ + +/* + * pre_rotate + * + * Generate pre-rotated versions of the colour specifications + * + * - swirl is the swirl data + * - values is an array of colour specifications + */ +static void +pre_rotate(SWIRL_P swirl, XColor * values) +{ + int i, j; + XColor *src, *dest; + int dcolours; + unsigned long pixel; + + /* how many colours to display? */ + dcolours = swirl->dcolours; + + /* start at the first map */ + src = values; + dest = values + swirl->colours; + + /* generate dcolours-1 rotated maps */ + for (i = 0; i < dcolours - 1; i++) { + COLOUR first; + + /* start at the first pixel */ + pixel = 0; + + /* remember the first one and skip it */ + get_colour(swirl, &src, &first); + + /* put a rotated version of src at dest */ + for (j = 0; j < dcolours - 1; j++) { + COLOUR c; + + /* get the source colour */ + get_colour(swirl, &src, &c); + + /* set the colour */ + set_colour(swirl, &dest, &pixel, &c); + } + + /* put the first one at the end */ + set_colour(swirl, &dest, &pixel, &first); + + /* NB: src and dest should now be ready for the next table */ + + /* ensure black and white are properly set */ + set_black_and_white(swirl, src); + } +} + +/****************************************************************/ + +/* + * create_colourmap + * + * Create a read/write colourmap to use + * + * - swirl is the swirl data + */ + +static void +create_colourmap(ModeInfo * mi, SWIRL_P swirl) +{ + Display *display = MI_DISPLAY(mi); + int preserve; + int n_rotations; + int i; + Bool truecolor; + unsigned long redmask, greenmask, bluemask; + + swirl->fixed_colourmap = !setupColormap(mi, &(swirl->colours), + &truecolor, &redmask, &greenmask, &bluemask); + preserve = preserveColors(swirl->fg, swirl->bg, swirl->white, swirl->black); + + /* how many colours should we animate? */ + swirl->dcolours = (swirl->colours > preserve + 1) ? + swirl->colours - preserve : swirl->colours; + + if (MI_NPIXELS(mi) < 2) + return; + + /* how fast to shift the colourmap? */ + swirl->shift = (swirl->colours > 64) ? swirl->colours / 64 : 1; + swirl->dshift = (swirl->shift > 1) ? swirl->shift * 2 : 1; + + /* how may colour map rotations are there? */ + n_rotations = (swirl->fixed_colourmap) ? 1 : swirl->dcolours; + + /* allocate space for colour definitions (if not already there) */ + if (swirl->rgb_values == NULL) { + swirl->rgb_values = (XColor *) calloc((swirl->colours + 3) * n_rotations, + sizeof (XColor)); + + /* create a colour map */ + if (!swirl->fixed_colourmap) + swirl->cmap = + XCreateColormap(display, swirl->win, swirl->visual, AllocAll); + } + /* select a set of colours for the colour map */ + basic_map(swirl, swirl->rgb_values); + + /* are we rotating them? */ + if (!swirl->fixed_colourmap) { + /* generate rotations of the colour maps */ + pre_rotate(swirl, swirl->rgb_values); + + /* store the colours in the colour map */ + XStoreColors(display, swirl->cmap, swirl->rgb_values, swirl->colours); + } else { + if (truecolor) { + int rsh, gsh, bsh; + unsigned long int t; + + t = redmask; + for (i = 0; (int) t > 0; i++, t >>= 1); + rsh = 16 - i; + t = greenmask; + for (i = 0; (int) t > 0; i++, t >>= 1); + gsh = 16 - i; + t = bluemask; + for (i = 0; (int) t > 0; i++, t >>= 1); + bsh = 16 - i; + for (i = 0; i < swirl->colours; i++) + swirl->rgb_values[i].pixel = + ((rsh > 0 ? (swirl->rgb_values[i].red) >> rsh : + (swirl->rgb_values[i].red) << (-rsh)) & redmask) | + ((gsh > 0 ? (swirl->rgb_values[i].green) >> gsh : + (swirl->rgb_values[i].green) << (-gsh)) & greenmask) | + ((bsh > 0 ? (swirl->rgb_values[i].blue) >> bsh : + (swirl->rgb_values[i].blue) << (-bsh)) & bluemask); + } else { + /* lookup the colours in the fixed colour map */ + for (i = 0; i < swirl->colours; i++) + (void) XAllocColor(display, MI_COLORMAP(mi), + &(swirl->rgb_values[i])); + } + } +} + +/****************************************************************/ + +/* + * install_map + * + * Install a new set of colours into the colour map + * + * - dpy is the display + * - swirl is the swirl data + * - shift is the amount to rotate the colour map by + */ +static void +install_map(Display * dpy, SWIRL_P swirl, int shift) +{ + if (!swirl->fixed_colourmap) { + /* shift the colour map */ + swirl->current_map = (swirl->current_map + shift) % + swirl->dcolours; + + /* store it */ + XStoreColors(dpy, swirl->cmap, + swirl->rgb_values + + swirl->current_map * swirl->colours, + swirl->colours); + } +} +#endif /* !STANDALONE */ + +/****************************************************************/ + +/* + * create_knots + * + * Initialise the array of knot + * + * swirl is the swirl data + */ +static void +create_knots(SWIRL_P swirl) +{ + int k; + Bool orbit, wheel, picasso, ray, hook; + KNOT_P knot; + + /* create array for knots */ + if (swirl->knots) + (void) free((void *) swirl->knots); + swirl->knots = (KNOT_P) calloc(swirl->n_knots, sizeof (KNOT)); + + /* no knots yet */ + orbit = wheel = picasso = ray = hook = False; + + /* what types do we have? */ + if ((int) swirl->knot_type & (int) ALL) { + orbit = wheel = ray = hook = True; + } else { + if ((int) swirl->knot_type & (int) ORBIT) + orbit = True; + if ((int) swirl->knot_type & (int) WHEEL) + wheel = True; + if ((int) swirl->knot_type & (int) PICASSO) + picasso = True; + if ((int) swirl->knot_type & (int) RAY) + ray = True; + if ((int) swirl->knot_type & (int) HOOK) + hook = True; + } + + /* initialise each knot */ + knot = swirl->knots; + for (k = 0; k < swirl->n_knots; k++) { + /* position */ + knot->x = random_no((unsigned int) swirl->width); + knot->y = random_no((unsigned int) swirl->height); + + /* mass */ + knot->m = random_no(MASS) + 1; + + /* can be negative */ + if (random_no(100) > 50) + knot->m *= -1; + + /* type */ + knot->t = NONE; + while (knot->t == NONE) { + /* choose a random one from the types available */ + switch (random_no(4)) { + case 0: + if (orbit) + knot->t = ORBIT; + break; + case 1: + if (wheel) + knot->t = WHEEL; + break; + case 2: + if (picasso) + knot->t = PICASSO; + break; + case 3: + if (ray) + knot->t = RAY; + break; + case 4: + if (hook) + knot->t = HOOK; + break; + } + } + + /* if two planes, do same for second plane */ + if (swirl->two_plane) { + knot->T = NONE; + while (knot->T == NONE || knot->T == knot->t) { + /* choose a different type */ + switch (random_no(4)) { + case 0: + if (orbit) + knot->T = ORBIT; + break; + case 1: + if (wheel) + knot->T = WHEEL; + break; + case 2: + if (picasso) + knot->T = PICASSO; + break; + case 3: + if (ray) + knot->T = RAY; + break; + case 4: + if (hook) + knot->T = HOOK; + break; + } + } + } + /* next knot */ + knot++; + } +} + +/****************************************************************/ + +/* + * do_point + * + * Work out the pixel value at i, j. Ensure it does not clash with BlackPixel + * or WhitePixel. + * + * - swirl is the swirl data + * - i, j is the point to calculate + * + * Returns the value of the point + */ +static unsigned long +do_point(SWIRL_P swirl, int i, int j) +{ + int tT, k, value, add; + double dx, dy, theta, dist; + int dcolours, qcolours; + double rads; + KNOT_P knot; + + /* how many colours? */ + dcolours = swirl->dcolours; + qcolours = dcolours / 4; + + /* colour step round a circle */ + rads = (double) dcolours / (2.0 * M_PI); + + /* start at zero */ + value = 0; + + /* go through all the knots */ + knot = swirl->knots; + for (k = 0; k < swirl->n_knots; k++) { + dx = i - knot->x; + dy = j - knot->y; + + /* in two_plane mode get the appropriate knot type */ + if (swirl->two_plane) + tT = (int) ((swirl->first_plane) ? knot->t : knot->T); + else + tT = (int) knot->t; + + /* distance from knot */ + dist = sqrt(dx * dx + dy * dy); + + /* nothing to add at first */ + add = 0; + + /* work out the contribution (if close enough) */ + if (dist > 0.1) + switch (tT) { + case ORBIT: + add = (int) (dcolours / (1.0 + 0.01 * abs(knot->m) * dist)); + break; + case WHEEL: + /* Avoid atan2: DOMAIN error message */ + if (dy == 0.0 && dx == 0.0) + theta = 1.0; + else + theta = (atan2(dy, dx) + M_PI) / M_PI; + if (theta < 1.0) + add = (int) (dcolours * theta + + sin(0.1 * knot->m * dist) * + qcolours * exp(-0.01 * dist)); + else + add = (int) (dcolours * (theta - 1.0) + + sin(0.1 * knot->m * dist) * + qcolours * exp(-0.01 * dist)); + break; + case PICASSO: + add = (int) (dcolours * + fabs(cos(0.002 * knot->m * dist))); + break; + case RAY: + /* Avoid atan2: DOMAIN error message */ + if (dy == 0.0 && dx == 0.0) + add = 0; + else + add = (int) (dcolours * fabs(sin(2.0 * atan2(dy, dx)))); + + break; + case HOOK: + /* Avoid atan2: DOMAIN error message */ + if (dy == 0.0 && dx == 0.0) + add = (int) (0.05 * (abs(knot->m) - 1) * dist); + else + add = (int) (rads * atan2(dy, dx) + + 0.05 * (abs(knot->m) - 1) * dist); + break; + } + /* for a +ve mass add on the contribution else take it off */ + if (knot->m > 0) + value += add; + else + value -= add; + + /* next knot */ + knot++; + } + + /* toggle plane */ + swirl->first_plane = (!swirl->first_plane); + + /* make sure we handle -ve values properly */ + if (value >= 0) + value = (value % dcolours) + 2; + else + value = dcolours - (abs(value) % (dcolours - 1)); + +#ifndef STANDALONE + /* if fg and bg are 1 and 0 we should be OK, but just in case */ + while ((dcolours > 2) && + (((value % swirl->colours) == (int) swirl->fg) || + ((value % swirl->colours) == (int) swirl->bg) || + ((value % swirl->colours) == (int) swirl->white) || + ((value % swirl->colours) == (int) swirl->black))) { + value++; + } +#endif /* !STANDALONE */ + + /* definitely make sure it is in range */ + value = value % swirl->colours; + + /* lookup the pixel value if necessary */ +#ifndef STANDALONE + if (swirl->fixed_colourmap && swirl->dcolours > 2) +#endif + value = swirl->rgb_values[value].pixel; + + /* return it */ + return ((unsigned long) value); +} + +/****************************************************************/ + +/* + * draw_block + * + * Draw a square block of points with the same value. + * + * - ximage is the XImage to draw on. + * - x, y is the top left corner + * - s is the length of each side + * - v is the value + */ +static void +draw_block(XImage * ximage, int x, int y, int s, unsigned long v) +{ + int a, b; + + for (a = 0; a < s; a++) + for (b = 0; b < s; b++) { + XPutPixel(ximage, x + b, y + a, v); + } +} + +/****************************************************************/ + +/* + * draw_point Draw the current point in a swirl pattern onto the XImage + * + * - swirl is the swirl + * - win is the window to update + */ +static void +draw_point(ModeInfo * mi, SWIRL_P swirl) +{ + int r; + int x, y; + + /* get current point coordinates and resolution */ + x = swirl->x; + y = swirl->y; + r = swirl->r; + + /* check we are within the window */ + if ((x < 0) || (x > swirl->width - r) || (y < 0) || (y > swirl->height - r)) + return; + + /* what style are we drawing? */ + if (swirl->two_plane) { + int r2; + + /* halve the block size */ + r2 = r / 2; + + /* interleave blocks at half r */ + draw_block(swirl->ximage, x, y, r2, do_point(swirl, x, y)); + draw_block(swirl->ximage, x + r2, y, r2, do_point(swirl, x + r2, y)); + draw_block(swirl->ximage, x + r2, y + r2, r2, do_point(swirl, + x + r2, y + r2)); + draw_block(swirl->ximage, x, y + r2, r2, do_point(swirl, x, y + r2)); + } else + draw_block(swirl->ximage, x, y, r, do_point(swirl, x, y)); + + /* update the screen */ +/* PURIFY 4.0.1 on SunOS4 and on Solaris 2 reports a 256 byte memory leak on * + the next line. */ + XPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage, + x, y, x, y, r, r); +} + +/****************************************************************/ + +/* + * next_point Move to the next point in the spiral pattern + * - swirl is the swirl + * - win is the window to update + */ +static void +next_point(SWIRL_P swirl) +{ + /* more to do in this direction? */ + if (swirl->dir_done < swirl->dir_todo) { + /* move in the current direction */ + switch (swirl->direction) { + case DRAW_RIGHT: + swirl->x += swirl->r; + break; + case DRAW_DOWN: + swirl->y += swirl->r; + break; + case DRAW_LEFT: + swirl->x -= swirl->r; + break; + case DRAW_UP: + swirl->y -= swirl->r; + break; + } + + /* done another point */ + swirl->dir_done++; + } else { + /* none drawn yet */ + swirl->dir_done = 0; + + /* change direction - check and record if off screen */ + switch (swirl->direction) { + case DRAW_RIGHT: + swirl->direction = DRAW_DOWN; + if (swirl->x > swirl->width - swirl->r) { + /* skip these points */ + swirl->dir_done = swirl->dir_todo; + swirl->y += (swirl->dir_todo * swirl->r); + + /* check for finish */ + if (swirl->off_screen) + swirl->drawing = False; + swirl->off_screen = True; + } else + swirl->off_screen = False; + break; + case DRAW_DOWN: + swirl->direction = DRAW_LEFT; + swirl->dir_todo++; + if (swirl->y > swirl->height - swirl->r) { + /* skip these points */ + swirl->dir_done = swirl->dir_todo; + swirl->x -= (swirl->dir_todo * swirl->r); + + /* check for finish */ + if (swirl->off_screen) + swirl->drawing = False; + swirl->off_screen = True; + } else + swirl->off_screen = False; + break; + case DRAW_LEFT: + swirl->direction = DRAW_UP; + if (swirl->x < 0) { + /* skip these points */ + swirl->dir_done = swirl->dir_todo; + swirl->y -= (swirl->dir_todo * swirl->r); + + /* check for finish */ + if (swirl->off_screen) + swirl->drawing = False; + swirl->off_screen = True; + } else + swirl->off_screen = False; + break; + case DRAW_UP: + swirl->direction = DRAW_RIGHT; + swirl->dir_todo++; + if (swirl->y < 0) { + /* skip these points */ + swirl->dir_done = swirl->dir_todo; + swirl->x += (swirl->dir_todo * swirl->r); + + /* check for finish */ + if (swirl->off_screen) + swirl->drawing = False; + swirl->off_screen = True; + } else + swirl->off_screen = False; + break; + } + } +} + +/****************************************************************/ + +/* + * init_swirl + * + * Initialise things for swirling + * + * - win is the window to draw in + */ +void +init_swirl(ModeInfo * mi) +{ + Display *display = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + SWIRL_P swirl; + + /* does the swirls array exist? */ + if (swirls == NULL) { + int i; + + /* allocate an array, one entry for each screen */ + swirls = (SWIRL_P) calloc(ScreenCount(display), sizeof (SWIRL)); + + /* initialise them all */ + for (i = 0; i < ScreenCount(display); i++) + initialise_swirl(mi, &swirls[i]); + } + /* get a pointer to this swirl */ + swirl = &(swirls[MI_SCREEN(mi)]); + + /* get window parameters */ + swirl->win = window; + swirl->width = MI_WIN_WIDTH(mi); + swirl->height = MI_WIN_HEIGHT(mi); + swirl->depth = MI_WIN_DEPTH(mi); + swirl->rdepth = swirl->depth; + swirl->visual = MI_VISUAL(mi); + + if (swirl->depth > 16) + swirl->depth = 16; + + /* initialise image for speeding up drawing */ + initialise_image(display, swirl); + + /* clear the window (before setting the colourmap) */ + XClearWindow(display, MI_WINDOW(mi)); + +#ifdef STANDALONE + + swirl->rgb_values = mi->colors; + swirl->colours = mi->npixels; + swirl->dcolours = swirl->colours; +/* swirl->fixed_colourmap = !mi->writable_p;*/ + +#else /* !STANDALONE */ + + /* initialise the colours from which the colourmap is derived */ + initialise_colours(basic_colours, MI_SATURATION(mi)); + + /* set up the colour map */ + create_colourmap(mi, swirl); + + /* attach the colour map to the window (if we have one) */ + if (!swirl->fixed_colourmap) { +#if 1 + setColormap(display, window, swirl->cmap, MI_WIN_IS_INWINDOW(mi)); +#else + XSetWindowColormap(display, window, swirl->cmap); + (void) XSetWMColormapWindows(display, window, &window, 1); + XInstallColormap(display, swirl->cmap); +#endif + } +#endif /* STANDALONE */ + + /* resolution starts off chunky */ + swirl->resolution = MIN_RES + 1; + + /* calculate the pixel step for this resulution */ + swirl->r = (1 << (swirl->resolution - 1)); + + /* how many knots? */ + swirl->n_knots = random_no((unsigned int) MI_BATCHCOUNT(mi) / 2) + + MI_BATCHCOUNT(mi) + 1; + + /* what type of knots? */ + swirl->knot_type = ALL; /* for now */ + + /* use two_plane mode occaisionally */ + if (random_no(100) <= TWO_PLANE_PCNT) { + swirl->two_plane = swirl->first_plane = True; + swirl->max_resolution = 2; + } else + swirl->two_plane = False; + + /* fix the knot values */ + create_knots(swirl); + + /* we are off */ + swirl->started = True; + swirl->drawing = False; +} + +/****************************************************************/ + +/* + * draw_swirl + * + * Draw one iteration of swirling + * + * - win is the window to draw in + */ +void +draw_swirl(ModeInfo * mi) +{ + SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]); + + /* are we going? */ + if (swirl->started) { + /* in the middle of drawing? */ + if (swirl->drawing) { +#ifdef STANDALONE + if (mi->writable_p) + rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi), + swirl->rgb_values, swirl->colours, 1); +#else /* !STANDALONE */ + /* rotate the colours */ + install_map(MI_DISPLAY(mi), swirl, swirl->dshift); +#endif /* !STANDALONE */ + + /* draw a batch of points */ + swirl->batch_todo = BATCH_DRAW; + while ((swirl->batch_todo > 0) && swirl->drawing) { + /* draw a point */ + draw_point(mi, swirl); + + /* move to the next point */ + next_point(swirl); + + /* done a point */ + swirl->batch_todo--; + } + } else { +#ifdef STANDALONE + if (mi->writable_p) + rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi), + swirl->rgb_values, swirl->colours, 1); +#else /* !STANDALONE */ + /* rotate the colours */ + install_map(MI_DISPLAY(mi), swirl, swirl->shift); +#endif /* !STANDALONE */ + + /* time for a higher resolution? */ + if (swirl->resolution > swirl->max_resolution) { + /* move to higher resolution */ + swirl->resolution--; + + /* calculate the pixel step for this resulution */ + swirl->r = (1 << (swirl->resolution - 1)); + + /* start drawing again */ + swirl->drawing = True; + + /* start in the middle of the screen */ + swirl->x = (swirl->width - swirl->r) / 2; + swirl->y = (swirl->height - swirl->r) / 2; + + /* initialise spiral drawing parameters */ + swirl->direction = DRAW_RIGHT; + swirl->dir_todo = 1; + swirl->dir_done = 0; + } else { + /* all done, decide when to restart */ + if (swirl->start_again == -1) { + /* start the counter */ + swirl->start_again = RESTART; + } else if (swirl->start_again == 0) { + /* reset the counter */ + swirl->start_again = -1; + +#ifdef STANDALONE + /* Pick a new colormap! */ + XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi)); + free_colors (MI_DISPLAY(mi), MI_COLORMAP(mi), + mi->colors, mi->npixels); + make_smooth_colormap (MI_DISPLAY(mi), + MI_VISUAL(mi), + MI_COLORMAP(mi), + mi->colors, &mi->npixels, True, + &mi->writable_p, True); + swirl->colours = mi->npixels; +#endif /* STANDALONE */ + + /* start again */ + init_swirl(mi); + } else + /* decrement the counter */ + swirl->start_again--; + } + } + } +} + +/****************************************************************/ + +void +release_swirl(ModeInfo * mi) +{ + /* does the swirls array exist? */ + if (swirls != NULL) { + int i; + + /* free them all */ + for (i = 0; i < MI_NUM_SCREENS(mi); i++) { + SWIRL_P swirl = &(swirls[i]); + + if (swirl->cmap != (Colormap) NULL) + XFreeColormap(MI_DISPLAY(mi), swirl->cmap); + if (swirl->rgb_values != NULL) + XFree((void *) swirl->rgb_values); + if (swirl->ximage != NULL) + XDestroyImage(swirl->ximage); + if (swirl->knots) + (void) free((void *) swirl->knots); + } + /* deallocate an array, one entry for each screen */ + (void) free((void *) swirls); + swirls = NULL; + } +} + +/****************************************************************/ + +void +refresh_swirl(ModeInfo * mi) +{ + SWIRL_P swirl = &(swirls[MI_SCREEN(mi)]); + + if (swirl->started) { + if (swirl->drawing) + swirl->resolution = swirl->resolution + 1; + swirl->drawing = False; + } +} diff --git a/local/man/man.1/swirl.1 b/hacks/swirl.man similarity index 100% rename from local/man/man.1/swirl.1 rename to hacks/swirl.man diff --git a/hacks/vms_axp.opt b/hacks/vms_axp.opt new file mode 100644 index 00000000..64461591 --- /dev/null +++ b/hacks/vms_axp.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_axp_12.opt b/hacks/vms_axp_12.opt new file mode 100644 index 00000000..10f94267 --- /dev/null +++ b/hacks/vms_axp_12.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_decc.opt b/hacks/vms_decc.opt new file mode 100644 index 00000000..43d6858f --- /dev/null +++ b/hacks/vms_decc.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_decc_12.opt b/hacks/vms_decc_12.opt new file mode 100644 index 00000000..dd6d2f37 --- /dev/null +++ b/hacks/vms_decc_12.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/xlock.h b/hacks/xlock.h new file mode 100644 index 00000000..d509f563 --- /dev/null +++ b/hacks/xlock.h @@ -0,0 +1,192 @@ +/* +** Helpful definitions for porting xlock modes to xscreensaver. +** by Charles Hannum, mycroft@ai.mit.edu +** +** for xlock 2.3 and xscreensaver 1.2, 28AUG92 +** +** Modified for xlockmore 3.0 by Anthony Thyssen +** on August 1995. +** +** Tweaked by jwz to work with both ANSI and K&R compilers, 10-May-97. +** +** Note: this file no longer works as of (at least) xlockmore 4.03a10: +** see jwz's new xlockmore.h file for a similar hack that works with +** code written for that version. +** +** To use, just copy the appropriate file from xlock, add a target +** for it in the Imakefile, and do the following: +** +** 1) If you include math.h, make sure it is before xlock.h. +** 2) Make sure the first thing you do in initfoo() is to call +** XGetWindowAttributes. This is what actually sets up the +** colormap and whatnot. +** 3) Add an appropriate PROGRAM() line at the end of the .c file. +** The information you need for this comes from xlock's file +** resource.c. +** +** That's about all there is to it. +** +** As an added bonus, if you put an empty definition of PROGRAM() in +** xlock's xlock.h, you can now use the code with either xlock or +** xscreensaver. +** +** +** If you make any improvements to this code, please send them to me! +** It could certainly use some more work. +*/ + +#include "screenhack.h" + +#define MAXSCREENS 1 + +static GC gc; +static unsigned long *pixels = 0, fg_pixel, bg_pixel; +static int npixels; +static Colormap cmap; + +static int batchcount; +static unsigned int delay; +static unsigned int cycles; +static double saturation; + +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif + +typedef struct { + GC gc; + int npixels; + u_long *pixels; +} perscreen; + +static perscreen Scr[MAXSCREENS]; +static Display *dsp; + +static int screen = 0; + +static void +#ifdef __STDC__ +My_XGetWindowAttributes (Display *dpy, Window win, XWindowAttributes *xgwa) +#else /* !__STDC__ */ +My_XGetWindowAttributes (dpy, win, xgwa) + Display *dpy; + Window win; + XWindowAttributes *xgwa; +#endif /* !__STDC__ */ +{ + XGetWindowAttributes (dpy, win, xgwa); + + if (! pixels) { + XGCValues gcv; + XColor color; + int n; + int i, shift; + + cmap = xgwa->colormap; + + i = get_integer_resource ("ncolors", "Integer"); + if (i <= 2) i = 2, mono_p = True; + shift = 360 / i; + pixels = (unsigned long *) calloc (i, sizeof (unsigned long)); + fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap); + if (! mono_p) { + for (npixels = 0; npixels < i; npixels++) { + hsv_to_rgb ((360*npixels)/i, saturation, 1.0, + &color.red, &color.green, &color.blue); + if (! XAllocColor (dpy, cmap, &color)) + break; + pixels[npixels] = color.pixel; + } + } + n = get_integer_resource ("delay", "Usecs"); + if (n >= 0) delay = n; + n = get_integer_resource ("count", "Integer"); + if (n > 0) batchcount = n; + + n = get_integer_resource ("cycles", "Integer"); + if (n >= 0) cycles = n; + + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gc = XCreateGC (dpy, win, GCForeground|GCBackground, &gcv); + + XClearWindow (dpy, win); + + Scr[screen].gc = gc; + Scr[screen].npixels = npixels; + Scr[screen].pixels = pixels; + } +} + +#define XGetWindowAttributes(a,b,c) My_XGetWindowAttributes(a,b,c) + +#undef BlackPixel +#define BlackPixel(a,b) bg_pixel +#undef WhitePixel +#define WhitePixel(a,b) fg_pixel +#define mono mono_p + +#define seconds() time((time_t*)0) + +char *defaults[] = { + "*background: black", + "*foreground: white", + "*ncolors: 64", + "*delay: -1", + "*count: -1", + "*cycles: -1", + 0 +}; + +XrmOptionDescRec options[] = { + {"-count", ".count", XrmoptionSepArg, 0}, + {"-ncolors", ".ncolors", XrmoptionSepArg, 0}, + {"-delay", ".delay", XrmoptionSepArg, 0}, + {"-cycles", ".cycles", XrmoptionSepArg, 0}, + { 0, 0, 0, 0 } +}; + +#if defined(__STDC__) || defined(__ANSI_CPP__) +# define XLOCK_INIT(Z) init##Z +# define XLOCK_DRAW(Z) draw##Z +#else /* K&R CPP */ +# define XLOCK_INIT(Z) init/**/Z +# define XLOCK_DRAW(Z) draw/**/Z +#endif /* K&R CPP */ + +#ifdef __STDC__ +# define XLOCK_SCREENHACK_PROTOTYPE() \ + screenhack(Display *dpy, Window window) +# define XLOCK_PROTOS(Z) /* */ +#else /* K&R C */ +# define XLOCK_SCREENHACK_PROTOTYPE() \ + screenhack(dpy, window) \ + Display *dpy; \ + Window window; +# define XLOCK_PROTOS(Z) \ + void init##Z(Window); \ + void draw##Z(Window); \ + +#endif /* K&R C */ + +#define PROGRAM(Y,Z,D,B,C,S) \ + char *progclass = Y; \ + XLOCK_PROTOS(Z) \ + \ + void XLOCK_SCREENHACK_PROTOTYPE() \ + { \ + batchcount = B; \ + delay = D; \ + cycles = C; \ + saturation = S; \ + dsp = dpy; \ + \ + XLOCK_INIT(Z) (window); \ + while (1) \ + { \ + XLOCK_DRAW(Z) (window); \ + XSync (dpy, True); \ + if (delay) usleep (delay); \ + } \ + } diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c new file mode 100644 index 00000000..d7185de9 --- /dev/null +++ b/hacks/xlockmore.c @@ -0,0 +1,353 @@ +/* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules. + * xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This file, along with xlockmore.h, make it possible to compile an xlockmore + * module into a standalone program, and thus use it with xscreensaver. + * By Jamie Zawinski on 10-May-97; based on the ideas + * in the older xlock.h by Charles Hannum . (I had + * to redo it, since xlockmore has diverged so far from xlock...) + */ + +#include +#include +#include +#include "screenhack.h" +#include "xlockmoreI.h" + +#define countof(x) (sizeof((x))/sizeof(*(x))) + +extern ModeSpecOpt xlockmore_opts[]; +extern const char *app_defaults; + +void +pre_merge_options (void) +{ + int i, j; + char *s; + + /* Translate the xlockmore `opts[]' argument to a form that + screenhack.c expects. + */ + for (i = 0; i < xlockmore_opts->numopts; i++) + { + XrmOptionDescRec *old = &xlockmore_opts->opts[i]; + XrmOptionDescRec *new = &options[i]; + + if (old->option[0] == '-') + new->option = old->option; + else + { + /* Convert "+foo" to "-no-foo". */ + new->option = (char *) malloc (strlen(old->option) + 5); + strcpy (new->option, "-no-"); + strcat (new->option, old->option + 1); + } + + new->specifier = strrchr (old->specifier, '.'); + if (!new->specifier) abort(); + + new->argKind = old->argKind; + new->value = old->value; + } + + /* Add extra args, if they're mentioned in the defaults... */ + { + char *args[] = { "-count", "-cycles", "-delay", "-ncolors", + "-size", "-wireframe", "-use3d" }; + for (j = 0; j < countof(args); j++) + if (strstr(app_defaults, args[j]+1)) + { + XrmOptionDescRec *new = &options[i++]; + new->option = args[j]; + new->specifier = strdup(args[j]); + new->specifier[0] = '.'; + if (!strcmp(new->option, "-wireframe")) + { + new->argKind = XrmoptionNoArg; + new->value = "True"; + new = &options[i++]; + new->option = "-no-wireframe"; + new->specifier = options[i-1].specifier; + new->argKind = XrmoptionNoArg; + new->value = "False"; + } + else if (!strcmp(new->option, "-use3d")) + { + new->option = "-3d"; + new->argKind = XrmoptionNoArg; + new->value = "True"; + new = &options[i++]; + new->option = "-no-3d"; + new->specifier = options[i-1].specifier; + new->argKind = XrmoptionNoArg; + new->value = "False"; + } + else + { + new->argKind = XrmoptionSepArg; + new->value = 0; + } + } + } + + + /* Construct the kind of `defaults' that screenhack.c expects from + the xlockmore `vars[]' argument. + */ + i = 0; + + /* Put on the PROGCLASS.background/foreground resources. */ + s = (char *) malloc(50); + strcpy (s, progclass); + strcat (s, ".background: black"); + defaults [i++] = s; + + s = (char *) malloc(50); + strcpy (s, progclass); + strcat (s, ".foreground: white"); + defaults [i++] = s; + + /* Copy the lines out of the `app_defaults' var and into this array. */ + s = strdup (app_defaults); + while (s && *s) + { + defaults [i++] = s; + s = strchr(s, '\n'); + if (s) + *s++ = 0; + } + + /* Copy the defaults out of the `xlockmore_opts->' variable. */ + for (j = 0; j < xlockmore_opts->numvarsdesc; j++) + { + const char *def = xlockmore_opts->vars[j].def; + if (!def) def = "False"; + if (def == ((char*) 1)) def = "True"; + s = (char *) malloc (strlen (xlockmore_opts->vars[j].name) + + strlen (def) + 10); + strcpy (s, "*"); + strcat (s, xlockmore_opts->vars[j].name); + strcat (s, ": "); + strcat (s, def); + defaults [i++] = s; + } + + defaults [i] = 0; +} + + +static void +xlockmore_read_resources (void) +{ + int i; + for (i = 0; i < xlockmore_opts->numvarsdesc; i++) + { + void *var = xlockmore_opts->vars[i].var; + Bool *var_b = (Bool *) var; + char **var_c = (char **) var; + int *var_i = (int *) var; + float *var_f = (float *) var; + + switch (xlockmore_opts->vars[i].type) + { + case t_String: + *var_c = get_string_resource (xlockmore_opts->vars[i].name, + xlockmore_opts->vars[i].classname); + break; + case t_Float: + *var_f = get_float_resource (xlockmore_opts->vars[i].name, + xlockmore_opts->vars[i].classname); + break; + case t_Int: + *var_i = get_integer_resource (xlockmore_opts->vars[i].name, + xlockmore_opts->vars[i].classname); + break; + case t_Bool: + *var_b = get_boolean_resource (xlockmore_opts->vars[i].name, + xlockmore_opts->vars[i].classname); + break; + default: + abort (); + } + } +} + + + +void +xlockmore_screenhack (Display *dpy, Window window, + Bool want_writable_colors, + Bool want_uniform_colors, + Bool want_smooth_colors, + Bool want_bright_colors, + void (*hack_init) (ModeInfo *), + void (*hack_draw) (ModeInfo *), + void (*hack_free) (ModeInfo *)) +{ + ModeInfo mi; + XGCValues gcv; + XColor color; + int i; + time_t start, now; + + memset(&mi, 0, sizeof(mi)); + mi.dpy = dpy; + mi.window = window; + XGetWindowAttributes (dpy, window, &mi.xgwa); + + color.flags = DoRed|DoGreen|DoBlue; + color.red = color.green = color.blue = 0; + if (!XAllocColor(dpy, mi.xgwa.colormap, &color)) + abort(); + mi.black = color.pixel; + color.red = color.green = color.blue = 0xFFFF; + if (!XAllocColor(dpy, mi.xgwa.colormap, &color)) + abort(); + mi.white = color.pixel; + + if (mono_p) + { + static unsigned long pixels[2]; + static XColor colors[2]; + MONO: + mi.npixels = 2; + mi.pixels = pixels; + mi.colors = colors; + pixels[0] = mi.black; + pixels[1] = mi.white; + colors[0].flags = DoRed|DoGreen|DoBlue; + colors[1].flags = DoRed|DoGreen|DoBlue; + colors[0].red = colors[0].green = colors[0].blue = 0; + colors[1].red = colors[1].green = colors[1].blue = 0xFFFF; + mi.writable_p = False; + } + else + { + mi.npixels = get_integer_resource ("ncolors", "Integer"); + if (mi.npixels <= 0) + mi.npixels = 64; + else if (mi.npixels > 256) + mi.npixels = 256; + + mi.colors = (XColor *) calloc (mi.npixels, sizeof (*mi.colors)); + + mi.writable_p = want_writable_colors; + + if (want_uniform_colors) + make_uniform_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap, + mi.colors, &mi.npixels, + True, &mi.writable_p, True); + else if (want_smooth_colors) + make_smooth_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap, + mi.colors, &mi.npixels, + True, &mi.writable_p, True); + else + make_random_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap, + mi.colors, &mi.npixels, + want_bright_colors, + True, &mi.writable_p, True); + + if (mi.npixels <= 2) + goto MONO; + else + { + int i; + mi.pixels = (unsigned long *) + calloc (mi.npixels, sizeof (*mi.pixels)); + for (i = 0; i < mi.npixels; i++) + mi.pixels[i] = mi.colors[i].pixel; + } + } + + gcv.foreground = mi.white; + gcv.background = mi.black; + mi.gc = XCreateGC(dpy, window, GCForeground|GCBackground, &gcv); + + mi.fullrandom = True; + + mi.pause = get_integer_resource ("delay", "Usecs"); + + mi.cycles = get_integer_resource ("cycles", "Int"); + mi.batchcount = get_integer_resource ("count", "Int"); + mi.size = get_integer_resource ("size", "Int"); + +#if 0 + decay = get_boolean_resource ("decay", "Boolean"); + if (decay) mi.fullrandom = False; + + trail = get_boolean_resource ("trail", "Boolean"); + if (trail) mi.fullrandom = False; + + grow = get_boolean_resource ("grow", "Boolean"); + if (grow) mi.fullrandom = False; + + liss = get_boolean_resource ("liss", "Boolean"); + if (liss) mi.fullrandom = False; + + ammann = get_boolean_resource ("ammann", "Boolean"); + if (ammann) mi.fullrandom = False; + + jong = get_boolean_resource ("jong", "Boolean"); + if (jong) mi.fullrandom = False; + + sine = get_boolean_resource ("sine", "Boolean"); + if (sine) mi.fullrandom = False; +#endif + + mi.threed = get_boolean_resource ("use3d", "Boolean"); + mi.threed_delta = get_float_resource ("delta3d", "Boolean"); + mi.threed_right_color = get_pixel_resource ("right3d", "Color", dpy, + mi.xgwa.colormap); + mi.threed_left_color = get_pixel_resource ("left3d", "Color", dpy, + mi.xgwa.colormap); + mi.threed_both_color = get_pixel_resource ("both3d", "Color", dpy, + mi.xgwa.colormap); + mi.threed_none_color = get_pixel_resource ("none3d", "Color", dpy, + mi.xgwa.colormap); + + mi.wireframe_p = get_boolean_resource ("wireframe", "Boolean"); + mi.root_p = (window == RootWindowOfScreen (mi.xgwa.screen)); + + + if (mi.pause < 0) + mi.pause = 0; + else if (mi.pause > 100000000) + mi.pause = 100000000; + + xlockmore_read_resources (); + + XClearWindow (dpy, window); + + i = 0; + start = time((time_t) 0); + + hack_init (&mi); + do { + hack_draw (&mi); + XSync(dpy, False); + if (mi.pause) + usleep(mi.pause); + + if (hack_free) + { + if (i++ > (mi.batchcount / 4) && + (start + 5) < (now = time((time_t) 0))) + { + i = 0; + start = now; + hack_free (&mi); + hack_init (&mi); + XSync(dpy, False); + } + } + + } while (1); +} diff --git a/hacks/xlockmore.h b/hacks/xlockmore.h new file mode 100644 index 00000000..f09248b7 --- /dev/null +++ b/hacks/xlockmore.h @@ -0,0 +1,149 @@ +/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules. + * xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * The definitions in this file make it possible to compile an xlockmore + * module into a standalone program, and thus use it with xscreensaver. + * By Jamie Zawinski on 10-May-97; based on the ideas + * in the older xlock.h by Charles Hannum . (I had + * to redo it, since xlockmore has diverged so far from xlock...) + */ + +#if !defined(PROGCLASS) || !defined(HACK_INIT) || !defined(HACK_DRAW) +ERROR! Define PROGCLASS, HACK_INIT, and HACK_DRAW before including xlockmore.h +#endif + +#include "config.h" + +#ifndef __STDC__ +ERROR! Sorry, xlockmore.h requires ANSI C (gcc, for example.) + /* (The ansi dependency is that we use string concatenation, + and cpp-based stringification of tokens.) */ +#endif + +#include +#include +#include "xlockmoreI.h" + +#ifdef USE_GL +# include + extern GLXContext init_GL (ModeInfo *); +#endif + +/* Accessor macros for the ModeInfo structure + */ + +#define MI_DISPLAY(MI) ((MI)->dpy) +#define MI_WINDOW(MI) ((MI)->window) +#define MI_NUM_SCREENS(MI) (1) /* Only manage one screen at a time; */ +#define MI_SCREEN(MI) (0) /* this might be fragile... */ +#define MI_WIN_WHITE_PIXEL(MI) ((MI)->white) +#define MI_WIN_BLACK_PIXEL(MI) ((MI)->black) +#define MI_NPIXELS(MI) ((MI)->npixels) +#define MI_PIXEL(MI,N) ((MI)->pixels[(N)]) +#define MI_WIN_WIDTH(MI) ((MI)->xgwa.width) +#define MI_WIN_HEIGHT(MI) ((MI)->xgwa.height) +#define MI_WIN_DEPTH(MI) ((MI)->xgwa.depth) +#define MI_WIN_COLORMAP(MI) ((MI)->xgwa.colormap) +#define MI_VISUAL(MI) ((MI)->xgwa.visual) +#define MI_GC(MI) ((MI)->gc) +#define MI_PAUSE(MI) ((MI)->pause) +#define MI_WIN_IS_FULLRANDOM(MI)((MI)->fullrandom) +#define MI_WIN_IS_VERBOSE(MI) (False) +#define MI_WIN_IS_INSTALL(MI) (True) +#define MI_WIN_IS_MONO(MI) (mono_p) +#define MI_WIN_IS_INROOT(MI) ((MI)->root_p) +#define MI_WIN_IS_INWINDOW(MI) (!(MI)->root_p) +#define MI_WIN_IS_ICONIC(MI) (False) +#define MI_WIN_IS_WIREFRAME(MI) ((MI)->wireframe_p) +#define MI_WIN_IS_USE3D(MI) ((MI)->threed) +#define MI_LEFT_COLOR(MI) ((MI)->threed_left_color) +#define MI_RIGHT_COLOR(MI) ((MI)->threed_right_color) +#define MI_BOTH_COLOR(MI) ((MI)->threed_both_color) +#define MI_NONE_COLOR(MI) ((MI)->threed_none_color) +#define MI_DELTA3D(MI) ((MI)->threed_delta) +#define MI_CYCLES(MI) ((MI)->cycles) +#define MI_BATCHCOUNT(MI) ((MI)->batchcount) +#define MI_SIZE(MI) ((MI)->size) + +/* Some other utility macros. + */ +#define SINF(n) ((float)sin((double)(n))) +#define COSF(n) ((float)cos((double)(n))) +#define FABSF(n) ((float)fabs((double)(n))) + +#undef MAX +#undef MIN +#undef ABS +#define MAX(a,b)((a)>(b)?(a):(b)) +#define MIN(a,b)((a)<(b)?(a):(b)) +#define ABS(a)((a)<0 ? -(a) : (a)) + +/* Maximum possible number of colors (*not* default number of colors.) */ +#define NUMCOLORS 256 + +/* The globals that screenhack.c expects (initialized by xlockmore.c). + */ +char *defaults[100]; +XrmOptionDescRec options[100]; + +/* Prototypes for the actual drawing routines... + */ +extern void HACK_INIT(ModeInfo *); +extern void HACK_DRAW(ModeInfo *); + +#ifdef HACK_FREE + extern void HACK_FREE(ModeInfo *); +#else +# define HACK_FREE 0 +#endif + + +/* Emit code for the entrypoint used by screenhack.c, and pass control + down into xlockmore.c with the appropriate parameters. + */ + +char *progclass = PROGCLASS; + +void screenhack (Display *dpy, Window window) +{ + xlockmore_screenhack (dpy, window, + +#ifdef WRITABLE_COLORS + True, +#else + False, +#endif + +#ifdef UNIFORM_COLORS + True, +#else + False, +#endif + +#ifdef SMOOTH_COLORS + True, +#else + False, +#endif + +#ifdef BRIGHT_COLORS + True, +#else + False, +#endif + + HACK_INIT, + HACK_DRAW, + HACK_FREE); +} + + +const char *app_defaults = DEFAULTS ; diff --git a/hacks/xlockmoreI.h b/hacks/xlockmoreI.h new file mode 100644 index 00000000..20df0352 --- /dev/null +++ b/hacks/xlockmoreI.h @@ -0,0 +1,91 @@ +/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules. + * xscreensaver, Copyright (c) 1997 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * See xlockmore.h and xlockmore.c. + */ + +#ifndef __XLOCKMORE_INTERNAL_H__ +#define __XLOCKMORE_INTERNAL_H__ + +#include "screenhack.h" + +/* Compatibility with the xlockmore RNG API + (note that the xlockmore hacks never expect negative numbers.) + */ +#define LRAND() ((long) (random() & 0x7fffffff)) +#define NRAND(n) ((int) (LRAND() % (n))) +#define MAXRAND (2147483648.0) /* unsigned 1<<31 as a float */ +#define SRAND(n) /* already seeded by screenhack.c */ + + +typedef struct ModeInfo { + Display *dpy; + Window window; + Bool root_p; + int npixels; + unsigned long *pixels; + XColor *colors; + Bool writable_p; + unsigned long white; + unsigned long black; + XWindowAttributes xgwa; + GC gc; + long pause; + Bool fullrandom; + long cycles; + long batchcount; + long size; + Bool threed; + long threed_left_color; + long threed_right_color; + long threed_both_color; + long threed_none_color; + long threed_delta; + Bool wireframe_p; +} ModeInfo; + +typedef enum { t_String, t_Float, t_Int, t_Bool } xlockmore_type; + +typedef struct { + void *var; + char *name; + char *classname; + char *def; + xlockmore_type type; +} argtype; + +typedef struct { + char *opt; + char *desc; +} OptionStruct; + +typedef struct { + int numopts; + XrmOptionDescRec *opts; + int numvarsdesc; + argtype *vars; + OptionStruct *desc; +} ModeSpecOpt; + +extern void xlockmore_screenhack (Display *dpy, Window window, + Bool want_writable_colors, + Bool want_uniform_colors, + Bool want_smooth_colors, + Bool want_bright_colors, + void (*hack_init) (ModeInfo *), + void (*hack_draw) (ModeInfo *), + void (*hack_free) (ModeInfo *)); + +#ifdef USE_GL +extern Visual *get_gl_visual (Screen *screen, char *name, char *class); +#endif + +#endif /* __XLOCKMORE_INTERNAL_H__ */ diff --git a/hacks/xroger-hack.c b/hacks/xroger-hack.c new file mode 100644 index 00000000..32e1e4b3 --- /dev/null +++ b/hacks/xroger-hack.c @@ -0,0 +1,100 @@ +/* xscreensaver, Copyright (c) 1991-1994 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#include "screenhack.h" + +char *progclass = "XRoger"; + +char *defaults [] = { + "XRoger.background: black", + "XRoger.foreground: red", + "*delay: 5", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { 0, 0, 0, 0 } +}; + +extern void skull (Display *, Window, GC, GC, int, int, int, int); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + double delta = 0.005; + XGCValues gcv; + Colormap cmap; + GC draw_gc, erase_gc; + unsigned int fg; + XColor color, color2, color3; + int delay = get_integer_resource ("delay", "Integer"); + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + if (fg == gcv.foreground) + fg = ((gcv.foreground == WhitePixel (dpy, DefaultScreen (dpy))) + ? BlackPixel (dpy, DefaultScreen (dpy)) + : WhitePixel (dpy, DefaultScreen (dpy))); + gcv.foreground = fg; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + color.pixel = gcv.foreground; + XQueryColor (dpy, cmap, &color); + while (1) + { + int w, h, ww, hh, x, y; + time_t start_time; + XGetWindowAttributes (dpy, window, &xgwa); + w = xgwa.width; + h = xgwa.height; + + ww = 100 + random () % (w - 100); + hh = 100 + random () % (h - 100); + if (ww < 10) ww = 50; + if (hh < 10) hh = 50; + if (ww < hh) hh = ww; + else ww = hh; + x = random () % (w - ww); + y = random () % (h - hh); + XClearWindow (dpy, window); + skull (dpy, window, draw_gc, erase_gc, x, y, ww, hh); + XSync (dpy, True); + start_time = time ((time_t *) 0); + if (mono_p) + sleep (delay); + else + while (start_time + delay > time ((time_t *) 0)) + { + int H; + double S, V; + color2 = color; + rgb_to_hsv (color2.red, color2.green, color2.blue, &H, &S, &V); + V += delta; + if (V >= 1.0) V = 1.0, delta = -delta; + if (V <= 0.7) V = 0.7, delta = -delta; + hsv_to_rgb (H, S, V, &color2.red, &color2.green, &color2.blue); + color3 = color2; + if (XAllocColor (dpy, cmap, &color3)) + { + XSetForeground (dpy, draw_gc, color3.pixel); + color2.pixel = color3.pixel; + XFreeColors (dpy, cmap, &color.pixel, 1, 0); + } + color = color2; + usleep (20000); + } + } +} diff --git a/local/man/man.1/xroger.1 b/hacks/xroger.man similarity index 100% rename from local/man/man.1/xroger.1 rename to hacks/xroger.man diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..ebc66913 --- /dev/null +++ b/install-sh @@ -0,0 +1,250 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# 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, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/local/bin/attraction b/local/bin/attraction deleted file mode 100755 index 47f6c708ce4aa1b7b3e3c3ee58a04f474dce7857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48236 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 OJ^q+6PldvPvi}3G;SYQO diff --git a/local/bin/blitspin b/local/bin/blitspin deleted file mode 100755 index d023a3d90808d5fd0e4539c0e3ab36419f66f676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64652 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

+k8GMB>OkE1`Ca;&>Xi0n_j`w#*V_Z*oi;1 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

3|koY$5T2^AM#2!psTKSe&grPcJ^{ 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 JMW<}j{R7?qE>-{l diff --git a/local/bin/bouboule b/local/bin/bouboule deleted file mode 100755 index cfcc80c49e4ce8094da14677288ae0d10f3b4c04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46004 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 Ppu6W)V{jyT$zT2-rPpl9 diff --git a/local/bin/braid b/local/bin/braid deleted file mode 100755 index 9a4e60c155e353b7f53e4d8c3956f5a4e9936742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44364 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 B3l9JQ diff --git a/local/bin/decayscreen b/local/bin/decayscreen deleted file mode 100755 index fde4af95292915d16b504ff3d46c8ce87f2784a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36172 zcmeIbdtemR**`u>Hn8Ag0z?cNb&Ek$4IvOzE>RO;xd?$JOD-xgT*^ghnIN9fMPp+;kC6uLkTxnAzsRU`B zA#@fEN72#}z#V`BKpa57?#GP@-~h1v3cyVOUULB}d4p?)8c1K#LIyQ}djaDCHb5!h zVZc2AUP}R006XAOfPRhEZ?td`!ZF%?juxUy(%stq94*v?$8kd)-3j;#;1R%L0NaFD zHNYkABy0lwJ;aqV}M$~EPxxpt5OZ5

u7W&%>QI6YXQ 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 diff --git a/local/bin/drift b/local/bin/drift deleted file mode 100755 index 28d31ea5c44a394dc93964ffe3f759643ac61b07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45972 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 LU9ig+7L@%TRYlbO diff --git a/local/bin/flag b/local/bin/flag deleted file mode 100755 index 13ac4d99d6b2591cf0a1eedccfbdacaca5821ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45512 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 Cu(r|w diff --git a/local/bin/flame b/local/bin/flame deleted file mode 100755 index 94c27ec19545d6678fa80da9dc210f62fa35bbb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41840 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 Qiu|eJCcdQfB8-{sKcQlKyZ`_I diff --git a/local/bin/forest b/local/bin/forest deleted file mode 100755 index 152f905bf1726d62933c52b0e9b3914b2970cb1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41144 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 z 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 Pes*v-K9sVb%qs5>(LeqX diff --git a/local/bin/fract b/local/bin/fract deleted file mode 100755 index 0e59dd828ac8bb1e6508cddfe3c09ad057621d24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40076 zcmeIbdt6l2`aiybK}Q;6R7^Cq(Xhx1qL6tHl|fC>5#&-y$YpRqU}!Fi9S5tl zY1v)7o$7S)bgZzvfSRCLhs=r*P&Dgof{c^_jJv zwVt)sv!3;=wVrih@3qCfhK905zO=2-cmD>yFns+j+~w{zTQ(>Sg- zrANF!9MvYkus~LRC57W*@o=e}Lx`83Fxexy*Y|Wg<@BgKoNn z-vw6-7ztPi2nNUxl5#4*g8(W&4KM_d0szZgDu5nTfjz?|mmFd~3NRROA7CzE24Eb3 zo_Ihy;C{ejfc*56JVBB>3vPeOA1ArwL`eRrK4Ij22tYEr1CR~S0cHat0rX@5NFMYI z1S9~K0Tux0NdhDTCIfB-(6dN%xOs4w0I~pg19AZLEEOGYKHOLUwf~&}-zU)*`G4dm zoeP!9BE9x~pla7W8ib7S3BB3JPhQfsTL8Baf+s+9*zX|8-&b;PlH3WB8xD6AU=ko& z3cFWwWoI-zeE@QwqVS3II!?YQqDSq-PXQx;W`6g_87v;z`FNfK#0bCtZ>A8;%g- z-|(bDsew!Jq@O455&L^T?l(8}l|3T@m3>eF%Aa&txy4&P>E{L?en|f+ed4o$*EK7Y zB%iTqre7>0e=hed*D+3 zrvY}WJG{s*5Ebysc0P3*~W8kza{~hXD^o`br6p0DeoW$RD-G zIN%$Q-XO&VFAKOlf2uJ<8G+A5`J*I$RslbDv#if5 zt{k{Vns14I6YvW34^h5-xTk@KBE1SO)#pvPule+soxrz|yrBOSzaRJpANd>st{m#^ zzo&smfPdOr~suiL)4s z7wA{&3z7`_f`Zh%oaK7U?1D_QnJdgJC@^MoY4Ik#o?}TevJ3Q?Mb=_2Ltm7GY_ct@ zi}jo(uTW39WoKGABreX&;oybOoMFz)MU=ikpKYNuEAvdoA}%AhIK!}tOPg)dXIk`g zW^-v4R(6ublvlLe%%#mMvgl1kGcCqKu25fCXk4l1a)}3&kwb->GR&*Z+2D?%&3a@l zGLo5PG+DrJfz@o_(o*uw*35!=aq%W&q3Gw3ETc$oGI421dW+U%GMeUQ7UdM^5n$07 zi;*|0>}+F!(PRe07JUiwv&_+3W)>G0&E6TIvu~3!*Es&96F_<#ISCJ7UaeCC#xLQh*q0h;* zWTMX2B9b!+5p97iGIAk3t4VLpSPAJGO;kB1lQdHy7*5oijaE~(o=YpV>L6ESo11AZ z5Nn;FH=8q;>p8|G(&bH>$fd=ZGFL6gD?$oO9E!}!G^5p5ner@5@ZgEd^|W;HY9_+e zyrLZAs#%%YE0&v#R;UEpgQ}ka>mF>G%n%osTTI30vcPOl%gGhuvM50sI2JS0nT*AH zlVvq)Wl?b`QfkbiTqC5FTWq#uqNOwDELb#a=7Nkx@$pI8B^gU*&RU?&0Q)JKXx@~} z0;}FkA}-2CRj3qden`0>&rD5|B&!=p(JZ1iGDY;M8*ACZOmHa1d-0jnIT$({{RUc_ zghmiG0i~iTigLNENAxD6$O0s0mIOhqgnpHkZ6q)b?4F+TlJ>ZOGwvAL*tR5 zB-o6&`xnkkn1{aNk&~I|JEA>UFo0m6qwjOGdA@xlz!&sDoeh&>o zilo&=*&H=a#&W%dn%S6}lewC@vll@#=IBf0c9c4GHUtXgLxV%nu%Kf;i|iRcUiP6U zk=J+qXEtW9&{HTDfxh9{rq#vQ5lf3jnuh}CiuPV024k{wX?_a9{MH+Wbtt)*r^3j^ zqESQcY>o>j7YoJ+auZ>9le+|KKytBQj3F0>|0Hq;VtgkThJGx$Flgh*jm11pF6@v6 zp! zIBpHO^D(ZIi-p~Ka%LnBYWGMrevyK6j|_p2W=F22*^OspDB%>>QpfNx z!qtRVF{BFCe^_aE{?R!b=EmzlMO3 zO9(F`yqV!?gl{0cj^RrQuOPgN;mZi$M)*#K=McV~@a+sY5dIe76$~#Rd?(>$3@;|U zlJH`NTL`Zrd>O+_2(Kkv$M7|T*AX7e@G`>d36Em@HWDC5?;pecET$OFJ^cL;Z=k$V|XXwwS?;!-bHvF;js*-UT&x- zJc{Ae+YQZxYZy+w-XIXJ299=SPd=B=@okBfw3aNdvIGhNh^#b-SYHEq1fsVeQdE*X z&uH9NS%9JB2gLp^BD_}VTvD!f45VF$L}#)pQ762BDB&#q48-1){g6s0oD-?@IjSl5 zJn_(*>o|x}NPLp{wv;5&QtrWZ2O}TnIH$etH@Dkatgx3TIE#w!<*u_IR@i57)()q> z^TCJsAJY#yEq8FvJ(w}DugAA}lK=V`$MNZ1L?LHifp|Vy$!k^loT2?0*#E`&AtBH| zU82y11qMst+=ZEfkd$A7-^;)|-2a(TRx@}I1)N|o08vO zhAbSmc0NATsdGD0LhYS?Ruy7Wg$dvSttvc%EnCJBLZ7>|b_{>iu`pc7kwXy_ML`k5 zVmWAk9VWr&F1h)m_UdVlg&N@=PfR7INhv1Bu`om!>WRVpC&oBu1_gf*AL57)tASE* zTur<}bd;i_BE_hQR}+Rx+8h2%Kv^BB!UB}TYuivWjbAUMcEl@?wIg2H zplxgDWp7h9g@rfRnuS`le`DW9C|%>-=kVK5*nH}U%htswcYUmKBzL+BJMC?XhOqE7 zS7Dc5yvlwkTuv@@LI(dqS~WD$t!?9NZIeqwf;aa^dpq^VWaaYeGt(NVtXd~L)9H5C z1TwXTh)4;&`esv3o*oA+4qpFvid&`N=O|yBivaYb`_3tpDS`p19ol-Qwq57cb^tm7 zUAi4aq)QR*M>MK~k_w|6Ca1TrydUjVqitlZp=|_hGvFLR0JQ1yhoevWVR%ZePvo^7 zykZ+N31^u^l~-8@^4dn^bu-T~E?RG5?LQkCuX+dMi0Y*i0*NKYHsj)k^-oEPZm>^Z z046z0zvwF7ZLd<#wpX$M>xJlx_UUDJ!6@>?#oH@cfc1h?G3>QE42rSU%?h3H_9ct} z$ADJ;d?7LJofUdix4UYw^DA2hHQ^0i;yEfofwCPl-U+db9@x=Z6`+W7KI{RJ<OMk-&Puw^$ZnjjZ&7;Ao z;d@WCT8!qI@MHXR!lDaMXR$vRP7>K!{0PJEz*4cCjA=2jodQ(|e67l(O#GuX0rMN5 zz^_wLMiPtji?AP3+e^ay*9O%D5-Ck+Vitc;7Dq->!^a?BJ2MrgL3ee+)0q4D`V=7m z%sINv?egqz77wa&o5~*PX#f_ynBjR9H83siKDw7Ny*mg)YJOF?2C-Eb6 zhId4tMrVkKhPp9U7K^+j3NaICbi{C!4Js+lP>Ta9)U$lNr!ViIy$hY#KgID&`2BYh zr2SA%itq_}FQf>+lKapy8`3z2uGdYbBW;2>_jUD79!PPEhbCw` zICN(q=20EXBeZNU=^kgj`vy`U2sQNT$08)~aP(?BaS(3bOB#k@Ajz;DL!DE*-P4v) zEPpjBBUNG?V?wCIUW=z9-#`yBn!lk$F0#!4E1KB@3ouyMXq!oXyta9A;1~>4!JGB~ zts)E+OZUJcld8#24}-81wVC8DzB~MIi0W-YXJ-h`H}o=BzYE?Me-__u z{NewibnM#z3jRTretnf7#y}*`$4r`dqNFc zg^w#g=de?-lt-#?=~q@|ZLLG6IP4$E|AS&beGEM8h8@lESGuCBF1%?83jR3W9sKbk z_vmVLNtizO@wVEUIikHhN3{#|y!J#OD^V+#Si_3iO>v)*gd8P`npiPOtf~gVEsvsz z3SL{!?_|Y3NySplQ7p|-)+IG%6!9g?zSf(Vm1jHAvx;JYUlX;R6*x!X<&g?(4I%rS zagNPKu4ax3znoj!Xty=?3V!TWC|dpmA^SYZMC{Rtj^s+=EQDmJr)-le6NN1#vgAs~ zK(c5+9@CTjA0WW=ZD^HKWXUP&kOEqZwF@UT-YS+D`c!`0GKP1TP2nsf(cF%Za>_l{ zp>56&N)%>FRA^#LufzV_EbDi&YS)rgoNx=D~6IA65*1*rG-uA10 z@G+?^nV{gWOsJA|pa1&OaYuSBe^m~+^tB`5m~%;x(vf^DQAqoRM3KAW8Zyas`18|Q z)@$xjq%y%cz?Xshmn4|K0K=jXB6^tkO|I--5wcGXhd|g+K8feeIw(D;Y80%x)EG|v zTXJ9bt`D#tL4S{S%T+x>Rc)ZQ6zdu@gpV7d#=_Dv!34+OGT+`AV99M+2f7MGDRuZk zZ}l6-ajg$kNEyrXmpA_J8jf=fLsx2j0GVGO?}zx-VgEk;!^q#!i_#DArWfoGqR;+- z{b0x(x&G6r)9c%%8vEFzW6+OjiEULGs9kA%UI1F1kV`FMQ#$q%>iCER=qxX$sFYOU z{x(>P<>#Tsy>n~I+i3LV;Q3kh2+ZSr=^Wf7Ui&T<{C6NfjMeDUy@iuV4*e;oXh(Sg zGL>>+9?FGzC>JR`TgLx@WTe4W))3)Y_xfhMVvs45#*ET(Qx7ZHUNXEJ#}i%hj6BAyH|N7)Abk z70=S>gy&iyz&giPssnFRJN8mR$jWXD;Vk#$`#D+3I`UA}by!rstK+rULZI!C+i#&+ zUelV_T|e!%P|h;y|CIO+*!q-sOob06ZwpJkVNs#DNQG7x`9_Bc-eg3h=A(;zCs5l{ zb3`8j=aZepXzB3ih6cn!;CGg{<5!oj zN?~=Z`5D=3kJV^TKyaL40EvDuiT+KTCOEWphTACQb_&_TLTDi*29Bb@wJfkv42hzU zLKf0&xSJAAr;t`0j5xIC#E{t(;sT9pZ!=?!es`%H<&AJ%@6m5VdZ+6>3Pw?^QyAt` zUW+N^INaWHUGhU;_#jJfB8A~E`iWtZ?`yC=lc3Uh<^!ws80NFv3Xt-b2Hq7qe0=eRRS{ zqew**c3T8zsUzdzyLhk@V6O_O?)0BpSGtFPiAt~^3`B_>N(AxLdfOY(7saAIMMSv2 z_xQnvRNM?!oVvvX{<`Zs)fTrzW9hfq{c9|<_mmh6o3yGXZ3u7GfNj_L`s1gY%g$-7 zy_!zC&byA*yF^scR1Z{;V#~VxtO^iR*MH5TMcn18;jU9UfoZ5i z<59$5BTw4}1=orjdCJq%!XKa-@abW>jsf*-r|*UYxsF@JeZcgtPgD-{3EBtrB+qpW za_ZaUsab9ta`D8nUrsH#p_04MyI-utT$T{Rr-$;^u;5R$%BH}McNI!kl};2pf>f?* z32_|-s+N&z*Fo18pVDYif5Ov-eVbfp)dQ{rpVIUJ$&1QB&D#eGQ2i;HcdjpF9U-Ma zKBvyO&NsDCCUIpQvDRCf>e)XR6y|)Z)g#ZU`VRXQKkFcraO~7s*B7TQx6bsPzpwaP zZ*6LF9X)mC)Nf6JU8qOvZ9ef$4Xz`n&Ygl@Dc(aBkGQ@7UJZqnG!%7LAp$|H;X=rd z2JPN(4TI5SO}91;W7YxNiS4UK%b{3^(b`_^KWpmuYg+QTRD`9#x&UCgxA;d4HwX|yk>ZtCy0#pMm93H*W4ho>Ga_2=u8QfWDhKAxaj%wyBck=!K&Aa@vl*k8s1 zwx4s_D*+c;Klj>4*yRy!3pmKvS6}sOeGm3WLWtjZA6;Yhoy5wY#`kd~2)u0?-`lCc zmZ!gtN}9A-(4Aw0m)#c2S=78%pd9hr=?4p1Xwa%p7KS%yg~rRSBTebeP1=Y?eMtRp zP3iSb+Nef-7@9G?jy8ma(nomfq#ErpsvK`ShP)5QO%CeqjK^kQd@q1Pm(-x3k)TOi zSAV2Y8z%0nH)-n$3lXu#gyxf4_4PxExTUTWMzIqpjs397UZZl@j$y}GSX;rEkLS}_ z{RT}vX`A9yJm`!mXS^I3eNe11SmHzc93kWRC4LIWlJT_LqjbcLS0cCBBpIY!Q)jou z!N}T9iC>+{$I7)}MgSP19%pA$J!UM>Urm*B% zC|W4aLLC0~11csM;&|=umQBbK{lD{e%ft9PH7Me zzt}nhd-FD7zJy3IDTo7{h}k{95bHJhm{9!oO639OgnBAqR&aLb%|~(Kz*W z>i0;4DvD=kZOrAG?;Sfkto7`~A@>elbzkpR_pkSw4n43Yh-<$W{b5~O2@bQUOC*Q$ z{T*BP(5|XY%~=OvYOJ9ZG}p4f7oG)Y# z9oa(pIq=SbH#tN+Q3~VdVDGIr0zz4UKd3?&u0nFOUJfMJaz9Fu6+>Dtp}g^Ao~Xxz z4H{ahXQ@k~sC|>-Xk++ELR?j@D^1PP>=J94-c&DkWY>{~y{|*I4SToYS9lCJTVSa*yhm8W zdlch3+S;#2{V_FdX)@qow1rV8(w^A5_ojIM^UWwqfPZ3%d1MY zl8ALDV`x;YKZ4eI3u+CG5@mgI7b8V*DD=f6b#L$n+I1#5t$n$v9_s5mv?ps41?wr= zqpt#Eq}Fs&pdz7edKH5kDHACb^vAJx7f775{lu1M8nu~cfunoZlvg5>rmXU+HCVY3 zM$dFwTd(aqos8r)y)L~(;WgzO@JnU!Tgf+h3#&lzCc3}R?>Nl>VfXa^<%Ydnf&U^tyL_b?eQLtE}Aq^=Hv7561;}pKlr%Kdcd%sFK4P z6(^;6<_S@#w$Mh!X-Q+nHr`4NiPPMz-ZqxcbXgng9L}Af5cRrY?-TF~TiBU|#?8vZ zpvf~5d$r2Vq%Uhd(eitlWcG-X*&GD%xsKS&sfr3xpWw}AEDfk@@>@w@Xx7PtN`oAO zutmA)4w!7Tst8^m#(ZPs`3Ym0zc@dgIf*owpP&q$`3a|RY}omz(Pw@#fRN@VI} z$r&@&9Xun$>;TqiHm7Q=eZA!m=%SB(Nvk<8XXlYUR(7p@J^i1=zHTpdem0}2c{UJW zQft{lO6|6@xSY~Ka>T{fQs4E37(d?|f3@|Y>*EJ|i}{*GVQxH#+YHV()}R*B^ysM{vj?ZqQw@Y)z`LGao* z+Gp2dvaU}`fut8CI<<#zAAs%$bm;N}STiOo69p5dA*a4lVo=sU@CQ>Fd&Md~J%nau z%TR2@4o+Mwoo<(4=`Wsc2i3dXtz(_Df~MA%-jP`O86wIXEP<7Ohes!q@9~f~d=H%x zFB8$q*zNvxCJj^KgMBymg_+MkN6(RaSs3o^h;hyLMziOedr6I${Xl^S`G`y_gt~VeqE@SfL5)umQ3!1aZ;FFI}`>30ym%ro0nGw5V&HC$ERE z1h2hS45w9H>v&nvlD#2D;oP3HU+FLBfa-Cry_x;PX0n$k+u%)G(Pf33Q0jhK{G-%M z4sm!FE)GWDXpeUD-|_!koOpT+W-~0*ET3Y+z1%o(4P4LS69$Pi%L!FCOtt>sq-qR& z0x_88X(}vl2;THHxO67@MIV{GmH4v+IOoGq*a9L~)k$%5bsagm$4Qg(sWUfVBk)Dg z`s{5CXlyxkrZu>mJ&m<*)hWzLU(&pcdE|9AIbqHG!zrvw5l-A-oqOa4me2s%5)w9Q znC;UVP|@US97^?&Q)n__8PJ0Jb(HOi8jdLYUZ%Mg4O`FdB`r%8CJto$Vj0s1 z6Sa8H3#(&NY8(YJrS_YZh~0=3CsTh+E+MJTt;AlUb1R7o4#_={|A^WK>l-x|%~&k2 zVe@1J>m_PYouTel4P6L))@}>uERiTk;>owHkBH3_UM?<_ACxHk6IqKP=!%Y8oNu%t zKpIdm*RZEd7b|-1_wJ{JQs+&_P8f2*8XFgNsM7{v_~>Py%31v4F<0`>`gFl(Sr<$e zgudAN-9G{ulJ-X*k#)T>aOpm}5tf7Brt}WsCu~OlPZU^GUNzKVxfHrWAEQA)|Vk8Ci0=t$H9bH_gRT4*lR#(Ou~g^UnX|}qaCcq9BkDX33H4cr*r{yuPq^zHY9L!PRTz-vc@9Rsd}pV zjDpAdLK*NV$s9!X$r$jqF=MBVvkXeo3ES9iJ;|sK@~ffoj>GYmtt)sF{n;pQ4WU(V z$l5+A?xo3}BW0xS2UlT?N%G_mQ-pfgP(kB$Lg*Q7=c=4PKuJ=}0S0iA=t7S744pS)fOIIC2eAm zeVBZV4@rU49U*@9DwSP(%zw_*t80W5!Jl%|A|+0~OCP2sGICTeMiVCr6OWTj)U6MA z>=V|GrE|nKyxEb^PD|<~LllnW4%$ImFj(nG=ycMZQ8|xSzotBJfM)53yQGd=yj5Sj z&tdCg+IN@T*2P(G7nPk)2!~Et2GZKRKf1rT8`ts!#6A#BfpY|7NrK1yc|76>XkbvEd8)hGnytSdYX6r}} zjlMYblFb0gI?_9$k6OP7 zGO)M-3Q8Pz6C5=#SWdu#l)U05KE1;c04+eyu!-ZRURv`i>@jrhbQRq`P82GsWzv;N z!hU!pW?6%$cO?k}a7Y8OCJD2?B0Eixs>tjg6%Gwq7suLBx_0RNh-Re}p#ya_G{Ndh z5#ELuHxFNhBVGq^zQn=iOA_i3LT5QdmLxn1EHz2^3mj*82jr@AmUoepl(K{F|LKG% zuqU3f;(BN6v~K-}XGvmpLhF~POudNe`0`GcgAhnnWF&_bp&WnE`G$Z9xw+)~*u_*C zEw*rIh8lut%b~5{Z51>QyMx!$pO!llUgWhEWs^9|?Pw#{%#FP_)|DODzd^gL?8@L( ziZbms%|`9E4FT*@-|54C7=$WPgx=r@tzKq(k+bNW$uCa8IpCFz2Yqh~Y$;pQ_j!%w z7F^npF67Z20v6iG8g?D^;kdrfbCjR;W8}vl*nb)_+)Wb&-_CA*Snk+=mV(HllY<8A z{}%<3RVM{mmF)U{>-`nTqP0h)W#;~0DF~ZWGQA~o{~r|OThOgIe}%~Irkj~5hE7C_ zcDd;oyLhBuFH2dxm?znrtbfpX24;OEPZ9n``yDu^gz;|ekLFF43|EQXslAGYLzm7l zSRiH5LK*3H9xf}4gno!OUNwjk%f9#p=~o4QkyBr?*P&m)F#dRs0=nlf_E#T%ZuR8{ zCmYxCa|!%(>I`v=pO07z_uyxNho4-=4~JjmB=Ph6QP^YX(R3cf?$KT^A2xnym9#sn z6E>n>Ndm&AG};8WH$4|l==P>_Nx-$K->e)^vC)5;#-ffwsYS-ao>qn9H2i_iXV{wX?e9I>A9pH~gga>}Zch?wYN#WZUtHtQ zANJl$@7Z6(-1GgA`6h78`jqGX5z3e1>92!|qP`VFE`U3`GLf~&GMxg2#wE23r zKOEg4wFvY(h5w=q_H*dQejAe8Hy%*zpEh_^VA%o9hJG{4CgUzQNTT@*`_mxB-IyUc z@fu!VCdZbqX%>N$}BU1|Ug31<{p4F-cG*1}S$-DUu-4 zdOiIk-GZz^l^8?ZEel2ZwG>H%yIejNP41TQp7P7P7uGkrs)fvIvD=}%3W`_xq$dNs zEw%D#=teiM@IJ|5URuLhU@l^RNxf>_Tj zXmq~TIrC4<>=-Lo_Oo9Ow5V`q`+_PS+KQO-X>G z!ICIIs>8d86j^;0K8e-2U{!3ZpAJ&Xs#?f+7WLQOc?I%@LBR@*^r^Qsn_V!ebDkGzeP;z(#*etdG4jICwL?$tgb|Mac4@xs~kTDnx+x0h!h> zc=LNii~J_`q}?LYM*7gMBig_eA;^bzK)KsefING7=+>s^`=ZPgB%r>2Eb~LF5^xC(Tan2^fF%x_nqV4Xi;!paNrXtY$mG;Q~h}W&owVMCE7k zk8aQjbF0x*2XRcrWhl>ClksX*!4~f?4~u*#)^jX#_P2aY5~6rKfBy^lcgugUn17N` zf-G?`;af^FD+PbnX6+^14{=xUY4{`Mf9@yldltat&*a@b|J`U~@Sh}vUZ4LT$dmoq z9P+;mwvj(f1mpjhKaGS~+9V1Um`a$&2Ckax4li#%u25EJzQH@t0KP8yW%;m~&qqI? zFZ8!|p7B92g9{&fU969H$iOB5waJfAHCCrMRG^2k^QR_u>;DyDvC39}#2#ZEoArbD;~?IsIaO5fA0yn%i^hh}85>_qY&viuf7 zvVOS0DfB~wzefYN|C9bjN$rIWl!~3Ly6B6kLbOy0?xDlD!yu59D*Otw4X1A&g}<3k zu1gd$S(&(Wj_q7=+=idF zEcP`buy;><4Q{iBX60A$A1L}hJf8i6b&Z(H`RH^;?5|{gEi2tmf z{^~>VQ5_tX7c#>CI+kcA%LuZ!Uj^^oU=k`V~Wb2n%db^tK=M|Su*{9Qc zCPVv1BI`UGpgDnQ{NN<-GT#2Q#y`Dq+A5L%|v0^wjQNd zvC==4{}%2>ZQ?JrNpEm~JiKi}e;mxUP%BLazDs&7uU*+=dg7@ zVgnafGs4HDPG>D1I-P1|89W{O$XN&NUxqwd)kv~GjeNZ-_AiA?3GniVVD6^4@Ca)f zKTv~?v+gXCXe_wX<~om)Nt`8M7o~Hpv=u@Z1-eqPH0Vs^2Noa?I0oh{36D$U=|`Y< z`e7eA1J`5OSVYC(8ZR8&S?Fxt1D@Am?}hDEd$wxW+Jh{u+Uk}NT;;@lzjc@C*V1cU z3%!+)j-(LRciow_U~t`$GWTKt~v)C;JM%rV5{MJ$Ene$TZdQRZxaGUws2u%H&@0=!?8Xw3aa_` ztK1rFEH!f0Z|B(E3Y%i;wbBpbr&`;CHzkuQls^GNr-Bw(oSYn2zbG(-4w*RA0WHAl zpjA86VuFz*$?5bi?b2J&GNeja6_SH%DQ$dkteZzO%gBcn<{?)x8{gd9_pyICNd{+A{XGDBNuFnV{zY#VMaC zngf8Wb6Qgt3F+g0YEXNxZWMb+;%no;OmAWYP;*q854u#%nn~%>cGX)u zsoJ4b?O0Shl=o-#3|?Ob8kaT{e=2~x|7c1V{)$ENH@mcI*)P;+>qU7$09fhO>x74p zQm!}d7A7<%E=EnC*v0CdCf2(YnBc&VPrch+>Bn5!V@>H*OAsM z)uaS}y+8C6;%?qSug|@y%KArTM7ZZoU%`*gLGyT%S1{S7(x1?QRh){J9YHFm$!}wS z%!FvUjT&glkXW9 z6*Desyru;2XkAf=H?VT?6wi&y(HCT{p3-MR6g`@tQAOG8HNjK*OpMXc6U0$wCFX3r zzO~4li8rfiCPYR}9HYrvt+_9=Fi)>}Aahk-k$FX)CL({;Be6wzL2`Cxu|6`}Sa=tA z`@Ebfnw2J_(GqDGvr;oYGDb6g^5pU3q9%`vj)Hf}gy<>bCu+Gy|GYlF+q%d zCPqb-#7v6fMp2#~il8(Nd!ei*uShe}JSB+JL=+i|a`8Umg2=mqI0R{O@jhpb#h}-u zB{5Mak*G(SH92^#FMA;_UOF7fjm6uni$RYZIE}_&u@p}kH?CN3EH2PT`bvHrnqr)9 zqm2s+;*yI@`fTI!qCB%cM`J9ew?0n+J3-tc<~M`8>;h|!eu{<*>eEMqVmQsTOw;li z+!zfP8N|&p8tFyZT#m5_@6yKmeG^G~Otwsd(%X#VI9ZaM&pVW}GCi+T_IUv?UTvMD zH?el(=83K8X~Z6~ryhegAIpu+#!H#eYT2u^3-FfUu}p&zB`PjA){Hk(Q!|_N=mL0$ z_gJf0ADzQx;++i!KrvtypbS7S_Mo?HFlC_3y{RN^K|%_L6X~tN6irqEs>4O*dR}Eb zMYGC4@01?JL3;G2@8x*?w#-s8Ues*nL_QJ6Nt}!IVC>4G6C0OH`IInj$LL zOy!{Xk=Z@zGK-*gOkCYa3vzEntH~`eW?Fm*sZhL=`c8|cnBG_}GK}KHJ_P|65^q1x(a?*fS&dA(K)1ThVbFc#&QH8V7KPo`19C#o>7h+co)GfEzlvgpm$tkcmCUUiSLhg)u< z*IJwOt2x$WcsVy->YmL)MXwl4EhqXYie9WvN%fMi*sQna7{&M;bf0XC=+}%aU@fPK zDj8W&B3IZdk0y^m<}+Pg+2gN8B8gpG4(rj3!MI4~UCnHJVMc+ZZl+;rxY*QWs948IIGjdP^}L#>OCq z#sx7Ph{&Zx=4BaUBTA2&P@;)|`se72Ee2AioH3g0!pvfLqjNCCi{GH4F^s+$@)lli z_dbB||LOSnm4y-?OV^U+>$-#+xs)BUGq?U?XbQ@@NWXa1af^X*sE4+^H--|pOYam=RG zw`P2>{N#kao3d2zzx4aNkBr#c|NGgsd#6v%v%N8Q$w##VUZ}c5`Q|^4EnCnGbUgF(X@%dFmhmsVm{SmP`>4J7k0sT9vhCu=-VempkM1+{fyJv$vjX=oNbOzf zp0aNJ=ih(Ow5n*v-Uogw8b0Y0o4#Ik_g`x-JO4J$t#5d9*r2*UpF7hyuDU8J^t+5@ zNiFTSjreFvQpq>3t^Ce!!gm+%pINt|t|)!B!h%a~Ce`t~UEdVnxyDxxF$WC8Up*Oo z#Ene?*^gxp_tz(He(v%QUp(UnzZ_2f>faB%ec#tfSIIBa_``qx?Ws)(r+@i?{4zcH z|8jDx{^Gae&yrtGOaAqNohujpG-YD|{Bl0zKRR^eXRn=E`WpG=Jjvg0Vxs#}W9c69 z%lVT(ZQ?&I6PIdGo*a=GL;?QhdRvix_u0)CkX@^76VupwM; zuOPq75BYb0Klq)mvO-=Wzswu?8?&R1l`MPXZSu=}lHdJn{P__NP5hYrGSB3{eNDRh z%Li)?kYDDX{P9Z5gjM&a{geE1UC5ueW#f|JsVxoUm+M7-r)I~>FP1zakYBDN`FFni z$u?`^O@EMIt}prX!j?A$M|@Ql2)|r+^8Y2vbpG6%w>(aMSq|iPzGZXo9+}}Jzbq5- zzkGg!dh_dleVY8Te8|5uX3OxL+uNTbzbq^AA9&=I36o!)w4MC2+{ph;)jP9q9=`5P z^2;(L|Bt;sUh=~$N8TmBEKl-ZTu`mA9M=CI-)#E z!d}}?ep%+^AAQ>o+wOUx^>gye@+ZIV^L1Eb8J~6d(0=p<*r^zqpNokcIzxd?mofq1PUe2Fre(P9RvqSsL1}axBi)bcg1->1) z^>1$zjm$IoTTB&C{4Hw4jzjRvJW%+@F)zoRc&6wV3YYmIf8UcI{C?p=>ra%Y%o~O4 zDtGT1nce#_^2>Y@&Co|`3KkwoI!@s-&y@d?({JCg`!9Y>ZZiKwW4!wL?t4eOz9kyD zE>z$3``fqFUY+y_(a7~88tann_a?1LJF^ddxsF6L{jt!Xn2Oh4AsV^96mIo*J~Vt# z@K>M1FV~&?yAR)KU9lx!AR1W?l8OHUd3f8QGZ-tDJ;oWAXal<3PpKCrK|Ez9)7 z(3%F# z-@_Nb0R5F2weNMgT=d>+r(|&vZ(xzLF6joZEuK0BRQ+|)< zSRSo;(Cch=e+RfcmH@Lp`q}=??+slzy5~5^6X##etus1Lu)Qyv3)i3pP#O!7S@X&sQ_kG3%prYlyDj~r7xsOnUhu`(@`pcf zFOFZHq#OPBfY?Fv`OH`P{r#tsrB8%by*cu|nA6F3|I+f&=06kM5sJfqz3=Ivjem@~ z|J%^pW_-STSX=Q^-)g_wWSv<1`(497Iy>~p`?q|%;XtpdIgedfwddsWV{4PQJ@x}%y|pNor55(E4$;#MJtMotBS;E zBx%M*Ry#l$9HZONFaXv7o&dZK*aN5ooC9D#7pbZdm3wQu51-uA21ZV_w0@Q;7m16)400n?20NVjofOYvZ2n2CjbJV6QCLbc>pE>766t3EPxGw z7Xdo~hXD0}HUM`kcn3rPrU7(-96%Xh3*dFYF2Er`J)j++2m`->F@RXW5`Y1)22cUm z38)1$0}R-p|1bPk2LIK8|LVYhb>RQ54*cPVQ&$|nh~KEgVa~+J@tOsh*@i-FnvvG z9IWowe?Z8Q>M%*=O^q8@cI9-|$9dq}@dnQeuGIiSY z8TZC!W@Tg3a=9Tde?>uIk+Jw;li6ZjxvFIKBM&Z3e<)+wzmNaR8e8ewvUQKz*Ox!` z_y)&D{t4%%%@t2R_4Jml&pf;Bx#wSa@uinv*}mh|*Is|)&A-0&_B(%j_r3Q&*!lMl z|FP?%k3Xs0{pn|W_U_wXRej*#q0bN3)E+td#j!8H`e)tO$G7cvlwE**DdMbfLa1O_V|Qp0TGEU z&Mm?BA4P#O_NBb34NxMaLj00^G<0^OVUnThaPtZZ^vmgZK(D82LFV$Q4AT}-1rYAx zi|UWInPoDr0E5MO_&zP#oYhHVv?A+VO^&fJ6H7#DKYS2X)CA&!HrPom%=F<~9dh(IM9(XxkJ?hdpe}%; z9N%D0`hu;7si#?!YekFAEHdWk#So20VWqs~JhDN8AdkMA3ve)thv_<1311*aL82fK z&c*>~v#7h`AVKs!>UH-G>UB5Oi~4^iiC>>tD0OL)A$`-go9ve0FwBGwT`cwWMWU)o z384w>W4>lC0WFJf^lI|Vtf|pa=p-Bm+N+Ev>L5Ctw&KgaEK)iaW{R*VD<2I>$w*ys z{ECO^l_ArNLr8QLGy4`SDdfx?Xp#kI-_mH9WGbX{WY5?*+gMm=Es~Gw#N&D}Vy16G zd-PHKENo9X-9y(zddTjcXoMx8C*~Q9#iYC#O<6yf$J*1wvIb=0Scmg6;-?tb8Y~DE zWz0k>^;fYyi*TmxJI=E&0{e7#v?iJ)7vjtj8$|5d9DU%K2@sWp=Fw>65irveuYS^j zWEND^jB`0A(?lj+c__!6K?+S{1I!TCH?wIPgGvHG!DOjHJQMlY+y?fk}*%kp+V+jUb?+>nz=i%){}i1x(75 zX+a()WscC~!9hqX6mR#Y?6z&7Kyx3rSl4L>w;z#aZK{s z0jucP8CL|*?@*>U9NRU-E+!S6xw3iN8<$x?C-bXvyOJw|tV!eNbOEE+3*W0>Yn zGlU@yYSKK*#ucf%dB+p4S>V;>RT!)xM||s?%mi4DRF==!OLa6`i(vz>8cMt{`W{i; z>gbb**p;*OmYa)PLog|N<}p*WW;8d7rprbUn>Z(k1nAGq`oY=0M{>A5!P=Oz#<_3a z@*;VZg)+)^$U<>cp+N)pfQmRDoQ||H5{Xuh9G(Lkpcv^f`xi-?iE4?nSduZir#SOH4`VsDotiC zJ~JjhMV- zA)+ochk~5OCXE4cR6ozS$y&rasrIb*c+|UR*o3GXgyB}+b#xefuM5NAdtF$}4Z`le zLD<9_gkjRZE_bNAwNq5q*PtMBktu(Wpm~$MB&67x#4NUKU10l6g;_ zqEVlP)FCu%<{$%8#J$ZS+Rff**pM`vGNV_T@t9qyH^CxggGH{DnO)T3dX`7u3A--r z2K9(RJ>q1`os9-Gw6DHC?G4(4jIis_e;JYS+o|_Bw`eK@dkcVW;7%+O1Jx!+hxcGVTi#V0^ z7jV=j584YKG9mp*BXAWpeXp$sH^qe9sWZp3)LF7$v>Gu6V06hT!CBDY& z50_rb5CXR!U=U!zW`&acF>w3C4FwDU_+G}L@`wlGCu#N~xPD@uoL?`xZHf`Ln2Usw zY2YGrRu@6DMAu@%l~R2{WEN(3<|!_)5Iu~KNanR*!H8>v2%)>DWZWSk`=tde66Ht^ z!p3uvxU|PI#*CSb3y72}MpE2cMTyW%xE9h-xCYsWYqxBr8=0fevMwi!stEK9$uQ?q zAE#0%F2iif&MV3_%4o4Qt6Ov?TjQCzan^Ar(>M^1D;Yn29J>N+?sm6yEL{j5XMl}v z9>;ku7)Kg7=?e0Hm_uabIIAVEz&uX6H_Szj6K@|=36a_VVQyZ2{?{qR(m8{9<^R4k zDGk=FXvY6I84Lq)CG;Ps6tBAd$H}a02>XwdttOqoMgtPcPZU0xyzDuJlD5aF3q=C% z089bUM~x`_6x>Ww3O;KiV$57AJVoUa;jgg+pHOdF^I}i4t!FWOWXu@!04tk1Td9*vtV;BR7W~T;MF+fv>_)Xt- zr+EO35lzTl97ivts6hPQ9yD>_foQTo(*&9-#Q*eN_k7MtG;p}p0I#}pmw?hmX1&>v z!MYPS6@wRzC=&V(#;zPw<|+w&3qu`7AU$?_rI7Dlf)KFeU{@hI&C95cc-@;bz%Sh@ zHFF>D;5ck}Wq1P4BEZvmGLXhh>~Y-ES5cv#IF9W$jo9JG?xJQCb8+xeIW&fF8-e6x zi3zyZ{Wu$-*rdT?-eMJnlHvX`zyijb})dm}{gk5X_QqZO=NaV+BUqkT~?{TEXeoJayC z!!22Ez;sW5sGJYZP;i)3eOgRkP+;bML9nIji8*KPb4>na~d!@wj|1mcb@;kr2Q1 zNzPbUB=m*K3iNOq5u;#%(8r=Rh+hu_CIK#eJsXbap^ikK|083AUVBI`y&jWX8Y$_W zoN>s5M#Ha>#|HoF^Ps*(BV}_RjJBW!DMz1brH?b5=usZ^CmJyafj60!UcOFg|Jw(-F&hw)=Q_$1$_}_>E6NYW(*x;q zWSbHl*{NjsY9MC(XAdhYXFLKF_B|DYU5*^vQ^m!YybLB@a z_cjDj*+fV7Yzzt@dzR9YZA(e0eIo!e9ofGNKu2~l(NVliHy(b<8!R#Vdm82%vV-ME zW&z7D58YhY>2pEXE>{+DL`N{qhc0%js7{j>B2ap$uJp_T$mNo~Uy^;}a_35PRA1^= z>p}Mvi~{+Q`O_hQ@*|c)p$?%dIIhyC;bgiLAG$i+ovJInejNZ3F5QQ&9(48phAzj4 zj_zYMgDwKbiu}msf*lWkv`$evAunQBdWepo7(i`7^`P~nY7^=Kznl-b)P7_%kV|xj zKz9gq!GnQFk4z7C@CT0Ghv;Afc^;XCEeN5!QzsU$(nQoVlpQ69sjBZDbBRw+R rLEy5VqW<+Hh8Uj!*?YVP-PET!?n56&WV*9G=ze*I<95lBK5_pans1PK diff --git a/local/bin/galaxy b/local/bin/galaxy deleted file mode 100755 index f909a1e2248f3393664e1d4ed10b4b17f4c70359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44368 zcmeFadt6l2`aiybK}Q;6R7^CqF|o)i2^x4w6b3a#N03VyD#GAE+|DqgSPqv)%5gi& zDJ?rkO}kpBi=ER2%L||hniZK9BQu6&olS5IlN6Pj@B3MM?_n_ed_LdT_w{@I{`sJ5 zul20;tY;5u1Id<>Gp3dtw>-uXX#l;g;;{A!Ms-vPKIz@O3I8p?66&fvJd zlppE7@J{Z6n;@oFQ#}4yI(#Z;{qqzf{)NZ^$)9L0HcrgTSxGK)LUG}QdpRxxX*p7Q zwB*l}{IT%oz}*d}g98iPQaJjHfa?#p9FEF=7>>$&5bl1shv4XMwCHi8B%i!~aFgI} zhg$&m09*_l*kONj@g%;|;gVR4_!uaKZ;|{s__B`Ur8x4&NMWe1*WXG&$#7wCtKbsh zv~b~Y^p^>zXCaQe4gMmyEVzYmR3RyFX>ilvhQra{V$tK~!%v0FhMNLsfTO<^?8$Kn z@MptKhPy|Klf5N!;Qt4oY;UMkF4?#D-vDnw3f~DIX6gA0^n}E~2zW!_M&1w~>;>N{ zg;kPIZG!&pf*S`n6^_~x{ml|R&vQIN0dPT{7>>KoD@?&yxan{jIBFBa;0D9VfAi!3 z{E1T77ybk(93}ZalD`c89a8v4k8o-x`YUU|@BnTgYYX99#r}cpmGrY|vcHn}pmef5 z-BSuB*%hTz`Hg@{rv#II$n-`chIG;KSA|jopVCRT$PxZZvd00OirMD&xnh4XfV=3X z_EH|o{GR~BWANkf<50dR zkBZ{~YwnZbf!tGot3W>niXnb?z=a}xsHC5N0NxFGi@+bHe?TzGr}`rJFkCp&S4i+t z_`0V-Pl7*z-}jdue!d1=3vdizfQ-MF0j~i45D9(< za1qkC!zcc0;jf4N5jtHU`3%JoMeIDTH zUiO#*cm?p~{ON!@Kwsw12)N2C|5{3y##=So(-VMO!0#ByMdfV1k8EqcMISZpr0$@KMObp^2+k; z0$dJQw%^w%KlCNjdzENeR!v6tq zIr!nASHiyr_$cffLCkNUGz9{Xw*eld_XAuGxJH5p1KxoCmil$-U+)6E5A?&O^of8w zz3gKeU^Vh@m(pheuJO`O65th(*TB;IaVr2f0uGkoRe)o>?Aru*!7s9XV`SeE6PdHRe3 za}g*Q%&YXvS7+pL%k>3WfHO^Ni}ai+Ctpv5Gc!ya=oIB-aR?$*yu3Ig8%g>+eWr=> ztj;kO7I4e6iW_#^uFpi!;F}B^T>W;5H{OZf%UoWg>I8TtBI1zDor(sUWdVm-?s>Y`YmnP0>~z>*xwnyAmn%Xw5Usv0op%qz$- z<*-Oz=dn2EX(y-8Kw*fZ!RE(lQvO5AhA3fYBU@5#miSi z&4or1jwvV2m=A^%^~Hr|W2T-<%Qx$wV35tuFz1O_QL!ll zmA!n|YhEy#piR0>%D6rGn-Ots@N zJ)ojyM9XAG=_MPh-24o1D5m$ov#8B5Fc!@T7Mz575RCz)qBaV$xs{LVjfJGJf=p3DhEg9~RR%!}pn zvh*e1s+(m(V_Io8L270sXjIwS)q2oR>tPlx@dndbE;U?kd11kF^bfEqoCyh%o`^09EM zAwL7-H2GN^*Fb(0>haYTD7>nw4o~;wqo^(S=mtDdW1M?5SqF`(Tx*LPf1}At43yT| z$Y8P-gPPzP29wnoXxMGt$6&G^gNESU3??fwpcc5+Dh87^8EDvVEoU%Ul>uCFtwjtb z>oUX;yn?}GWrn!~>ljSdW`LHs)))qp)fr%ATx&Rk$@&Z{2-Yx|gVY8Rs8!8i1;IrG za|~7zTtaZi?}!+!BDkF376z*c-av38gM$dJBDjXZ!31w7cprm92;NQbZU$=z-b-*5 zgF^}4M{qfV!w9Y>xQM~y2(BS`1%ty0ZXj64;7EcS365cK6v0gdhckFO!7T)97#u^e zK(Ly@aRhe|%rST_!CeG*{6_LGAeh6nueF82I)Z6g*xJb8B?PMpu3>N*!8EOG-N)dE z3Dyw2o53pxrsZC16@#+~rsZC1IfD%ZM-g1a;5>q32wuV9B7)}(6R3@#x! zjo@$wuOoN`!5Rja6Ko(@&EWL}7ZJ=ccmu&D1b1|k{F?|aC%A>dRRnJ!xRJqI39cfz zhQZqj-cIm72JawvH^I9Zyqn;?1XnTmC4%=6T+ZOV1XmMW#Namwt|52@gZB~KK(LO% z?-JZda14X132q`doWTbOZXsC1;2MGjg4GN@N^l3k9D^GO?jpG3y4#)0<#K#`Vl}N@ zD{D;tLK`BhX(t6xe**=CE<{<6DymN+C&T%-7-49@1Y0;G0=!mfUs9>I4W?a>M0>I- zQ72fDB%Gi}CHBayM^!rEq==o%kp{TG!C^7cc?7+a_?OJLrzDZ}a!V_Y#6Qb%c5CBB zx7%K%u$Cw|lZx--ZnPd#Snub|opycK(q;S)=|}9QyEyv+jA+=m9XZi z7C{(&X9bUsTXKEm&=>}C9WzD0Mf78~#Qg0!`r9wXb2VamP)zr07f&Uu)XgL{fZvLC z>aB=tt&->X4eJ5f?CW6bc7?6B#h-8T8@}WgeO7T~kY?V|FU-#UVgA|x8;gjvYWH`-E_!UtYCMNF4}*0Ty_;+g58pzQL`1K>RF zIPOYsX}0VWp8T)zoAdXb1!|MqeBNzt5h@^)BfZ<9?RKR%y3J0vxkW4t~sHO7AH?uc!sC(SG2sFaCElTIeH!ANF}JGyyO0_^9Bix@g%rwPUQb}-Vk9c z%loG+y8PFJ!L!F5mM%WI>wT3ixzmx~*}Rji&XM0GT3w8-udv|1qqB*b+SyvyQbWB~ zp!(z!gy=OVd(?AkWN)$LnZk8+3wJfYYKAfzi zKAyG$Ijg0^Z5bo{5Zlwnd2Po{I`Wk1Z9~Bp@HzD0@w8vhwe_vy6FO`Qr@OTR3@v(& zB5(^&lPqmJpU@u7Zvsx>mU$TVXef$N=x7}2w^-=giLvPAEFelFAnzt#I8GBo<2RqK zw9cRriZh3>nRTv@@a`qI`$dYws8CrGxSj?z-jA;$-yZZ-?RWlugV~_Q#unS-)Irog zPMyVLL2u2ef1Jj-bB~&4(!MfMW-H0#W5?NMEBM%O+iaEJZ1md(Oa|m;@lYB+TTv_A zfrQ#FAKUB|{A?8iRSe8Z5~{i&m^8nb`}Tpq{qoJD_se53k;e*{u)a2@qRqScCpM6u z;Ph*-CA8FQ&r@{k2CVpd?1$H$r}m%R!at<+Yl?739})@uNIC0~_4S(zUF_6%*pjRJ)!j2c9dwsHwpfU($r;gu#Itm46uKPEB7h!#CgJa`f1D6Q9u1 z?Bl5I)h;xyCWohkX>7I}6~Zu}p(>m6k2dEwq9vU;d(pX>s>|gc4$|lgQ0Q^u2<5^r zaXmq-AbuD5Fnwoy5e79_x--56V;UNVlcBhlhRuA{6?WBO>E^ZF@2YItF7&?5=?5J7h&WJLWAU@r+!5NsCma~tz}Nb9*&d6cq8X=7 zKiBP4ya>c9T}#n}gvp@VwN%X~h1-%3MBf&;Wg~dzADhm{E5_DOYYg1-D8ch1Z3zdW z7b?pN`FIuL8_KfDC}wNWPTCjq$(@P9e>xyQ>~u_>tzAB4ck;23I+&}J-jN8qSu8k! zV?7$wb`Q<}40NLaGg+WXsLAa>>k!EuVyK}mKj*?Uk~yLKJ(VqiWVW^|nnOa{V|1x9 zaLa#4SV&kmtt)U#3jqmA>spm>DddUb7pr;2;~t6IhD#l#G@qyDGAl&KGbtdf^JfxP zWu38s4&zKQq#S4_SQ0m;ZAS0>H|is%EkT?}%JjwjVK-G*87nNPZDLP*x{+S*s#wM{ zgu1oo<+gdAPj*HxP@`iscB3jSLhD`7R1ZDY2Kimoko}rmu_{=rbES&xJ~qg?5~EUy zD>lTrGUR{O5(l6q2KJKAMeULI34FUo*Q}t)>3`cYH)GWOe`%TVMUdglB7YtAOH>9ztw>_ahPf3zSC)1RO%Ms1Idk^cakLZNYu~LPKD~{|2 z)%eQGr9ZGFo$zBjRv!L@h6JqqKDD-oiA&Dt8EME7xc(jF;nyhmIm#Cw zMg&%_p`8k4iopE`OB8LBUE86vYdhh(;JS5t2uYVBTtuOmzhhaNk2Pz0$La@RcGBQs z*E)gQ0(TxxfNR&~jucnHd~#DFukGX&+d+pOm!dwVqB%ifFdZSV77#4Tz}W-PRg)thJg&m@h?Kw$6x~ z>YWyEt!5GCOLoPG7q_C_$JDkcbizArm=aV0to>e*q%%-{A%P7mDto*SQ2d5dsxHYu z*@a1B63RZRu+C^?#jC1ftNuFc&Z@`E=Eua-5Iq3>Q$Bh8AQK zia?)*l2QZ{!kFnotNnA`!ZSa?BHt(5F}OYGvw#v&(^CLTCwod(@d@gP8tc?S=04F6 zsLehxWMX1|q*t`JqYHwG3D09TA>^WQ(FVvK#yT=5+7pzE_mG}-dzb?EbmO2_XRq7= zOr7u(c;P$v_%uxDY?ag520^G!_#V+O#z4^q!Zwg>{5DEW6q=A^(7lSiqO%C)Y7GCl zgz$F=>x6bZ`6la8P42iP;d21TaFRHhK;*X(wM4@VV2PT) z42t{=VjOi@K9e&A8)kVD9jrLz9K@RiL#!vhR*bhEB$}LgD4(F>XDM_BlLzB@hM_Xp zJu!B~kOeBEhm(Q>H-AM;4kk78M_{siq_1_IuhOrFVcOK4RKx$?y&rQK_b+epwO1Og z2Pu{_4YZf^ZBzH^@9iZ%Jky3>y|ruMx)8(jp0Wp^>>f>l2cLtawiLrl9+V3LX;$T- zZ+O*{^d(DDGP{^Nt;sad@Rld-12HXD5^Bp>aB6tRle}F_=9%&%eRM+ozhTZ|doa99 zXb12RM&5-ZlSW8S&yo%B_Y08m-rJZ zEP@kBd`={ekEV)`1YO9C28CHznof9{MuVmlfd_N;${3{Tl4OH@5^?;&bu33v>v_;a zUnlM_@(a^!_7J3?7d}m_yYN^n{EFi>TV)i>q0Y9JYB+PB?D}|3nlFGmMc~dBAKp$V z{5B#G{XkgYdYT&La*GoM1=vByq?1_)A{M$*c{??s#fBfLsEZ^Ge>b?H29qkG8oDX1 z?`5PFA`NptLo*HnlMK~(rW!`ff|-2~f2Yn+AcizLLwhXDjj^&= z;NfWM50pF9dXOv(-9VCIAG$ibcDJW4s~LSYgpq{!01>&I(1;bdN03bF8EWh=D?vpb zGqG!p{@U8U0G)NcwuSV^Yg?lIV=(drZax68UfW268+M|H$05@1EPqRR^mubW-qL6b zY@5rwC!Mk-H1Jn9*2(?Hl`r^OYYm1^<9TSZkr0RMiG<#5zPqE~ZNP$f+MHBg+sJb| zVK`%5l{wgt`Fp4MU0p2iy2;^fyIJU=IO4+r^l!U1TTZ=~W+ z1+EXLmT5U{vouxIlNxN62I~>EReM^Exe6awdEREFXo*IuP$r73ZLsMS$9yO7|Dx0n zmw|`LpSiPGcyZ|u&@FZ1bv)TV6lG}RS2O*}lC6g5VwMjLy?ekw;Ib}<4;IGROSH7?% zoU|_qP}-7D;(Xv7sUmyN*C3K@^W|qS((CS1q%y?}fMA9uSxi4b*wlfFt`fh=)x8Cw z`N^>$C>zEn@w`O`qX$;Kf{9C&Vb|}K+q%?$vG%S&d&gFdBm zRj+B15uUGUzO~EGl-*hZyecFqb$Fn)`rryd+cJ6LEstM4>F;Q;pF09gsqG;U|6{rj z(%VM-dH%nEzO4`CAJ&s!xCPqqI*+p+37R9zKb;!AzC&JD$@A5U_Hk&(wB#|X3{sm6lkw3qNJ2m;am%5i9$ONb`wA3T(7(BN=#$+IEl%0x7E{h%?=n z>tkmn>nK2?>#(SNL&s}3=$IZy-A1FlrY)!U`r2v<=1gP$yUcfCu1}fARe53ZmXOq& z78Q&;M5uL#nJlal-mX3^QuHsoNFA5hl%oeo4dPFr# zL@4`CtRq`x7wCvpXRGW+*k0Lzr!H5O!em_ZEy!z6)@x5gah#!zRDY3F|4Il{uWdA3 zp_uCwvz5iryiSbty@JRx7U>jYloXTCVp2TOxrLbbzY3QonjooaU5)6tkDzO znw3uYjyLJqoZjVllcG@+YZQi2MC%^PIT4qXY}mV}wjxH~OVPnBTIii2ic)@O>~wf# zm`Tz9X3?D_3}ZB&B4;y3v8~!bnl4geiNkkU|LtQtxCBbad;`0!12CU~rnt7-dhGAq zul}WdDINjAg=w;=+at}Ww9A-9U1N3F1c~fBshhxIy~h0wmISt)rzsNs=0OUi@|IBd zH<*M`E1rx@7>8J?bZY;8fo(Ib-cLw>sQ<5JFT(w0Kbz;upaS8i5pmE z#k3~N%Mq7tm6YHqBFz1bCk!^E;*L3~ICZNL{PnhXk`}+5ilJwV`)BdIK#9)KrB%7K zLA+T5wjCFmPKjIXeOzZ87aS*=93rT|zWN1+Af?h7m;wm3(#E_9I~+AQefh`$6MXK< zb(jB&4?G9ev<2LIdp9WbL2LmpJ`*Z#6*irB9Kj*w(WVnkZH}V|!9V+{<@q zHpH%PmxpG#Zpg=94102F$q$zNg)!3o3(&z>mJr0J2lM8Tzz?)am%n1aLg}cHj+PLm za@0zI;{-sp4AeS~I6nE1dW)vhtcs})`{NMsjHAv`_aO}*(7b32l++IfQ2QZG?;M}V zHbO=LI%m&0F1T8WNL+bmjQKWK6Z_|Y!CYuFd-Pe;)QP(i<{>EIv@wnp?z_l<~$wDD}2omVvh$=3W z!l=;R_0l{PRffZq5o~tw$Nf;65Al{DyW$`O#j50kZ>V4GjyQ!TJMA0Gh=}Hhzz=Jv_e`r@&zz(oa zf8Os>+s8fgBkc0vNbv~YRD0d0?M=)-5`uj0^|CcK|BGVfPv`sD5(M5do$qT`V9V22 zMfnf%aZt>C=M?w`1{VNQKe(?#4bacRSy z`VdrOdLwNJ3#E_p=BRq@NfM5?oCNJ-anS*N?eW;`i|+%c&?PmqLj#w#5hu{v5U2(> z0bJT9f`UZInb2}ZtELL=-Ia)^NjhN+yYZ#59#dKCRW{2>>=+AWRgC#~KAp)oWZD_a zRJ&rSJ+hMVQaAR9C^1;#gM4g3_wq}86t*Sz(r%B^7I&`_)M809$hof3YKg-nYd0#% ziaQE{>-Um83DbEWrZmC!73#Z#=~0*BRbey^xL^VprZAhkEk%d{A}p%ah5T~+!2W*1 z^ys0bVUnIAPNB{e7=lP$Hbt~36D}GNJJENPeV-y+J&p3HcuaJnQkiW~QIDgj*6SeM zYrQPd58Ql?m`;vjYZ_k~ge_5g+9J3%MaU`*VDXpR?#JG| zMVK$a*V`sAc&G&b);5B{0TTRs+pRpdFp$HyQ~?TeVU5s(%?B~K1`zQZwYCFNr;6fn zVS058^SPFp<6}eGzMC>^=I}KS^lfwhJkxmep>+Yc1IPBOO9I68L2@XL(6=4<6+&3l zoOuw2#(G*obFGK_Kzno^fdpT3E}uLuk++1U=KAo-p$K8KEI9<{_d0$yR!5d#ehz|j z5KIojAwOb5_&M*lCyrIw{G zec0unb_o691&p`wdAEJO4`2J-6^okxg(xeYAFKGlQ73i#UL88_u*k>iil%c-t*#xe zt}fV<160dC6#H;iMBrxJZUi^QKKwC8_k?RbLv?QYl;yAlyA+>0L%*eSZbfAVCo|;hCywLI2Va72n-6ZsQ+VPYni46S-z2E{O-gZ`Xd7^Y{1}?Hx(rv`?z46L zS@0ORB^PrXjL?v}=?ojf0@tVFY(&&cFqkClreBb)2_(uM5S`x5$)?-Pn-XEj%nRUq9_8em%pltSQw>D%PEer1=rdGtR>XDYfsiB3csDAJ^C6jMrKVX1u9bN<`>Ypkui}` z!G3H9-vx?2)<>*)W>H&s7CE+WePuNgX~?RqS%;MyLG(9+*4AbHXV4^hU7ssEDZajP z1D;eCzl}oCTbTfXn?sPFKS+$&6=fKEFcJ0Z;2Zu>{}^M|Gaa0&Hh+O}JvSJ}9Io4!M{JQf$&d%S68{IE)7s!9%VD$Ypb%qCH(mSCsiTQN$i<84%t zxTLVHr;g?846KfIHv2wch<4q4a1+A9R$M_s$M0t4q0{6UinUhdX4;pno^bhtOfv^W z&1?yP`f!=0l0;OH`2=n$#tML%CcljohH8x-QW{_zf-TC;cVWs#tBSz&AuKdb9-q*c z`HJIH>u1Q*!HmH(KH(IObvrY@U~G!x({3Qr_@qMJ$juPrM{;QNu+m8p$9w7$dKQ`H z6{UQ##-<2>VAgtH8KFqfAf@8=@*32%u4_@+3lbmWZxYBqu6ghyYPqaWOq(#JY=TXc!&98ja>8M%hcP zzrq&1=9jdZ>*4GI$YcC!>+fm*r1pw~)cDzmrsi2kfI+QwD;c%h%F?n*hsX(++e*FH z7h?MSp7iT&%l?=?v?u+yw)_8>9?+Bid++rN#zV$|Z)snVgSj@wA;iUa&5|%S9>LXO z`^)Pfg)}^R`L(3NNhpy+Bn*0*J7}4N=kvI7bM!XM{ys3 z?gw=0a{X8}(ya(1h9SGYT4GSPKk$dCGWLp9e0mU#%BJDih#i`^SUTO-Vd*cPu|9Ru z?QR=ypB*r*q4ciA>Zg%V*=+K!wjrRC(YJcgGl4E$uA`N)+x_z_>ZZiMcEFcriTB}; z&t!34bBPG{_hrw0czO#1sn8tE-)7qugs!>1l71XP8LgHO&IHai9IiH4G*%q`_Hnb+ z`bwpQQ(vj_gy=^Ul&`*0A%*BP{~0=#WcLsie(b8AZCf|yy%-okFmUrgtk8rCY=9gJ z0$#+aE0?X;{L2Q_SJF=_Xi?WTPhJmS3oN@`jHgvy+r6@)rTK=KgmZgb!XGG8fOxoz z$>u+7B-=@312=C&lND}3sfTItk5aGL#O__Vj9;Q0< zh`mJnHc}Nl(t9HR9@P!jH)<@Ju~=Tm#>p_&O4On`!`#gp`T@?fR!b;;42gmyp1jL? zkJwD%<>G?*A&J80AT7qADcWwczub-psYAh7!~V*3F=F7sp8b?yYP{*#2?G_Zv2js{ z8f^f&k3QCEoXIC1Vo^Xu%9TT3J35zTT%0U=oJfi`4Rn)$e!HIRO~i)xXtZu zbC=uPX;_6u=p8|OgU~XqF8XxPxE9C68ZK#hFvJ@`;;HJj-9))<7j(o_K0M+Sm=I;3 zotT1!H%em~&ZqfhayKB_!E)Z9TkifCB80b3#V`-LX5&j7(=WspuFqNojkrOB1 zrGKF%GAOEXe;9LsL&r!b>b8eG^AlE&rE|nOyp>&R58{^$Q?Q%vLHvTDO588DC(~7B ziN+X40|#iP0eo_Y?Y17#%MRHr-OT##v0A!0^C;2S`Gio|lxZ-n&2fXiTilIn{T^zf z{RiyWkEUG*7+XIH)h7mQx1-2zu#HTKLNeBz00G$o?D~B@?Sk3AitL~E7ip!V6Vi^b z?L}z7>c$PTw@KgH;ODNmZOOqAm#1B^7@%2OdS}FO>;)Ygs|}u3zs`3omTeYazj|z3 z;TE|)i0x!ye#WO`Q*sb4bK^i6P~0E|WsbWAo*EElPJjZGyy6x9gD*$E8iQ}hT zS@#0wV`$pxD*E+6q7d^j)u}Q`n1g`CEUWPJ?j#{eLmiPSNqDr5=4pZ?BIK)RSK-i* zHF2yRrE7=w_h?i?|Bl)=yoXs=if}K2xOq4Ro^<1HCxBhBm@9TO%nXz z*(*DtSDn4Go4llyJ#_z1CsZ?hTs$@7dS~18UhRixSz>g;rCJEnB!W7=vWrm=?8qv{ z9a98z{1N-h0utov5`W)lZ7(8WwAjL-5o#EQEt|HAw^UI-><(N%5v|6au!GlDl}B-= zQK%!wtc`s)HkQ{N-k{xHer@O)MY(pnW}|ld20wPG@7rTO=!B|pe+fLH*2^tBIFrtv zykip10k3U5;(c3SYx%nVf76(5!=(-M0(2pd?hvrpe&&!rU>}R?|2K~4ncoLJzV7e` zQ1yNqDEJO`>%(-{;SVW_W^{7Ypu>kLie`0Elv&AsF5C8C6-XSpA<;DJa6LuQs4tV4 zaQIV-@-FChoWDY4lj&w=ilGt7;=KG?4ZC=xUoUG}yqG7=H(C3j^9+po$etqngZ4Xc zPKn98c_6AcRhqa;_;&4eEF8LZhKnd5N%$1Thz^4;D~yJHh&NulJY|=n>?EP#Fmce< zpO$?|!iRv+|9Fl9deax%s~11Fd-H>njX&^n1^jgB3?W^_&y1V#6N)5J7Z*@=k`RR_ zC`tT`0pvo9rt=_nkM@uHVf}{|Kd4nL)(IQYt|SFvQyO)G+nb&XCv(pX!4XKBoLlib+`=4><*M@l=q)e!IdMK!jBzl@YEjX^ zaZFl2@%1{xQ8{m5Pu{zwObk6hB81ghy|$A`dep);rp+XWRAZljnAdn|wRBEfJ%$Z$ zeXN!)&NPDMi1o^GjdFy^>p@G`wAE7y-xSF(an0C6d+=4+a3>$culC*eYn#x!y--UE zim?aj=ofO0wclZ5z6(PX?#|j3kNe?NL4RIu_wSP+s2^A$rg&Nvj??gi_>ZtP;oaVE zsDIq4OcL&2Nr-xE~`VCtkzr&-B>(1&tz@CtW%mMd{Q(%juBT-AXSA6w_z) zN;eHcme~|VR|>@}0oCZF+^zIZLL?^q5kIk4lsTXpeTchtp@^SKiPX8vsP6XY!Z!N@wzI=oJNi zQ6AU23lEg{)Q#oQD8z23iRJCOF`ablnPywAr`mBiYj_=4NrIhKE*n1vr=}SG$s$WU zk!E!@7Ci2@yFK$!xxYIAOtDWN_My}?*f``i4=4Ld48sJqm0r3iFXW~E%-Z$4`F5<# zXdX>-t~{V%uMHh*E4@Rb%G&jtc^XT39AdE)%##BvzeFNkd?>6EE6{B3{=nLGJ+Sgsswi0tqMTb%>3oBI)^8Zu(O0e>V7=;ZQsMT735Q#(izDu^ zYl~kcGT!`x#stq`RMYD8DlnC7iLTxj9jW=Sxc+?_IS!zsy;03>w?5PjBtmYYB zmv}fi|AE&ic{c!zre1xeCqMct>Wr}efDSWRjZILz_vA@zn(!UDJ{X{c`LySO`BE^g z*i!`O`?MK`$<&-M)?Zv<0d4eJs;AXwBi)|f+c6)D0KP@>ccn+9Qy{)8xxwJR`i zi-Yv-mm;k6!nvL1!8J$#?n5%JPvDj}2^aLH+=#nX#GT-UTS2(~DMEl3?x0GyDGxOJ zc<{>7bA3~UAA#%P4>)sy^BwX@1`=KAHs6`+lOi1I!86}S*YSxVd33ppUlxYED&&2I z@^<-@4&aa6u)jw?c#_|nBI(Q8J`SUSl223MC(y`<3nI@jJ87|NPh;}eq|3!jCzF|0 z5KLekj@2xuIb7ff#t5LamZ*G8z7frMKg)Zlsv|h2Vk4pbFi3IueOh{>*R&7yV{K>m zGthoe z3!_EW{i;Ym@)>)NerUL)pPcbUxb#S`a>Yr3E#2wS56mZ)89aD3t1uTID0ho|uuf=r zm-NDZ%f~b!s>k!b9q7Lo{h=a#yoQHqpjRm_m_Pejo4Jp04m?-!X?Q8ns+$(T^w0F& zoBn>(G5Ajsc7qrWKD?!{c+syA>0^q}_rIi1Jt3Ahi9!{I5@xafYv#H`E4gnK%BpZY zG;rQNg=PJ)k0Tu0en^L0_4o-PBM08}SGz|@#bC&Ba$GQCE1%X*Mz zvs(B^Z+d*J20!)2x-LnL>+*lGUh_3QY`vy1&B3KE(QNK z>}}uG8!763&-hvWEWs0c;Fky<(F4Cj@U1=YA;91OzkB-xp;X}?|D+|AU})+-P=M1RQ1;lkb7F4WiYN;u^;PHP5asuVy)A~Ogpl!Q#kyuKisdraaws3 z`*;r3$aGl_Ro$S=bVSMamqFC|G>uO9_d7Q;@E-dMm+A`*C>1+fjS-hqg$SvXRN+BP z?$8M&r3yb|+J@6Nk3rtbCpRVvttf|GI>&ad*zbhv1QUv+Ew;<%i5~O-hW;T#$EweC zYY(~>=)m>k*M!m3`lzH>>GwgfU*-Oo*@0|h6uVE@B%?L2c-ILRR!0V+m!+3lG5kFT za50=8Tuo0^r9eL$Qf(v8CPFbU5`wjB3a)+oQ;_<>**2EJdX2?WUW&!eujiMgVt>i% zgU!zql(-+dK>TrXmrfXTE4Flhhgo3LhxW(Hu_nQR8GD|>)*RkV#TF%4m(=<-1|I&z zE26@#m}OU~efkrZhp3DHsGWZGp?L2+JVpzI@V}8|n#Bm=Swop_u^v&xTYsNY+PH_Z zAHEOS*;&|NlFdFlh&J|^a6RL@q}L#EoiQ4(zAT$T5A)z$AGcZMHY-hZ&+fg;)q>oAC zxGp6tn=az;uePnV=_;PzQ~oG1f3pRGb&Ik|$bE&;pxNdxddl<5wVj_G;624&m%MS1qU? zVbsO7GUGX<;)gDDQ+!tz z1ev=fE;P)X#t)`9xmSFLEE*H;v^g%|WD;iy*hT3oleR+WqCj^lmIhsk{NQrXfVYl$ zOG4ukd3p%txT}YK?%laZJ2G@Au;m$%=+X3)g(Jo+JfoA8~s$pvnnrSuEwgy$4 zbAv|3ReGBGRJ8t1(=Kf5BdveMxiT zZIvZRui}~a$k%~>b^A4l#vADPkjlNJ$P-_FU)wgI;(H=)y*8k9m_5daSFp7GbYpPr zi7y3KvR{)ey(PlkHXn6i*EZOL*i~o0I-U!B8*?>W?>Ia5+qRKa_-%rp$QCYa?B~kG z_uXw}i~?)E^*Xl>8%s{k{M8(*TVYX5`@Qt-_-W>jz|F~I3YD9{v0Xt6EKbgjt6vlu zM2AcqWIzot8MJDfTFfw-G&zGlY*Tt0YKBY+t3vW{EyYdmmZjC9S%FCeKU>%4 zd-kW;X?T~#E4X-8+k9{x80Rb3#NTo(YV>R8k_gy6K|>XwZ~p4|Nf*p(u^1pG(`} zGz+fu4lxo|!X~VdlAx~Q zf%rKqHI9hm=yY(d*)|2Tv`~lQB`JQxglXWUqFtQHa`~Gh%8V^;1fHURy#26rVB3oM52EY z(e^jcGXWOcz#_|8WQiPELp1RAz4U4d^cQ8==hD_V_0`V&eXjJqE^R|o4dwQ4qD=a| ztRfnmTBIW$MzqhFu-B=ta+-HLwJpws4m=shV1ejSq_%^})8S-9K$TB^qxPpD3{W)K z^~DU)uMY3If=wj9p~Kns-o?V_uaeGHq;r;xl+kQ}#BXo|%WGSLY{_rj(ujvkyH~O# zW<%k)4cKEt<~aayGA?!}b*3nQXvui{-h_zb%v53RtZBpKZ3)z0n3S+hr@4dPE)`ON z9X}<8+z^ornxL2|S$K^#eFJ{HCk_?VP-!Tm`--@usKL!cyB7R4Vdu=2jCPO$Jh2^& z<+Y)F@@ZXSuCLJb3Vy8_Xy}BZ0R03=_!y6R_VFyN=1^%&I^k_kY+IYyWU7)sq>hO; zZDOeFNC)F;N4naj4R+w?S=wNzp`7OSaYeXIV!-L^rg%Xmn z+HU91d%X!+R1oZewk^@~E=Jd`6LuiGWKs-4PDj^>jz=eK`eS-3_7f4yN3p9S*i6CM zp%y2hi9#VocL>4oY*E;L=Z}dmJhs-;ltHAw`zf49Q~jvc*U%jgv1=CMSUF-JW!GNT z39&2!$5(Xh(?9Squ1%=%{2i}ypfM@=vP~Uv3h&Ru;J}uGv>>eg&JW4y5jDNu{~UOT zjTqo>(Tkow%iXevJ|A;SjrrH=uu#vNsRJLMgR1JuUd8m7NgjTrpV|!+|0Y*!#byVg7DCc@dM-qHb$RH#UdG_kVX= z@5hb0p1q)6`%9ke^sNW!3UQV2B8r2>)!_^$CT!F_t1|L3O4d%u>=!v9e3B;mzKP+H z6T|P-l;CS5kL2S6BitN@z>UeomtIU$`}Lcw!C%0b%(a<$`eMM7CWjN8rO(S)3-I1> z1{UKRH-P#@h}Z?0>~w1k_mTKd`$H(m^J;|uUz z7jTTv6-|%=o-fCY_oU<(;+sF?*;AB$Jeb7?b)W^ao|{0NapT!@j9db=nk9bAhZ}PP z;i>(ynF_}cLEuTyDt%$T-ejcuni3vf5*ZcFjUk#IjDR!^`(%qIr$95hcxnKr2`eZp z$j0}8@+RC9z#&SLjjt$aOa{FsEs3c*iBvthSd)b>>99}E;5$DPxbgU|R1xq&fzxOV zCR5SWi4%+Tg++P#3ErBYh^mjW-wTBeJ+?ybK`*ZZ6y+xHLF=K@YtxhnWHq@5v?E3NlhW zya_%0Pt~lT>zx_66R2-7QNvk_4ypr;B3h47vHzvtF z(n|Vr6l-$yz$fR>^Kh$-^w}t*el5qU3}3^-htx7ztQZudspiBGCDF&sD63uy6&35v zS%qSH7Mf3{NepX7=dqg8gqMuYE0F~@%YDhCusE^3drMJJsOjNPN+&BI;gL260ZZ z1S7K0!HeIPrr8I5+w&@YKM=2~%!gYBNAXMHCwak(5T;iVKMwyfI5QmE5P)xk^FxSE}CH`O6!R-g$7~H?a)|XGG^%UY@(;y@o-5uenS4%D+x5{`UMw zQH$s6r))iXD&ynn`Cpfo^MBuwl@~N>%)#6zk{UkPetBcxhvJ&X_8b1t;9GnEF1i|3rzShTEV_H0w;m$v3?pAS z6L{Q>jY2t$WgPeFUvGWx>i3^KRx-`i=^ummT`O$zVO;KSHiddd7HvA zK7}7UvrT{bt9!qru$-5|>;1b{FZyxnMn8mQIut%JeDp^zo_qL33d=MpJYY(q`--#l z0EK1x6i!=M7Q3Kn_g55_%cAhE>^Gj={bk(+3d`kE*m$^I|LCe;tO|r>9w@wRzTbvW zy|s$MGCvgF|IN_XKU*2Jlfp7@6n18YpDbDN@@o{9`J}M>=lBbEE}QZ`g=L;8JZfFK z`qQQLbrhEQr*OQ|G-=I)X`fSAmW9GOTQ@ElncCV+VOcH;+ckSuf3oCJfx@zk6yEp7 z2iwhwxBNihdz#H-%-rQTWT6*JE!TS@8;m zWgSxZhd%Ew`TqIiZ%|m)CxtIBsMS}G82B#=%etko^68VS?K>aZPhnZl6dvaI=E;>I zFCM0_taA#Fz2p1s_x-)?V+zaqr?B_m7a`7ae&w;FhtU?~a1Fvc2EV*pIKK7iTCaEt z`-cw7m~j2duN0PX>JWBj`Nj%q@9(3$G98NlI_Bqd`_m77=$)71pMQ127iINTn<*^Q zIf8J`H~&l<5Pt4k3d=Mpuk!sJfBm@YQU~G7^aJ;U^bA`tkCsk^dw*vObB< z>-~=2fAsAbH{r;-rEt|xC;ry-UG~cqmi0_|FFf<&e;i|nJxgI(=Ojz|8%>Em^Zs>_ z@MZl|c(ODWP`em2IBsEq_38_BfF%8uQ}~x{p>K{l`@@Xwe@}_H`olwqy4qJ7zaL(I z{~NEJAG+IT%;9JI55Ql=%!iWc@8iSscmDd}!0UStR((iZI^(!m7FTs-ia?=#`dG(^7(zceRU3}}x=G%|wSDT)$`f&bJK2K(u z9f0f2ZZ>Bvw0w4Y#dkwS-hJx>r9Znz|6cEx zU2$dQ(NC_=`TOHv|LggL=KQ)}jytw|@g;xl*;n7WFfV=Cx~tbLpUwLG!tOM?P3I>sWGaZP{zrHhsJ3 z=@0g)3Z7T}_|d%2I}SZtf9BICKfAmB`2)tRx!oDV`rUCy`g?yr^qG3WC*v#s@^ME| z{Hi3~*mwM5hRo+Po*(eek0lRp3a)u&^qZ02CQtrP>w8;%OK^uNj=lQ8)5D#=j(PB_ z;5+XBc>jp@qNl#nezw^>rQw%*M!xsm@Z)dY_SJ^EJ~eZmxU}ZLnN=stlD9wiWZUnH ze|+=XJElDP!d$wP$^MG}f{*j!Pxd*k<@ebWew?{_`r64qNB=bA_s7TT=M26w^Ygmt zyt`=A%%gW{za5g~GxOQX(5P*HIWSY$zUh;rGj%<+4FYt!#E3Uk)%+ZNjnVUA5%Qxd z24}ta`?*YvX_4}`9Dd`}`-_fSf5Xlg{dLTw&*qZz{+p_aTa++s-a>INBmisW-f(ik zBL#(P3dCe&+>TAcy>K;fPPleBg~ng0h8qVL1GfY&3$6ri2i!imqi~II0$e8?H_~4j z1Q!Yy2^R;K2A2m{4)+q=yKqP0oN(=MiaU`9P6HPOmj-8o+W_|xTn$_!Tnk(`T*xTk z!OexsgWCYN18yJOQ8*`DC!8`AG~puQ;@}>JGr?_u+X1%^?kL=8xOOpgS++E-sE(}fwmj|~A?j^XBaGh{LcSCP*>)^J+?SpH8I}fJ_ zLwRskaGT(E!|j7R z3g?9DfK!b1R|dn4gNuP%0%w3*2Ui965?nRhNw^lcPB`T_=o>ByZUNlGaCva+;Hu#E z!X1EXggXz{1*gK-Ts3f!aC7O)u5jgW+u?$65c0q7e|7M`Ht@eT@V_?j|E&%DiU|cB zD2d;-$2r-Q3HNFiWMmrhu@#)Ow%DZ4*Q98YmLzItB_wH<#OgG~g=S->zGoiMQRY1- zAzC;f$;`l(YJL%;H|c*y&&StK;oqmPvR}Y0s{XeIss{`l6g2p@A;Ck3-5xT0#2uQE zca91jeb?P#_ly}kZu|rs;!TQ(oIK^esOYKFrq8&4W=zJ)Ol-=oGUVhwl9yjlSo9ZT zvB|u8P089vmp+`nZ25{mPk(HkrL?TP;&JQx$|s)OVB5%VvTxo}_1CAK-n#9XXSYB1 zx4-Y$x$F7edtP|)rI%lMb?iqTcm9DGTu6N_}yOKg_Hb+6(zi|$>s7P(v4I-DpLs~CH~dEC5-i#&5ZIZu{;bxtPR7S71Z zGE#1in`K<3$-^<2##C6S$tx^ag*a`AK2w7OnEVWrhsNxTERmlAbN))bk@(0o_!*+@=}7Y8Vp2qw zz90u0z}l*z66pKbFs$4;$j?LG5oxo z0=h@oTL&T^88`r>y?D~>ykdc=l6>14Nvd;HVR7L-SgT zGe3O+(-753MiJCfWXz$15vmECNSKU;d4wd^IJZP!ViFa~*q3Ni9iT*Liufh{Xy|MT zXULNH+`POzJr1C8%AqH*pmX`uiCK$i0*LqUMe?I=W*ZA10fR+3MS7}pCX=Sn4AR+} ztit>ZEMuwu%z2U}5EpcSKxR>#PZq^^%7@itPzrMCi>V$ornMl+%|p$Za2|srY@Olp?8ZrtB^m!W5WaQF}83hn#vD3Nr!%q)lL?)mNE>>MO`3;;aHBaB$MbrPmvzcK$>qjD zx6Jg4b4+Hjp=Rk#Fc^K-#EjL2IaweHdUWt>%tGVA1p#kzI1~0-b4}Gm(yth9jElNS zTr}dy{`Do9&>*x8Rc9J=ieRWLo|*uTs=TAQ1gT<}c@}H3&8V?i1%+99%?$=C(Uxgs z0tHbXdoRwzu`~Xdt&>PO1*=eys0hTfegM`i+OF715dIBvO}>d-lSwXW{~4ryeMUa$ zQWGT|X5qNLm+qF}u+In$6iID;k!Y$?MpyzHxr(_2)ND=x&IODAPi5yHBG*;L@tfUo zyS7-O)>cc!^$(XIWG3q-+aUgmsY|MKQ?jy(Aj8bg%+5BmGsC=@-K;HAAuOc``C*!* zQk&q9w3xI)DEUJK1BNAF#k7Q2R7x5{C}JgQSp7q+pYQ!K@6C@w_L8&r-Fwgdaqd0$ zoO9njd1IHFjiP&guIra-4Q-G|xlINK#QbQpd*lJblX8A0S84eS zyWLq$mZZdV7Tkikt!<`MPZJ1{aGs=5dx9;W#QdoX*F3Bnaqnp7bdR0gAj;7hVra<* zOcFJjo0S@aC91_D`)MR9=Ok1r^Lg|K3U7xk7Zc`?qHRsrg=I{d8oK(m>Xbp`(h_d% z8fJ%^Mm5w#$V!5MC9k2*F6X%(ZZgQAOe^y!WzDl6Z&A7t2JRSu*CQ3i8{~6-8POkU zqgJhwn`~9x*eoM1;8P;4;$%{62Q2AY9Ty1p9eu|6yt>hFQ7YUiTfH5ZHI^r_SrGH`62h8!MDWW@z=~8~3E3+e zqgEXoz*6YPV)46*I%rH((r`nwala*eqA)4C+t}f(nUQ|Qa;0M0oKA2ECg3M#4(|}V z#%h{-?fJQ?oed@lW(;=7l#?nF8hANXO(Lx;dnA#wazcIq8=y{ow13reCS*A+HeD+< zmtb{#Eaf4^*p{hLT7%W>*d66($i{ zq(ecMC>kkKCi>cX+^$G$L3YzU2Ho9xpV`tU5AVkwJcMsg9>TXLZ)=~tZGG}4`sAVX zd)h-e_T=@UW4sR?<9+BD??cCUA3DaNW4dklNZ{g!B(F21qUOANOykfqr42D+HHQpL zmyVai+0Ah=Hl(zvHF~|qvvy^%fkkMAMX6=YE^WB({`7l>J$ZfT*a{sF1 z3{V0Vffe8=a0)mFtO8en8^9Vc^aJVxqre0(3CsW`U=dgWjsmBEbHFNa1-JpM0YgWq z4~zm6z$7pOlz>HG1vmM%kowaYH2&$G zyNNg0Ht|s!l20v?wr912pF>j+SZ_iHdhFJ;I^HO>ru5IXvN9Y)`!DLNVW( zlVw!}-zKtANqb$rs4N>bX6LJ=T1eJg`Hte8J?lj#)5O(%(K+hypxrFD z=S*2H))~|G=T4VRaQR+m6X|rO)ts+H8Sfr#(i!JutuE5D>ufC^&~4Xry_<5hc>BHi zIvieE$8}f3LU2c-b=P!0ee15)va)R5)t1E+ym6pn2$zoHFZZ()KZW=1yV^r(U=;W) zaQF`Q{_Hv8ouupFJ@HZ}?jOn5W$DvwZnd$6O@D~=li=x>vy$y@^zD6>4gFhiRKE1f zPMq^>TGhGdUShRF`T5^>;UF-C^X4aw(U*BtzH+4#NAgNIRfy4tpbk?0{9Bzk--2M_ zybjSXfOC@a-*w?U#2AD#k}>8@a4u24cCE9W>mG;5dD32tyDDM_M8%Lb|8ZrN;Hh%RI(`ZwIDc5bPjiiw^Ky^Or(d8w=hPpWeLpvb zw_n+I#^KW@-qBg=L>eM5s?Qknmz&1eS5HHyH(1BpY~5_)QT<4em@0`v-c`8%(gu@z zS%t+c?*`_IYK(V=ky$&tA<;#Ga$7OAXTUrTuotti~n_>yfiK#MjNAZgu2UYPGs~=RZC#TEL~h?5g9x zYObXQT>~7e^&%xM*?WgCaa$!Wc>B&l!(oQAbr^*m{EJ5h&8MCjG;_sf7AcN>kqzR& zOdWIi-fKKAIC0z+cpve&;JIgAf%OQFvyc7IW!LBT6)SP}h93mi<%-EVfDa9G|8 zJH~s%7kD4+xWH0yeLQ8}*p{*sIC*5IKA%j+_`mo{$~Y9543}W@@5y$CW6m$`N*Oe3 zV#SJ;N@QLm+r6pC7qh;TZ+tD~w@TK(*!~|mzWG^OZSs+nLERRz5w8MxI~%Inao>C^ zWgfd0+K_h1I=SeWYTw^d<`%G=gFhto%+x#WRMu*Bhsa<3j_{X;kP_RtY1b}CDjvI= zFZ|ufEj;Cyv10x}EYIb3B_6bq^qZx!IP|Sn#rmeNVo6JVNcfv~(I)BB|HAVbYv%i1 zZD?;vT3&s>etp2Tuiux}FUshrPN~`s+E0?2_hBLhT>WB%5W+WR0tIGJ@!YuR82Cb-o zF9TV7Rd}*tx0890SyP$XQY>3mwyNq1Pd4vGj9uBfA%uQEL5BJko^0APbRe5nb!FeG zil%E55b$IJU(i6PBs`S|JdUV#91O|Y;1@8KWebN8hQLv*jduxK{StT^Lm_2)6nrj$ zca<~2RdJKHgb$)s;md$%QopkKFE;x3yUXK=UhS&O;N33*dVwQe}n{a80ssDXB8hh3GZrgdqbD-L+T;KL diff --git a/local/bin/gears b/local/bin/gears deleted file mode 100755 index c2f066557ef9b21ea92d72567c4ffe1f13577b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55744 zcmc${3w%`7wLgB6%)k%_XMmtV1CAOjDqt|EJS9K|P>Bu+d8kAP$%IMFtH}(HmVw}8 zl;JR#_DYK_Sh(6=>cy7cf(;6i0G9;B+tku_hRk48+I!-pHr7-kMCboq>zp$W9nf+NjY{ZmaTW3BX?xo_>zWuTe@|qlAP%w*I)+1c4r|Zxp!wrGS@C)iVD6 zyMQxG5Qb8HC%JdNimIlqI_@yGcHshvgdQi}YSrbd+TK1W0SeN`1J=_#GuP&;{w zAh?kCJv@)&5tVZ55w68E8qb}0p21Ux=Mg-4cwDEn5l&2N_e*tW+8kOj|mU`W#GY(2%GWb;2D8O{cA>K0iGFn zR^$0L9tWOOJT-XI@zCF7IS`g3+^WPWctVK}L1t z{`BX?vlveWp6}wJzid3U9E-l@Ai5OKy-E_v=l{t+!@p?k_ABzW3Oq&$Z$tPkJU1yY z1vkdTZ$(^*_gyhh(Dyj-%-Mi z2rWvSg86ucs{ACjKlg(dtO1sXWnm80E_lQaza1qW0laL7MrTs; za}icOqScWe7$N9+4i(vDJvu`8EKGD~E!XOXCCcqp0@m+}(nE7+XAFHbuh#=^LP+!w zPnN}$Ctfs<(duZOeoiAL0qT9L?_qoPDF*z7g&B0UiXsq?4)q0G=w; zU!lNXA)NJNw6DM#(6Q#$DE$V&ff#<=1X$%C@qaAfS;#-E)V~w(PPC_v*FAvKkZ)A- z9|oKe!;giOkM>EA5q(8~_hCFc6}S}e8RV~3;Aa6>0YCAH%C7;On;sqC4S)~F@MAO8 z2R^m_zX8?*pG~R1AMh-cFH_*dfORqaYX!U*?KLUI_mGi%i*kbfYrS}EE`_O(B z@(JJfDIc&ZPrCr`jG_N$fNNsp=NEv}&>t1w5x~nxeieN0Qa

!#z_1uX@ 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 `pp<~v<|y&hZfl_jh8kiYR6;i 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 diff --git a/local/bin/helix b/local/bin/helix deleted file mode 100755 index a52aeed084feb30d81532a1a76c108d46acc9f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32900 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 diff --git a/local/bin/hopalong b/local/bin/hopalong deleted file mode 100755 index 10628c3f8cfbf545147c90a68c1706fa72be11c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41540 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 VJM^@#LF+h^tdB^NDJVim|36-p-+udgRWWY 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 diff --git a/local/bin/imsmap b/local/bin/imsmap deleted file mode 100755 index 3c4114b654fc5a5d816e1a0f9905d3e1fab5ed97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38080 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 diff --git a/local/bin/julia b/local/bin/julia deleted file mode 100755 index df8b170d0272a15e5dea3bc783cb82d0a12f5440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45588 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 diff --git a/local/bin/laser b/local/bin/laser deleted file mode 100755 index eecbfb618e6ed679ed6c6f2bc979cbc444b3d404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37356 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 diff --git a/local/bin/lightning b/local/bin/lightning deleted file mode 100755 index c6b3d8678fd4d142af10f0d174ba3f1354af0005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39652 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 diff --git a/local/bin/lmorph b/local/bin/lmorph deleted file mode 100755 index 5e9fe390f68ef6d23cce0ab8594d05fa328c2f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35444 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 Q9>O=H7Tn3?Tf7PhEJ$yn$6e4TUe%mr=V@BMxr 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 D=+)k( diff --git a/local/bin/noseguy b/local/bin/noseguy deleted file mode 100755 index db86cf724d86837cc188bab827f846402b10bb4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51876 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 a!7O5Bt<3peV?`Wo*B^I%jfrb|2tcsS?gKP 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 diff --git a/local/bin/penrose b/local/bin/penrose deleted file mode 100755 index 9be820ec8b866eb44049694b47259d072c71a345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49368 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

3-Mu5T@nw)8g}VJd;~{46 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 W&qZ}a(H)7QyZKciDpY1v-v0nJ$n$0Z diff --git a/local/bin/pipes b/local/bin/pipes deleted file mode 100755 index ac25396cb1c9b72821487c2d516a53c9ea7d9e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109404 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 diff --git a/local/bin/pyro b/local/bin/pyro deleted file mode 100755 index 001ca88f2f8ff2a7590ba793b560bf13d7f667f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27164 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 diff --git a/local/bin/qix b/local/bin/qix deleted file mode 100755 index 5bf9b40dfefd5ccf1b9e3566e734aae496f53067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33232 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 LcO8w$n7IE3XaQec diff --git a/local/bin/rocks b/local/bin/rocks deleted file mode 100755 index 4f6f4b08b7479015fae3ead79b173866fb5025d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34936 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 diff --git a/local/bin/rorschach b/local/bin/rorschach deleted file mode 100755 index 6449135f7ab689ddce9459e2703a5a7fd01f1f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26560 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 diff --git a/local/bin/slidescreen b/local/bin/slidescreen deleted file mode 100755 index be11c6a7c106b4187da06e021d2081bccec3d857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38696 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 WFt~&+o$liSblV<>o6{2`(*7@EfHDXG diff --git a/local/bin/slip b/local/bin/slip deleted file mode 100755 index 2a8a7ec160f48d7a33f9641c5fd2619ba0b69f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41380 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 X9QS4rBQo9RBj{#$V3x>%L1F(NZ|sXa diff --git a/local/bin/spiral b/local/bin/spiral deleted file mode 100755 index ee6f6cdf3f58192798be8b3643c426a1d2520b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41712 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 Zmtb$oMmbX4XN2{cth0|rR=fy(`~&;}Y83zg diff --git a/local/bin/sproingies b/local/bin/sproingies deleted file mode 100755 index 5ccf4f314975d237fa5f9e6b439cb97a66790bc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161604 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

okRG~0p5xBRsQ@h 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 diff --git a/local/bin/goop b/local/bin/goop deleted file mode 100755 index faca68b246bd4e68358f467a280e920a3e56ac8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40476 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 BGC2SM diff --git a/local/bin/grav b/local/bin/grav deleted file mode 100755 index ebb40c435f7715838eed2247478a768c7badb71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38440 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