I am trying to make a clone object on a canvas using fabric.js, when I make a clone of the original object, it will exactly put the clone, but when I make a clone of the previous clone object, this does not accurately place it in all directions.
Here is a demo link
HTML code
<canvas id="c" height="400" width="500"></canvas>
<button id="clone_left" name="left">Left</button>
<button id="clone_right" name="right">right</button>
<button id="clone_top" name="top">top</button>
<button id="clone_bottom" name="bottom">bottom</button>
Script
var canvas = new fabric.Canvas('c');
var text = new fabric.IText('Sample', {
left: 100,
top: 100,
fill: 'red'
});
canvas.add(text);
document.getElementById('clone_left').addEventListener('click', function (e) {
var obj = canvas.getActiveObject();
if(obj.type=='i-text')
{
if (fabric.util.getKlass(obj.type).async) {
obj.clone(function (clone) {
clone.set({left: clone.get('left') + 210});
canvas.add(clone);
});
} else {
var clone = obj.clone();
clone.set("angle", "180").set('flipY', true);
clone.set({top: clone.get('top') + 52});
canvas.add(clone);
canvas.renderAll();
}
}
});
document.getElementById('clone_right').addEventListener('click', function (e) {
var obj = canvas.getActiveObject();
if(obj.type=='i-text')
{
if (fabric.util.getKlass(obj.type).async) {
obj.clone(function (clone) {
clone.set({left: clone.get('left') + 210});
clone.set("angle", "180").set('flipY', true);
canvas.add(clone);
});
} else {
var clone = obj.clone();
clone.set({left: clone.get('left') + 250});
clone.set("angle", "180").set('flipY', true);
clone.set({top: clone.get('top') + 52});
canvas.add(clone);
}
}
});
document.getElementById('clone_top').addEventListener('click', function (e) {
var obj = canvas.getActiveObject();
if(obj.type=='i-text')
{
if (fabric.util.getKlass(obj.type).async) {
obj.clone(function (clone) {
clone.set("angle", "180").set('flipX', true);
clone.set({top: clone.get('top') - 135});
canvas.add(clone);
});
} else {
var clone = obj.clone();
clone.set({left: clone.get('left') + 120});
clone.set("angle", "180").set('flipX', true);
canvas.add(clone);
}
}
});
document.getElementById('clone_bottom').addEventListener('click', function (e) {
var obj = canvas.getActiveObject();
if(obj.type=='i-text')
{
if (fabric.util.getKlass(obj.type).async) {
obj.clone(function (clone) {
clone.set("angle", "-180").set('flipX', true);
clone.set({top: clone.get('top') + 135});
canvas.add(clone);
});
} else {
var clone = obj.clone();
clone.set("angle", "-180").set('flipX', true);
clone.set({top: clone.get('top') + 100});
clone.set({left: clone.get('left') + 120});
canvas.add(clone);
}
}
});
When I make a simple clone, it works well:

But when I make a clown of a cloned object, it looks like it is not in the exact position. Here you can see the clone object made at the bottom of the clone with a blue edge and a blue arrow representing the wrong position of this object, in fact I want the cloned object to be lower, like the cloned object.
