mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-29 04:07:12 -06:00
Render: cropped shadow and blur rasters are kept across pans within a margin
A Drop Shadow, Gaussian Blur, Feather or Photoshop-style filter raster too large to keep whole is cropped to the view. It was drawn again only while a later frame's rect, panned back, lay inside the frame it was made in, so every pan that showed new pixels made it again. For a Drop Shadow on a 6000 x 4000 pt image in a 2560 x 1440 view at 100% to 400%, a pan took 60 to 84 ms; with Gaussian Blur or Feather, a pan took 158 to 217 ms. When such a raster is made again at the zoom and rotation of the one kept for the object, it now also covers a margin around the view: up to half the view's longer side, while the raster stays within the 8.4 million pixel budget at full size (441 pixels on each side of a 2560 x 1440 view for a 20 pt blur at 100%). Later pans that keep the view inside the margin draw that raster. The first frame at a zoom, a zoom step and the frames of a drag make the raster without the margin, as before. A shadow made over an earlier cropped shadow covers only the rect the earlier one was made for. A kept raster is drawn again only after a pan by whole device pixels, but the wheel, a trackpad and the scroll bars scrolled the view by amounts that are not whole pixels. The canvas now moves the view by whole device pixels when it scrolls or is dragged. A scroll by the wheel, a trackpad, a touch screen or a scroll bar is rounded, and the part of a pixel left over is added to the next scroll of the same view; it is dropped after a zoom, a turn, Fit or a document switch. A Hand tool, Space or middle-button drag and a scroll bar thumb drag round the distance from where the drag began. The silhouette of a shadow or glow raster is now drawn with art culled against the raster's own area instead of the view, as filtered content already is. Before, a group member outside the view cast no shadow into a raster kept whole, so a pan that showed the member drew it without its shadow. A cropped raster kept across the margin would have done the same. The moved silhouette that a drag compares is drawn the same way. Docs: docs/target-app-parity.md.
This commit is contained in:
@@ -1037,6 +1037,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
|
||||
- **Dragging objects with raster effects when zoomed in (#2558):** during a drag with a tool on the canvas, the renderer draws filtered content (Gaussian Blur, Feather and the Photoshop-style filters) within 1,000,000 pixels, at a lower resolution where it would need more, unless it can draw the content from an earlier frame's raster. In the desktop app it does the same for drop shadows, outer glows and inner glows. No raster made that way is kept. The frame after the drag renders them as a still frame does, and a dialog's preview, exports and printing render as before. `zoomed_drag_perf` times a drag's frames at 100% to 6400%.
|
||||
- **Dragging other art over a wide blur (#2558):** an effect raster too large to keep whole (a wide blur, a shadow or glow, or any blur zoomed in) is cropped to what can show in the view, or made at a lower resolution and resampled to the view's pixels, and kept while the view stays the same, so dragging other art over the object draws its effects from the still frame instead of re-rendering them at the drag's lower resolution. A drag stays on the render worker once the worker drew the frame shown, since only that renderer holds the rasters. `tests_viewraster` covers each effect, and `a_drag_over_a_wide_blur_draws_the_blur_from_the_still_frame` the canvas on and off the worker. Not yet: a worker frame shows one display frame after the overlays, and the first frame of an interaction can land on the renderer that has not made the rasters yet (follow-up: render every canvas frame on the worker, waiting briefly for fast ones).
|
||||
- **Panning over a cropped effect raster:** when a pan makes a shadow, glow or filtered content raster cropped to the view again at the same zoom and rotation, the renderer makes it over a margin around the view too (up to half the view's longer side, within 8.4 million pixels), and later pans that keep the view inside that margin draw the raster instead of making it again. Zooming and the first frame at a zoom make the raster without the margin. The canvas pans by whole device pixels: the wheel, a trackpad, a touch screen and the scroll bars add the part of a pixel left over to the next scroll of the same view, and Hand tool and scroll bar thumb drags round the distance dragged. A shadow or glow raster holds the shadows of group members outside the view, so a pan that shows a member draws its shadow. `pans_within_a_cropped_rasters_margin_draw_it_kept` covers Drop Shadow, Gaussian Blur and Feather on a large image at 100%. `a_groups_shadow_raster_holds_the_members_outside_the_view` covers a group's members, `fractional_scrolls_moved_in_whole_pixels_draw_a_cropped_raster_kept` covers scrolls by fractions of a pixel, and `scrolls_and_pans_move_the_view_by_whole_device_pixels` covers the canvas.
|
||||
|
||||
- **Moving objects with raster effects (#1257):** during a drag or a dialog's preview, an object whose content only moved draws its cached drop shadows, outer glows and filtered content (Gaussian Blur, Feather and the Photoshop-style filters) from the rasters of an earlier frame at the nearest whole pixel, without running the effects again. The renderer first draws the moved content where the old content lies in its raster and compares the pixels. De-Interlace runs again. The frame after the drag runs the effects again and draws what a fresh renderer draws; on the desktop, the canvas renders that frame on the render worker. `texture_drag_perf` times a drag's frames and the frame after it.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user