unload.c 992 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "lib9.h"
  2. #include "draw.h"
  3. #include "memdraw.h"
  4. #include "memlayer.h"
  5. int
  6. memunload(Memimage *src, Rectangle r, uchar *data, int n)
  7. {
  8. Memimage *tmp;
  9. Memlayer *dl;
  10. Rectangle lr;
  11. int dx;
  12. Top:
  13. dl = src->layer;
  14. if(dl == nil)
  15. return unloadmemimage(src, r, data, n);
  16. /*
  17. * Convert to screen coordinates.
  18. */
  19. lr = r;
  20. r.min.x += dl->delta.x;
  21. r.min.y += dl->delta.y;
  22. r.max.x += dl->delta.x;
  23. r.max.y += dl->delta.y;
  24. dx = dl->delta.x&(7/src->depth);
  25. if(dl->clear && dx==0){
  26. src = dl->screen->image;
  27. goto Top;
  28. }
  29. /*
  30. * src is an obscured layer or data is unaligned
  31. */
  32. if(dl->save && dx==0){
  33. if(dl->refreshfn != nil)
  34. return -1; /* can't unload window if it's not Refbackup */
  35. if(n > 0)
  36. memlhide(src, r);
  37. n = unloadmemimage(dl->save, lr, data, n);
  38. return n;
  39. }
  40. tmp = allocmemimage(lr, src->chan);
  41. if(tmp == nil)
  42. return -1;
  43. memdraw(tmp, lr, src, lr.min, nil, lr.min, S);
  44. n = unloadmemimage(tmp, lr, data, n);
  45. freememimage(tmp);
  46. return n;
  47. }