Browse Source

Cleanup

main
Devine Lu Linvega 6 years ago
parent
commit
b7f3644550
  1. 110
      nasu.c

110
nasu.c

@ -51,46 +51,17 @@ distance(int ax, int ay, int bx, int by)
return (bx - ax) * (bx - ax) + (by - ay) * (by - ay);
}
void
edit(uint32_t* dst, int id, int color)
{
int ti = id / 64;
int odd = (ti + (ti / HOR + 2)) % 2 == 0;
int px = (ti / (HOR * VER)) * (8 * HOR) + (ti % HOR) * 8 + (id % 8);
int py = ((ti / HOR) * 8) + ((id % 64) / 8);
dst[(py + PAD) * WIDTH + (px + PAD)] = colors[GUIDES && odd && color == 0 ? 4 : color];
}
void
redraw(uint32_t* dst)
{
int b, i, j, id = 0;
for(b = 0; b < SZ; b += 16)
for(i = 0; i < 8; i++)
for(j = 7; j >= 0; j--) {
int ch1 = chrbuf[b + i];
int ch2 = chrbuf[b + i + 8];
int color = ((ch1 >> j) & 0x1) + (((ch2 >> j) & 0x1) << 1);
edit(dst, id, color);
id++;
}
SDL_UpdateTexture(gTexture, NULL, dst, WIDTH * sizeof(uint32_t));
SDL_RenderClear(gRenderer);
SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
SDL_RenderPresent(gRenderer);
}
int
row(int x, int y)
rowchr(int x, int y)
{
return (y % 8) + ((x / 8 + y / 8 * HOR) * 16);
}
int
get(int x, int y)
getchr(int x, int y)
{
int ch1, ch2;
int r = row(x, y);
int r = rowchr(x, y);
int px = x % 8;
if(r < 0 || r > SZ - 8)
return 0;
@ -100,9 +71,9 @@ get(int x, int y)
}
void
put(int x, int y, int color)
putchr(int x, int y, int color)
{
int r = row(x, y);
int r = rowchr(x, y);
int px = x % 8;
if(x < 0 || y < 0 || x > 8 * HOR || y > 8 * VER || r > SZ - 8)
return;
@ -124,11 +95,11 @@ put(int x, int y, int color)
int
jagg(int x, int y)
{
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);
int n = getchr(x, y + 1);
int e = getchr(x + 1, y);
int s = getchr(x, y - 1);
int w = getchr(x - 1, y);
int h = getchr(x, y);
if(h == n && h == e && h != s && h != w)
return 1;
if(h == e && h == s && h != w && h != n)
@ -165,10 +136,9 @@ fill(int x, int y, int mode, int size, int color)
for(ox = x - (size / 2); ox < x + size; ++ox)
for(oy = y - (size / 2); oy < y + size; ++oy)
if(mode == 7 && jagg(ox, oy))
put(ox, oy, 0);
putchr(ox, oy, 0);
else if(patt(ox, oy, mode, size) && distance(x, y, ox, oy) < size)
put(ox, oy, color);
redraw(pixels);
putchr(ox, oy, color);
}
void
@ -178,7 +148,7 @@ line(int ax, int ay, int bx, int by, int color)
int dy = -abs(by - ay), sy = ay < by ? 1 : -1;
int err = dx + dy, e2;
for(;;) {
put(ax, ay, color);
putchr(ax, ay, color);
if(ax == bx && ay == by)
break;
e2 = 2 * err;
@ -191,7 +161,29 @@ line(int ax, int ay, int bx, int by, int color)
ay += sy;
}
}
redraw(pixels);
}
void
draw(uint32_t* dst)
{
int b, i, j, id = 0;
for(b = 0; b < SZ; b += 16)
for(i = 0; i < 8; i++)
for(j = 7; j >= 0; j--) {
int ch1 = chrbuf[b + i];
int ch2 = chrbuf[b + i + 8];
int color = ((ch1 >> j) & 0x1) + (((ch2 >> j) & 0x1) << 1);
int ti = id / 64;
int odd = (ti + (ti / HOR + 2)) % 2 == 0;
int px = (ti / (HOR * VER)) * (8 * HOR) + (ti % HOR) * 8 + (id % 8);
int py = ((ti / HOR) * 8) + ((id % 64) / 8);
dst[(py + PAD) * WIDTH + (px + PAD)] = colors[GUIDES && odd && color == 0 ? 4 : color];
id++;
}
SDL_UpdateTexture(gTexture, NULL, dst, WIDTH * sizeof(uint32_t));
SDL_RenderClear(gRenderer);
SDL_RenderCopy(gRenderer, gTexture, NULL, NULL);
SDL_RenderPresent(gRenderer);
}
void
@ -222,17 +214,6 @@ create(void)
int i;
for(i = 0; i < SZ; ++i)
chrbuf[i] = 0x00;
redraw(pixels);
}
void
tochr(Brush* b)
{
FILE* f = fopen("export.chr", "wb");
if(!fwrite(chrbuf, sizeof(chrbuf), 1, f))
error("Save", "Invalid output file");
fclose(f);
b->edit = 0;
}
void
@ -244,7 +225,16 @@ load(char* path)
if(!fread(chrbuf, sizeof(chrbuf), 1, f))
error("Load", "Invalid input size");
fclose(f);
redraw(pixels);
}
void
tochr(Brush* b)
{
FILE* f = fopen("nasu-export.chr", "wb");
if(!fwrite(chrbuf, sizeof(chrbuf), 1, f))
error("Save", "Invalid output file");
fclose(f);
b->edit = 0;
}
void
@ -252,13 +242,13 @@ tobmp(void)
{
SDL_Surface* surface = SDL_GetWindowSurface(gWindow);
GUIDES = 0;
redraw(pixels);
draw(pixels);
SDL_RenderReadPixels(gRenderer,
NULL,
SDL_PIXELFORMAT_ARGB8888,
surface->pixels,
surface->pitch);
SDL_SaveBMP(surface, "render.bmp");
SDL_SaveBMP(surface, "nasu-render.bmp");
SDL_FreeSurface(surface);
}
@ -307,6 +297,7 @@ domouse(SDL_Event* event, Brush* b)
line(b->px, b->py, b->x, b->y, b->erase ? 0 : b->color);
else
fill(b->x, b->y, b->mode, b->size, b->erase ? 0 : b->color);
draw(pixels);
b->px = b->x;
b->py = b->y;
}
@ -332,7 +323,7 @@ dokey(SDL_Event* event, Brush* b)
break;
case SDLK_h:
GUIDES = !GUIDES;
redraw(pixels);
draw(pixels);
break;
case SDLK_n:
create();
@ -424,6 +415,7 @@ main(int argc, char** argv)
load(argv[1]);
else
create();
draw(pixels);
update(&brush);
while(1) {

Loading…
Cancel
Save