From bc33e14c35575b88f73b8df7113a8f99492f48da Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Wed, 26 Aug 2026 15:59:24 +0000 Subject: [PATCH] Read gradient columns per lane and drive color rendering from the lane source --- .../libraries/rendering/src/renderer.rs | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/node-graph/libraries/rendering/src/renderer.rs b/node-graph/libraries/rendering/src/renderer.rs index 3d47871b3e..654b147526 100644 --- a/node-graph/libraries/rendering/src/renderer.rs +++ b/node-graph/libraries/rendering/src/renderer.rs @@ -44,7 +44,6 @@ use std::sync::{Arc, LazyLock}; use text_nodes::markers::{Font, TextAlign}; use vector_types::gradient::GradientSpreadMethod; use vector_types::markers::EditorClickTarget; -use vector_types::{ATTR_GRADIENT_TYPE, ATTR_SPREAD_METHOD}; use vello::*; #[derive(Clone, Copy, Debug, PartialEq)] @@ -1995,12 +1994,13 @@ impl Render for List> { // For SVG, this is is achived by creating a truly giant rectangle. // For Vello, we create a layer with a placeholder transform which we // later replace with the current viewport transform before each render. -impl Render for List { - fn render_svg(&self, render: &mut SvgRender, render_params: &RenderParams) { - for (index, color) in self.iter_element_values().enumerate() { - let blend_mode: BlendMode = self.attr::(index); - let opacity_attr: f64 = self.attr::(index); - let opacity_fill_attr: f64 = self.attr::(index); +fn render_color_svg>(source: &S, render: &mut SvgRender, render_params: &RenderParams) { + { + for index in 0..source.lane_count() { + let Some(color) = source.element(index) else { continue }; + let blend_mode: BlendMode = source.attr::(index); + let opacity_attr: f64 = source.attr::(index); + let opacity_fill_attr: f64 = source.attr::(index); render.leaf_tag("polyline", |attributes| { // Stand-in for an infinite background. Chrome's SVG renderer keeps internal coordinates in f32 and loses // precision past ~2^24 (~16.7 million), causing tile-boundary artifacts that pop in and out during panning. @@ -2024,14 +2024,17 @@ impl Render for List { }); } } +} - fn render_to_vello(&self, scene: &mut Scene, _parent_transform: DAffine2, _context: &mut RenderContext, render_params: &RenderParams) { +fn render_color_vello>(source: &S, scene: &mut Scene, render_params: &RenderParams) { + { use vello::peniko; - for (index, color) in self.iter_element_values().enumerate() { - let blend_mode_attr: BlendMode = self.attr::(index); - let opacity_attr: f64 = self.attr::(index); - let opacity_fill_attr: f64 = self.attr::(index); + for index in 0..source.lane_count() { + let Some(color) = source.element(index) else { continue }; + let blend_mode_attr: BlendMode = source.attr::(index); + let opacity_attr: f64 = source.attr::(index); + let opacity_fill_attr: f64 = source.attr::(index); let blend_mode = blend_mode_attr.to_peniko(); let opacity = (opacity_attr * if render_params.for_mask { 1. } else { opacity_fill_attr }) as f32; @@ -2055,6 +2058,16 @@ impl Render for List { } } +impl Render for List { + fn render_svg(&self, render: &mut SvgRender, render_params: &RenderParams) { + render_color_svg(self, render, render_params) + } + + fn render_to_vello(&self, scene: &mut Scene, _parent_transform: DAffine2, _context: &mut RenderContext, render_params: &RenderParams) { + render_color_vello(self, scene, render_params) + } +} + impl Render for List { fn render_svg(&self, render: &mut SvgRender, render_params: &RenderParams) { // For thumbnails the gradient fills a finite rect at the footprint's document space bounds, with a 1-unit margin to cover the `as u32` truncation of `Footprint::resolution`. @@ -2155,12 +2168,10 @@ impl Render for List { return; } - for (((index, gradient), spread_method), gradient_type) in self - .iter_element_values() - .enumerate() - .zip(self.iter_attribute_values_or_default::(ATTR_SPREAD_METHOD)) - .zip(self.iter_attribute_values_or_default::(ATTR_GRADIENT_TYPE)) - { + for index in 0..self.len() { + let Some(gradient) = self.element(index) else { continue }; + let spread_method: GradientSpreadMethod = self.attr::(index); + let gradient_type: GradientType = self.attr::(index); let transform: DAffine2 = self.attr::(index); let blend_mode_attr: BlendMode = self.attr::(index); let opacity_attr: f64 = self.attr::(index);