Blame


1 324891a5 2006-06-25 devnull #include <u.h>
2 324891a5 2006-06-25 devnull #include <libc.h>
3 324891a5 2006-06-25 devnull #include <draw.h>
4 324891a5 2006-06-25 devnull #include <memdraw.h>
5 324891a5 2006-06-25 devnull
6 324891a5 2006-06-25 devnull Memimage*
7 324891a5 2006-06-25 devnull creadmemimage(int fd)
8 324891a5 2006-06-25 devnull {
9 324891a5 2006-06-25 devnull char hdr[5*12+1];
10 324891a5 2006-06-25 devnull Rectangle r;
11 324891a5 2006-06-25 devnull int m, nb, miny, maxy, new, ldepth, ncblock;
12 324891a5 2006-06-25 devnull uchar *buf;
13 324891a5 2006-06-25 devnull Memimage *i;
14 324891a5 2006-06-25 devnull u32int chan;
15 324891a5 2006-06-25 devnull
16 324891a5 2006-06-25 devnull if(readn(fd, hdr, 5*12) != 5*12){
17 324891a5 2006-06-25 devnull werrstr("readmemimage: short header (2)");
18 324891a5 2006-06-25 devnull return nil;
19 324891a5 2006-06-25 devnull }
20 324891a5 2006-06-25 devnull
21 324891a5 2006-06-25 devnull /*
22 324891a5 2006-06-25 devnull * distinguish new channel descriptor from old ldepth.
23 324891a5 2006-06-25 devnull * channel descriptors have letters as well as numbers,
24 324891a5 2006-06-25 devnull * while ldepths are a single digit formatted as %-11d.
25 324891a5 2006-06-25 devnull */
26 324891a5 2006-06-25 devnull new = 0;
27 324891a5 2006-06-25 devnull for(m=0; m<10; m++){
28 324891a5 2006-06-25 devnull if(hdr[m] != ' '){
29 324891a5 2006-06-25 devnull new = 1;
30 324891a5 2006-06-25 devnull break;
31 324891a5 2006-06-25 devnull }
32 324891a5 2006-06-25 devnull }
33 324891a5 2006-06-25 devnull if(hdr[11] != ' '){
34 324891a5 2006-06-25 devnull werrstr("creadimage: bad format");
35 324891a5 2006-06-25 devnull return nil;
36 324891a5 2006-06-25 devnull }
37 324891a5 2006-06-25 devnull if(new){
38 324891a5 2006-06-25 devnull hdr[11] = '\0';
39 324891a5 2006-06-25 devnull if((chan = strtochan(hdr)) == 0){
40 324891a5 2006-06-25 devnull werrstr("creadimage: bad channel string %s", hdr);
41 324891a5 2006-06-25 devnull return nil;
42 324891a5 2006-06-25 devnull }
43 324891a5 2006-06-25 devnull }else{
44 324891a5 2006-06-25 devnull ldepth = ((int)hdr[10])-'0';
45 324891a5 2006-06-25 devnull if(ldepth<0 || ldepth>3){
46 324891a5 2006-06-25 devnull werrstr("creadimage: bad ldepth %d", ldepth);
47 324891a5 2006-06-25 devnull return nil;
48 324891a5 2006-06-25 devnull }
49 324891a5 2006-06-25 devnull chan = drawld2chan[ldepth];
50 324891a5 2006-06-25 devnull }
51 324891a5 2006-06-25 devnull r.min.x=atoi(hdr+1*12);
52 324891a5 2006-06-25 devnull r.min.y=atoi(hdr+2*12);
53 324891a5 2006-06-25 devnull r.max.x=atoi(hdr+3*12);
54 324891a5 2006-06-25 devnull r.max.y=atoi(hdr+4*12);
55 324891a5 2006-06-25 devnull if(r.min.x>r.max.x || r.min.y>r.max.y){
56 324891a5 2006-06-25 devnull werrstr("creadimage: bad rectangle");
57 324891a5 2006-06-25 devnull return nil;
58 324891a5 2006-06-25 devnull }
59 324891a5 2006-06-25 devnull
60 324891a5 2006-06-25 devnull i = allocmemimage(r, chan);
61 324891a5 2006-06-25 devnull if(i == nil)
62 324891a5 2006-06-25 devnull return nil;
63 324891a5 2006-06-25 devnull ncblock = _compblocksize(r, i->depth);
64 324891a5 2006-06-25 devnull buf = malloc(ncblock);
65 324891a5 2006-06-25 devnull if(buf == nil)
66 324891a5 2006-06-25 devnull goto Errout;
67 324891a5 2006-06-25 devnull miny = r.min.y;
68 324891a5 2006-06-25 devnull while(miny != r.max.y){
69 324891a5 2006-06-25 devnull if(readn(fd, hdr, 2*12) != 2*12){
70 324891a5 2006-06-25 devnull Shortread:
71 324891a5 2006-06-25 devnull werrstr("readmemimage: short read");
72 324891a5 2006-06-25 devnull Errout:
73 324891a5 2006-06-25 devnull freememimage(i);
74 324891a5 2006-06-25 devnull free(buf);
75 324891a5 2006-06-25 devnull return nil;
76 324891a5 2006-06-25 devnull }
77 324891a5 2006-06-25 devnull maxy = atoi(hdr+0*12);
78 324891a5 2006-06-25 devnull nb = atoi(hdr+1*12);
79 324891a5 2006-06-25 devnull if(maxy<=miny || r.max.y<maxy){
80 324891a5 2006-06-25 devnull werrstr("readimage: bad maxy %d", maxy);
81 324891a5 2006-06-25 devnull goto Errout;
82 324891a5 2006-06-25 devnull }
83 324891a5 2006-06-25 devnull if(nb<=0 || ncblock<nb){
84 324891a5 2006-06-25 devnull werrstr("readimage: bad count %d", nb);
85 324891a5 2006-06-25 devnull goto Errout;
86 324891a5 2006-06-25 devnull }
87 324891a5 2006-06-25 devnull if(readn(fd, buf, nb)!=nb)
88 324891a5 2006-06-25 devnull goto Shortread;
89 324891a5 2006-06-25 devnull if(!new) /* old image: flip the data bits */
90 324891a5 2006-06-25 devnull _twiddlecompressed(buf, nb);
91 324891a5 2006-06-25 devnull cloadmemimage(i, Rect(r.min.x, miny, r.max.x, maxy), buf, nb);
92 324891a5 2006-06-25 devnull miny = maxy;
93 324891a5 2006-06-25 devnull }
94 324891a5 2006-06-25 devnull free(buf);
95 324891a5 2006-06-25 devnull return i;
96 324891a5 2006-06-25 devnull }