11 void RrPlanarSet(struct RrSurface *sur,
12 enum RrSurfaceColorType type,
13 enum RrBevelType bevel,
14 struct RrColor *primary,
15 struct RrColor *secondary,
17 struct RrColor *border)
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;
27 sur->data.planar.border = *border;
30 int RrPlanarHasAlpha(struct RrSurface *sur)
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;
40 static void copy_parent(struct RrSurface *sur)
42 if (RrPlanarHasAlpha(sur)) {
44 struct RrSurface *parent = RrSurfaceParent(sur);
48 RrDebug("copy parent here pls\n");
52 static void RrBevelPaint(int x, int y, int w, int h, int bwidth,
55 int offset = bwidth + inset;
59 glColor4f(1.0, 1.0, 1.0, 0.25);
61 glColor4f(0.0, 0.0, 0.0, 0.25);
64 glVertex2i(x + offset, y + offset);
65 glVertex2i(x + offset, y + h - offset);
67 glVertex2i(x + offset, y + h - offset);
68 glVertex2i(x + w - offset, y + h - offset);
71 glColor4f(1.0, 1.0, 1.0, 0.25);
73 glColor4f(0.0, 0.0, 0.0, 0.25);
75 glVertex2i(x + w - offset, y + h - offset);
76 glVertex2i(x + w - offset, y + offset);
78 glVertex2i(x + w - offset, y + offset);
79 glVertex2i(x + offset, y + offset);
83 static void RrBorderPaint(int x, int y, int w, int h, int bwidth,
84 struct RrColor *color)
86 int offset = bwidth / 2;
91 glBegin(GL_LINE_LOOP);
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? */
101 void RrPlanarPaint(struct RrSurface *sur, int absx, int absy)
103 struct RrColor *pri, *sec, avg;
108 pri = &RrPlanarPrimaryColor(sur);
109 sec = &RrPlanarSecondaryColor(sur);
113 w = RrSurfaceWidth(sur);
114 h = RrSurfaceHeight(sur);
116 switch (RrPlanarColorType(sur)) {
119 case RR_PLANAR_SOLID:
120 glBegin(GL_TRIANGLES);
124 glVertex2i(x+w, y+h);
126 glVertex2i(x+w, y+h);
131 case RR_PLANAR_HORIZONTAL:
132 glBegin(GL_TRIANGLES);
137 glVertex2i(x+w, y+h);
139 glVertex2i(x+w, y+h);
145 case RR_PLANAR_VERTICAL:
146 glBegin(GL_TRIANGLES);
151 glVertex2i(x+w, y+h);
153 glVertex2i(x+w, y+h);
159 case RR_PLANAR_DIAGONAL:
160 RrColorAvg(&avg, pri, sec);
161 glBegin(GL_TRIANGLES);
167 glVertex2i(x+w, y+h);
170 glVertex2i(x+w, y+h);
177 case RR_PLANAR_CROSSDIAGONAL:
178 RrColorAvg(&avg, pri, sec);
179 glBegin(GL_TRIANGLES);
185 glVertex2i(x+w, y+h);
188 glVertex2i(x+w, y+h);
195 case RR_PLANAR_PYRAMID:
196 RrColorAvg(&avg, pri, sec);
197 glBegin(GL_TRIANGLES);
201 glVertex2i(x+w/2, y+h/2);
203 glVertex2i(x, y+h/2);
205 glVertex2i(x, y+h/2);
207 glVertex2i(x+w/2, y+h/2);
213 glVertex2i(x+w/2, y+h/2);
215 glVertex2i(x+w/2, y+h);
217 glVertex2i(x+w/2, y+h);
219 glVertex2i(x+w/2, y+h/2);
221 glVertex2i(x+w, y+h);
223 glVertex2i(x+w, y+h);
225 glVertex2i(x+w/2, y+h/2);
227 glVertex2i(x+w, y+h/2);
229 glVertex2i(x+w, y+h/2);
231 glVertex2i(x+w/2, y+h/2);
237 glVertex2i(x+w/2, y+h/2);
239 glVertex2i(x+w/2, y);
241 glVertex2i(x+w/2, y);
243 glVertex2i(x+w/2, y+h/2);
248 case RR_PLANAR_PIPECROSS:
249 glBegin(GL_TRIANGLES);
253 glVertex2i(x+w/2, y+h/2);
254 glVertex2i(x, y+h/2);
256 glVertex2i(x, y+h/2);
257 glVertex2i(x+w/2, y+h/2);
263 glVertex2i(x+w/2, y+h/2);
264 glVertex2i(x+w/2, y+h);
266 glVertex2i(x+w/2, y+h);
267 glVertex2i(x+w/2, y+h/2);
269 glVertex2i(x+w, y+h);
271 glVertex2i(x+w, y+h);
273 glVertex2i(x+w/2, y+h/2);
274 glVertex2i(x+w, y+h/2);
276 glVertex2i(x+w, y+h/2);
277 glVertex2i(x+w/2, y+h/2);
283 glVertex2i(x+w/2, y+h/2);
284 glVertex2i(x+w/2, y);
286 glVertex2i(x+w/2, y);
287 glVertex2i(x+w/2, y+h/2);
292 case RR_PLANAR_RECTANGLE:
293 glBegin(GL_TRIANGLES);
297 glVertex2i(x+w/2, y+h/2);
303 glVertex2i(x+w/2, y+h/2);
305 glVertex2i(x+w, y+h);
307 glVertex2i(x+w, y+h);
309 glVertex2i(x+w/2, y+h/2);
315 glVertex2i(x+w/2, y+h/2);
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);
329 case RR_SUNKEN_INNER:
330 RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
331 RrSurfaceWidth(sur), RrSurfaceHeight(sur),
332 RrPlanarBorderWidth(sur), 1, 0);
334 case RR_RAISED_OUTER:
335 RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
336 RrSurfaceWidth(sur), RrSurfaceHeight(sur),
337 RrPlanarBorderWidth(sur), 0, 1);
339 case RR_RAISED_INNER:
340 RrBevelPaint(RrSurfaceX(sur), RrSurfaceY(sur),
341 RrSurfaceWidth(sur), RrSurfaceHeight(sur),
342 RrPlanarBorderWidth(sur), 1, 1);
348 if (RrPlanarBorderWidth(sur))
349 RrBorderPaint(RrSurfaceX(sur), RrSurfaceY(sur),
350 RrSurfaceWidth(sur), RrSurfaceHeight(sur),
351 RrPlanarBorderWidth(sur), &RrPlanarBorderColor(sur));
354 void RrPlanarMinSize(struct RrSurface *sur, int *w, int *h)
356 *w = *h = RrPlanarBorderWidth(sur);
357 switch (RrPlanarBevelType(sur)) {
358 case RR_SUNKEN_OUTER:
362 case RR_SUNKEN_INNER:
366 case RR_RAISED_OUTER:
370 case RR_RAISED_INNER: