xref: /plan9/sys/src/libdraw/getdefont.c (revision 74f16c8187aab477889167f2422d0597b1b7d0ff)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier Subfont*
getdefont(Display * d)67dd7cddfSDavid du Colombier getdefont(Display *d)
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	char *hdr, *p;
97dd7cddfSDavid du Colombier 	int n;
107dd7cddfSDavid du Colombier 	Fontchar *fc;
117dd7cddfSDavid du Colombier 	Subfont *f;
127dd7cddfSDavid du Colombier 	int ld;
137dd7cddfSDavid du Colombier 	Rectangle r;
147dd7cddfSDavid du Colombier 	Image *i;
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	/*
177dd7cddfSDavid du Colombier 	 * make sure data is word-aligned.  this is true with Plan 9 compilers
187dd7cddfSDavid du Colombier 	 * but not in general.  the byte order is right because the data is
197dd7cddfSDavid du Colombier 	 * declared as char*, not ulong*.
207dd7cddfSDavid du Colombier 	 */
217dd7cddfSDavid du Colombier 	p = (char*)defontdata;
22*74f16c81SDavid du Colombier 	n = (int)(uvlong)p & 3;				/* stupid ape */
237dd7cddfSDavid du Colombier 	if(n != 0){
247dd7cddfSDavid du Colombier 		memmove(p+(4-n), p, sizeofdefont-n);
257dd7cddfSDavid du Colombier 		p += 4-n;
267dd7cddfSDavid du Colombier 	}
277dd7cddfSDavid du Colombier 	ld = atoi(p+0*12);
287dd7cddfSDavid du Colombier 	r.min.x = atoi(p+1*12);
297dd7cddfSDavid du Colombier 	r.min.y = atoi(p+2*12);
307dd7cddfSDavid du Colombier 	r.max.x = atoi(p+3*12);
317dd7cddfSDavid du Colombier 	r.max.y = atoi(p+4*12);
327dd7cddfSDavid du Colombier 
337dd7cddfSDavid du Colombier 	i = allocimage(d, r, drawld2chan[ld], 0, 0);
347dd7cddfSDavid du Colombier 	if(i == 0)
357dd7cddfSDavid du Colombier 		return 0;
367dd7cddfSDavid du Colombier 
377dd7cddfSDavid du Colombier 	p += 5*12;
387dd7cddfSDavid du Colombier 	n = loadimage(i, r, (uchar*)p, (defontdata+sizeofdefont)-(uchar*)p);
397dd7cddfSDavid du Colombier 	if(n < 0){
407dd7cddfSDavid du Colombier 		freeimage(i);
417dd7cddfSDavid du Colombier 		return 0;
427dd7cddfSDavid du Colombier 	}
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier 	hdr = p+n;
457dd7cddfSDavid du Colombier 	n = atoi(hdr);
467dd7cddfSDavid du Colombier 	p = hdr+3*12;
477dd7cddfSDavid du Colombier 	fc = malloc(sizeof(Fontchar)*(n+1));
487dd7cddfSDavid du Colombier 	if(fc == 0){
497dd7cddfSDavid du Colombier 		freeimage(i);
507dd7cddfSDavid du Colombier 		return 0;
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	_unpackinfo(fc, (uchar*)p, n);
537dd7cddfSDavid du Colombier 	f = allocsubfont("*default*", n, atoi(hdr+12), atoi(hdr+24), fc, i);
547dd7cddfSDavid du Colombier 	if(f == 0){
557dd7cddfSDavid du Colombier 		freeimage(i);
567dd7cddfSDavid du Colombier 		free(fc);
577dd7cddfSDavid du Colombier 		return 0;
587dd7cddfSDavid du Colombier 	}
597dd7cddfSDavid du Colombier 	return f;
607dd7cddfSDavid du Colombier }
61