- A page-number start near u32::MAX (.docx accepts up to 4294967295) or a line-number start
near u32::MAX (open through .json and commands) overflowed when the next page or line was
counted: a panic whenever overflow checks are on, silently wrapped numbers otherwise. The
three additions now saturate.
- The wave stroke used by wave borders and underlines looped forever, pushing curves until
memory ran out, once its x coordinate passed about 1e16 and `x + step == x` (a wave page
border with a 1e20 `space`, reachable through .json, the control channel and MCP). The
path is built in `wave_path`, which stops as soon as a step makes no progress.
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Windows metafiles (WMF, EMF), common for logos, crests and diagrams in
older documents, couldn't be decoded and showed as grey boxes, on screen
and in PDF.
The new crate wordcraft-metafile (layer 1) reads them from the public
[MS-WMF] and [MS-EMF] specifications into paths and bitmaps, and places
them in a picture's box; render and pdf paint the result as vectors.
It covers the drawing records Office pictures use (lines, polygons,
curves, rectangles, ellipses, arcs, path brackets), pens and brushes,
the mapping modes and world transforms, and bitmaps in DIB form with the
usual raster operations. Input is treated as hostile: every read is
bounded, and a byte budget caps what one picture may allocate.
Not yet: text records (ExtTextOut) and EMF+ records are skipped, so a
metafile whose content is mostly text shows only its lines and fills.
docxide-pdf bench (365 documents, vs main + #135): the twelve documents
with WMF/EMF pictures show them; the pictures are a small part of their
pages, so the scores move little (Jaccard passes 208 -> 209, five
documents up to 3 SSIM points better, none worse).
Co-authored-by: Oliver Zieschang <4963183+naxvog@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>