Skip to content

Conversation

@madsmtm
Copy link
Member

@madsmtm madsmtm commented Jan 19, 2026

There is a very natural thing to do if we receive a damage rectangle outside supported bounds: Clamp it to be inside. This is also what's done by Wayland IIUC, and probably on other platforms as well, so let's do it in Softbuffer as well, and avoid the needless error case.

This also allows us to make present forward directly to present_with_damage, which is a nice internal simplification.

Finally, this exposed latent bugs with out-of-bounds damage regions on Windows, Web and X11, I've fixed those as well.

Tested on:

  • Android Doesn't use damage
  • CoreGraphics Doesn't use damage
  • KMS/DRM
  • Orbital
  • Wayland
  • Web
  • Win32
  • X11

@madsmtm madsmtm added the enhancement New feature or request label Jan 19, 2026
@madsmtm madsmtm force-pushed the madsmtm/remove-damage-out-of-range branch 2 times, most recently from 551b385 to ab88d81 Compare January 19, 2026 19:27
Comment on lines +271 to +266
let x = rect.x.try_into().unwrap_or(i32::MAX);
let y = rect.y.try_into().unwrap_or(i32::MAX);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MIN or 0?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, no, rect.x is a u32, the problem we're protecting against is if it's a large value.

Comment on lines +337 to +333
rect.x.try_into().unwrap_or(u16::MAX),
rect.y.try_into().unwrap_or(u16::MAX),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, it seems that not having x or y means the rect should be infinitely large, starting at 0 rather than MAX (and ending at MAX, making it 0×0)?

Comment on lines +412 to +409
rect.width.get().min(buffer_width.get()).into(),
rect.height.get().min(buffer_height.get()).into(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't the width/height take into account the x/y offset before calling .min()?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely sure, but I think no? See the docs for dirtyWidth:
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/putImageData#dirtywidth

I'd assume it's correct then to pass the size of the surface, though to be honest, I haven't really tested the Web part that much, only that it doesn't crash with width/height = u32::MAX.

@MarijnS95
Copy link
Member

This is also what's done by Wayland IIUC

Maybe explicitly linking this portion of the documentation:

The compositor ignores the parts of the damage that fall outside of the surface.

@madsmtm madsmtm force-pushed the madsmtm/remove-damage-out-of-range branch from ab88d81 to 65b9295 Compare January 20, 2026 19:33
@madsmtm madsmtm force-pushed the madsmtm/remove-damage-out-of-range branch from 65b9295 to 55ce8e9 Compare January 20, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Development

Successfully merging this pull request may close these issues.

3 participants