load.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <memdraw.h>
  5. #include <memlayer.h>
  6. int
  7. memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed)
  8. {
  9. int (*loadfn)(Memimage*, Rectangle, uchar*, int);
  10. Memimage *tmp;
  11. Memlayer *dl;
  12. Rectangle lr;
  13. int dx;
  14. loadfn = loadmemimage;
  15. if(iscompressed)
  16. loadfn = cloadmemimage;
  17. Top:
  18. dl = dst->layer;
  19. if(dl == nil)
  20. return loadfn(dst, r, data, n);
  21. /*
  22. * Convert to screen coordinates.
  23. */
  24. lr = r;
  25. r.min.x += dl->delta.x;
  26. r.min.y += dl->delta.y;
  27. r.max.x += dl->delta.x;
  28. r.max.y += dl->delta.y;
  29. dx = dl->delta.x&(7/dst->depth);
  30. if(dl->clear && dx==0){
  31. dst = dl->screen->image;
  32. goto Top;
  33. }
  34. /*
  35. * dst is an obscured layer or data is unaligned
  36. */
  37. if(dl->save && dx==0){
  38. n = loadfn(dl->save, lr, data, n);
  39. if(n > 0)
  40. memlexpose(dst, r);
  41. return n;
  42. }
  43. tmp = allocmemimage(lr, dst->chan);
  44. if(tmp == nil)
  45. return -1;
  46. n = loadfn(tmp, lr, data, n);
  47. memdraw(dst, lr, tmp, lr.min, nil, lr.min, S);
  48. freememimage(tmp);
  49. return n;
  50. }