Commit Graph
543 Commits
Author SHA1 Message Date
BFlat 0e78bfa60c Merge pull request #7580 from dotCooCoo/fix/create-outlines-gradient-layout-bounds
Type: Create Outlines keeps a run's gradient across the whole text
2026-11-15 05:30:22 +07:00
BFlat 63e40bca44 Merge pull request #7488 from dotCooCoo/fix/3d-shadow-builds-once
3D: a render with a shadow builds each solid once
2026-11-15 05:29:29 +07:00
BFlat 88dd37d2d9 Merge pull request #7527 from dotCooCoo/fix/3d-masked-cap-graphic-once
3D: a gradient fill with transparent stops and its stroke draw their graphic once
2026-11-15 04:22:18 +07:00
dotCooCoo bf0950c0ef Merge main into fix/3d-shadow-builds-once 2026-11-14 12:30:56 -08:00
dotCooCoo 98fbda2eb1 Merge main into fix/create-outlines-gradient-layout-bounds 2026-11-14 12:28:14 -08:00
BFlat 6970c4efec Merge pull request #7609 from dotCooCoo/fix/transform-copies-raster-effects
Effects: each copy of a Transform effect draws the raster effects listed before it
2026-11-15 03:21:43 +07:00
BFlat 2986979149 Merge pull request #7432 from dotCooCoo/fix/wireframe-transform-measures-shadow
3D: Expand as Wireframes measures later effects with the cast shadow
2026-11-15 03:21:13 +07:00
BFlat ab913e84ad Merge pull request #7628 from dotCooCoo/fix/clipping-members-drawn-budget
Effects: a clipping path's members count toward the member limit of a group's effects
2026-11-15 03:20:21 +07:00
dotCooCoo 66f989c27b Effects: the member limit's doc comment says a compound path with fill or stroke effects becomes a group of pieces 2026-11-14 10:09:26 -08:00
dotCooCoo 7e390fe079 Merge main into fix/3d-masked-cap-graphic-once 2026-11-14 09:55:12 -08:00
dotCooCoo a3ba3eeb38 Merge main into fix/3d-shadow-builds-once 2026-11-14 09:52:39 -08:00
BFlat e76f8d2c88 Merge pull request #7501 from dotCooCoo/fix/export-bakes-symbol-art-effects
Export: live effects in symbol art apply in PDF, EPS, print and DXF
2026-11-15 00:41:46 +07:00
BFlat d0b37826c0 Merge pull request #7338 from dotCooCoo/fix/colored-light-seams
3D: colored-light facets close their shared edges over an underlay
2026-11-15 00:40:19 +07:00
dotCooCoo 40d0b31cbe Effects: the clipping path doc comment says what the member limit leaves of a compound path
When the member limit is reached among the paths of a compound clipping
path that has geometry effects of its own, the compound path still
becomes one path of its reshaped geometry. The paths that were not
visited go into that geometry as they are, and their own effects are
not applied. The doc comment of with_clip_effects_applied_while said
that they keep their effects, which holds for the members of a group or
layer only.

New test a_compound_clipping_path_takes_its_own_effect_at_the_member_limit
covers the compound path.
2026-11-14 08:54:44 -08:00
dotCooCoo c3341be03c Effects: the member limit's doc comment covers clipping paths walked twice
A group or layer in a clipping path that has geometry effects of its
own is walked once for its members' effects and once for its own, and
its members count toward the member limit each time. The doc comment
of members_as_drawn now states this.
2026-11-14 08:28:31 -08:00
dotCooCoo be44f10b6a Effects: a clipping path's members count toward the member limit of a group's effects
When a group's geometry effects evaluate the members of the group, a
clip group's clipping path takes the geometry effects in it first. A
clipping path that is a group, layer or compound path had each of its
members reshaped at every depth without counting them, so a large
clipping path was reshaped past the SYMBOL_ART_MAX_NODES members that
members_as_drawn documents.

Each member of a clipping path now counts as one visited member. Once
the limit is reached, that member and the members after it keep their
effects, as the other members past the limit do. The canvas, the
export bake and clipping type are unchanged: they do not count members.
2026-11-14 08:21:58 -08:00
dotCooCoo 62604c38bd Merge main into fix/wireframe-transform-measures-shadow 2026-11-14 08:01:42 -08:00
dotCooCoo 69ec28dc4c Merge main into fix/3d-shadow-builds-once 2026-11-14 07:28:03 -08:00
BFlat 45d98a5f82 Merge pull request #7443 from dotCooCoo/fix/wireframe-outline-stroke-width
3D: Expand as Wireframes outlines each face's own stroke under a later Outline Stroke
2026-11-14 21:55:03 +07:00
BFlat 8657b38b35 Merge pull request #7590 from dotCooCoo/perf/group-sublayer-guides-one-pass
Effects: a layer's effects gather its sublayers' ruler guides in one pass
2026-11-14 21:51:54 +07:00
BFlat d1aa073c42 Merge pull request #7585 from dotCooCoo/fix/clipping-type-fill-effects
Export: clipping type with geometry effects clips where the canvas does
2026-11-14 21:50:33 +07:00
dotCooCoo 4f7a10c002 Merge main into fix/3d-shadow-builds-once 2026-11-14 06:02:41 -08:00
dotCooCoo 80854eb4b8 Merge main into fix/export-bakes-symbol-art-effects 2026-11-14 06:00:09 -08:00
BFlat 035d22b3e2 Merge pull request #7476 from dotCooCoo/fix/svg-clip-path-effects
Effects: a clipping path's geometry effects shape the clip on the canvas
2026-11-14 20:38:37 +07:00
BFlat 4bcb0026da Merge pull request #7569 from dotCooCoo/perf/3d-validation-builds-once
3D: effect validation builds each Extrude and Inflate solid once
2026-11-14 20:38:09 +07:00
dotCooCoo f00ddcbaa9 Effects: each copy of a Transform effect draws the raster effects listed before it
A path's Drop Shadow, glow, blur, Feather or pixel filter listed before a
Transform effect that makes copies was drawn once under all the copies, at
the object's own distances. Each copy now carries those raster effects,
scaled by the copy's mean scale, with a Drop Shadow's offset turned,
reflected and scaled with the copy. Raster effects listed after the
Transform effect still paint once around all the copies. Copies that stop
at the effect budget keep their effects, and a Transform effect without
copies draws as before.

The canvas, the object's bounds, export, baking and Expand Appearance use
the same art. Type, images, symbol instances, groups, a fill's or stroke's
own copying Transform effect, and paths with Rasterize or an SVG filter
before the copying effect keep one set of raster effects.
2026-11-14 05:32:43 -08:00
dotCooCoo 190e4be825 Merge main into fix/3d-masked-cap-graphic-once 2026-11-14 04:59:36 -08:00
dotCooCoo c482037570 Merge main into fix/3d-shadow-builds-once 2026-11-14 04:57:13 -08:00
dotCooCoo a8aea70be5 Merge main into perf/group-sublayer-guides-one-pass
# Conflicts:
#	crates/effects/src/group/tests.rs
2026-11-14 04:45:50 -08:00
dotCooCoo 59e4a6bfca Merge main into fix/wireframe-outline-stroke-width 2026-11-14 04:39:51 -08:00
dotCooCoo 65b221192e Effects: a layer's effects gather its sublayers' ruler guides in one pass
Evaluating a layer's Pathfinder or geometry effects asked each member
whether a sublayer below it held a ruler guide, then asked the members
of every selected sublayer or group the same question again on the way
down. A sublayer nested N deep was scanned once per layer or group above
it, so a chain of N sublayers cost N(N+1)/2 scans.

One read walk now looks at each member once at most and records which
members hold or lead to a sublayer's guides, and the move visits and
copies only those. As before, the groups inside a sublayer that holds no
guide are not looked into. The guides taken, their order, their hidden
and locked state, the art left behind and the sharing of untouched
members are the same as before.
2026-11-14 04:39:29 -08:00
BFlat 67f432c965 Merge pull request #7502 from dotCooCoo/fix/revolve-local-depth-order
Revolve: overlapping faces draw in the order of their depths where they overlap
2026-11-14 19:37:37 +07:00
BFlat 9a8b7bc3db Merge pull request #7517 from jayzed80/fix/offset-path-clip-silhouette-7289
Appearance: a group's own fills and strokes follow a clip group's clipping path, not the art it hides (#7289)
2026-11-14 19:37:29 +07:00
dotCooCoo 0e6151011d Export: clipping type with geometry effects clips where the canvas does
Type used as a clip group's clipping path, with a geometry effect on the
object, on one of its fills or strokes, or a perspective, was baked into
its outlined pieces with the effects applied, so SVG, PDF and the other
exports clipped by all of them while the canvas clips by the plain glyph
outlines. The baked clipping path was also a group, so the type's fills
and strokes were not painted.

bake_node now bakes such a clip group as the canvas draws it: the
clipping path is a path of the region effects::clip_outline gives, the
type's fills (effects baked) paint behind the clipped art inside the
clip, and its strokes paint over it outside the clip, in a group that
keeps the clip group's id and transparency.
2026-11-14 04:30:45 -08:00
dotCooCoo 77dc581b1c Type: Create Outlines keeps a run's gradient across the whole text
Create Outlines copied each character run's fills and strokes onto every
glyph, ruby glyph and underline or strikethrough bar as they were, so a
gradient with no vector of its own refitted to each piece's own box,
while the canvas fits it across the whole layout. A gradient with a
vector kept its text-space coordinates in the document, and the
characters' stroke kept its text-space weight on scaled type.

Each piece is now painted by paint_type_piece, the rule outline_text
already used: unplaced gradients are fixed to the layout's bounds, then
the type's transform places the piece, its gradients, stroke weights and
pattern tiles. Object > Expand outlines type the same way, and
object.expand.info measures gradient fills on the same paths.
2026-11-14 04:05:18 -08:00
dotCooCoo fb8cf27b9a Effects: clip regions follow fill effects and compound paths in every case
Three cases still clipped differently from what the clipping path draws:

- A clip group with an appearance of its own (a Drop Shadow, a geometry
  effect) was measured for culling by its plain clipping path, so a view
  showing only the part of the clip that an effect moved drew nothing.
  The renderer now grows that measure by the clip region in this case
  too.
- The geometry effects on the fills and strokes of an unpainted clipping
  path applied after the effects of a group around it. They now apply
  first, as for other members. A clipping path that paints keeps them
  live, so its fill and stroke still draw.
- Export baked a compound clipping path with an effect of its own from
  its raw paths, dropping the effects on those paths. It now bakes the
  clipping path as the canvas clips by it, and the pieces it bakes into
  get ids of their own.
2026-11-14 03:52:45 -08:00
dotCooCoo 10382a2f37 Export: symbol art dropped from the budget still counts toward it
An instance whose baked art passed the export's placed symbol art budget,
or drew too deep, gave its count back, so any number of instances could
each bake their art in full and be dropped without the work counting.

- Art baked and then dropped is now counted with the placed art against
  the budget, both before more art is baked and when baked art is checked.
- While an instance's art bakes, the art's objects before baking are held
  in the budget, so instances nested in it are placed only within what is
  left.

Documents whose placed art fits the budget export as before.
2026-11-14 03:51:14 -08:00
dotCooCoo 25e35ee5b1 3D: effect validation builds each Extrude and Inflate solid once
Checking an Extrude & Bevel (both kinds) or Inflate effect built every
shape's profile about the profiles' bounds, then built the fill and
stroke solids again about the bounds of the regions they paint. A
filled shape's profile is its fill's solid, so that solid was built
twice. When a stroke reaches past the shape, the first build also used
bounds the effect does not draw it about.

The check now builds the profile on its own only where no drawn solid
is built from it: every shape for Rotate, and for Extrude & Bevel and
Inflate a shape with no fill (strokes only, or no paint). A filled
shape's solid is built once, about the bounds the effect draws it
about. The shadow check is unchanged.

Tests count the solids the check builds: an object with a fill and a
stroke, a group of two such members, an effect on the fill and the
shadow on; a shape with no fill still has its profile built.
2026-11-14 03:51:00 -08:00
dotCooCoo 6cc43c1d24 Merge main into fix/3d-shadow-builds-once 2026-11-14 03:21:37 -08:00
dotCooCoo 134b8b33a1 Export: placed symbol art keeps its instance's link
An instance whose symbol art has live effects is replaced in the export by a group holding the baked art. That group now takes the instance's attributes as well, so a PDF export keeps the instance's URL as a link annotation over the art where its effects draw it.
2026-11-14 02:59:02 -08:00
dotCooCoo b59ec11b32 Export: symbol art placement skips instances the export leaves out
Hidden instances, instances in hidden groups, on template layers, and
on hidden layers or layers that do not print when the exporter leaves
those out are no longer placed for PDF, print, EPS and DXF. Their art
was baked and counted toward the 16,000,000-object limit for placed
symbol art, so it could leave a visible instance written without its
effects.

bake_document_placing_symbols takes a WrittenLayers value: PDF passes
the layers its settings write, EPS writes layers that do not print but
not hidden ones, and DXF writes both. Print removes the layers that do
not print before baking.
2026-11-14 02:45:49 -08:00
dotCooCoo a9fbb7aa50 Merge main into fix/svg-clip-path-effects 2026-11-14 02:24:38 -08:00
dotCooCoo 21267a4b1f Merge main into fix/wireframe-outline-stroke-width 2026-11-14 02:24:25 -08:00
dotCooCoo 87c9bca596 Merge main into fix/3d-masked-cap-graphic-once 2026-11-14 02:10:47 -08:00
dotCooCoo b46a1ebe5b 3D: a gradient fill with transparent stops and its stroke draw their graphic once
Under a colored light, a fill in a gradient with transparent stops carries
an opacity mask, and a graphic mapped onto Extrude & Bevel's cap or onto a
Plane was placed twice: once on the fill's cap with the mask and again on
the stroke's cap. The fill and stroke now share one graphic when they have
the same opacity and blending mode, as they do without the mask. It is
drawn after the last of their faces on that cap and takes the mask of the
surface it is drawn after, so an opaque stroke leaves it unmasked. A
masked fill without a stroke keeps its masked graphic, and members of a
3D group drawn with a mask keep graphics of their own. Unmasked fills and
strokes alone draw as before.
2026-11-14 02:10:11 -08:00
dotCooCoo 7625b800c8 Merge main into fix/wireframe-transform-measures-shadow 2026-11-14 02:09:28 -08:00
dotCooCoo df3d012e1f Merge main into fix/export-bakes-symbol-art-effects 2026-11-14 02:07:20 -08:00
dotCooCoo 5695823937 Export: placed symbol art keeps its instance's stain
When PDF, print, EPS and DXF export place a symbol's art to bake its
effects, the art now carries the stain the instance's fill gives it, as
it did before the art was placed. The art is stained first and its
effects apply to the stained colors.
2026-11-14 02:06:18 -08:00
dotCooCoo 2eb8619d6e Merge main into fix/colored-light-seams 2026-11-14 02:05:04 -08:00
BFlat c3df647cd7 Merge pull request #7408 from dotCooCoo/fix/3d-export-builds-once
3D: Export 3D Object builds each Extrude and Inflate solid once
2026-11-14 16:53:56 +07:00