00001 #include "ifs.h"
00002 #include "goomconfig.h"
00003
00004 #ifdef MMX
00005 #include "mmx.h"
00006 #endif
00007
00008 #include "goom_tools.h"
00009
00010 void
00011 ifs_update (guint32 * data, guint32 * back, int width, int height,
00012 int increment)
00013 {
00014 static int couleur = 0xc0c0c0c0;
00015 static int v[4] = { 2, 4, 3, 2 };
00016 static int col[4] = { 2, 4, 3, 2 };
00017
00018 #define MOD_MER 0
00019 #define MOD_FEU 1
00020 #define MOD_MERVER 2
00021 static int mode = MOD_MERVER;
00022 static int justChanged = 0;
00023 static int cycle = 0;
00024 int cycle10;
00025
00026 int nbpt;
00027 IFSPoint *points;
00028 int i;
00029
00030 int couleursl = couleur;
00031
00032 cycle++;
00033 if (cycle >= 80)
00034 cycle = 0;
00035
00036 if (cycle < 40)
00037 cycle10 = cycle / 10;
00038 else
00039 cycle10 = 7 - cycle / 10;
00040
00041 {
00042 unsigned char *tmp = (unsigned char *) &couleursl;
00043
00044 for (i = 0; i < 4; i++) {
00045 *tmp = (*tmp) >> cycle10;
00046 tmp++;
00047 }
00048 }
00049
00050 points = draw_ifs (&nbpt);
00051 nbpt--;
00052
00053 #ifdef MMX
00054 movd_m2r (couleursl, mm1);
00055 punpckldq_r2r (mm1, mm1);
00056 for (i = 0; i < nbpt; i += increment) {
00057 int x = points[i].x;
00058 int y = points[i].y;
00059
00060 if ((x < width) && (y < height) && (x > 0) && (y > 0)) {
00061 int pos = x + (y * width);
00062 movd_m2r (back[pos], mm0);
00063 paddusb_r2r (mm1, mm0);
00064 movd_r2m (mm0, data[pos]);
00065 }
00066 }
00067 emms();
00068 #else
00069 for (i = 0; i < nbpt; i += increment) {
00070 int x = (int) points[i].x & 0x7fffffff;
00071 int y = (int) points[i].y & 0x7fffffff;
00072
00073 if ((x < width) && (y < height)) {
00074 int pos = x + (int) (y * width);
00075 int tra = 0, i = 0;
00076 unsigned char *bra = (unsigned char *) &back[pos];
00077 unsigned char *dra = (unsigned char *) &data[pos];
00078 unsigned char *cra = (unsigned char *) &couleursl;
00079
00080 for (; i < 4; i++) {
00081 tra = *cra;
00082 tra += *bra;
00083 if (tra > 255)
00084 tra = 255;
00085 *dra = tra;
00086 ++dra;
00087 ++cra;
00088 ++bra;
00089 }
00090 }
00091 }
00092 #endif
00093 justChanged--;
00094
00095 col[ALPHA] = couleur >> (ALPHA * 8) & 0xff;
00096 col[BLEU] = couleur >> (BLEU * 8) & 0xff;
00097 col[VERT] = couleur >> (VERT * 8) & 0xff;
00098 col[ROUGE] = couleur >> (ROUGE * 8) & 0xff;
00099
00100 if (mode == MOD_MER) {
00101 col[BLEU] += v[BLEU];
00102 if (col[BLEU] > 255) {
00103 col[BLEU] = 255;
00104 v[BLEU] = -(RAND() % 4) - 1;
00105 }
00106 if (col[BLEU] < 32) {
00107 col[BLEU] = 32;
00108 v[BLEU] = (RAND() % 4) + 1;
00109 }
00110
00111 col[VERT] += v[VERT];
00112 if (col[VERT] > 200) {
00113 col[VERT] = 200;
00114 v[VERT] = -(RAND() % 3) - 2;
00115 }
00116 if (col[VERT] > col[BLEU]) {
00117 col[VERT] = col[BLEU];
00118 v[VERT] = v[BLEU];
00119 }
00120 if (col[VERT] < 32) {
00121 col[VERT] = 32;
00122 v[VERT] = (RAND() % 3) + 2;
00123 }
00124
00125 col[ROUGE] += v[ROUGE];
00126 if (col[ROUGE] > 64) {
00127 col[ROUGE] = 64;
00128 v[ROUGE] = -(RAND () % 4) - 1;
00129 }
00130 if (col[ROUGE] < 0) {
00131 col[ROUGE] = 0;
00132 v[ROUGE] = (RAND () % 4) + 1;
00133 }
00134
00135 col[ALPHA] += v[ALPHA];
00136 if (col[ALPHA] > 0) {
00137 col[ALPHA] = 0;
00138 v[ALPHA] = -(RAND () % 4) - 1;
00139 }
00140 if (col[ALPHA] < 0) {
00141 col[ALPHA] = 0;
00142 v[ALPHA] = (RAND () % 4) + 1;
00143 }
00144
00145 if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
00146 && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
00147 && (RAND () % 20 == 0)) && (justChanged < 0)) {
00148 mode = (RAND () % 3) ? MOD_FEU : MOD_MERVER;
00149 justChanged = 250;
00150 }
00151 }
00152 else if (mode == MOD_MERVER) {
00153 col[BLEU] += v[BLEU];
00154 if (col[BLEU] > 128) {
00155 col[BLEU] = 128;
00156 v[BLEU] = -(RAND () % 4) - 1;
00157 }
00158 if (col[BLEU] < 16) {
00159 col[BLEU] = 16;
00160 v[BLEU] = (RAND () % 4) + 1;
00161 }
00162
00163 col[VERT] += v[VERT];
00164 if (col[VERT] > 200) {
00165 col[VERT] = 200;
00166 v[VERT] = -(RAND () % 3) - 2;
00167 }
00168 if (col[VERT] > col[ALPHA]) {
00169 col[VERT] = col[ALPHA];
00170 v[VERT] = v[ALPHA];
00171 }
00172 if (col[VERT] < 32) {
00173 col[VERT] = 32;
00174 v[VERT] = (RAND () % 3) + 2;
00175 }
00176
00177 col[ROUGE] += v[ROUGE];
00178 if (col[ROUGE] > 128) {
00179 col[ROUGE] = 128;
00180 v[ROUGE] = -(RAND () % 4) - 1;
00181 }
00182 if (col[ROUGE] < 0) {
00183 col[ROUGE] = 0;
00184 v[ROUGE] = (RAND () % 4) + 1;
00185 }
00186
00187 col[ALPHA] += v[ALPHA];
00188 if (col[ALPHA] > 255) {
00189 col[ALPHA] = 255;
00190 v[ALPHA] = -(RAND () % 4) - 1;
00191 }
00192 if (col[ALPHA] < 0) {
00193 col[ALPHA] = 0;
00194 v[ALPHA] = (RAND () % 4) + 1;
00195 }
00196
00197 if (((col[VERT] > 32) && (col[ROUGE] < col[VERT] + 40)
00198 && (col[VERT] < col[ROUGE] + 20) && (col[BLEU] < 64)
00199 && (RAND () % 20 == 0)) && (justChanged < 0)) {
00200 mode = (RAND () % 3) ? MOD_FEU : MOD_MER;
00201 justChanged = 250;
00202 }
00203 }
00204 else if (mode == MOD_FEU) {
00205
00206 col[BLEU] += v[BLEU];
00207 if (col[BLEU] > 64) {
00208 col[BLEU] = 64;
00209 v[BLEU] = -(RAND () % 4) - 1;
00210 }
00211 if (col[BLEU] < 0) {
00212 col[BLEU] = 0;
00213 v[BLEU] = (RAND () % 4) + 1;
00214 }
00215
00216 col[VERT] += v[VERT];
00217 if (col[VERT] > 200) {
00218 col[VERT] = 200;
00219 v[VERT] = -(RAND () % 3) - 2;
00220 }
00221 if (col[VERT] > col[ROUGE] + 20) {
00222 col[VERT] = col[ROUGE] + 20;
00223 v[VERT] = -(RAND () % 3) - 2;
00224 v[ROUGE] = (RAND () % 4) + 1;
00225 v[BLEU] = (RAND () % 4) + 1;
00226 }
00227 if (col[VERT] < 0) {
00228 col[VERT] = 0;
00229 v[VERT] = (RAND () % 3) + 2;
00230 }
00231
00232 col[ROUGE] += v[ROUGE];
00233 if (col[ROUGE] > 255) {
00234 col[ROUGE] = 255;
00235 v[ROUGE] = -(RAND () % 4) - 1;
00236 }
00237 if (col[ROUGE] > col[VERT] + 40) {
00238 col[ROUGE] = col[VERT] + 40;
00239 v[ROUGE] = -(RAND () % 4) - 1;
00240 }
00241 if (col[ROUGE] < 0) {
00242 col[ROUGE] = 0;
00243 v[ROUGE] = (RAND () % 4) + 1;
00244 }
00245
00246 col[ALPHA] += v[ALPHA];
00247 if (col[ALPHA] > 0) {
00248 col[ALPHA] = 0;
00249 v[ALPHA] = -(RAND () % 4) - 1;
00250 }
00251 if (col[ALPHA] < 0) {
00252 col[ALPHA] = 0;
00253 v[ALPHA] = (RAND () % 4) + 1;
00254 }
00255
00256 if (((col[ROUGE] < 64) && (col[VERT] > 32) && (col[VERT] < col[BLEU])
00257 && (col[BLEU] > 32)
00258 && (RAND () % 20 == 0)) && (justChanged < 0)) {
00259 mode = (RAND () % 2) ? MOD_MER : MOD_MERVER;
00260 justChanged = 250;
00261 }
00262 }
00263
00264 couleur = (col[ALPHA] << (ALPHA * 8))
00265 | (col[BLEU] << (BLEU * 8))
00266 | (col[VERT] << (VERT * 8))
00267 | (col[ROUGE] << (ROUGE * 8));
00268 }