openmemsubfont.c 900 B

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