⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ifs.c

📁 linux下的MPEG1
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -