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 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;
36 sur->data.planar.border = *border;
39 int RrPlanarHasAlpha(struct RrSurface *sur)
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;
49 static void copy_parent(struct RrSurface *sur)
51 if (RrPlanarHasAlpha(sur)) {
53 struct RrSurface *parent = RrSurfaceParent(sur);
57 RrDebug("copy parent here pls\n");
61 static void RrBevelPaint(struct RrSurface *s, int inset, int raise)
63 int offset = RrPlanarBorderWidth(s) + inset;
67 w = RrSurfaceWidth(s) - 1;
68 h = RrSurfaceHeight(s) - 1;
70 RrLineWidth(RrSurfaceInstance(s), 1);
73 glColor4f(1.0, 1.0, 1.0, 0.25);
75 glColor4f(0.0, 0.0, 0.0, 0.25);
78 glVertex2i(x + offset, y + offset);
79 glVertex2i(x + offset, y + h - offset);
81 glVertex2i(x + offset, y + h - offset);
82 glVertex2i(x + w - offset, y + h - offset);
85 glColor4f(1.0, 1.0, 1.0, 0.25);
87 glColor4f(0.0, 0.0, 0.0, 0.25);
89 glVertex2i(x + w - offset, y + h - offset);
90 glVertex2i(x + w - offset, y + offset);
92 glVertex2i(x + w - offset, y + offset);
93 glVertex2i(x + offset, y + offset);
97 static void RrBorderPaint(struct RrSurface *s)
99 int x, y, w, h, offset, bwidth;
101 offset = RrPlanarBorderWidth(s) / 2;
102 bwidth = RrPlanarBorderWidth(s);
105 w = RrSurfaceWidth(s) - 1;
106 h = RrSurfaceHeight(s) - 1;
108 RrColor4f(&RrPlanarBorderColor(s));
110 RrLineWidth(RrSurfaceInstance(s), bwidth);
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);
120 void RrPlanarPaint(struct RrSurface *sur, int absx, int absy)
122 struct RrColor *pri, *sec, avg;
127 pri = &RrPlanarPrimaryColor(sur);
128 sec = &RrPlanarSecondaryColor(sur);
132 w = RrSurfaceWidth(sur);
133 h = RrSurfaceHeight(sur);
135 switch (RrPlanarColorType(sur)) {
138 case RR_PLANAR_SOLID:
139 glBegin(GL_TRIANGLES);
143 glVertex2i(x+w, y+h);
145 glVertex2i(x+w, y+h);
150 case RR_PLANAR_HORIZONTAL:
151 glBegin(GL_TRIANGLES);
156 glVertex2i(x+w, y+h);
158 glVertex2i(x+w, y+h);
164 case RR_PLANAR_VERTICAL:
165 glBegin(GL_TRIANGLES);
170 glVertex2i(x+w, y+h);
172 glVertex2i(x+w, y+h);
178 case RR_PLANAR_DIAGONAL:
179 RrColorAvg(&avg, pri, sec);
180 glBegin(GL_TRIANGLES);
186 glVertex2i(x+w, y+h);
189 glVertex2i(x+w, y+h);
196 case RR_PLANAR_CROSSDIAGONAL:
197 RrColorAvg(&avg, pri, sec);
198 glBegin(GL_TRIANGLES);
204 glVertex2i(x+w, y+h);
207 glVertex2i(x+w, y+h);
214 case RR_PLANAR_PYRAMID:
215 RrColorAvg(&avg, pri, sec);
216 glBegin(GL_TRIANGLES);
220 glVertex2i(x+w/2, y+h/2);
222 glVertex2i(x, y+h/2);
224 glVertex2i(x, y+h/2);
226 glVertex2i(x+w/2, y+h/2);
232 glVertex2i(x+w/2, y+h/2);
234 glVertex2i(x+w/2, y+h);
236 glVertex2i(x+w/2, y+h);
238 glVertex2i(x+w/2, y+h/2);
240 glVertex2i(x+w, y+h);
242 glVertex2i(x+w, y+h);
244 glVertex2i(x+w/2, y+h/2);
246 glVertex2i(x+w, y+h/2);
248 glVertex2i(x+w, y+h/2);
250 glVertex2i(x+w/2, y+h/2);
256 glVertex2i(x+w/2, y+h/2);
258 glVertex2i(x+w/2, y);
260 glVertex2i(x+w/2, y);
262 glVertex2i(x+w/2, y+h/2);
267 case RR_PLANAR_PIPECROSS:
268 glBegin(GL_TRIANGLES);
272 glVertex2i(x+w/2, y+h/2);
273 glVertex2i(x, y+h/2);
275 glVertex2i(x, y+h/2);
276 glVertex2i(x+w/2, y+h/2);
282 glVertex2i(x+w/2, y+h/2);
283 glVertex2i(x+w/2, y+h);
285 glVertex2i(x+w/2, y+h);
286 glVertex2i(x+w/2, y+h/2);
288 glVertex2i(x+w, y+h);
290 glVertex2i(x+w, y+h);
292 glVertex2i(x+w/2, y+h/2);
293 glVertex2i(x+w, y+h/2);
295 glVertex2i(x+w, y+h/2);
296 glVertex2i(x+w/2, y+h/2);
302 glVertex2i(x+w/2, y+h/2);
303 glVertex2i(x+w/2, y);
305 glVertex2i(x+w/2, y);
306 glVertex2i(x+w/2, y+h/2);
311 case RR_PLANAR_RECTANGLE:
312 glBegin(GL_TRIANGLES);
316 glVertex2i(x+w/2, y+h/2);
322 glVertex2i(x+w/2, y+h/2);
324 glVertex2i(x+w, y+h);
326 glVertex2i(x+w, y+h);
328 glVertex2i(x+w/2, y+h/2);
334 glVertex2i(x+w/2, y+h/2);
342 switch (RrPlanarBevelType(sur)) {
343 case RR_SUNKEN_OUTER:
344 RrBevelPaint(sur, 0, 0);
346 case RR_SUNKEN_INNER:
347 RrBevelPaint(sur, 1, 0);
349 case RR_RAISED_OUTER:
350 RrBevelPaint(sur, 0, 1);
352 case RR_RAISED_INNER:
353 RrBevelPaint(sur, 1, 1);
359 if (RrPlanarBorderWidth(sur))
363 int RrPlanarEdgeWidth(struct RrSurface *sur)
366 w = RrPlanarBorderWidth(sur);
367 switch (RrPlanarBevelType(sur)) {
368 case RR_SUNKEN_OUTER:
371 case RR_SUNKEN_INNER:
374 case RR_RAISED_OUTER:
377 case RR_RAISED_INNER:
386 void RrPlanarMinSize(struct RrSurface *sur, int *w, int *h)
388 *w = *h = 2 * RrPlanarEdgeWidth(sur);