Skip to content

refactor: computeFitTransform() statt vierfach kopierter Einpass-Logik (#359) - #370

Merged
S540d merged 1 commit into
testingfrom
refactor/fit-transform
Oct 23, 2026
Merged

S540d merged 1 commit into
testingfrom
refactor/fit-transform

Conversation

@S540d

@S540d S540d commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Pull Request

Closes #359

Beschreibung

Die Logik „Zeichnung in eine Fläche einpassen“ (Bounding Box der Striche → Skalierung und Offset) stand viermal fast identisch im Code:

  • components/DrawingCanvas.web.tsx (Redraw-Effekt)
  • components/DrawingCanvas.native.tsx (getScaledPaths)
  • services/ShareService.ts
  • services/ShareService.native.ts (computeScaleOffset)

Unterschiede gab es nur beim Padding: 10 bei den Zeichenflächen, 40 beim PNG-Export.

Änderung

  • Neuer Helper computeFitTransform(paths, width, height, padding) in utils/drawingTransform.ts (plus IDENTITY_TRANSFORM), ohne React-Native-Abhängigkeit. Er liefert die Identität, wenn es keine Striche gibt, nur Fills oder die Bounding Box Breite oder Höhe 0 hat. Die Skalierung wird nie größer als 1.
  • Alle vier Stellen nutzen den Helper: −138 Zeilen in den bestehenden Dateien.
  • Das Verhalten ändert sich nicht, auch nicht in den Randfällen. Die vier Kopien waren inhaltlich gleich (Fills zählen nicht zur Bounding Box, -Infinity > 0 ist false und führt zur Identität).

Die Props-/Defaults-Dopplung zwischen Web- und Native-Canvas aus #359 („optional im selben Zug“) ist bewusst nicht Teil dieses PRs, damit er ein reines, leicht prüfbares Refactoring bleibt.

Art der Änderung

  • Bugfix
  • Neue Funktion
  • Breaking Change
  • Dokumentation Update
  • Refactoring (Verhalten unverändert)

Cross-Platform Kompatibilität

Betrifft dieser PR plattformspezifischen Code? Ja (Web-/Native-Canvas und beide ShareService-Dateien), der Helper selbst ist plattformneutral.

Testing Checklist

  • Keine TypeScript Errors (auch nicht mit --noUnusedLocals in den geänderten Dateien), keine ESLint Warnings, Prettier sauber
  • npm run test:ci: 477/477 grün
  • 8 neue Tests: Randfälle (leer, nur Fills, Einzelpunkt, Linie, nie größer als 1, Zentrierung, Padding) und ein Äquivalenztest gegen die bisherige Implementierung für 300 zufällige Zeichnungen (deterministischer Pseudozufall)
  • Im echten Browser (Playwright, volles Spiel bis zum Replay) gegen den Stand davor verglichen: Ergebnis-Canvas, Replay-Mitte und Replay-Ende sind pixelidentisch
  • Native (Android) und der PNG-Export (Teilen) manuell nicht getestet; durch den Äquivalenztest des Helpers abgedeckt

Hinweis zur Reihenfolge

Mit #369 kollidiert nur CHANGELOG.md (beide ergänzen einen Eintrag oben); das löse ich nach dem Merge des jeweils ersten PRs auf.


Generated by Claude Code

#359)

Bounding Box der Striche → Skalierung/Offset stand fast identisch in
DrawingCanvas.web.tsx, DrawingCanvas.native.tsx (getScaledPaths),
ShareService.ts und ShareService.native.ts (computeScaleOffset); nur das
Padding unterschied sich (10 Canvas, 40 Export).

- utils/drawingTransform.ts: computeFitTransform(paths, width, height,
  padding) + IDENTITY_TRANSFORM, ohne React-Native-Abhängigkeit
- alle vier Stellen nutzen den Helper (-138 Zeilen)
- Tests: Randfälle (leer, nur Fills, Einzelpunkt, Linie, Padding) und ein
  Äquivalenztest gegen die bisherige Implementierung für 300 zufällige
  Zeichnungen

Verhalten unverändert; im Browser pixelidentisch (Ergebnis-Canvas,
Replay-Mitte, Replay-Ende) gegenüber dem Stand davor.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017fxbsNALrmwMj7LGMDPLw2
@github-actions

Copy link
Copy Markdown

🔀 Mergeability-Report

✅ Konfliktfrei mergebar (unstable).
✅ Ziel-Branch testing ist policy-konform.

CI-Checks: ✅ keine fehlgeschlagenen Checks

⏳ 🔍 Code Quality & Linting
⏳ ⚙️ Workflow Linting / actionlint
⏳ 🔐 Docs Privacy Check
⏳ 🔑 Keystore & Credential Scan
⏳ 🔒 Security Audit
⏳ mergeability / mergeability
⏳ 🔧 Platform Compatibility
⏳ Analyze (actions)
⏳ Analyze (javascript-typescript)

Merge-Checkliste

  • CI-Checks grün
  • Keine Merge-Konflikte
  • Ziel-Branch korrekt
  • (Optional) tiefes KI-Review via /review aus Claude Code (Pro-Abo, ohne API-Kosten)

Kostenlos generiert von reusable-mergeability.yml · keine API-Kosten · review-gate: success

@S540d
S540d merged commit ec9cb28 into testing Oct 23, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants