1 pv.SvgScene.label = function(scenes) {
  2   var e = scenes.$g.firstChild;
  3   for (var i = 0; i < scenes.length; i++) {
  4     var s = scenes[i];
  5 
  6     /* visible */
  7     if (!s.visible) continue;
  8     var fill = pv.color(s.textStyle);
  9     if (!fill.opacity) continue;
 10 
 11     /* text-baseline, text-align */
 12     var x = 0, y = 0, dy = 0, anchor = "start";
 13     switch (s.textBaseline) {
 14       case "middle": dy = ".35em"; break;
 15       case "top": dy = ".71em"; y = s.textMargin; break;
 16       case "bottom": y = "-" + s.textMargin; break;
 17     }
 18     switch (s.textAlign) {
 19       case "right": anchor = "end"; x = "-" + s.textMargin; break;
 20       case "center": anchor = "middle"; break;
 21       case "left": x = s.textMargin; break;
 22     }
 23 
 24     e = this.expect("text", e);
 25     e.setAttribute("pointer-events", "none");
 26     e.setAttribute("x", x);
 27     e.setAttribute("y", y);
 28     e.setAttribute("dy", dy);
 29     e.setAttribute("text-anchor", anchor);
 30     e.setAttribute("transform",
 31         "translate(" + s.left + "," + s.top + ")"
 32         + (s.textAngle ? " rotate(" + 180 * s.textAngle / Math.PI + ")" : ""));
 33     e.setAttribute("fill", fill.color);
 34     e.setAttribute("fill-opacity", fill.opacity);
 35     e.style.font = s.font;
 36     e.style.textShadow = s.textShadow;
 37     if (e.firstChild) e.firstChild.nodeValue = s.text;
 38     else e.appendChild(document.createTextNode(s.text));
 39     e = this.append(e, scenes, i);
 40   }
 41   return e;
 42 };
 43