Commit Graph
7555 Commits
Author SHA1 Message Date
dotCooCoo 2d0fa32d30 Docs: the projection checks compare absolute values
The horizon test compares a point's signed w with the largest absolute
value in the bottom row, and the invertibility test compares the
absolute value of the determinant with the largest absolute value among
its six products, so a negative determinant counts as invertible. A
stored projection that overflows is divided by the largest absolute
value in its bottom row.
2026-11-02 08:53:47 -08:00
dotCooCoo b5885e35fa Geometry: a projective map at a small scale maps a far point without overflowing
The power of two that brings a small map's entries up before a point is mapped is now reduced by the power of two of the point's larger coordinate, so no product of an entry and a coordinate reaches 1. A map that mapped a point before the scaling step does so again, and affine_at uses the same entries.
2026-11-02 08:24:29 -08:00
dotCooCoo 0f48ba21e9 Geometry: a projective map at a tiny scale maps points and derivatives as at unit scale
apply and affine_at multiply every entry by the power of two that brings the
largest to at least 1/2 when all entries are below 1/2, so products that would
be subnormal keep their precision. The identity times 5e-324 mapped (0.5, 0.5)
to (0, 0) before. Maps with an entry of 1/2 or more are unchanged.
2026-11-02 08:15:21 -08:00
dotCooCoo 4494d40c33 Geometry: the inverse of an invertible projective map is kept however small its relative determinant
adjugate_inverse no longer applies the relative determinant test to its result. That test is not symmetric between a map and its inverse: a map whose determinant is 1e-8 of its largest product can have a finite, accurate inverse whose own ratio is near 1e-16, so inverse() was None while is_invertible() was true. The result is now kept when every entry is finite and its determinant, summed from the six products in split form, is not 0.
2026-11-02 07:55:19 -08:00
dotCooCoo d1fb8e540c Geometry: a projective map with entries far apart in size keeps its inverse
The inverse holds every cofactor and the determinant as a mantissa and a
power of two, and forms each entry from their quotient. A map such as
diag(1e-300, 1e300, 1e-300), which counts as invertible, now gets its
inverse diag(1e300, 1e-300, 1e300) instead of none.
2026-11-02 07:45:10 -08:00
dotCooCoo b22912b25a Geometry: the inverse of a projective map with a tiny determinant keeps its w row
When a cofactor of a map with a normal but very small determinant underflows to 0, the
inverse formed from the map itself can have a w row of 0, so every point mapped through it
is refused. The inverse is now kept only when it is itself invertible, and is otherwise
formed from the map divided by a power of two that brings its determinant's products near 1.
2026-11-02 07:37:37 -08:00
dotCooCoo bffb4e6e87 Geometry: a projective map with entries of very different sizes stays invertible
The scale-free determinant test no longer builds a rescaled copy of the map. It
forms each of the six determinant products as a mantissa product and an
exponent sum and compares their sum with the largest of them, so a map such as
diag(1e307, 1e-157, 1e-157), whose rescaled copy overflows, is still invertible
and loads from a document. The rescaled copy is built only to invert a map whose
determinant is not finite or is below the normal range.
2026-11-02 07:21:32 -08:00
dotCooCoo e365c09141 Geometry: a projective map's horizon and invertibility checks do not depend on its scale
A homography means the same map at any nonzero uniform scale of its
entries, but `apply`, `is_invertible` and `inverse` compared w and the
determinant with absolute thresholds. A map stored with small entries
refused every point and could not be inverted, and a map with large
entries drew points past its horizon.

- `apply` refuses a point when w is at most 1e-9 times the largest
  magnitude in the w row.
- A map counts as invertible when its determinant is more than 1e-15
  times the largest of the six products the determinant sums, taken on
  a copy rescaled by a power of two. An inverse whose determinant
  overflows or underflows is taken on that copy.
2026-11-02 07:10:04 -08:00
BFlat 4ee0ef231a Merge pull request #5139 from dotCooCoo/fix/ai-os10-distort
.ai import: type keeps its Distort & Transform effects live
2026-11-02 16:54:41 +07:00
BFlat 04f5e6455d Merge pull request #5156 from dotCooCoo/fix/ai-os18-d
.ai import: open the variable library and data sets from the editing data
2026-11-02 16:54:26 +07:00
BFlat 942a29d9cb Merge pull request #5231 from dotCooCoo/feat/pixar-pxr-open
File formats: Pixar (.pxr) images open and place
2026-11-02 16:54:08 +07:00
BFlat d439a9f6e2 Merge pull request #5232 from dotCooCoo/fix/envelope-appearance-transform-options
Envelope: Distort Appearance keeps a Transform effect's Scale Strokes & Effects and Transform Patterns
2026-11-02 16:53:52 +07:00
BFlat f56b8ae578 Merge pull request #5230 from Hassan1305/fix-5159-cmdv-image
Fix #5159: ⌘V from the macOS menu bar pastes a picture another app copied
2026-11-02 16:53:34 +07:00
dotCooCoo b664216a2a .ai import: type keeps its Distort & Transform effects live
Squashed from #5139 onto main.
2026-11-02 16:19:59 +07:00
dotCooCoo 8ab68e4223 .ai import: open the variable library and data sets from the editing data
Squashed from #5156 onto main.
2026-11-02 16:19:19 +07:00
dotCooCoo 952446253f File formats: Pixar (.pxr) images open and place
Squashed from #5231 onto main.
2026-11-02 16:18:48 +07:00
dotCooCoo 9aac3ca888 Envelope: Distort Appearance keeps a Transform effect's Scale Strokes & Effects and Transform Patterns
With Envelope Options > Distort Appearance on, a path whose Transform
effect has Scale Strokes & Effects or Transform Patterns on, or copies it
with a gradient, was baked with the effect as geometry only: every copy
kept the original's stroke weight, dashes and pattern placement before
the envelope bent it. bake_appearance now makes such a path into the
per-copy art that drawing, export and Expand Appearance already use, and
bakes each copy's strokes into filled outlines from there.
2026-11-02 16:18:15 +07:00
HassanKhanandClaude Opus 5.5 b6f90d42fb Fix #5159: ⌘V from the macOS menu bar pastes a picture another app copied
The menu bar takes ⌘V's key-down as Edit › Paste's key equivalent, and
`native_menu::key_events` turns it back into egui input. With text on the
clipboard that was a Paste event; with only a picture (a screenshot) it
was nothing, leaving the paste to the window's own key-up. egui's window
integration only releases a key whose press it saw, so that release never
came and ⌘V pasted nothing, while Edit › Paste and ⌘V with the menu open
worked.

`key_events` now ends ⌘V with the key's release, as it already did for
⌘X and ⌘C: without a Paste event that release is the picture paste
`PasteChord` looks for, and after one it ends that paste so the next
picture paste still fires.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 16:18:13 +07:00
BFlat 683abdb2d6 Merge pull request #5080 from dotCooCoo/fix/issue-3118
Fix #3118: PDF export writes CMYK inks, gray and spot tints as the document holds them
2026-11-02 16:05:58 +07:00
BFlat 45eaeb258c Merge pull request #5226 from dotCooCoo/feat/compound-shape-blend-envelope-members
Pathfinder: blends, envelopes and warped objects can be compound shape members
2026-11-02 16:05:44 +07:00
BFlat e607294cb4 Merge pull request #5079 from dotCooCoo/feat/symbol-nine-slice-scaling
Symbols: a scaled instance of a symbol with 9-slice guides keeps its corners and edges unstretched
2026-11-02 16:05:26 +07:00
BFlat fafac93f4d Merge pull request #5221 from dotCooCoo/fix/transform-effect-item-options
Effects: a Transform effect on a fill or stroke honors Scale Strokes & Effects and Transform Patterns
2026-11-02 16:05:07 +07:00
BFlat 1df7337599 Merge pull request #5118 from dotCooCoo/fix/vars-p1
Variables: art on a locked artboard is not bound or rewritten by a data set
2026-11-02 16:04:49 +07:00
BFlat 846c2e6de9 Merge pull request #5224 from dotCooCoo/feat/select-same-link-block-series
Select: Same › Link Block Series selects every frame of a text thread
2026-11-02 16:04:33 +07:00
BFlat 37147bb029 Merge pull request #5223 from dotCooCoo/feat/raster-extension-aliases
File formats: .dib and .rle bitmaps, .pdd Photoshop files and .pns PNGs open and place
2026-11-02 16:04:15 +07:00
dotCooCoo b30f7ad34c Fix #3118: PDF export writes CMYK inks, gray and spot tints as the document holds them
Squashed from #5080 onto main.
2026-11-02 15:22:38 +07:00
dotCooCoo d324440afb Pathfinder: blends, envelopes and warped objects can be compound shape members
Squashed from #5226 onto main.
2026-11-02 15:22:32 +07:00
dotCooCoo 83f2bfe9d6 Symbols: a scaled instance of a symbol with 9-slice guides keeps its corners and edges unstretched
Squashed from #5079 onto main.
2026-11-02 15:22:07 +07:00
dotCooCoo ae23859002 Effects: later effects on a fill's or stroke's own Transform apply to all its copies as one piece
The geometry effects after a fill's or stroke's own Transform effect with
Scale Strokes & Effects or Transform Patterns now take the bounds of the
transformed path and all its copies as their reference box, as an
object's own effects do. A later Rotate turns the copies about their
combined center instead of turning each copy about its own, and a later
Offset Path or plain Transform applies to the paths themselves. Each copy
keeps its own scaled distances.

Part of #885
2026-11-02 15:22:00 +07:00
dotCooCoo eb92a1e53a Effects: a fill's or stroke's own Transform copies leave room in the effect budget for the pieces painted after them
transform_item_leaf now holds back the leaf's geometry for each plain or transformed piece that follows a transformed fill or stroke, so the copies of an earlier item no longer use up the budget that a later fill or stroke still needs. The nested pass over a transformed piece keeps to the same reduced limit.
2026-11-02 15:22:00 +07:00
dotCooCoo a1b8da43de Effects: plain fills and strokes beside a fill's or stroke's own Transform count toward the effect budget
Each fill or stroke without such a Transform effect is drawn on the object's geometry again, so its cost now counts toward the budget that limits the Transform effect's copies. The object's own geometry is no longer counted a second time next to the pieces that replace it. The Transform effect options entry in docs/target-app-parity.md links the current help pages.

Part of #885
2026-11-02 15:22:00 +07:00
dotCooCoo 3e77f65c7f Effects: a Transform effect on a fill or stroke honors Scale Strokes & Effects and Transform Patterns
A Transform effect in a fill's or stroke's own effect list now applies its
Scale Strokes & Effects and Transform Patterns options as the same effect on
the object does: the stroke's weight and dashes, the distances of the fill's
or stroke's later effects and its pattern follow the transformation, each
copy once more than the last, and with Transform Objects off the geometry
stays and the options apply once. The fill or stroke becomes an object of
its own in the art the canvas, export and Expand Appearance draw, and Use
Preview Bounds measures that art too (also for the object-level options).

Part of #885
2026-11-02 15:22:00 +07:00
dotCooCoo e68bf6af55 Variables: art on a locked artboard is not bound or rewritten by a data set
Squashed from #5118 onto main.
2026-11-02 15:21:58 +07:00
dotCooCoo 30dd4fe8f5 Select: Link Block Series checks the selection in linear time
The type objects in the selection are deduplicated with a set, each frame's
thread is looked up in a map built once, the locked artboards are measured
once per call, and the menu check stops at the first selected type object.
2026-11-02 15:21:51 +07:00
dotCooCoo 405cc83cae Select: Link Block Series ignores selected type that Select All cannot reach
Type selected by id on a hidden, locked or template layer, or outside
the isolated group, no longer counts as selected type: the command stays
off and does not select that frame's thread. The check reads the
object's ancestry, so the Select menu does not walk the whole document.
2026-11-02 15:21:51 +07:00
dotCooCoo 012a50815f Select: Link Block Series skips hidden and locked type in selected groups
Select › Same › Link Block Series no longer counts hidden or locked type
inside a selected group, or type inside a hidden or locked object there,
as selected. A group that holds only such type leaves the command off, and
the command does not select the other frames of that type's thread.
2026-11-02 15:21:51 +07:00
dotCooCoo 67032aece6 Select: Same › Link Block Series selects every frame of a text thread
Select › Same › Link Block Series (select.same.linkBlockSeries) selects every
frame of the threads that the selected type objects, and the type inside
selected groups, are in, in thread order. Type in no thread selects itself,
other selected objects are left out, and with frames of several threads
selected it selects all of them. Hidden, locked and out-of-isolation frames
are left out, Reselect repeats it, and it records no undo step. The item is
off while no type is selected.

Menu row in every catalog, docs/mcp.md and a docs/target-app-parity.md line.
2026-11-02 15:21:50 +07:00
dotCooCoo b5c91ece24 File formats: .dib and .rle bitmaps, .pdd Photoshop files and .pns PNGs open and place
File > Open and File > Place read BMP files named .dib or .rle (run-length
encoded bitmaps included), Photoshop files named .pdd and PNG files named
.pns, in any letter case. The Open and Place dialogs list them in "All
readable files", "All placeable files" and their format's own filter, and
Glass's Load Texture lists them too. Linked files with these names update
and relink, the Links panel shows their format, and Edit Original opens
them.

The extensions are read-only: exports still write .bmp, .psd and .png, and
an export to a path with one of the new extensions is refused as before.
The desktop packaging does not associate them with the app.
2026-11-02 15:21:48 +07:00
BFlat 5198b7084a Merge pull request #5078 from mockydevs/fix/repeat-edit-text-5054
Fix #5054: a double-click on a repeat isolates it to edit its source
2026-11-02 14:59:56 +07:00
BFlat ef5121c5df Merge pull request #5154 from mockydevs/fix/placed-bitmap-test-5152
Fix #5152: placed-document bitmap test no longer races its worker
2026-11-02 14:59:44 +07:00
BFlat f8fe21b180 Merge pull request #5107 from TheGalitube/fix/h7830-dxf-unicode-escapes-drop-supplem
Decode DXF surrogate pairs
2026-11-02 14:59:31 +07:00
BFlat be6433f799 Merge pull request #5075 from Prin-Ing/fix/h168-svg-export-with-metadata-on-writ
Filter invalid XML characters from SVG Dublin Core metadata
2026-11-02 14:59:15 +07:00
BFlat 86e7f2f342 Merge pull request #4324 from nrq6993-a11y/stream/vc-feat3-g4-mixed-type-orientation
G4: Type orientation menu unchecked for mixed vertical/horizontal selection
2026-11-02 14:59:02 +07:00
BFlat 6dcd0045b0 Merge pull request #5222 from ruchirguitar/fix/5218-artboard-navigation-commands
Fix #5218: the artboard navigator's buttons are commands Keyboard Shortcuts lists
2026-11-02 14:58:43 +07:00
BFlat 429cf5a7c5 Merge pull request #5090 from mockydevs/feat/corner-kind-arrows-2898
Fix #2898: Up and Down change the corner kind while dragging a widget
2026-11-02 14:58:27 +07:00
BFlat 093d362ca7 Merge pull request #5110 from mockydevs/feat/effect-shortcuts-3296
Fix #3296: Effect menu items take keyboard shortcuts of their own
2026-11-02 14:58:10 +07:00
BFlat 7d7ea937a8 Merge pull request #5109 from Prin-Ing/fix/h173-zip-writer-accepts-65535-files-b
Limit the ZIP writer to 65534 files so Archive::open can read it
2026-11-02 14:57:56 +07:00
BFlat c5eef592fc Merge pull request #4154 from FarmerGeorg/feature/appearance-tab-ui-parity
Appearance panel: UI improvements and parity for row editing
2026-11-02 14:57:39 +07:00
BFlat 79a2baff32 Merge pull request #4644 from ham9zah/feat/type-tool-group
Type tools: a Type tool that uses the clicked path, pointers that say what a click makes, and an icon per tool
2026-11-02 14:57:16 +07:00
BFlat 048c8ad6dc Merge pull request #4845 from Taha-Mahmoodi/feat/units-east-asian-type
Units: Preferences › East Asian Type reads, with Q and Ha units (#394)
2026-11-02 14:56:57 +07:00