This uses the same co-ord calculation for border rects as for text cells. DRYer and avoids borders and blank rects being drawn at haf pixel offsets.
40 lines
1.2 KiB
GLSL
40 lines
1.2 KiB
GLSL
#version GLSL_VERSION
|
|
uniform uvec2 viewport;
|
|
uniform vec3 default_bg;
|
|
uniform vec3 active_border_color;
|
|
uniform vec3 inactive_border_color;
|
|
uniform vec3 bell_border_color;
|
|
uniform vec3 tab_bar_bg;
|
|
uniform vec3 tab_bar_margin_color;
|
|
in vec4 rect; // left, top, right, bottom
|
|
in uint rect_color;
|
|
out vec3 color;
|
|
|
|
// indices into the rect vector
|
|
const int LEFT = 0;
|
|
const int TOP = 1;
|
|
const int RIGHT = 2;
|
|
const int BOTTOM = 3;
|
|
const uint FF = uint(0xff);
|
|
|
|
const uvec2 pos_map[] = uvec2[4](
|
|
uvec2(RIGHT, TOP),
|
|
uvec2(RIGHT, BOTTOM),
|
|
uvec2(LEFT, BOTTOM),
|
|
uvec2(LEFT, TOP)
|
|
);
|
|
|
|
float to_color(uint c) {
|
|
return float(c & FF) / 255.0;
|
|
}
|
|
|
|
#define W(bit_number, which_color) ((float(((1 << bit_number) & rc) >> bit_number)) * which_color)
|
|
|
|
void main() {
|
|
uvec2 pos = pos_map[gl_VertexID];
|
|
gl_Position = vec4(rect[pos.x], rect[pos.y], 0, 1);
|
|
int rc = int(rect_color);
|
|
vec3 window_bg = vec3(to_color(rect_color >> 24), to_color(rect_color >> 16), to_color(rect_color >> 8));
|
|
color = W(0, default_bg) + W(1, active_border_color) + W(2, inactive_border_color) + W(3, window_bg) + W(4, bell_border_color) + W(5, tab_bar_bg) + W(6, tab_bar_margin_color);
|
|
}
|