openmemsubfont.c 881 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "lib9.h"
  2. #include "draw.h"
  3. #include "memdraw.h"
  4. Memsubfont*
  5. openmemsubfont(char *name)
  6. {
  7. Memsubfont *sf;
  8. Memimage *i;
  9. Fontchar *fc;
  10. int fd, n;
  11. char hdr[3*12+4+1];
  12. uchar *p = nil;
  13. fd = open(name, OREAD);
  14. if(fd < 0)
  15. return nil;
  16. i = readmemimage(fd);
  17. if(i == nil)
  18. goto Err;
  19. if(read(fd, hdr, 3*12) != 3*12){
  20. werrstr("openmemsubfont: header read error: %r");
  21. goto Err;
  22. }
  23. n = atoi(hdr);
  24. p = malloc(6*(n+1));
  25. if(p == nil)
  26. goto Err;
  27. if(read(fd, p, 6*(n+1)) != 6*(n+1)){
  28. werrstr("openmemsubfont: fontchar read error: %r");
  29. goto Err;
  30. }
  31. fc = malloc(sizeof(Fontchar)*(n+1));
  32. if(fc == nil)
  33. goto Err;
  34. _unpackinfo(fc, p, n);
  35. sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
  36. if(sf == nil){
  37. free(fc);
  38. goto Err;
  39. }
  40. free(p);
  41. return sf;
  42. Err:
  43. close(fd);
  44. if (i != nil)
  45. freememimage(i);
  46. if (p != nil)
  47. free(p);
  48. return nil;
  49. }