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>
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;
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;
23 ec41125f 2005-01-19 devnull p3(double x, double y, double z, double w)
25 ec41125f 2005-01-19 devnull Point3 p;
31 ec41125f 2005-01-19 devnull return p;
35 ed010601 2005-01-04 devnull cmp(Vert *a, Vert *b)
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;
44 ed010601 2005-01-04 devnull /* crummy hack */
46 ed010601 2005-01-04 devnull readcolmap(Display *d, RGB *cmap)
48 ed010601 2005-01-04 devnull int i, rgb, r, g, b;
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);
62 ed010601 2005-01-04 devnull colorspace(RGB *cmap, Vert *v)
64 ed010601 2005-01-04 devnull Space *view;
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;
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);
86 ed010601 2005-01-04 devnull line3(Vert a, Vert b)
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);
93 ed010601 2005-01-04 devnull redraw(void)
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];
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);
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]);
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]);
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]);
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);
133 ed010601 2005-01-04 devnull eresized(int new)
135 ed010601 2005-01-04 devnull int dx, dy;
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");
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;
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;
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");
162 ed010601 2005-01-04 devnull prevsel = -1;
163 ed010601 2005-01-04 devnull redraw();
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;
173 ed010601 2005-01-04 devnull ulong bgcol;
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;
180 ed010601 2005-01-04 devnull case 'b':
181 ed010601 2005-01-04 devnull bgcol = DBlack;
183 ed010601 2005-01-04 devnull case 'w':
184 ed010601 2005-01-04 devnull bgcol = DWhite;
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));
197 ed010601 2005-01-04 devnull bg = allocimage(display, Rect(0,0,1,1), screen->chan, 1, bgcol);
199 ed010601 2005-01-04 devnull einit(Emouse);
200 ed010601 2005-01-04 devnull eresized(0);
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)
216 ed010601 2005-01-04 devnull sprint(buf, "index %3d r %3ld g %3ld b %3ld",
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;
228 ed010601 2005-01-04 devnull m = emouse();
230 ed010601 2005-01-04 devnull }else if(m.buttons&4){
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);