annotate Plugins/Visualization/paranormal/pn/pndisplacement.c @ 1729:3ee4c6d45c27 trunk

[svn] Fixed unused variable and missing type conversion
author js
date Sat, 16 Sep 2006 19:37:08 -0700
parents a898e415ad8f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
1 /* Paranormal - A highly customizable audio visualization library
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
2 * Copyright (C) 2001 Jamie Gennis <jgennis@mindspring.com>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
3 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
4 * This library is free software; you can redistribute it and/or
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
5 * modify it under the terms of the GNU Library General Public
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
6 * License as published by the Free Software Foundation; either
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
7 * version 2 of the License, or (at your option) any later version.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
8 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
9 * This library is distributed in the hope that it will be useful,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
12 * Library General Public License for more details.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
13 *
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
14 * You should have received a copy of the GNU Library General Public
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
15 * License along with this library; if not, write to the Free
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
17 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
18
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
19 #include <math.h>
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
20 #include <glib.h>
1585
a898e415ad8f [svn] An include a day keeps the implicit declaration at bay.
chainsaw
parents: 1507
diff changeset
21 #include <string.h>
1507
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
22 #include "pndisplacement.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
23 #include "pnbooleanoption.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
24 #include "pnstringoption.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
25 #include "pncpu.h"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
26
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
27 enum
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
28 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
29 PN_PIXEL_DISPLACEMENT_NO_PIXEL = 0xffffffff
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
30 };
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
31
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
32 static void pn_displacement_class_init (PnDisplacementClass *class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
33 static void pn_displacement_init (PnDisplacement *displacement,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
34 PnDisplacementClass *class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
35 /* PnObject signals */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
36 static void pn_displacement_destroy (PnObject *object);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
37
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
38 /* PnActuator methods */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
39 static void pn_displacement_prepare (PnDisplacement *displacement,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
40 PnImage *image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
41 static void pn_displacement_execute (PnDisplacement *displacement,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
42 PnImage *image,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
43 PnAudioData *audio_data);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
44
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
45 static PnActuatorClass *parent_class = NULL;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
46
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
47 GType
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
48 pn_displacement_get_type (void)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
49 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
50 static GType displacement_type = 0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
51
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
52 if (! displacement_type)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
53 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
54 static const GTypeInfo displacement_info =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
55 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
56 sizeof (PnDisplacementClass),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
57 NULL, /* base_init */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
58 NULL, /* base_finalize */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
59 (GClassInitFunc) pn_displacement_class_init,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
60 NULL, /* class_finalize */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
61 NULL, /* class_data */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
62 sizeof (PnDisplacement),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
63 0, /* n_preallocs */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
64 (GInstanceInitFunc) pn_displacement_init
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
65 };
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
66
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
67 /* FIXME: should this be dynamic? */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
68 displacement_type = g_type_register_static (PN_TYPE_ACTUATOR,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
69 "PnDisplacement",
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
70 &displacement_info,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
71 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
72 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
73 return displacement_type;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
74 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
75
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
76 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
77 pn_displacement_class_init (PnDisplacementClass *class)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
78 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
79 GObjectClass *gobject_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
80 PnObjectClass *object_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
81 PnUserObjectClass *user_object_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
82 PnActuatorClass *actuator_class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
83
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
84 parent_class = g_type_class_peek_parent (class);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
85
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
86 gobject_class = (GObjectClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
87 object_class = (PnObjectClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
88 user_object_class = (PnUserObjectClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
89 actuator_class = (PnActuatorClass *) class;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
90
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
91 /* PnObject signals */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
92 object_class->destroy = pn_displacement_destroy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
93
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
94 /* PnActuator methods */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
95 actuator_class->prepare = (PnActuatorPrepFunc) pn_displacement_prepare;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
96 actuator_class->execute = (PnActuatorExecFunc) pn_displacement_execute;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
97 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
98
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
99 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
100 pn_displacement_init (PnDisplacement *displacement, PnDisplacementClass *class)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
101 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
102 PnStringOption *init_script_opt, *frame_script_opt;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
103
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
104 /* Set up the name and description */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
105 pn_user_object_set_name (PN_USER_OBJECT (displacement), "Transform.Displacement");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
106 pn_user_object_set_description (PN_USER_OBJECT (displacement),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
107 "Displaces the image");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
108
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
109 /* Set up the options */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
110 init_script_opt = pn_string_option_new ("init_script", "The initialization script");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
111 frame_script_opt = pn_string_option_new ("frame_script", "The per-frame script");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
112
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
113 pn_actuator_add_option (PN_ACTUATOR (displacement), PN_OPTION (init_script_opt));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
114 pn_actuator_add_option (PN_ACTUATOR (displacement), PN_OPTION (frame_script_opt));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
115
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
116 /* Create the script objects and symbol table */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
117 displacement->init_script = pn_script_new ();
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
118 pn_object_ref (PN_OBJECT (displacement->init_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
119 pn_object_sink (PN_OBJECT (displacement->init_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
120 displacement->frame_script = pn_script_new ();
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
121 pn_object_ref (PN_OBJECT (displacement->frame_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
122 pn_object_sink (PN_OBJECT (displacement->frame_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
123 displacement->symbol_table = pn_symbol_table_new ();
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
124 pn_object_ref (PN_OBJECT (displacement->symbol_table));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
125 pn_object_sink (PN_OBJECT (displacement->symbol_table));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
126
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
127 /* Get the variables from the symbol table */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
128 displacement->x_var = pn_symbol_table_ref_variable_by_name (displacement->symbol_table, "x");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
129 displacement->y_var = pn_symbol_table_ref_variable_by_name (displacement->symbol_table, "y");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
130 displacement->volume_var = pn_symbol_table_ref_variable_by_name (displacement->symbol_table, "volume");
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
131 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
132
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
133 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
134 pn_displacement_destroy (PnObject *object)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
135 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
136 PnDisplacement *displacement;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
137
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
138 displacement = (PnDisplacement *) object;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
139
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
140 pn_object_unref (PN_OBJECT (displacement->init_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
141 pn_object_unref (PN_OBJECT (displacement->frame_script));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
142 pn_object_unref (PN_OBJECT (displacement->symbol_table));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
143 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
144
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
145 /* FIXME: optimize this */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
146 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
147 pn_displacement_prepare (PnDisplacement *displacement, PnImage *image)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
148 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
149 PnStringOption *init_script_opt, *frame_script_opt;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
150
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
151 g_return_if_fail (displacement != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
152 g_return_if_fail (PN_IS_DISPLACEMENT (displacement));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
153 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
154 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
155
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
156 /* Parse the script strings */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
157 init_script_opt =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
158 (PnStringOption *) pn_actuator_get_option_by_index (PN_ACTUATOR (displacement),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
159 PN_DISPLACEMENT_OPT_INIT_SCRIPT);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
160 frame_script_opt =
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
161 (PnStringOption *) pn_actuator_get_option_by_index (PN_ACTUATOR (displacement),
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
162 PN_DISPLACEMENT_OPT_FRAME_SCRIPT);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
163
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
164 pn_script_parse_string (displacement->init_script, displacement->symbol_table,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
165 pn_string_option_get_value (init_script_opt));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
166 pn_script_parse_string (displacement->frame_script, displacement->symbol_table,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
167 pn_string_option_get_value (frame_script_opt));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
168
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
169 /* Set up 0 displacement */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
170 PN_VARIABLE_VALUE (displacement->x_var) = 0.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
171 PN_VARIABLE_VALUE (displacement->y_var) = 0.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
172
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
173 /* Run the init script */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
174 pn_script_execute (displacement->init_script);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
175
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
176 if (PN_ACTUATOR_CLASS (parent_class)->prepare)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
177 PN_ACTUATOR_CLASS (parent_class)->prepare (PN_ACTUATOR (displacement), image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
178 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
179
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
180 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
181 pn_displacement_exec (PnImage *image, gint offset, guint nw, guint ne, guint sw, guint se,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
182 gint startx, gint starty, gint endx, gint endy)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
183 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
184 gint i, j, width, height, stride;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
185 PnColor *src, *dest, zero = {0,0,0,0};
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
186 guint r, g, b;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
187
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
188 width = pn_image_get_width (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
189 height = pn_image_get_height (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
190 stride = pn_image_get_pitch (image) >> 2;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
191
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
192 src = pn_image_get_image_buffer (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
193 dest = pn_image_get_transform_buffer (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
194
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
195 for (j=0; j<height; j++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
196 for (i=0; i<width; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
197 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
198 if (i < startx || i >= endx
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
199 || j < starty || j >= endy)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
200 dest[j * stride + i] = zero;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
201 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
202 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
203 r = src[(j * stride + i) + offset].red * nw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
204 g = src[(j * stride + i) + offset].green * nw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
205 b = src[(j * stride + i) + offset].blue * nw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
206
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
207 r += src[(j * stride + (i + 1)) + offset].red * ne;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
208 g += src[(j * stride + (i + 1)) + offset].green * ne;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
209 b += src[(j * stride + (i + 1)) + offset].blue * ne;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
210
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
211 r += src[((j + 1) * stride + i) + offset].red * sw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
212 g += src[((j + 1) * stride + i) + offset].green * sw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
213 b += src[((j + 1) * stride + i) + offset].blue * sw;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
214
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
215 r += src[((j + 1) * stride + (i + 1)) + offset].red * se;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
216 g += src[((j + 1) * stride + (i + 1)) + offset].green * se;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
217 b += src[((j + 1) * stride + (i + 1)) + offset].blue * se;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
218
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
219 dest[j * stride + i].red = r >> 7;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
220 dest[j * stride + i].green = g >> 7;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
221 dest[j * stride + i].blue = b >> 7;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
222 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
223 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
224 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
225
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
226 #ifdef PN_USE_MMX
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
227 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
228 pn_displacement_exec_mmx (PnImage *image, gint offset, guint nw, guint ne, guint sw, guint se,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
229 gint startx, gint starty, gint endx, gint endy)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
230 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
231 PnColor *src, *dest, *endptr;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
232 gint width, height, stride, i;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
233 guint64 upnw; /* a place to store the unpacked se weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
234
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
235 width = pn_image_get_width (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
236 height = pn_image_get_height (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
237 stride = pn_image_get_pitch (image) >> 2;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
238
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
239 src = pn_image_get_image_buffer (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
240 dest = pn_image_get_transform_buffer (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
241
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
242 memset (dest, 0, pn_image_get_pitch (image) * starty);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
243 for (i=MAX(starty, 0); i<endy; i++)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
244 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
245 memset (dest + i * stride, 0, startx * sizeof (PnColor));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
246 memset (dest + i * stride + endx, 0, (width - endx) * sizeof (PnColor));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
247 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
248 memset (dest + endy * stride, 0, (height - endy) * pn_image_get_pitch (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
249
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
250 src += (starty * stride) + offset;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
251 endptr = src + endx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
252 src += startx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
253 dest += (starty * stride) + startx;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
254
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
255 __asm__ __volatile__ (
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
256 /* Unpack the weights */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
257 "pxor %%mm7,%%mm7\n\t" /* zero mm7 for unpacking */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
258 "movd %8,%%mm4\n\t" /* load the weights */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
259 "punpcklbw %%mm7,%%mm4\n\t" /* unpack the weights to words */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
260 "movq %%mm4,%%mm6\n\t" /* copy the weights for separate expansion */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
261 "punpcklwd %%mm4,%%mm4\n\t" /* expand the top weights */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
262 "punpckhwd %%mm6,%%mm6\n\t" /* expand the bottom weights */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
263 "movq %%mm4,%%mm5\n\t" /* copy the top pixels for separate expansion */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
264 "movq %%mm6,%%mm7\n\t" /* copy the bottom pixels for separate expansion */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
265 "punpckldq %%mm4,%%mm4\n\t" /* expand the NW weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
266 "punpckhdq %%mm5,%%mm5\n\t" /* expand the NE weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
267 "punpckldq %%mm6,%%mm6\n\t" /* expand the SW weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
268 "punpckhdq %%mm7,%%mm7\n\t" /* expand the SE weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
269 "movq %%mm7,%4\n\t" /* save the SE weight so we can use mm7 as 0 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
270 "pxor %%mm7,%%mm7\n\t" /* re-zero mm7 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
271
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
272 "10:\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
273
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
274 /* zero mm7 for unpacking */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
275 "pxor %%mm7,%%mm7\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
276
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
277 /* load & unpack the pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
278 "movd (%0),%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
279 "punpcklbw %%mm7,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
280 "movd 4(%0),%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
281 "punpcklbw %%mm7,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
282 "movd (%0,%5),%%mm2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
283 "punpcklbw %%mm7,%%mm2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
284 "movd 4(%0,%5),%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
285 "punpcklbw %%mm7,%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
286
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
287 /* reload the unpacked se weight */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
288 "movq %4,%%mm7\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
289
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
290 /* weight each pixel */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
291 "pmullw %%mm4,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
292 "pmullw %%mm5,%%mm1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
293 "pmullw %%mm6,%%mm2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
294 "pmullw %%mm7,%%mm3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
295
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
296 /* add up the weighted pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
297 "paddw %%mm1,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
298 "paddw %%mm2,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
299 "paddw %%mm3,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
300
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
301 /* normalize the resulting pixel, pack it, and write it */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
302 "psrlw $7,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
303 "packuswb %%mm0,%%mm0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
304 "movd %%mm0,(%1)\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
305
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
306 /* advance the pointers */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
307 "addl $4,%0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
308 "addl $4,%1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
309
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
310 /* see if we're done with this line */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
311 "cmpl %3,%0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
312 "jl 10b\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
313
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
314 /* advance the pointers */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
315 "addl %7,%0\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
316 "addl %7,%1\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
317 "addl %5,%3\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
318
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
319 /* see if we're done */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
320 "incl %2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
321 "cmpl %6,%2\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
322 "jl 10b\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
323
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
324 "emms\n\t"
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
325
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
326 : /* no outputs */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
327 : "r" (src), /* 0 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
328 "r" (dest), /* 1 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
329 "r" (starty), /* 2 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
330 "m" (endptr), /* 3 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
331 "m" (upnw), /* 4 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
332 "r" (pn_image_get_pitch (image)), /* 5 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
333 "r" (endy), /* 6 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
334 "rm" (((stride - endx) + startx) * sizeof (PnColor)), /* 7 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
335 "rm" ((guint32)((se << 24) | (sw << 16) | (ne << 8) | nw ))); /* 8 */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
336 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
337 #endif /* PN_USE_MMX */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
338
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
339 static void
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
340 pn_displacement_execute (PnDisplacement *displacement, PnImage *image, PnAudioData *audio_data)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
341 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
342 g_return_if_fail (displacement != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
343 g_return_if_fail (PN_IS_DISPLACEMENT (displacement));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
344 g_return_if_fail (image != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
345 g_return_if_fail (PN_IS_IMAGE (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
346 g_return_if_fail (audio_data != NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
347 g_return_if_fail (PN_IS_AUDIO_DATA (audio_data));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
348
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
349 /* set up the volume in-script variable */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
350 PN_VARIABLE_VALUE (displacement->volume_var) = pn_audio_data_get_volume (audio_data);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
351
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
352 /* run the frame scipt */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
353 pn_script_execute (displacement->frame_script);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
354
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
355 if (fabs (PN_VARIABLE_VALUE (displacement->x_var)) <= 2.0
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
356 && fabs (PN_VARIABLE_VALUE (displacement->y_var)) <= 2.0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
357 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
358 guint nw, ne, sw, se;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
359 gint startx, starty, endx, endy;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
360 gint offset;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
361 gdouble x, y, xfrac, yfrac;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
362
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
363 x = -PN_VARIABLE_VALUE (displacement->x_var) * (pn_image_get_width (image) >> 1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
364 y = PN_VARIABLE_VALUE (displacement->y_var) * (pn_image_get_height (image) >> 1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
365
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
366 xfrac = modf (x, &x);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
367 yfrac = modf (y, &y);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
368
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
369 if (x < 0.0 || xfrac < 0.0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
370 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
371 x--;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
372 xfrac++;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
373 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
374 if (y < 0.0 || yfrac < 0.0)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
375 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
376 y--;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
377 yfrac++;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
378 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
379
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
380 se = xfrac * yfrac * 128.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
381 sw = (1.0 - xfrac) * yfrac * 128.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
382 ne = xfrac * (1.0 - yfrac) * 128.0;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
383 nw = 128 - (se + sw + ne);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
384
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
385 offset = (y * (pn_image_get_pitch (image) >> 2)) + x;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
386
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
387 startx = -x;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
388 starty = -y;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
389 endx = pn_image_get_width (image) - (x+1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
390 endy = pn_image_get_height (image) - (y+1);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
391
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
392 startx = MAX (startx, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
393 starty = MAX (starty, 0);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
394 endx = MIN (endx, pn_image_get_width (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
395 endy = MIN (endy, pn_image_get_height (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
396
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
397 /* I'm too lazy to special case the rightmost & bottommost pixels */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
398 if (endx == pn_image_get_width (image))
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
399 endx--;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
400 if (endy == pn_image_get_height (image))
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
401 endy--;
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
402
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
403 #ifdef PN_USE_MMX
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
404 if (pn_cpu_get_caps () & PN_CPU_CAP_MMX)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
405 pn_displacement_exec_mmx (image, offset, nw, ne, sw, se, startx, starty, endx, endy);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
406 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
407 #endif /* PN_USE_MMX */
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
408 pn_displacement_exec (image, offset, nw, ne, sw, se, startx, starty, endx, endy);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
409 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
410 else
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
411 memset (pn_image_get_transform_buffer (image), 0,
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
412 pn_image_get_pitch (image) * pn_image_get_height (image));
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
413
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
414 pn_image_apply_transform (image);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
415
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
416 if (PN_ACTUATOR_CLASS (parent_class)->execute)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
417 PN_ACTUATOR_CLASS (parent_class)->execute (PN_ACTUATOR (displacement), image, audio_data);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
418 }
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
419
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
420 PnDisplacement*
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
421 pn_displacement_new (void)
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
422 {
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
423 return (PnDisplacement *) g_object_new (PN_TYPE_DISPLACEMENT, NULL);
0c5fdcf3f947 [svn] - incomplete stuff
nenolod
parents:
diff changeset
424 }