From b2b378a3f0b6d7bc6d4686ac6c8546846fabd0fa Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Wed, 14 Oct 2026 14:13:50 -0400 Subject: [PATCH] Fix up merged PRs: dedupe doc rows left by the union merges One EMF / WMF parity row naming both GDI clip regions and EMF+ playback; drop the stale Tables, Charts, chartex and SmartArt rows that came back with the chartex PRs; one SVG-gap sentence; one charts-gap paragraph. Co-Authored-By: Claude Opus 5.5 --- docs/file-format-parity.md | 9 ++------- docs/gaps.md | 22 +++++++--------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/docs/file-format-parity.md b/docs/file-format-parity.md index 6a3cde7a..b99afa0e 100644 --- a/docs/file-format-parity.md +++ b/docs/file-format-parity.md @@ -50,8 +50,7 @@ PowerPoint opens and saves; Viewer = opens only). |---|---|---|---| | 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). Rectangle clip regions (`INTERSECTCLIPRECT`, `EXCLUDECLIPRECT`, `EXTSELECTCLIPRGN`) limit later drawing; EMF+ records are not drawn. Legacy OLE objects (VML preview) and ActiveX controls show their pictures | -| 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; EMF+ only pictures play every EMF+ drawing record (brushes incl. gradients and textures, pens, paths, curves, images, strings, transforms, clipping; see `crates/metafile/src/emfplus.rs` for the few exceptions). Legacy OLE objects (VML preview) and ActiveX controls show their pictures | +| 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). Rectangle clip regions (`INTERSECTCLIPRECT`, `EXCLUDECLIPRECT`, `EXTSELECTCLIPRGN`) limit later drawing. EMF+ only pictures play every EMF+ drawing record (brushes incl. gradients and textures, pens, paths, curves, images, strings, transforms, clipping; see `crates/metafile/src/emfplus.rs` for the few exceptions). 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 | | @@ -91,13 +90,9 @@ the round trip even though DeckCraft doesn't model it. | Pictures with crop, recolour, duotone, alpha, luminance | yes | yes | | | Tables with styles | yes | yes | Merges and both diagonal borders round-trip | | Charts (`c:chartSpace`) | yes | yes | Original XML kept in `Chart.raw`. Trendlines (type, order or period, forecast, intercept, equation and R²) are read, written and drawn. A combo chart's secondary value axis is read and is not written back when the chart is rebuilt | -| Charts (`cx:` chartex: waterfall, funnel, treemap, sunburst, histogram, box) | no | no | | +| Charts (`cx:` chartex: waterfall, funnel, treemap, sunburst, histogram, Pareto, box) | yes | yes | Unchanged parts kept; edited and new ones written from the model with a plain-chart fallback. Treemap and sunburst hierarchy levels kept; region maps kept, drawn as tiles (no map geometry) | | SmartArt (`dgm`) | drawing part only, as a group; text laid out on its `dsp:txXfrm` rectangle | as shapes | Diagram data model lost on save | | SmartArt (`dgm`) | drawing part only, as a group | as shapes | Diagram data model lost on save. A diagram with no relationship parts keeps its XML; the drawing and data parts are still dropped (#203) | -| Tables with styles | yes | yes | | -| Charts (`c:chartSpace`) | yes | yes | Original XML kept in `Chart.raw` | -| Charts (`cx:` chartex: waterfall, funnel, treemap, sunburst, histogram, Pareto, box) | yes | yes | Unchanged parts kept; edited and new ones written from the model with a plain-chart fallback. Treemap and sunburst hierarchy levels kept; region maps kept, drawn as tiles (no map geometry) | -| 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 | diff --git a/docs/gaps.md b/docs/gaps.md index ebba81af..824f7cbe 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -138,10 +138,8 @@ Detail in [file-format-parity.md](file-format-parity.md). ### SVG pictures don't render - **Evidence:** `crates/render/src/images.rs` decodes through `image` 0.25 (PNG, JPEG, WebP, GIF, TIFF, BMP), and EMF/WMF through `deckcraft-metafile` (ported from WordCraft: paths, fills, pens, - pattern and hatch brushes, bitmaps and text; rectangle clip regions are applied, EMF+ records are - not drawn). - pattern and hatch brushes, bitmaps and text; EMF+ only pictures play their EMF+ records; - clip regions are not drawn). + pattern and hatch brushes, bitmaps and text; rectangle clip regions are applied, EMF+ only + pictures play their EMF+ records). Nothing reads SVG; PowerPoint's Insert Icons stores SVG with a PNG fallback. - **Impact:** SVG icons show only their raster fallback, and SVG files can't be inserted. - **Estimate:** 4–8 h (an SVG renderer through `resvg`-style crates). @@ -207,10 +205,6 @@ Detail in [file-format-parity.md](file-format-parity.md). ### Charts: data grid, elements and the newer chart types - **Evidence:** checklist rows "Edit chart data" (P0, partial), "Chart elements" (partial), "Other - chart types" (partial); `chartex` parts (waterfall, funnel, treemap, sunburst, histogram, box & - whisker) aren't read. Trendlines round-trip (`corpus_charts.rs`) and are not drawn. A combo - chart's secondary value axis is read (`y2_*`, `Series.secondary_axis`) and is not written back - when the chart is rebuilt. chart types" (partial); `chartex` parts (waterfall, funnel, treemap, sunburst, histogram, Pareto, box & whisker) are read, drawn, inserted, edited and saved as `chartEx` (kept unchanged, else written from the model, with a plain chart fallback). Waterfalls float and total, funnels, @@ -220,13 +214,11 @@ Detail in [file-format-parity.md](file-format-parity.md). (their cached geography too, also through edits) and drawn as value-coloured tiles with a colour scale, since DeckCraft ships no map boundaries. Radar charts are drawn polar (filled or lines), stock charts as high-low lines with close dashes or up/down bars and saved as - `c:stockChart`, and combo charts start as columns with a line. Secondary-axis writing and - trendlines are tracked separately. - whisker) aren't read. Trendlines round-trip (`corpus_charts.rs`) and are drawn: linear, - exponential, logarithmic, polynomial, power and moving average, with forecast and the equation - and R² label. A moving average is drawn with neither label. A combo chart's secondary value axis - is read (`y2_*`, `Series.secondary_axis`) and - is not written back when the chart is rebuilt. + `c:stockChart`, and combo charts start as columns with a line. Trendlines round-trip + (`corpus_charts.rs`) and are drawn: linear, exponential, logarithmic, polynomial, power and + moving average, with forecast and the equation and R² label. A moving average is drawn with + neither label. A combo chart's secondary value axis is read (`y2_*`, + `Series.secondary_axis`) and is not written back when the chart is rebuilt. - **Impact:** most business decks have charts; editing their data is routine. - **Estimate:** 12–20 h. Data and elements are **beta blockers** (6–10 h).