I don't know what get_size is. Did you mean to use renpy.image_size() instead? That's what I used so I could see the demo.
E.g.
Instead of:
v = renpy.Render(get_size(self.mask)[0], get_size(self.mask)[1])
I swapped it with:
v = renpy.Render(*renpy.image_size(self.mask))
(That way it only calculates the size once too)
However, this is a very slow function, so I think it would be productive if you cached it. I tried caching it and I got a significantly more responsive UI.
Other than that and some few more things... Overall, this is very well done. It's a keeper.