Sigrid Solveig Haflínudóttirproperly handle font loading errors07102965 years agoHistory
205 lines · 3.6 KB · C
RawDownload
#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 voidredraw(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;} voidthreadmain(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);}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t