void drawbar(void) { int i, j; int p; char buf[400], bar[200]; static char lastbar[200]; if(n > d || n < 0 || d <= 0) return; i = (Dx(rbar)*n)/d; p = (n*100LL)/d; if(textmode){ if(Dx(rbar) > 150){ rbar.min.x = 0; rbar.max.x = 150; return; } bar[0] = '|'; for(j=0; j<i; j++) bar[j+1] = '#'; for(; j<Dx(rbar); j++) bar[j+1] = '-'; bar[j++] = '|'; bar[j++] = ' '; sprint(bar+j, "%3d%% ", p); for(i=0; bar[i]==lastbar[i] && bar[i]; i++) ; memset(buf, '\b', strlen(lastbar)-i); strcpy(buf+strlen(lastbar)-i, bar+i); if(buf[0]) write(1, buf, strlen(buf)); strcpy(lastbar, bar); return; } if(lastp == p && last == i) return; if(lastp != p){ sprint(buf, "%d%%", p); stringbg(screen, addpt(screen->r.min, Pt(Dx(rbar)-30, 4)), text, ZP, display->defaultfont, buf, light, ZP); lastp = p; } if(last != i){ draw(screen, Rect(rbar.min.x+last, rbar.min.y, rbar.min.x+i, rbar.max.y), dark, nil, ZP); last = i; } flushimage(display, 1); }
void _frdrawtext(Frame *f, Point pt, Image *text, Image *back) { Frbox *b; int nb; for(nb=0,b=f->box; nb<f->nbox; nb++, b++){ _frcklinewrap(f, &pt, b); if(!f->noredraw && b->nrune >= 0) stringbg(f->b, pt, text, ZP, f->font, (char*)b->ptr, back, ZP); pt.x += b->wid; } }
void updatehistogram(double v) { char buf[32]; draw(screen, hrect, screen, nil, Pt(hrect.min.x+1, hrect.min.y)); if(v * scale > vmax) v = vmax / scale; drawdatum(hrect.max.x-1, data[0], v); memmove(&data[1], &data[0], (nval-1) * sizeof data[0]); data[0] = v; snprint(buf, sizeof buf, "%0.9f", v); stringbg(screen, maxvloc, txtcolor, ZP, display->defaultfont, buf, neutral, ZP); flushimage(display, 1); }