The information on the differences in the VT100 and VT220 is interesting – I’ll add an update regarding this.
I’ve been planning to do a somewhat accurate emulation in JS for years, but I get always distracted. What I would do was to generate activation values for the first two pixels of any stretch of “on” pixels and similarly an “off” flank of two pixles for any trailing stretches of pixels that are off, anytime the settings are changed. This way, there’s no additional load on the rendering process and we would still be adding simple pixel levels to the canvas. (E.g., add a ramp like 0.5, 0.95, 1.0, 0.34, 0.05, 0.0 for 1, 1, 1, 0, 0, 0.)