|
Some checks failed
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
repo hygiene / hygiene (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-map / test (push) Has been cancelled
PDF engine / engine (push) Has been cancelled
PDF engine / makepad-integration (push) Has been cancelled
PDF engine / fuzz (push) Has been cancelled
sms / gates (push) Has been cancelled
Phase 8 bullets one and two. Probing the existing code first, as the
workflow requires, found five defects rather than the one the plan names:
SPLIT MATCH 'Hello': 0 hits
plain_text: "Hello"
PRECOMPOSED 'café': 0 hits
COLUMNS plain_text: "LeftTopRightTop\nLeftBotRightBot"
OUT OF ORDER plain_text: "second\nfirst"
`PageText::find` searched one run at a time and documented that as a known
limitation. It is a limitation from inside the code and a broken feature
from outside it: a writer starts a new run wherever it adjusts kerning, so
an ordinary word arrives as two runs, and the find bar says a word plainly
visible on the page is not there.
`search.rs` indexes the page as one flattened string with a map back to
(run, character), so a cross-run match is found and highlighted with one
rectangle per run — never a merged box, which across a line break covers
half the paragraph.
The separator between two runs is a geometric question with three answers:
abutting runs join with nothing (one word, split by kerning), separated
runs with a space, and a different line or column with a newline. The
newline matters as much as the empty join: joining lines with a space lets
"one Right" match across a column gutter, text that appears nowhere.
Whether two runs share a column is *asked* of the layout analysis rather
than re-derived, or the extracted text and the searched text disagree about
where a column ends — the original defect wearing a different hat.
NFD, never NFC: composition needs the next character, so an NFC fold
applied per character composes nothing and the two spellings of an accent
stay different. That was a real bug in the first draft. And case *folding*,
not lowercasing — Rust lowercases ß to ß, so "Strasse" never found
"Straße".
Columns are detected before lines, because two columns share their
baselines; that is what makes them columns. Bands are separated by a gutter
rather than by bare non-overlap, since two abutting runs on a line do not
overlap either.
Also fixed, found by running the gates rather than by looking: a stream
reader trimmed a trailing CR before `endstream` as if it were the writer's
separator. Binary data ends in CR about one time in 256, and when it did
the reader returned a stream one byte short — no longer AES-block-aligned,
so decryption produced garbage and Flate failed. Roughly one encrypted
document in 250 was silently corrupt on read. The test failed once under
coverage, passed five times in isolation, and failed 2 in 40 when actually
counted. A /Length consistent with the file is now the authority; both
stream readers are fixed and a test reads one file through each.
1477 tests pass (was 1426), coverage 88.37%, all floors met, external
readers pass. 10 mutations across the two modules, all killed.
ADR 0034.
|
||
|---|---|---|
| .. | ||
| 0001-payment-scope.md | ||
| 0002-payment-crate-ownership.md | ||
| 0003-pdf-incremental-save.md | ||
| 0004-pdf-annotation-editing.md | ||
| 0005-pdf-encryption.md | ||
| 0006-pdf-advanced-color.md | ||
| 0007-payment-platform-boundary.md | ||
| 0008-truthful-payment-states.md | ||
| 0009-pdf-transparency.md | ||
| 0010-pdf-signatures.md | ||
| 0011-pdf-structure-tree.md | ||
| 0012-pdf-acroform-full.md | ||
| 0013-pdf-xref-streams.md | ||
| 0014-pdf-type3-fonts-and-streaming.md | ||
| 0015-pdf-filters-and-codecs.md | ||
| 0016-pdf-image-decode-surface.md | ||
| 0017-pdf-declared-versus-delivered.md | ||
| 0018-pdf-destinations.md | ||
| 0019-pdf-document-creation.md | ||
| 0020-pdf-bitonal-and-wavelet-codecs.md | ||
| 0021-pdf-phase4-completion.md | ||
| 0022-pdf-editing.md | ||
| 0023-pdf-redaction-and-compaction.md | ||
| 0024-pdf-encryption-on-save.md | ||
| 0025-pdf-signing-and-verification.md | ||
| 0026-pdf-signing-security-review.md | ||
| 0027-pdf-phase6-completion.md | ||
| 0028-pdf-shading.md | ||
| 0029-pdf-mesh-shadings.md | ||
| 0030-pdf-compositing-and-overprint.md | ||
| 0031-pdf-glyph-outlines.md | ||
| 0032-pdf-nested-content.md | ||
| 0033-pdf-wire-codec-and-tiling.md | ||
| 0034-pdf-text-search-and-layout.md | ||