A WMF without a placeable box picks its scale from the map mode its
drawing records are played in. Lines and shapes drawn under R2_NOP or
R2_XORPEN, and PATBLT records the reader does not fill, no longer count,
with the mix mode saved and restored with SAVEDC and RESTOREDC.
An open stroke that reaches far outside the picture is left out before
it joins the strokes waiting to be joined, so the strokes drawn before
it are still added.
A fill in a glyph's clip marked the clip as filled before the fill was
added. When the fill painted nothing (a palette index past the palette,
or a radial gradient that draws no circle), the next glyph painted in
the same clip became the clip's only child, and closing the clip kept
that glyph on its own, so it drew outside the clip.
The clip is now marked filled only when the fill adds the clip's first
child, and a fill that adds nothing leaves the mark as it was.
Tsume narrows a cluster before Optical kerning measures its pairs, so
Optical measured the narrowed gap and gave part of the space back.
Optical now measures each pair as it would be without the Tsume, as it
already does for Insert Aki, and the Tsume stays on top. Tsume records
what it took on the glyph for this.
A clip group with a fill or stroke of its own and no geometry effect is
baked through bake_pieces, which baked the clipping path like any other
member instead of applying the geometry effects in it as the canvas clips
by it. A compound clipping path whose member has a Transform effect with
copies then baked into nested compound paths, and SVG, PDF and the other
exports dropped the moved member and its copies from the clip.
bake_pieces now applies with_clip_effects_applied to the clipping path
first, as the plain clip group route already does. Clipping type keeps
its own handling.
A plot of the art's bounds now leaves placed images, objects at 0%
opacity and unpainted paths out of the art of a dynamic symbol, as it
does for other symbols. An object that an instance's fill, stroke or
opacity makes the plot draw is measured for that instance only, and an
instance whose symbol holds nothing else is left out, so a document
with only such instances is refused.
With Show East Asian Options on, the Glyphs panel menu lists Traditional
Forms, Expert Forms, JIS 04, JIS 90, JIS 78 and JIS 83 Forms, Monospaced
Full-Width, Half-Width, Third-Width and Quarter-Width Forms, and Revert
To Default Forms. Each form draws the selected characters with the
font's OpenType feature for it (trad, expt, jp04, jp90, jp78, jp83,
fwid, hwid, twid or qwid). A form is checked when every selected
character has it and disabled when none of the faces that draw the
selected text, fallback faces included, has the feature.
The form is a new character attribute, glyphForm, one form at a time
(text.setFormat, text.setRangeStyle). It is saved only when set,
character styles carry it, and runs that differ only in their form
shape as one piece of text. SVG writes it in font-feature-settings;
PDF draws the glyphs from the layout.
A PDF/A-2b export at PDF 1.4 with Create PDF Layers and a page longer
than 14,400 pt is written as PDF 1.6, which has PDF layers. The export
decided which layers place their instances' symbol art before it raised
the version, so a hidden layer, written as a PDF layer that is off, kept
its instances' art without the art's live effects.
The version a long page needs is now settled before the document is
baked. The pages come from the artboards, which baking leaves as they
are.
Export Preferences… and Import Preferences… had a row to themselves,
and Reset Preferences started the next row, left of Previous, Next,
Cancel and OK. Reset Preferences now follows Import Preferences… on the
first row, which wraps when it is wider than the dialog, and the row
below holds only the category buttons, Cancel and OK.
Tests check that the three buttons share a row in English, and that in
every language the dialog keeps its 760 pt content width with each
button inside it and above the OK row. Hindi, Gujarati, Georgian,
Japanese, Korean and Chinese are measured with fallback fonts, since
the tests do not load the craft-fonts faces or installed fonts those
languages are drawn with.
Load Variable Library defines each variable with the kind of its trait
(textcontent, visibility, fileref, graphdata; any other or none is the
unknown kind) and reads visibility values from true or false, image
values from a file's absolute path or file: URL, and graph values from
a data element of series names and rows. A document variable declared
with the same name and kind keeps its bindings. Save Variable Library
writes every kind in the same forms and is enabled with any variable.
Image values that aren't absolute paths and graph data past what a
graph holds are refused, so every saved file loads back.
An option given to document.exportSelection skips the options dialog, but
without `path` the save panel still picks the file. docs/mcp.md said any
option writes without a dialog, and docs/control-protocol.md said params
export without the dialog. Both now say that only `path` writes without a
dialog, and a test pins the behavior.
oversized_tiff now also refuses a TIFF whose JPEG-compressed strip or
tile (Compression 7) declares a frame wider or taller than the strip or
tile, one with more than MAX_TIFF_CHUNKS strips or tiles, and one whose
JPEG headers take more than 16,777,216 steps to read. It reads BigTIFF
directories, follows the layout and the repeated tags the decoder
reads, and refuses offsets of types it does not read.
When Merge added a path that cut a painted edge, the piece holding the
old edge's middle took the old edge's stroke rows unchanged, so its
dashes started again and it kept both arrowheads. It now takes them
fitted to its part of the old edge, as Gap Options does.
The check before a PNG or JPEG is embedded as it is read the profile's
color space only from a profile of at least 128 bytes, so a gray or RGB
profile cut short after its color space reached the PDF writer. The
color space is now read from bytes 16..20 of any profile that holds
them, and valid_icc rejects the short profile.
When the last of the bounded breaks such a line reads came right before
U+2028, the line ended at that break and the next line held only the
forced break, drawing an empty line. The line now reads on to the
forced break and ends there when it fits as drawn.
In PDF/X-1a, a tagged gray JPEG that the Compression settings keep as
JPEG was decoded and written with Flate. It is now written with its
JPEG data unchanged, in DeviceGray without its profile.
A PNG or JPEG embedded as it is now has its gray or RGB profile checked
with valid_icc, like the images the recoder writes: a malformed profile
is left out, the JPEG keeping its JPEG data and the PNG decoded.
After the merge of main, the tracked-ligatures note is the only reader of
the first run's features, and the branch replaces that check with one that
reads every frame of the story, so clippy reported the binding as unused.
tab_advance read the text after a tab up to the next tab for every
stop, though only right, center and decimal stops align it. The first
tab of a long paragraph read the paragraph to its end, even on a line
that stops reading a bounded number of breaks past its overflow. It
now reads that text only when it reaches a stop that aligns it.
A closed path that crosses itself is cut into closed loops. The loop
holding the path's first anchor counted as the whole path, so it kept
the path's width profile and brush. A closed edge now counts as the
whole path only when it is as long as the path.
A gray or RGB image is tagged with the ICC profile it carries only when
the profile passes the checks a CMYK image's profile already passes: at
most 16 MiB, the size its header declares, the acsp signature, an input,
display, output or color space profile class, and a tag table that lies
within it. Otherwise the image is written in DeviceGray or DeviceRGB, kept
as it is, resampled or compressed with JPEG.
When the third click of a triple-click landed on a face or edge that
the double-click before it had painted (a neighbor the flood or the edge
walk reached), the triple-click sent that part's new paint as match,
since only the clicked part's paint was recorded. The bucket now records
the fill or drawn stroke paint of every other part a double-click
reaches, and a triple-click on one of them matches the paint it had
before the double-click. docs/mcp.md says so.