Commit Graph
11025 Commits
Author SHA1 Message Date
dotCooCoo 1d214956f9 Smart Guides: object highlighting stays off with Snap to Grid or Pixel Preview
The reference app's help says Smart Guides cannot be used while Snap to
Grid or Pixel Preview is on, even with the menu command selected. The
Selection tool's move already leaves Smart Guides out under Snap to
Grid, but the canvas still drew the Object Highlighting outline under
the pointer with either view on.

The hover outline now draws only with Smart Guides and Object
Highlighting on and with Snap to Grid and Pixel Preview off.
2026-10-19 21:51:25 +07:00
dotCooCoo 47b5a3b52a Tests: non-Sharp type in a drop shadow, a Rasterize or a pattern takes the output's pixels
A drop shadow draws its object moved by the shadow's offset, Effect ›
Rasterize draws it on the pixels of its image, and a pattern draws its
tile on the pixels of the tile's image and, in pattern editing mode,
draws copies of the tile moved by the tile's size. Four tests draw type
through each of these: a shadow whose offset (3.4, 45.3 pt) is not a
whole number of pixels, a Rasterize at 36 ppi whose image lies on the
canvas's pixel grid, a pattern swatch that shows copies of the tile
80.25 pixels away, and the copies pattern editing mode draws around the
tile. In each, None, Crisp and Strong type give every pixel the share
edge_coverage defines from the pixel Sharp type gets there.

The new each_method_takes_the_share helper holds that check.
2026-10-19 06:28:29 -07:00
dotCooCoo 28405693d5 Tests: non-Sharp type in a placed document or an offscreen layer takes the output's pixels
A placed document draws its art in its own coordinates, and a layer
that multiplies and holds art that blends is drawn offscreen over a
copy of the art below it. Two tests check that type in either is drawn
on the pixels of the page or the export: None, Crisp and Strong type
in a placed document, and None type in such a layer. In a placed
document shown at half and at twice its size, each method gives every
pixel on the canvas the share edge_coverage defines, and None type has
hard edges in a supersampled export. In such a layer, None type has
hard edges in a supersampled export wherever the layer's pixels start.

The share check of each_method_draws_the_share_of_each_pixel_it_defines
moves into the off_the_share helper, which the placed-document test
uses too.
2026-10-19 05:38:44 -07:00
dotCooCoo 5228beab63 Actions: Batch numbers source files that share a name
Over a folder, action.batch named each source file's output after the
file without its extension. Two files with the same name, such as a.svg
and sub/a.svg with includeSubdirs, got the same Export for Screens
folder, Override Save path and Folder destination file. The second
file's output replaced the first's, and the batch reported no failure.

Batch now adds -2, -3... to the name of each later file whose name was
already used, compared without case, as it does for data set names. The
numbers follow the order the batch processes the files. With the Folder
destination, a.svg and a.ai in one folder now give a.svg and a-2.ai.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-19 05:24:31 -07:00
nrq6993-a11yandCursor 32a322531a G1: fix guide.move preview copy flag and ruler-drop Alt handling.
Align ruler-drop detection with source orientation and alt-flip readout tests with relative origins.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 07:51:20 +03:00
dotCooCoo 73970cc8a6 Character: Reset Panel closes only the undo group it opens
Reset Panel ended its undo step with end_undo_group, which closes the
open undo group of every document. An undo group open in another
document, such as an MCP batch, was closed by a reset in this one, and
inside an undo group already open in this document the reset closed
that group too.

Reset Panel now opens its own group only when the active document has
none open, and closes only that group. Inside an open undo group the
reset is part of that group's step.
2026-10-18 20:45:45 -07:00
dotCooCoo 7c513f3f3a File formats: a JPEG XL image whose decoder buffers run out is too large to draw
The decoder's pixel buffers are capped by the image's size and the
raster allowance. When they need more, File › Open and Place now say
the image is too large to draw, as they do when its size alone is
over the allowance, instead of saying the file can't be read. Damaged
and cut-short files keep their messages.
2026-10-18 16:39:02 -07:00
nrq6993-a11yandCursor 0d09d6a188 Docs: mark existing ruler-guide Alt orientation as done in ui-parity
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 01:46:47 +03:00
nrq6993-a11yandCursor 73eaa84d34 G1: Alt-drag an existing ruler guide to swap its orientation
Match the public shortcut reference: Alt while dragging converts horizontal and vertical, with snapping on the new axis; guide.move accepts vertical on the index form.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 01:46:38 +03:00
dotCooCoo ce5b023068 Type: type edges are drawn offscreen on at most 32,768 pixels a side
`Renderer::draw_type_edges` let its offscreen drawing grow to
`u16::MAX` pixels a side, the size at which vello_cpu panics. In a
frame drawn coarser than the output, a thin strip of type could take
more than 32,768 output pixels a side while staying within the pixel
budget.

The offscreen drawing now uses the frame's own pixels when the
output's would be more than `MAX_RASTER_SIDE` a side, and type whose
offscreen drawing would still be larger than that is drawn as Sharp,
as `fx.rs` limits its offscreen rasters to `MAX_RASTER_SIDE`.
2026-10-18 14:18:09 -07:00
dotCooCoo 79a2554463 Type: the type-edge cache's doc comments say where the kept pixels go
The doc comments of `TypeEdgeEntry` and `Renderer::draw_type_edges`
said that a later frame draws the kept pixels again, which reads as
drawing the type offscreen again. They now say that the renderer places
the kept pixels without drawing the type offscreen, and that it draws
the type offscreen again after a pan that brings more of it into view.
2026-10-18 14:18:09 -07:00
dotCooCoo f3cfcb10df Type: the renderer reuses the pixels of non-Sharp type between frames
Crisp and Strong type was drawn offscreen twice in every frame, and
None type once, with no cache, so a pan or a drag drew the type
offscreen again.

The renderer now keeps those pixels per object and ink plane, within a
128 MiB budget. It places the kept pixels in a frame, without drawing
the type offscreen, while the object, the output's zoom and rotation,
the method, the edge smoothing and what the type reads are unchanged,
the output has moved by whole pixels, and the kept pixels hold every
pixel the frame needs. After a pan that brings more of the type into
view, the renderer draws the type offscreen again.
2026-10-18 14:18:09 -07:00
dotCooCoo dfb882da55 File formats: count JPEG XL beside Targa, and translate its messages in ka and zh-hant
docs/file-format-parity.md counts 26 formats opened or placed, Targa
and JPEG XL among them. clipboard.importImage's params text names
Targa, which main reads by its header, beside JPEG XL. The Georgian
and Traditional Chinese catalogs, which now translate every status
and error message, get the three JPEG XL messages.
2026-10-18 13:58:28 -07:00
dotCooCoo a7e19356b4 Merge main into feat/jxl-import
Targa files (#2765) and JPEG XL images both open and place.
OPEN_EXTS and PLACE_EXTS list both, and UNASSOCIATED_EXTS keeps main's
four Targa extensions and adds jxl. The open_file row and the Glass
textures paragraph in docs/mcp.md, and the Glass's Load Texture line
in docs/target-app-parity.md, name both formats.
2026-10-18 13:35:14 -07:00
Dylan M. Taylor 923a3ddc09 docs: put SonarCloud and CodeRabbit badges on their own line 2026-10-18 14:47:47 -04:00
Dylan M. Taylor a466625c89 ci: configure Dependabot for Cargo and GitHub Actions
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-10-18 12:31:54 -06:00
BFlat 73f921fa0a Merge pull request #2947 from Hamza0101/reproducible-export-dates
Exports: SOURCE_DATE_EPOCH stands in for the clock, so output repeats
2026-10-19 00:52:49 +07:00
BFlat fb18533e12 Merge pull request #2677 from dotCooCoo/feat/rotate-view-dial
Rotate View: a dial shows the angle while a drag rotates the view
2026-10-19 00:52:33 +07:00
BFlat 56be31fe9b Merge pull request #2670 from dotCooCoo/fix/joiners-stay-with-their-run
Type: a zero width non-joiner is shaped in the face of the letters around it
2026-10-19 00:52:19 +07:00
BFlat a23d7a827f Merge pull request #2948 from dotCooCoo/fix/open-pages-naming-every-page
PDF/.ai import: a .ai saved without PDF compatibility opens when pages names every page
2026-10-19 00:52:03 +07:00
Hamza 1c80b23745 Exports: SOURCE_DATE_EPOCH stands in for the clock, so output repeats
PNG, PDF, EPS, legacy `.ai`, packaged zips and saved `.vectorcraft` files
record the wall-clock time they were made in, so the same commands run twice
gave different bytes although the pixels matched (#2880):

  PDF   /CreationDate and /ModDate   D:20261018155816 vs D:20261018155817
  PNG   the `Creation Time` tEXt entry
  .vectorcraft  one byte of the stored date
  SVG   carries no time, and already repeated

`metadata::output_time` is the time a file records: `SOURCE_DATE_EPOCH` when it
holds a non-negative whole number of seconds, else the clock, as the
reproducible-builds specification defines it. A date a command is given
(`file.new {created}`, a save's `modified`) still wins over the variable, and a
blank, negative or non-numeric value is ignored so that an export is never
refused over the environment.

`metadata::now_unix` keeps the real clock and now has exactly two callers, both
of which must not be pinnable from the environment: the recovery heartbeat, and
the seed PDF encryption draws on.
2026-10-19 00:37:55 +07:00
bflatastic c9a2491ef7 Rotate View: a dial shows the angle while a drag rotates the view
Squashed from #2677 (its merge of main dropped).
2026-10-19 00:37:53 +07:00
bflatastic 2ae992870b Type: a zero width non-joiner is shaped in the face of the letters around it
Squashed from #2670 (its merge of main dropped).
2026-10-19 00:37:50 +07:00
dotCooCoo cec31c5f4a PDF/.ai import: a .ai saved without PDF compatibility opens when pages names every page
A .ai saved without PDF compatibility has only a placeholder page in
its PDF part. document.open reads such a file from its editing data,
but with `pages` given it failed with "the file holds only a
placeholder page", even for "1" on a file of one page.

When `pages` names every page of the file, document.open now reads
the editing data as it does without `pages`.

Docs: docs/mcp.md.
2026-10-19 00:37:38 +07:00
BFlat 3b527ca339 Merge pull request #2953 from nrq6993-a11y/stream/vc-feat3-1753-workspace-dock-width
#1753: saved workspaces restore dock panel width
2026-10-19 00:37:00 +07:00
BFlat 4f18f1c860 Merge pull request #2952 from nrq6993-a11y/stream/vc-feat-g1-busy-cursor
G1: show the system busy cursor during background open, save and export
2026-10-19 00:36:46 +07:00
bflatastic b529f356cc Tests: the dock-width test builds its UiState with the width, as clippy asks (#2953) 2026-10-19 00:28:48 +07:00
bflatastic 048875cc4e fmt (#2952) 2026-10-19 00:27:40 +07:00
nrq6993-a11yandCursor 57ddb71d97 #1753: saved workspaces restore dock panel width
Persist the main dock column width in workspace snapshots and reapply it when switching layouts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 00:27:40 +07:00
nrq6993-a11yandCursor 49f7f5d7d8 G1: busy cursor during background open, save and export
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-19 00:26:27 +07:00
BFlat aa9c70a7b1 Merge pull request #2956 from storytold/fix/zh-hant-param-errors
i18n: Traditional Chinese and Georgian rows for the parameter-check and pdfInfo errors (#2930, #2784, #2914)
2026-10-19 00:23:15 +07:00
bflatastic 278fba490a i18n(ka): the pdfInfo thumbnail page error (#2914) 2026-10-19 00:16:42 +07:00
bflatastic d807236bf2 i18n(zh-hant): the shared parameter-check errors, now that Traditional Chinese translates every message (#2930, #2784)
#2784 made zh-hant a language that translates every status and error message while #2930 added the shared parameter-check errors to the others; main's shared_param_check_errors_are_translated failed on zh-hant.
2026-10-19 00:15:35 +07:00
BFlat 9c1d1d56ed Merge pull request #2944 from dotCooCoo/fix/save-for-web-preview-folder-per-run
Save for Web: each browser preview is written to its own folder
2026-10-19 00:10:12 +07:00
BFlat 53bd154059 Merge pull request #2938 from dotCooCoo/fix/legacy-ai-names-windows-1252
Legacy .ai export: the title and spot color and gradient names are written in Windows-1252
2026-10-19 00:09:56 +07:00
BFlat 1f2e90a7b3 Merge pull request #2937 from dotCooCoo/fix/ai-image-left-out-warns
.ai import: the editing data reader warns about each image it can't read
2026-10-19 00:09:38 +07:00
BFlat c7f748c75c Merge pull request #2936 from dotCooCoo/fix/editing-data-hash-reads-utf16-desc
PDF and .ai import: editing data with a UTF-16 description is checked against its pages
2026-10-19 00:09:23 +07:00
BFlat 4de769175e Merge pull request #2935 from dotCooCoo/fix/issue-2830
Legacy .ai export: an F line follows each %AI5_EndRaster
2026-10-19 00:09:07 +07:00
BFlat 9a8e2ac6a0 Merge pull request #2930 from dotCooCoo/fix/number-param-error-translated
i18n: number, object id and date parameter errors are translated
2026-10-19 00:08:55 +07:00
BFlat 419ed87cff Merge pull request #2929 from dotCooCoo/fix/anchor-commands-refuse-a-bad-subpath
Paths: anchor commands refuse a subpath that is not a whole number
2026-10-19 00:08:43 +07:00
BFlat eeb9513bbb Merge pull request #2921 from dotCooCoo/fix/links-on-mapped-drives
Links: a document opened from a mapped drive finds links on its share
2026-10-19 00:08:31 +07:00
BFlat c092ca1a48 Merge pull request #2917 from dotCooCoo/fix/menu-commands-refuse-text-numbers
Transform Each, Rasterize, Mosaic, Trim Marks and Rearrange: a number given as text is refused
2026-10-19 00:08:16 +07:00
BFlat ba2a11a807 Merge pull request #2914 from dotCooCoo/fix/pdfinfo-reads-postscript
MCP: document.pdfInfo answers one page for an EPS, a .ps file or a PostScript .ai
2026-10-19 00:08:04 +07:00
BFlat f1757c7bda Merge pull request #2907 from dotCooCoo/fix/eps-tiff-predictor-all-depths
EPS and .ai import: images with TIFF predictor 2 draw their samples at every bit depth
2026-10-19 00:07:47 +07:00
BFlat e616f1fe5c Merge pull request #2784 from dotCooCoo/feat/zh-hant-messages
i18n: Traditional Chinese translates status-bar and error messages
2026-10-19 00:07:32 +07:00
BFlat 647d51eaf6 Merge pull request #2765 from dotCooCoo/feat/open-targa-files
File formats: Targa (.tga) files open and place
2026-10-19 00:07:17 +07:00
BFlat 0d34a58b7b Merge pull request #2943 from youngeuibae/page-api
web: window.vectorcraft, the control channel for the page
2026-10-19 00:07:07 +07:00
BFlat 3a685eae61 Merge pull request #2939 from MortenHusted/feat/select-by-color
Select: select.color picks objects by fill and stroke colour, no object needed
2026-10-19 00:06:55 +07:00
BFlat e4d94109a2 Merge pull request #2922 from dotCooCoo/fix/issue-2871
Type: a click away from the text being edited ends editing without making new text
2026-10-19 00:06:44 +07:00
BFlat 4a90d13fc0 Merge pull request #2916 from dotCooCoo/fix/issue-2881
Fields: arrow keys and the wheel step to the next whole unit, and Ctrl/Cmd steps to the next tenth
2026-10-19 00:06:26 +07:00