Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
use webrender_api::ColorF;
use webrender_api::debugger::CompositorDebugInfo;
pub fn ui(
ui: &mut egui::Ui,
info: &mut CompositorDebugInfo,
) {
let mut valid_z_layers = 0;
for tile in &info.tiles {
valid_z_layers |= 1 << tile.z_id;
}
let colors = [
ColorF::new(1.0, 1.0, 1.0, 1.0),
ColorF::new(1.0, 0.0, 0.0, 1.0),
ColorF::new(0.0, 1.0, 0.0, 1.0),
ColorF::new(0.7, 0.7, 1.0, 1.0),
ColorF::new(1.0, 1.0, 0.0, 1.0),
ColorF::new(0.0, 1.0, 1.0, 1.0),
ColorF::new(1.0, 0.0, 1.0, 1.0),
];
ui.horizontal(|ui| {
for i in 0..32 {
if valid_z_layers & 1 << i != 0 {
let mut enabled = info.enabled_z_layers & (1 << i) != 0;
if ui.checkbox(&mut enabled, format!("z_id {}", i)).changed() {
if enabled {
info.enabled_z_layers |= 1 << i;
} else {
info.enabled_z_layers &= !(1 << i);
}
}
}
}
});
let (response, painter) = ui.allocate_painter(
ui.available_size(),
egui::Sense::hover(),
);
let rect = response.rect;
// Background
painter.rect_filled(rect, 0.0, egui::Color32::from_rgb(77, 77, 77));
let mut x_max = -f32::INFINITY;
let mut x_min = f32::INFINITY;
let mut y_max = -f32::INFINITY;
let mut y_min = f32::INFINITY;
for tile in &info.tiles {
x_min = x_min.min(tile.device_rect.min.x);
x_max = x_max.max(tile.device_rect.max.x);
y_min = y_min.min(tile.device_rect.min.y);
y_max = y_max.max(tile.device_rect.max.y);
}
let src_width = x_max - x_min;
let src_height = y_max - y_min;
let dest_width = rect.width();
let dest_height = rect.height();
let scale_x = dest_width / src_width;
let scale_y = dest_height / src_height;
let scale = scale_x.min(scale_y);
let scaled_width = src_width * scale;
let scaled_height = src_height * scale;
let offset_x = 0.5 * (dest_width - scaled_width);
let offset_y = 0.5 * (dest_height - scaled_height);
let sx0 = rect.left() + (x_min - x_min) * scale + offset_x;
let sx1 = rect.left() + (x_max - x_min) * scale + offset_x;
let sy0 = rect.top() + (y_min - y_min) * scale + offset_y;
let sy1 = rect.top() + (y_max - y_min) * scale + offset_y;
painter.rect_stroke(
egui::Rect::from_min_max(egui::pos2(sx0, sy0), egui::pos2(sx1, sy1)),
0.0,
egui::Stroke::new(1.0, egui::Color32::WHITE),
egui::StrokeKind::Outside,
);
for tile in &info.tiles {
if info.enabled_z_layers & (1 << tile.z_id) == 0 {
continue;
}
let rect_opt = tile.device_rect.intersection(&tile.clip_rect);
if let Some(tile_rect) = rect_opt {
let x0 = rect.left() + (tile_rect.min.x - x_min) * scale + offset_x;
let x1 = rect.left() + (tile_rect.max.x - x_min) * scale + offset_x;
let y0 = rect.top() + (tile_rect.min.y - y_min) * scale + offset_y;
let y1 = rect.top() + (tile_rect.max.y - y_min) * scale + offset_y;
let color = colors[tile.z_id as usize % colors.len()];
let fill_color = egui::Color32::from_rgba_premultiplied(
(color.r * 255.0 * 0.3) as u8,
(color.g * 255.0 * 0.3) as u8,
(color.b * 255.0 * 0.3) as u8,
(color.a * 255.0 * 0.3) as u8,
);
let stroke_color = egui::Color32::from_rgba_premultiplied(
(color.r * 255.0) as u8,
(color.g * 255.0) as u8,
(color.b * 255.0) as u8,
(color.a * 255.0) as u8,
);
let tile_rect = egui::Rect::from_min_max(
egui::pos2(x0, y0),
egui::pos2(x1, y1),
);
painter.rect_filled(tile_rect, 0.0, fill_color);
painter.rect_stroke(tile_rect, 0.0, egui::Stroke::new(1.0, stroke_color), egui::StrokeKind::Outside);
}
}
}