* Fix blend layers wrongly cropping Inside-aligned strokes on open paths
* Skip the closed-subpath check when stroke alignment can't apply
* Compute `can_draw_aligned_stroke` once and share it with the blend layer
* Use the actual axis scale, not the column-vector diagonal, when sizing stroke clip rects
* Fix under skew
* Compensate for upstream row-0 transform absorption in viewport-space 'TransformSet'
* Add 'editor:text_frame' row attribute so the Text tool's drag cage tracks multi-row text
* "Separate Glyph Elements" -> "Separate Glyphs"
* Improve artboard migration robustness from older documents
* Code review
* Make the tools visualize the text frame based on attribute not upstream node
* Add ClickTargetType::CompoundPath variant for fill-rule-aware compound shape hit testing
* Generate one compound click target per Vector so glyph holes aren't treated as filled
* Fix insidenss logic
* Stop pushing duplicate layer entries when re-clicking an already-selected layer
* Make Text node generate per-glyph bounding box click targets
* Show source-geometry outlines and aggregate all rows for layer click targets
* Strip 'editor:click_target' override on Path node so direct edits restore precise hit testing
* Fix inverting a zero-determinate transform
* Use 'Transform', 'Gradient Type', and 'Spread Method' nodes for table gradients
* Add gradient widget to the tool's control bar and update where the two swap buttons go
* Fix gradient rendering
* Format
* Code review
* Add Table<GradientStops> gradient rendering
* Add SVG and Vello renderers for Table<GradientStops>
* Add thumbnail rendering for Table<GradientStops>
* Use row transform to map (0,0), (1,0) unit line to document space
* Set 100px width for the initially created gradient
* Add support of table gradients for the gradient tool
* Fix after review
* Thumbnail rendering of artboard with infinite gradient layer
* Hide radial gradient's reverse direction button for gradient table
* Remove unused imports
* Format
* Fix conflict with spread method
* Code review
* Fix thumbnails
* Connect up gradient_type and spread_method to attributes
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Replace the Artboard struct with a Table<Table<Graphic>> shape
* Remove the never-functional, seemingly unneeded migrate_type_descriptor_names due to typo
* Allow negative artboard sizes
* Rename "editor:layer" to "editor:layer_path" and centralize it in a const
* Centralize "editor:merged_layers" in a const
* Centralize all other attributes in consts
* Rename consts with ATTR_ prefix
* Format
* Improve the Data panel with more type-specific detail pages
* Add network_path to SetDisplayName so renames target any network depth
* Track nested layers via full editor:layer paths and rename parent_layer to path_of_subgraph
* Polish the data panel NodeId leaf page with an editable name field
* Make lock and visibility toggles work for layers in nested subgraphs
* Fix formatting
* Fix connected_to_output running in the wrong network for nested-layer toggles
* Fix click target propagation with the Rasterize node
* Add the 'Write Attribute' node
* Remove tag_layer in favor of the new Write Attribute node, prune redundant attribute writes
* Replace the Vector<Upstream> type argument with the "editor:merged_layers" attribute
* Feature-gate serde derives behind cfg_attr in all runtime node graph type crates
* Refactor Table to move its hard-coded fields into an attributes field
* Encapsulate TableRow/TableRowRef/TableRowMut attribute fields behind accessor methods
* Remove TaggedValue::GraphicUnused
* Refactor Table<T> to use dynamic attributes instead fixed names
* Fix code review soundness concerns
* Add todo work
* Replace row-oriented Table<T> API with column-oriented access
* Fix attribute propagation bugs
---------
* Add spread method support for gradients
* Add GradientSpreadMethod enum (Pad, Repeat, Reflect) to vector-types
* Add radio buttons to gradient tool and fill properties panel
* Convert spread method when importing SVGs via usvg
* Sync backup gradient input when changing spread method
* Table<GradientStops> rendering is not yet updated for spread method
* Sync gradient tool options with layer's gradient
* Sync gradient_type and spread_method from the selected
layer's existing gradient to the tool options bar when
switching to the gradient tool
* Refactor has_gradient_on_selected_layers
to reuse a new get_gradient_on_selected_layer helper
* Swap Reflect and Repeat order in UI radio buttons
* Fix alignment of the radio buttons in right panel
* Fix the position of the radio buttons in the tool
* Rename SpreadMethod to SetSpreadMethod
* Move default spread method omission logic
* Add checkered transparency rendering to infinite canvas and artboards
* Enable artboard clipping by default
* Make new infinite canvas documents begin with a white background layer
* Remove the export dialog's transparency option now that it's redundant
* Make exporting transparent JPGs use white not black
* Code review
* Fix an assertion failure bug when scaling a line in the transform cage
* Fix missing defaults on node gradient inputs
* Fix Blend Shapes path input wire not updating to show in the UI after Layer > Blend
* Fix assertion failure due to browser non-monotonic timestamp
* Fix SVG renderer drawing 1px strokes as half-width when using stroke alignment
* Fix incorrect appearance of the ColorInput widget when set to "none" and "disabled"
* Fix lerp function in Fill enum to handle None cases correctly
* Fix stroke alignment bug
* Fix hide artboard for raster render mode
* Desktop: Fix transparent viewport blending
* Fix vello render using wrong color space conversion for background
* Review
* Render raster images as outlines in Outline mode
* Draw a transformed unit-rectangle stroke instead of raster pixels
* Skip creating blend layers for a raster image in Outline mode
when only blend mode would trigger them
* Rename variable names
* Minor refactor to reduce nesting
* Extract shared outline drawing helper
* Update node-graph/libraries/rendering/src/renderer.rs
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* Refactor GradientStops to use struct-of-arrays and include midpoint
* Implement interaction and rendering
* Make color picker saturation-value color picking snap to original position and show both axis lines
Make color picker saturation-value color picking snap to original position and show both axis lines
* Add graphite:midpoint attribute to SVG exports
* Add graphite:midpoint parsing to SVG importer
* Remove Vello from preferences
* Add the Render Mode: SVG Preview radio button
* Remove SVG outline renderer
* Add a tooltip explaination when disabled in unsupported browsers
* Fix Eyedropper tool to support Outline render mode
* Use #[allow(clippy::too_many_arguments)] instead of tuple
* Rerun nodegraph when max render area is changed
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* WIP render caching
* Hook up render cache to render pipeline
* Fixed offsets
* Initial cleanup
* Integrate cache with context invalidation
* Cleanup
* Improve rounding and reduce tile size to fix vello not rendering
* Include pointer position in cache key
* Avoid unwraps and zero sized textures
* Destroy textures after blitting to surface
* Fix context dependencies
* Exclude footprint from render params
* Batch animation frame messages
* Add vello max render size to preference dialogue
* Remove unused import
* Reorder vello preference
* Clean up preferences dialog
* Apply review suggestions
* Cap max render region size
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* fix: rasterize node document leakage with hashmap and eq check
* Use single Hashmap and ignore source id
* use or_insert_with instead of Entry match
---------
Co-authored-by: Dennis Kobert <dennis@kobert.dev>
* Implement branching mesh rendering for SVG
* Patch mesh fill for Vello renderer
* Patch tangent_at_start and tangent_at_end
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>