code: 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();
  }
docs: @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.