MythTV master
ifs_display.cpp
Go to the documentation of this file.
1#include <array>
2
3#include "ifs.h"
4#include "goomconfig.h"
5#include "libmythbase/mythconfig.h"
6
7#if HAVE_MMX
8#include "mmx.h"
9#endif
10
11#include "goom_tools.h"
12
13/* NOLINTNEXTLINE(readability-non-const-parameter) */
14void ifs_update (guint32 * data, const guint32 * back, int width, int height,
15 int increment)
16{
17 static int s_couleur = 0xc0c0c0c0;
18 static std::array<int,4> s_v { 2, 4, 3, 2 };
19 static std::array<int,4> s_col { 2, 4, 3, 2 };
20
21 enum MODE : std::uint8_t {
22 MOD_MER = 0,
23 MOD_FEU = 1,
24 MOD_MERVER = 2
25 };
26 static MODE s_mode = MOD_MERVER;
27 static int s_justChanged = 0;
28 static int s_cycle = 0;
29 int cycle10 = 0;
30 int couleursl = s_couleur;
31
32 s_cycle++;
33 if (s_cycle >= 80)
34 s_cycle = 0;
35
36 if (s_cycle < 40)
37 cycle10 = s_cycle / 10;
38 else
39 cycle10 = 7 - (s_cycle / 10);
40
41 {
42 auto *tmp = (unsigned char *) &couleursl;
43
44 for (int i = 0; i < 4; i++) {
45 *tmp = (*tmp) >> cycle10;
46 tmp++;
47 }
48 }
49
50 int nbpt = 0;
51 IFSPoint *points = draw_ifs (&nbpt);
52 nbpt--;
53
54#if HAVE_MMX
55 movd_m2r (couleursl, mm1);
56 punpckldq_r2r (mm1, mm1);
57 for (int i = 0; i < nbpt; i += increment) {
58 int x = points[i].x;
59 int y = points[i].y;
60
61 if ((x < width) && (y < height) && (x > 0) && (y > 0)) {
62 int pos = x + (y * width);
63 movd_m2r (back[pos], mm0);
64 paddusb_r2r (mm1, mm0);
65 movd_r2m (mm0, data[pos]);
66 }
67 }
68 emms();/*__asm__ __volatile__ ("emms");*/
69#else
70 for (int i = 0; i < nbpt; i += increment) {
71 int x = points[i].x & 0x7fffffff;
72 int y = points[i].y & 0x7fffffff;
73
74 if ((x < width) && (y < height)) {
75 int pos = x + (y * width);
76 int tra = 0;
77 auto *bra = (unsigned char *) &back[pos];
78 auto *dra = (unsigned char *) &data[pos];
79 auto *cra = (unsigned char *) &couleursl;
80
81 for (int j = 0; j < 4; j++) {
82 tra = *cra;
83 tra += *bra;
84 if (tra > 255)
85 tra = 255;
86 *dra = tra;
87 ++dra;
88 ++cra;
89 ++bra;
90 }
91 }
92 }
93#endif /* HAVE_MMX */
94 s_justChanged--;
95
96 s_col[ALPHA] = s_couleur >> (ALPHA * 8) & 0xff;
97 s_col[BLEU] = s_couleur >> (BLEU * 8) & 0xff;
98 s_col[VERT] = s_couleur >> (VERT * 8) & 0xff;
99 s_col[ROUGE] = s_couleur >> (ROUGE * 8) & 0xff;
100
101 if (s_mode == MOD_MER) {
102 s_col[BLEU] += s_v[BLEU];
103 if (s_col[BLEU] > 255) {
104 s_col[BLEU] = 255;
105 s_v[BLEU] = -(RAND() % 4) - 1;
106 }
107 if (s_col[BLEU] < 32) {
108 s_col[BLEU] = 32;
109 s_v[BLEU] = (RAND() % 4) + 1;
110 }
111
112 s_col[VERT] += s_v[VERT];
113 if (s_col[VERT] > 200) {
114 s_col[VERT] = 200;
115 s_v[VERT] = -(RAND() % 3) - 2;
116 }
117 if (s_col[VERT] > s_col[BLEU]) {
118 s_col[VERT] = s_col[BLEU];
119 s_v[VERT] = s_v[BLEU];
120 }
121 if (s_col[VERT] < 32) {
122 s_col[VERT] = 32;
123 s_v[VERT] = (RAND() % 3) + 2;
124 }
125
126 s_col[ROUGE] += s_v[ROUGE];
127 if (s_col[ROUGE] > 64) {
128 s_col[ROUGE] = 64;
129 s_v[ROUGE] = -(RAND () % 4) - 1;
130 }
131 if (s_col[ROUGE] < 0) {
132 s_col[ROUGE] = 0;
133 s_v[ROUGE] = (RAND () % 4) + 1;
134 }
135
136 s_col[ALPHA] += s_v[ALPHA];
137 if (s_col[ALPHA] > 0) {
138 s_col[ALPHA] = 0;
139 s_v[ALPHA] = -(RAND () % 4) - 1;
140 }
141 if (s_col[ALPHA] < 0) {
142 s_col[ALPHA] = 0;
143 s_v[ALPHA] = (RAND () % 4) + 1;
144 }
145
146 if (((s_col[VERT] > 32) && (s_col[ROUGE] < s_col[VERT] + 40)
147 && (s_col[VERT] < s_col[ROUGE] + 20) && (s_col[BLEU] < 64)
148 && (RAND () % 20 == 0)) && (s_justChanged < 0)) {
149 s_mode = (RAND () % 3) ? MOD_FEU : MOD_MERVER;
150 s_justChanged = 250;
151 }
152 }
153 else if (s_mode == MOD_MERVER) {
154 s_col[BLEU] += s_v[BLEU];
155 if (s_col[BLEU] > 128) {
156 s_col[BLEU] = 128;
157 s_v[BLEU] = -(RAND () % 4) - 1;
158 }
159 if (s_col[BLEU] < 16) {
160 s_col[BLEU] = 16;
161 s_v[BLEU] = (RAND () % 4) + 1;
162 }
163
164 s_col[VERT] += s_v[VERT];
165 if (s_col[VERT] > 200) {
166 s_col[VERT] = 200;
167 s_v[VERT] = -(RAND () % 3) - 2;
168 }
169 if (s_col[VERT] > s_col[ALPHA]) {
170 s_col[VERT] = s_col[ALPHA];
171 s_v[VERT] = s_v[ALPHA];
172 }
173 if (s_col[VERT] < 32) {
174 s_col[VERT] = 32;
175 s_v[VERT] = (RAND () % 3) + 2;
176 }
177
178 s_col[ROUGE] += s_v[ROUGE];
179 if (s_col[ROUGE] > 128) {
180 s_col[ROUGE] = 128;
181 s_v[ROUGE] = -(RAND () % 4) - 1;
182 }
183 if (s_col[ROUGE] < 0) {
184 s_col[ROUGE] = 0;
185 s_v[ROUGE] = (RAND () % 4) + 1;
186 }
187
188 s_col[ALPHA] += s_v[ALPHA];
189 if (s_col[ALPHA] > 255) {
190 s_col[ALPHA] = 255;
191 s_v[ALPHA] = -(RAND () % 4) - 1;
192 }
193 if (s_col[ALPHA] < 0) {
194 s_col[ALPHA] = 0;
195 s_v[ALPHA] = (RAND () % 4) + 1;
196 }
197
198 if (((s_col[VERT] > 32) && (s_col[ROUGE] < s_col[VERT] + 40)
199 && (s_col[VERT] < s_col[ROUGE] + 20) && (s_col[BLEU] < 64)
200 && (RAND () % 20 == 0)) && (s_justChanged < 0)) {
201 s_mode = (RAND () % 3) ? MOD_FEU : MOD_MER;
202 s_justChanged = 250;
203 }
204 }
205 else if (s_mode == MOD_FEU) {
206
207 s_col[BLEU] += s_v[BLEU];
208 if (s_col[BLEU] > 64) {
209 s_col[BLEU] = 64;
210 s_v[BLEU] = -(RAND () % 4) - 1;
211 }
212 if (s_col[BLEU] < 0) {
213 s_col[BLEU] = 0;
214 s_v[BLEU] = (RAND () % 4) + 1;
215 }
216
217 s_col[VERT] += s_v[VERT];
218 if (s_col[VERT] > 200) {
219 s_col[VERT] = 200;
220 s_v[VERT] = -(RAND () % 3) - 2;
221 }
222 if (s_col[VERT] > s_col[ROUGE] + 20) {
223 s_col[VERT] = s_col[ROUGE] + 20;
224 s_v[VERT] = -(RAND () % 3) - 2;
225 s_v[ROUGE] = (RAND () % 4) + 1;
226 s_v[BLEU] = (RAND () % 4) + 1;
227 }
228 if (s_col[VERT] < 0) {
229 s_col[VERT] = 0;
230 s_v[VERT] = (RAND () % 3) + 2;
231 }
232
233 s_col[ROUGE] += s_v[ROUGE];
234 if (s_col[ROUGE] > 255) {
235 s_col[ROUGE] = 255;
236 s_v[ROUGE] = -(RAND () % 4) - 1;
237 }
238 if (s_col[ROUGE] > s_col[VERT] + 40) {
239 s_col[ROUGE] = s_col[VERT] + 40;
240 s_v[ROUGE] = -(RAND () % 4) - 1;
241 }
242 if (s_col[ROUGE] < 0) {
243 s_col[ROUGE] = 0;
244 s_v[ROUGE] = (RAND () % 4) + 1;
245 }
246
247 s_col[ALPHA] += s_v[ALPHA];
248 if (s_col[ALPHA] > 0) {
249 s_col[ALPHA] = 0;
250 s_v[ALPHA] = -(RAND () % 4) - 1;
251 }
252 if (s_col[ALPHA] < 0) {
253 s_col[ALPHA] = 0;
254 s_v[ALPHA] = (RAND () % 4) + 1;
255 }
256
257 if (((s_col[ROUGE] < 64) && (s_col[VERT] > 32) && (s_col[VERT] < s_col[BLEU])
258 && (s_col[BLEU] > 32)
259 && (RAND () % 20 == 0)) && (s_justChanged < 0)) {
260 s_mode = (RAND () % 2) ? MOD_MER : MOD_MERVER;
261 s_justChanged = 250;
262 }
263 }
264
265 s_couleur = (s_col[ALPHA] << (ALPHA * 8))
266 | (s_col[BLEU] << (BLEU * 8))
267 | (s_col[VERT] << (VERT * 8))
268 | (s_col[ROUGE] << (ROUGE * 8));
269}
static guint32 * back
Definition: goom_core.cpp:25
static guint32 * tmp
Definition: goom_core.cpp:26
static int RAND(void)
Definition: goom_tools.h:29
#define VERT
Definition: goomconfig.h:12
#define ROUGE
position des composantes
Definition: goomconfig.h:10
#define guint32
Definition: goomconfig.h:33
#define BLEU
Definition: goomconfig.h:11
#define ALPHA
Definition: goomconfig.h:13
IFSPoint * draw_ifs(int *nbPoints)
Definition: ifs.cpp:411
void ifs_update(guint32 *data, const guint32 *back, int width, int height, int increment)
Definition: ifs_display.cpp:14
#define emms()
Definition: mmx.h:82
#define punpckldq_r2r(regs, regd)
Definition: mmx.h:212
#define paddusb_r2r(regs, regd)
Definition: mmx.h:121
#define movd_r2m(reg, var)
Definition: mmx.h:85
#define movd_m2r(var, reg)
Definition: mmx.h:84
#define MODE
Definition: ifs.h:11
gint32 y
Definition: ifs.h:12
gint32 x
Definition: ifs.h:12