The Dutch catalog lacked a row for 1,813 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.
- nl.tsv gains 1,813 `@msg` rows: the errors of commands and their
parameter checks, scripts, file import and export, printing and
plug-ins. The translations are VectorCraft's own, written from the
English meaning with the catalog's conventions and its existing
feature names. Placeholders, parameter names, command ids and
literal values stay as the English writes them.
- The untranslated report lists 41 Dutch messages after the change:
the composite font errors, the justification spacing error and the
`connect` end error, which open #7211, #7116 and #7330 translate,
and three unknown-parameter and range errors that open #7353
rewrites so that a catalog row can match them. Menu strings, `tl!`
literals and undo labels are unchanged.
- The row for `{k} has control characters{_1}` does not match the
message for a multi-line File Info field, where the last
placeholder is empty.
- docs/localization-parity.md's Dutch row and a line in
docs/target-app-parity.md give the new counts.
A symbol instance colored with the Symbol Stainer lost its stain in
export whenever the canvas's stained art was not used:
- An instance with geometry effects was reshaped for export from the
symbol's art with only its dynamic changes, so SVG, PDF, EPS, .ai,
DXF, EMF/WMF and HPGL wrote the unstained colors. A color adjustment
on an instance recolored the unstained art the same way.
- PDF, EPS, legacy .ai, DXF and EMF/WMF wrote an instance without
effects from the unstained art.
tint_node, stain and instance_art now live in
vectorcraft_doc::symbol_overrides, which both the effects and the
exporters can use; vectorcraft_brush re-exports them. Baking, color
adjustments and the writers above now use instance_art: dynamic changes
first, then the stain.
- After a fill drag, the Live Paint Bucket stores the release point, so the
cursor swatch preview shows there instead of where the pointer last moved
before the press.
- Arrow nudges and Alt+arrow type spacing read Shift and Alt from the key
press, as the tool keys do, so a modifier released within the same frame
still makes a 10 pt nudge, a copy, or a spacing step.
- tool.setOption accepts cursorSwatchPreview for the Live Paint Bucket and
refuses a value that is not true or false.
The Turkish catalog had no row for 1,852 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.
- tr.tsv gains 1,811 `@msg` rows: the errors of commands and their
parameter checks, scripts, file import and export, printing,
plug-ins and Banner Hems and Grommets. The translations are
VectorCraft's own, written from the English meaning with the
catalog's terms and its existing feature names. Placeholders,
parameter names, command ids and literal values stay as the English
writes them.
- The 38 listed messages that open #7211, #7116 and #7330 add tr.tsv
rows for are left out, so the catalog has no duplicate key when they
merge.
- Three messages that open #7353 rewrites are left out: the unknown
parameter error and the PDF setting range error, which have two
placeholders in a row that no row can match, and the unknown
parameter error for a format's settings.
- The row for `{k} has control characters{_1}` does not match the
message for a multi-line File Info field, where the last
placeholder is empty.
- The Turkish row of docs/localization-parity.md gives the catalog's
current counts and what still falls back to English.
Docs: docs/target-app-parity.md, docs/localization-parity.md.
Every built-in preset other than Auto Color and Flat Logo now traces at
Paths 50. Corners is 100 in Technical Drawing, 75 in Default, Black and
White Logo, Line Art and Outline, and 50 in the others. Noise is 1 px in
Technical Drawing, 5 in High Fidelity Photo, 10 in Low Fidelity Photo, 15
in 3 Colors, 6 Colors, 16 Colors and Shades of Gray, 20 in Sketched Art,
Line Art and Outline, 25 in Default and Black and White Logo, and 90 in
Silhouettes. Palettes, color counts and the other options are unchanged.
This changes the output of every preset but Default, Auto Color and Flat
Logo. The traces take fewer anchors (High Fidelity Photo 5,494 to 3,136
and Black and White Logo 27 to 14 in crates/trace/tests/quality), and
outlines on flat art lie further from the true edge (16 Colors 0.100 to
0.123 px off on average).
Docs: docs/image-trace-adjustments.md, docs/image-trace-quality.md,
docs/target-app-parity.md.
A closed freehand stroke is fitted as the open stroke would be and closed by a
straight segment from its end back to its start. Fitted as one loop, the
closing segment curved on past both ends and back, like a hat's brim.
The Polish catalog lacked a row for 1,854 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.
- pl.tsv gains 1,808 `@msg` rows: the errors of commands and their
parameter checks, scripts, file import and export, printing and
plug-ins. The translations are VectorCraft's own, written from the
English meaning with the catalog's conventions and its existing
feature names. Placeholders, parameter names, command ids and
literal values stay as the English writes them.
- 44 of the others get their Polish rows from open #7211, #7214,
#7116, #7330 and #1931, so this change leaves them out. 2 are
messages that no catalog has a row for yet. Menu strings, `tl!`
literals, undo labels and swatch names are unchanged.
- Two of the messages have two placeholders in a row. The catalog does
not load such a row, so those two are still shown in English.
- The Polish row of docs/localization-parity.md gives the catalog's
current counts.
Docs: docs/target-app-parity.md, docs/localization-parity.md.
The Hungarian catalog lacked a row for 1,853 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English.
- hu.tsv gains 1,813 `@msg` rows: the errors of commands and their
parameter checks, scripts, file import and export, printing and
plug-ins. The translations are VectorCraft's own, written from the
English meaning with the catalog's conventions and its existing
feature names. Placeholders, parameter names, command ids and
literal values stay as the English writes them.
- The 38 rows that open #7211, #7116 and #7330 add to hu.tsv are left
out, since a second row for the same key fails
bundled_catalogs_are_consistent. The report lists those 38 and two
messages that no catalog has a row for. Menu strings, `tl!`
literals, undo labels and swatch names are unchanged.
- Two of the messages have two placeholders in a row. The catalog does
not load such a row, so those two are still shown in English. The
row for `{k} has control characters{_1}` does not match the File
Info error for a multi-line field, where the last placeholder is
empty.
- The Hungarian row of docs/localization-parity.md gives the catalog's
current message counts.
Docs: docs/target-app-parity.md, docs/localization-parity.md.
- A face outline segment that runs along several edge segments (the
face has no corner where a crossing line splits the edge) now joins
the face to every edge segment it runs along, not only the one under
its middle, so a double-click flood no longer stops there.
- The first click of a triple-click on selected paths, which makes the
Live Paint group, takes the fill to match from the paths' closed
subpaths only, as the group's faces do; an open path in front no
longer gives the wrong fill.
cs is in COMPLETE_MESSAGES, but the untranslated report listed 1,853
status and error messages with no Czech row, so with the interface in
Czech those messages showed in English.
- cs.tsv gains 1,813 `@msg` rows in one block after the last row. The
translations are VectorCraft's own, written from the English meaning
with the catalog's terms and typography (polite second person, Czech
quotation marks „…“). Placeholders, backticked names, command ids,
double-quoted values and bare true, false and null stay as the
English writes them.
- The 38 messages whose Czech rows open #7211, #7116 and #7330 add are
left out, so the catalog keeps one row per key when they merge.
- Menu strings, `tl!` literals, undo labels and swatch names are
unchanged.
- The Czech row of docs/localization-parity.md gives the catalog's
current counts.
craft_dxf::parse_recovering reads the tags (ASCII and binary, any code
page), model::Document::read the sections, tables, blocks, layouts and
entity followers, and Entity::read each entity. The pair parser, the
records, the header, layer, block and layout readers and the colour
palette are gone; what stays is the mapping onto VectorCraft art.
Binary DXF files now open instead of being refused. A damaged binary
file says so.
The Traditional Chinese catalog had no row for 1,852 of the status and
error messages that i18n::tests::untranslated_report finds in the
sources, so the status bar showed them in English.
- zh-hant.tsv gets 1,813 @msg rows under one comment line at the end of
the file, written in Taiwan usage with the catalog's existing terms.
Each row keeps the English key, its placeholders, doubled braces,
parameter names, command ids and quoted values unchanged.
- The 38 rows that open #7211, #7116 and #7330 add, and the row #7214
added, are left out, so the catalogs stay consistent.
- docs/localization-parity.md and docs/target-app-parity.md give the new
counts: 3,438 @msg and 48 @msgplural rows, 40 messages still listed.
The rows for `{name} must be {lo}–{hi}{unit} (got {v})` and
`unknown parameter `{within}{key}`; {why}` are counted by the report, but
Template::parse does not load a template with two placeholders in a row,
so those two messages still show in English. The row for
`{k} has control characters{_1}` does not match the message for a
multi-line File Info field, where its last placeholder is empty.
On Linux and the BSDs, the desktop draws the window's frame on X11, on
Wayland compositors that draw server-side decorations and in a window
opened through XWayland. There, with VectorCraft Title Bar on Every
Desktop off, the window has the desktop's title bar with System Title
Bar on or off, and the dialog showed nothing about it under System
Title Bar.
- The desktop app records at startup whether VECTORCRAFT_TITLEBAR is
unset and the desktop would draw the frame without VectorCraft Title
Bar on Every Desktop (VectorcraftApp::desktop_keeps_frame), from the
frame probe and the launch path's XWayland choice.
- Preferences shows a note under System Title Bar in that case while
VectorCraft Title Bar on Every Desktop is off, with rows in the 27
catalogs that carry the neighboring title bar notes. The value is
worked out at startup, so a Linux Display Server change shows in the
note from the next start.
Docs: docs/control-protocol.md, docs/target-app-parity.md.
The Pencil's and the Paintbrush's new-path, continue, close and straight-line
cursors are drawn on the crosshair already; Precise Cursors no longer turns
them into the plain crosshair, so the badge still says what the press or the
release does.
In a document in picas, a bare number typed in Text Wrap Options › Offset
follows Preferences › Units › Numbers Without Units Are Points, as every
length field drawn by the shared unit field does: points while it is on
(the default), picas while it is off. A test covers both settings, and
the evidence line in docs/target-app-parity.md states the rule.
The search for brushed strokes that decides between knockout masks and
a PDF knockout group copied a dynamic symbol's art for every instance
with appearance changes, and looked through the evaluated art of live
objects, without a limit. Nested instances could make it copy and walk
art exponentially before any limit applied.
The search now visits and copies at most MAX_KNOCKOUT_MASK_OBJECTS
objects for a group, counting a dynamic symbol's art before copying it
and a live object's evaluated art before looking through it. When the
limit runs out, the group is written as a PDF knockout group with the
size warning. Each symbol's art with one set of appearance changes is
copied once, and art that holds itself ends the search.
The Korean catalog lacked a row for 1,852 of the status and error
messages that the untranslated report finds in the sources, so the
status bar showed those messages in English. ko.tsv now has an @msg
row for 1,813 of them: the errors of commands and their parameter
checks, scripts, file import and export, printing and plug-ins.
The other 39 are messages that open #7211, #7214, #7116 and #7330
also translate in ko.tsv. They are left out so the catalog has no
duplicate key when those pull requests merge.
The rows keep every placeholder, parameter name, command id and
literal value of the English, and use the feature names the catalog
already has.
The report's Korean menu strings, tl! strings, undo labels and swatch
names are unchanged.
Docs: docs/localization-parity.md, docs/target-app-parity.md.
A straight compound path with Twist was read live up to 180° whatever
guides it held, and the live Twist was measured from bounds that take in
the guide members. A straight compound path with Twist whose guide
members reach past its other members now opens as its drawn look
instead of live, and so does a compound path made only of guides.
Compound paths whose guides lie inside their other members, a Twist of
0°, and single paths keep opening live.
The `.ai` writer keeps a graphic-style link only where the reader reads
the style live, so such an object is now written without the link, with
the existing style-link warning.
A CSV file that holds NUL bytes and has no byte-order mark was refused.
It is now read as UTF-16 when at least half of its two-byte units hold
a NUL byte, in the byte order that reads a line break. A file with fewer
NUL bytes (UTF-8 or Windows-1252 text with stray NUL bytes, or UTF-16
text made mostly of characters above U+00FF) is still refused, and so is
a file that reads a line break in both byte orders, has an odd length,
isn't valid UTF-16 in that order or holds a NUL character. Refused files
get the same message as before.
The test now sets the edited label's gradient vector and aspect with paint.setGradientGeom and checks that the gradient is placed before the graph redraws, so the later check that the kept gradient has no placement fails if the redraw keeps it.
A raster mesh warp with Preserve Shape Using Transparency cuts an image
into pieces with opacity masks and puts them in a knockout group, each
piece knocking out its triangle. The reader gives the pieces no such
mark, so each knocked out all that its image paints without its mask,
and the file opened with most of the image hidden.
The group of such pieces is now written without knockout. An image
whose pixels are partly transparent draws its alpha twice only where
neighboring pieces overlap.
uk is in COMPLETE_MESSAGES, but the untranslated report listed status
and error messages with no Ukrainian row, so with the interface in
Ukrainian those messages showed in English.
- uk.tsv gains 1,811 `@msg` rows. The translations are VectorCraft's
own, written from the English meaning with the catalog's terms and
typography (« » around interface names, ’ inside words).
Placeholders, backticked names, command ids, double-quoted values and
bare true, false and null stay as the English writes them.
- The 41 rows that open #7211, #7214, #7116, #7330 and #817 add to
uk.tsv are left out, so the catalog keeps one row per key when they
merge (bundled_catalogs_are_consistent rejects a second row for a
key).
- The Ukrainian row of docs/localization-parity.md gives the catalog's
counts.
A double-click with the Live Paint Selection tool on a face now selects
that face and the faces of its group that no stroked edge parts from it:
the selection floods across edges that are hidden or draw no stroke, and
hidden faces are left out. On an edge (Alt-double-click, or a
double-click with Select Fills off) it selects the edge and the edges of
its group joined to it end to end that draw with the same stroke paint.
With Shift held, the faces or edges reached leave the selection or join
it. The tool options, locks and isolation mode apply as they do to a
click.
The reach is computed by two read-only functions in the builder lookup
module, flood_faces and connected_edges, so the Live Paint commands can
use the same rules. An edge's stroke paint is the paint of its topmost
stroke that draws. Face outlines are matched to edges within the planar
map's precision, and edges join only at the ends of their subpaths.
Docs: docs/mcp.md, docs/target-app-parity.md.
The copies of symbol instances drawn in a knockout group's soft masks
counted toward the objects the export's visible symbol art may hold, so
overlapping instances could use that limit up and leave later visible
instances out. Mask copies now count toward a limit of their own. When a
group's masks would leave out symbol art because that limit runs out,
the masks are discarded and the group is written as a PDF knockout
group, with a warning.
The object count that decides whether a group is drawn through masks
left out the art a brushed stroke expands into. A group in which a mask
would draw a brushed stroke is now written as a PDF knockout group, with
its own warning. The search follows what the export draws: visible
members, opacity masks that are on, symbol and inline graphic art, live
objects and placed documents as evaluated, and pattern tiles, and it
skips strokes without paint, width or a known brush.
A knockout group whose elements need no masks is written as a PDF
knockout group without a warning, so the two engine PDF tests that
expected the old warning now check that case and the brushed one.
The recovery-folder check that main added calls collect_sent_paths, which now takes the
params place. A folder is a single string, so it passes ParamsPlace::top(None) as
sent_paths does, and the result is unchanged.
Reading a brush library now numbers the second and later brushes of a
repeated name, so the panel lists Twin and Twin 2 rather than two Twin
rows. The test expects those rows, and checks that rows of one name that
reach the panel unnumbered still preview and drag the first.
livePaint.fill's description listed "not with points" as its own entry, which
the params parser reads as a parameter name, so every_description_parses
failed. The note now sits inside the samePaint value's parentheses and says
that "connected" and "samePaint" are refused with points, as lp_fill does.
pt-br is in COMPLETE_MESSAGES, but the untranslated report listed 1,851
status and error messages with no pt-br row, so with the interface in
Brazilian Portuguese those messages showed in English.
- pt-br.tsv gains 1,812 `@msg` rows. The translations are VectorCraft's
own, written from the English meaning with the catalog's terms.
Placeholders, backticked names, command ids, parameter names,
double-quoted values and bare true, false and null stay as the English
writes them.
- The 39 messages that open #7211, #7214, #7116 and #7330 add pt-br rows
for are left out. bundled_catalogs_are_consistent rejects a second row
for the same key.
- The Portuguese row of docs/localization-parity.md gives the catalog's
counts: 9,260 rows, 3,445 of them `@msg` and 48 `@msgplural`.
The untranslated report missed messages that reach the status bar:
- MESSAGE_CRATES now includes effects, color, render, three-d and pathops,
whose errors the engine and the effects pass on (SVG filters, swatch
libraries, raster sizes and encoders, 3D solids, path operations).
- The scan reads the messages a .map_err closure returns, from each if
branch, match arm and the last expression of a block, the messages of
a handler that .map_err(name) names (a closure bound with let, or a
function), and the message given to a variant of an enum whose name
ends in Fail (CompileFail::Syntax). The steps of a script result's
path ([{i}]{place}, .{k}{place}) are not messages.
- The report and the VECTORCRAFT_I18N_DUMP_MESSAGES dump include the
phrases a parameter schema's error builds at run time (SCHEMA_PHRASES).
Missing translations stay report-only. On main at 0b29b2b1f6 the report
lists 126 more messages, missing in all 23 languages that translate
every message: 43,084 missing rows before, 45,983 after.
Under a colored light, Inflate's facets were antialiased one by one.
Where two facets met, their edge pixels added up to less than full
coverage. The solid-color composite then showed its black channel
backdrop there, so internal edges drew darker at 1:1, and the per-facet
gradient art let the background through.
- The solid-color composite draws, in each channel, an underlay of the
facets with 2 pt round seams between the black backdrop and the
facets themselves.
- The per-facet routes put each run of consecutive faces of one surface
over an underlay of its own faces, clipped to the union of the faces
and their seams. Runs that carry a gradient's opacity mask are sealed
with that mask. A face clip's footprint keeps only the outer contours
of its seam stroke.
- The paint-copy allowance for cut faces counts 12 copies per facet.
At 1:1, inside the surface each color channel of an opaque fill is
within 3 levels of the same art drawn at 3x and averaged down, and
every pixel is opaque. Before, 2,267 channels differed by up to 10
levels on the solid Inflate, and 1,088 pixels of the gradient Inflate
were below full alpha. Under white light, the rendered pixels, the SVG
text, the PDF read back and the expanded art of Inflate, Extrude,
Rotate and Revolve are the same as before.
Docs: docs/three-d.md (Seams), docs/target-app-parity.md.
addon.pathtools.cornerSet and cornerRemove now refuse a key other than
id and anchors in an `items` member, with the standard unknown-parameter
error, instead of ignoring it. A misspelled `anchor` used to fall back
to the request's `anchors`, else the path's direct-selected anchors,
else every corner of the path. They also refuse `items` given together
with `ids`, which `items` replaces. Saved steps played with replay
still run as recorded.
Docs: docs/mcp.md, docs/target-app-parity.md.