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