NetterSilver and Claude Opus 5.5
adb1b43033
Speed up raster export: faster blur and spread passes
...
Shadows and layer blurs dominated PNG/JPG/WebP export time (gdb stack
sampling of the example files: about 45% in fx::box_blur_h, 13% in
fx::morph). Both now produce the same bytes, faster:
- fx::blur runs its three box passes per row while the row is in cache,
works on whole pixels instead of bounds-checked bytes, skips fully
transparent rows, transposes in cache-friendly column blocks, and
splits rows and transposes across rayon on desktop for pixmaps of
64K pixels and more, only when not already on a rayon worker (a band
of render_view stays on its thread: no nested parallelism).
- fx::morph (shadow spread on layers that aren't one outline) uses the
van Herk / Gil-Werman running max/min: constant work per pixel instead
of 2r + 1.
Integer arithmetic and pass order are unchanged; new tests compare both
against the previous implementations byte for byte, including sizes on
the parallel path.
An ignored timing test exports every top-level frame of examples/ as
PNG, JPG and WebP at 2x through export_file:
cargo test --release -p figcraft-engine --lib export_timings -- --ignored --nocapture
Ryzen, 16 threads, Linux; median of 7 (min):
PNG 2195 ms (2182) -> 992 ms (989) -55%
JPG 2880 ms (2560) -> 1550 ms (1535) -46%
WebP 1964 ms (1901) -> 1022 ms (1018) -48%
total 7035 ms (6677) -> 3567 ms (3555) -49%
All 80 exported files (PNG, JPG, WebP, PDF, SVG) are byte-identical.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-27 17:43:23 +01:00
..
2026-10-26 20:36:51 +00:00
2026-10-26 20:36:50 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:36:51 +00:00
2026-10-26 20:17:47 +00:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:36:51 +00:00
2026-10-20 00:23:14 +07:00
2026-10-24 13:01:46 +07:00
2026-10-13 13:36:54 +07:00
2026-10-10 04:32:31 +07:00
2026-10-15 15:17:21 +02:00
2026-10-15 14:46:20 +03:00
2026-10-10 23:29:17 +07:00
2026-10-24 02:56:55 +07:00
2026-10-11 10:04:25 +07:00
2026-10-10 16:30:18 +07:00
2026-10-26 20:17:48 +00:00
2026-10-26 20:17:48 +00:00
2026-10-15 18:11:52 +07:00
2026-10-23 22:18:34 -05:00
2026-10-26 09:14:25 +07:00
2026-10-20 20:43:51 +02:00
2026-10-26 11:52:16 +07:00
2026-10-26 12:52:39 +07:00
2026-10-26 11:52:16 +07:00
2026-10-24 04:18:55 +07:00
2026-10-26 20:17:47 +00:00
2026-10-11 10:04:25 +07:00
2026-10-24 10:30:49 +07:00
2026-10-26 13:57:24 +07:00
2026-10-26 13:57:24 +07:00
2026-10-26 13:57:24 +07:00
2026-10-11 13:43:48 +07:00
2026-10-11 14:25:25 +07:00
refactor(engine): move tools, snap, distance, guides, drop, arc_handles, shape_handles, rotation_origin, al_keys, booleans, shapebuilder, textedit, textpreview, vectoredit to canvas/
2026-10-26 20:17:47 +00:00
2026-10-24 04:18:55 +07:00
2026-10-26 20:17:47 +00:00
2026-10-26 23:53:30 +07:00
2026-10-11 09:29:30 +07:00
2026-10-21 11:19:47 -07:00
2026-10-11 03:19:24 +07:00
2026-10-11 03:19:24 +07:00
2026-10-10 13:36:42 +07:00
2026-10-26 23:52:51 +07:00
2026-10-22 09:33:12 +02:00
2026-10-18 14:14:38 +02:00
2026-10-26 20:17:48 +00:00
2026-10-18 14:18:25 +02:00
2026-10-26 08:43:07 +07:00
2026-10-14 18:35:21 -05:00
2026-10-24 13:01:47 +07:00
2026-10-26 20:17:48 +00:00
2026-10-24 04:41:31 -04:00
2026-10-24 13:33:26 +07:00
2026-10-12 02:30:25 +07:00
2026-10-26 20:17:48 +00:00
2026-10-10 23:29:17 +07:00
2026-10-24 02:56:55 +07:00
2026-10-24 02:56:55 +07:00
2026-10-24 13:02:11 +07:00
2026-10-24 02:56:55 +07:00
2026-10-26 20:17:48 +00:00
2026-10-17 13:19:13 -06:00
2026-10-15 18:28:18 +07:00
2026-10-26 09:04:57 +07:00
2026-10-16 16:30:58 +05:00
2026-10-18 23:53:05 +02:00
2026-10-26 20:17:48 +00:00
2026-10-24 15:53:33 -07:00
2026-10-27 17:43:23 +01:00
2026-10-14 05:23:28 +07:00
2026-10-12 02:30:25 +07:00
2026-10-26 20:17:48 +00:00
2026-10-26 12:28:59 +07:00
2026-10-13 10:05:39 +07:00
2026-10-12 07:19:57 +07:00
2026-10-16 03:32:36 +02:00
2026-10-22 23:04:57 +08:00
2026-10-16 03:38:36 +02:00
2026-10-26 20:36:51 +00:00
2026-10-10 12:16:56 +07:00
2026-10-17 23:44:41 +07:00
2026-10-10 03:19:00 +07:00
2026-10-12 00:57:43 +07:00
2026-10-23 04:08:48 +02:00
2026-10-10 18:40:26 +07:00
2026-10-14 01:02:45 -05:00
2026-10-23 23:28:13 -04:00
2026-10-13 00:29:41 +07:00
2026-10-26 13:57:24 +07:00
2026-10-26 12:23:06 +08:00
2026-10-16 19:58:00 +02:00
2026-10-17 16:06:26 +07:00
2026-10-25 18:41:58 -04:00
2026-10-12 01:32:04 +07:00
2026-10-16 01:34:29 +02:00
2026-10-26 06:24:14 +00:00
2026-10-22 13:41:56 +02:00
2026-10-17 19:27:35 +07:00
2026-10-14 12:54:02 +02:00
2026-10-11 09:10:59 +07:00
2026-10-21 17:41:30 +02:00
2026-10-24 09:13:43 +07:00
2026-10-27 17:43:23 +01:00
2026-10-22 23:46:52 +02:00
2026-10-15 16:31:53 +02:00
2026-10-22 13:41:56 +02:00
2026-10-15 17:20:58 +02:00
2026-10-24 13:01:55 +07:00
2026-10-12 17:54:18 +07:00
2026-10-24 22:35:07 +03:30
2026-10-12 17:54:18 +07:00
2026-10-19 22:18:15 +07:00
2026-10-10 03:45:45 +07:00
2026-10-12 00:57:43 +07:00
2026-10-24 14:14:37 +07:00
2026-10-14 12:00:20 +07:00
2026-10-22 11:26:04 +02:00
2026-10-15 19:46:04 -03:00
2026-10-20 15:41:47 +00:00
2026-10-16 00:19:49 +02:00
2026-10-13 00:29:41 +07:00
2026-10-17 15:58:24 +07:00
2026-10-15 17:10:00 +02:00
2026-10-15 13:44:17 +02:00
2026-10-16 08:29:55 +00:00
2026-10-12 00:57:43 +07:00
2026-10-10 07:38:17 +07:00
2026-10-21 11:03:08 -07:00
2026-10-10 20:50:29 +07:00
2026-10-17 23:05:03 +07:00
2026-10-21 19:47:01 -05:00
2026-10-10 11:43:54 +07:00
2026-10-13 13:36:54 +07:00
2026-10-20 04:58:32 +07:00
2026-10-12 17:54:18 +07:00
2026-10-12 06:15:00 +07:00
2026-10-26 09:20:18 +07:00
2026-10-26 20:17:48 +00:00
2026-10-10 17:20:07 +07:00
2026-10-23 13:20:31 +08:00
2026-10-12 00:57:43 +07:00
2026-10-10 16:00:02 +07:00
2026-10-13 13:36:54 +07:00
2026-10-10 04:32:37 +07:00
2026-10-24 09:19:33 +02:00
2026-10-10 22:21:53 +07:00
2026-10-10 09:48:29 +07:00
2026-10-10 11:14:46 +07:00
2026-10-10 10:57:58 +07:00
2026-10-13 13:36:54 +07:00
2026-10-12 05:28:53 +07:00
2026-10-18 15:52:30 +07:00
2026-10-10 18:40:26 +07:00
2026-10-10 17:31:37 +07:00
2026-10-10 04:57:31 +07:00
2026-10-12 07:53:24 +07:00
2026-10-26 11:04:01 +01:00
2026-10-26 13:57:24 +07:00
2026-10-25 14:22:29 +00:00
2026-10-11 14:25:25 +07:00
2026-10-10 04:20:23 +07:00
2026-10-11 23:10:41 +07:00
2026-10-26 14:13:36 +01:00
2026-10-10 14:04:17 +07:00
2026-10-18 18:53:32 -04:00
2026-10-15 22:07:53 +03:00
2026-10-26 20:17:47 +00:00
2026-10-26 20:17:48 +00:00
2026-10-12 01:32:04 +07:00
2026-10-23 09:49:32 +08:00
2026-10-11 10:04:25 +07:00
2026-10-24 07:22:36 -07:00
2026-10-26 20:17:48 +00:00
2026-10-24 09:13:43 +07:00
2026-10-26 09:12:40 +07:00
2026-10-18 23:53:04 +02:00
2026-10-11 23:10:41 +07:00
2026-10-10 03:30:20 +07:00
2026-10-24 05:24:51 -07:00
2026-10-22 11:11:59 +02:00
2026-10-10 20:36:55 +07:00
2026-10-24 12:57:52 +07:00
2026-10-13 03:01:19 +07:00
2026-10-26 13:31:53 +07:00
2026-10-26 13:14:51 +01:00
2026-10-10 03:52:11 +07:00
2026-10-12 17:54:18 +07:00
2026-10-11 18:20:38 +07:00
2026-10-16 12:31:50 +03:00
2026-10-17 00:58:20 +07:00
2026-10-25 15:04:39 -04:00
2026-10-15 17:19:38 +02:00
2026-10-11 11:51:37 +07:00
2026-10-24 10:09:28 +07:00
2026-10-17 13:27:11 +07:00
2026-10-20 00:25:18 +07:00
2026-10-15 17:17:44 +02:00
2026-10-18 14:59:14 +07:00
2026-10-26 23:54:08 +07:00
2026-10-20 16:18:13 +11:00
2026-10-22 13:00:27 +08:00
2026-10-18 20:39:46 +02:00
2026-10-17 22:35:50 +08:00
2026-10-24 09:39:52 +07:00
2026-10-17 13:40:55 +07:00
2026-10-21 11:21:24 -07:00
2026-10-24 05:24:29 -04:00
2026-10-12 02:09:10 +07:00
2026-10-18 00:13:49 +07:00
2026-10-26 20:17:48 +00:00
2026-10-22 20:44:46 +08:00
2026-10-26 13:31:53 +07:00
2026-10-26 13:31:53 +07:00