use super::*;
use crate::framebuffer::Framebuffer;
use crate::gfx_ctx::GfxCtx;
use crate::text::Font;
use crate::widget::{paint_subtree, Widget};
use crate::widgets::menu::{MenuBar, TopMenu};
use crate::{Color, DrawCtx, Rect, Size};
use std::sync::Arc;
const FONT_BYTES: &[u8] = include_bytes!("../../../demo/assets/CascadiaCode.ttf");
fn make_bar() -> MenuBar {
let font = Arc::new(Font::from_slice(FONT_BYTES).expect("font"));
MenuBar::new(
Arc::clone(&font),
vec![TopMenu::new("File", vec![]), TopMenu::new("Edit", vec![])],
|_| {},
)
}
fn paint_and_count_ink(bar: &mut MenuBar, physical_w: f64, effective: f64) -> u64 {
let logical_w = physical_w / effective;
let used = bar.layout(Size::new(logical_w, 40.0));
bar.set_bounds(Rect::new(0.0, 0.0, logical_w.max(used.width), used.height));
let w = physical_w.ceil() as u32;
let h = (used.height * effective).ceil() as u32;
let mut fb = Framebuffer::new(w, h);
{
let mut ctx = GfxCtx::new(&mut fb);
ctx.clear(Color::white());
ctx.scale(effective, effective);
paint_subtree(bar, &mut ctx);
}
let px = fb.pixels(); let bg = {
let sx = (w as f64 * 0.92) as u32;
let sy = h / 2;
let i = (sy * w + sx) as usize * 4;
(px[i] as i32, px[i + 1] as i32, px[i + 2] as i32)
};
let mut ink = 0u64;
for c in px.chunks_exact(4) {
let d = (c[0] as i32 - bg.0).abs() + (c[1] as i32 - bg.1).abs() + (c[2] as i32 - bg.2).abs();
if d > 80 {
ink += 1;
}
}
ink
}
#[test]
fn menu_bar_text_rerasters_when_effective_scale_changes() {
crate::font_settings::set_lcd_enabled(false); crate::device_scale::set_device_scale(1.0);
const PHYS_W: f64 = 400.0;
let mut bar = make_bar();
let ink_1x = paint_and_count_ink(&mut bar, PHYS_W, 1.0);
let ink_2x = paint_and_count_ink(&mut bar, PHYS_W, 2.0);
crate::font_settings::clear_lcd_enabled_override();
crate::device_scale::set_device_scale(1.0);
assert!(ink_1x > 0, "baseline frame must render menu-bar text (got {ink_1x})");
assert!(
ink_2x as f64 > ink_1x as f64 * 2.5,
"menu-bar text did not re-raster at the new effective scale: \
ink 1× = {ink_1x}, ink 2× = {ink_2x} (expected ~4×). \
The CPU backbuffer kept its stale (small) bitmap."
);
}