Skip to content

Commit

Permalink
fix: Improve and optimize elements clipping
Browse files Browse the repository at this point in the history
  • Loading branch information
marc2332 committed Oct 22, 2023
1 parent 19b61aa commit 27926c8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 17 deletions.
18 changes: 12 additions & 6 deletions crates/core/src/viewports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,25 @@ pub fn calculate_viewports(
viewports_collection
.entry(*node_id)
.or_insert_with(|| (None, Vec::new()))
.0 = Some(node_areas.area);
.0 = Some(node_areas.visible_area());
}

// Pass viewports to the children
if let Some((_, mut inherited_viewports)) =
viewports_collection.get(node_id).cloned()
{
// Add the itself
inherited_viewports.push(*node_id);
if !inherited_viewports.is_empty() {
// Add itself
inherited_viewports.push(*node_id);

for child in node.children() {
viewports_collection
.insert(child.id(), (None, inherited_viewports.clone()));
for child in node.children() {
if let NodeType::Element(..) = *child.node_type() {
viewports_collection
.entry(child.id())
.or_insert_with(|| (None, Vec::new()))
.1 = inherited_viewports.clone();
}
}
}
}
}
Expand Down
29 changes: 18 additions & 11 deletions crates/renderer/src/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,19 @@ use torin::geometry::Area;

use crate::elements::{render_image, render_label, render_paragraph, render_rect, render_svg};

fn clip_viewpot(canvas: &mut Canvas, viewport: &Area) {
canvas.clip_rect(
Rect::new(
viewport.min_x(),
viewport.min_y(),
viewport.max_x(),
viewport.max_y(),
),
ClipOp::Intersect,
true,
);
}

/// Render a node into the Skia canvas
#[allow(clippy::too_many_arguments)]
pub fn render_skia(
Expand Down Expand Up @@ -53,20 +66,14 @@ pub fn render_skia(
let viewports = viewports_collection.get(&dioxus_node.id());

// Clip all elements with their corresponding viewports
if let Some((_, viewports)) = viewports {
if let Some((element_viewport, viewports)) = viewports {
if let Some(element_viewport) = element_viewport {
clip_viewpot(canvas, element_viewport);
}
for viewport_id in viewports {
let viewport = viewports_collection.get(viewport_id).unwrap().0;
if let Some(viewport) = viewport {
canvas.clip_rect(
Rect::new(
viewport.min_x(),
viewport.min_y(),
viewport.max_x(),
viewport.max_y(),
),
ClipOp::Intersect,
true,
);
clip_viewpot(canvas, &viewport);
}
}
}
Expand Down

0 comments on commit 27926c8

Please sign in to comment.