Commit Graph
84 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 edaef792e0 Fix up merged PRs: Edit Points hits select their shape on right click; Hyperlink sound fields in #713's tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:11:36 -04:00
Brandon Thomas 8a56ce8340 Merge PR #705 from NikitkaRa: PPTX: write Color Pulse emphasis as a colour change, not a scale
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 13:09:10 -04:00
Brandon Thomas 62f7075b42 Merge PR #701 from NikitkaRa: PPTX: normalize literal line ends in XML so runs stay put on save
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 13:09:09 -04:00
Brandon Thomas 9ae4d726d4 Merge PR #694 from NikitkaRa: PPTX: keep table styles the file defines when no table uses them 2026-10-14 13:09:08 -04:00
Brandon Thomas f0d0e2a93b Merge PR #659 from NikitkaRa: Charts: percent axes for 100% stacked; source-linked axis number formats 2026-10-14 13:09:05 -04:00
Brandon Thomas 0bab72aff2 Merge PR #590 from NikitkaRa: PPTX: round-trip chart trendlines 2026-10-14 13:08:57 -04:00
Brandon Thomas 1080d02dd0 Merge PR #589 from NikitkaRa: PPTX corpus: themes, masters, effects and links; keep text Mouse Over actions 2026-10-14 13:08:57 -04:00
Brandon Thomas 15b9ae0267 Merge PR #578 from NikitkaRa: PPTX: round-trip 3-D models and animation bounce end 2026-10-14 13:08:56 -04:00
Brandon Thomas f4c182795f Merge PR #562 from NikitkaRa: Pptx: round-trip text effects, layout, fills, bevels and connectors 2026-10-14 13:08:54 -04:00
Brandon Thomas 4dea355f02 Merge PR #554 from NikitkaRa: Pptx: round-trip comments, links, shows, groups and inherited placeholders 2026-10-14 13:08:53 -04:00
Brandon Thomas c9e071c355 Merge PR #517 from NikitkaRa: PPTX: owned corpus round-trip, keep notes-master header and footer 2026-10-14 13:08:48 -04:00
Brandon Thomas 11e36ed3ac Merge PR #516 from NikitkaRa: Transitions: built-in sounds, Stop Previous Sound and Loop Until Next 2026-10-14 13:08:48 -04:00
Brandon Thomas cc0a2f3dc5 Merge PR #505 from NikitkaRa: Transitions: choose a transition sound and play it in the show
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 13:08:47 -04:00
Brandon Thomas f4892fc9e7 Merge PR #504 from NikitkaRa: Text: set text transparency from Text Fill (#32)
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/pptx/tests/roundtrip.rs
2026-10-14 13:08:47 -04:00
Brandon Thomas 163a259db4 Merge PR #480 from NikitkaRa: Pptx: budget chart points, chart XML size, inflate work and VML lookups (#401) 2026-10-14 13:08:44 -04:00
Brandon Thomas 78b6c2982f Merge PR #439 from NikitkaRa: Pptx: read and write embedded fonts
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 13:08:43 -04:00
Brandon Thomas 402c1f4611 Merge PR #222 from justinjohn0306: Animations: nine PowerPoint exit effects import as themselves (#147)
# Conflicts:
#	crates/anim/src/tests.rs
#	crates/pptx/tests/roundtrip.rs
2026-10-14 12:58:00 -04:00
Brandon Thomas a5eae5e9cf Merge PR #216 from justinjohn0306: PPTX: a lone guide keeps the name its preset uses, adj1 or adj (#214)
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 12:58:00 -04:00
Brandon Thomas 4dc6e06c41 Merge PR #212 from justinjohn0306: PPTX: .potx and .ppsx declare a template and slide show main part (#210)
# Conflicts:
#	crates/pptx/tests/roundtrip.rs
2026-10-14 12:58:00 -04:00
Brandon Thomas 8ffb218f78 Merge PR #356 from natocool2: Bump quick-xml to 0.41 (RUSTSEC-2026-0194, RUSTSEC-2026-0195) 2026-10-14 12:57:24 -04:00
Brandon Thomas 30d282d510 Merge PR #348 from marcoarnulfo: Open: a password-protected presentation says so, and open errors show on the start screen 2026-10-14 12:57:23 -04:00
Brandon Thomas af1c6696ca Merge PR #280 from albayazid: Comments: threads and resolved state survive a .pptx round trip (#70) 2026-10-14 12:57:23 -04:00
Brandon Thomas b7cb5331d7 Merge PR #242 from pierrevbc: SmartArt: text is laid out on its text rectangle (dsp:txXfrm), not in columns 2026-10-14 12:57:22 -04:00
Brandon Thomas d281ba7707 Merge PR #149 from alexanderalber: PPTX import: a transition without spd is 0.5 s, not the effect's default (#117) 2026-10-14 12:57:19 -04:00
Brandon Thomas 24644f3e3b Merge PR #83 from MarekSpodBiedry: PPTX: animation rewind survives save and reopen (#77) 2026-10-14 12:57:18 -04:00
Brandon Thomas a9b8cc4f4a Merge PR #728 from midasmatterhorn: pptx: write linked pictures with r:link so PowerPoint resolves external images 2026-10-14 12:53:34 -04:00
midasmatterhorn 5d31b78736 pptx: write linked pictures with r:link so PowerPoint resolves external images 2026-10-14 18:01:42 +03:00
Nikita Rakitin f036a8e805 PPTX: Color Pulse emphasis is written as a colour change, not a grow 2026-10-14 06:44:59 +03:00
Nikita Rakitin ce3725a5c8 PPTX: literal CR LF and CR in XML read as LF; line feeds in run text read as line breaks 2026-10-14 06:37:15 +03:00
Nikita Rakitin 800c2008df PPTX: table styles the file defines are kept on save even when no table uses them 2026-10-14 06:15:05 +03:00
Nikita Rakitin 3960ea47cd Charts: 100 % stacked axes count in percent; linked axis formats come from the data 2026-10-14 04:19:16 +03:00
Nikita Rakitin 8fd04ebd92 PPTX: round-trip chart trendlines
An owned corpus slice checks combo charts with data labels, merged
tables with diagonal borders, and text columns, autofit, vertical text
and a WordArt warp. Trendlines (type, order, period, forecast,
intercept, equation and R²) are now read and written.
2026-10-14 00:58:20 +03:00
Nikita Rakitin 9f8c860f90 PPTX corpus: themes, masters, effects and links; keep text Mouse Over actions
New owned corpus test on PowerPoint-shaped XML: a custom-theme deck with
shadow, glow, soft-edge and reflection effects and every common text and
shape hyperlink, and a two-master deck with its own themes and layouts.
The one loss it found: a:hlinkMouseOver on text runs was dropped; it is
now read into RunProps::hover and written back.
2026-10-14 00:52:25 +03:00
Nikita Rakitin c94b5c8d1e PPTX: round-trip 3-D models and animation bounce end
An owned corpus opens, saves and reopens SmartArt and OLE kept as XML, audio and video bookmarks and trims, a section with a hidden slide, slide-number and date fields, ink, .glb models and animation repeat, bounce end and triggers. Relationship-bearing SmartArt and OLE, playback options and rewind stay with their open PRs.
2026-10-14 00:35:12 +03:00
Nikita Rakitin 184b76e2a7 Round-trip text effects, layout, fills, bevels and connectors
An owned corpus of those kinds survives open, save and reopen. A run's
inner shadow, reflection and soft edge were dropped, and a bevel preset
with no kept 3-D XML was not written back, so import and export now keep
them.
2026-10-14 00:04:22 +03:00
Nikita Rakitin f9d5a43174 Round-trip comments, links, shows, groups and inherited placeholders
An owned corpus of those element kinds survives open, save and reopen.
Paragraph default run properties, including a link, and action sounds
were dropped on save, so import and export now keep them.
2026-10-13 23:43:03 +03:00
Nikita RakitinandCursor 6a85afa236 Pptx: round-trip an owned corpus and keep notes-master text
Open, save and reopen decks we author, and compare package parts and
text. The check showed a notes master's header and footer were replaced
by an empty notes master on save.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:34:29 +03:00
Nikita RakitinandCursor 69a4424e75 Transitions: built-in sounds, Stop Previous Sound and Loop Until Next
Follow-up to the transition sound picker. The Sound box now lists
[Stop Previous Sound] and six built-in sounds (Chime, Click, Camera,
Whoosh, Drum Roll, Laser) that are synthesised as small WAVs when
chosen, so no sound files ship with the app; the same built-in sound is
embedded once however many slides use it. Loop Until Next Sound repeats
a sound in the show until another slide's sound or Stop Previous Sound.
PPTX reads and writes p:stSnd loop="1" and p:endSnd, keeps the sound's
file name in p:snd/@name, and setting a slide's transition to None no
longer drops its sound.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:30:19 +03:00
Nikita RakitinandCursor 460a2712e4 Transitions: choose a transition sound and play it in the show
Transition sounds were read from and written to .pptx but could not be
set and never played. Transitions › Timing gets a Sound box ([No Sound]
or Other Sound…), backed by a new transition.sound command that embeds
an audio file on the selected slides (or removes it with none). In the
slide show the sound plays as its slide comes in and, as in PowerPoint,
keeps playing into the next slide unless that slide has a sound of its
own. Built-in sounds, Stop Previous Sound and Loop Until Next Sound are
still missing; the parity docs say so.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 22:07:06 +03:00
Nikita RakitinandCursor 607ffc5591 Text: set text transparency from Text Fill (#32)
There was no way to make text see-through: the only Transparency
slider was the shape fill's. The new format.textTransparency command
keeps the text's colour and sets its alpha (replacing any it had, and
dropping it at 0). A run without its own colour takes the colour it
shows now, so inherited placeholder or theme colours stay as they are.
Gradient text gets the alpha on every stop. The Format Shape pane's
Text Options page gains a Text Fill section (colour and Transparency),
and the Shape Format › Text Fill dropdown has the same slider.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:55:21 +03:00
Nikita RakitinandCursor d2066a1f07 Pptx: budget chart points, chart XML size, inflate work and VML lookups (#401)
- Charts: every category/value/size cache draws from one chart-wide
  budget of 1M decoded slots, so sparse ptCount/idx declarations across
  many series can't expand far beyond the XML.
- Chart parts go through the same 96 MiB XML size guard as other XML.
- Package::open charges every inflated byte, including parts it then
  discards, against a 4 GiB decompression budget and stops reading
  entries once it is spent.
- Legacy OLE previews index each VML drawing once (shape id -> picture
  part) instead of reparsing it and its rels for every object.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 20:53:49 +03:00
MarekSpodBiedry 09b72e4b70 Pptx: keep the math namespace equations inherit from the slide root or a wrapper (#412) 2026-10-13 17:41:28 +02:00
NikitaandCursor 82dcd86c88 Pptx: read and write embedded fonts
A deck that embeds a TrueType or OpenType face, including one wrapped as Embedded OpenType, now draws with that face and saves it back. MicroType Express subsets stay in the file and still draw in a stand-in.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 18:22:48 +03:00
Sazid Al Bayazid 69d4893689 Comments: threads and resolved state survive a .pptx round trip (#70)
The writer emitted the legacy comment part only: replies were flattened
into sibling comments, the resolved flag was dropped. Modern PowerPoint
decks carry a second, threaded part (p188) as well - and DeckCraft read
both, importing every comment twice.

Export now writes the modern threaded part (p188:cmLst, with the slide's
commentRel anchor ext and the modern authors part) next to the flattened
legacy part, the same pair of parts PowerPoint itself writes: older
readers keep the legacy view, PowerPoint 2021+ and DeckCraft read
threads, replies and resolved state. The reader prefers the modern part
when both are present and scales modern positions as EMU instead of
legacy 1/8 pt, so real PowerPoint decks stop double-importing their
comments and keep their marker positions.

Comment ids are deterministic GUIDs from the existing tables::guid, so
exports stay reproducible without a new dependency.

Known limitation for a follow-up: comments anchor with
p188:unknownAnchor (schema-valid) rather than a slide moniker, which
needs part identity the model does not have yet.

Tests: threads plus resolved state round-trip on top-level comments and
replies, both parts and the anchor-rel wiring asserted in the raw
package, part numbering with comment-free slides skipped, legacy-only
and modern-only packages import each with their own position units, and
XML-special characters survive the trip.
2026-10-13 19:25:04 +06:00
Brandon ThomasandClaude Opus 5.5 7cb62d5197 Pptx/Render: picture fills with rotWithShape=0 stay upright
A shape's picture fill marked not to rotate with the shape turned and
flipped with it (rotWithShape was neither kept nor written: always 1).
PowerPoint keeps such a picture upright, stretched (or tiled) over the
box the rotated shape covers on the slide and clipped to the shape. Now
read, written (PictureFill::upright) and drawn so.

Wild synthetic set: picture fills on rotated/flipped shapes 12.89 ->
3.87.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 675d20417e Pictures: black and white, inverted alpha, and PowerPoint's grey weights
- a:biLevel (Color > Black and White) was ignored. It is now read, written
  and drawn: white where the luminance reaches the threshold, else black
  (observed thresholds at 30/50/70% on colour swatches).
- a:alphaInv was ignored; an opaque picture with it is invisible in
  PowerPoint. Now read, written and drawn.
- Grayscale, duotone and saturation weighed channels 0.299/0.587/0.114;
  PowerPoint's export greys pure red to 54 and green to 182: Rec. 709
  weights (0.2126/0.7152/0.0722).

Wild synthetic set: recolour slide 7.60 -> 1.15, picture corrections
13.36 -> 7.36.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 754841aaa4 Pptx: a table naming no style reads as the table grid style
A table whose tblPr names no tableStyleId drew without any lines.
PowerPoint draws such a table with thin dark grid lines (as its "No Style,
Table Grid"); observed on a synthetic deck with and without the explicit
"No Style, No Grid" GUID. Such tables now read as the grid style.

Wild synthetic set: tables with cell margins/fills/styles 4.80 -> 2.82,
11.28 -> 10.15, 6.86 -> 3.16.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 0c5ddb5dea Gradients: read, write and draw a:tileRect
Gradient tile rectangles were dropped on import. PowerPoint's "from
corner" radial presets depend on them: fillToRect puts the focus on a
corner and tileRect stretches the gradient's box a whole size past it, so
the circle is centred on that corner and reaches the far one. Without it
(after the two-point radial change) such fills washed out. A linear
gradient now spans its tile rectangle; a radial one ends on the circle
around it, with the focus still placed in the shape's own box (fitted to
PowerPoint's export of the corpus deck tdf114848: mean diff over the
filled box 0.77). Round-trips through pptx.

Wild synthetic set: tile-rect gradients 16.74 -> 2.48.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 08:16:41 -04:00
Brandon ThomasandClaude Opus 5.5 f5fef50364 Text: rtlCol puts the first column on the right; just/dist anchoring at the bottom; wordArtVertRtl
Observed on PowerPoint's export (w14-xml s12):
- a two-column body with rtlCol="1" starts its first column on the right; DeckCraft read and
  saved the attribute but laid columns out left to right;
- anchor="just" and anchor="dist" place the text at the bottom of the box, like anchor="b";
  DeckCraft drew them at the top;
- wordArtVertRtl stacks characters like wordArtVert but runs its lines from right to left; it was
  read as wordArtVert (and saved back as it). It is now its own TextDir, kept on save.

w14-xml s12 9.47 -> 5.39.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 06:48:43 -04:00
Brandon ThomasandClaude Opus 5.5 b8a665f0ca Text: mongolianVert and wordArtVert (stacked) text as PowerPoint draws them
mongolianVert was read as vert (and saved back as vert). PowerPoint turns it like vert but runs
its lines from left to right, the anchor mirrored with them (bottom-anchored text sits on the
right). It is now its own TextDir, kept on save; its lines' places are mirrored across the box.

wordArtVert (Stacked) was turned like vert. PowerPoint stands every character upright, one
under the other (Latin letters about one em apart, spaces their own width), with lines running
left to right. Stacked text now stands each character upright in an em of its own and mirrors
the line order.

Also: a bullet in the second or later column of a multi-column body is drawn on its line's
baseline (it kept the first column's).

w01-vertical s4 (mongolianVert) 11.54 -> 9.38, s5 (wordArtVert) 13.84 -> 13.56; w14-xml s13
6.78 -> 6.60.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 06:48:43 -04:00