@constructor

This gets called when there are "new points" to chart. This is generally the
case when the underlying data being charted has changed. It is _not_ called
in the common case that the user has zoomed or is panning the view.

The chart canvas has already been created by the Dygraph object. The
renderer simply gets a drawing context.

@param {Dygraph} dygraph The chart to which this renderer belongs.
@param {HTMLCanvasElement} element The &lt;canvas&gt; DOM element on which to draw.
@param {CanvasRenderingContext2D} elementContext The drawing context.
@param {DygraphLayout} layout The chart's DygraphLayout object.

TODO(danvk): remove the elementContext property.
function(dygraph, element, elementContext, layout) {
  this.dygraph_ = dygraph;

  this.layout = layout;
  this.element = element;
  this.elementContext = elementContext;

  this.height = dygraph.height_;
  this.width = dygraph.width_;

  // --- check whether everything is ok before we return
  if (!utils.isCanvasSupported(this.element)) {
    throw "Canvas is not supported.";
  }

  // internal state
  this.area = layout.getPlotArea();

  // Set up a clipping area for the canvas (and the interaction canvas).
  // This ensures that we don't overdraw.
  var ctx = this.dygraph_.canvas_ctx_;
  ctx.beginPath();
  ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h);
  ctx.clip();

  ctx = this.dygraph_.hidden_ctx_;
  ctx.beginPath();
  ctx.rect(this.area.x, this.area.y, this.area.w, this.area.h);
  ctx.clip();
}