Creator's final zoom correction: as the box is dragged, its capture region slides under the dim rectangles and the box picks up the 55% black "div shading" inside itself, because the VisualBrush samples the whole CanvasGrid and DimRects lived inside CanvasGrid. The captured area must stay clear regardless of box position. - PreviewPane.xaml: the DimRects ItemsControl is now a SIBLING of CanvasGrid (above the composed content, below the ZoomBox), never a descendant — the zoom source is shading-free by construction. - ZoomBoxInteractionTests: structural invariant — DimRectsLayer is a direct child of PreviewCanvas (not inside CanvasGrid) and renders below the ZoomBox. - Side effect (correctness, not a bug): quality dims now also sedate the global overlays outside the crop, matching "chrome outside the crop is dimmed".
3.4 KiB
HANDOFF — 2026-10-08 (zoom rework + dims-shading fix)
Branch
- main (no feature branch)
Dirty files (NOT mine — the in-flight "pinned chat" work unit; do NOT commit or co-edit)
Models/YouTube.csViewModels/MainViewModel.Chat.csControls/LeftPanel.xaml(pinned-message UI)- Untracked:
Helpers/RelayCommandGeneric.cs
What just happened (2026-10-08, third zoom pass — dims shading)
The zoom box shipped as a loupe (4b3d82f), then was corrected to an anchored-capture
magnifier over the full composite drawn last (commit 6bff21b). The final correction: as the box
is dragged, the dim rectangles (55% black "div shading" around the box) were sliding under the
capture region — shown inside the box because its VisualBrush samples all of CanvasGrid, and the
DimRects ItemsControl previously lived INSIDE CanvasGrid.
Fix: the DimRects overlay is now a sibling of CanvasGrid (renders above the composed
content, below the ZoomBox), never a descendant — so the zoom sample can never pick up the shading
and the captured area stays clear no matter where the box is dragged. Behavior consequence to note:
in non-zoom ("quality dims") mode the dims now also shade the global overlays (brand flash, alert
ticker, social bar) that sit above them in the old tree — consistent with "chrome outside the crop
is dimmed". Structural invariant added to ZoomBoxInteractionTests: DimRectsLayer is a direct
child of PreviewCanvas, not inside CanvasGrid, and renders below the ZoomBox.
Zoom feature state
- Models:
ZoomState.cs,ZoomShape.cs(Circle/VerticalRectangle/HorizontalRectangle),ZoomSceneElement.cs. - ViewModel (
MainViewModel.Zoom.cs):ActivateZoom/ToggleZoom/DismissZoom/StartZoomMove/UpdateZoomMove/EndZoomMove+RebuildDimRectsForZoom; transient element healed/mirrored byHealZoomLayers/EnsureZoomLayer. - Output: box composited last via
BlitZoom/ZoomMagnifier; output crop = tier (box never the crop). - Preview:
ZoomBox+DimRectsLayerare both SIBLINGS ofCanvasGrid(box above dims above content); box samples the full composite at the fixed capture, 2x; circle→ellipse clip, rect/square outline per shape;LeftPanelhides the placeholder row viaIsZoomLayer. - Rectangle shape = 4:3; Circle square; Phone 9:16. Capture anchored on click (
CaptureX/Y); dragging the box never changes it.
Tests
- Full suite: 406 passed / 0 failed on a clean full run (the pre-existing audio-loopback timing
flake and
RealMouseDrag's interactive-desktop requirement recur occasionally — not zoom regressions). Zoom tests 3/3 green, 0 build warnings.
Known issues / follow-ups
- Background "Use default background" toggle still not working (carried from 2026-10-07):
binding exists (
UseDefaultBackground), VM handler invalidates bake; investigate when time permits. - The 3px selection / crop-outline strokes could still show in the zoom box IF the capture overlaps them in edit mode — not shading, thin outlines only; the dims (the user's complaint) are gone.
Next step
- User runs the app live to eyeball: drag the zoom box anywhere and the captured content stays clean
(no dim shading in the box; the scene outside the box stays dimmed). Then TASK 51 (webcam
background Remove + Blur) per
TASKS/task-51-webcam-bg-effects.md, and the background-toggle investigation if still open.