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