/* * code to render drawings on the screen */ #include "art.h" Image *color; Image *black, *background, *red, *msgboxcolor; Image *anchormark, *sel, *bg; void drawprim(Item *ip, Item *op){ if(!(ip->flags&INVIS)) (*ip->fn->artdraw)(ip, screen, color); } void itemdraw(Item *ip, Dpoint offs, Image *color){ marks(); walk(ip, offs, drawprim); marks(); } /* * Draw (or undraw) little dinks at argument points * These are always done in xor mode, and must be erased and redrawn * around any non xor-mode drawing. */ Image *sqmark=0; void marks(void){ Point p0, p1, p2; int i; if(sqmark==0){ sqmark = allocimage(display, Rect(0,0,3,3), chan, 1, DBlue); } if(narg>1){ p0=D2P(dadd(arg[0], scoffs)); p1=D2P(dadd(arg[1], scoffs)); if(!eqpt(p0, p1)) { /* if p0 != p1 */ draw(screen, Rect(p1.x-1, p1.y-1, p1.x+2, p1.y+2), sqmark, 0, ZP); flushimage(display, 1); } if(narg>2 && !eqpt(p0, p2=D2P(dadd(arg[2], scoffs))) && !eqpt(p1, p2)){ /* if arguments > 2, and p0!=p1!=p2, draw red X */ line(screen, subpt(p2, Pt(2, 2)), addpt(p2, Pt(3, 3)), 0, 0, 0, red, ZP); line(screen, subpt(p2, Pt(2, -2)), p2, Endsquare, Endsquare, 0, red, ZP); line(screen, subpt(p2, Pt(-2, 2)), p2, Endsquare, Endsquare, 0, red, ZP); } } p0=D2P(dadd(anchor, scoffs)); draw(screen, Rect(p0.x-8, p0.y-7, p0.x+8, p0.y+7), anchormark, 0, ZP); } /* * Redraw absolutely everything * sel == whole window area for this art program */ void redraw(void){ rectf(sel, screen->r, background); rectf(sel, echobox, black); rectf(sel, msgbox, black); rectf(sel, dwgbox, background); if(bg) /* there is a background image */ /* draw(sel, bg->r, bg, 0, ZP); */ draw(sel, dwgbox, bg, 0, ZP); rectf(sel, echobox, msgboxcolor); rectf(sel, msgbox, msgboxcolor); draw(screen, sel->r, sel, 0, screen->r.min); drawmenubar(); echo(cmd); lastmsg(); if(scsp!=scstack) itemdraw(scstack[0].scene, scstack[0].scoffs, color); else itemdraw(scene, scoffs, color); itemdraw(active, Dpt(0., 0.), color); drawcurpt(); marks(); drawsel(); drawgrid(); } void setbg(char *file){ int fd; fd = open(file, OREAD); bg = readimage(display, fd, 0); close(fd); }