Add structures and functions to record inline images (BI/ID/EI sequences)
as ImageXObject entries in a page's image list. This enables Phase 4.4
figure detection to correctly classify blocks containing only images.
Changes:
- Add InlineImageHeader struct for inline image metadata
- Add ImageBytesRef enum for image byte references
- Add ImageXObject struct unifying XObject and inline images
- Add collect_image_xobjects() to collect all images with bboxes
- Add parse_inline_image() to parse BI/ID/EI sequences
- Add compute_unit_square_bbox() for bbox computation from CTM
- Add comprehensive unit tests for all acceptance criteria
Acceptance criteria:
- Inline image with no CTM: bbox == [0,0,1,1] ✅
- Inline image with CTM 100 0 0 50 200 300: bbox == [200,300,300,350] ✅
- Page with 3 images: page_image_list has 3 entries with correct bboxes ✅
- Image mask: recorded with is_mask flag ✅
- Rotation normalization: handled via CTM ✅
Closes: pdftract-axcri
Added CM_ARG_COUNT and CM_DEGENERATE diagnostic codes for the cm
operator. The cm operator was already implemented in render.rs and
type3_rasterizer.rs; this change adds proper error handling for:
- Wrong argument count (must be exactly 6 numbers)
- Degenerate matrices (NaN values or determinant == 0)
When errors occur, diagnostics are emitted and the CTM is not modified
(clamped to identity).
Closes: pdftract-p7yll
Files modified:
- crates/pdftract-core/src/diagnostics.rs: Added CmArgCount, CmDegenerate
- crates/pdftract-core/src/render.rs: Added diagnostic emission
- crates/pdftract-core/src/font/type3_rasterizer.rs: Added diagnostic emission
- crates/pdftract-cli/src/main.rs: Added CLI output for new diagnostics
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>