Blame


1 8a3b2ceb 2004-04-24 devnull #include <u.h>
2 8a3b2ceb 2004-04-24 devnull #include <libc.h>
3 8a3b2ceb 2004-04-24 devnull #include <bio.h>
4 8a3b2ceb 2004-04-24 devnull #include "sky.h"
5 8a3b2ceb 2004-04-24 devnull
6 8a3b2ceb 2004-04-24 devnull static void dodecode(Biobuf*, Pix*, int, int, uchar*);
7 347aa646 2009-04-30 rsc static int32 getlong(uchar*);
8 8a3b2ceb 2004-04-24 devnull int debug;
9 8a3b2ceb 2004-04-24 devnull
10 8a3b2ceb 2004-04-24 devnull Img*
11 8a3b2ceb 2004-04-24 devnull dssread(char *file)
12 8a3b2ceb 2004-04-24 devnull {
13 8a3b2ceb 2004-04-24 devnull int nx, ny, scale, sumall;
14 8a3b2ceb 2004-04-24 devnull Pix *p, *pend;
15 8a3b2ceb 2004-04-24 devnull uchar buf[21];
16 8a3b2ceb 2004-04-24 devnull Biobuf *bp;
17 8a3b2ceb 2004-04-24 devnull Img *ip;
18 8a3b2ceb 2004-04-24 devnull
19 8a3b2ceb 2004-04-24 devnull if(debug)
20 8a3b2ceb 2004-04-24 devnull Bprint(&bout, "reading %s\n", file);
21 8a3b2ceb 2004-04-24 devnull bp = Bopen(file, OREAD);
22 8a3b2ceb 2004-04-24 devnull if(bp == 0)
23 8a3b2ceb 2004-04-24 devnull return 0;
24 8a3b2ceb 2004-04-24 devnull if(Bread(bp, buf, sizeof(buf)) != sizeof(buf) ||
25 8a3b2ceb 2004-04-24 devnull buf[0] != 0xdd || buf[1] != 0x99){
26 8a3b2ceb 2004-04-24 devnull werrstr("bad format");
27 8a3b2ceb 2004-04-24 devnull return 0;
28 8a3b2ceb 2004-04-24 devnull }
29 8a3b2ceb 2004-04-24 devnull nx = getlong(buf+2);
30 8a3b2ceb 2004-04-24 devnull ny = getlong(buf+6);
31 8a3b2ceb 2004-04-24 devnull scale = getlong(buf+10);
32 8a3b2ceb 2004-04-24 devnull sumall = getlong(buf+14);
33 8a3b2ceb 2004-04-24 devnull if(debug)
34 8a3b2ceb 2004-04-24 devnull fprint(2, "%s: nx=%d, ny=%d, scale=%d, sumall=%d, nbitplanes=%d,%d,%d\n",
35 8a3b2ceb 2004-04-24 devnull file, nx, ny, scale, sumall, buf[18], buf[19], buf[20]);
36 8a3b2ceb 2004-04-24 devnull ip = malloc(sizeof(Img) + (nx*ny-1)*sizeof(int));
37 8a3b2ceb 2004-04-24 devnull if(ip == 0){
38 8a3b2ceb 2004-04-24 devnull Bterm(bp);
39 8a3b2ceb 2004-04-24 devnull werrstr("no memory");
40 8a3b2ceb 2004-04-24 devnull return 0;
41 8a3b2ceb 2004-04-24 devnull }
42 8a3b2ceb 2004-04-24 devnull ip->nx = nx;
43 8a3b2ceb 2004-04-24 devnull ip->ny = ny;
44 8a3b2ceb 2004-04-24 devnull dodecode(bp, ip->a, nx, ny, buf+18);
45 8a3b2ceb 2004-04-24 devnull ip->a[0] = sumall; /* sum of all pixels */
46 8a3b2ceb 2004-04-24 devnull Bterm(bp);
47 8a3b2ceb 2004-04-24 devnull if(scale > 1){
48 8a3b2ceb 2004-04-24 devnull p = ip->a;
49 8a3b2ceb 2004-04-24 devnull pend = &ip->a[nx*ny];
50 8a3b2ceb 2004-04-24 devnull while(p < pend)
51 8a3b2ceb 2004-04-24 devnull *p++ *= scale;
52 8a3b2ceb 2004-04-24 devnull }
53 8a3b2ceb 2004-04-24 devnull hinv(ip->a, nx, ny);
54 8a3b2ceb 2004-04-24 devnull return ip;
55 8a3b2ceb 2004-04-24 devnull }
56 8a3b2ceb 2004-04-24 devnull
57 8a3b2ceb 2004-04-24 devnull static
58 8a3b2ceb 2004-04-24 devnull void
59 8a3b2ceb 2004-04-24 devnull dodecode(Biobuf *infile, Pix *a, int nx, int ny, uchar *nbitplanes)
60 8a3b2ceb 2004-04-24 devnull {
61 8a3b2ceb 2004-04-24 devnull int nel, nx2, ny2, bits, mask;
62 8a3b2ceb 2004-04-24 devnull Pix *aend, px;
63 8a3b2ceb 2004-04-24 devnull
64 8a3b2ceb 2004-04-24 devnull nel = nx*ny;
65 8a3b2ceb 2004-04-24 devnull nx2 = (nx+1)/2;
66 8a3b2ceb 2004-04-24 devnull ny2 = (ny+1)/2;
67 8a3b2ceb 2004-04-24 devnull memset(a, 0, nel*sizeof(*a));
68 8a3b2ceb 2004-04-24 devnull
69 8a3b2ceb 2004-04-24 devnull /*
70 8a3b2ceb 2004-04-24 devnull * Initialize bit input
71 8a3b2ceb 2004-04-24 devnull */
72 8a3b2ceb 2004-04-24 devnull start_inputing_bits();
73 8a3b2ceb 2004-04-24 devnull
74 8a3b2ceb 2004-04-24 devnull /*
75 8a3b2ceb 2004-04-24 devnull * read bit planes for each quadrant
76 8a3b2ceb 2004-04-24 devnull */
77 8a3b2ceb 2004-04-24 devnull qtree_decode(infile, &a[0], ny, nx2, ny2, nbitplanes[0]);
78 8a3b2ceb 2004-04-24 devnull qtree_decode(infile, &a[ny2], ny, nx2, ny/2, nbitplanes[1]);
79 8a3b2ceb 2004-04-24 devnull qtree_decode(infile, &a[ny*nx2], ny, nx/2, ny2, nbitplanes[1]);
80 8a3b2ceb 2004-04-24 devnull qtree_decode(infile, &a[ny*nx2+ny2], ny, nx/2, ny/2, nbitplanes[2]);
81 8a3b2ceb 2004-04-24 devnull
82 8a3b2ceb 2004-04-24 devnull /*
83 8a3b2ceb 2004-04-24 devnull * make sure there is an EOF symbol (nybble=0) at end
84 8a3b2ceb 2004-04-24 devnull */
85 8a3b2ceb 2004-04-24 devnull if(input_nybble(infile) != 0){
86 8a3b2ceb 2004-04-24 devnull fprint(2, "dodecode: bad bit plane values\n");
87 8a3b2ceb 2004-04-24 devnull exits("format");
88 8a3b2ceb 2004-04-24 devnull }
89 8a3b2ceb 2004-04-24 devnull
90 8a3b2ceb 2004-04-24 devnull /*
91 8a3b2ceb 2004-04-24 devnull * get the sign bits
92 8a3b2ceb 2004-04-24 devnull */
93 8a3b2ceb 2004-04-24 devnull aend = &a[nel];
94 8a3b2ceb 2004-04-24 devnull mask = 0;
95 8a3b2ceb 2004-04-24 devnull bits = 0;;
96 8a3b2ceb 2004-04-24 devnull for(; a<aend; a++) {
97 8a3b2ceb 2004-04-24 devnull if(px = *a) {
98 8a3b2ceb 2004-04-24 devnull if(mask == 0) {
99 8a3b2ceb 2004-04-24 devnull mask = 0x80;
100 8a3b2ceb 2004-04-24 devnull bits = Bgetc(infile);
101 8a3b2ceb 2004-04-24 devnull }
102 8a3b2ceb 2004-04-24 devnull if(mask & bits)
103 8a3b2ceb 2004-04-24 devnull *a = -px;
104 8a3b2ceb 2004-04-24 devnull mask >>= 1;
105 8a3b2ceb 2004-04-24 devnull }
106 8a3b2ceb 2004-04-24 devnull }
107 8a3b2ceb 2004-04-24 devnull }
108 8a3b2ceb 2004-04-24 devnull
109 8a3b2ceb 2004-04-24 devnull static
110 347aa646 2009-04-30 rsc int32 getlong(uchar *p)
111 8a3b2ceb 2004-04-24 devnull {
112 8a3b2ceb 2004-04-24 devnull return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
113 8a3b2ceb 2004-04-24 devnull }