title: Fabric.js: How to serialize clipTo objects since ToJSON does not work for it?
body: <p>Any guidance with jsfiddle example showing ClipTo serialization will be appreciated? Current ToJSON function does not work when trying to serialize clipped objects. See the ToJSON implementation at the bottom of the code. </p>
  
  <p>JSFiddle Link: <a href="http://jsfiddle.net/PromInc/ZxYCP/" rel="nofollow">http://jsfiddle.net/PromInc/ZxYCP/</a></p>
  
  <pre><code>var img01URL = 'https://www.google.com/images/srpr/logo4w.png';
  var img02URL = 'http://fabricjs.com/lib/pug.jpg';
  
  var canvas = new fabric.Canvas('c');
  
  // Note the use of the `originX` and `originY` properties, which we set
  // to 'left' and 'top', respectively. This makes the math in the `clipTo`
  // functions a little bit more straight-forward.
  var clipRect1 = new fabric.Rect({
      originX: 'left',
      originY: 'top',
      left: 180,
      top: 10,
      width: 200,
      height: 200,
      fill: '#DDD', /* use transparent for no fill */
      strokeWidth: 0,
      selectable: false
  });
  // We give these `Rect` objects a name property so the `clipTo` functions can
  // find the one by which they want to be clipped.
  clipRect1.set({
      clipFor: 'pug'
  });
  canvas.add(clipRect1);
  
  var clipRect2 = new fabric.Rect({
      originX: 'left',
      originY: 'top',
      left: 10,
      top: 10,
      width: 150,
      height: 150,
      fill: '#DDD', /* use transparent for no fill */
      strokeWidth: 0,
      selectable: false
  });
  // We give these `Rect` objects a name property so the `clipTo` functions can
  // find the one by which they want to be clipped.
  clipRect2.set({
      clipFor: 'logo'
  });
  canvas.add(clipRect2);
  
  function findByClipName(name) {
      return _(canvas.getObjects()).where({
              clipFor: name
          }).first()
  }
  
  // Since the `angle` property of the Image object is stored 
  // in degrees, we'll use this to convert it to radians.
  function degToRad(degrees) {
      return degrees * (Math.PI / 180);
  }
  
  var clipByName = function (ctx) {
      this.setCoords();
      var clipRect = findByClipName(this.clipName);
      var scaleXTo1 = (1 / this.scaleX);
      var scaleYTo1 = (1 / this.scaleY);
      ctx.save();
  
      var ctxLeft = -( this.width / 2 ) + clipRect.strokeWidth;
          var ctxTop = -( this.height / 2 ) + clipRect.strokeWidth;
          var ctxWidth = clipRect.width - clipRect.strokeWidth;
          var ctxHeight = clipRect.height - clipRect.strokeWidth;
  
      ctx.translate( ctxLeft, ctxTop );
  
      ctx.rotate(degToRad(this.angle * -1));
      ctx.scale(scaleXTo1, scaleYTo1);
      ctx.beginPath();
      ctx.rect(
          clipRect.left - this.oCoords.tl.x,
          clipRect.top - this.oCoords.tl.y,
          clipRect.width,
          clipRect.height
      );
      ctx.closePath();
      ctx.restore();
  }
  
  var pugImg = new Image();
  pugImg.onload = function (img) {    
      var pug = new fabric.Image(pugImg, {
          angle: 45,
          width: 500,
          height: 500,
          left: 230,
          top: 50,
          scaleX: 0.3,
          scaleY: 0.3,
          clipName: 'pug',
          clipTo: function(ctx) { 
              return _.bind(clipByName, pug)(ctx) 
          }
      });
      canvas.add(pug);
  };
  pugImg.src = img02URL;
  
  var logoImg = new Image();
  logoImg.onload = function (img) {    
      var logo = new fabric.Image(logoImg, {
          angle: 0,
          width: 550,
          height: 190,
          left: 50,
          top: 50,
          scaleX: 0.25,
          scaleY: 0.25,
          clipName: 'logo',
          clipTo: function(ctx) { 
              return _.bind(clipByName, logo)(ctx) 
          }
      });
      canvas.add(logo);
  };
  logoImg.src = img01URL;
  
  //convert to json
  var serialized=JSON.stringify(canvas); 
  
  canvas.clear();
  canvas.loadFromDatalessJSON(serialized);
  alert(serialized);
  </code></pre>