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