Nice and challenging.
Also please don't create a canvas every frame. Instead, create it once and just use setCanvas when drawing.