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.
The doc comments of read_samples, with_room and extra_samples_tiff_rgba
name the SampleFormat check, and those of tiff_source and tiff_inks name
the 64-sample limit, the SampleFormat check and the decoder row check.
read_samples gives the decoder's limit as 256 MiB.
the_planar_copy_is_allocated_at_its_length copies 33 samples and checks
that the copy has room for at least 33 and fewer than 64, the room a
copy grown as it was filled ends with, rather than an exact capacity.
Each run is rewritten in pieces between the ruby spans' ends, so no
replacement joins characters across one, and each span is moved to where
its characters land in the new text. Expert Fractions treats a digit of
any script next to a fraction as part of a larger number.