* Switch Color struct back to storing unassociated alpha
* Address review feedback
* Update the Invert node and legacy image migration for straight alpha and add round-trip tests
---------
Co-authored-by: Keavon Chambers <keavon@keavon.com>
* Let the Freehand tool continue a selected open path from its endpoint and show endpoint overlays in the Freehand and Spline tools
* Share the closest-point search with the open path endpoint lookup, tally endpoint connections in a single pass, and rename the endpoint overlay function
* Skip hidden layers and use the feeds-aware transform in path point searches, path overlays, and Freehand point placement
* Map the Spline tool's merge goal with the feeds-aware transform so it matches the endpoint candidates
* Highlight the hovered open path endpoint in the Freehand and Spline tools
* Revert "Fix corrupted font resource loading in older documents"
This reverts commit 404d9f3047.
* Fix migrations for the Read Vector, Dot Product, Query JSON, and Sample Polyline nodes
* Fix text node migrations
* Provide resource storage to the resource message handler
* Refetch resources whose stored bytes are missing
* Add test for refetching resources with missing bytes
* Draw raster images with pad extension instead of repeat
* Add the GPU basic brush renderer
* Rework the brush tool around the GPU basic brush
* Remove the CPU brush implementation
* Destroy GPU textures when the last reference drops
* Request pooled textures synchronously
* Pool cached textures by format
* Add the owned GPU buffer type
* Route the remaining GPU allocations through the executor
* Add weak texture parking to the texture cache
* Raise the texture cache budget to 1GB for native and 512MB for wasm
* Make Data panel scalars selectable inline, denoise float display, and move breadcrumb truncation to Rust
* Code review fixes
* Remove denoising from f32
* Decide branching mesh fill insideness by winding, normalizing drawn direction at the Path node
* Fix dead connector click targets by explicitly closing the kurbo ellipse port paths
* Fix hole subtraction when a hole vertex is snapped exactly onto its covering contour
* Classify embedded negative space by its single surrounding face so fully enclosed mesh cells still fill
* Collapse duplicated BezPath emission, constants, and Polynomial surface across the vector algorithms
* Fix the quadratic segment length lower bound using a control leg instead of the chord
* Port all remaining Subpath producers to BezPath and delete the legacy subpath module
* Reset contour state at each MoveTo so an open contour's segments don't leak into the next region
* Give the polygon and star constructors a true center and radius instead of compensated arguments
* Render a paint from its Graphic directly instead of a single-element List wrapper
* Fix a stale doc comment reference to the moved paint render implementation
* Let the Fill and Stroke paint inputs take Item<Graphic>, replacing the IntoPaint trait
* Rename the FIll node's "fill" input to "paint"
* Let the graphic-consuming nodes take List<Graphic> directly, relying on the embedding adapters
* Remove outdated todo comments
* Re-save the demo art
* Split 'To Graphic' and 'Wrap Graphic' into the 'As Graphic' type assertion and 'Into Group' reducer nodes
* Make 'Into Group' reduce List<DVec2> not Item<DVec2>
* Reset the Merge definition for every legacy alias of its coercion nodes
* Improve test
* Add the rank-0 Item leaf variants to the Graphic enum, rendering leaves and list rows through shared per-row logic
* Traverse the rank-0 Graphic leaf variants in the vector node helpers and flattening
* Reach rank-0 vector graphics from the styling and gradient-fitting helpers
* Two code review fixes
* Fix comment
* Make the Artboard and Gradient newtype fields public to match the other list newtypes
* Rename the Graphic enum's self-named Graphic::Graphic variant to Graphic::GraphicList
* Rename the Graphic::Vector variant to Graphic::VectorList
* Rename the Graphic::RasterCPU variant to Graphic::RasterCPUList
* Rename the Graphic::RasterGPU variant to Graphic::RasterGPUList
* Rename the Graphic::Color variant to Graphic::ColorList
* Rename the Graphic::Gradient variant to Graphic::GradientList
* Rename the Graphic::Text variant to Graphic::TextList
* Restore the SVG group tag comment that the variant rename sweep clobbered
* Add the appearance model types and attribute constants
* Dual-write the appearance attribute alongside the fill/stroke pair in all paint-writing nodes
* Read paint from the appearance attribute in the renderer, analysis, metadata, and editor, cascading from ancestors
* Retire the fill/stroke attribute pair and the Vector stroke field in favor of the appearance attribute
* Replace the Stroke node's paint order input with the relative chain order of the Fill and Stroke nodes
* Code review fixes
* Re-save demo art
* Stamp coverages in place and fuse the renderer's per-item appearance reads into single walks
* Treat an empty appearance as the undeclared state so padded rows inherit instead of blocking the cascade
* Update demo art
* Treat padded appearance rows as undeclared in the boolean flatten's group recursion
* Make the 'Solidify Stroke' node preserve graphic structure instead of flattening its input
* Add a shared trait letting element-wise vector modifiers recurse into graphic groups
* Make 20 element-wise vector modifier nodes accept graphic input
* Make 'Separate Subpaths' and 'Points to Polyline' accept graphic input
* Make the 'Map Points' node accept graphic input
* Add TODO comments to the measure nodes deferred until the Graphic lowering refactor
* Honor clipping masks when rendering Vector[] lists, not just Graphic[] groups
* Keep per-layer click targets when a Vector[] round-trips through a Graphic[] wrapper
* Skip the rebuild and the merged-layers snapshot when flattening a lone anonymous graphic wrapper
* Fix a group's bounds excluding its raster children and stretching to the origin
* Fix SVG clipping masks landing in the wrong space when sibling layers differ in transform
* New nodes: 'Gradient Reverse', 'Gradient Shift', and 'Gradient Stretch' nodes for rearranging a ramp's stops
* Clip a lone out-of-range stop into the bake, and correct the docs that still promised edge-held stops
* Rename the 'Sample Gradient' node to 'Evaluate Gradient'
* Let the Evaluate Gradient node's position reach the out-of-range values its spread modes handle