henesyinit from p9fce6d0435 years agoHistory
159 lines · 2.8 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <libg.h>#include "dat.h" /* * Rand is huge and not worth it here.  Be small.  Borrowed from the white book. */ulong	randn;voidsrand(long n){	randn = n;} intnrand(int n){	randn = randn*1103515245 + 12345;	return (randn>>16) % n;} voidspecial(SRC *A, SRC *B){	int x, y, k, K, dk, ek;	SRC pic, *From, *To; 	if(nrand(2)){		K = 0;		ek = MAXX/2;		dk = 1;		From = A;		To = B;	}else{		K = MAXX/2;		ek = 0;		dk = -1;		From = B;		To = A;		memmove(&pic, From, sizeof(SRC));	}	for(k=K; k!=ek; k+=dk){		for(y=0; y<k; y++)		for(x=0; x<k; x++){			From->pix[y][x] = To->pix[MAXY/2-k+y][MAXX/2-k+x];			From->pix[y][MAXX-k+x] = To->pix[y][MAXX/2+x];			From->pix[MAXY-k+y][x] = To->pix[MAXY/2+y][x];			From->pix[MAXY-k+y][MAXX-k+x] = To->pix[MAXY/2+y][MAXX/2+x];		}		showimage(From, 0);		if(ek == 0)			memmove(From, &pic, sizeof(SRC));	}} voidwipe(SRC *From, SRC *To){	int x, y, k; 	showimage(From, 1);	if(nrand(2)){		dive(From, To);		return;	}	switch(nrand(6)){	case 0:		for(x = 0; x < MAXX; x++){			for(y = 0; y < MAXY; y++)				From->pix[y][x] = To->pix[y][x];			showimage(From, 0);		}		break;	case 1:		for(y = 0; y < MAXY; y++){			memmove(From->pix[y], To->pix[y], MAXX);			showimage(From, 0);		}		break;	case 2:		for(x = MAXX-1; x >= 0; x--){			for(y = 0; y < MAXY; y++)				From->pix[y][x] = To->pix[y][x];			showimage(From, 0);		}		break;	case 3:		for(y = MAXY-1; y >= 0; y--){			memmove(From->pix[y], To->pix[y], MAXX);			showimage(From, 0);		}		break;	case 4:		special(From, To);		break;	case 5:		for(k = 0; k < 2*MAXX; k++){			int Y, Z;			Y = Min(MAXY, k);			for(y = 0; y < Y; y++){				if(k < MAXX)					for(Z=k-1,x=0 ; x < k-y; x++,Z--)						From->pix[y][x] = To->pix[Z][MAXX-1-y];				else if(y < k-MAXX)					for(x = 0; x < MAXX; x++)						From->pix[y][x] = To->pix[y][x];				else{					for(x = 0; x < k-MAXX; x++)						From->pix[y][x] = To->pix[y][x];					for(Z=MAXY-1 ; x < k-y; x++,Z--)						From->pix[y][x] = To->pix[Z][MAXX-1-y+(k-MAXX)];				}			}			showimage(From, 0);		}		break;	default:		abort();	}} voidtwirl(SRC *From, SRC *To){	int y, cnt; 	for(cnt=0; cnt<MAXY; cnt++){		for(y=0; y<MAXY; y++)			memmove(From->pix[y], To->pix[(y+cnt)%MAXY], MAXX);		showimage(From, 0);	}} voiddive(SRC *From, SRC *To){	int y, k;	SRC pic; 	USED(From);	memmove(&pic, To, sizeof(SRC));	for(k=0; k<MAXY; k++){		for(y=0; y<k; y++)			memmove(To->pix[y], pic.pix[k-y], MAXX);		for(y=k; y<MAXY; y++)			memmove(To->pix[y], pic.pix[y-k], MAXX);		showimage(To, 0);	}	for(k=0; k<MAXY; k++){		for(y=0; y<=k; y++)			memmove(To->pix[MAXY-1-y], pic.pix[k-y], MAXX);		for(y=k+1; k+y < MAXY; y++)			memmove(To->pix[MAXY-1-y], pic.pix[k+y], MAXX);		for( ; y<MAXY; y++)			memset(To->pix[MAXY-1-y], 0, MAXX);		showimage(To, 0);	}}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t