Inzoomen op een afbeelding doet niets boven 100%: de vergroting wordt stil teruggeknepen #1813
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1813
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat er misgaat
De zoomschuif op een afbeelding loopt van 100% tot 400%, maar elke stand boven
100% levert exact hetzelfde beeld op als 100%. Inzoomen doet niets — niet op de
dia, en niet op het proefbeeld in de bijsnijddialoog zelf.
Het raakt elke afbeelding met een zoom: de paneelafbeelding van
bulletsImageentwoImages, de volledige-dia-afbeelding, de sectie- en titelachtergrond. Allevijf de aanroepen van de bijsnijddialoog zetten
enableZoom: true.Reproductie
Bullets + afbeelding-dia en kies een afbeelding.Slepen om de uitsnede te verschuiven doet in die stand ook niets zichtbaars: de
verschuiving wordt berekend uit een overloop (
overflowX = frameW * (scale - 1))die er niet is.
Waar het zit
_zoomedImage(lib/widgets/slides/previews/media_previews_image.dart) maakt eendoos van
slot × zoom/100en zet daar de afbeelding metBoxFit.containin:Alignlegt zijn kind af metconstraints.loosen()— dat houdt het slot alsmaximum — en
SizedBoxdwingt zijn maat af binnen de meegegeven grenzen. Eendoos die groter is dan het slot wordt dus stil teruggeknepen tot het slot. De
ClipRecteromheen staat er voor een overloop die nooit ontstaat.Meting (
flutter test, exact dezelfde widgetketen, slot 512×720):imageZoomOnder de 100% klopt het wél — dat is de enige reden dat de code ooit iets lijkt
te doen. Die standen zijn alleen niet met de schuif te bereiken (
minZoom = 100);ze komen uit een handgeschreven
<!-- ocideck_image_zoom: 50 -->.Waarom niemand het zag
De dialoog bouwt zijn eigen proefbeeld met hetzelfde patroon —
Align→SizedBox(frameW * scale)binnen eenStack(fit: StackFit.expand), en die geeftstrakke grenzen mee. Editor en dia knijpen dus allebei even hard, en zijn het
netjes met elkáár eens terwijl ze het geen van beiden met de schuif eens zijn.
Geen enkele test rendert een ingezoomd paneel;
imageZoomkomt intest/alleenvoor in de rondgangstoets van de markdown.
De reparatie
OverflowBoxis wat de compositie mist: dat is de doos die zijn kind wél buitende grenzen van de ouder mag afleggen. Neem
Transform.scaleníét — hetcommentaar in
_zoomedImagelegt uit waarom die er ooit uit is gehaald: eentransformatielaag wordt door
RepaintBoundary.toImageonbetrouwbaar vastgelegd,en dat is precies hoe elke raster-export gemaakt wordt.
Doe in dezelfde gang mee, want ze gaan alle drie over deze plek:
_zoomedImagezegt "Defensive cap (parse already clamps)" — het parseren klemtocideck_image_zoomhelemaal niet (markdown_service_parse.dart:236is eenkale
int.tryParse(...) ?? 0). Die klem in de renderlaag is de enige die er is.showImageCropDialogzegt datenableZoomonwaar is voor hetbulletspaneel en de twee-afbeeldingenslots. Alle vijf de aanroepers geven
truemee; de tak voorfalse(_coverop regel 149) is onbereikbaar.Nederlandse zin ("De slider volgt同步").
Regressietoets
Een widgettoets die de werkelijke afgelegde maat meet bij zoom 100 en 300 en eist
dat ze verschillen — de fout is onzichtbaar voor elke toets die alleen kijkt of
imageZoomde goede waarde heeft. Plus een beeldkeuring: dit is bij uitstek ietswat je met eigen ogen moet zien.
Waarom nu
Gevonden bij het uitwerken van de geometrie voor #1801 (beeldverwijzingen), §4.3
van
docs/design/IMAGE_CALLOUTS.md. Dat ontwerp legt vast hoe een punt in deafbeelding naar een plek op de dia wordt gerekend, en die berekening moet op vier
oppervlakken hetzelfde uitpakken. Zolang Flutter de zoom wegknijpt en de
HTML-export hem wél zou toepassen, zetten die twee de markering op verschillende
plaatsen. Het ontwerp noemt deze reparatie daarom een voorwaarde vooraf, naast
#1803.