Files
deckcraft/docs/file-format-parity.md
T
Brandon ThomasandClaude Opus 5.5 e28851d2f1 Pictures: WMF/EMF text, pattern and hatch brushes draw; ActiveX previews show (#336)
* ActiveX controls show their pictures

A slide's p:controls are read: each control with a p:pic (the image PowerPoint shows for it,
often a WMF) becomes a picture above the slide's shapes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Metafiles draw their text, pattern and hatch brushes

deckcraft-metafile (still kurbo + thiserror only, so it builds for wasm):
- Text: WMF EXTTEXTOUT/TEXTOUT and EMF EXTTEXTOUTW/EXTTEXTOUTA/SMALLTEXTOUT with the
  selected font (CREATEFONTINDIRECT, EXTCREATEFONTINDIRECTW: face, signed LOGFONT height,
  width, weight, italic, underline, strike-out, escapement, charset), text and background
  colour, background mode, TA_* alignment and TA_UPDATECP, the dx array (ETO_PDY pairs too),
  ETO_OPAQUE fills and ETO_CLIPPED clips. 8-bit strings decode through their charset
  (Windows-1252/1250/1251; symbol fonts keep their codes at U+F000; double-byte sets keep
  their advances). The neutral Item::Text carries a text-space-to-picture transform, so the
  mapping and escapement are folded in and glyphs are never mirrored.
- Brushes: WMF DIBCREATEPATTERNBRUSH, EMF CREATEDIBPATTERNBRUSHPT and CREATEMONOBRUSH, and
  BS_HATCHED, as Item::Pattern tiles in 96-dpi pixels; WMF PATBLT. The XOR / AND-pattern /
  XOR see-through shadow of old PowerPoint WMFs draws its pattern in the XOR colour.
- MFCOMMENT escapes with an embedded EMF are ignored: PowerPoint draws the WMF's records.
- Pattern pixels and text count against the byte budget; strings are capped.

deckcraft-render draws text through deckcraft-fonts with the face slide text would use
(document_face), symbol fonts mapped as bullets map them (deckcraft_text::symbol_char, now
public, with Webdings), per-character fallback, the file's advances, GDI cell metrics for
top/bottom alignment, underline/strike-out and synthetic bold/italic. Tiles below 1.5 output
pixels per cell are drawn as their average colour.

On the 24 corpus slides that show a metafile, mean abs diff against PowerPoint goes from
28.31 to 5.06 (with the OLE/ActiveX preview commits).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 22:40:56 -04:00

7.7 KiB
Raw Blame History

File-format parity with PowerPoint

Last reviewed: 2026-10-10 · Last updated: 2026-10-10 · Change: major (created; formats taken from PowerPoint 16.113.4's Info.plist, PPTX coverage measured from crates/pptx) · Target: Microsoft PowerPoint for Mac 16.113 (Microsoft 365)

Every format PowerPoint reads or writes, DeckCraft's support, fidelity and how it is tested. Gaps are itemized in gaps.md. Dimension score: ~58% ready (estimated), 60–110 h to parity.

Weights inside this dimension: PPTX 70%, PDF export 10%, image export 5%, legacy binary formats 5%, everything else (templates, shows, macros, ODP, video, GIF, outline) 10%.

Documents

From /Applications/Microsoft PowerPoint.app/Contents/Info.plist CFBundleDocumentTypes (Editor = PowerPoint opens and saves; Viewer = opens only).

Format PowerPoint DeckCraft read DeckCraft write Fidelity / notes Tested by
.pptx presentation Editor yes yes Broad (see below); never measured on real decks crates/pptx/tests/roundtrip.rs, sample.rs, malformed.rs, sniff.rs (30 tests); opened in PowerPoint by hand 2026-10-06
.potx template Editor yes (as a presentation) no: written with the .pptx content type file.saveTemplate is Save As under another name none
.ppsx slide show Editor yes (as a presentation) no: written as .pptx content Doesn't start in show mode none
.pptm / .potm / .ppsm macro-enabled Editor no no Should open and keep vbaProject.bin without running it none
.ppt / .pot / .pps 97–2003 binary Editor no no Owner decision; import only would be enough none
.odp OpenDocument Editor no no none
.thmx Office theme Viewer no no Browse for themes is a P2 row none
.deckcraft native (zip + JSON) n/a yes (also .slidecraft) yes Lossless for the DeckCraft model, forward compatible crates/format tests
PDF export no yes Slides, notes pages, handouts (1–9); real-text layer with embedded subsets, links, bookmarks. Slide artwork is a raster image at print resolution, not vector crates/pdf tests
Outline .rtf / .txt export (RTF), import (outline) .txt/.md outline (slide.fromOutline) .txt outline No RTF engine tests
PNG / JPEG slide images export n/a yes (file.export, deckcraft-cli render) Matches the editor's renderer render tests
TIFF / BMP / GIF slide images export n/a no Easy (the image crate writes them) none
Animated GIF of the deck export n/a no none
MP4 / MOV video of the deck export n/a no Needs timeline render + H.264 encode none
Print yes n/a no PR #66 (browser) open none

Pictures and media inside decks

Kind PowerPoint DeckCraft Notes
PNG, JPEG, GIF (animated), BMP, TIFF, WebP yes yes image 0.25; animated GIFs play since #39
SVG yes (with PNG fallback) no The PNG fallback shows; SVG files can't be inserted
EMF / WMF yes partial Drawn as vectors (paths, pens, pattern and hatch brushes, bitmaps, text in the document's fonts with the file's character advances); clip regions and EMF+ records are not drawn. Legacy OLE objects (VML preview) and ActiveX controls show their pictures
HEIC yes (macOS) no
Audio: MP3, AAC/M4A, ALAC, WAV, AIFF, CAF, FLAC, Ogg Vorbis, Opus yes (Ogg/Opus partly) yes Pure-Rust decoders in crates/media, crates/opus
WMA yes (Windows) embedded, not playable
Video: H.264, HEVC in MP4/MOV yes yes Pure-Rust, software decode
Video: VP9, AV1 in WebM/MKV partly (OS codecs) yes Ahead of PowerPoint for Mac
WMV yes (Windows) embedded, not playable
Online video (YouTube embeds) yes no Cloud feature
Embedded OLE objects yes kept on round trip (opaque), not insertable or editable ShapeKind::Opaque
3-D models (.glb) yes no
Embedded fonts yes no p:embeddedFontLst ignored

PPTX coverage (PresentationML / DrawingML)

What crates/pptx reads and writes, from ECMA-376. "Kept" means the XML is preserved untouched for the round trip even though DeckCraft doesn't model it.

Part / feature Read Write Notes
OPC package, content types, relationships yes yes Content types found anywhere in the zip (#19); zip bombs capped; relationship cycles bounded
Presentation, slide size, sections (p14), custom shows yes yes
Slide masters, layouts, placeholders and inheritance yes yes
Themes: colour, font (Latin/EA/CS), effect schemes, background styles yes yes Unknown theme parts kept
Notes slides and notes master yes yes No notes-master editing view
Handout master no no
Shapes: preset geometry (~180 presets), custom geometry, groups, connectors yes yes Presets re-derived in crates/geom/src/preset.rs (and preset/extra.rs)
Fills: solid, gradient, picture (stretch/tile/crop), pattern, group yes yes
Lines: dash, compound, caps, joins, arrowheads yes yes
Effects: shadow, glow, soft edges, reflection yes yes
3-D: scene3d, sp3d kept kept Not rendered
Text: runs, paragraphs, bullets, numbering, levels, autofit, columns, vertical, RTL, script fonts, fields, hyperlinks yes yes Round-trip tests incl. justLow and date fields
Text warp (prstTxWarp) yes yes All 40 presets rendered (crates/geom/src/warp.rs); adjust values (avLst) round-trip
Pictures with crop, recolour, duotone, alpha, luminance yes yes
Tables with styles yes yes
Charts (c:chartSpace) yes yes Original XML kept in Chart.raw
Charts (cx: chartex: waterfall, funnel, treemap, sunburst, histogram, box) no no
SmartArt (dgm) drawing part only, as a group as shapes Diagram data model lost on save
Equations (OMML, a14:m) no no PR #55 open
Audio / video (p14:media, trim, fades, bookmarks) yes partly Playback options lost on save (#74)
Ink (contentPart) yes as a group of freeform lines PowerPoint sees shapes, not ink
Transitions incl. p14/p15 (Vortex, Morph…) all 48 all 48 every_transition_kind_round_trips
Animations: timing tree, build paragraphs, triggers, motion paths yes (flattened to the Animation Pane list) yes (rebuilt) every_animation_effect_survives; rewind lost (#77)
Comments: legacy yes yes
Comments: modern threaded (p188) yes no (written as legacy) Replies and resolved state lost (#70)
Unknown slide-level elements (graphicFrame OLE, extensions, mc:AlternateContent) kept kept Rendered as a labelled placeholder with the preview picture when present
Tags, custom XML, VBA no / no / no
Embedded fonts no no
Encryption (password to open) no no

What would move the PPTX number

  1. An owned corpus of real-world-shaped decks (corporate templates, SmartArt, chartex charts, EMF, embedded fonts, every transition and animation) in a corpus repo, with import → render → export → re-import checks in CI and a PowerPoint reference render for each (owner runs PowerPoint).
  2. The round-trip losses above (#70, #74, #77).
  3. SVG rendering, and clip regions inside EMF/WMF.

Revision history

Date Change Summary
2026-10-12 minor EMF/WMF text and pattern brushes drawn; OLE (VML) and ActiveX previews read
2026-10-12 minor Text warps rendered; their adjust values read and written
2026-10-10 major Created from PowerPoint 16.113.4's CFBundleDocumentTypes, crates/pptx reader/writer and tests, and the open round-trip issues