summaryrefslogtreecommitdiffstats
path: root/hacks/vines.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/vines.c')
-rw-r--r--hacks/vines.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/hacks/vines.c b/hacks/vines.c
new file mode 100644
index 0000000..7f519b4
--- /dev/null
+++ b/hacks/vines.c
@@ -0,0 +1,179 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* vines --- vine fractals */
+
+#if 0
+static const char sccsid[] = "@(#)vines.c 5.00 2000/11/01 xlockmore";
+#endif
+
+/*-
+ * Copyright (c) 1997 by Tracy Camp campt@hurrah.com
+ *
+ * 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 you make a modification I would of course appreciate a copy.
+ *
+ * Revision History:
+ * 01-Nov-2000: Allocation checks
+ * 11-Jul-1997: David Hansen <dhansen@metapath.com>
+ * Changed names to vines and modified draw loop
+ * to honor batchcount so vines can be grown or plotted.
+ * 10-May-1997: Compatible with xscreensaver
+ * 21-Mar-1997: David Hansen <dhansen@metapath.com>
+ * 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.
+ */
+
+/*-
+ * 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.
+ */
+
+#ifdef STANDALONE
+# define MODE_vines
+# define DEFAULTS "*delay: 200000 \n" \
+ "*count: 0 \n" \
+ "*ncolors: 64 \n" \
+ "*fpsSolid: true \n" \
+ "*lowrez: True \n" \
+
+# include "xlockmore.h" /* in xscreensaver distribution */
+# define free_vines 0
+# define release_vines 0
+# define reshape_vines 0
+# define vines_handle_event 0
+#else /* STANDALONE */
+# include "xlock.h" /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#ifdef MODE_vines
+
+ENTRYPOINT ModeSpecOpt vines_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+
+#ifdef USE_MODULES
+ModStruct vines_description =
+{"vines", "init_vines", "draw_vines", (char *) NULL,
+ "refresh_vines", "init_vines", (char *) NULL, &vines_opts,
+ 200000, 0, 1, 1, 64, 1.0, "",
+ "Shows fractals", 0, NULL};
+
+#endif
+
+typedef struct {
+ int a;
+ int x1;
+ int y1;
+ int x2;
+ int y2;
+ int i;
+ int length;
+ int iterations;
+ int constant;
+ int ang;
+ int centerx;
+ int centery;
+} vinestruct;
+
+static vinestruct *vines = (vinestruct *) NULL;
+
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_vines(ModeInfo * mi)
+{
+ MI_CLEARWINDOW(mi);
+} /* refresh_vines */
+#endif
+
+ENTRYPOINT void
+init_vines(ModeInfo * mi)
+{
+ vinestruct *fp;
+
+ MI_INIT (mi, vines);
+ fp = &vines[MI_SCREEN(mi)];
+
+ fp->i = 0;
+ fp->length = 0;
+ fp->iterations = 30 + NRAND(100);
+
+ MI_CLEARWINDOW(mi);
+} /* init_vines */
+
+ENTRYPOINT void
+draw_vines(ModeInfo * mi)
+{
+ Display *display = MI_DISPLAY(mi);
+ GC gc = MI_GC(mi);
+ int count;
+ vinestruct *fp;
+
+ if (vines == NULL)
+ return;
+ fp = &vines[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
+ if (fp->i >= fp->length) {
+ if (--(fp->iterations) == 0) {
+ init_vines(mi);
+ return;
+ }
+ fp->centerx = NRAND(MI_WIDTH(mi));
+ fp->centery = NRAND(MI_HEIGHT(mi));
+
+ fp->ang = 60 + NRAND(720);
+ fp->length = 100 + NRAND(3000);
+ fp->constant = fp->length * (10 + NRAND(10));
+
+ fp->i = 0;
+ 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_WHITE_PIXEL(mi));
+ }
+ count = fp->i + MI_COUNT(mi);
+ if ((count <= fp->i) || (count > fp->length))
+ count = fp->length;
+
+ while (fp->i < count) {
+ 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 * fp->i);
+
+ fp->x1 = fp->x2;
+ fp->y1 = fp->y2;
+
+ fp->x2 += (int) (fp->i * (cos((double) fp->a) * 360.0) / (2.0 * M_PI));
+ fp->y2 += (int) (fp->i * (sin((double) fp->a) * 360.0) / (2.0 * M_PI));
+ fp->i++;
+ }
+} /* draw_vines */
+
+
+XSCREENSAVER_MODULE ("Vines", vines)
+
+#endif /* MODE_vines */