feat: allow brush strokes to extend beyond canvas edges in viewport and shader calculations
mandatory-regression-gate / deterministic-tests (push) Waiting to run
mandatory-regression-gate / protected-performance-path (push) Waiting to run

This commit is contained in:
Your Name
2026-07-25 16:34:51 +03:00
parent eb17bf4205
commit 45a231a456
3 changed files with 25 additions and 35 deletions
+15 -13
View File
@@ -270,10 +270,6 @@ impl Engine {
let w = self.document.canvas_width as f32;
let h = self.document.canvas_height as f32;
let inside = x >= 0.0 && y >= 0.0 && x < w && y < h;
if !inside {
self.last_stroke_pos = None;
return;
}
let tip = self.brush_tip_with_time_dynamics(x, y);
let color = self.apply_cyclic_color(self.current_color);
@@ -287,10 +283,14 @@ impl Engine {
let is_eraser = self.is_eraser;
let dirty_r = Self::brush_dirty_radius(&tip);
self.document.expand_dirty(lx as u32, ly as u32, dirty_r);
self.document.expand_dirty(x as u32, y as u32, dirty_r);
self.expand_stroke_bounds(lx as u32, ly as u32, dirty_r);
self.expand_stroke_bounds(x as u32, y as u32, dirty_r);
if lx >= 0.0 && ly >= 0.0 && lx < w && ly < h {
self.document.expand_dirty(lx as u32, ly as u32, dirty_r);
self.expand_stroke_bounds(lx as u32, ly as u32, dirty_r);
}
if inside {
self.document.expand_dirty(x as u32, y as u32, dirty_r);
self.expand_stroke_bounds(x as u32, y as u32, dirty_r);
}
self.draw_target_pixels_or_mask(
layer_id,
@@ -348,13 +348,15 @@ impl Engine {
let dirty_r = tip.size.max(2.0);
if let Some((lx, ly, _)) = self.last_stroke_pos {
self.document.expand_dirty(lx as u32, ly as u32, dirty_r);
if lx >= 0.0 && ly >= 0.0 && lx < w && ly < h {
self.document.expand_dirty(lx as u32, ly as u32, dirty_r);
self.expand_stroke_bounds(lx as u32, ly as u32, dirty_r);
}
}
self.document.expand_dirty(x as u32, y as u32, dirty_r);
if let Some((lx, ly, _)) = self.last_stroke_pos {
self.expand_stroke_bounds(lx as u32, ly as u32, dirty_r);
if inside {
self.document.expand_dirty(x as u32, y as u32, dirty_r);
self.expand_stroke_bounds(x as u32, y as u32, dirty_r);
}
self.expand_stroke_bounds(x as u32, y as u32, dirty_r);
if self.editing_mask {
self.draw_target_pixels_or_mask(