@@ 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) {