The shadow of a picture is the picture recoloured to the shadow colour,
but drawing the picture left its pixel-space transform set, so the
recolouring rectangle (sized in points) covered only part of a picture
whose bitmap is bigger than it is shown: a 400 px photo at 240 pt cast a
shadow of its top-left corner only. The shape's transform is restored
before recolouring.
Wild synthetic set: framed pictures with shadows 7.67 -> 5.95, rotated
picture with a shadow 10.67 -> 10.07.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Explicit cell borders were stroked as plain solid lines (no dash, compound
or cap), and diagonal borders (lnTlToBr, lnBlToTr) were read but never
drawn. Both now go through the shape line stroker; diagonals are drawn
under the cell edges.
Wild synthetic set: border styles slide 5.67 -> 2.26, thick merged-cell
borders 1.20 -> 0.69.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A shape with a top bevel seen through a 3-D scene drew flat. Fitted to
PowerPoint's export of the bevel presets on a solid fill with the default
three-point light rig and matte material, DeckCraft now lights the face
and a band as wide as the bevel inside the outline as surfaces: Lambert
light from the upper left (azimuth 240, 45 degrees up), c * (0.453 +
0.731 * n.L) + 14.7 per channel, the band's normal tilting outwards by
the profile's slope (quarter circle by default, straight for angle).
Within about 15 grey levels RMS of PowerPoint on the circle bevel; other
profiles use the circle's, pictures get light and dark veils, and other
light rigs and materials (and anything without a scene) stay flat.
Wild synthetic set: bevel presets slide 5.20 -> 2.48, materials/rigs
13.25 -> 12.73.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Pattern tiles were sampled nearest-cell, exact when a pattern cell
(0.75 pt) is a whole number of output pixels (a 960-wide export of a
720 pt slide) but harsh otherwise: at 960 px for a 960 pt slide (0.75 px
per cell) PowerPoint shows greys where a pixel straddles two cells, and
DeckCraft showed only the two colours, in different places. The tile is
now sampled bilinearly. Fitted against PowerPoint's export of all 54
presets at 0.75 px per cell: mean error 0.067 (bilinear) against 0.082
(nearest) and 0.095 (area average); still not exact (narVert reads
255/128/0 in PowerPoint, 213/128/42 here). Unchanged at whole-pixel sizes.
Wild synthetic set: patterned backgrounds 21.15 -> 11.31 and
18.00 -> 9.75, pattern galleries 22.50 -> 19.44 and 13.96 -> 11.64.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
An outer shadow set on a group (grpSpPr effectLst) was ignored. PowerPoint
casts it from everything in the group: the children are now drawn once
more under the shadow's offset, scale and skew (anchored on the group's
box), recoloured to the shadow colour and blurred, below the group.
Wild synthetic set: combined-effects slide (shadowed group) 2.00 -> 0.98.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A line filled with a gradient drew in its first stop's colour only. As
PowerPoint draws it, the gradient is laid out over the box the stroke
covers (the outline's bounds grown by half the line width, before the
line is cut back under its arrowheads), so a horizontal line's 90 degree
gradient runs across its width; arrowheads take the gradient where they
sit.
Wild synthetic set: gradient lines slide 8.43 -> 0.40; picture with a
gradient border 8.54 -> 7.67.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A tiled picture fill (including a blipFill with neither stretch nor tile,
which PowerPoint tiles) assumed 96 dpi. PowerPoint sizes a picture by the
resolution its file records: a 32 px tile saved at 90 dpi is 25.6 pt, not
24. The PNG pHYs chunk and JPEG JFIF density are now read (rounded to
whole dpi) and scale the tile.
Corpus lo/tdf128596 (tiled checkmark texture): 8.79 -> 0.52 mean diff
(it had drifted from 7.36 when tiles started snapping to whole pixels).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- flip x/y/xy (every other tile mirrored) was ignored: tiles now repeat
reflected across the flip axes.
- algn was ignored: the first tile now sits on the corner, edge middle or
centre of the box it names, before the tx/ty offset.
- The tile size came from the decoded (possibly downsampled) bitmap; it is
now the picture's own pixel size (96 dpi) times sx/sy, rounded to whole
output pixels as PowerPoint draws it.
- A scale of zero or less drew tiles at 100%; PowerPoint draws nothing.
- Tiles are one repeating image paint instead of one draw per tile (no
200-tile cap, constant cost).
Wild synthetic set: tiled background flipped/aligned 82.92 -> 1.80, tile
variants 51.15 -> 8.82.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Follow-up to drawing picture borders outside the picture: PowerPoint does
that for flat pictures only. A picture seen through a 3-D scene with a
bevel (a common picture style) gets its border centred on the edge like
any shape: observed with an 18 pt border, which then covers 9 pt of the
picture. The corpus deck 60810 (white-framed bevelled screenshots) showed
the screenshots' own edges once the border moved out; it now matches
PowerPoint again.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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>
- Left/right brackets and braces drew only their curve: a filled bracket
showed no fill. PowerPoint fills them out to the straight side they open
to (the fill path is the curve closed), outlining only the curve.
- Arrowheads were drawn on any shape with nothing filled (brackets among
them) but not on open freeforms that had a fill. PowerPoint puts them on
lines, arcs and open freeforms whether filled or not, never on brackets.
Wild synthetic set: preset galleries 9.44 -> 4.65, 9.55 -> 4.94,
9.60 -> 5.38; extreme-adjust galleries 10.7 -> 6.6.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A shape inside a group whose fill is grpFill drew nothing (the fill was
read but the renderer skipped it). PowerPoint fills it with the group's
fill laid out over the whole group: a gradient or pattern runs on across
the children rather than restarting in each. Groups without a fill of
their own pass their parent's on.
Wild synthetic set: group fills slide 27.33 -> 7.88.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
DeckCraft centred a picture's outline on its edge, covering half the
border's width of the picture. PowerPoint draws picture borders wholly
outside: an 18 pt white photo frame leaves the whole photo showing and
reaches 18 pt out (measured on its export; a 2 pt border on a cropped
picture covers 18-20 pt for a picture starting at 20). Pictures now stroke
their border twice as wide, clipped to outside the outline, keeping dash
lengths; the border's shadow is cast from there too. Compound borders
stay centred.
Wild synthetic set: picture frames 13.12 -> 8.54, cropped/flipped pictures
with borders 5.79 -> 2.57, crop-to-shape 8.03 -> 5.25.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
An outer shadow was always the shape's filled silhouette at the shadow's
opacity: an outline-only shape cast a solid block, a 40% fill cast a full
shadow that darkened it from behind, and lines (and outlines) cast none.
PowerPoint casts the shadow from the drawn shape: the filled part as
see-through as its fill (nothing for no fill) plus the outline, which is
now stroked into the shadow layer with the line's width, dash and opacity.
Wild synthetic set: combined effects slide (no-fill frame, 40% fill,
shadows) 21.88 -> 2.34.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A shadow's sx/sy/kx/ky were applied about the shape's centre with the
skew unscaled, so a perspective shadow (algn=b, sy 23%, kx -20 deg) floated
in the middle of the shape instead of lying along its bottom edge. As
PowerPoint draws it, the shadow is skewed then scaled about the point of
the box its algn names (b: middle of the bottom edge, tl: top-left...).
Wild synthetic set: shadow alignment/scale/skew slide 5.57 -> 0.41,
picture frames 13.71 -> 12.71.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
An off-centre radial gradient ("from corner", or any fillToRect focus
other than the middle) spread from its focus out to the farthest corner,
so the near side stayed light. Fitted to PowerPoint's export: the first
stop is a point at the focus and the last is the circle through the box's
corners (centre of the box, half its diagonal), with the circles between
moving from one to the other (a two-point radial). A corner focus thus
reaches its last colour at its own corner too. Centred gradients are
unchanged.
Wild synthetic set: off-centre radial background 20.66 -> 1.22, radial
focus grid 6.34 -> 5.69.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A wide line poked its corners (and square caps) out past a triangle,
stealth or open arrowhead: the line now stops under the head (at a
triangle's base, inside a stealth notch, where an open arrow's legs meet).
- A see-through line darkened where it overlapped its heads; PowerPoint
draws line and heads as one shape, so they are drawn opaque into a
faded layer.
- Heads on lines thinner than 2 pt were too small: PowerPoint sizes them
as for a 2 pt line at least (measured 6 pt for a medium head on 0.25 to
2 pt lines).
- An open arrow's point sat a miter past the line's end, with flat-ended
legs; PowerPoint puts the point's outside on the end and rounds the legs.
Wild synthetic set: open arrows by width 6.85 -> 3.78, 8 pt open arrows
3.84 -> 1.89, triangles by width 3.62 -> 2.17, stealth by width 3.45 -> 2.38.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A round-capped dashed line (PowerPoint's "Round Dot" is sysDot with round
caps) drew as a solid line: each dash grew by its caps and closed the
one-width gaps. PowerPoint keeps the caps inside each dash, so dots stay
separate circles. Square-capped dashes end flat in PowerPoint; only the
line's own start (and its end, when it ends in a dash) is squared off.
Wild synthetic set: 12 pt round-cap dashes 12.69 -> 7.05, 12 pt square-cap
dashes 11.76 -> 6.12, custom dashes 2.12 -> 0.10.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A freeform whose path holds a sub-path inside another (an icon, outlined
text, a frame drawn as two rectangles) showed the inner one filled when
both wound the same way: DeckCraft filled custom paths non-zero.
PowerPoint fills every custom path alternately (even-odd), so the inner
sub-path is a hole whichever way it winds.
Wild synthetic set: holes slide 7.60 -> 2.84 mean diff.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>