/*
 *	fram.c
 *
 *	マンデルブロ集合
 *
 *	* Sun Jul 19 13:19:15 JST 2009 Naoyuki Sawa
 *	- 作成開始。
 */
#include "app.h"

/****************************************************************************
 *	
 ****************************************************************************/

int
idle_proc(int param)
{
	int i;
	int j;
	float a[DISP_X];
	float b[DISP_Y];

	memset(field, 0, sizeof field);
	//memset(wbuff, 0, sizeof wbuff); → クリアしない
	memset(nbuff, 0, sizeof nbuff);

	for(i = 0; i < DISP_Y; i++) {
		b[i] = b0 + (vs / (DISP_Y / 2)) * (i - (DISP_Y / 2));
	}
	for(j = 0; j < DISP_X; j++) {
		a[j] = a0 + (vs / (DISP_Y / 2)) * (j - (DISP_X / 2));
	}

	for(;;) {
		CELL* cell = &field[0][0];
		unsigned  char* pw = wbuff;
		unsigned short* pn = nbuff;
		for(i = 0; i < DISP_Y; i++) {
			for(j = 0; j < DISP_X; j++) {
				/* まだ発散していなければ… */
				if(*pn != USHRT_MAX) {
					float xx = cell->xx;
					float yy = cell->yy;
					float xy = cell->xy;
					float x = xx - yy + a[j];
					float y =  2 * xy + b[i];
					cell->xx = x * x;
					cell->yy = y * y;
					cell->xy = x * y;
					if(cell->xx + cell->yy <= 4.0f) {
						/* まだ発散していない */
						if(*pw < 15) {
							*pw += 1;
						}
						*pn += 1; /* USHRT_MAXになっても構わない */
					} else {
						/* 発散した */
						*pw = ~*pn & 15;
						*pn = USHRT_MAX;
					}
				}
				cell++;
				pw++;
				pn++;
			}
		}
	}

	return 0;
}

