1#version GLSL_VERSION
2uniform uvec2 viewport;
3uniform vec3 default_bg;
4uniform vec3 active_border_color;
5uniform vec3 inactive_border_color;
6uniform vec3 bell_border_color;
7in uvec4 rect;  // left, top, right, bottom
8in uint rect_color;
9out vec3 color;
10
11// indices into the rect vector
12const int LEFT = 0;
13const int TOP = 1;
14const int RIGHT = 2;
15const int BOTTOM = 3;
16const uint FF = uint(0xff);
17
18const uvec2 pos_map[] = uvec2[4](
19    uvec2(RIGHT, TOP),
20    uvec2(RIGHT, BOTTOM),
21    uvec2(LEFT, BOTTOM),
22    uvec2(LEFT, TOP)
23);
24
25vec2 to_opengl(uint x, uint y) {
26    return vec2(
27        -1.0 + 2.0 * (float(x) / float(viewport.x)),
28        1.0 - 2.0 * (float(y) / float(viewport.y))
29    );
30}
31
32float to_color(uint c) {
33    return float(c & FF) / 255.0;
34}
35
36void main() {
37    uvec2 pos = pos_map[gl_VertexID];
38    gl_Position = vec4(to_opengl(rect[pos.x], rect[pos.y]), 0, 1);
39    int rc = int(rect_color);
40    vec3 window_bg = vec3(to_color(rect_color >> 24), to_color(rect_color >> 16), to_color(rect_color >> 8));
41    color = float(1 & rc) * default_bg + float((2 & rc) >> 1) * active_border_color + float((4 & rc) >> 2) * inactive_border_color + float((8 & rc) >> 3) * window_bg + float((16 & rc) >> 4) * bell_border_color;
42}
43