Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>
#include <draw.h>
#include "sky.h"

void
displaypic(Picture *pic)
{
        int p[2];
        int i, n;
        uchar *a;
        

        if(pipe(p) < 0){
                fprint(2, "pipe failed: %r\n");
                return;
        }
        switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
        case -1:
                fprint(2, "fork failed: %r\n");
                return;

        case 0:
                close(p[1]);
                dup(p[0], 0);
                close(p[0]);
                execl("/bin/page", "page", "-w", nil);
                fprint(2, "exec failed: %r\n");
                exits("exec");

        default:
                close(p[0]);
                fprint(p[1], "%11s %11d %11d %11d %11d ",
                        "k8", pic->minx, pic->miny, pic->maxx, pic->maxy);
                n = (pic->maxx-pic->minx)*(pic->maxy-pic->miny);
                /* release the memory as we hand it off; this could be a big piece of data */
                a = pic->data;
                while(n > 0){
                        i = 8192 - (((uintptr)a)&8191);
                        if(i > n)
                                i = n;
                        if(write(p[1], a, i)!=i)
                                fprint(2, "write error: %r\n");
                        if(i == 8192)   /* page aligned */
                                segfree(a, i);
                        n -= i;
                        a += i;
                }
                free(pic->data);
                free(pic);
                close(p[1]);
                break;
        }
}

void
displayimage(Image *im)
{
        int p[2];       

        if(pipe(p) < 0){
                fprint(2, "pipe failed: %r\n");
                return;
        }
        switch(rfork(RFPROC|RFFDG|RFNOTEG|RFNOWAIT)){
        case -1:
                fprint(2, "fork failed: %r\n");
                return;

        case 0:
                close(p[1]);
                dup(p[0], 0);
                close(p[0]);
                execl("/bin/page", "page", "-w", nil);
                fprint(2, "exec failed: %r\n");
                exits("exec");

        default:
                close(p[0]);
                writeimage(p[1], im, 0);
                freeimage(im);
                close(p[1]);
                break;
        }
}