54 lines
900 B
C
54 lines
900 B
C
|
#include <u.h>
|
||
|
#include <libc.h>
|
||
|
#include <draw.h>
|
||
|
#include <memdraw.h>
|
||
|
|
||
|
Memsubfont*
|
||
|
openmemsubfont(char *name)
|
||
|
{
|
||
|
Memsubfont *sf;
|
||
|
Memimage *i;
|
||
|
Fontchar *fc;
|
||
|
int fd, n;
|
||
|
char hdr[3*12+4+1];
|
||
|
uchar *p;
|
||
|
|
||
|
fd = open(name, OREAD);
|
||
|
if(fd < 0)
|
||
|
return nil;
|
||
|
p = nil;
|
||
|
i = readmemimage(fd);
|
||
|
if(i == nil)
|
||
|
goto Err;
|
||
|
if(read(fd, hdr, 3*12) != 3*12){
|
||
|
werrstr("openmemsubfont: header read error: %r");
|
||
|
goto Err;
|
||
|
}
|
||
|
n = atoi(hdr);
|
||
|
p = malloc(6*(n+1));
|
||
|
if(p == nil)
|
||
|
goto Err;
|
||
|
if(read(fd, p, 6*(n+1)) != 6*(n+1)){
|
||
|
werrstr("openmemsubfont: fontchar read error: %r");
|
||
|
goto Err;
|
||
|
}
|
||
|
fc = malloc(sizeof(Fontchar)*(n+1));
|
||
|
if(fc == nil)
|
||
|
goto Err;
|
||
|
_unpackinfo(fc, p, n);
|
||
|
sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
|
||
|
if(sf == nil){
|
||
|
free(fc);
|
||
|
goto Err;
|
||
|
}
|
||
|
free(p);
|
||
|
return sf;
|
||
|
Err:
|
||
|
close(fd);
|
||
|
if (i != nil)
|
||
|
freememimage(i);
|
||
|
if (p != nil)
|
||
|
free(p);
|
||
|
return nil;
|
||
|
}
|