display.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <draw.h>
  5. #include "sky.h"
  6. void
  7. displaypic(Picture *pic)
  8. {
  9. int p[2];
  10. int i, n;
  11. uchar *a;
  12. if(pipe(p) < 0){
  13. fprint(2, "pipe failed: %r\n");
  14. return;
  15. }
  16. switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
  17. case -1:
  18. fprint(2, "fork failed: %r\n");
  19. return;
  20. case 0:
  21. close(p[1]);
  22. dup(p[0], 0);
  23. close(p[0]);
  24. execl("/bin/page", "page", "-w", nil);
  25. fprint(2, "exec failed: %r\n");
  26. exits("exec");
  27. default:
  28. close(p[0]);
  29. fprint(p[1], "%11s %11d %11d %11d %11d ",
  30. "k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
  31. n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
  32. /* release the memory as we hand it off; this could be a big piece of data */
  33. a = pic->data;
  34. while(n > 0){
  35. i = 8192 - (((int)a)&8191);
  36. if(i > n)
  37. i = n;
  38. if(write(p[1], a, i)!=i)
  39. fprint(2, "write error: %r\n");
  40. if(i == 8192) /* page aligned */
  41. segfree(a, i);
  42. n -= i;
  43. a += i;
  44. }
  45. free(pic->data);
  46. free(pic);
  47. close(p[1]);
  48. break;
  49. }
  50. }
  51. void
  52. displayimage(Image *im)
  53. {
  54. int p[2];
  55. if(pipe(p) < 0){
  56. fprint(2, "pipe failed: %r\n");
  57. return;
  58. }
  59. switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
  60. case -1:
  61. fprint(2, "fork failed: %r\n");
  62. return;
  63. case 0:
  64. close(p[1]);
  65. dup(p[0], 0);
  66. close(p[0]);
  67. execl("/bin/page", "page", "-w", nil);
  68. fprint(2, "exec failed: %r\n");
  69. exits("exec");
  70. default:
  71. close(p[0]);
  72. writeimage(p[1], im, 0);
  73. freeimage(im);
  74. close(p[1]);
  75. break;
  76. }
  77. }