readsubfont.c 1022 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. Subfont*
  5. readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock)
  6. {
  7. char hdr[3*12+4+1];
  8. int n;
  9. uchar *p;
  10. Fontchar *fc;
  11. Subfont *f;
  12. Image *i;
  13. i = ai;
  14. if(i == nil){
  15. i = readimage(d, fd, dolock);
  16. if(i == nil)
  17. return nil;
  18. }
  19. if(read(fd, hdr, 3*12) != 3*12){
  20. if(ai == nil)
  21. freeimage(i);
  22. werrstr("rdsubfonfile: header read error: %r");
  23. return nil;
  24. }
  25. n = atoi(hdr);
  26. p = malloc(6*(n+1));
  27. if(p == nil)
  28. return nil;
  29. if(read(fd, p, 6*(n+1)) != 6*(n+1)){
  30. werrstr("rdsubfonfile: fontchar read error: %r");
  31. Err:
  32. free(p);
  33. return nil;
  34. }
  35. fc = malloc(sizeof(Fontchar)*(n+1));
  36. if(fc == nil)
  37. goto Err;
  38. _unpackinfo(fc, p, n);
  39. if(dolock)
  40. lockdisplay(d);
  41. f = allocsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
  42. if(dolock)
  43. unlockdisplay(d);
  44. if(f == nil){
  45. free(fc);
  46. goto Err;
  47. }
  48. free(p);
  49. return f;
  50. }
  51. Subfont*
  52. readsubfont(Display*d, char *name, int fd, int dolock)
  53. {
  54. return readsubfonti(d, name, fd, nil, dolock);
  55. }