)]}'
{
  "commit": "ddd1a2aacf62ee6e550b65b445d0ccdafe284e6a",
  "tree": "e2380a9580353284146c030f1297d90ab401c44a",
  "parents": [
    "8efe18ec7b52a02139844ffe71438c00de13037e"
  ],
  "author": {
    "name": "philter",
    "email": "hello@rive.app",
    "time": "Tue Aug 04 21:42:41 2026 +0000"
  },
  "committer": {
    "name": "philter",
    "email": "hello@rive.app",
    "time": "Tue Aug 04 21:42:41 2026 +0000"
  },
  "message": "feat: Allow clipping to shapes with path effects (#13356) 0c254772d2\nA ClippingShape built its clip from the source shape\u0027s raw composed geometry, so any path effect on the source\u0027s fill — trim, dash, or a scripted effect — was ignored. Clipping to a shape whose fill had been visibly modified used the unmodified path.\n\nThe clip now uses the aggregate of what the source shape\u0027s fills draw: each fill\u0027s post-effect path where it has an effect chain, the raw composed path otherwise, both where they\u0027re mixed.\n\nRuntime. ClippingShape::addFillPaths reads each fill\u0027s lastEffectPath — the result the paint already resolved in its own update, so nothing is evaluated twice. buildDependencies adds an edge from effected fills to the clip so it sorts after them, and ShapePaint::invalidateRendering recurses so the clip rebuilds when an effect invalidates.\n\nEditor. Effect resolution moves out of ShapePaint.render into a cached resolveEffectPath, which the clip reads during update and render reads after. This also fixes the chain re-running — and re-entering Lua — on every draw of every paint. Dirt is pushed to the composer\u0027s dependents explicitly: a Dart ShapePaint has no update pass to clear its own dirt, so addDirt\u0027s recursion stops propagating after the first call.\n\nStrokes don\u0027t participate — their effect output is a centerline, meaningless filled.\nAn effect resolving to empty (trim at 0) clips to nothing rather than falling back to the raw path.\nFill visibility and opacity don\u0027t gate the contribution, matching how clipping already ignores paints.\n\nCo-authored-by: Philip Chung \u003cphilterdesign@gmail.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8d01dc5fd214790919575b81ea940a55f3a2353c",
      "old_mode": 33188,
      "old_path": ".rive_head",
      "new_id": "37b556fa8809f175f837ab40c4407075bbc5f97e",
      "new_mode": 33188,
      "new_path": ".rive_head"
    },
    {
      "type": "modify",
      "old_id": "cab469d5a2d0b1cd1ef4221da0fb7ba140344159",
      "old_mode": 33188,
      "old_path": "include/rive/shapes/clipping_shape.hpp",
      "new_id": "ba96a17daca2adcb92c25f8b5374cba99cbe4178",
      "new_mode": 33188,
      "new_path": "include/rive/shapes/clipping_shape.hpp"
    },
    {
      "type": "modify",
      "old_id": "07c29cb94a07d4255c1372354390a76c83a218da",
      "old_mode": 33188,
      "old_path": "include/rive/shapes/paint/effects_container.hpp",
      "new_id": "1ff4fae1e61a1dde3c7747df2a3dc0e51a3311c7",
      "new_mode": 33188,
      "new_path": "include/rive/shapes/paint/effects_container.hpp"
    },
    {
      "type": "modify",
      "old_id": "6867bdff857eb0bf2d5891a76f1222bd83cd0fa8",
      "old_mode": 33188,
      "old_path": "include/rive/shapes/shape_paint_container.hpp",
      "new_id": "8174b34fccce35bd429e94cb56859a0fbd20cae6",
      "new_mode": 33188,
      "new_path": "include/rive/shapes/shape_paint_container.hpp"
    },
    {
      "type": "modify",
      "old_id": "413cb7cd7429c042bb2d4a894e79e70caae992c4",
      "old_mode": 33188,
      "old_path": "src/shapes/clipping_shape.cpp",
      "new_id": "4b4e3834411cd51d6c19593fc568fd819b7c8972",
      "new_mode": 33188,
      "new_path": "src/shapes/clipping_shape.cpp"
    },
    {
      "type": "modify",
      "old_id": "6975025c1aafd051d60f05bb2dc75b4df5e7e463",
      "old_mode": 33188,
      "old_path": "src/shapes/paint/shape_paint.cpp",
      "new_id": "42b8e13061666fcd88175557fb750bf792419510",
      "new_mode": 33188,
      "new_path": "src/shapes/paint/shape_paint.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1d2971d475319b677daf74e5d1562d30b0d685a3",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/assets/scripted_path_effect_clip.riv"
    },
    {
      "type": "modify",
      "old_id": "2cbd68d6e243d0b43f93b7f3c52084ed8f05d88a",
      "old_mode": 33188,
      "old_path": "tests/unit_tests/runtime/scripting/scripting_path_effect_test.cpp",
      "new_id": "8e1e1fbf758ee2095ca46e9a655f0de04f4c07f5",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/runtime/scripting/scripting_path_effect_test.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fde9e62680753428760fda81a449e2fa8c36a46f",
      "new_mode": 33188,
      "new_path": "tests/unit_tests/silvers/scripted_path_effect_clip.sriv"
    }
  ]
}
