~rabbits/nasu

93bd25b63502f5874d080a09ad854379adf24986 — Devine Lu Linvega 2 years ago 351eec5
Implemented cleanup
2 files changed, 62 insertions(+), 16 deletions(-)

M README.md
M nasu.c
M README.md => README.md +1 -0
@@ 27,6 27,7 @@ To resume working on a tileset:

### General

- `~` Fix
- `1-7` Patterns
- `TAB` Cycle between colors
- `H` Toggle Guides

M nasu.c => nasu.c +61 -16
@@ 36,13 36,14 @@ char* modes[] = {
    "full",
    "hori",
    "veri",
    "exes"};
    "exes",
    "fixe"};

unsigned char buffer[SZ];
int colors[] = {color1, color2, color3, color4, color0};
int WIDTH = 8 * HOR * ZOOM + PAD * 2;
int HEIGHT = 8 * VER * ZOOM + PAD * 2;
int FPS = 30;
int FPS = 15;
int GUIDES = 1;
SDL_Window* gWindow = NULL;
SDL_Renderer* gRenderer = NULL;


@@ 107,12 108,27 @@ redraw(uint32_t* dst)
	SDL_RenderPresent(gRenderer);
}

int
get(int x, int y)
{
	int ch1, ch2;
	int id = (x / 8) + (y / 8) * HOR;
	int row = (y % 8) + (id * 16);
	int px = x % 8;
	if(row < 0 || row > SZ - 8)
		return 0;
	ch1 = (buffer[row] >> (7 - px)) & 1;
	ch2 = (buffer[row + 8] >> (7 - px)) & 1;
	return ch1 && !ch2 ? 1 : !ch1 && ch2 ? 2 : ch1 && ch2 ? 3 : 0;
}

void
write(int tx, int ty, int px, int py, int color)
put(int x, int y, int color)
{
	int id = tx + ty * HOR;
	int row = py + (id * 16);
	if(row > SZ - 8)
	int id = (x / 8) + (y / 8) * HOR;
	int row = (y % 8) + (id * 16);
	int px = x % 8;
	if(x < 0 || y < 0 || x > 8 * HOR || y > 8 * VER || row > SZ - 8)
		return;
	if(color == 0) {
		buffer[row] &= ~(1UL << (7 - px));


@@ 129,12 145,23 @@ write(int tx, int ty, int px, int py, int color)
	}
}

void
edit(int x, int y, int color)
int
jagg(int x, int y)
{
	if(x < 0 || y < 0 || x > 8 * HOR || y > 8 * VER)
		return;
	write(x / 8, y / 8, x % 8, y % 8, color);
	int n = get(x, y + 1);
	int e = get(x + 1, y);
	int s = get(x, y - 1);
	int w = get(x - 1, y);
	int h = get(x, y);
	if(h == n && h == e && h != s && h != w)
		return 1;
	if(h == e && h == s && h != w && h != n)
		return 1;
	if(h == s && h == w && h != n && h != e)
		return 1;
	if(h == w && h == n && h != e && h != s)
		return 1;
	return 0;
}

int


@@ 156,7 183,7 @@ patt(int x, int y, int mode, int size)
}

void
fill(Brush* b, int mode, int size, Point p0, int color)
fill(int mode, int size, Point p0, int color)
{
	int x, y;
	Point p;


@@ 164,9 191,8 @@ fill(Brush* b, int mode, int size, Point p0, int color)
		for(y = -size / 2; y < size; ++y) {
			setpt(&p, p0.x + x, p0.y + y);
			if(patt(p.x, p.y, mode, size) && dispt(&p0, &p) < size)
				edit(p.x, p.y, color);
				put(p.x, p.y, color);
		}
	b->edit = 1;
	redraw(pixels);
}



@@ 177,7 203,7 @@ line(Point* p0, Point* p1, int color)
	int dy = -abs(p1->y - p0->y), sy = p0->y < p1->y ? 1 : -1;
	int err = dx + dy, e2;
	for(;;) {
		edit(p0->x, p0->y, color);
		put(p0->x, p0->y, color);
		if(p0->x == p1->x && p0->y == p1->y)
			break;
		e2 = 2 * err;


@@ 194,6 220,20 @@ line(Point* p0, Point* p1, int color)
}

void
fixe(int size, Point p0)
{
	int x, y;
	Point p;
	for(x = -size / 2; x < size; ++x)
		for(y = -size / 2; y < size; ++y) {
			setpt(&p, p0.x + x, p0.y + y);
			if(jagg(p.x, p.y))
				put(p.x, p.y, 0);
		}
	redraw(pixels);
}

void
update(Brush* b)
{
	char title[512];


@@ 305,8 345,10 @@ domouse(SDL_Event* event, Brush* b)
			      (event->motion.y - PAD) / ZOOM);
			if(b->mode == 0)
				line(&b->prev, &b->pos, b->erase ? 0 : b->color);
			else if(b->mode == 7)
				fixe(b->size, b->pos);
			else
				fill(b, b->mode, b->size, b->pos, b->erase ? 0 : b->color);
				fill(b->mode, b->size, b->pos, b->erase ? 0 : b->color);
			setpt(&b->prev, b->pos.x, b->pos.y);
		}
		break;


@@ 336,6 378,9 @@ dokey(SDL_Event* event, Brush* b)
	case SDLK_n:
		create();
		break;
	case SDLK_BACKQUOTE:
		b->mode = 7;
		break;
	case SDLK_1:
		b->mode = 0;
		break;