mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-11-10 13:01:29 +00:00
Main's #1143 (863af864a), merged in77b9cfa31, makes cos read a reference whose generation isn't its object's as null. The walk that finds what shares a /JBIG2Globals dictionary with what left fetched through `Document::get`, but remembered what it read by object number alone, so a reference of another generation and the object's own one shared what the first of them read: - What a parameters value names (`Run::names_in`): `/DecodeParms [10 1 R 10 0 R]` on an image that left, object 10 naming dictionary 9, read 10 1 R as null, named nothing, and remembered that for object 10. The 10 0 R after it found it, so nothing named 9, and the dictionary stayed in the file with the image another page kept. - A size, filters or parameters an image is stored again with (`Run::follow`): an image whose `/Width 11 1 R` reads as null can't be stored again, and refused the run alone. Once another image had read 11 0 R, it took that width and was stored with it. What an image names is now read by object number, whatever generation the reference gives (`Run::fetch_numbered`), in `names_in` and in the `/JBIG2Globals` chain alike: a reader that doesn't compare generations draws with that object, so what an image that left names this way may hold its shapes. That is how the chain already named `9 1 R` (the "another generation" way out), and how both read before #1143. What is read by number is remembered by number. The values an image is stored again with are read as cos reads them, and remembered by number and generation, so a reference of another generation reads its own way. `kept`'s comment said a reference reads the object of its number whatever its generation, which is no longer so for a full save. It says how `reachable_objects` reads one now. The README and `Run`'s comments say which reads take the number and which the generation too. Tests: - `a_redacted_scans_shared_jbig2_dictionary_leaves_the_file` gains three ways out: - parameters through another generation, then their own; - parameters through another generation alone; - a `/JBIG2Globals` reference to a reference of another generation. - `a_size_through_another_generation_isnt_the_one_its_own_reference_reads` stores no image with the width another reference read. It refuses instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmsdeUCdTaD72jkDw2pJKY