@@ 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;