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

5.4 KiB
Raw Blame History

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)

  • crop() - Bereits vorhanden!
  • dimensions() - Bereits vorhanden!
  • crop_to_image() hinzufügen
  • extract_meta() hinzufügen (oder in core/metadata.rs)
  • 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