12 static void RrLineWidth(struct RrInstance *i, int w)
14 if (i->gl_linewidth != w) {
20 void RrPlanarSet(struct RrSurface *sur,
21 enum RrSurfaceColorType type,
22 enum RrBevelType bevel,
23 struct RrColor *primary,
24 struct RrColor *secondary,
26 struct RrColor *border)
28 sur->data.planar.colortype = type;
29 sur->data.planar.bevel = bevel;
30 if (!(type == RR_PLANAR_NONE))
31 sur->data.planar.primary = *primary;
32 if (!(type == RR_PLANAR_NONE || type == RR_PLANAR_SOLID))
33 sur->data.planar.secondary = *secondary;
34 assert(borderwidth >= 0);
35 sur->data.planar.borderwidth = borderwidth >= 0 ? borderwidth : 0;
37 sur->data.planar.border = *border;
40 int RrPlanarHasAlpha(struct RrSurface *sur)
42 if (!(RrPlanarColorType(sur) == RR_PLANAR_NONE)) {
43 if (RrColorHasAlpha(RrPlanarPrimaryColor(sur))) return 1;
44 if (!RrPlanarColorType(sur) == RR_PLANAR_SOLID)
45 if (RrColorHasAlpha(RrPlanarSecondaryColor(sur))) return 1;
50 static void copy_parent(struct RrSurface *sur)
52 if (RrPlanarHasAlpha(sur)) {
54 struct RrSurface *parent = RrSurfaceParent(sur);
58 RrDebug("copy parent here pls\n");
62 static void RrBevelPaint(struct RrSurface *s, int inset, int raise)
64 int offset = RrPlanarBorderWidth(s) + inset;
68 w = RrSurfaceWidth(s) - 1;
69 h = RrSurfaceHeight(s) - 1;
71 RrLineWidth(RrSurfaceInstance(s), 1);
74 glColor4f(1.0, 1.0, 1.0, 0.25);
76 glColor4f(0.0, 0.0, 0.0, 0.25);
79 glVertex2i(x + offset, y + offset);
80 glVertex2i(x + offset, y + h - offset);
82 glVertex2i(x + offset, y + h - offset);
83 glVertex2i(x + w - offset, y + h - offset);
86 glColor4f(1.0, 1.0, 1.0, 0.25);
88 glColor4f(0.0, 0.0, 0.0, 0.25);
90 glVertex2i(x + w - offset, y + h - offset);
91 glVertex2i(x + w - offset, y + offset);
93 glVertex2i(x + w - offset, y + offset);
94 glVertex2i(x + offset, y + offset);
98 static void RrBorderPaint(struct RrSurface *s)
100 int x, y, w, h, offset, bwidth;
102 offset = RrPlanarBorderWidth(s) / 2;
103 bwidth = RrPlanarBorderWidth(s);
106 w = RrSurfaceWidth(s) - 1;
107 h = RrSurfaceHeight(s) - 1;
109 RrColor4f(&RrPlanarBorderColor(s));
111 RrLineWidth(RrSurfaceInstance(s), bwidth);
113 glBegin(GL_LINE_LOOP);
114 glVertex2i(x + offset, y + offset);
115 glVertex2i(x + offset, y + h - offset);
116 glVertex2i(x + w - offset, y + h - offset);
117 glVertex2i(x + w - offset, y + offset);
121 void RrPlanarPaint(struct RrSurface *sur, int absx, int absy)
123 struct RrColor *pri, *sec, avg;
128 pri = &RrPlanarPrimaryColor(sur);
129 sec = &RrPlanarSecondaryColor(sur);
133 w = RrSurfaceWidth(sur);
134 h = RrSurfaceHeight(sur);
136 switch (RrPlanarColorType(sur)) {
138 if (RrPlanarBorderWidth(sur))
141 case RR_PLANAR_SOLID:
142 glBegin(GL_TRIANGLES);
146 glVertex2i(x+w, y+h);
148 glVertex2i(x+w, y+h);
153 case RR_PLANAR_HORIZONTAL:
154 glBegin(GL_TRIANGLES);
159 glVertex2i(x+w, y+h);
161 glVertex2i(x+w, y+h);
167 case RR_PLANAR_VERTICAL:
168 glBegin(GL_TRIANGLES);
173 glVertex2i(x+w, y+h);
175 glVertex2i(x+w, y+h);
181 case RR_PLANAR_DIAGONAL:
182 RrColorAvg(&avg, pri, sec);
183 glBegin(GL_TRIANGLES);
189 glVertex2i(x+w, y+h);
192 glVertex2i(x+w, y+h);
199 case RR_PLANAR_CROSSDIAGONAL:
200 RrColorAvg(&avg, pri, sec);
201 glBegin(GL_TRIANGLES);
207 glVertex2i(x+w, y+h);
210 glVertex2i(x+w, y+h);
217 case RR_PLANAR_PYRAMID:
218 RrColorAvg(&avg, pri, sec);
219 glBegin(GL_TRIANGLES);
223 glVertex2i(x+w/2, y+h/2);
225 glVertex2i(x, y+h/2);
227 glVertex2i(x, y+h/2);
229 glVertex2i(x+w/2, y+h/2);
235 glVertex2i(x+w/2, y+h/2);
237 glVertex2i(x+w/2, y+h);
239 glVertex2i(x+w/2, y+h);
241 glVertex2i(x+w/2, y+h/2);
243 glVertex2i(x+w, y+h);
245 glVertex2i(x+w, y+h);
247 glVertex2i(x+w/2, y+h/2);
249 glVertex2i(x+w, y+h/2);
251 glVertex2i(x+w, y+h/2);
253 glVertex2i(x+w/2, y+h/2);
259 glVertex2i(x+w/2, y+h/2);
261 glVertex2i(x+w/2, y);
263 glVertex2i(x+w/2, y);
265 glVertex2i(x+w/2, y+h/2);
270 case RR_PLANAR_PIPECROSS:
271 glBegin(GL_TRIANGLES);
275 glVertex2i(x+w/2, y+h/2);
276 glVertex2i(x, y+h/2);
278 glVertex2i(x, y+h/2);
279 glVertex2i(x+w/2, y+h/2);
285 glVertex2i(x+w/2, y+h/2);
286 glVertex2i(x+w/2, y+h);
288 glVertex2i(x+w/2, y+h);
289 glVertex2i(x+w/2, y+h/2);
291 glVertex2i(x+w, y+h);
293 glVertex2i(x+w, y+h);
295 glVertex2i(x+w/2, y+h/2);
296 glVertex2i(x+w, y+h/2);
298 glVertex2i(x+w, y+h/2);
299 glVertex2i(x+w/2, y+h/2);
305 glVertex2i(x+w/2, y+h/2);
306 glVertex2i(x+w/2, y);
308 glVertex2i(x+w/2, y);
309 glVertex2i(x+w/2, y+h/2);
314 case RR_PLANAR_RECTANGLE:
315 glBegin(GL_TRIANGLES);
319 glVertex2i(x+w/2, y+h/2);
325 glVertex2i(x+w/2, y+h/2);
327 glVertex2i(x+w, y+h);
329 glVertex2i(x+w, y+h);
331 glVertex2i(x+w/2, y+h/2);
337 glVertex2i(x+w/2, y+h/2);
345 switch (RrPlanarBevelType(sur)) {
346 case RR_SUNKEN_OUTER:
347 RrBevelPaint(sur, 0, 0);
349 case RR_SUNKEN_INNER:
350 RrBevelPaint(sur, 1, 0);
352 case RR_RAISED_OUTER:
353 RrBevelPaint(sur, 0, 1);
355 case RR_RAISED_INNER:
356 RrBevelPaint(sur, 1, 1);
362 if (RrPlanarBorderWidth(sur))
366 int RrPlanarEdgeWidth(struct RrSurface *sur)
369 w = RrPlanarBorderWidth(sur);
370 switch (RrPlanarBevelType(sur)) {
371 case RR_SUNKEN_OUTER:
374 case RR_SUNKEN_INNER:
377 case RR_RAISED_OUTER:
380 case RR_RAISED_INNER:
389 void RrPlanarMinSize(struct RrSurface *sur, int *w, int *h)
391 *w = *h = 2 * RrPlanarEdgeWidth(sur);