calixteman d1e9194e1f
Render knockout transparency groups
In a knockout (KO) group each painting operator ("element") composites against
the group's initial backdrop instead of accumulating onto prior elements
of the same group. The backend renders each element to a per-group pooled
temp canvas (keyed off `#groupStackMeta`), builds a binary alpha mask via
a new `feFuncA` filter (`addKnockoutFilter`), `destination-out`s the
group canvas through that mask, restores the initial backdrop into the
cleared footprint for non-isolated groups (cropped to the same mask so
sparse groups don't bleed the whole rectangle), and finally paints the
element on top with the parent's blend mode. Path / clip / transform ops
are mirrored back to the group canvas via `mirrorContextOperations` so
graphics state stays in sync between elements; only the raster pixels
land on the temp canvas.

The temp canvas is forced to source-over for the element raster (`multiply`
on a transparent backdrop would zero the color) and the original GCO is
restored before `copyCtxState` writes back, so the parent's blend mode
survives for the final composite.

Also handled:
  - Nested KO groups (the level is incremented for KO, reset to 0 for
    non-KO subgroups so an ancestor KO doesn't leak in).
  - Non-isolated non-KO subgroups inside a KO parent (`hasInnerBackdrop`
    path: blend the elements against the subgroup's running backdrop for
    color, mask with the elements-only canvas).
  - Soft masks installed inside a KO element (`applySMaskInPlace` in
    `compose`, which runs the SMask destination-in directly on the temp
    canvas; the existing blit-to-suspended step is gated by `if (!ctx)`).
  - Type-3 text, shading fills, image-mask groups, inline images and the
    solid-color mask path: each is wrapped in `#begin/#endKnockoutElement`.
  - `endDrawing` cleanup so cancelled rendering doesn't leak pooled
    canvases or stale knockout state.
2026-05-11 23:08:06 +02:00
..
2026-05-11 23:08:06 +02:00
2013-05-31 14:13:23 -07:00
2013-03-11 10:23:47 -07:00
2016-04-11 08:02:06 -05:00
2021-04-10 19:13:28 +02:00
2013-11-03 07:29:29 -06:00
2013-07-11 13:33:29 -05:00
2013-11-18 07:48:06 -06:00
2013-11-13 13:45:59 -06:00
2025-02-05 16:56:54 +01:00
2025-02-05 16:56:54 +01:00
2015-10-04 15:45:24 +02:00
2016-04-11 08:02:06 -05:00
2013-10-13 19:55:42 +03:00
2011-06-23 09:10:06 -07:00
2021-06-08 10:37:26 +02:00
2024-12-02 17:15:33 +01:00
2011-12-12 21:42:39 -06:00
2012-03-10 19:12:33 -08:00
2015-11-06 10:55:43 -06:00
2013-11-01 19:05:17 -05:00
2012-10-13 14:21:59 -05:00
2012-12-14 12:44:39 -08:00
2013-02-28 22:32:43 +02:00
2013-11-02 17:07:13 -05:00
2013-08-11 10:35:56 +02:00
2013-12-19 18:38:44 +01:00
2020-08-08 11:50:19 +02:00
2014-03-18 14:10:44 +01:00
2014-04-10 19:22:13 -05:00
2014-04-11 09:55:39 -07:00
2014-04-17 07:52:33 -05:00
2014-09-09 08:29:31 -05:00
2014-12-17 22:46:47 +01:00
2014-12-18 21:26:02 +01:00
2014-12-17 22:42:06 +01:00
2015-02-10 00:16:54 +01:00
2015-11-03 09:03:08 -06:00
2017-01-10 16:42:43 +00:00
2017-04-10 16:18:08 -07:00
2017-04-05 15:17:38 -07:00
2021-05-12 11:42:08 -07:00
2017-08-03 22:19:36 -07:00
2018-09-02 21:23:09 +02:00
2018-09-02 21:23:09 +02:00
2018-09-02 21:23:09 +02:00
2021-10-17 16:27:05 +02:00
2021-10-17 16:27:05 +02:00
2021-10-17 16:27:05 +02:00
2021-10-17 16:27:05 +02:00
2021-10-17 16:27:05 +02:00
2021-09-23 13:05:18 +02:00
2025-02-17 21:58:20 +01:00
2025-10-29 17:31:49 +01:00
2014-01-27 20:35:51 -06:00
2015-09-05 12:51:05 +02:00
2015-10-16 18:54:18 +02:00
2015-10-16 18:54:18 +02:00
2013-06-30 03:52:30 +05:30
2011-08-06 14:41:18 -07:00
2012-01-11 20:14:49 -06:00
2011-06-26 09:15:33 -05:00
2011-12-18 17:28:25 -08:00
2012-03-17 17:35:04 -05:00
2011-10-04 16:18:39 +01:00
2011-06-23 09:10:06 -07:00
2013-02-15 03:53:34 +09:00
2021-11-27 19:30:12 +01:00
2014-09-03 21:57:57 +02:00
2012-01-17 20:50:49 -08:00