blob: bb8681e1756287e8de3de0c687e727a7a5466a26 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// These are taken from kColorSysOutline
const float4 dark_color = vec4(142.0, 145.0, 143.0, 255.0) / 255.0;
const float4 light_color = vec4(116.0, 119.0, 117.0, 255.0) / 255.0;
const float max_extent = 25.0;
const float border_width = 5.0;
const float half_pixel = 0.5;
uniform float u_time;
uniform int u_dark;
uniform float u_emphasis;
uniform float u_progress;
uniform float u_insets;
uniform float u_float1;
uniform float u_float2;
uniform float u_float3;
uniform float u_float4;
uniform float u_float5;
uniform float u_float6;
uniform float u_float7;
uniform float u_float8;
uniform vec2 u_resolution;
uniform vec4 u_corner_radius;
uniform vec4 u_color1;
uniform vec4 u_color2;
uniform vec4 u_color3;
uniform vec4 u_color4;
uniform vec4 u_color5;
uniform vec4 u_color6;
// Applies a uniform insets to coords.
float2 InsetsCoord(float2 coord, float2 resolution, float insets) {
return (1.0 - 2.0 * insets / resolution) * coord + insets;
}
void BorderDistance(float2 coord, out float delta, out float aa) {
float2 tl = vec2(border_width) + 2 * u_insets;
float2 br = u_resolution - tl;
float2 dtl = coord - tl;
float2 dbr = br - coord;
float4 r = u_corner_radius;
if (dtl.y < r.x && dtl.x < r.x) {
delta = r.x - distance(coord, tl + vec2(r.x));
aa = half_pixel;
} else if (dtl.y < r.y && dbr.x < r.y) {
delta = r.y - distance(coord, vec2(br.x - r.y, tl.y + r.y));
aa = half_pixel;
} else if (dbr.y < r.w && dtl.x < r.w) {
delta = r.w - distance(coord, vec2(tl.x + r.w, br.y - r.w));
aa = half_pixel;
} else if (dbr.y < r.z && dbr.x < r.z) {
delta = r.z - distance(coord, br - vec2(r.z));
aa = half_pixel;
} else {
delta = min(min(dtl.x, dtl.y), min(dbr.x, dbr.y));
}
}
vec4 main(float2 coord) {
coord = InsetsCoord(coord, u_resolution, u_insets);
float4 border_color = light_color;
if (u_dark > 0) {
border_color = dark_color;
}
float extent = max_extent * u_emphasis;
float delta = 0.0;
float aa = 0.0;
BorderDistance(coord, delta, aa);
float opacity = 1.0 - min(max(delta / (extent + aa), 0.0), 1.0);
return border_color * (opacity * opacity);
}