use hidden ctx in CanvasState