ref: 9842b0ae2fd64c678b545ca71f9c34b7afba87c5
dir: /libpt/test.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <keyboard.h> #include <memdraw.h> #include <mouse.h> #include <thread.h> #include "pt.h" #define MAX(a,b) ((a)>=(b)?(a):(b)) static Sfont *fo; static Image *image; static int invert, prefilter; static Point offset = {8, 8}; static Sdopts opts = { .prefilter = 0, .gamma = 1.0, }; static char info[128]; int mainstacksize = 32768; static Image *fg; static void redraw(void) { Rectangle r; lockdisplay(display); draw(screen, screen->r, display->white, nil, ZP); r = rectaddpt(screen->r, offset); r.max = screen->r.max; draw(screen, r, fg, image, ZP); r = screen->r; r.min.y = r.max.y - font->height - 4; r.min.x += 4; stringbg(screen, r.min, invert ? display->white : display->black, ZP, font, info, invert ? display->black : display->white, ZP); flushimage(display, 1); unlockdisplay(display); } static void * loadall(char *path) { uchar *d; uvlong sz; Dir *st; int f, r, n; d = nil; sz = 0; if((f = open(path, OREAD)) < 0 || (st = dirfstat(f)) == nil) goto end; sz = st->length; free(st); if((d = malloc(sz+1)) == nil) goto end; for(r = 0; r < sz; r += n){ if((n = read(f, d+r, sz-r)) <= 0){ free(d); d = nil; goto end; } } end: if(d != nil) d[sz] = 0; close(f); return d; } void threadmain(int argc, char **argv) { Mousectl *mctl; Keyboardctl *kctl; uchar *data; char *s; Rune key; Mouse m; Alt a[] = { { nil, &m, CHANRCV }, { nil, nil, CHANRCV }, { nil, &key, CHANRCV }, { nil, nil, CHANEND }, }; int oldheight, height; Point oldxy, oldoffset; int oldb; Rectangle rect; quotefmtinstall(); if(argc < 2) sysfatal("usage"); if((data = loadall(argv[1])) == nil) sysfatal("%r"); s = "Hello there, 9fans. ljil|."; if(argc > 2 && (s = loadall(argv[2])) == nil) s = argv[2]; threadsetname("libpt"); if(initdraw(nil, nil, "libpt") < 0) sysfatal("initdraw: %r"); fg = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DBlack); display->locking = 1; unlockdisplay(display); if((mctl = initmouse(nil, screen)) == nil) sysfatal("initmouse: %r"); if((kctl = initkeyboard(nil)) == nil) sysfatal("initkeyboard: %r"); a[0].c = mctl->c; a[1].c = mctl->resizec; a[2].c = kctl->c; memimageinit(); height = 32.0; oldheight = height; oldxy = ZP; goto changed; for(;;){ oldb = m.buttons; redraw(); switch(alt(a)){ case 0: /* mouse */ if(m.buttons != 0){ if(oldb == 0){ oldxy = m.xy; oldoffset = offset; oldheight = height; }else if(m.buttons == 4){ height = oldheight + (m.xy.y - oldxy.y)/20.0; if(height < 4) height = 4; goto changed; }else if(m.buttons == 2){ offset = addpt(oldoffset, subpt(m.xy, oldxy)); } } break; case 1: /* resize */ getwindow(display, Refnone); redraw(); break; case 2: /* keyboard */ switch(key){ case 'q': case Kdel: goto end; case '-': height -= height < 6 ? 0 : 1; goto changed; case '+': height += 1; goto changed; case 'i': invert = !invert; goto changed; case Kleft: opts.prefilter--; if(prefilter < 0) prefilter = 0; goto changed; case Kright: opts.prefilter++; goto changed; case Kup: opts.gamma += 0.01; goto changed; case Kdown: opts.gamma -= 0.01; if(opts.gamma < 0.4) opts.gamma = 0.4; goto changed; break; case '\n': opts.gamma = 1.0; goto changed; } } continue; changed: pt_freefont(fo); if((fo = pt_font(data, height)) == nil) sysfatal("%r"); rect = pt_textrect(fo, s); freeimage(image); image = pt_textdraw(fo, s, rect, &opts); } end: threadexitsall(nil); }