]> icculus.org git repositories - dana/openbox.git/blob - render2/planar.c
the kernel is using th gl shit to render itself, but with the old style frame shit...
[dana/openbox.git] / render2 / planar.c
1 #include "planar.h"
2 #include "surface.h"
3 #include "texture.h"
4 #include "color.h"
5 #include "debug.h"
6 #include "font.h"
7 #include <string.h>
8 #include <assert.h>
9 #include <GL/glx.h>
10
11 void RrPlanarSet(struct RrSurface *sur,
12                  enum RrSurfaceColorType type,
13                  enum RrBevelType bevel,
14                  struct RrColor *primary,
15                  struct RrColor *secondary,
16                  int borderwidth,
17                  struct RrColor *border)
18 {
19     sur->data.planar.colortype = type;
20     sur->data.planar.bevel = bevel;
21     sur->data.planar.primary = *primary;
22     if (!(type == RR_PLANAR_NONE || type == RR_PLANAR_SOLID))
23         sur->data.planar.secondary = *secondary;
24     assert(borderwidth >= 0);
25     sur->data.planar.borderwidth = borderwidth >= 0 ? borderwidth : 0;
26     if (borderwidth)
27         sur->data.planar.border = *border;
28 }
29
30 static void copy_parent(struct RrSurface *sur)
31 {
32     int ncols;
33     int copy;
34
35     switch (RrPlanarColorType(sur)) {
36     case RR_PLANAR_NONE:
37         return;
38     case RR_PLANAR_SOLID:
39         ncols = 1;
40         break;
41     case RR_PLANAR_HORIZONTAL:
42         ncols = 2;
43         break;
44     case RR_PLANAR_VERTICAL:
45         ncols = 2;
46         break;
47     case RR_PLANAR_DIAGONAL:
48         ncols = 2;
49         break;
50     case RR_PLANAR_CROSSDIAGONAL:
51         ncols = 2;
52         break;
53     case RR_PLANAR_PYRAMID:
54         ncols = 2;
55         break;
56     case RR_PLANAR_PIPECROSS:
57         ncols = 2;
58         break;
59     case RR_PLANAR_RECTANGLE:
60         ncols = 2;
61         break;
62     }
63
64     copy = 0;
65     if (ncols >= 1 && RrColorHasAlpha(RrPlanarPrimaryColor(sur)))
66         copy = 1;
67     if (ncols >= 1 && RrColorHasAlpha(RrPlanarSecondaryColor(sur)))
68         copy = 1;
69     if (copy) {
70         /*
71         struct RrSurface *parent = RrSurfaceParent(sur);
72
73         XXX COPY PARENT PLS
74         */
75         RrDebug("copy parent here pls\n");
76     }
77 }
78
79 static void RrBevelPaint(int x, int y, int w, int h, int bwidth,
80                          int inset, int raise)
81 {
82     int offset = bwidth + inset;
83     h--; w--;
84
85     if (raise)
86         glColor4f(1.0, 1.0, 1.0, 0.25);
87     else
88         glColor4f(0.0, 0.0, 0.0, 0.25);
89
90     glBegin(GL_LINES);
91     glVertex2i(x + offset, y + offset);
92     glVertex2i(x + offset, y + h - offset);
93
94     glVertex2i(x + offset, y + h - offset);
95     glVertex2i(x + w - offset, y + h - offset);
96
97     if (!raise)
98         glColor4f(1.0, 1.0, 1.0, 0.25);
99     else
100         glColor4f(0.0, 0.0, 0.0, 0.25);
101
102     glVertex2i(x + w - offset, y + h - offset);
103     glVertex2i(x + w - offset,  y + offset);
104                
105     glVertex2i(x + w - offset, y + offset);
106     glVertex2i(x + offset, y + offset);
107     glEnd();
108 }
109
110 void RrPlanarPaint(struct RrSurface *sur, int absx, int absy)
111 {   
112     struct RrColor *pri, *sec, avg;
113     int x, y, w, h;
114
115     copy_parent(sur);
116
117     pri = &RrPlanarPrimaryColor(sur);
118     sec = &RrPlanarSecondaryColor(sur);
119
120     x = RrSurfaceX(sur);
121     y = RrSurfaceY(sur);
122     w = RrSurfaceWidth(sur);
123     h = RrSurfaceHeight(sur);
124
125     switch (RrPlanarColorType(sur)) {
126     case RR_PLANAR_NONE:
127         return;
128     case RR_PLANAR_SOLID:
129         glBegin(GL_TRIANGLES);
130         RrColor3f(pri);
131         glVertex2i(x, y);
132         glVertex2i(x+w, y);
133         glVertex2i(x+w, y+h);
134
135         glVertex2i(x+w, y+h);
136         glVertex2i(x, y+h);
137         glVertex2i(x, y);
138         glEnd();
139         break;
140     case RR_PLANAR_HORIZONTAL:
141         glBegin(GL_TRIANGLES);
142         RrColor3f(pri);
143         glVertex2i(x, y);
144         RrColor3f(sec);
145         glVertex2i(x+w, y);
146         glVertex2i(x+w, y+h);
147
148         glVertex2i(x+w, y+h);
149         RrColor3f(pri);
150         glVertex2i(x, y+h);
151         glVertex2i(x, y);
152         glEnd();
153         break;
154     case RR_PLANAR_VERTICAL:
155         glBegin(GL_TRIANGLES);
156         RrColor3f(pri);
157         glVertex2i(x, y);
158         glVertex2i(x+w, y);
159         RrColor3f(sec);
160         glVertex2i(x+w, y+h);
161
162         glVertex2i(x+w, y+h);
163         glVertex2i(x, y+h);
164         RrColor3f(pri);
165         glVertex2i(x, y);
166         glEnd();
167         break;
168     case RR_PLANAR_DIAGONAL:
169         RrColorAvg(&avg, pri, sec);
170         glBegin(GL_TRIANGLES);
171         RrColor3f(&avg);
172         glVertex2i(x, y);
173         RrColor3f(pri);
174         glVertex2i(x+w, y);
175         RrColor3f(&avg);
176         glVertex2i(x+w, y+h);
177
178         RrColor3f(&avg);
179         glVertex2i(x+w, y+h);
180         RrColor3f(sec);
181         glVertex2i(x, y+h);
182         RrColor3f(&avg);
183         glVertex2i(x, y);
184         glEnd();
185         break;
186     case RR_PLANAR_CROSSDIAGONAL:
187         RrColorAvg(&avg, pri, sec);
188         glBegin(GL_TRIANGLES);
189         RrColor3f(pri);
190         glVertex2i(x, y);
191         RrColor3f(&avg);
192         glVertex2i(x+w, y);
193         RrColor3f(sec);
194         glVertex2i(x+w, y+h);
195
196         RrColor3f(sec);
197         glVertex2i(x+w, y+h);
198         RrColor3f(&avg);
199         glVertex2i(x, y+h);
200         RrColor3f(pri);
201         glVertex2i(x, y);
202         glEnd();
203         break;
204     case RR_PLANAR_PYRAMID:
205         RrColorAvg(&avg, pri, sec);
206         glBegin(GL_TRIANGLES);
207         RrColor3f(pri);
208         glVertex2i(x, y);
209         RrColor3f(sec);
210         glVertex2i(x+w/2, y+h/2);
211         RrColor3f(&avg);
212         glVertex2i(x, y+h/2);
213
214         glVertex2i(x, y+h/2);
215         RrColor3f(sec);
216         glVertex2i(x+w/2, y+h/2);
217         RrColor3f(pri);
218         glVertex2i(x, y+h);
219
220         glVertex2i(x, y+h);
221         RrColor3f(sec);
222         glVertex2i(x+w/2, y+h/2);
223         RrColor3f(&avg);
224         glVertex2i(x+w/2, y+h);
225
226         glVertex2i(x+w/2, y+h);
227         RrColor3f(sec);
228         glVertex2i(x+w/2, y+h/2);
229         RrColor3f(pri);
230         glVertex2i(x+w, y+h);
231
232         glVertex2i(x+w, y+h);
233         RrColor3f(sec);
234         glVertex2i(x+w/2, y+h/2);
235         RrColor3f(&avg);
236         glVertex2i(x+w, y+h/2);
237
238         glVertex2i(x+w, y+h/2);
239         RrColor3f(sec);
240         glVertex2i(x+w/2, y+h/2);
241         RrColor3f(pri);
242         glVertex2i(x+w, y);
243
244         glVertex2i(x+w, y);
245         RrColor3f(sec);
246         glVertex2i(x+w/2, y+h/2);
247         RrColor3f(&avg);
248         glVertex2i(x+w/2, y);
249
250         glVertex2i(x+w/2, y);
251         RrColor3f(sec);
252         glVertex2i(x+w/2, y+h/2);
253         RrColor3f(pri);
254         glVertex2i(x, y);
255         glEnd();
256         break;
257     case RR_PLANAR_PIPECROSS:
258         glBegin(GL_TRIANGLES);
259         RrColor3f(pri);
260         glVertex2i(x, y);
261         RrColor3f(sec);
262         glVertex2i(x+w/2, y+h/2);
263         glVertex2i(x, y+h/2);
264
265         glVertex2i(x, y+h/2);
266         glVertex2i(x+w/2, y+h/2);
267         RrColor3f(pri);
268         glVertex2i(x, y+h);
269
270         glVertex2i(x, y+h);
271         RrColor3f(sec);
272         glVertex2i(x+w/2, y+h/2);
273         glVertex2i(x+w/2, y+h);
274
275         glVertex2i(x+w/2, y+h);
276         glVertex2i(x+w/2, y+h/2);
277         RrColor3f(pri);
278         glVertex2i(x+w, y+h);
279
280         glVertex2i(x+w, y+h);
281         RrColor3f(sec);
282         glVertex2i(x+w/2, y+h/2);
283         glVertex2i(x+w, y+h/2);
284
285         glVertex2i(x+w, y+h/2);
286         glVertex2i(x+w/2, y+h/2);
287         RrColor3f(pri);
288         glVertex2i(x+w, y);
289
290         glVertex2i(x+w, y);
291         RrColor3f(sec);
292         glVertex2i(x+w/2, y+h/2);
293         glVertex2i(x+w/2, y);
294
295         glVertex2i(x+w/2, y);
296         glVertex2i(x+w/2, y+h/2);
297         RrColor3f(pri);
298         glVertex2i(x, y);
299         glEnd();
300         break;
301     case RR_PLANAR_RECTANGLE:
302         glBegin(GL_TRIANGLES);
303         RrColor3f(pri);
304         glVertex2i(x, y);
305         RrColor3f(sec);
306         glVertex2i(x+w/2, y+h/2);
307         RrColor3f(pri);
308         glVertex2i(x, y+h);
309
310         glVertex2i(x, y+h);
311         RrColor3f(sec);
312         glVertex2i(x+w/2, y+h/2);
313         RrColor3f(pri);
314         glVertex2i(x+w, y+h);
315
316         glVertex2i(x+w, y+h);
317         RrColor3f(sec);
318         glVertex2i(x+w/2, y+h/2);
319         RrColor3f(pri);
320         glVertex2i(x+w, y);
321
322         glVertex2i(x+w, y);
323         RrColor3f(sec);
324         glVertex2i(x+w/2, y+h/2);
325         RrColor3f(pri);
326         glVertex2i(x, y);
327
328         glEnd();
329         break;
330     }
331
332     switch (RrPlanarBevelType(sur)) {
333     case RR_SUNKEN_OUTER:
334         RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
335                      RrSurfaceWidth(sur), RrSurfaceHeight(sur),
336                      0, 0, 0);
337         break;
338     case RR_SUNKEN_INNER:
339         RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
340                      RrSurfaceWidth(sur), RrSurfaceHeight(sur),
341                      0, 1, 0);
342         break;
343     case RR_RAISED_OUTER:
344         RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
345                      RrSurfaceWidth(sur), RrSurfaceHeight(sur),
346                      0, 0, 1);
347         break;
348     case RR_RAISED_INNER:
349         RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
350                      RrSurfaceWidth(sur), RrSurfaceHeight(sur),
351                      0, 1, 1);
352         break;
353     case RR_BEVEL_NONE:
354         break;
355     }    
356 }
357
358 void RrPlanarMinSize(struct RrSurface *sur, int *w, int *h)
359 {
360     *w = 0;
361     *h = 0;
362 }