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