refactored to use canvas