|
|
|
|
@ -24,7 +24,8 @@ typedef struct Brush {
|
|
|
|
|
static int SCREEN_WIDTH = 512; |
|
|
|
|
static int SCREEN_HEIGHT = 512; |
|
|
|
|
static int FPS = 30; |
|
|
|
|
int ZOOM = 1; |
|
|
|
|
int ZOOM = 4; |
|
|
|
|
int clr = 0xFF0000; |
|
|
|
|
|
|
|
|
|
uint32_t* pixels; |
|
|
|
|
|
|
|
|
|
@ -44,63 +45,17 @@ setpt(Point* p, int x, int y)
|
|
|
|
|
|
|
|
|
|
/* noodle */ |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
patt(int mode, int size, Point p) |
|
|
|
|
{ |
|
|
|
|
if(mode == 1) |
|
|
|
|
return ((p.x + p.y) % 4) == 0 && ((p.y - p.x) % 4) == 0; |
|
|
|
|
if(mode == 2) |
|
|
|
|
return ((p.x + p.y) % 2) == 0 && ((p.y - p.x) % 2) == 0; |
|
|
|
|
if(mode == 3) |
|
|
|
|
return 1; |
|
|
|
|
if(mode == 4) |
|
|
|
|
return p.y % size == 0; |
|
|
|
|
if(mode == 5) |
|
|
|
|
return p.x % size == 0; |
|
|
|
|
if(mode == 6) |
|
|
|
|
return (p.x + p.y) % size == 0 || (p.x - p.y) % size == 0; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
pixel(uint32_t* dst, Point p, int color) |
|
|
|
|
{ |
|
|
|
|
dst[p.y * SCREEN_WIDTH + p.x] = color; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
line(uint32_t* dst, Point p0, Point p1, int color) |
|
|
|
|
{ |
|
|
|
|
double dx = abs(p1.x - p0.x), sx = p0.x < p1.x ? 1 : -1; |
|
|
|
|
double dy = -abs(p1.y - p0.y), sy = p0.y < p1.y ? 1 : -1; |
|
|
|
|
double err = dx + dy, e2; |
|
|
|
|
for(;;) { |
|
|
|
|
pixel(dst, p0, color); |
|
|
|
|
if(p0.x == p1.x && p0.y == p1.y) |
|
|
|
|
break; |
|
|
|
|
e2 = 2 * err; |
|
|
|
|
if(e2 >= dy) { |
|
|
|
|
err += dy; |
|
|
|
|
p0.x += sx; |
|
|
|
|
} |
|
|
|
|
if(e2 <= dx) { |
|
|
|
|
err += dx; |
|
|
|
|
p0.y += sy; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
fill(uint32_t* dst, int mode, int size, Point p0, int color) |
|
|
|
|
pixel(uint32_t* dst, Point p, int c) |
|
|
|
|
{ |
|
|
|
|
int x, y; |
|
|
|
|
Point p; |
|
|
|
|
for(x = 0; x < size; ++x) |
|
|
|
|
for(y = 0; y < size; ++y) { |
|
|
|
|
setpt(&p, p0.x + x, p0.y + y); |
|
|
|
|
if(patt(mode, size, p)) |
|
|
|
|
pixel(dst, p, color); |
|
|
|
|
p.x *= ZOOM; |
|
|
|
|
p.y *= ZOOM; |
|
|
|
|
for(x = 0; x < ZOOM; ++x) { |
|
|
|
|
for(y = 0; y < ZOOM; ++y) { |
|
|
|
|
dst[(p.y + y) * SCREEN_WIDTH + (p.x + x)] = c; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void export(uint32_t* dst) |
|
|
|
|
@ -108,67 +63,6 @@ void export(uint32_t* dst)
|
|
|
|
|
/* TODO: chr file export */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
title(Brush* b) |
|
|
|
|
{ |
|
|
|
|
/* TODO: Format a title that includes brush mode, brush size, canvas size and offset */ |
|
|
|
|
printf("mode:%d size:%d\n", b->mode, b->size); |
|
|
|
|
if(b->mode == 0) |
|
|
|
|
SDL_SetWindowTitle(gWindow, "noodle(line)"); |
|
|
|
|
else if(b->mode == 1) |
|
|
|
|
SDL_SetWindowTitle(gWindow, "noodle(tone1)"); |
|
|
|
|
else if(b->mode == 2) |
|
|
|
|
SDL_SetWindowTitle(gWindow, "noodle(tone2)"); |
|
|
|
|
else if(b->mode == 3) |
|
|
|
|
SDL_SetWindowTitle(gWindow, "noodle(full)"); |
|
|
|
|
else |
|
|
|
|
SDL_SetWindowTitle(gWindow, "noodle(other)"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
move(Point* p, int x, int y) |
|
|
|
|
{ |
|
|
|
|
int req = 0; |
|
|
|
|
if(p->x != x) { |
|
|
|
|
setpt(p, x, p->y); |
|
|
|
|
req = 1; |
|
|
|
|
} |
|
|
|
|
if(p->y != y) { |
|
|
|
|
setpt(p, p->x, y); |
|
|
|
|
req = 1; |
|
|
|
|
} |
|
|
|
|
/* TODO MOVE DRAWING
|
|
|
|
|
if(req) |
|
|
|
|
debug(b); |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
select(Brush* b, int m, int s) |
|
|
|
|
{ |
|
|
|
|
int req = 0; |
|
|
|
|
if(b->mode != m) { |
|
|
|
|
b->mode = m; |
|
|
|
|
req = 1; |
|
|
|
|
} |
|
|
|
|
if(b->size != s) { |
|
|
|
|
b->size = s; |
|
|
|
|
req = 1; |
|
|
|
|
} |
|
|
|
|
if(req) |
|
|
|
|
title(b); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
zoom(void) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
clean(void) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* SDL */ |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
@ -258,10 +152,7 @@ handle_mouse(SDL_Event* event, Brush* b)
|
|
|
|
|
case SDL_MOUSEMOTION: |
|
|
|
|
if(b->down) { |
|
|
|
|
setpt(&b->pos, event->motion.x, event->motion.y); |
|
|
|
|
if(b->mode == 0) |
|
|
|
|
line(pixels, b->prev, b->pos, b->erase ? 0xffffff : 0x000000); |
|
|
|
|
else |
|
|
|
|
fill(pixels, b->mode, b->size, b->pos, b->erase ? 0xffffff : 0x000000); |
|
|
|
|
pixel(pixels, b->pos, 0xFFFFFF); |
|
|
|
|
setpt(&b->prev, b->pos.x, b->pos.y); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
@ -279,56 +170,18 @@ handle_keypress(SDL_Event* event, Brush* b, Point* o)
|
|
|
|
|
case SDLK_e: |
|
|
|
|
export(pixels); |
|
|
|
|
break; |
|
|
|
|
/* move */ |
|
|
|
|
case SDLK_w: |
|
|
|
|
move(o, o->x, o->y--); |
|
|
|
|
break; |
|
|
|
|
case SDLK_a: |
|
|
|
|
move(o, o->x--, o->y); |
|
|
|
|
break; |
|
|
|
|
case SDLK_s: |
|
|
|
|
move(o, o->x, o->y++); |
|
|
|
|
break; |
|
|
|
|
case SDLK_d: |
|
|
|
|
move(o, o->x++, o->y); |
|
|
|
|
break; |
|
|
|
|
case SDLK_q: |
|
|
|
|
move(o, 0, 0); |
|
|
|
|
break; |
|
|
|
|
/* Mode */ |
|
|
|
|
case SDLK_1: |
|
|
|
|
select(b, 0, b->size); |
|
|
|
|
clr = 0; |
|
|
|
|
break; |
|
|
|
|
case SDLK_2: |
|
|
|
|
select(b, 1, b->size); |
|
|
|
|
clr = 1; |
|
|
|
|
break; |
|
|
|
|
case SDLK_3: |
|
|
|
|
select(b, 2, b->size); |
|
|
|
|
clr = 2; |
|
|
|
|
break; |
|
|
|
|
case SDLK_4: |
|
|
|
|
select(b, 3, b->size); |
|
|
|
|
break; |
|
|
|
|
case SDLK_5: |
|
|
|
|
select(b, 4, b->size); |
|
|
|
|
break; |
|
|
|
|
case SDLK_6: |
|
|
|
|
select(b, 5, b->size); |
|
|
|
|
break; |
|
|
|
|
case SDLK_7: |
|
|
|
|
select(b, 6, b->size); |
|
|
|
|
break; |
|
|
|
|
/* brush */ |
|
|
|
|
case SDLK_z: |
|
|
|
|
select(b, b->mode, b->size - 1); |
|
|
|
|
break; |
|
|
|
|
case SDLK_x: |
|
|
|
|
select(b, b->mode, b->size + 1); |
|
|
|
|
break; |
|
|
|
|
/* Special */ |
|
|
|
|
case SDLK_BACKQUOTE: |
|
|
|
|
zoom(); |
|
|
|
|
case SDLK_SPACE: |
|
|
|
|
clean(); |
|
|
|
|
clr = 3; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -404,9 +257,6 @@ main(int argc, char** argv)
|
|
|
|
|
|
|
|
|
|
load(f); |
|
|
|
|
|
|
|
|
|
select(&brush, 0, 10); |
|
|
|
|
move(&offset, 0, 0); |
|
|
|
|
|
|
|
|
|
/* main game loop */ |
|
|
|
|
|
|
|
|
|
while(1) { |
|
|
|
|
|