source: trunk/third/xscreensaver/hacks/fadeplot.c @ 20148

Revision 20148, 5.9 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20147, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; tab-width: 4 -*- */
2/* fadeplot --- a fading plot of sine squared */
3
4#if 0
5static const char sccsid[] = "@(#)fadeplot.c    5.00 2000/11/01 xlockmore";
6#endif
7
8/*-
9 * Some easy plotting stuff, by Bas van Gaalen, Holland, PD
10 *
11 * Copyright (c) 1996 by Charles Vidal
12 *
13 * Permission to use, copy, modify, and distribute this software and its
14 * documentation for any purpose and without fee is hereby granted,
15 * provided that the above copyright notice appear in all copies and that
16 * both that copyright notice and this permission notice appear in
17 * supporting documentation.
18 *
19 * This file is provided AS IS with no warranties of any kind.  The author
20 * shall have no liability with respect to the infringement of copyrights,
21 * trade secrets or any patents by this file or any part thereof.  In no
22 * event will the author be liable for any lost revenue or profits or
23 * other special, indirect and consequential damages.
24 *
25 * Revision History:
26 * 01-Nov-2000: Allocation checks
27 * 10-May-1997: Compatible with screensaver
28 * 1996: Written by Charles Vidal based on work by Bas van Gaalen
29 */
30
31#ifdef STANDALONE
32#define MODE_fadeplot
33#define PROGCLASS "Fadeplot"
34#define HACK_INIT init_fadeplot
35#define HACK_DRAW draw_fadeplot
36#define fadeplot_opts xlockmore_opts
37#define DEFAULTS "*delay: 30000 \n" \
38 "*count: 10 \n" \
39 "*cycles: 1500 \n" \
40 "*ncolors: 64 \n"
41#define BRIGHT_COLORS
42#define UNIFORM_COLORS
43#include "xlockmore.h"          /* in xscreensaver distribution */
44#else /* STANDALONE */
45#include "xlock.h"              /* in xlockmore distribution */
46
47#endif /* STANDALONE */
48
49#ifdef MODE_fadeplot
50
51ModeSpecOpt fadeplot_opts =
52{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
53
54#ifdef USE_MODULES
55ModStruct   fadeplot_description =
56{"fadeplot", "init_fadeplot", "draw_fadeplot", "release_fadeplot",
57 "refresh_fadeplot", "init_fadeplot", (char *) NULL, &fadeplot_opts,
58 30000, 10, 1500, 1, 64, 0.6, "",
59 "Shows a fading plot of sine squared", 0, NULL};
60
61#endif
62
63#define MINSTEPS 1
64
65typedef struct {
66        XPoint      speed, step, factor, st;
67        int         temps, maxpts, nbstep;
68        int         min;
69        int         width, height;
70        int         pix;
71        int         angles;
72        int        *stab;
73        XPoint     *pts;
74} fadeplotstruct;
75
76static fadeplotstruct *fadeplots = (fadeplotstruct *) NULL;
77
78static void
79free_fadeplot(fadeplotstruct *fp)
80{
81        if (fp->pts != NULL) {
82                (void) free((void *) fp->pts);
83                fp->pts = (XPoint *) NULL;
84        }
85        if (fp->stab != NULL) {
86                (void) free((void *) fp->stab);
87                fp->stab = (int *) NULL;
88        }
89}
90
91static Bool
92initSintab(ModeInfo * mi)
93{
94        fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
95        int         i;
96        float       x;
97
98        fp->angles = NRAND(950) + 250;
99        if ((fp->stab = (int *) malloc(fp->angles * sizeof (int))) == NULL) {
100                free_fadeplot(fp);
101                return False;
102        }
103        for (i = 0; i < fp->angles; i++) {
104                x = SINF(2.0 * M_PI * i / fp->angles);
105                fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min;
106        }
107        return True;
108}
109
110void
111init_fadeplot(ModeInfo * mi)
112{
113        fadeplotstruct *fp;
114
115        if (fadeplots == NULL) {
116                if ((fadeplots = (fadeplotstruct *) calloc(MI_NUM_SCREENS(mi),
117                                           sizeof (fadeplotstruct))) == NULL)
118                        return;
119        }
120        fp = &fadeplots[MI_SCREEN(mi)];
121
122        fp->width = MI_WIDTH(mi);
123        fp->height = MI_HEIGHT(mi);
124        fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
125
126        fp->speed.x = 8;
127        fp->speed.y = 10;
128        fp->step.x = 1;
129        fp->step.y = 1;
130        fp->temps = 0;
131        fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
132        fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
133
134        fp->nbstep = MI_COUNT(mi);
135        if (fp->nbstep < -MINSTEPS) {
136                fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS;
137        } else if (fp->nbstep < MINSTEPS)
138                fp->nbstep = MINSTEPS;
139
140        fp->maxpts = MI_CYCLES(mi);
141        if (fp->maxpts < 1)
142                fp->maxpts = 1;
143
144        if (fp->pts == NULL) {
145                if ((fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint))) ==
146                                 NULL) {
147                        free_fadeplot(fp);
148                        return;
149                }
150        }
151        if (MI_NPIXELS(mi) > 2)
152                fp->pix = NRAND(MI_NPIXELS(mi));
153
154        if (fp->stab != NULL)
155                (void) free((void *) fp->stab);
156        if (!initSintab(mi))
157                return;
158        MI_CLEARWINDOW(mi);
159}
160
161void
162draw_fadeplot(ModeInfo * mi)
163{
164        Display    *display = MI_DISPLAY(mi);
165        Window      window = MI_WINDOW(mi);
166        GC          gc = MI_GC(mi);
167        int         i, j, temp;
168        fadeplotstruct *fp;
169
170        if (fadeplots == NULL)
171                return;
172        fp = &fadeplots[MI_SCREEN(mi)];
173        if (fp->stab == NULL)
174                return;
175
176        MI_IS_DRAWN(mi) = True;
177        XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
178        XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
179
180        if (MI_NPIXELS(mi) > 2) {
181                XSetForeground(display, gc, MI_PIXEL(mi, fp->pix));
182                if (++fp->pix >= MI_NPIXELS(mi))
183                        fp->pix = 0;
184        } else
185                XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
186
187        temp = 0;
188        for (j = 0; j < fp->nbstep; j++) {
189                for (i = 0; i < fp->maxpts / fp->nbstep; i++) {
190                        fp->pts[temp].x =
191                                fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % fp->angles] *
192                                fp->factor.x + fp->width / 2 - fp->min;
193                        fp->pts[temp].y =
194                                fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % fp->angles] *
195                                fp->factor.y + fp->height / 2 - fp->min;
196                        temp++;
197                }
198        }
199        XDrawPoints(display, window, gc, fp->pts, temp, CoordModeOrigin);
200        XFlush(display);
201        fp->st.x = (fp->st.x + fp->speed.x) % fp->angles;
202        fp->st.y = (fp->st.y + fp->speed.y) % fp->angles;
203        fp->temps++;
204        if ((fp->temps % (fp->angles / 2)) == 0) {
205                fp->temps = fp->temps % fp->angles * 5;
206                if ((fp->temps % (fp->angles)) == 0)
207                        fp->speed.y = (fp->speed.y++) % 30 + 1;
208                if ((fp->temps % (fp->angles * 2)) == 0)
209                        fp->speed.x = (fp->speed.x) % 20;
210                if ((fp->temps % (fp->angles * 3)) == 0)
211                        fp->step.y = (fp->step.y++) % 2 + 1;
212
213                MI_CLEARWINDOW(mi);
214        }
215}
216void
217refresh_fadeplot(ModeInfo * mi)
218{
219        MI_CLEARWINDOW(mi);
220}
221
222void
223release_fadeplot(ModeInfo * mi)
224{
225        if (fadeplots != NULL) {
226                int         screen;
227
228                for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
229                        free_fadeplot(&fadeplots[screen]);
230                (void) free((void *) fadeplots);
231                fadeplots = (fadeplotstruct *) NULL;
232        }
233}
234
235#endif /* MODE_fadeplot */
Note: See TracBrowser for help on using the repository browser.