Commit Graph
5853 Commits
Author SHA1 Message Date
aiongg bfcd245bb6 refactor(ui-egui): move panels/color.rs tests to panels/color/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 1160aa4336 refactor(tools): move rulerguide.rs tests to rulerguide/tests.rs 2026-10-26 18:18:17 +00:00
aiongg fcb227a87c refactor(ui-egui): move panels/tabs.rs tests to panels/tabs/tests.rs 2026-10-26 18:18:17 +00:00
aiongg f998e19bfd refactor(tools): move guides.rs tests to guides/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 4d174fd4a6 refactor(ui-egui): move panels/character.rs tests to panels/character/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 36b6c513f7 refactor(ui-egui): move panels/brushes.rs tests to panels/brushes/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 66bddeaac7 refactor(ui-egui): move panels/library_panel.rs tests to panels/library_panel/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 15ec504cff refactor(ui-egui): move dialogs/color_picker.rs tests to dialogs/color_picker/tests.rs 2026-10-26 18:18:17 +00:00
aiongg ad496e9a98 refactor(ui-egui): move panels/align.rs tests to panels/align/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 029e298aeb refactor(ui-egui): move menus.rs tests to menus/tests.rs 2026-10-26 18:18:17 +00:00
aiongg dff3e525c2 refactor(ui-egui): move panels/swatches.rs tests to panels/swatches/tests.rs 2026-10-26 18:18:17 +00:00
aiongg bef332f5b2 refactor(vectorcraft): move gpu.rs tests to gpu/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 11926af98d refactor(ui-egui): move panels/image_trace.rs tests to panels/image_trace/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 39ad1c0c6e refactor(tools): move pen.rs tests to pen/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 8efb850d6d refactor(doc): move hit.rs tests to hit/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 16e8459827 refactor(ui-egui): move toolbar.rs tests to toolbar/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 327cb2656c refactor(pathops): move planar.rs tests to planar/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 8fd986ae13 refactor(tools): move draw2/gesture.rs tests to draw2/gesture/tests.rs 2026-10-26 18:18:17 +00:00
aiongg 1bbb3e0b05 refactor(render): move fx.rs tests to fx/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 34006a8ede refactor(tools): move builder.rs tests to builder/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 32034021a4 refactor(ui-egui): move panels/artboards.rs tests to panels/artboards/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 79c5624f7a refactor(ui-egui): move shortcuts.rs tests to shortcuts/tests.rs 2026-10-26 18:18:16 +00:00
aiongg e8a069ebc2 refactor(engine): move cmd/threads.rs tests to cmd/threads/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 06bb496447 refactor(tools): move direct.rs tests to direct/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 078f7b9aa7 refactor(ui-egui): move chrome.rs tests to chrome/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 14540d6a44 refactor(engine): move cmd/typecmd.rs area_tests to cmd/typecmd/area_tests.rs 2026-10-26 18:18:16 +00:00
aiongg 42e11117e2 refactor(ui-egui): move panels/properties.rs tests to panels/properties/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 2377df07ee refactor(ui-egui): move panels/layers.rs tests to panels/layers/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 732d4ded79 refactor(tools): move select.rs tests to select/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 6aa67a5736 refactor(ui-egui): move canvas.rs tests to canvas/tests.rs 2026-10-26 18:18:16 +00:00
aiongg 2cd1a3a3f1 refactor(engine): move cmd/graph.rs tests to cmd/graph/tests.rs 2026-10-26 18:18:16 +00:00
aiongg a042e3ff25 refactor(ui-egui): move dialogs/mod.rs i18n/mod.rs panels/mod.rs to foo.rs files 2026-10-26 18:18:16 +00:00
aiongg 7695057780 refactor(trace): move centerline/mod.rs logo/mod.rs to foo.rs files 2026-10-26 18:15:22 +00:00
aiongg f1ab4965c4 refactor(render): move encode/mod.rs to foo.rs files 2026-10-26 18:15:22 +00:00
aiongg 0b04172c45 refactor(pdf): move print/mod.rs to foo.rs files 2026-10-26 18:15:21 +00:00
aiongg b9a73ba1af refactor(eps): move import/mod.rs import/ai/mod.rs print/mod.rs to foo.rs files 2026-10-26 18:15:21 +00:00
aiongg 62261b17c9 refactor(engine): move cmd/mod.rs cmd/fileio/mod.rs cmd/findfiles/mod.rs cmd/place/mod.rs to foo.rs files 2026-10-26 18:15:21 +00:00
aiongg 6bbfb91d16 refactor(effects): move pixel/mod.rs to foo.rs files 2026-10-26 18:15:18 +00:00
aiongg 6c57ddb063 refactor(color): move cms/mod.rs to foo.rs files 2026-10-26 18:15:18 +00:00
aiongg 777a764a0e test: scan source directories recursively
The EPS error-meaning test walks src/import and its subdirectories. The
picks and tl! literal scans skip directories named tests, as the undo and
message scans already do, so test modules moved to foo/tests.rs or
tests/<topic>.rs are not read as interface code.
2026-10-26 18:05:40 +00:00
BFlat e2a8280134 Merge pull request #4272 from nrq6993-a11y/stream/vc-issue-2899-join-scrub-ends
G11: Join tool connects endpoints near scrub line ends
2026-10-26 22:11:54 +07:00
nrq6993-a11y b7b107ce24 G11: Join tool connects endpoints near scrub line ends
Squashed from #4272 onto main.
2026-10-26 22:07:58 +07:00
BFlat 78f265685c Merge pull request #4270 from dotCooCoo/fix/placed-document-redraws-its-area
Placed documents: a ready bitmap redraws only its objects, and bitmaps on screen are not made again
2026-10-26 21:53:38 +07:00
BFlat bb94837bcb Merge pull request #4269 from dotCooCoo/fix/huge-image-decoded-to-fit
Images: an image past the 2 GiB decode allowance draws at reduced size instead of a crossed box
2026-10-26 21:53:21 +07:00
dotCooCoo 1c4ec81ec2 Placed documents: a ready bitmap redraws only its objects, and bitmaps on screen are not made again
On screen, placed documents (PDF, .ai and .vectorcraft) draw from
bitmaps made in the background. Each bitmap that became ready changed
a generation in the canvas key, so the canvas rendered the whole frame
again. The bitmaps share a 512 MiB budget, and making one dropped the
least recently drawn others, even those on screen: with more than that
on screen, every frame dropped a bitmap it drew and asked for it again,
without end. A bitmap that could not be made (the file can't be read
and there is no preview) also changed the generation and was asked for
again in every frame.

When a bitmap is ready, placed_document::made_between names its file,
and the canvas renders again only where the objects showing it are
(placed_area), as it does after an edit, when the frame shown was
rendered on the UI thread and that part is at most half the frame.
Art of a symbol, a graph design, a pattern or a brush that shows the
file still renders the whole frame.

Bitmaps drawn or made since a frame began are not dropped to make room
for the ones it asks for. They stay past the budget up to 2 GiB. A
bitmap that would take them past 2 GiB is not kept, and its file draws
exactly at that zoom. A bitmap that can't be made shows the
placeholder, does not change the generation, and is not asked for
again.

Docs: docs/target-app-parity.md.
2026-10-26 21:41:44 +07:00
dotCooCoo 6ed4608d82 Images: an image past the 2 GiB decode allowance draws at reduced size instead of a crossed box
A PNG, JPEG, GIF or WebP image that takes more than the decode
allowance as RGBA (2 GiB, 512 MiB in the web app), such as a 24000 ×
24000 JPEG, was placed with the warning "too large to draw" and then
drew as a crossed gray box on the canvas and was left out of raster
exports. A 16-bit PNG whose decoded samples were past the allowance
was shown the same way, with the same warning, although its RGBA fits.

The renderer now decodes such an image at the largest size, keeping its
proportions, that fits the allowance as RGBA. Each pixel of the result
is the mean of the image's pixels it covers. A PNG that isn't
interlaced is read a row at a time; other images are decoded whole when
their decoded samples fit the allowance. A 16-bit PNG that isn't
interlaced and whose RGBA fits is read a row at a time at its own size.
An image of more pixels than the allowance has bytes still draws as the
crossed box, and so does one whose decoded samples are past the
allowance, other than a PNG that isn't interlaced. The renderer
decodes an image at reduced size only while the result and the memory
reading it takes (the image decoded whole, or the PNG reader's row
buffers) fit beside the images being painted; otherwise the image is
not decoded on that render (on the canvas it draws as the crossed box)
and is tried again on the next render. The document keeps the whole
file for saving and export. A placed document's saved preview past the
allowance is decoded the same way, at the size it is drawn at or at the
reduced size when that is smaller.

Open, Place and the Links panel say "an image of W × H pixels is shown
at reduced size" for an image drawn smaller. They say nothing for an
image drawn at its own size, and they say "too large to draw" for one
that is not drawn at reduced size.

Docs: docs/mcp.md, docs/target-app-parity.md (the crossed box's line
now names an image over the allowance that can't be drawn at reduced
size).
2026-10-26 21:41:42 +07:00
BFlat 8a88626d5d Merge pull request #4098 from dotCooCoo/feat/pdf-list-markers-as-text
PDF: list markers export as selectable text
2026-10-26 21:02:27 +07:00
dotCooCoo 7705983a72 PDF: list markers export as selectable text
Squashed from #4098 onto main.
2026-10-26 21:00:30 +07:00
BFlat a05b1dd75a Merge pull request #4265 from dotCooCoo/fix/cropped-effect-reused-on-pan
Render: cropped shadow and blur rasters are kept across pans within a margin
2026-10-26 20:55:45 +07:00
dotCooCoo 7470505113 Render: cropped shadow and blur rasters are kept across pans within a margin
A Drop Shadow, Gaussian Blur, Feather or Photoshop-style filter raster
too large to keep whole is cropped to the view. It was drawn again
only while a later frame's rect, panned back, lay inside the frame it
was made in, so every pan that showed new pixels made it again. For a
Drop Shadow on a 6000 x 4000 pt image in a 2560 x 1440 view at 100% to
400%, a pan took 60 to 84 ms; with Gaussian Blur or Feather, a pan took
158 to 217 ms.

When such a raster is made again at the zoom and rotation of the one
kept for the object, it now also covers a margin around the view: up
to half the view's longer side, while the raster stays within the
8.4 million pixel budget at full size (441 pixels on each side of a
2560 x 1440 view for a 20 pt blur at 100%). Later pans that keep the
view inside the margin draw that raster. The first frame at a zoom, a
zoom step and the frames of a drag make the raster without the margin,
as before. A shadow made over an earlier cropped shadow covers only
the rect the earlier one was made for.

A kept raster is drawn again only after a pan by whole device pixels,
but the wheel, a trackpad and the scroll bars scrolled the view by
amounts that are not whole pixels. The canvas now moves the view by
whole device pixels when it scrolls or is dragged. A scroll by the wheel, a trackpad, a touch screen or a scroll
bar is rounded, and the part of a pixel left over is added to the next
scroll of the same view; it is dropped after a zoom, a turn, Fit or a
document switch. A Hand tool, Space or middle-button drag and a scroll
bar thumb drag round the distance from where the drag began.

The silhouette of a shadow or glow raster is now drawn with art culled
against the raster's own area instead of the view, as filtered content
already is. Before, a group member outside the view cast no shadow
into a raster kept whole, so a pan that showed the member drew it
without its shadow. A cropped raster kept across the margin would have
done the same. The moved silhouette that a drag compares is drawn the
same way.

Docs: docs/target-app-parity.md.
2026-10-26 20:43:54 +07:00