added canvas, still need performance tuning