]> icculus.org git repositories - dana/openbox.git/blob - render2/planar.c
fix a seg, fix the loop for rendering a string
[dana/openbox.git] / render2 / planar.c
1 #include "planar.h"
2 #include "surface.h"
3 #include "color.h"
4 #include "debug.h"
5 #include <GL/glx.h>
6
7 void RrPlanarSet(struct RrSurface *sur,
8                  enum RrSurfaceColorType type,
9                  struct RrColor *primary,
10                  struct RrColor *secondary)
11 {
12     sur->data.planar.colortype = type;
13     sur->data.planar.primary = *primary;
14     sur->data.planar.secondary = *secondary;
15 }
16
17 static void copy_parent(struct RrSurface *sur)
18 {
19     int ncols;
20     int copy;
21
22     switch (RrPlanarColorType(sur)) {
23     case RR_PLANAR_NONE:
24         return;
25     case RR_PLANAR_SOLID:
26         ncols = 1;
27         break;
28     case RR_PLANAR_HORIZONTAL:
29         ncols = 2;
30         break;
31     case RR_PLANAR_VERTICAL:
32         ncols = 2;
33         break;
34     case RR_PLANAR_DIAGONAL:
35         ncols = 2;
36         break;
37     case RR_PLANAR_CROSSDIAGONAL:
38         ncols = 2;
39         break;
40     case RR_PLANAR_PYRAMID:
41         ncols = 2;
42         break;
43     case RR_PLANAR_PIPECROSS:
44         ncols = 2;
45         break;
46     case RR_PLANAR_RECTANGLE:
47         ncols = 2;
48         break;
49     }
50
51     copy = 0;
52     if (ncols >= 1 && RrColorHasAlpha(RrPlanarPrimaryColor(sur)))
53         copy = 1;
54     if (ncols >= 1 && RrColorHasAlpha(RrPlanarSecondaryColor(sur)))
55         copy = 1;
56     if (copy) {
57         /*
58         struct RrSurface *parent = RrSurfaceParent(sur);
59
60         XXX COPY PARENT PLS
61         */
62         RrDebug("copy parent here pls\n");
63     }
64 }
65
66 void RrPlanarPaint(struct RrSurface *sur, int absx, int absy)
67 {   
68     struct RrColor *pri, *sec, avg;
69     int x, y, w, h;
70
71     copy_parent(sur);
72
73     pri = &RrPlanarPrimaryColor(sur);
74     sec = &RrPlanarSecondaryColor(sur);
75
76     x = RrSurfaceX(sur);
77     y = RrSurfaceY(sur);
78     w = RrSurfaceWidth(sur);
79     h = RrSurfaceHeight(sur);
80
81     switch (RrPlanarColorType(sur)) {
82     case RR_PLANAR_NONE:
83         return;
84     case RR_PLANAR_SOLID:
85         glBegin(GL_TRIANGLES);
86         RrColor3f(pri);
87         glVertex2i(x, y);
88         glVertex2i(x+w, y);
89         glVertex2i(x+w, y+h);
90
91         glVertex2i(x+w, y+h);
92         glVertex2i(x, y+h);
93         glVertex2i(x, y);
94         glEnd();
95         break;
96     case RR_PLANAR_HORIZONTAL:
97         glBegin(GL_TRIANGLES);
98         RrColor3f(pri);
99         glVertex2i(x, y);
100         RrColor3f(sec);
101         glVertex2i(x+w, y);
102         glVertex2i(x+w, y+h);
103
104         glVertex2i(x+w, y+h);
105         RrColor3f(pri);
106         glVertex2i(x, y+h);
107         glVertex2i(x, y);
108         glEnd();
109         break;
110     case RR_PLANAR_VERTICAL:
111         glBegin(GL_TRIANGLES);
112         RrColor3f(pri);
113         glVertex2i(x, y);
114         glVertex2i(x+w, y);
115         RrColor3f(sec);
116         glVertex2i(x+w, y+h);
117
118         glVertex2i(x+w, y+h);
119         glVertex2i(x, y+h);
120         RrColor3f(pri);
121         glVertex2i(x, y);
122         glEnd();
123         break;
124     case RR_PLANAR_DIAGONAL:
125         RrColorAvg(&avg, pri, sec);
126         glBegin(GL_TRIANGLES);
127         RrColor3f(&avg);
128         glVertex2i(x, y);
129         RrColor3f(pri);
130         glVertex2i(x+w, y);
131         RrColor3f(&avg);
132         glVertex2i(x+w, y+h);
133
134         RrColor3f(&avg);
135         glVertex2i(x+w, y+h);
136         RrColor3f(sec);
137         glVertex2i(x, y+h);
138         RrColor3f(&avg);
139         glVertex2i(x, y);
140         glEnd();
141         break;
142     case RR_PLANAR_CROSSDIAGONAL:
143         RrColorAvg(&avg, pri, sec);
144         glBegin(GL_TRIANGLES);
145         RrColor3f(pri);
146         glVertex2i(x, y);
147         RrColor3f(&avg);
148         glVertex2i(x+w, y);
149         RrColor3f(sec);
150         glVertex2i(x+w, y+h);
151
152         RrColor3f(sec);
153         glVertex2i(x+w, y+h);
154         RrColor3f(&avg);
155         glVertex2i(x, y+h);
156         RrColor3f(pri);
157         glVertex2i(x, y);
158         glEnd();
159         break;
160     case RR_PLANAR_PYRAMID:
161         RrColorAvg(&avg, pri, sec);
162         glBegin(GL_TRIANGLES);
163         RrColor3f(pri);
164         glVertex2i(x, y);
165         RrColor3f(sec);
166         glVertex2i(x+w/2, y+h/2);
167         RrColor3f(&avg);
168         glVertex2i(x, y+h/2);
169
170         glVertex2i(x, y+h/2);
171         RrColor3f(sec);
172         glVertex2i(x+w/2, y+h/2);
173         RrColor3f(pri);
174         glVertex2i(x, y+h);
175
176         glVertex2i(x, y+h);
177         RrColor3f(sec);
178         glVertex2i(x+w/2, y+h/2);
179         RrColor3f(&avg);
180         glVertex2i(x+w/2, y+h);
181
182         glVertex2i(x+w/2, y+h);
183         RrColor3f(sec);
184         glVertex2i(x+w/2, y+h/2);
185         RrColor3f(pri);
186         glVertex2i(x+w, y+h);
187
188         glVertex2i(x+w, y+h);
189         RrColor3f(sec);
190         glVertex2i(x+w/2, y+h/2);
191         RrColor3f(&avg);
192         glVertex2i(x+w, y+h/2);
193
194         glVertex2i(x+w, y+h/2);
195         RrColor3f(sec);
196         glVertex2i(x+w/2, y+h/2);
197         RrColor3f(pri);
198         glVertex2i(x+w, y);
199
200         glVertex2i(x+w, y);
201         RrColor3f(sec);
202         glVertex2i(x+w/2, y+h/2);
203         RrColor3f(&avg);
204         glVertex2i(x+w/2, y);
205
206         glVertex2i(x+w/2, y);
207         RrColor3f(sec);
208         glVertex2i(x+w/2, y+h/2);
209         RrColor3f(pri);
210         glVertex2i(x, y);
211         glEnd();
212         break;
213     case RR_PLANAR_PIPECROSS:
214         glBegin(GL_TRIANGLES);
215         RrColor3f(pri);
216         glVertex2i(x, y);
217         RrColor3f(sec);
218         glVertex2i(x+w/2, y+h/2);
219         glVertex2i(x, y+h/2);
220
221         glVertex2i(x, y+h/2);
222         glVertex2i(x+w/2, y+h/2);
223         RrColor3f(pri);
224         glVertex2i(x, y+h);
225
226         glVertex2i(x, y+h);
227         RrColor3f(sec);
228         glVertex2i(x+w/2, y+h/2);
229         glVertex2i(x+w/2, y+h);
230
231         glVertex2i(x+w/2, y+h);
232         glVertex2i(x+w/2, y+h/2);
233         RrColor3f(pri);
234         glVertex2i(x+w, y+h);
235
236         glVertex2i(x+w, y+h);
237         RrColor3f(sec);
238         glVertex2i(x+w/2, y+h/2);
239         glVertex2i(x+w, y+h/2);
240
241         glVertex2i(x+w, y+h/2);
242         glVertex2i(x+w/2, y+h/2);
243         RrColor3f(pri);
244         glVertex2i(x+w, y);
245
246         glVertex2i(x+w, y);
247         RrColor3f(sec);
248         glVertex2i(x+w/2, y+h/2);
249         glVertex2i(x+w/2, y);
250
251         glVertex2i(x+w/2, y);
252         glVertex2i(x+w/2, y+h/2);
253         RrColor3f(pri);
254         glVertex2i(x, y);
255         glEnd();
256         break;
257     case RR_PLANAR_RECTANGLE:
258         glBegin(GL_TRIANGLES);
259         RrColor3f(pri);
260         glVertex2i(x, y);
261         RrColor3f(sec);
262         glVertex2i(x+w/2, y+h/2);
263         RrColor3f(pri);
264         glVertex2i(x, y+h);
265
266         glVertex2i(x, y+h);
267         RrColor3f(sec);
268         glVertex2i(x+w/2, y+h/2);
269         RrColor3f(pri);
270         glVertex2i(x+w, y+h);
271
272         glVertex2i(x+w, y+h);
273         RrColor3f(sec);
274         glVertex2i(x+w/2, y+h/2);
275         RrColor3f(pri);
276         glVertex2i(x+w, y);
277
278         glVertex2i(x+w, y);
279         RrColor3f(sec);
280         glVertex2i(x+w/2, y+h/2);
281         RrColor3f(pri);
282         glVertex2i(x, y);
283
284         glEnd();
285         break;
286     }
287 }
288
289 void RrPlanarMinSize(struct RrSurface *sur, int *w, int *h)
290 {
291     *w = 0;
292     *h = 0;
293 }