feat(bijsnijden): draaien schrijft een kopie en laat het origineel staan #1873

Merged
brenno merged 1 commit from feat/rotatie-kopie-optie-a into main 2026-08-30 21:29:12 +00:00
Owner

Wat dit is

Optie A uit docs/design/IMAGE_ROTATION.md, gebouwd. Je koos hem op 2026-08-30; #1872 legde de afweging en de tussentijdse waarschuwing vast, dit is het gedrag.

Het probleem dat weggaat

Een kwartslag in het aanpasvenster overschreef het bronbestand. Geen undo, geen kopie — en omdat één afbeelding meer dia's en meer decks kan voeden, draaide een klik hier de foto ook in decks die de auteur niet openhad. Voor een foto die hij niet zelf maakte, was dat de enige die hij had.

Wat het nu doet

Draaien schrijft een afgeleide kopie náást de bron en laat de dia daarnaar wijzen: foto.jpgfoto.r90.jpg. Naast de bron betekent binnen de projectmap of de stagingmap — een dia mag nergens anders heen wijzen — dus de kopie reist mee in het pakket en het git-vlak als elke andere deck-asset, zonder een OciDeck-artefact in de fotomap van de gebruiker achter te laten.

De hoek telt op in de naam in plaats van te nesten: foto.r90.jpg nog een kwartslag is foto.r180.jpg, nooit foto.r90.r90.jpg. Een volle ronde levert geen vierde bestand op maar wijst de dia terug naar het origineel.

Die regel zit in rotatedCopyName en splitRotationSuffix — pure functies, apart getoetst, want dáár zit het gedrag dat stil kan rotten. Op web hetzelfde via WebAssetStore.put in plaats van replace, zodat een dia die nog naar de ongedraaide bytes wijst die ook houdt.

De tekst in de dialoog is meegegaan

Hij zei "draaien verandert het afbeeldingsbestand zelf" — met deze wijziging is dat juist niet meer waar, en hij stond op het punt onwaar mee te liften. Hij zegt nu dat er een kopie naast het origineel komt en dat het origineel ongewijzigd blijft. In 31 talen; de oude sleutel is uit alle 32 tabellen verwijderd zodat er geen wees achterblijft.

Wat NIET meereist

De doelen van beeldverwijzingen draaien niet mee. Ze staan in beeldruimte van de oude oriëntatie, dus na een draai wijzen de markeringen verkeerd. Dat gold ook toen draaien de pixels bakte — deze wijziging veroorzaakt het niet en verhelpt het niet — maar hij maakt het wél goedkoper te repareren: het origineel staat er nog, en het geometriecontract uit §5.2 weet al hoe je een target draait. De gids zegt de auteur de oriëntatie vast te zetten vóór hij callouts plaatst; dat is een omweg, geen antwoord. Staat als open punt in §9.

Toetsing

  • test/image_crop_dialog_test.dart28/28 groen, met als kern de assertie dat het bronbestand ná een draai byte-identiek is. Dat is de hele wijziging; valt die weg, dan is de bug terug.
  • Ook getoetst: zonder draaien komt er geen bestand bij en verschuift de dia niet; twee kwartslagen geven één foto.r180.png; zes unit-tests op de naamregel (inclusief .r45, dat niet van ons is en blijft staan).
  • make check-static groen · make check-registrations groen · flutter analyze schoon

Documentatie

USER_GUIDE (nl+en) herschreven naar het nieuwe gedrag met een gedateerde notitie over wat er veranderde, IMAGE_ROTATION.md op decided and built met §8a (hoe het gebouwd is) en het callout-punt in §9, docs/README.md-index bijgewerkt, CHANGELOG-regel erbij.

## Wat dit is **Optie A uit `docs/design/IMAGE_ROTATION.md`, gebouwd.** Je koos hem op 2026-08-30; #1872 legde de afweging en de tussentijdse waarschuwing vast, dit is het gedrag. ## Het probleem dat weggaat Een kwartslag in het aanpasvenster overschreef het bronbestand. Geen undo, geen kopie — en omdat één afbeelding meer dia's en meer decks kan voeden, draaide een klik hier de foto ook in decks die de auteur niet openhad. Voor een foto die hij niet zelf maakte, was dat de enige die hij had. ## Wat het nu doet Draaien schrijft een **afgeleide kopie náást de bron** en laat de dia daarnaar wijzen: `foto.jpg` → `foto.r90.jpg`. Naast de bron betekent binnen de projectmap of de stagingmap — een dia mag nergens anders heen wijzen — dus de kopie reist mee in het pakket en het git-vlak als elke andere deck-asset, zonder een OciDeck-artefact in de fotomap van de gebruiker achter te laten. De hoek **telt op in de naam** in plaats van te nesten: `foto.r90.jpg` nog een kwartslag is `foto.r180.jpg`, nooit `foto.r90.r90.jpg`. Een volle ronde levert geen vierde bestand op maar wijst de dia terug naar het origineel. Die regel zit in `rotatedCopyName` en `splitRotationSuffix` — pure functies, apart getoetst, want dáár zit het gedrag dat stil kan rotten. Op web hetzelfde via `WebAssetStore.put` in plaats van `replace`, zodat een dia die nog naar de ongedraaide bytes wijst die ook houdt. ## De tekst in de dialoog is meegegaan Hij zei *"draaien verandert het afbeeldingsbestand zelf"* — met deze wijziging is dat juist niet meer waar, en hij stond op het punt onwaar mee te liften. Hij zegt nu dat er een kopie naast het origineel komt en dat het origineel ongewijzigd blijft. In 31 talen; de oude sleutel is uit alle 32 tabellen verwijderd zodat er geen wees achterblijft. ## Wat NIET meereist **De doelen van beeldverwijzingen draaien niet mee.** Ze staan in beeldruimte van de oude oriëntatie, dus na een draai wijzen de markeringen verkeerd. Dat gold ook toen draaien de pixels bakte — deze wijziging veroorzaakt het niet en verhelpt het niet — maar hij maakt het wél goedkoper te repareren: het origineel staat er nog, en het geometriecontract uit §5.2 weet al hoe je een target draait. De gids zegt de auteur de oriëntatie vast te zetten vóór hij callouts plaatst; dat is een omweg, geen antwoord. Staat als open punt in §9. ## Toetsing - `test/image_crop_dialog_test.dart` — **28/28 groen**, met als kern de assertie dat het bronbestand ná een draai **byte-identiek** is. Dat is de hele wijziging; valt die weg, dan is de bug terug. - Ook getoetst: zonder draaien komt er geen bestand bij en verschuift de dia niet; twee kwartslagen geven één `foto.r180.png`; zes unit-tests op de naamregel (inclusief `.r45`, dat niet van ons is en blijft staan). - `make check-static` groen · `make check-registrations` groen · `flutter analyze` schoon ## Documentatie `USER_GUIDE` (nl+en) herschreven naar het nieuwe gedrag met een gedateerde notitie over wat er veranderde, `IMAGE_ROTATION.md` op *decided and built* met §8a (hoe het gebouwd is) en het callout-punt in §9, `docs/README.md`-index bijgewerkt, CHANGELOG-regel erbij.
feat(bijsnijden): draaien schrijft een kopie en laat het origineel staan
All checks were successful
scans / scans (pull_request) Successful in 3m42s
static-gate / static-gate (pull_request) Successful in 8m30s
ff20bf5573
Optie A uit docs/design/IMAGE_ROTATION.md, door de eigenaar gekozen op
2026-08-30.

Tot nu toe overschreef een kwartslag het bronbestand. Geen undo, geen
kopie — en omdat één afbeelding meer dia's en meer decks kan voeden,
draaide een klik hier de foto ook in decks die de auteur niet openhad.
Voor een foto die hij niet zelf maakte, was dat de enige die hij had.

Draaien schrijft nu een afgeleide kopie náást de bron en laat de dia
daarnaar wijzen: `foto.jpg` → `foto.r90.jpg`. Naast de bron betekent hier
binnen de projectmap of de stagingmap, want een dia mag nergens anders
heen wijzen; zo reist de kopie mee in het pakket en het git-vlak als elke
andere deck-asset, zonder een OciDeck-artefact in de fotomap van de
gebruiker achter te laten.

De hoek telt op in de naam in plaats van te nesten — `foto.r90.jpg` nog
een kwartslag is `foto.r180.jpg`, nooit `foto.r90.r90.jpg` — en een volle
ronde levert geen vierde bestand op maar wijst de dia terug naar het
origineel. Die regel zit in `rotatedCopyName` en `splitRotationSuffix`,
puur en apart getoetst, want dáár zit het gedrag dat stil kan rotten. Op
web hetzelfde via `WebAssetStore.put` in plaats van `replace`, zodat een
dia die nog naar de ongedraaide bytes wijst die ook houdt.

De regel in de dialoog is meegegaan: hij zei "draaien verandert het
afbeeldingsbestand zelf", en dat is nu juist niet meer waar. Hij zegt nu
dat er een kopie naast het origineel komt en dat het origineel ongewijzigd
blijft — in 31 talen; de oude sleutel is uit alle tabellen verwijderd zodat
er geen wees achterblijft.

Wat NIET meereist: de doelen van beeldverwijzingen staan in beeldruimte van
de oude oriëntatie en draaien niet mee. Dat gold ook toen draaien de pixels
bakte, dus deze wijziging veroorzaakt noch verhelpt het; hij maakt het wel
goedkoper te repareren, want het origineel staat er nog en het
geometriecontract uit §5.2 weet al hoe je een target draait. De gids zegt
de auteur de oriëntatie vast te zetten vóór hij callouts plaatst; dat is
een omweg, geen antwoord. Staat als open punt in §9.

Toets: image_crop_dialog_test 28/28 groen — inclusief de assertie dat het
bronbestand ná een draai byte-identiek is, want dat is de hele wijziging.
make check-static en make check-registrations groen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 7bff01182b into main 2026-08-30 21:29:12 +00:00
brenno deleted branch feat/rotatie-kopie-optie-a 2026-08-30 21:29:16 +00:00
Sign in to join this conversation.
No description provided.