@@ 45,15 45,15 @@ Uint32 theme[] = {
0x222222};
Uint8 icons[][8] = {
- {0x38, 0x7c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x00},
- {0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00},
- {0x02, 0x02, 0x04, 0x38, 0x40, 0x80, 0x80, 0x00},
- {0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00},
- {0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x00},
- {0x38, 0x7c, 0xee, 0xd6, 0xee, 0x7c, 0x38, 0x00},
- {0x44, 0xba, 0x44, 0x44, 0x44, 0xba, 0x44, 0x00},
- {0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00},
- {0xee, 0xaa, 0xee, 0x00, 0xee, 0xaa, 0xee, 0x00},
+ {0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00}, /* color:blank */
+ {0x38, 0x7c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x00}, /* color:full */
+ {0x02, 0x02, 0x04, 0x38, 0x40, 0x80, 0x80, 0x00}, /* brush:line */
+ {0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00}, /* brush:pattern0 */
+ {0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x54, 0xaa, 0x00}, /* brush:pattern2 */
+ {0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x22, 0x00}, /* brush:pattern4 */
+ {0x44, 0xba, 0x44, 0x44, 0x44, 0xba, 0x44, 0x00}, /* brush:cleanup */
+ {0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00}, /* view:grid */
+ {0xee, 0x92, 0x82, 0x54, 0x82, 0x92, 0xee, 0x00}, /* view:bigpixels */
{0x00, 0x00, 0x00, 0x82, 0x44, 0x38, 0x00, 0x00}, /* eye open */
{0x00, 0x38, 0x44, 0x92, 0x28, 0x10, 0x00, 0x00} /* eye closed */
};
@@ 65,6 65,12 @@ Uint32 *pixels;
/* helpers */
+int
+clamp(int val, int min, int max)
+{
+ return (val >= min) ? (val <= max) ? val : max : min;
+}
+
char *
scpy(char *src, char *dst, int len)
{
@@ 122,9 128,7 @@ void
putchr(int x, int y, int color)
{
int row = rowchr(x, y), col = x % 8;
- if(x < 0 || x >= HOR * 8)
- return;
- if(y < 0 || y >= VER * 8)
+ if(x < 0 || x >= HOR * 8 || y < 0 || y >= VER * 8)
return;
if(color == 0 || color == 2)
doc.data[row] &= ~(1UL << (7 - col));
@@ 158,11 162,11 @@ jagg(int x, int y)
int
patt(int x, int y, int mode)
{
- if(mode == 1)
+ if(mode == 3)
return ((x + y) % 4) == 0 && ((y - x) % 4) == 0;
if(mode == 2)
return ((x + y) % 2) == 0 && ((y - x) % 2) == 0;
- if(mode == 3)
+ if(mode == 1)
return 1;
return 0;
}
@@ 263,7 267,7 @@ drawicon(Uint32 *dst, int x, int y, Uint8 *icon, int fg, int bg)
void
drawui(Uint32 *dst)
{
- int bottom = VER * 8 + 8;
+ int bottom = HEIGHT - 40;
drawicon(dst, 0, bottom, brush.color == 1 ? icons[1] : icons[0], 1, 0);
drawicon(dst, 8, bottom, brush.color == 2 ? icons[1] : icons[0], 2, 0);
drawicon(dst, 16, bottom, brush.color == 3 ? icons[1] : icons[0], 3, 0);
@@ 312,37 316,30 @@ setmode(int *i, int v)
}
void
-setrange(int *i, int v, int min, int max)
-{
- *i = v < min ? min : v > max ? max
- : v;
- redraw(pixels);
-}
-
-void
-newchr(void)
+makedoc(Document *d, char *name)
{
int i;
for(i = 0; i < SZ; ++i)
- doc.data[i] = 0x00;
- scpy("untitled.chr", doc.name, 256);
- printf("New: %s\n", doc.name);
+ d->data[i] = 0x00;
+ scpy(name, d->name, 256);
+ printf("Made: %s\n", d->name);
redraw(pixels);
}
int
-savechr(void)
+savedoc(Document *d, char *name)
{
- FILE *f = fopen(doc.name, "w");
- if(!fwrite(doc.data, sizeof(doc.data), 1, f))
- return error("Export", "Failure");
+ FILE *f = fopen(name, "w");
+ if(!fwrite(d->data, sizeof(d->data), 1, f))
+ return error("Save", "Failure");
+ scpy(name, d->name, 256);
fclose(f);
- printf("Save: %s\n", doc.name);
+ printf("Saved: %s\n", d->name);
return 1;
}
int
-openchr(char *name)
+opendoc(Document *d, char *name)
{
FILE *f = fopen(name, "r");
if(!f)
@@ 357,7 354,7 @@ openchr(char *name)
}
int
-renderbmp(void)
+savebmp(void)
{
SDL_Surface *surface = SDL_GetWindowSurface(gWindow);
SDL_RenderReadPixels(gRenderer,
@@ 422,25 419,21 @@ domouse(SDL_Event *event)
brush.down = 1;
if(event->button.button == SDL_BUTTON_RIGHT)
brush.erase = 1;
- if(event->button.button == SDL_BUTTON_MIDDLE) {
- brush.erase = 0;
- if(brush.px != 0 && brush.py != 0) {
- brush.x = screenpos(event->motion.x, brush.vx);
- brush.y = screenpos(event->motion.y, brush.vy);
- line(brush.px, brush.py, brush.x, brush.y, brush.erase ? 0 : brush.color);
- redraw(pixels);
- }
- }
+ if(event->button.button == SDL_BUTTON_MIDDLE)
+ line(brush.px, brush.py, screenpos(event->motion.x, brush.vx), screenpos(event->motion.y, brush.vy), brush.erase ? 0 : brush.color);
brush.px = screenpos(event->motion.x, brush.vx);
brush.py = screenpos(event->motion.y, brush.vy);
if(!BIGPIXEL) {
- brush.vx = (brush.px / 8) * 8;
- brush.vy = (brush.py / 8) * 8;
+ brush.vx = clamp((brush.px / 8) * 8, 0, WIDTH - HOR - 2 * PAD * 8);
+ brush.vy = clamp((brush.py / 8) * 8, 0, HEIGHT - VER - 3 * PAD * 8);
}
- if(brush.down && brush.mode == 0) {
- putchr(brush.px, brush.py, brush.erase ? 0 : brush.color);
- redraw(pixels);
+ if(brush.down) {
+ if(brush.mode == 0)
+ putchr(brush.px, brush.py, brush.erase ? 0 : brush.color);
+ else
+ fill(brush.px, brush.py, brush.mode, brush.size, brush.erase ? 0 : brush.color);
}
+ redraw(pixels);
break;
case SDL_MOUSEMOTION:
if(brush.down) {
@@ 466,9 459,9 @@ dokey(SDL_Event *event)
if(ctrl) {
switch(event->key.keysym.sym) {
/* Generic */
- case SDLK_n: newchr(); break;
- case SDLK_r: openchr(doc.name); break;
- case SDLK_s: shift ? renderbmp() : savechr(); break;
+ case SDLK_n: makedoc(&doc, "untitled.chr"); break;
+ case SDLK_r: opendoc(&doc, doc.name); break;
+ case SDLK_s: shift ? savebmp() : savedoc(&doc, doc.name); break;
case SDLK_h: setmode(&GUIDES, !GUIDES); break;
}
} else {
@@ 483,8 476,8 @@ dokey(SDL_Event *event)
case SDLK_f: setmode(&brush.mode, 3); break;
case SDLK_g: setmode(&brush.mode, 4); break;
case SDLK_b: setmode(&BIGPIXEL, !BIGPIXEL); break;
- case SDLK_z: setrange(&brush.size, brush.size - 1, 1, 30); break;
- case SDLK_x: setrange(&brush.size, brush.size + 1, 1, 30); break;
+ case SDLK_z: setmode(&brush.size, brush.size + (brush.size > 1 ? -1 : 0)); break;
+ case SDLK_x: setmode(&brush.size, brush.size + (brush.size < 30 ? 1 : 0)); break;
}
}
}
@@ 527,8 520,8 @@ main(int argc, char **argv)
brush.size = 10;
if(!init())
return error("Init", "Failure");
- if(argc < 2 || !openchr(argv[1]))
- newchr();
+ if(argc < 2 || !opendoc(&doc, argv[1]))
+ makedoc(&doc, "untitled.chr");
redraw(pixels);
while(1) {
int tick = SDL_GetTicks();