shell/elements: Fix corners order for clipping/shadows

This commit is contained in:
Victoria Brekenfeld 2025-12-12 19:16:51 +01:00 committed by Victoria Brekenfeld
parent ea470f0a4b
commit b6f0855a31
5 changed files with 34 additions and 28 deletions

View file

@ -97,10 +97,10 @@ where
Uniform::new( Uniform::new(
"corner_radius", "corner_radius",
[ [
radius[0] as f32,
radius[1] as f32,
radius[2] as f32,
radius[3] as f32, radius[3] as f32,
radius[1] as f32,
radius[0] as f32,
radius[2] as f32,
], ],
), ),
Uniform::new( Uniform::new(
@ -142,10 +142,10 @@ where
geo: Rectangle<f64, Logical>, geo: Rectangle<f64, Logical>,
radius: [u8; 4], radius: [u8; 4],
) -> [Rectangle<f64, Logical>; 4] { ) -> [Rectangle<f64, Logical>; 4] {
let top_left = radius[0] as f64; let top_left = radius[3] as f64;
let top_right = radius[1] as f64; let top_right = radius[1] as f64;
let bottom_right = radius[2] as f64; let bottom_right = radius[0] as f64;
let bottom_left = radius[3] as f64; let bottom_left = radius[2] as f64;
[ [
Rectangle::new(geo.loc, Size::from((top_left, top_left))), Rectangle::new(geo.loc, Size::from((top_left, top_left))),

View file

@ -30,17 +30,17 @@ float rounding_alpha(vec2 coords, vec2 size) {
vec2 center; vec2 center;
float radius; float radius;
if (coords.x < corner_radius.w && coords.y < corner_radius.w) { if (coords.x < corner_radius.x && coords.y < corner_radius.x) {
radius = corner_radius.w; radius = corner_radius.x;
center = vec2(radius, radius); center = vec2(radius, radius);
} else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) { } else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) {
radius = corner_radius.y; radius = corner_radius.y;
center = vec2(size.x - radius, radius); center = vec2(size.x - radius, radius);
} else if (size.x - corner_radius.x < coords.x && size.y - corner_radius.x < coords.y) { } else if (size.x - corner_radius.z < coords.x && size.y - corner_radius.z < coords.y) {
radius = corner_radius.x;
center = vec2(size.x - radius, size.y - radius);
} else if (coords.x < corner_radius.z && size.y - corner_radius.z < coords.y) {
radius = corner_radius.z; radius = corner_radius.z;
center = vec2(size.x - radius, size.y - radius);
} else if (coords.x < corner_radius.w && size.y - corner_radius.w < coords.y) {
radius = corner_radius.w;
center = vec2(radius, size.y - radius); center = vec2(radius, size.y - radius);
} else { } else {
return 1.0; return 1.0;

View file

@ -74,17 +74,17 @@ float rounding_alpha(vec2 coords, vec2 size, vec4 corner_radius) {
vec2 center; vec2 center;
float radius; float radius;
if (coords.x < corner_radius.w && coords.y < corner_radius.w) { if (coords.x < corner_radius.x && coords.y < corner_radius.x) {
radius = corner_radius.w; radius = corner_radius.x;
center = vec2(radius, radius); center = vec2(radius, radius);
} else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) { } else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) {
radius = corner_radius.y; radius = corner_radius.y;
center = vec2(size.x - radius, radius); center = vec2(size.x - radius, radius);
} else if (size.x - corner_radius.x < coords.x && size.y - corner_radius.x < coords.y) { } else if (size.x - corner_radius.z < coords.x && size.y - corner_radius.z < coords.y) {
radius = corner_radius.x;
center = vec2(size.x - radius, size.y - radius);
} else if (coords.x < corner_radius.z && size.y - corner_radius.z < coords.y) {
radius = corner_radius.z; radius = corner_radius.z;
center = vec2(size.x - radius, size.y - radius);
} else if (coords.x < corner_radius.w && size.y - corner_radius.w < coords.y) {
radius = corner_radius.w;
center = vec2(radius, size.y - radius); center = vec2(radius, size.y - radius);
} else { } else {
return 1.0; return 1.0;

View file

@ -82,6 +82,12 @@ impl ShadowShader {
let offset = [0., 5.]; let offset = [0., 5.];
let color = [0., 0., 0., 0.45]; let color = [0., 0., 0., 0.45];
let radius = radius.map(|r| ceil(r as f64)); let radius = radius.map(|r| ceil(r as f64));
let radius = [
radius[3], // top_left
radius[1], // top_right
radius[0], // bottom_right
radius[2], // bottom_left
];
let width = softness; let width = softness;
let sigma = width / 2.; let sigma = width / 2.;

View file

@ -391,12 +391,12 @@ impl CosmicWindow {
.map(|x| x.round() as u8); .map(|x| x.round() as u8);
if has_ssd && !clip { if has_ssd && !clip {
// bottom corners // bottom corners
radii[1] = 0; radii[0] = 0;
radii[3] = 0; radii[2] = 0;
if is_tiled { if is_tiled {
// top corners // top corners
radii[0] = 0; radii[1] = 0;
radii[2] = 0; radii[3] = 0;
} }
} }
@ -456,12 +456,12 @@ impl CosmicWindow {
&& !is_maximized; && !is_maximized;
if has_ssd && !clip { if has_ssd && !clip {
// bottom corners // bottom corners
radii[1] = 0; radii[0] = 0;
radii[3] = 0; radii[2] = 0;
if is_tiled { if is_tiled {
// top corners // top corners
radii[0] = 0; radii[1] = 0;
radii[2] = 0; radii[3] = 0;
} }
} }
@ -513,8 +513,8 @@ impl CosmicWindow {
.into_iter() .into_iter()
.map(|elem| { .map(|elem| {
if has_ssd { if has_ssd {
radii[0] = 0; radii[1] = 0;
radii[2] = 0; radii[3] = 0;
} }
if radii.iter().any(|x| *x != 0) if radii.iter().any(|x| *x != 0)
&& clip && clip