From 75a328f8b1d3bb107a4e7b8e56d7164cc7b54543 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Sat, 7 Nov 2026 20:43:39 -0800 Subject: [PATCH] Docs: a top object's corner anchor needs a short handle or an outward turn An anchor with a handle shorter than 0.01 pt counts as a corner of a top object whichever way it turns; only an anchor whose tangents differ must turn out of the outline. docs/mcp.md and the progress line in docs/target-app-parity.md now say so. --- docs/mcp.md | 6 +++--- docs/target-app-parity.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/mcp.md b/docs/mcp.md index ea7e1dc54..f16a192c9 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -6617,9 +6617,9 @@ arcLower, arcUpper, arch, bulge, shellLower, shellUpper, flag, wave, fish, rise, `bend`, `h` and `v` in % from -100 to 100; `horizontal` or `orientation`), `object.envelope.makeWithMesh` (`rows`, `cols`: 1–50) and `object.envelope.makeWithTopObject` (the topmost selected path becomes the envelope). A top object's outline is split into four sides at four corners. Each corner is the anchor nearest a corner of the -outline's bounding box among the anchors within 47.5% of the box's width and height from that box corner that are -sharp corners pointing out of the outline: a handle shorter than 0.01 pt, or tangents whose unit vectors differ by 0.01 -or more in x or y. The first such anchor along the outline wins a tie. Without one, the corner is the outline's point +outline's bounding box among the anchors within 47.5% of the box's width and height from that box corner that count as +corners: an anchor with a handle shorter than 0.01 pt, or one whose tangent unit vectors differ by 0.01 or more in x or +y and turn out of the outline. The first such anchor along the outline wins a tie. Without one, the corner is the outline's point nearest the box corner, moved onto the anchor at the end of its segment when within 0.5% of the segment's parameter. Each piece of a side between anchors and corners takes a share of the content's width or height in proportion to the length of its control polygon, spread along the piece by its curve parameter, so content spreads evenly along a diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 8b8fb2822..e91c1a83e 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -1472,7 +1472,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur - **Envelopes of type map from the glyphs:** an envelope maps point type, area type, type in groups and layers and type used as a clipping path from the bounds of the glyph outlines, underlines and strikethroughs instead of the type's laid-out box (ascent to descent, or the area's frame), with inline graphics counted by their boxes; rotated type and type in perspective map from their outlines as drawn. Make with Mesh, Make with Top Object and Reset with Mesh without Maintain Shape use those bounds. Type that draws nothing keeps its laid-out box, and so does type inside any other object, such as a blend, a repeat or a symbol instance. This is VectorCraft's own rule; envelopes of type made in VectorCraft and in saved files redraw by it. Tests: `crates/engine/src/tests/envelope.rs`, and `tests/envelope_ink.rs` in `vectorcraft-eps`, `vectorcraft-render` and `vectorcraft-effects`. Scores and hours unchanged. -- **Top-object envelopes share each side by control polygon:** each piece of a top object's four sides takes a share of the content's width or height in proportion to the length of its control polygon, spread along the piece by its curve parameter (evenly along a straight segment), where the sides used to share it out by length. Each corner is the nearest sharp, outward-pointing anchor within 47.5% of the bounding box from its box corner, or else the outline's nearest point to that box corner. Envelopes opened from `.ai` files keep the corners the file saves. These are VectorCraft's own rules; existing top-object envelopes redraw by them, and gradient meshes made from a path keep sides measured by length. Tests: `a_top_object_*`, `a_rounded_rectangle_top_object_stays_close_to_the_identity` and `a_rectangle_top_object_is_the_identity` in `live::tests` (`vectorcraft-doc`), `envelope_top_object_shares_a_side_by_control_polygon_length` in `vectorcraft-engine`, `a_top_object_envelope_opens_live_with_its_outline` in `vectorcraft-eps`. Scores and hours unchanged. +- **Top-object envelopes share each side by control polygon:** each piece of a top object's four sides takes a share of the content's width or height in proportion to the length of its control polygon, spread along the piece by its curve parameter (evenly along a straight segment), where the sides used to share it out by length. Each corner is the nearest anchor within 47.5% of the bounding box from its box corner that has a handle shorter than 0.01 pt or turns out of the outline, or else the outline's nearest point to that box corner. Envelopes opened from `.ai` files keep the corners the file saves. These are VectorCraft's own rules; existing top-object envelopes redraw by them, and gradient meshes made from a path keep sides measured by length. Tests: `a_top_object_*`, `a_rounded_rectangle_top_object_stays_close_to_the_identity` and `a_rectangle_top_object_is_the_identity` in `live::tests` (`vectorcraft-doc`), `envelope_top_object_shares_a_side_by_control_polygon_length` in `vectorcraft-engine`, `a_top_object_envelope_opens_live_with_its_outline` in `vectorcraft-eps`. Scores and hours unchanged. - **Texture redraws (#1257):** Craquelure, Mosaic Tiles and Stained Glass compare squared distances when finding their nearest cells; rounding/tie boundaries use the original distance ordering. Brute-force candidate tests and three 1800×1500 viewport comparisons preserve the old pixels. A CMYK rectangle move at 190.07%/DPI 1.5 is reproducible with `cargo test -p vectorcraft-render texture_drag_perf -- --ignored --nocapture`; idle-machine Windows interaction is still unverified.