loadimage.c 983 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. int
  5. loadimage(Image *i, Rectangle r, uchar *data, int ndata)
  6. {
  7. long dy;
  8. int n, bpl;
  9. uchar *a;
  10. int chunk;
  11. chunk = i->display->bufsize - 64;
  12. if(!rectinrect(r, i->r)){
  13. werrstr("loadimage: bad rectangle");
  14. return -1;
  15. }
  16. bpl = bytesperline(r, i->depth);
  17. n = bpl*Dy(r);
  18. if(n > ndata){
  19. werrstr("loadimage: insufficient data");
  20. return -1;
  21. }
  22. ndata = 0;
  23. while(r.max.y > r.min.y){
  24. dy = r.max.y - r.min.y;
  25. if(dy*bpl > chunk)
  26. dy = chunk/bpl;
  27. if(dy <= 0){
  28. werrstr("loadimage: image too wide for buffer");
  29. return -1;
  30. }
  31. n = dy*bpl;
  32. a = bufimage(i->display, 21+n);
  33. if(a == nil){
  34. werrstr("bufimage failed");
  35. return -1;
  36. }
  37. a[0] = 'y';
  38. BPLONG(a+1, i->id);
  39. BPLONG(a+5, r.min.x);
  40. BPLONG(a+9, r.min.y);
  41. BPLONG(a+13, r.max.x);
  42. BPLONG(a+17, r.min.y+dy);
  43. memmove(a+21, data, n);
  44. ndata += n;
  45. data += n;
  46. r.min.y += dy;
  47. }
  48. if(flushimage(i->display, 0) < 0)
  49. return -1;
  50. return ndata;
  51. }