Files
lightcraft/crates/tiff
Andrew FrahnandClaude Opus 5.5 6cbc0eb5a9 Phase 0: configurable brand, MIT licence, plan/ and Immich tracker
- brand.toml is the only place the product name lives; every crate and app
  reads it through dac-brand (env vars with legacy fallback, settings folder
  with copy-only migration, default library, preset extensions, i18n {app})
- cargo xtask brand check|test, run|install|package, docs, rename-crates,
  deny and immich; packaging files are templates rendered from brand.toml
- icons regenerated from brand/icon.svg; upstream branding removed
- MIT licence (segment and fetch stay Apache-2.0); cargo deny licence policy
- clean-room rules in AGENTS.md/CLAUDE.md; docs/upstream-merge.md
- plan/ rebuilt and committed; parity tracker reopens Classic rows, adds
  PLAN.md section 2 rows and the IMM Immich section; plan/immich.md and a
  pinned Immich test server

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-10 10:30:06 +11:00
..

dac-tiff (L0)

TIFF / IFD reader and writer. Used by dac-raw (DNG, CR2, NEF, ARW…), dac-meta (Exif) and later the TIFF/DNG exporters.

Features

  • Classic TIFF and BigTIFF, little- and big-endian (II/MM). Also accepts the TIFF-like magic numbers of some raw formats (ORF IIRO/IIRS, RW2 IIU) when ParseOptions::accept_raw_magic is set (default).
  • Every field type: BYTE, ASCII, SHORT, LONG, RATIONAL, SBYTE, UNDEFINED, SSHORT, SLONG, SRATIONAL, FLOAT, DOUBLE, IFD, LONG8, SLONG8, IFD8.
  • IFD chain + SubIFDs (330) + Exif (34665) / GPS (34853) / Interoperability (40965) pointer IFDs, resolved into a tree (Ifd::sub_ifds, exif, gps, interop). Entry::offset records the absolute position of each value (needed for maker notes and embedded blobs).
  • parse_ifd_at(data, offset, order, base, bigtiff, opts) parses an IFD whose offsets are relative to an arbitrary base; makernote::parse_makernote knows the header / byte-order / offset-base conventions of Canon, Nikon (types 1 and 3), Sony, Fujifilm, Olympus (old and new), Panasonic and Pentax notes.
  • image::ImageInfo — width/height, bits, samples, compression, photometric, planar config, predictor, sample format and the strip or tile chunk list (chunks(), chunk_bytes()); missing byte counts are inferred.
  • TiffWriter writes IFD chains with strips or tiles, SubIFDs and pointer IFDs, in either byte order, classic or BigTIFF; writer::rational / srational approximate floats as rationals.

Robustness

The reader never panics on malformed input (proptests feed random and mutated files): offsets are bounds-checked; out-of-range or unknown-type entries are skipped; IFD loops are detected; IFD count, nesting depth and entries per IFD are limited; the total bytes of decoded values are capped at 8 × input + 1 MiB so a file cannot make us allocate far more than its own size.

Sources

Public specifications only: TIFF 6.0 (Adobe, 1992), the TIFF 6.0 supplements (IFD type, SubIFDs), the BigTIFF format description (AWare Systems), Adobe DNG Specification 1.7 (tag numbers), CIPA DC-008 Exif 2.32, and the ExifTool tag-name documentation (maker-note header conventions, prose only). No third-party code was consulted.