annotate src/paranormal/general.c @ 1892:3b034150d31e

Add GPL2 boilerplate text.
author William Pitcock <nenolod@atheme.org>
date Wed, 26 Sep 2007 11:51:08 -0500
parents a7c98f237b03
children 56bb18dd3fdd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1892
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
1 /*
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
2 * paranormal: iterated pipeline-driven visualization plugin
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
3 * Copyright (c) 2006, 2007 William Pitcock <nenolod@dereferenced.org>
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
4 * Portions copyright (c) 2001 Jamie Gennis <jgennis@mindspring.com>
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
5 *
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
6 * This program is free software; you can redistribute it and/or modify
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
7 * it under the terms of the GNU General Public License as published by
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
8 * the Free Software Foundation; under version 2 of the License.
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
9 *
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
10 * This program is distributed in the hope that it will be useful,
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
13 * GNU General Public License for more details.
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
14 *
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
15 * You should have received a copy of the GNU General Public License
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
16 * along with this program; if not, write to the Free Software
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
18 */
3b034150d31e Add GPL2 boilerplate text.
William Pitcock <nenolod@atheme.org>
parents: 1177
diff changeset
19
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
20 /* FIXME: what to name this file? */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
21
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
22 #ifdef HAVE_CONFIG_H
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
23 # include <config.h>
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
24 #endif
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
25
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
26 #include "paranormal.h"
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
27 #include "actuators.h"
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
28 #include "pn_utils.h"
1177
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
29 #include "libcalc/calc.h"
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
30
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
31 /* **************** general_fade **************** */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
32 static struct pn_actuator_option_desc general_fade_opts[] =
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
33 {
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
34 { "amount", "The amount by which the color index of each "
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
35 "pixel should be decreased by each frame (MAX 255)",
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
36 OPT_TYPE_INT, { ival: 3 } },
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
37 { NULL }
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
38 };
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
39
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
40 static void
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
41 general_fade_exec (const struct pn_actuator_option *opts,
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
42 gpointer data)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
43 {
177
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
44 int amt = opts[0].val.ival > 255 || opts[0].val.ival < 0 ? 3 : opts[0].val.ival;
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
45 int i, j;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
46
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
47 for (j=0; j<pn_image_data->height; j++)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
48 for (i=0; i<pn_image_data->width; i++)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
49 pn_image_data->surface[0][PN_IMG_INDEX (i, j)] =
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
50 CAPLO (pn_image_data->surface[0][PN_IMG_INDEX (i, j)]
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
51 - amt, 0);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
52 }
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
53
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
54 struct pn_actuator_desc builtin_general_fade =
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
55 {
155
adf9f4b26039 [svn] - user-friendly names (UI side unimplemented still)
nenolod
parents: 149
diff changeset
56 "general_fade", "Fade-out", "Decreases the color index of each pixel",
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
57 0, general_fade_opts,
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
58 NULL, NULL, general_fade_exec
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
59 };
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
60
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
61 /* **************** general_blur **************** */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
62 /* FIXME: add a variable radius */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
63 /* FIXME: SPEEEED */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
64 static void
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
65 general_blur_exec (const struct pn_actuator_option *opts,
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
66 gpointer data)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
67 {
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
68 int i,j;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
69 register guchar *srcptr = pn_image_data->surface[0];
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
70 register guchar *destptr = pn_image_data->surface[1];
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
71 register int sum;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
72
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
73 for (j=0; j<pn_image_data->height; j++)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
74 for (i=0; i<pn_image_data->width; i++)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
75 {
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
76 sum = *(srcptr)<<2;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
77
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
78 /* top */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
79 if (j > 0)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
80 {
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
81 sum += *(srcptr-pn_image_data->width)<<1;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
82 if (i > 0)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
83 sum += *(srcptr-pn_image_data->width-1);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
84 if (i < pn_image_data->width-1)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
85 sum += *(srcptr-pn_image_data->width+1);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
86 }
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
87 /* bottom */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
88 if (j < pn_image_data->height-1)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
89 {
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
90 sum += *(srcptr+pn_image_data->width)<<1;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
91 if (i > 0)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
92 sum += *(srcptr+pn_image_data->width-1);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
93 if (i < pn_image_data->width-1)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
94 sum += *(srcptr+pn_image_data->width+1);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
95 }
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
96 /* left */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
97 if (i > 0)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
98 sum += *(srcptr-1)<<1;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
99 /* right */
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
100 if (i < pn_image_data->width-1)
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
101 sum += *(srcptr+1)<<1;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
102
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
103 *destptr++ = (guchar)(sum >> 4);
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
104 srcptr++;
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
105 }
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
106
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
107 pn_swap_surfaces ();
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
108 }
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
109
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
110 struct pn_actuator_desc builtin_general_blur =
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
111 {
155
adf9f4b26039 [svn] - user-friendly names (UI side unimplemented still)
nenolod
parents: 149
diff changeset
112 "general_blur", "Blur", "A simple 1 pixel radius blur",
149
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
113 0, NULL,
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
114 NULL, NULL, general_blur_exec
fd9c0a5871ac [svn] - new and IMPROVED paranormal visualization studio
nenolod
parents:
diff changeset
115 };
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
116
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
117 /* **************** general_mosaic **************** */
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
118 /* FIXME: add a variable radius */
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
119 /* FIXME: SPEEEED */
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
120 static struct pn_actuator_option_desc general_mosaic_opts[] =
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
121 {
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
122 { "radius", "The pixel radius that should be used for the effect.",
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
123 OPT_TYPE_INT, { ival: 6 } },
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
124 { NULL }
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
125 };
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
126
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
127 static void
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
128 general_mosaic_exec (const struct pn_actuator_option *opts,
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
129 gpointer data)
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
130 {
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
131 int i,j;
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
132 register guchar *srcptr = pn_image_data->surface[0];
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
133 register guchar *destptr = pn_image_data->surface[1];
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
134 register int sum;
177
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
135 int radius = opts[0].val.ival > 255 || opts[0].val.ival < 0 ? 6 : opts[0].val.ival;
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
136
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
137 for (j=0; j<pn_image_data->height; j += radius)
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
138 for (i=0; i<pn_image_data->width; i += radius)
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
139 {
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
140 int ii = 0, jj = 0;
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
141 guchar bval = 0;
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
142
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
143 /* find the brightest colour */
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
144 for (jj = 0; jj < radius && (j + jj < pn_image_data->height); jj++)
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
145 for (ii = 0; ii < radius && (i + ii < pn_image_data->width); ii++)
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
146 {
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
147 guchar val = srcptr[PN_IMG_INDEX(i + ii, j + jj)];
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
148
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
149 if (val > bval)
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
150 bval = val;
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
151 }
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
152
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
153 for (jj = 0; jj < radius && (j + jj < pn_image_data->height); jj++)
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
154 for (ii = 0; ii < radius && (i + ii < pn_image_data->width); ii++)
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
155 {
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
156 destptr[PN_IMG_INDEX(i + ii, j + jj)] = bval;
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
157 }
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
158 }
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
159
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
160 pn_swap_surfaces ();
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
161 }
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
162
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
163 struct pn_actuator_desc builtin_general_mosaic =
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
164 {
176
c93118f6ef27 [svn] - update Mosaic effect helptext.
nenolod
parents: 175
diff changeset
165 "general_mosaic", "Mosaic", "A simple mosaic effect.",
175
5635841a0686 [svn] - make mosaic sizable.
nenolod
parents: 174
diff changeset
166 0, general_mosaic_opts,
174
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
167 NULL, NULL, general_mosaic_exec
3d98be3d74c2 [svn] - mosaic effect (in progress, custom size will be in the next commit)
nenolod
parents: 155
diff changeset
168 };
177
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
169
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
170 /* **************** general_clear **************** */
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
171 static void
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
172 general_clear_exec (const struct pn_actuator_option *opts,
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
173 gpointer data)
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
174 {
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
175 memset(pn_image_data->surface[0], '\0',
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
176 (pn_image_data->height * pn_image_data->width));
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
177 }
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
178
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
179 struct pn_actuator_desc builtin_general_clear =
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
180 {
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
181 "general_clear", "Clear Surface", "Clears the surface.",
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
182 0, NULL,
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
183 NULL, NULL, general_clear_exec
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
184 };
6880934d11bf [svn] - add "Clear Surface" instruction.
nenolod
parents: 176
diff changeset
185
179
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
186 /* **************** general_noop **************** */
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
187 static void
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
188 general_noop_exec (const struct pn_actuator_option *opts,
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
189 gpointer data)
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
190 {
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
191 return;
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
192 }
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
193
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
194 struct pn_actuator_desc builtin_general_noop =
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
195 {
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
196 "general_noop", "Do Nothing", "Does absolutely nothing.",
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
197 0, NULL,
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
198 NULL, NULL, general_noop_exec
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
199 };
b44ab11a64c2 [svn] - NOOP instruction. What this does is basically takes a slot in a
nenolod
parents: 177
diff changeset
200
181
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
201 /* **************** general_invert **************** */
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
202 static void
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
203 general_invert_exec (const struct pn_actuator_option *opts,
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
204 gpointer data)
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
205 {
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
206 int i, j;
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
207
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
208 for (j=0; j < pn_image_data->height; j++)
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
209 for (i=0; i < pn_image_data->width; i++)
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
210 pn_image_data->surface[0][PN_IMG_INDEX (i, j)] =
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
211 255 - pn_image_data->surface[0][PN_IMG_INDEX (i, j)];
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
212 }
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
213
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
214 struct pn_actuator_desc builtin_general_invert =
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
215 {
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
216 "general_invert", "Value Invert", "Performs a value invert.",
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
217 0, NULL,
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
218 NULL, NULL, general_invert_exec
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
219 };
156d6c875ef0 [svn] - add value invert filter
nenolod
parents: 179
diff changeset
220
182
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
221 /* **************** general_replace **************** */
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
222 static struct pn_actuator_option_desc general_replace_opts[] =
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
223 {
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
224 { "start", "The beginning colour value that should be replaced by the value of out.",
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
225 OPT_TYPE_INT, { ival: 250 } },
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
226 { "end", "The ending colour value that should be replaced by the value of out.",
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
227 OPT_TYPE_INT, { ival: 255 } },
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
228 { "out", "The colour value that in is replaced with.",
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
229 OPT_TYPE_INT, { ival: 0 } },
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
230 { NULL }
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
231 };
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
232
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
233 static void
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
234 general_replace_exec (const struct pn_actuator_option *opts,
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
235 gpointer data)
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
236 {
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
237 register int i, j;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
238 register guchar val;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
239 guchar begin = opts[0].val.ival > 255 || opts[0].val.ival < 0 ? 250 : opts[0].val.ival;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
240 guchar end = opts[1].val.ival > 255 || opts[1].val.ival < 0 ? 255 : opts[1].val.ival;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
241 guchar out = opts[2].val.ival > 255 || opts[2].val.ival < 0 ? 0 : opts[2].val.ival;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
242
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
243 for (j=0; j < pn_image_data->height; j++)
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
244 for (i=0; i < pn_image_data->width; i++)
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
245 {
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
246 val = pn_image_data->surface[0][PN_IMG_INDEX (i, j)];
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
247 if (val >= begin && val <= end)
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
248 pn_image_data->surface[0][PN_IMG_INDEX (i, j)] = out;
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
249 }
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
250 }
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
251
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
252 struct pn_actuator_desc builtin_general_replace =
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
253 {
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
254 "general_replace", "Value Replace", "Performs a value replace on a range of values.",
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
255 0, general_replace_opts,
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
256 NULL, NULL, general_replace_exec
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
257 };
6048abdac7d1 [svn] - add value replace filter, replaces a range of values with a different value
nenolod
parents: 181
diff changeset
258
271
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
259 /* **************** general_swap **************** */
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
260 static void
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
261 general_swap_exec (const struct pn_actuator_option *opts,
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
262 gpointer data)
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
263 {
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
264 pn_swap_surfaces ();
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
265 }
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
266
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
267 struct pn_actuator_desc builtin_general_swap =
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
268 {
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
269 "general_swap", "Swap Surface", "Swaps the surface.",
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
270 0, NULL,
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
271 NULL, NULL, general_swap_exec
b166ce84af57 [svn] - add swap surface
nenolod
parents: 182
diff changeset
272 };
272
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
273
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
274 /* **************** general_copy **************** */
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
275 static void
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
276 general_copy_exec (const struct pn_actuator_option *opts,
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
277 gpointer data)
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
278 {
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
279 memcpy(pn_image_data->surface[1], pn_image_data->surface[0],
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
280 (pn_image_data->width * pn_image_data->height));
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
281 }
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
282
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
283 struct pn_actuator_desc builtin_general_copy =
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
284 {
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
285 "general_copy", "Copy Surface", "Copies the surface to the other surface.",
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
286 0, NULL,
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
287 NULL, NULL, general_copy_exec
d8cefe8ce6e6 [svn] - add copy surface
nenolod
parents: 271
diff changeset
288 };
278
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
289
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
290 /* **************** general_flip **************** */
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
291 static struct pn_actuator_option_desc general_flip_opts[] =
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
292 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
293 { "direction", "Negative is horizontal, positive is vertical.",
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
294 OPT_TYPE_INT, { ival: -1 } },
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
295 { NULL }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
296 };
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
297
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
298 static void
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
299 general_flip_exec (const struct pn_actuator_option *opts,
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
300 gpointer data)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
301 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
302 gint x, y;
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
303
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
304 if (opts[0].val.ival < 0)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
305 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
306 for (y = 0; y < pn_image_data->height; y++)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
307 for (x = 0; x < pn_image_data->width; x++)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
308 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
309 pn_image_data->surface[1][PN_IMG_INDEX(pn_image_data->width - x, y)] =
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
310 pn_image_data->surface[0][PN_IMG_INDEX(x, y)];
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
311 }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
312 }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
313 else
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
314 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
315 for (y = 0; y < pn_image_data->height; y++)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
316 for (x = 0; x < pn_image_data->width; x++)
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
317 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
318 pn_image_data->surface[1][PN_IMG_INDEX(x, pn_image_data->height - y)] =
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
319 pn_image_data->surface[0][PN_IMG_INDEX(x, y)];
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
320 }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
321 }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
322
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
323 pn_swap_surfaces ();
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
324 }
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
325
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
326 struct pn_actuator_desc builtin_general_flip =
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
327 {
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
328 "general_flip", "Flip Surface", "Flips the surface.",
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
329 0, general_flip_opts,
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
330 NULL, NULL, general_flip_exec
8f4dc0d63925 [svn] - add surface flip
nenolod
parents: 272
diff changeset
331 };
1177
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
332
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
333 /* ***************** general_evaluate ***************** */
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
334
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
335 static struct pn_actuator_option_desc general_evaluate_opts[] =
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
336 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
337 { "init_script", "Script to run on start.", OPT_TYPE_STRING, {sval: "global_reg0 = 27;"} },
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
338 { "frame_script", "Script to run.", OPT_TYPE_STRING, {sval: "global_reg0 = global_reg0 + 1;"} },
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
339 { NULL }
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
340 };
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
341
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
342 struct pn_evaluate_ctx
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
343 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
344 expression_t *expr_on_init, *expr_on_frame;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
345 symbol_dict_t *dict;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
346 gboolean reset;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
347 };
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
348
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
349 static void
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
350 general_evaluate_init(gpointer *data)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
351 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
352 *data = g_new0(struct pn_evaluate_ctx, 1);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
353
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
354 ((struct pn_evaluate_ctx *)*data)->reset = TRUE;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
355 }
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
356
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
357 static void
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
358 general_evaluate_cleanup(gpointer op_data)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
359 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
360 struct pn_evaluate_ctx *data = (struct pn_evaluate_ctx *) op_data;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
361
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
362 g_return_if_fail(data != NULL);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
363
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
364 if (data->expr_on_init)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
365 expr_free(data->expr_on_init);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
366
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
367 if (data->expr_on_frame)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
368 expr_free(data->expr_on_frame);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
369
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
370 if (data->dict)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
371 dict_free(data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
372
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
373 if (data)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
374 g_free(data);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
375 }
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
376
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
377 static void
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
378 general_evaluate_exec(const struct pn_actuator_option *opts,
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
379 gpointer op_data)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
380 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
381 struct pn_evaluate_ctx *data = (struct pn_evaluate_ctx *) op_data;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
382
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
383 if (data->reset)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
384 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
385 if (data->dict)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
386 dict_free(data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
387
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
388 data->dict = dict_new();
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
389
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
390 if (opts[0].val.sval != NULL);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
391 data->expr_on_init = expr_compile_string(opts[0].val.sval, data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
392
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
393 if (opts[1].val.sval != NULL);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
394 data->expr_on_frame = expr_compile_string(opts[1].val.sval, data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
395
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
396 if (data->expr_on_init != NULL)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
397 expr_execute(data->expr_on_init, data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
398
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
399 data->reset = FALSE;
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
400 }
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
401
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
402 if (data->expr_on_frame != NULL)
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
403 expr_execute(data->expr_on_frame, data->dict);
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
404 }
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
405
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
406 struct pn_actuator_desc builtin_general_evaluate =
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
407 {
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
408 "general_evaluate", "Evalulate VM Code",
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
409 "Evaluates arbitrary VM code. Does not draw anything.",
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
410 0, general_evaluate_opts,
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
411 general_evaluate_init, general_evaluate_cleanup, general_evaluate_exec
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
412 };
a7c98f237b03 [svn] - add general_evaluate which can run arbitrary VM code
nenolod
parents: 278
diff changeset
413