now uses a canvas for rendering