|
|
|
|
@ -69,7 +69,7 @@ char *
|
|
|
|
|
scpy(char *src, char *dst, int len) |
|
|
|
|
{ |
|
|
|
|
int i = 0; |
|
|
|
|
while((dst[i] = src[i]) && i < len) |
|
|
|
|
while((dst[i] = src[i]) && i < len - 2) |
|
|
|
|
i++; |
|
|
|
|
dst[i + 1] = '\0'; |
|
|
|
|
return dst; |
|
|
|
|
@ -93,25 +93,6 @@ screenpos(int pos, int offset)
|
|
|
|
|
return pos; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Uint8 |
|
|
|
|
chex(char c) |
|
|
|
|
{ |
|
|
|
|
if(c >= 'a' && c <= 'f') |
|
|
|
|
return 10 + c - 'a'; |
|
|
|
|
if(c >= 'A' && c <= 'F') |
|
|
|
|
return 10 + c - 'A'; |
|
|
|
|
return (c - '0') & 0xF; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
shex(char *s, int len) |
|
|
|
|
{ |
|
|
|
|
int i, n = 0; |
|
|
|
|
for(i = 0; i < len; ++i) |
|
|
|
|
n |= (chex(s[i]) << ((len - i - 1) * 4)); |
|
|
|
|
return n; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* chr */ |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
@ -324,53 +305,18 @@ error(char *msg, const char *err)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
modzoom(int mod) |
|
|
|
|
{ |
|
|
|
|
if((mod > 0 && ZOOM < 5) || (mod < 0 && ZOOM > 1)) { |
|
|
|
|
ZOOM += mod; |
|
|
|
|
SDL_SetWindowSize(gWindow, WIDTH * ZOOM, HEIGHT * ZOOM); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
setcolor(Brush *b, int c) |
|
|
|
|
setmode(int *i, int v) |
|
|
|
|
{ |
|
|
|
|
b->color = c; |
|
|
|
|
*i = v; |
|
|
|
|
redraw(pixels); |
|
|
|
|
printf("Set Color: %d\n", b->color); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
setmode(Brush *b, int m) |
|
|
|
|
setrange(int *i, int v, int min, int max) |
|
|
|
|
{ |
|
|
|
|
b->mode = m; |
|
|
|
|
*i = v < min ? min : v > max ? max |
|
|
|
|
: v; |
|
|
|
|
redraw(pixels); |
|
|
|
|
printf("Set Mode: %d\n", b->mode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
setbigmode(int m) |
|
|
|
|
{ |
|
|
|
|
BIGPIXEL = m; |
|
|
|
|
redraw(pixels); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
modsize(Brush *b, int mod) |
|
|
|
|
{ |
|
|
|
|
int res = b->size + mod; |
|
|
|
|
if(res > 0 && res < 30) |
|
|
|
|
b->size = res; |
|
|
|
|
redraw(pixels); |
|
|
|
|
printf("Set Size: %d\n", b->size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
setguides(int v) |
|
|
|
|
{ |
|
|
|
|
GUIDES = v; |
|
|
|
|
redraw(pixels); |
|
|
|
|
printf("Set Guide: %s \n", GUIDES ? "Show" : "Hide"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
@ -426,37 +372,20 @@ renderbmp(void)
|
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
loadtheme(FILE *f) |
|
|
|
|
{ |
|
|
|
|
int id = 0; |
|
|
|
|
char line[256]; |
|
|
|
|
if(!f) |
|
|
|
|
return; |
|
|
|
|
while(fgets(line, 256, f)) { |
|
|
|
|
int i = 0; |
|
|
|
|
while(line[i++] && id < 5) { |
|
|
|
|
if(line[i] == '#') |
|
|
|
|
theme[id++] = shex(line + i + 1, 6); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
fclose(f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
selectoption(int option) |
|
|
|
|
{ |
|
|
|
|
switch(option) { |
|
|
|
|
case 0: setcolor(&brush, 1); break; |
|
|
|
|
case 1: setcolor(&brush, 2); break; |
|
|
|
|
case 2: setcolor(&brush, 3); break; |
|
|
|
|
case 4: setmode(&brush, 0); break; |
|
|
|
|
case 5: setmode(&brush, 1); break; |
|
|
|
|
case 6: setmode(&brush, 2); break; |
|
|
|
|
case 7: setmode(&brush, 3); break; |
|
|
|
|
case 8: setmode(&brush, 4); break; |
|
|
|
|
case 10: setbigmode(!BIGPIXEL); break; |
|
|
|
|
case 11: setguides(!GUIDES); break; |
|
|
|
|
case 0: setmode(&brush.color, 1); break; |
|
|
|
|
case 1: setmode(&brush.color, 2); break; |
|
|
|
|
case 2: setmode(&brush.color, 3); break; |
|
|
|
|
case 4: setmode(&brush.mode, 0); break; |
|
|
|
|
case 5: setmode(&brush.mode, 1); break; |
|
|
|
|
case 6: setmode(&brush.mode, 2); break; |
|
|
|
|
case 7: setmode(&brush.mode, 3); break; |
|
|
|
|
case 8: setmode(&brush.mode, 4); break; |
|
|
|
|
case 10: setmode(&BIGPIXEL, !BIGPIXEL); break; |
|
|
|
|
case 11: setmode(&GUIDES, !GUIDES); break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -504,11 +433,11 @@ domouse(SDL_Event *event)
|
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
if(brush.down && brush.mode == 0) { |
|
|
|
|
if(!BIGPIXEL) { |
|
|
|
|
brush.vx = (brush.px / 8) * 8; |
|
|
|
|
brush.vy = (brush.py / 8) * 8; |
|
|
|
|
} |
|
|
|
|
putchr(brush.px, brush.py, brush.erase ? 0 : brush.color); |
|
|
|
|
redraw(pixels); |
|
|
|
|
} |
|
|
|
|
@ -534,51 +463,29 @@ dokey(SDL_Event *event)
|
|
|
|
|
{ |
|
|
|
|
int shift = SDL_GetModState() & KMOD_LSHIFT || SDL_GetModState() & KMOD_RSHIFT; |
|
|
|
|
int ctrl = SDL_GetModState() & KMOD_LCTRL || SDL_GetModState() & KMOD_RCTRL; |
|
|
|
|
switch(event->key.keysym.sym) { |
|
|
|
|
case SDLK_EQUALS: |
|
|
|
|
case SDLK_PLUS: |
|
|
|
|
if(ctrl) |
|
|
|
|
modzoom(1); |
|
|
|
|
break; |
|
|
|
|
case SDLK_UNDERSCORE: |
|
|
|
|
case SDLK_MINUS: |
|
|
|
|
if(ctrl) |
|
|
|
|
modzoom(-1); |
|
|
|
|
break; |
|
|
|
|
case SDLK_1: setcolor(&brush, 1); break; |
|
|
|
|
case SDLK_2: setcolor(&brush, 2); break; |
|
|
|
|
case SDLK_3: setcolor(&brush, 3); break; |
|
|
|
|
case SDLK_4: setcolor(&brush, 0); break; |
|
|
|
|
case SDLK_a: setmode(&brush, 0); break; |
|
|
|
|
case SDLK_r: |
|
|
|
|
if(ctrl) |
|
|
|
|
openchr(doc.name); |
|
|
|
|
break; |
|
|
|
|
case SDLK_s: |
|
|
|
|
if(ctrl && shift) |
|
|
|
|
renderbmp(); |
|
|
|
|
else if(ctrl) |
|
|
|
|
savechr(); |
|
|
|
|
else |
|
|
|
|
setmode(&brush, 1); |
|
|
|
|
break; |
|
|
|
|
case SDLK_d: setmode(&brush, 2); break; |
|
|
|
|
case SDLK_f: setmode(&brush, 3); break; |
|
|
|
|
case SDLK_g: setmode(&brush, 4); break; |
|
|
|
|
case SDLK_h: |
|
|
|
|
if(ctrl) |
|
|
|
|
setguides(!GUIDES); |
|
|
|
|
break; |
|
|
|
|
case SDLK_b: |
|
|
|
|
if(ctrl) |
|
|
|
|
setbigmode(!BIGPIXEL); |
|
|
|
|
break; |
|
|
|
|
case SDLK_z: modsize(&brush, -1); break; |
|
|
|
|
case SDLK_x: modsize(&brush, 1); break; |
|
|
|
|
case SDLK_n: |
|
|
|
|
if(ctrl) |
|
|
|
|
newchr(); |
|
|
|
|
break; |
|
|
|
|
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_h: setmode(&GUIDES, !GUIDES); break; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
switch(event->key.keysym.sym) { |
|
|
|
|
case SDLK_1: setmode(&brush.color, 1); break; |
|
|
|
|
case SDLK_2: setmode(&brush.color, 2); break; |
|
|
|
|
case SDLK_3: setmode(&brush.color, 3); break; |
|
|
|
|
case SDLK_4: setmode(&brush.color, 0); break; |
|
|
|
|
case SDLK_a: setmode(&brush.mode, 0); break; |
|
|
|
|
case SDLK_s: setmode(&brush.mode, 1); break; |
|
|
|
|
case SDLK_d: setmode(&brush.mode, 2); break; |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -620,7 +527,6 @@ main(int argc, char **argv)
|
|
|
|
|
brush.size = 10; |
|
|
|
|
if(!init()) |
|
|
|
|
return error("Init", "Failure"); |
|
|
|
|
loadtheme(fopen("theme.svg", "r")); |
|
|
|
|
if(argc < 2 || !openchr(argv[1])) |
|
|
|
|
newchr(); |
|
|
|
|
redraw(pixels); |
|
|
|
|
|