/* * initialization of globals and command loop */ #include "art.h" #define SPACE 1 /* width of interior vertical margins */ Item *scene, *active; Alpt *alpt; short tcur[16]={ 0x0100, 0x0100, 0x0380, 0x0380, 0x07C0, 0x07C0, 0x0FE0, 0x0EE0, 0x1C70, 0x1830, 0x3018, 0x2008, 0x0000, 0x0000, 0x0000, 0x0000, }; short anc[16]={ 0x3838, 0x7C7C, 0xF01E, 0xF83E, 0xDC76, 0x4EE4, 0x07C0, 0x0280, 0x07C0, 0x4EE4, 0xDC76, 0xF83E, 0xF01E, 0x7C7C, 0x3838, 0x0000, }; /* colors for art */ Image *black; Image *red; Image *blue; Image *paleyellow; Image *darkgreen; Image *palegreen; Image *darkblue; Image *darkgrey; Image *medgreen; /* Image *transparent; */ Image *cur; /* caret bitmap */ Image *anchormark; /* anchor bitmap */ Image *sel; /* selected window i.e. where art runs */ Image *bg; /* background pic image */ Image *color; /* changable color */ Image *menucolor; /* color of menu bar */ Image *msgboxcolor; Image *gridcolor; Image *background; /* background color of canvas */ Rectangle echobox; Rectangle msgbox; Rectangle dwgbox; void eresized(int new){ Rectangle rest; if(new && getwindow(display, Refmesg) < 0) fprint(2,"can't reattach to window"); rest=drawmenubar(); fontp=curface->font; /* does this look like we need an array, or what? */ msgbox.max=subpt(rest.max, Pt(0, SPACE)); msgbox.min=Pt(rest.min.x, msgbox.max.y-SPACE-fontp->height); echobox.max=Pt(rest.max.x, msgbox.min.y-SPACE); echobox.min=Pt(rest.min.x, echobox.max.y-SPACE-fontp->height); dwgbox.max=Pt(rest.max.x, echobox.min.y-SPACE); dwgbox.min=subpt(rest.min, Pt(SPACE, SPACE)); if(dwgbox.max.y<=dwgbox.min.y){ fprint(2, "%s: please make the window higher and restart: there's no space to draw in.\n", cmdname); exits("need higher window"); } dwgdrect=drcanon(Drpt(P2D(dwgbox.min), P2D(dwgbox.max))); if(sel!=0) freeimage(sel); sel = allocimage(display, screen->r, chan, 1, DBlack); if(sel==0){ fprint(2, "%s: out of image space\n", cmdname); exits("no space"); } redraw(); } void main(int argc, char *argv[]){ Point p; char *fontname, *bgname; cmdname=argv[0]; initdraw(0, 0, cmdname); einit(Emouse|Ekeyboard); ainit(); setface("pelm,unicode,9"); /* do this anyway, in case the following fails */ ARGBEGIN{ case 'f': fontname=ARGF(); if(fontname==0) goto Usage; setface(ARGF()); break; case 'b': bgname=ARGF(); if(bgname==0) goto Usage; setbg(bgname); break; default: Usage: fprint(2, "Usage: %s [-f font] [-b background]\n", cmdname); exits("bad font"); }ARGEND chan = display->windows->chan; /* set the color model */ black = allocimage(display, Rect(0,0,1,1), chan, 1, DBlack); red = allocimage(display, Rect(0,0,1,1), chan, 1, DRed); blue = allocimage(display, Rect(0,0,1,1), chan, 1, DBlue); paleyellow=allocimage(display, Rect(0, 0, 1, 1), chan, 1, DPaleyellow); darkgreen=allocimage(display, Rect(0, 0, 1, 1), chan, 1, DDarkgreen); palegreen=allocimage(display, Rect(0, 0, 1, 1), chan, 1, DPalegreen); medgreen=allocimage(display, Rect(0, 0, 1, 1), chan, 1, DMedgreen); darkblue = allocimage(display, Rect(0,0,1,1), chan, 1, DDarkblue); darkgrey = allocimage(display, Rect(0,0,1,1), chan, 1, DGreygreen); /* transparent = allocimage(display, Rect(0,0,1,1), chan, 1, DTransparent); */ color = black; background = paleyellow; menucolor = palegreen; msgboxcolor=darkgreen; gridcolor=darkblue; cur = allocimage(display, Rect(0, 0, 16, 16), chan, 1, DTransparent); anchormark = allocimage(display, Rect(0,0,16,16), chan, 1, DTransparent); for(p.y=0;p.y!=16;p.y++) for(p.x=0;p.x!=16;p.x++){ if(tcur[p.y]&(1<