@@ 29,6 29,7 @@ typedef struct Brush {
int x, y, px, py, vx, vy;
int mode, size, color;
int down, erase;
+ Uint8 clip[16];
} Brush;
int WIDTH = 8 * HOR + 8 * PAD * 2;
@@ 55,6 56,8 @@ Uint8 icons[][8] = {
{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 */
+ {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xe0, 0x10, 0x00}, /* clip:blank */
+ {0x82, 0xc5, 0xe2, 0xf0, 0xf8, 0xe0, 0x10, 0x00}, /* clip:active */
{0x00, 0x00, 0x00, 0x82, 0x44, 0x38, 0x00, 0x00}, /* eye open */
{0x00, 0x38, 0x44, 0x92, 0x28, 0x10, 0x00, 0x00}, /* eye closed */
{0x10, 0x54, 0x28, 0xc6, 0x28, 0x54, 0x10, 0x00} /* unsaved */
@@ 101,6 104,16 @@ screenpos(int pos, int offset)
return pos;
}
+int
+hasclip(void)
+{
+ int i;
+ for(i = 0; i < 16; ++i)
+ if(brush.clip[i])
+ return 1;
+ return 0;
+}
+
#pragma mark - CHR HANDLERS
int
@@ 299,9 312,10 @@ drawui(Uint32 *dst)
drawicon(dst, 6 * 8, bottom, icons[4], brush.mode == 2 ? 1 : 2, 0);
drawicon(dst, 7 * 8, bottom, icons[5], brush.mode == 3 ? 1 : 2, 0);
drawicon(dst, 8 * 8, bottom, icons[6], brush.mode == 4 ? 1 : 2, 0);
- drawicon(dst, 10 * 8, bottom, icons[BIGPIXEL ? 7 : 8], BIGPIXEL ? 1 : 2, 0);
- drawicon(dst, 11 * 8, bottom, icons[GUIDES ? 10 : 9], GUIDES ? 1 : 2, 0);
- drawicon(dst, (HOR - 1) * 8, bottom, icons[11], doc.unsaved ? 2 : 3, 0); /* save state */
+ drawicon(dst, 10 * 8, bottom, icons[hasclip() ? 10 : 9], brush.mode == 5 ? 1 : 2, 0);
+ drawicon(dst, 12 * 8, bottom, icons[BIGPIXEL ? 8 : 7], BIGPIXEL ? 1 : 2, 0);
+ drawicon(dst, 13 * 8, bottom, icons[GUIDES ? 12 : 11], GUIDES ? 1 : 2, 0);
+ drawicon(dst, (HOR - 1) * 8, bottom, icons[13], doc.unsaved ? 2 : 3, 0); /* save state */
}
void
@@ 388,6 402,37 @@ lookat(int x, int y)
redraw(pixels);
}
+void
+clearclip(Uint8 *clip)
+{
+ int i;
+ for(i = 0; i < 16; ++i)
+ clip[i] = 0;
+ redraw(pixels);
+}
+
+void
+copyclip(Uint8 *clip, int id)
+{
+ int i;
+ if(id < 0 || id >= HOR * VER)
+ return;
+ for(i = 0; i < 16; ++i)
+ clip[i] = doc.data[(id * 16) + i];
+ redraw(pixels);
+}
+
+void
+pasteclip(Uint8 *clip, int id)
+{
+ int i;
+ if(id < 0 || id >= HOR * VER)
+ return;
+ for(i = 0; i < 16; ++i)
+ doc.data[(id * 16) + i] = clip[i];
+ clearclip(clip);
+}
+
int
savebmp(void)
{
@@ 416,8 461,9 @@ selectoption(int option)
case 6: savemode(&brush.mode, 2); break;
case 7: savemode(&brush.mode, 3); break;
case 8: savemode(&brush.mode, 4); break;
- case 10: savemode(&BIGPIXEL, !BIGPIXEL); break;
- case 11: savemode(&GUIDES, !GUIDES); break;
+ case 10: savemode(&brush.mode, 5); break;
+ case 12: savemode(&BIGPIXEL, !BIGPIXEL); break;
+ case 13: savemode(&GUIDES, !GUIDES); break;
case HOR - 1: savedoc(&doc, doc.name); break;
}
}
@@ 442,6 488,7 @@ void
domouse(SDL_Event *event)
{
int ctrl = SDL_GetModState() & KMOD_LCTRL || SDL_GetModState() & KMOD_RCTRL;
+
switch(event->type) {
case SDL_MOUSEBUTTONUP:
if(event->button.button == SDL_BUTTON_LEFT)
@@ 464,7 511,12 @@ domouse(SDL_Event *event)
brush.py = screenpos(event->motion.y, brush.vy);
if(!BIGPIXEL)
lookat((brush.px / 8) * 8, (brush.py / 8) * 8);
- if(ctrl) /* color picker */
+ if(brush.mode == 5) {
+ if(event->button.button == SDL_BUTTON_LEFT && hasclip())
+ pasteclip(brush.clip, brush.px / 8 + brush.py / 8 * HOR);
+ else
+ copyclip(brush.clip, brush.px / 8 + brush.py / 8 * HOR);
+ } else if(ctrl)
savemode(&brush.color, getchr(brush.px, brush.py));
else if(brush.down) {
if(brush.mode == 0)
@@ 523,6 575,10 @@ dokey(SDL_Event *event)
case SDLK_DOWN: lookat(brush.vx, brush.vy + 1); break;
case SDLK_LEFT: lookat(brush.vx - 1, brush.vy); break;
case SDLK_RIGHT: lookat(brush.vx + 1, brush.vy); break;
+ case SDLK_ESCAPE:
+ savemode(&brush.mode, 0);
+ clearclip(brush.clip);
+ break;
}
}
}