Blame


1 ed010601 2005-01-04 devnull #include <u.h>
2 ed010601 2005-01-04 devnull #include <libc.h>
3 ed010601 2005-01-04 devnull #include <draw.h>
4 ed010601 2005-01-04 devnull #include <event.h>
5 ed010601 2005-01-04 devnull #include <geometry.h>
6 ed010601 2005-01-04 devnull
7 ed010601 2005-01-04 devnull typedef struct Vert{
8 ed010601 2005-01-04 devnull Point3 world;
9 ed010601 2005-01-04 devnull Point3 screen;
10 ed010601 2005-01-04 devnull int color;
11 ed010601 2005-01-04 devnull }Vert;
12 ed010601 2005-01-04 devnull
13 ed010601 2005-01-04 devnull int nocubes;
14 ed010601 2005-01-04 devnull int ncolor;
15 ec41125f 2005-01-19 devnull Quaternion q = {1.,0.,0.,0.};
16 ed010601 2005-01-04 devnull Image *image;
17 ed010601 2005-01-04 devnull Image *bg;
18 ed010601 2005-01-04 devnull Image *color[256];
19 ed010601 2005-01-04 devnull Rectangle viewrect;
20 ed010601 2005-01-04 devnull int prevsel;
21 ed010601 2005-01-04 devnull
22 ec41125f 2005-01-19 devnull Point3
23 ec41125f 2005-01-19 devnull p3(double x, double y, double z, double w)
24 ec41125f 2005-01-19 devnull {
25 ec41125f 2005-01-19 devnull Point3 p;
26 ec41125f 2005-01-19 devnull
27 ec41125f 2005-01-19 devnull p.x = x;
28 ec41125f 2005-01-19 devnull p.y = y;
29 ec41125f 2005-01-19 devnull p.z = z;
30 ec41125f 2005-01-19 devnull p.w = w;
31 ec41125f 2005-01-19 devnull return p;
32 ec41125f 2005-01-19 devnull }
33 ec41125f 2005-01-19 devnull
34 ed010601 2005-01-04 devnull int
35 ed010601 2005-01-04 devnull cmp(Vert *a, Vert *b)
36 ed010601 2005-01-04 devnull {
37 ed010601 2005-01-04 devnull if(a->screen.z>b->screen.z)
38 ed010601 2005-01-04 devnull return -1;
39 ed010601 2005-01-04 devnull if(a->screen.z<b->screen.z)
40 ed010601 2005-01-04 devnull return 1;
41 ed010601 2005-01-04 devnull return 0;
42 ed010601 2005-01-04 devnull }
43 ed010601 2005-01-04 devnull
44 ed010601 2005-01-04 devnull /* crummy hack */
45 ed010601 2005-01-04 devnull void
46 ed010601 2005-01-04 devnull readcolmap(Display *d, RGB *cmap)
47 ed010601 2005-01-04 devnull {
48 ed010601 2005-01-04 devnull int i, rgb, r, g, b;
49 ed010601 2005-01-04 devnull
50 ed010601 2005-01-04 devnull for(i=0; i<256; i++){
51 ed010601 2005-01-04 devnull rgb = cmap2rgb(i);
52 ed010601 2005-01-04 devnull r = rgb>>16;
53 ed010601 2005-01-04 devnull g = (rgb>>8)&0xFF;
54 ed010601 2005-01-04 devnull b = rgb & 0xFF;
55 ed010601 2005-01-04 devnull cmap[i].red = r|(r<<8)|(r<<16)|(r<<24);
56 ed010601 2005-01-04 devnull cmap[i].green = g|(g<<8)|(g<<16)|(g<<24);
57 ed010601 2005-01-04 devnull cmap[i].blue = b|(b<<8)|(b<<16)|(b<<24);
58 ed010601 2005-01-04 devnull }
59 ed010601 2005-01-04 devnull }
60 ed010601 2005-01-04 devnull
61 ed010601 2005-01-04 devnull void
62 ed010601 2005-01-04 devnull colorspace(RGB *cmap, Vert *v)
63 ed010601 2005-01-04 devnull {
64 ed010601 2005-01-04 devnull Space *view;
65 ed010601 2005-01-04 devnull int i;
66 ed010601 2005-01-04 devnull
67 ed010601 2005-01-04 devnull for(i=0;i!=ncolor;i++){
68 ed010601 2005-01-04 devnull v[i].world.x=(cmap[i].red>>24)/255.-.5;
69 ed010601 2005-01-04 devnull v[i].world.y=(cmap[i].green>>24)/255.-.5;
70 ed010601 2005-01-04 devnull v[i].world.z=(cmap[i].blue>>24)/255.-.5;
71 ed010601 2005-01-04 devnull v[i].world.w=1.;
72 ed010601 2005-01-04 devnull v[i].color=i;
73 ed010601 2005-01-04 devnull }
74 ed010601 2005-01-04 devnull view = pushmat(0);
75 ed010601 2005-01-04 devnull viewport(view, viewrect, 1.);
76 ed010601 2005-01-04 devnull persp(view, 30., 3., 7.);
77 ec41125f 2005-01-19 devnull look(view, p3(0., 0., -5., 1.), p3(0., 0., 0., 1.),
78 ec41125f 2005-01-19 devnull p3(0., 1., 0., 1.));
79 ed010601 2005-01-04 devnull qrot(view, q);
80 ed010601 2005-01-04 devnull for(i=0;i!=ncolor;i++)
81 ed010601 2005-01-04 devnull v[i].screen = xformpointd(v[i].world, 0, view);
82 ed010601 2005-01-04 devnull popmat(view);
83 ed010601 2005-01-04 devnull }
84 ed010601 2005-01-04 devnull
85 ed010601 2005-01-04 devnull void
86 ed010601 2005-01-04 devnull line3(Vert a, Vert b)
87 ed010601 2005-01-04 devnull {
88 ed010601 2005-01-04 devnull line(image, Pt(a.screen.x, a.screen.y), Pt(b.screen.x, b.screen.y), 0, 0, 0, display->white, ZP);
89 ed010601 2005-01-04 devnull }
90 ed010601 2005-01-04 devnull
91 ed010601 2005-01-04 devnull
92 ed010601 2005-01-04 devnull void
93 ed010601 2005-01-04 devnull redraw(void)
94 ed010601 2005-01-04 devnull {
95 ed010601 2005-01-04 devnull int i, m;
96 ed010601 2005-01-04 devnull RGB cmap[256];
97 ed010601 2005-01-04 devnull Vert v[256];
98 ed010601 2005-01-04 devnull
99 ed010601 2005-01-04 devnull readcolmap(display, cmap);
100 ed010601 2005-01-04 devnull colorspace(cmap, v);
101 ed010601 2005-01-04 devnull draw(image, image->r, bg, nil, Pt(0, 0));
102 ed010601 2005-01-04 devnull m = Dx(viewrect)/2;
103 ed010601 2005-01-04 devnull if(m > Dy(viewrect)/2)
104 ed010601 2005-01-04 devnull m = Dy(viewrect)/2;
105 ed010601 2005-01-04 devnull ellipse(image, addpt(viewrect.min, divpt(Pt(Dx(viewrect), Dy(viewrect)), 2)),
106 ed010601 2005-01-04 devnull m, m, 1, display->white, ZP);
107 ed010601 2005-01-04 devnull
108 ed010601 2005-01-04 devnull line3(v[0], v[0x36]);
109 ed010601 2005-01-04 devnull line3(v[0x36], v[0x32]);
110 ed010601 2005-01-04 devnull line3(v[0x32], v[0x3F]);
111 ed010601 2005-01-04 devnull line3(v[0x3F], v[0]);
112 ed010601 2005-01-04 devnull
113 ed010601 2005-01-04 devnull line3(v[0xF0], v[0xF3]);
114 ed010601 2005-01-04 devnull line3(v[0xF3], v[0xFF]);
115 ed010601 2005-01-04 devnull line3(v[0xFF], v[0xFC]);
116 ed010601 2005-01-04 devnull line3(v[0xFC], v[0xF0]);
117 ed010601 2005-01-04 devnull
118 ed010601 2005-01-04 devnull line3(v[0], v[0xF0]);
119 ed010601 2005-01-04 devnull line3(v[0x36], v[0xF3]);
120 ed010601 2005-01-04 devnull line3(v[0x32], v[0xFF]);
121 ed010601 2005-01-04 devnull line3(v[0x3F], v[0xFC]);
122 ed010601 2005-01-04 devnull
123 ed010601 2005-01-04 devnull qsort(v, ncolor, sizeof(Vert), (int(*)(const void*, const void*))cmp);
124 ed010601 2005-01-04 devnull if(!nocubes)
125 ed010601 2005-01-04 devnull for(i=0; i!=ncolor; i++)
126 ed010601 2005-01-04 devnull draw(image, rectaddpt(Rect(-3, -3, 4, 4), Pt(v[i].screen.x, v[i].screen.y)),
127 ed010601 2005-01-04 devnull color[v[i].color], nil, Pt(0, 0));
128 ed010601 2005-01-04 devnull draw(screen, image->r, image, nil, image->r.min);
129 ed010601 2005-01-04 devnull flushimage(display, 1);
130 ed010601 2005-01-04 devnull }
131 ed010601 2005-01-04 devnull
132 ed010601 2005-01-04 devnull void
133 ed010601 2005-01-04 devnull eresized(int new)
134 ed010601 2005-01-04 devnull {
135 ed010601 2005-01-04 devnull int dx, dy;
136 ed010601 2005-01-04 devnull
137 ed010601 2005-01-04 devnull if(new && getwindow(display, Refnone) < 0){
138 ed010601 2005-01-04 devnull fprint(2, "colors: can't reattach to window: %r\n");
139 ed010601 2005-01-04 devnull exits("reshaped");
140 ed010601 2005-01-04 devnull }
141 ed010601 2005-01-04 devnull draw(screen, screen->r, display->black, nil, ZP);
142 ed010601 2005-01-04 devnull replclipr(screen, 0, insetrect(screen->r, 3));
143 ed010601 2005-01-04 devnull viewrect = screen->clipr;
144 ed010601 2005-01-04 devnull viewrect.min.y += stringsize(font, "0i").y + 5;
145 ed010601 2005-01-04 devnull if(image)
146 ed010601 2005-01-04 devnull freeimage(image);
147 ed010601 2005-01-04 devnull image = allocimage(display, viewrect, screen->chan, 0, DNofill);
148 ed010601 2005-01-04 devnull dx = viewrect.max.x-viewrect.min.x;
149 ed010601 2005-01-04 devnull dy = viewrect.max.y-viewrect.min.y;
150 ed010601 2005-01-04 devnull if(dx>dy){
151 ed010601 2005-01-04 devnull viewrect.min.x=(viewrect.min.x+viewrect.max.x-dy)/2;
152 ed010601 2005-01-04 devnull viewrect.max.x=viewrect.min.x+dy;
153 ed010601 2005-01-04 devnull }
154 ed010601 2005-01-04 devnull else{
155 ed010601 2005-01-04 devnull viewrect.min.y=(viewrect.min.y+viewrect.max.y-dx)/2;
156 ed010601 2005-01-04 devnull viewrect.max.y=viewrect.min.y+dx;
157 ed010601 2005-01-04 devnull }
158 ed010601 2005-01-04 devnull if(image==nil){
159 ed010601 2005-01-04 devnull fprint(2, "can't allocate image\n");
160 ed010601 2005-01-04 devnull exits("bad allocimage");
161 ed010601 2005-01-04 devnull }
162 ed010601 2005-01-04 devnull prevsel = -1;
163 ed010601 2005-01-04 devnull redraw();
164 ed010601 2005-01-04 devnull }
165 ed010601 2005-01-04 devnull
166 ed010601 2005-01-04 devnull void main(int argc, char **argv){
167 ed010601 2005-01-04 devnull Vert v[256];
168 ed010601 2005-01-04 devnull RGB cmap[256];
169 ed010601 2005-01-04 devnull char buf[100];
170 ed010601 2005-01-04 devnull Point p;
171 ed010601 2005-01-04 devnull Mouse m;
172 ed010601 2005-01-04 devnull int i;
173 ed010601 2005-01-04 devnull ulong bgcol;
174 ed010601 2005-01-04 devnull
175 ed010601 2005-01-04 devnull bgcol = DNofill;
176 ed010601 2005-01-04 devnull ARGBEGIN{
177 ed010601 2005-01-04 devnull case 'n':
178 ed010601 2005-01-04 devnull nocubes = 1;
179 ed010601 2005-01-04 devnull break;
180 ed010601 2005-01-04 devnull case 'b':
181 ed010601 2005-01-04 devnull bgcol = DBlack;
182 ed010601 2005-01-04 devnull break;
183 ed010601 2005-01-04 devnull case 'w':
184 ed010601 2005-01-04 devnull bgcol = DWhite;
185 ed010601 2005-01-04 devnull break;
186 ed010601 2005-01-04 devnull }ARGEND
187 ed010601 2005-01-04 devnull
188 ed010601 2005-01-04 devnull initdraw(0,0,0);
189 ed010601 2005-01-04 devnull ncolor=256;
190 ed010601 2005-01-04 devnull for(i=0;i!=ncolor;i++)
191 ed010601 2005-01-04 devnull color[i] = allocimage(display, Rect(0, 0, 1, 1), CMAP8, 1, cmap2rgba(i));
192 ed010601 2005-01-04 devnull if(bgcol==DNofill){
193 ed010601 2005-01-04 devnull bg = allocimage(display, Rect(0, 0, 2, 2), screen->chan, 1, DWhite);
194 ed010601 2005-01-04 devnull draw(bg, Rect(0, 0, 1, 1), color[0], nil, Pt(0, 0));
195 ed010601 2005-01-04 devnull draw(bg, Rect(1, 1, 2, 2), color[0], nil, Pt(0, 0));
196 ed010601 2005-01-04 devnull }else
197 ed010601 2005-01-04 devnull bg = allocimage(display, Rect(0,0,1,1), screen->chan, 1, bgcol);
198 ed010601 2005-01-04 devnull
199 ed010601 2005-01-04 devnull einit(Emouse);
200 ed010601 2005-01-04 devnull eresized(0);
201 ed010601 2005-01-04 devnull
202 ed010601 2005-01-04 devnull for(;;){
203 ed010601 2005-01-04 devnull m = emouse();
204 ed010601 2005-01-04 devnull if(m.buttons&1)
205 ed010601 2005-01-04 devnull qball(viewrect, &m, &q, redraw, 0);
206 ed010601 2005-01-04 devnull else if(m.buttons & 2){
207 ed010601 2005-01-04 devnull readcolmap(display, cmap);
208 ed010601 2005-01-04 devnull colorspace(cmap, v);
209 ed010601 2005-01-04 devnull qsort(v, ncolor, sizeof(Vert), (int(*)(const void*, const void*))cmp);
210 ed010601 2005-01-04 devnull while(m.buttons){
211 ed010601 2005-01-04 devnull for(i=ncolor-1; i!=0; i--){
212 ed010601 2005-01-04 devnull if(ptinrect(m.xy, rectaddpt(Rect(-3, -3, 4, 4), Pt(v[i].screen.x, v[i].screen.y)))){
213 ed010601 2005-01-04 devnull i = v[i].color;
214 ed010601 2005-01-04 devnull if(i == prevsel)
215 ed010601 2005-01-04 devnull break;
216 ed010601 2005-01-04 devnull sprint(buf, "index %3d r %3ld g %3ld b %3ld",
217 ed010601 2005-01-04 devnull i,
218 ed010601 2005-01-04 devnull cmap[i].red>>24,
219 ed010601 2005-01-04 devnull cmap[i].green>>24,
220 ed010601 2005-01-04 devnull cmap[i].blue>>24);
221 ed010601 2005-01-04 devnull p = addpt(screen->r.min, Pt(2,2));
222 ed010601 2005-01-04 devnull draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->black, nil, p);
223 ed010601 2005-01-04 devnull string(screen, p, display->white, ZP, font, buf);
224 ed010601 2005-01-04 devnull prevsel = i;
225 ed010601 2005-01-04 devnull break;
226 ed010601 2005-01-04 devnull }
227 ed010601 2005-01-04 devnull }
228 ed010601 2005-01-04 devnull m = emouse();
229 ed010601 2005-01-04 devnull }
230 ed010601 2005-01-04 devnull }else if(m.buttons&4){
231 ed010601 2005-01-04 devnull do
232 ed010601 2005-01-04 devnull m = emouse();
233 ed010601 2005-01-04 devnull while(m.buttons);
234 ed010601 2005-01-04 devnull exits(0);
235 ed010601 2005-01-04 devnull }
236 ed010601 2005-01-04 devnull }
237 ed010601 2005-01-04 devnull }