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