The shipping workflow registers a trace and PNG design to one orientation- normalized placement photo. A two-point reference converts source-image pixels to millimetres. It does not reconstruct a 3D surface or compensate for body curvature.
Prohibited shipping claims include “body flattening,” “curved-surface unwrapping,” and “mm-true.” Those claims require a future geometry model, ground-truth fixture dataset, documented error metric, and measured tolerance.
Persisted geometry uses source-image pixels after EXIF orientation is baked into the saved image. The project schema stores:
Widget positions, arbitrary screen coordinates, and transient viewport matrices
are never product geometry. ImageViewportTransform and
TransformationController.toScene provide the explicit inverse transform used
at interaction boundaries.
| Module | Responsibility |
|---|---|
planar_project.dart |
Versioned model, validation, serialization, sample fixture |
planar_media.dart |
Bounded off-UI-isolate image validation, orientation normalization, atomic owned copies |
camera_capture_screen.dart |
Testable camera state machine and lifecycle recovery |
registered_photo_canvas.dart |
Registered photo rendering, scale handles, separate strokes, design drag, zoom/pan |
planar_project_store.dart |
Atomic JSON/media ownership under projects/<project-id>/, recovery and deletion |
project_save_coordinator.dart |
Serialized, debounced, flushable, failure-aware saves |
planar_pdf_exporter.dart |
Physical layout, vector strokes, PNG placement, warnings, 100 mm ruler |
planar_workflow_screen.dart |
Photo → Scale → Trace → Design → Export state and recovery UX |
The default startup path does not initialize ads, billing, ATT, Sentry, remote configuration, or entitlement services.
Each persistent project owns project.json, its normalized placement photo,
its normalized PNG design, and project-specific temporary files in one private
directory. TatMapper never deletes the artist’s picker source. Replacement
writes and verifies the new owned image, flushes the new project JSON, and only
then deletes the superseded owned media. Startup removes interrupted imports and
unreferenced TatMapper-named media without touching unknown or external paths.
Input is limited to 40 MiB and 80 million encoded pixels before full decoding. Images must be at least 256 pixels on each side and no more extreme than 20:1. EXIF orientation is baked and the longest normalized side is capped at 4096 px without upscaling. A 4096 px RGBA working frame is about 64 MiB; decoding, resizing, and encoding run outside the UI isolate. PNG design pixels are preserved by default, including white and translucent artwork.
Older native/OpenCV and dual-photo research sources remain in repository history for reference but are not linked into Android or iOS beta artifacts and are not reachable from the shipping application root. They must not regain a default route without a separate evidence-backed product decision.
Schema version 2 rejects unknown versions rather than guessing. A future schema change must include explicit migration tests. File-loss recovery must present a clear user action; it must not silently substitute unrelated geometry.