noctua/DEVNOTE/Feature-Comparison.md
wfx 8ff43ea5d7 feat(domain): Add crop_to_image() and extract_meta() to RasterDocument
- crop_to_image(): Non-destructive crop returning DynamicImage
- extract_meta(): Extract BasicMeta and EXIF metadata
- Completes migration of RasterDocument features from app/ to domain/

Refs: Migration Step 1.2
2026-02-02 21:45:11 +01:00

167 lines
5.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Feature-Vergleich: app/document vs domain/document/types
**Ziel:** Identifizieren welche Features von `src/app/document/` nach `src/domain/document/types/` portiert werden müssen.
---
## RasterDocument
### Struct-Felder
| Feld | app/ | domain/ | Status |
|------|------|---------|--------|
| `document: DynamicImage` | ✅ | ✅ | OK |
| `native_width: u32` | ✅ | ✅ | OK |
| `native_height: u32` | ✅ | ✅ | OK |
| `transform: TransformState` | ✅ | ✅ | OK |
| `handle: ImageHandle` | ✅ pub | ✅ private | **⚠️ domain: public machen oder getter** |
| `fine_rotation_angle: f32` | ❌ | ✅ | Extra feature in domain |
| `interpolation_quality` | ❌ | ✅ | Extra feature in domain |
**Entscheidung:** Domain-Version hat mehr Features → Domain behalten, `handle` public machen
---
### Methoden-Vergleich
| Methode | app/ | domain/ | Aktion |
|---------|------|---------|--------|
| **Core Operations** | | | |
| `open()` | ✅ | ✅ | ✅ OK |
| `render()` | ✅ | ✅ | ✅ OK |
| `save()` | ✅ | ✅ | ✅ OK |
| | | | |
| **Transformations (Trait)** | | | |
| `rotate()` | ✅ | ✅ | ✅ OK |
| `flip()` | ✅ | ✅ | ✅ OK |
| `transform_state()` | ✅ | ✅ | ✅ OK |
| | | | |
| **Renderable (Trait)** | | | |
| `info()` | ✅ | ✅ | ✅ OK |
| | | | |
| **Dimensions** | | | |
| `dimensions()` | ✅ | ✅ | ✅ OK (beide haben es!) |
| `native_dimensions()` | ❌ | ✅ | Extra in domain |
| | | | |
| **Crop** | | | |
| `crop()` | ✅ | ✅ | ✅ OK (beide haben es!) |
| `crop_to_image()` | ✅ | ❌ | 📋 **Portieren nach domain/** |
| | | | |
| **Handle/Image Access** | | | |
| `handle` (field pub) | ✅ | ❌ | 📋 **Public machen oder getter** |
| `handle()` (getter) | ❌ | ✅ | ✅ OK (domain hat getter) |
| `image()` | ❌ | ✅ | Extra in domain |
| `get_rendered_image()` | ❌ | ✅ | Extra in domain |
| | | | |
| **Metadata** | | | |
| `extract_meta()` | ✅ | ❌ | 📋 **Portieren nach domain/** |
| | | | |
| **Internal Helpers** | | | |
| `refresh_handle()` | ✅ private | ❌ | Evtl. bereits integriert |
| `apply_rotation()` | ❌ | ✅ | Extra in domain |
| `apply_flip()` | ❌ | ✅ | Extra in domain |
| `create_image_handle_from_image()` | ❌ | ✅ | Extra in domain |
| | | | |
| **Extra Features (domain)** | | | |
| `rotate_fine()` | ❌ | ✅ | Feature in domain |
| `reset_fine_rotation()` | ❌ | ✅ | Feature in domain |
| `set_interpolation_quality()` | ❌ | ✅ | Feature in domain |
| `resize_to_format()` | ❌ | ✅ | Feature in domain |
---
### Zusammenfassung RasterDocument
**Domain-Version ist fortgeschrittener**
- Mehr Features (fine rotation, interpolation quality, resize)
- Bessere API (getter statt public fields)
- Saubere Helper-Funktionen
**Aus app/ portieren:**
1.`crop_to_image()` - Nicht-destruktives Crop
2.`extract_meta()` - Metadaten-Extraktion
3.`handle` public machen ODER getter `handle()` nutzen (bereits vorhanden!)
**Entscheidung:** Domain-Version als Basis, nur 2 Methoden fehlen
---
## VectorDocument
### Methoden-Vergleich
| Methode | app/ | domain/ | Aktion |
|---------|------|---------|--------|
| `open()` | ✅ | ✅ | ✅ OK |
| `render()` | ✅ | ✅ | ✅ OK |
| `dimensions()` | ✅ | ❌ | 📋 **Portieren** |
| `handle` (pub field) | ✅ | ❌ private | 📋 **Public machen oder getter** |
| `extract_meta()` | ✅ | ❌ | 📋 **Portieren** |
| `crop()` | ❌ | ❌ | 📋 **Neu implementieren** (Design-Entscheidung) |
**Aus app/ portieren:**
1. `dimensions()`
2. `extract_meta()`
3. `handle()` getter oder public
4. NEU: `crop()` implementieren (render-based)
---
## PortableDocument
### Methoden-Vergleich
| Methode | app/ | domain/ | Aktion |
|---------|------|---------|--------|
| `open()` | ✅ | ✅ | ✅ OK |
| `render()` | ✅ | ✅ | ✅ OK |
| `dimensions()` | ✅ | ❌ | 📋 **Portieren** |
| `handle` (pub field) | ✅ | ❌ private | 📋 **Public machen oder getter** |
| `extract_meta()` | ✅ | ❌ | 📋 **Portieren** |
| `crop()` | ❌ | ❌ | 📋 **Neu implementieren** (Design-Entscheidung) |
| Thumbnails | ✅ | ✅ | Prüfen ob identisch |
**Aus app/ portieren:**
1. `dimensions()`
2. `extract_meta()`
3. `handle()` getter oder public
4. NEU: `crop()` implementieren (render-based)
---
## Action Items für Schritt 1.2-1.4
### Schritt 1.2: RasterDocument (60 Min)
- [x] `crop()` - Bereits vorhanden! ✅
- [x] `dimensions()` - Bereits vorhanden! ✅
- [x] `crop_to_image()` hinzufügen ✅
- [x] `extract_meta()` hinzufügen ✅ (oder in core/metadata.rs)
- [x] `handle()` getter - Bereits vorhanden! ✅
### Schritt 1.3: VectorDocument (45 Min)
- [ ] `dimensions()` implementieren
- [ ] `handle()` getter hinzufügen
- [ ] `extract_meta()` implementieren
- [ ] `crop()` implementieren (render-based, neu!)
### Schritt 1.4: PortableDocument (45 Min)
- [ ] `dimensions()` implementieren
- [ ] `handle()` getter hinzufügen
- [ ] `extract_meta()` implementieren
- [ ] `crop()` implementieren (render-based, neu!)
---
## Überraschende Erkenntnisse
1. **Domain hat bereits crop() für Raster!**
2. **Domain hat bereits dimensions()!**
3. **Domain hat bereits handle() getter!**
4. **Domain hat MEHR Features** (fine rotation, interpolation) ✅
**→ Domain-Implementierung ist besser! Nur 2-3 Methoden fehlen pro Type.**
---
**Status:** Vergleich abgeschlossen
**Nächster Schritt:** 1.2 - RasterDocument ergänzen