The issue was caused by handles not being written to the new mask spline shape: it was always written as (0, 0), which was making the handle calculation go wrong later on. Solved by allocating a temporary array of bezier points and calculating handles for them. While this is an extra array allocation it is only done for a small amount of points and it is not in the critical code path. Having this as an extra array helps to overcome a limitation of the current mask shape API. Additionally, disable the interpolation for the shape change: the spline is brand new, there is nothing to be interpolated there.