]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/dpic.c
ape/lib9: sync arm getfcr.s implementation
[plan9front.git] / sys / src / games / dpic.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <bio.h>
5
6 int dx = 64, dy = 64;
7 Biobuf *bi, *bo;
8 u32int pal[256];
9
10 u8int
11 get8(void)
12 {
13         uchar v;
14
15         if(Bread(bi, &v, 1) != 1)
16                 sysfatal("get8: short read");
17         return v;
18 }
19
20 u16int
21 get16(void)
22 {
23         u8int v;
24
25         v = get8();
26         return get8() << 8 | v;
27 }
28
29 u32int
30 get32(void)
31 {
32         u16int v;
33
34         v = get16();
35         return get16() << 16 | v;
36 }
37
38 u32int*
39 unpic(void)
40 {
41         int n, h;
42         u32int *p, *d, *cols, *buf;
43
44         dx = get16();
45         dy = get16();
46         cols = mallocz(dx * sizeof *cols, 1);
47         buf = mallocz(dx * dy * sizeof *buf, 1);
48         if(cols == nil || buf == nil)
49                 sysfatal("mallocz: %r");
50         get32();
51         for(p=cols; p<cols+dx; p++)
52                 *p = get32();
53         for(p=cols; p<cols+dx; p++){
54                 Bseek(bi, *p, 0);
55                 for(;;){
56                         if((h = get8()) == 0xff)
57                                 break;
58                         n = get8();
59                         get8();
60                         for(d=buf+(p-cols)+h*dx; n-->0; d+=dx)
61                                 *d = pal[get8()];
62                         get8();
63                 }
64         }
65         free(cols);
66         return buf;
67 }
68
69 u32int*
70 unflat(void)
71 {
72         u32int *p;
73         static u32int buf[4096];
74
75         for(p=buf; p<buf+nelem(buf); p++)
76                 *p = pal[get8()];
77         return buf;
78 }
79
80 void
81 getpal(char *f)
82 {
83         uchar u[3];
84         u32int *p;
85         Biobuf *bp;
86
87         if((bp = Bopen(f, OREAD)) == nil)
88                 sysfatal("getpal: %r");
89         for(p=pal; p<pal+nelem(pal); p++){
90                 if(Bread(bp, u, 3) != 3)
91                         sysfatal("getpal: short read: %r");
92                 *p = u[2]<<16 | u[1]<<8 | u[0];
93         }
94         Bterm(bp);
95 }
96
97 void
98 usage(void)
99 {
100         fprint(2, "usage: %s [-f] [-p palette] pic\n", argv0);
101         exits("usage");
102 }
103
104 void
105 main(int argc, char **argv)
106 {
107         int fd, flat;
108         char *p, c[9];
109         u32int *buf;
110
111         flat = 0;
112         p = "/mnt/wad/playpal";
113         ARGBEGIN{
114         case 'f': flat = 1; break;
115         case 'p': p = EARGF(usage()); break;
116         default: usage();
117         }ARGEND
118         if(*argv == nil)
119                 usage();
120         if((fd = open(*argv, OREAD)) < 0)
121                 sysfatal("open: %r");
122         getpal(p);
123         bi = Bfdopen(fd, OREAD);
124         bo = Bfdopen(1, OWRITE);
125         if(bi == nil || bo == nil)
126                 sysfatal("Bfdopen: %r");
127         buf = flat ? unflat() : unpic();
128         Bprint(bo, "%11s %11d %11d %11d %11d ",
129                 chantostr(c, XBGR32), 0, 0, dx, dy);
130         Bwrite(bo, buf, dx * dy * sizeof *buf);
131         exits(nil);
132 }