Fix: panic when dragging window between monitors of different pixels_per_point (#4868)

Fix: panic when dragging window between monitors of different
pixels_per_point

This will continue to help us as we develop `egui`.
I hope you agree with my defense of `panic`.

* Relate #3959
* Relate #4088

* Closes #4178
* Closes #4179


There is also a way to add log if necessary.
```
                log::debug!("Anti-panic behavior occurs");
```

---------

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
This commit is contained in:
rustbasic 2024-09-18 02:49:53 +09:00 committed by GitHub
parent f38515afe9
commit 1474c17b0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 6 deletions

View File

@ -2418,12 +2418,18 @@ impl Context {
self.write(|ctx| {
let tessellation_options = ctx.memory.options.tessellation_options;
let texture_atlas = ctx
.fonts
.get(&pixels_per_point.into())
.expect("tessellate called with a different pixels_per_point than the font atlas was created with. \
You should use egui::FullOutput::pixels_per_point when tessellating.")
.texture_atlas();
let texture_atlas = if let Some(fonts) = ctx.fonts.get(&pixels_per_point.into()) {
fonts.texture_atlas()
} else {
#[cfg(feature = "log")]
log::warn!("No font size matching {pixels_per_point} pixels per point found.");
ctx.fonts
.iter()
.next()
.expect("No fonts loaded")
.1
.texture_atlas()
};
let (font_tex_size, prepared_discs) = {
let atlas = texture_atlas.lock();
(atlas.size(), atlas.prepared_discs())

View File

@ -153,6 +153,12 @@ impl PaintList {
/// and then later setting it using `paint_list.set(idx, cr, frame);`.
#[inline(always)]
pub fn set(&mut self, idx: ShapeIdx, clip_rect: Rect, shape: Shape) {
if self.0.len() <= idx.0 {
#[cfg(feature = "log")]
log::warn!("Index {} is out of bounds for PaintList", idx.0);
return;
}
self.0[idx.0] = ClippedShape { clip_rect, shape };
}