Scaffolding merge for the reconcile; the final series to master is
authored fresh. Rank plumbing resolves to our axis-IR model, the node
macro and the LaneSource render walk stay ours, master's vector
restructure and gradient vocabulary are adopted, and the paint and
appearance adoption is deliberately deferred behind our fill and stroke
markers.
* 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
* 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
* Delete dead code function
* Add a Gradient Interpolation axis with Stepped, Linear, and Smooth paths through the stops
* Keep the gradient interpolation attached when dragging stops in the picker
* Give the gradient popover's dropdowns the same tooltips as their row labels
* Order the gradient popover with Intrp. above Space
* Hold gradient stops in place when the cyclic flag is toggled
* Fix wrong Smooth gradient colors around stops sitting on the ramp boundaries
* Consolidate gradient settings plumbing and fix bugs
* Bundle whole-ramp gradient settings into GradientSettings across the editor plumbing
* Name the Smooth gradient interpolation's spline type in its tooltip
* Linearize the gamma hex stop colors recovered from imported Graphite SVGs
* Code review
* Aim the Smooth bake's seam subdivision at the copied boundary color
* Add GradientEvaluator to build gradient sampling state once per loop instead of per sample
* Correct the gradient evaluator's documented setup cost to O(n log n)
* Add a Cyclic gradient attribute that wraps the stop list through the 1|0 boundary back to the first stop
* Show the wrap segment's midpoint diamond in the color picker spectrum strip when cyclic
* Keep the wrap midpoint diamond tracking the pointer by a wrapped strip width when dragged past the ends
* Give the Gradient tool's viewport overlay the same cyclic wrap midpoint diamond and drag behavior
* Correct the docs claiming the final stop's midpoint is always ignored now that cyclic uses it
* Move the gradient cyclic toggle onto the Ends row as a Link icon checkbox
* Update labels
* Register GradientHueDirection with the Data panel so its attribute column renders
* Reword wrap segment to wrapped interval and stray segment usages to interval
* Clean up comments
* Fix the color picker write-back losing default position elision and the blend path guessing the cyclic flag