rewrote with canvas based implementation