Repository navigation
feat(screenshot): add fill, editable shapes, redaction hardening, and recording auto zoom - #486
Conversation
… recording auto zoom - Spotlight, plus selectable, movable, resizable rectangles, ellipses, and spotlight regions. - Opaque fill for rectangles and ellipses, applied before drawing or to a selected shape. - Mosaic hardening: 14-pt area-averaged, quantized, per-capture jittered, opaque blocks; masks expand to whole device pixels so fractional edges cannot blend the source. - Remove the blur tool and its metadata. - Recording auto zoom: pointer-driven 60 fps camera rendered after capture, with progress, Keep Original cancellation, and a shared record-bar/settings preference. - OCR keeps indentation, table columns, paragraph gaps, and side-by-side panels. - Scrolling stitch accepts matches clearly better than the median alignment, so capture noise no longer stalls stitching. - Pinned images gain hover Copy/Save As/Close controls; scrolling results close after use. - Folder saves never replace files; cancelling Save As returns to the selection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closing the panel in text-recognition mode ends the capture instead of revealing annotation tools, moving the selection keeps those tools hidden, line counts exclude layout blank lines, the panel width stays on screen, and Vision warm-up includes Chinese text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the improvements! I found two issues worth fixing:
Both issues appear limited to the screenshot plugin. |
…rding messages - Save As reports whether the file was written. A pinned scrolling screenshot closes only after a successful write, and capture returns to the selection after a write failure as well as a cancellation. - Recording completion messages follow a session token that only plugin cancellation changes, so starting a screenshot while auto zoom renders no longer suppresses them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review! Both are fixed in 24f6db2:
|
Problem and result
This improves the Screenshot plugin's editing, redaction, text recognition, scrolling, pinning, saving, and recording, built on the plugin's existing architecture (overlay pool,
RecordingLifecycle,CaptureStreamSession,ScreenshotEnvironment, declarative settings). The existing toolbar, mode bar, and capture surfaces keep their layout; new controls appear only where a feature needs them.Changes
Editing
Redaction
Recognition —
TextLayoutrebuilds indentation, table columns, paragraph gaps, and side-by-side panels from Vision fragment geometry instead of joining lines by vertical order.Scrolling capture — Besides the existing
≤ 6absolute threshold, a frame matches when its best offset is clearly better than the median alignment score. With capture noise ≥ 20 gray levels the previous stitcher rejected every frame after the first (900 of 2,400 rows). The ambiguity and stationary-footer checks remain; the footer tolerance scales with the matched noise floor and stays at 6 for clean frames.Pinned images — Hover shows Copy / Save As / Close using the overlay's
BarButtonand glass style; images too small to contain them show the controls in an adjacent child panel. Pinned scrolling screenshots close after they are copied or saved.Saving — Folder saves never replace an existing file (numbered names, atomic move). Cancelling Save As returns to the same selection and annotations instead of ending the capture.
Recording auto zoom (macOS 15+)
SCStreamOutputclock.RecordingZoomPlanbuilds a smoothed camera path (1.6× zoom, dead-zone cursor following, overview after 2 s idle or a window/app switch), andRecordingZoomExporterrenders it at 60 fps with unchanged dimensions.… Original.mov) and reports its name; a clip without clicks or scrolling moves the original into place without re-encoding; the finished movie is published before the original is removed.privacy.dataObservedaddspointer-events; docs describe the in-memory, per-recording retention.Capture before macOS 26 — Stream configurations now set
ignoreShadowsSingleWindow = false. Its default also strips menu and popover shadows from display captures, which affected screenshots, scrolling capture, and recording on macOS 14 and 15 (macOS 26+ already setsignoreShadows = falseon the screenshot API). Not yet checked visually on macOS 14/15.Compatibility: no PluginKit or host API changes;
minHostVersionis unchanged. New strings cover all 12 locales.Verification
-only-testing(69 tests, all passing):AnnotationRendererTests,ScreenshotAnnotationEditingTests,ScrollSessionTests,TextLayoutTests,PinViewTests,RecordingZoomTests,RecordingActivityTests,RecordingZoomExporterTests,RecorderTests,CapturePipelineTests,CaptureRegionTests,ScreenshotPluginTests,RecognitionSessionTests. A new editing test covers mode-bar text recognition and fails without the fix.make script-tests(changelog, generated website data, complete localization): passing.git diff --check: clean. No new compiler warnings in Screenshot sources.The MacTools Dev build was launched locally to confirm the settings section. Still to exercise manually on macOS 15+: auto-zoom recording end to end (including Keep Original), Save As cancel returning to the selection, and pin controls on a small image.
UI evidence
Captured on macOS 26 from the plugin's real overlay, pin, and status-panel windows over a synthetic document (so no desktop content is included); the settings section is from the running MacTools Dev build. Assets live in
docs/pr-assets/screenshot-editing-recording/.Annotation toolbar — mosaic over the account number, a filled rectangle (selected, Fill highlighted at the end of the style row), and Spotlight on the total. The only new toolbar button is Spotlight.
Record bar with the Auto Zoom checkbox:
Recording panel while rendering auto zoom, with Keep Original:
Pinned images — hover controls inside a large image; beside an image too small to contain them:
Settings — new Recording section:
Checklist
🤖 Generated with Claude Code