📄 ifs.c
字号:
int i; DBL u, uu, v, vv, u0, u1, u2, u3; SIMI *S, *S1, *S2, *S3, *S4; FRACTAL *F; if (data->Root == NULL) return NULL; F = data->Root; if (F->Buffer1 == NULL) return NULL; u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0; uu = u * u; v = 1.0 - u; vv = v * v; u0 = vv * v; u1 = 3.0 * vv * u; u2 = 3.0 * v * uu; u3 = u * uu; S = F->Components; S1 = S + F->Nb_Simi; S2 = S1 + F->Nb_Simi; S3 = S2 + F->Nb_Simi; S4 = S3 + F->Nb_Simi; for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x; S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y; S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r; S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2; S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A; S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2; } Draw_Fractal (data); if (F->Count >= 1000 / F->Speed) { S = F->Components; S1 = S + F->Nb_Simi; S2 = S1 + F->Nb_Simi; S3 = S2 + F->Nb_Simi; S4 = S3 + F->Nb_Simi; for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) { S2->c_x = 2.0 * S4->c_x - S3->c_x; S2->c_y = 2.0 * S4->c_y - S3->c_y; S2->r = 2.0 * S4->r - S3->r; S2->r2 = 2.0 * S4->r2 - S3->r2; S2->A = 2.0 * S4->A - S3->A; S2->A2 = 2.0 * S4->A2 - S3->A2; *S1 = *S4; } Random_Simis (goomInfo, F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi); Random_Simis (goomInfo, F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi); F->Count = 0; } else F->Count++; F->Col++; (*nbpt) = data->Cur_Pt; return F->Buffer2;}/***************************************************************/static void release_ifs (IfsData *data){ if (data->Root != NULL) { free_ifs (data->Root); (void) free ((void *) data->Root); data->Root = (FRACTAL *) NULL; }}#define RAND() goom_random(goomInfo->gRandom)static void ifs_update (PluginInfo *goomInfo, Pixel * data, Pixel * back, int increment, IfsData *fx_data){ 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; int couleursl = couleur; int width = goomInfo->screen.width; int height = goomInfo->screen.height; 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; /* xine: make it darker */ if( *tmp && !((*tmp) >> 1) ) *tmp = 1; else *tmp = (*tmp) >> 1; tmp++; } } points = draw_ifs (goomInfo, &nbpt, fx_data); nbpt--;#ifdef HAVE_MMX movd_m2r (couleursl, mm1); punpckldq_r2r (mm1, mm1); 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); movd_m2r (back[pos], mm0); paddusb_r2r (mm1, mm0); movd_r2m (mm0, data[pos]); } } emms();/*__asm__ __volatile__ ("emms");*/#else 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); 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; for (; i < 4; i++) { tra = *cra; tra += *bra; if (tra > 255) tra = 255; *dra = tra; ++dra; ++cra; ++bra; } } }#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; } } 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; } 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));}/** VISUAL_FX WRAPPER FOR IFS */static void ifs_vfx_apply(VisualFX *_this, Pixel *src, Pixel *dest, PluginInfo *goomInfo) { IfsData *data = (IfsData*)_this->fx_data; if (!data->initalized) { data->initalized = 1; init_ifs(goomInfo, data); } ifs_update (goomInfo, dest, src, goomInfo->update.ifs_incr, data); /*TODO: trouver meilleur soluce pour increment (mettre le code de gestion de l'ifs dans ce fichier: ifs_vfx_apply) */}static void ifs_vfx_init(VisualFX *_this, PluginInfo *info) { IfsData *data = (IfsData*)malloc(sizeof(IfsData)); data->Root = (FRACTAL*)NULL; data->initalized = 0; _this->fx_data = data;}static void ifs_vfx_free(VisualFX *_this) { IfsData *data = (IfsData*)_this->fx_data; release_ifs(data); free(data);}VisualFX ifs_visualfx_create(void) { VisualFX vfx = {0}; vfx.init = ifs_vfx_init; vfx.free = ifs_vfx_free; vfx.apply = ifs_vfx_apply; return vfx;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -