#include "paint.h" void drawshadow(Image *dst, Rectangle r) { static Image *shadow; if(shadow == nil) { if((shadow = allocimage(display, Rect(0, 0, 1, 1), RGBA32, 1, 0x0000007F)) == nil) sysfatal("allocimage shadow: %r"); } draw(dst, Rect(r.min.x+4, r.max.y+1, r.max.x+4, r.max.y+4), shadow, nil, ZP); draw(dst, Rect(r.max.x+1, r.min.y+4, r.max.x+4, r.max.y+1), shadow, nil, ZP); } static void redrawshadow(Widget *w, RedrawMode mode) { if(mode == RDall) { border(w->screen, w->r, -1, display->black, ZP); drawshadow(w->screen, w->r); } widgetredrawdescend(w, mode); } static Rdims shadowdims(Widget *w) { return w->children->dims(w->children); } static void resizeshadow(Widget *w, Point dim) { w->children->resize(w->children, dim); w->r = rectaddpt(Rpt(ZP, dim), w->r.min); } Widget * mkshadow(Widget *c) { Widget *w; if((w = mkwidget(ZR, widgetmousedescend, widgetsyncnop, redrawshadow, shadowdims, resizeshadow, freewidget, nil)) == nil ) sysfatal("mkshadow: %r"); addchildwidget(w, c, ZP); return w; } static void redrawbg(Widget *w, RedrawMode mode) { if(mode == RDall) draw(w->screen, w->r, w->aux, nil, ZP); widgetredrawdescend(w, mode); } static Rdims bgdims(Widget *w) { Image *bg; bg = w->aux; return (Rdims){ZP, rectdim(bg->r), INFDIM}; } static void resizebg(Widget *w, Point dim) { w->r = rectaddpt(Rpt(ZP, dim), w->r.min); widgetresizedescend(w, dim); } Widget * mkbg(Image *bg) { Widget *w; if((w = mkwidget(ZR, widgetmousedescend, widgetsyncnop, redrawbg, bgdims, resizebg, freewidget, bg)) == nil ) sysfatal("mkbg: %r"); return w; }