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