summaryrefslogtreecommitdiff
path: root/src/post/goom/ifs_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/post/goom/ifs_display.c')
-rw-r--r--src/post/goom/ifs_display.c466
1 files changed, 271 insertions, 195 deletions
diff --git a/src/post/goom/ifs_display.c b/src/post/goom/ifs_display.c
index 94d79b7eb..9c43ff5dd 100644
--- a/src/post/goom/ifs_display.c
+++ b/src/post/goom/ifs_display.c
@@ -1,216 +1,292 @@
-#include <stdlib.h>
#include "ifs.h"
+#include "goom_config.h"
-#define DRAWMETHOD_NORMAL data[pos] = couleur
-
-#define DRAWMETHOD_PLUS(x) \
-{\
- int tra=0,i=0;\
- unsigned char *bra = (unsigned char*)&back[pos];\
- unsigned char *dra = (unsigned char*)&data[pos];\
- unsigned char *cra = (unsigned char*)&couleur;\
- for (;i<4;i++) {\
- tra = *cra >> x;\
- tra += *bra;\
- if (tra>255) tra=255;\
- *dra = tra;\
- ++dra;++cra;++bra;\
- }\
+extern volatile int use_asm;
+
+#ifdef MMX
+void
+ifs_fun_mmx(guint32 * data, guint32 * back, int width, int height,
+ int increment, int nbpt, IFSPoint *points, int couleursl)
+{
+ int i;
+ for (i = 0; i < nbpt; i += increment) {
+ int x = points[i].x;
+ int y = points[i].y;
+
+ if ((x < width) && (y < height) && (x > 0) && (y > 0)) {
+ int pos = x + (y * width);
+ register int b asm ("eax");
+
+ b = back[pos];
+ __asm__
+ ("
+ movd %%eax, %%mm0
+ movd %%edx, %%mm1
+ paddusb %%mm1, %%mm0
+ movd %%mm0, %%eax
+ "::
+ "edx" (couleursl));
+ data[pos] = b;
+ }
+ }
+ __asm__ __volatile__ ("emms");
}
+#endif
-#define DRAWMETHOD_OR data[pos]|=couleur
+void
+ifs_fun_c(guint32 * data, guint32 * back, int width, int height,
+ int increment, int nbpt, IFSPoint *points, int couleursl)
+{
+ int i;
+ for (i = 0; i < nbpt; i += increment) {
+ int x = (int) points[i].x & 0x7fffffff;
+ int y = (int) points[i].y & 0x7fffffff;
-#define DRAWMETHOD_DEMI data[pos]=((back[pos]&0xfefefefe) + (couleur & 0xfefefefe)) >> 1
+ if ((x < width) && (y < height)) {
+ int pos = x + (int) (y * width);
+ int tra = 0, i = 0;
+ unsigned char *bra = (unsigned char *) &back[pos];
+ unsigned char *dra = (unsigned char *) &data[pos];
+ unsigned char *cra = (unsigned char *) &couleursl;
-#define DRAWMETHOD(x) {DRAWMETHOD_DEMI;DRAWMETHOD_PLUS(x);}
+ for (; i < 4; i++) {
+ tra = *cra;
+ tra += *bra;
+ if (tra > 255)
+ tra = 255;
+ *dra = tra;
+ ++dra;
+ ++cra;
+ ++bra;
+ }
+ }
+ }
+}
-void ifs_update (guint32 *data, guint32 *back, int width, int height, int increment)
+void
+ifs_update (guint32 * data, guint32 * back, int width, int height,
+ int increment)
{
- static int couleur = 0xc0c0c0c0;
- static int v[4] = {2,4,3,2};
- static int col[4] = {2,4,3,2};
+ static int couleur = 0xc0c0c0c0;
+ static int v[4] = { 2, 4, 3, 2 };
+ static int col[4] = { 2, 4, 3, 2 };
+
#define MOD_MER 0
#define MOD_FEU 1
#define MOD_MERVER 2
- static int mode = MOD_MERVER;
- static int justChanged = 0;
- static int cycle = 0;
- int cycle10;
-
- int nbpt;
- IFSPoint *points;
- int i;
-
- points = draw_ifs (&nbpt);
-
- cycle ++;
- if (cycle < 40) {
- cycle10 = cycle / 10;
- for (i = 0; i < nbpt; i+=increment) {
- int x = (int)points[i].x & 0x7fffffff;
- int y = (int)points[i].y & 0x7fffffff;
- if ((x < width) && (y < height)) {
- int pos = x + (int)(y * width);
- DRAWMETHOD(cycle10);
- }
- }
- }
- else {
- cycle10 = 7 - cycle / 10;
- for (i = 0; i < nbpt; i+=increment) {
- int x = (int)points[i].x & 0x7fffffff;
- int y = (int)points[i].y & 0x7fffffff;
- if ((x < width) && (y < height)) {
- int pos = x + (int)(y * width);
- DRAWMETHOD(cycle10);
- }
- }
- if (cycle >= 79)
- cycle = 0;
- }
-
-
- justChanged --;
-
- col[ALPHA] = couleur >> (ALPHA*8) & 0xff;
- col[BLEU] = couleur >> (BLEU*8) & 0xff;
- col[VERT] = couleur >> (VERT*8) & 0xff;
- col[ROUGE] = couleur >> (ROUGE*8) & 0xff;
-
- if (mode == MOD_MER) {
- col[BLEU] += v[BLEU];
- if (col[BLEU]>255) {
- col[BLEU]=255; v[BLEU] = - (rand () % 4) - 1;
- }
- if (col[BLEU]<32) {
- col[BLEU]=32; v[BLEU] = (rand () % 4) + 1;
- }
-
- col[VERT] += v[VERT];
- if (col[VERT]>200) {
- col[VERT]=200; v[VERT] = - (rand () % 3) - 2;
- }
- if (col[VERT]>col[BLEU]) {
- col[VERT]=col[BLEU]; v[VERT] = v[BLEU];
- }
- if (col[VERT]<32) {
- col[VERT]=32; v[VERT] = (rand () % 3) + 2;
- }
-
- col[ROUGE] += v[ROUGE];
- if (col[ROUGE]>64) {
- col[ROUGE]=64; v[ROUGE] = - (rand () % 4) - 1;
- }
- if (col[ROUGE]<0) {
- col[ROUGE]=0; v[ROUGE] = (rand () % 4) + 1;
- }
+ static int mode = MOD_MERVER;
+ static int justChanged = 0;
+ static int cycle = 0;
+ int cycle10;
- col[ALPHA] += v[ALPHA];
- if (col[ALPHA]>0) {
- col[ALPHA]=0; v[ALPHA] = - (rand () % 4) - 1;
- }
- if (col[ALPHA]<0) {
- col[ALPHA]=0; v[ALPHA] = (rand () % 4) + 1;
- }
-
- if (((col [VERT] > 32) && (col[ROUGE]<col[VERT] + 40) && (col[VERT]<col[ROUGE] + 20) && (col [BLEU] < 64)
- && (rand () % 20 == 0)) && (justChanged < 0)) {
- mode = rand()%3?MOD_FEU:MOD_MERVER;
- justChanged = 250;
- }
- }
- else if (mode == MOD_MERVER) {
- col[BLEU] += v[BLEU];
- if (col[BLEU]>128) {
- col[BLEU]=128; v[BLEU] = - (rand () % 4) - 1;
- }
- if (col[BLEU]<16) {
- col[BLEU]=16; v[BLEU] = (rand () % 4) + 1;
- }
-
- col[VERT] += v[VERT];
- if (col[VERT]>200) {
- col[VERT]=200; v[VERT] = - (rand () % 3) - 2;
- }
- if (col[VERT]>col[ALPHA]) {
- col[VERT]=col[ALPHA]; v[VERT] = v[ALPHA];
- }
- if (col[VERT]<32) {
- col[VERT]=32; v[VERT] = (rand () % 3) + 2;
- }
-
- col[ROUGE] += v[ROUGE];
- if (col[ROUGE]>128) {
- col[ROUGE]=128; v[ROUGE] = - (rand () % 4) - 1;
- }
- if (col[ROUGE]<0) {
- col[ROUGE]=0; v[ROUGE] = (rand () % 4) + 1;
- }
+ int nbpt;
+ IFSPoint *points;
+ int i;
- col[ALPHA] += v[ALPHA];
- if (col[ALPHA]>255) {
- col[ALPHA]=255; v[ALPHA] = - (rand () % 4) - 1;
- }
- if (col[ALPHA]<0) {
- col[ALPHA]=0; v[ALPHA] = (rand () % 4) + 1;
- }
-
- if (((col [VERT] > 32) && (col[ROUGE]<col[VERT] + 40) && (col[VERT]<col[ROUGE] + 20) && (col [BLEU] < 64)
- && (rand () % 20 == 0)) && (justChanged < 0)) {
- mode = rand()%3?MOD_FEU:MOD_MER;
- justChanged = 250;
- }
- }
- else if (mode == MOD_FEU) {
+ int couleursl = couleur;
- col[BLEU] += v[BLEU];
- if (col[BLEU]>64) {
- col[BLEU]=64; v[BLEU] = - (rand () % 4) - 1;
- }
- if (col[BLEU]<0) {
- col[BLEU]=0; v[BLEU] = (rand () % 4) + 1;
- }
-
- col[VERT] += v[VERT];
- if (col[VERT]>200) {
- col[VERT]=200; v[VERT] = - (rand () % 3) - 2;
- }
- if (col[VERT]>col[ROUGE] + 20) {
- col[VERT]=col[ROUGE] + 20; v[VERT] = - (rand () % 3) - 2;
- v[ROUGE] = (rand () % 4) + 1; v[BLEU] = (rand () % 4) + 1;
- }
- if (col[VERT]<0) {
- col[VERT]=0; v[VERT] = (rand () % 3) + 2;
- }
-
- col[ROUGE] += v[ROUGE];
- if (col[ROUGE]>255) {
- col[ROUGE]=255; v[ROUGE] = - (rand () % 4) - 1;
+ cycle++;
+ if (cycle >= 80)
+ cycle = 0;
+
+ if (cycle < 40)
+ cycle10 = cycle / 10;
+ else
+ cycle10 = 7 - cycle / 10;
+
+ {
+ unsigned char *tmp = (unsigned char *) &couleursl;
+
+ for (i = 0; i < 4; i++) {
+ *tmp = (*tmp) >> cycle10;
+ tmp++;
+ }
}
- if (col[ROUGE]>col[VERT]+40) {
- col[ROUGE]=col[VERT]+40; v[ROUGE] = - (rand () % 4) - 1;
+
+ points = draw_ifs (&nbpt);
+ nbpt--;
+
+#ifdef MMX
+ if (use_asm)
+ ifs_fun_mmx(data, back, width, height, increment, nbpt, points, couleursl);
+ else
+ ifs_fun_c(data, back, width, height, increment, nbpt, points, couleursl);
+#else
+ ifs_fun_c(data, back, width, height, increment, nbpt, points, couleursl);
+#endif /*MMX*/
+ justChanged--;
+
+ col[ALPHA] = couleur >> (ALPHA * 8) & 0xff;
+ col[BLEU] = couleur >> (BLEU * 8) & 0xff;
+ col[VERT] = couleur >> (VERT * 8) & 0xff;
+ col[ROUGE] = couleur >> (ROUGE * 8) & 0xff;
+
+ if (mode == MOD_MER) {
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 255) {
+ col[BLEU] = 255;
+ v[BLEU] = -(rand () % 4) - 1;
+ }
+ if (col[BLEU] < 32) {
+ col[BLEU] = 32;
+ v[BLEU] = (rand () % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(rand () % 3) - 2;
+ }
+ if (col[VERT] > col[BLEU]) {
+ col[VERT] = col[BLEU];
+ v[VERT] = v[BLEU];
+ }
+ if (col[VERT] < 32) {
+ col[VERT] = 32;
+ v[VERT] = (rand () % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 64) {
+ col[ROUGE] = 64;
+ v[ROUGE] = -(rand () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (rand () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = -(rand () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (rand () % 4) + 1;
+ }
+
+ if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+ && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+ && (rand () % 20 == 0)) && (justChanged < 0)) {
+ mode = rand () % 3 ? MOD_FEU : MOD_MERVER;
+ justChanged = 250;
+ }
}
- if (col[ROUGE]<0) {
- col[ROUGE]=0; v[ROUGE] = (rand () % 4) + 1;
+ else if (mode == MOD_MERVER) {
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 128) {
+ col[BLEU] = 128;
+ v[BLEU] = -(rand () % 4) - 1;
+ }
+ if (col[BLEU] < 16) {
+ col[BLEU] = 16;
+ v[BLEU] = (rand () % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(rand () % 3) - 2;
+ }
+ if (col[VERT] > col[ALPHA]) {
+ col[VERT] = col[ALPHA];
+ v[VERT] = v[ALPHA];
+ }
+ if (col[VERT] < 32) {
+ col[VERT] = 32;
+ v[VERT] = (rand () % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 128) {
+ col[ROUGE] = 128;
+ v[ROUGE] = -(rand () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (rand () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 255) {
+ col[ALPHA] = 255;
+ v[ALPHA] = -(rand () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (rand () % 4) + 1;
+ }
+
+ if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
+ && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
+ && (rand () % 20 == 0)) && (justChanged < 0)) {
+ mode = rand () % 3 ? MOD_FEU : MOD_MER;
+ justChanged = 250;
+ }
}
+ else if (mode == MOD_FEU) {
+
+ col[BLEU] += v[BLEU];
+ if (col[BLEU] > 64) {
+ col[BLEU] = 64;
+ v[BLEU] = -(rand () % 4) - 1;
+ }
+ if (col[BLEU] < 0) {
+ col[BLEU] = 0;
+ v[BLEU] = (rand () % 4) + 1;
+ }
+
+ col[VERT] += v[VERT];
+ if (col[VERT] > 200) {
+ col[VERT] = 200;
+ v[VERT] = -(rand () % 3) - 2;
+ }
+ if (col[VERT] > col[ROUGE] + 20) {
+ col[VERT] = col[ROUGE] + 20;
+ v[VERT] = -(rand () % 3) - 2;
+ v[ROUGE] = (rand () % 4) + 1;
+ v[BLEU] = (rand () % 4) + 1;
+ }
+ if (col[VERT] < 0) {
+ col[VERT] = 0;
+ v[VERT] = (rand () % 3) + 2;
+ }
+
+ col[ROUGE] += v[ROUGE];
+ if (col[ROUGE] > 255) {
+ col[ROUGE] = 255;
+ v[ROUGE] = -(rand () % 4) - 1;
+ }
+ if (col[ROUGE] > col[VERT] + 40) {
+ col[ROUGE] = col[VERT] + 40;
+ v[ROUGE] = -(rand () % 4) - 1;
+ }
+ if (col[ROUGE] < 0) {
+ col[ROUGE] = 0;
+ v[ROUGE] = (rand () % 4) + 1;
+ }
+
+ col[ALPHA] += v[ALPHA];
+ if (col[ALPHA] > 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = -(rand () % 4) - 1;
+ }
+ if (col[ALPHA] < 0) {
+ col[ALPHA] = 0;
+ v[ALPHA] = (rand () % 4) + 1;
+ }
- col[ALPHA] += v[ALPHA];
- if (col[ALPHA]>0) {
- col[ALPHA]=0; v[ALPHA] = - (rand () % 4) - 1;
- }
- if (col[ALPHA]<0) {
- col[ALPHA]=0; v[ALPHA] = (rand () % 4) + 1;
- }
-
- if (((col [ROUGE] < 64) && (col [VERT] > 32) && (col [VERT] < col [BLEU]) && (col [BLEU] > 32)
- && (rand () % 20 == 0)) && (justChanged < 0)) {
- mode = rand () % 2 ? MOD_MER : MOD_MERVER;
- justChanged = 250;
+ if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU])
+ && (col[BLEU] > 32)
+ && (rand () % 20 == 0)) && (justChanged < 0)) {
+ mode = rand () % 2 ? MOD_MER : MOD_MERVER;
+ justChanged = 250;
+ }
}
- }
- couleur = (col[ALPHA]<<(ALPHA*8))
- |(col[BLEU]<<(BLEU*8))
- |(col[VERT]<<(VERT*8))
- |(col[ROUGE]<<(ROUGE*8));
+ couleur = (col[ALPHA] << (ALPHA * 8))
+ | (col[BLEU] << (BLEU * 8))
+ | (col[VERT] << (VERT * 8))
+ | (col[ROUGE] << (ROUGE * 8));
}