/* 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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
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::Stro
keKind::Outside);
}
}
}