# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project C++ desktop app converting digitized analog film negatives (35mm, 120mm) to digital positives. Supports JPG/PNG and RAW input (CR2/NEF/ARW/DNG), outputs PNG/JPG with inversion, C41/B&W correction, auto-crop, and batch processing. Cross-platform: Windows/Linux/macOS. ## Tech Stack - **Language:** C++20 - **Image processing:** OpenCV 4.10+ and LibRaw 0.21+ (RAW demosaicing) - **GUI:** Qt 6.8 LTS (LGPLv3) - **Build:** CMake 3.20+, vcpkg (Windows), Ninja - **CLI:** Optional batch mode without GUI ## Build Commands ```bash # Linux (Ubuntu/Debian) sudo apt install libopencv-dev libqt6widgets6 libraw-dev cmake ninja-build cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build # Windows (vcpkg) vcpkg install opencv[contrib] libraw qt6-base:x64-windows cmake -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE=vcpkg.cmake cmake --build build # macOS (Homebrew) brew install opencv libraw qt@6 cmake ninja cmake -B build -G Ninja cmake --build build ``` ## Architecture Processing pipeline: ``` Input → Loader → Preprocess → Detect → Invert → Color Correction → Post-Process → Output ``` **Core data structure:** ```cpp struct ImageData { cv::Mat rgb; // Demosaiced 16-bit std::string make; // "Canon", "Nikon" float exposure; // WB/EXIF data }; ``` **Pipeline stages:** 1. **Loader** (`src/converter/rawloader`): LibRaw for RAW→RGB16, OpenCV for JPG/PNG 2. **Preprocess**: RAW→RGB16 conversion, deskew 3. **Detect** (`src/converter/negative`): Negative vs. positive via histogram analysis and orange color masking 4. **Invert**: `cv::bitwise_not()` + film-specific color matrix 5. **Color**: C41 orange cast removal, auto white balance from EXIF 6. **Post** (`src/converter/crop`): Levels, sharpening, dust removal, auto frame detection 7. **Output**: 16-bit TIFF and 8-bit PNG Error handling uses `std::expected` throughout. ## Coding Standards - Always call `LibRaw::recycle()` after use - Qt file dialogs: `QFileDialog::getOpenFileNames("RAW (*.cr2 *.nef *.dng)")` - Tests use RAW golden files with pixel diff tolerance <1% - Do not exceed 4GB in-memory RAW data - Do not use lossy demosaicing (LibRaw default is lossless) - Always log RAW metadata ## Sample Images The `import/` directory contains example RAW files for manual testing and development: | File | Format | Description | |------|--------|-------------| | `import/DSC09246.ARW` | Sony ARW | Example negative for conversion testing | | `import/unbenannt.ARW` | Sony ARW | Example negative for conversion testing | Use these files to test the full pipeline end-to-end without needing external test data. ## License Compliance README.md must include: - Qt LGPLv3 attribution and source download link: https://www.qt.io/download-open-source - Instructions for re-linking Qt DLLs - LibRaw CDDL attribution: https://www.libraw.org