v6.13.0
-
A
.mdopened by path decodes as markdown rather than as plain text, and
list_file_typesoffers it. The extension only adds a candidate the bytes
already allow;File::from_memoryhas no name, so it still needs
FileType::markdown. Closes #760. -
Breaking: a document decrypted from a password-protected package is no
longer savable — everysaveoverload throwsUnsupportedOperation, where it
used to write the content out unprotected. Towards #64. -
A
.docxwp:anchordrawing floats at its offset with its wrap and side,
instead of sitting in the line. Closes #803. -
A
.docxtable's own borders (w:tblPr/w:tblBorders) are drawn, and no
longer four times too thick. NewTableStyle::border,
::border_inside_horizontaland::border_inside_vertical, mirrored in the
JNI, Apple and Python bindings. -
A table cell in a text document starts its content at the top, as word and
odf do. -
A fitted or zoomed view scales its text with the page in WebKit, where the
type used to stay at its unscaled size.HtmlViewportMode::fit_width_by_view
is usable on iOS. Closes #761. -
A PDF
gsapplies the/ExtGStatestroke parameters/LW,/LC,/LJ,
/MLand/D. A producer that sets the line width only there — Canva does —
used to have every stroke drawn at the initial width of 1. -
A manual page break starts a new page box, and prints as
break-before:page.
NewBreakTypeandParagraphStyle::break_before/break_after, mirrored in
the JNI, Apple and Python bindings. Towards #174. -
ODF's
text:soft-page-breakis no longer part of the element tree, so a
DocumentPathpast one shifts. -
New
DocumentFile::thumbnail(), the preview the package carries or
nullopt, mirrored in the JNI, Apple and Python bindings. Closes #21. -
Breaking (Swift only):
HtmlConfig's optional settings are Swift
optionals of the real type rather thanNSNumber/NSValueboxes —
spreadsheetLimitis aTableDimensions?,initialZoomaDouble?, and so
on. ObjC callers see the boxed properties unchanged. Closes #759. -
The HTML renderer warns, rather than silently dropping, when it reaches an
element type it has notranslate_*for. Across the test corpus that is
page_breakand nothing else. Towards #150. -
An ODF
draw:objectchart is drawn from the chart part's own markup, not
from the replacement image beside it: bar, line, area, scatter, pie and ring,
with their titles, legends, axes and series colours. An object holding no
chart we can read keeps the replacement. Closes #179. -
An ODF custom shape is drawn as the shape its
draw:enhanced-geometry
describes rather than as its bounding box:draw:enhanced-path,
draw:equation,draw:modifiersand the two mirror attributes. Closes #159. -
ODF draws the shape elements it used to drop whole:
draw:path,
draw:polygon,draw:polyline,draw:regular-polygon,draw:connector,
draw:ellipse,draw:measureanddraw:caption. Newpath()on
CustomShape, mirrored in the JNI, Apple and Python bindings. -
An ODF
draw:circleis drawn as an ellipse rather than a circle inscribed in
its box. -
An ODF drawing shape is drawn where its
draw:transformputs it. New
transform()onFrame,Rect,Line,CircleandCustomShape,
mirrored in the JNI, Apple and Python bindings. -
A StarView metafile's text is decoded by the charset it names. Every
encoding butUCS2used to emit the file's own bytes, and the invalid utf-8
a non-ascii label made of that cost the whole image. -
A curve in a StarView metafile is drawn as a curve. The polygon flags that
say which of its points are bezier control points were read and dropped, so
every curve came out as a line through them. -
A StarView metafile's map mode is read in full: its unit, so a drawing that
switches to twips or points is no longer off by the factor between them, and
the relative map mode, which composes with the one before it rather than
replacing it. -
A StarView metafile draws its gradients, hatches and transparent shapes:
GRADIENT,GRADIENTEX,HATCHandTRANSPARENT. -
A spreadsheet decodes in less memory: 626 MB peak instead of 914 MB on a
297 MBcontent.xml. Rendered output is unchanged. -
A StarView metafile draws its remaining primitives:
LINE,ELLIPSE,
ROUNDRECT,ARC,PIE,CHORD,POINTandPIXEL. The lines are what
rules a table drawn as a metafile, which used to come out as floating
numbers. -
A StarView metafile clips what it says it clips:
CLIPREGIONand the two
that intersect one into it. A drawing that ran outside the clip used to be
shown in full. -
A StarView metafile draws its bitmaps (#194):
BMP,BMPEXand their
scaling and part variants, transparency mask included. Such a chart used to
render as an empty frame. -
A text action in a StarView metafile draws the run it names, not the whole
string. Text drawn in runs used to overprint itself into a smear. -
StarView metafile text keeps its font: italic, bold, underline, strikeout,
rotation, alignment, per-character positions, and the width a stretched run
fills (#95). -
A StarView metafile draws through a graphics state stack: a colour, font or
map mode set inside aPUSHno longer leaks past itsPOP. -
A filled StarView shape keeps its outline, a poly-polygon cuts its holes, a
line takes itsLineInfo, and the font size scales with the drawing. -
Text in a StarView metafile is escaped into the svg it renders as. An
&or
<in a label used to cost the whole image. -
A StarView metafile translation logs what it drops: unimplemented actions,
and a failure it used to fall back from silently. -
An html attribute value drops the control characters xml forbids. One
escaper writes both html and svg now.
Features
- Write the svg through a writer that escapes, and log what we drop (#779)
- Draw the text run a metafile names, with the font it names (#785)
- Draw the bitmaps a metafile carries, as png where that is smaller (#786)
- Clip the drawing to what the metafile clips it to (#787)
- Draw the primitives, an arc as an arc (#788)
- Fill with the gradients, hatches and transparency a metafile asks for (#789)
- Draw a curve as a curve, not as a line through its control points (#791)
- Draw a shape where its
draw:transformputs it (#796) - Draw the shape elements the parser used to drop (#797)
- Read the enhanced geometry languages, formulas and path alike (#798)
- Draw a custom shape as the shape, not as its box (#799)
- Draw the chart an embedded object holds, not its replacement image (#800)
- Warn on the element types the renderer drops, instead of dropping them silently (#805)
- Give
HtmlConfig's optional settings their real Swift types (#807) - Hand out the thumbnail the package already carries (#808)
- Honour the manual page break, and stop calling the automatic one a break (#809)
- Let the file name offer a type no content probe can find (#814)
Fixes
- Draw through a graphics state stack, and stop the fill killing the stroke (#784)
- Read the map mode's unit, and compose the relative one (#790)
- Decode the text, and close out the plan (#793)
- Apply the
/ExtGStatestroke parameters, not just the alphas (#810) - Scale the text with the fit, where webkit holds it back (#811)
- Float an anchored drawing, and draw a table's own borders (#812)
- Refuse to save a package we only hold decrypted (#813)
Performance
- Narrow the stored ids, sort the payload tables, size the sheet arrays (#780)
Refactoring
- Give the xml and png helpers their own internal packages (#792)
- Give
internal::Documentthe read-only defaults nine engines pasted (#804)
Documentation
- Hand the diff to edit as generateDiff returns it (#783)
- Plan the drawing work #771 asks for, in the order the corpus argues for (#795)
- Retire the drawings plan, its stages having landed (#802)
Tests
- Pin the public reference output #811 emits
Build
- Ignore the conan output and the
test/datasymlink at the repo root
CI
- Fetch sources through ConanCenter's backup, not the upstream host (#801)
- Run every embedded font through OTS (#806)
Publishing v6.13.0
- ✅ conan — success · conan package (
conan.yml) - ✅ maven — success ·
app.opendocument:odr-core-java— Maven Central + GitHub Packages - ✅ android — success ·
app.opendocument:odr-core-android— Maven Central + GitHub Packages - ✅ python — success ·
pyodrwheels — PyPI - ✅ apple — success ·
OdrCoreObjC.xcframework— the release asset and its manifest - ✅ wasm — success ·
@opendocument/odr-core— npm