don't depend on canvas directly
v2.0.0