1 // TODO strokeStyle for areaSegment?
  2 
  3 pv.SvgScene.area = function(scenes) {
  4   var e = scenes.$g.firstChild;
  5   if (!scenes.length) return e;
  6   var s = scenes[0];
  7 
  8   /* segmented */
  9   if (s.segmented) return this.areaSegment(scenes);
 10 
 11   /* visible */
 12   if (!s.visible) return e;
 13   var fill = pv.color(s.fillStyle), stroke = pv.color(s.strokeStyle);
 14   if (!fill.opacity && !stroke.opacity) return e;
 15 
 16   /* points */
 17   var p1 = "", p2 = "";
 18   for (var i = 0, j = scenes.length - 1; j >= 0; i++, j--) {
 19     var si = scenes[i], sj = scenes[j];
 20     p1 += si.left + "," + si.top + " ";
 21     p2 += (sj.left + sj.width) + "," + (sj.top + sj.height) + " ";
 22 
 23     /* interpolate (assume linear by default) */
 24     if (i < scenes.length - 1) {
 25       var sk = scenes[i + 1], sl = scenes[j - 1];
 26       switch (s.interpolate) {
 27         case "step-before": {
 28           p1 += si.left + "," + sk.top + " ";
 29           p2 += (sl.left + sl.width) + "," + (sj.top + sj.height) + " ";
 30           break;
 31         }
 32         case "step-after": {
 33           p1 += sk.left + "," + si.top + " ";
 34           p2 += (sj.left + sj.width) + "," + (sl.top + sl.height) + " ";
 35           break;
 36         }
 37       }
 38     }
 39   }
 40 
 41   e = this.expect("polygon", e);
 42   e.setAttribute("cursor", s.cursor);
 43   e.setAttribute("points", p1 + p2);
 44   var fill = pv.color(s.fillStyle);
 45   e.setAttribute("fill", fill.color);
 46   e.setAttribute("fill-opacity", fill.opacity);
 47   var stroke = pv.color(s.strokeStyle);
 48   e.setAttribute("stroke", stroke.color);
 49   e.setAttribute("stroke-opacity", stroke.opacity);
 50   e.setAttribute("stroke-width", s.lineWidth);
 51   return this.append(e, scenes, 0);
 52 };
 53 
 54 pv.SvgScene.areaSegment = function(scenes) {
 55   var e = scenes.$g.firstChild;
 56   for (var i = 0, n = scenes.length - 1; i < n; i++) {
 57     var s1 = scenes[i], s2 = scenes[i + 1];
 58 
 59     /* visible */
 60     if (!s1.visible || !s2.visible) continue;
 61     var fill = pv.color(s1.fillStyle), stroke = pv.color(s1.strokeStyle);
 62     if (!fill.opacity && !stroke.opacity) continue;
 63 
 64     /* points */
 65     var p = s1.left + "," + s1.top + " "
 66         + s2.left + "," + s2.top + " "
 67         + (s2.left + s2.width) + "," + (s2.top + s2.height) + " "
 68         + (s1.left + s1.width) + "," + (s1.top + s1.height);
 69 
 70     e = this.expect("polygon", e);
 71     e.setAttribute("cursor", s1.cursor);
 72     e.setAttribute("points", p);
 73     e.setAttribute("fill", fill.color);
 74     e.setAttribute("fill-opacity", fill.opacity);
 75     e.setAttribute("stroke", stroke.color);
 76     e.setAttribute("stroke-opacity", stroke.opacity);
 77     e.setAttribute("stroke-width", s1.lineWidth);
 78     e = this.append(e, scenes, i);
 79   }
 80   return e;
 81 };
 82