Thanks for that link that was helpful. But it looks like spine Widget makes it pretty hard to use that technique because of the Widget.prototype.resize() method, which automatically resets the canvas's width and height properties back to the lower resolution. For example I set it to this to make it look sharp:
<canvas width="1000" height="1000" style="width: 500px; height: 500px;"/>
and the resize() method automatically kicks in and changes it down to:
<canvas width="500" height="500" style="width: 500px; height: 500px;"/>
making it look blurry again.
I can override the widget.resize method but then it gets called endlessly
maybe that's not a problem but it doesn't seem necessary.
In any case, Widget should make it easy to render a Spine object in retina quality. Maybe a "DPI: 2" option could set the canvas' dimensions to double the element's dimensions, and disable the auto-resize function?