diff --git a/fabricjs/fabricjs-tests.ts b/fabricjs/fabricjs-tests.ts
index e59212d805..c3dfd8d6da 100644
--- a/fabricjs/fabricjs-tests.ts
+++ b/fabricjs/fabricjs-tests.ts
@@ -1,1065 +1,1063 @@
///
function sample1() {
- var canvas = new fabric.Canvas('c', {
- hoverCursor: 'pointer',
- selection: false,
+ var canvas = new fabric.Canvas('c', {
+ hoverCursor: 'pointer',
+ selection: false,
+ });
+
+ canvas.on('object:moving', function(e: fabric.IEvent) {
+ e.target.opacity = 0.5;
+ });
+ canvas.on('object:modified', function(e: fabric.IEvent) {
+ e.target.opacity = 1;
+ });
+
+ for (var i = 0, len = 15; i < len; i++) {
+ fabric.Image.fromURL('../assets/ladybug.png', function(img) {
+ img.set({
+ left: fabric.util.getRandomInt(0, 600),
+ top: fabric.util.getRandomInt(0, 500),
+ angle: fabric.util.getRandomInt(0, 90)
+ });
+
+ img.perPixelTargetFind = true;
+ // img.targetFindTolerance = 4;
+ img.hasControls = img.hasBorders = false;
+
+ img.scale(fabric.util.getRandomInt(50, 100) / 100);
+
+ canvas.add(img);
});
-
- canvas.on({
- 'object:moving': function (e) {
- (e.target).opacity = 0.5;
- },
- 'object:modified': function (e) {
- (e.target).opacity = 1;
- }
- });
-
- for (var i = 0, len = 15; i < len; i++) {
- fabric.Image.fromURL('../assets/ladybug.png', function (img) {
- img.set({
- left: fabric.util.getRandomInt(0, 600),
- top: fabric.util.getRandomInt(0, 500),
- angle: fabric.util.getRandomInt(0, 90)
- });
-
- img.perPixelTargetFind = true;
- // img.targetFindTolerance = 4;
- img.hasControls = img.hasBorders = false;
-
- img.scale(fabric.util.getRandomInt(50, 100) / 100);
-
- canvas.add(img);
- });
- }
+ }
}
function sample2() {
- var dot, i,
- t1, t2,
- startTimer = function () {
- t1 = new Date().getTime();
- return t1;
- },
- stopTimer = function () {
- t2 = new Date().getTime();
- return t2 - t1;
- },
- getRandomInt = fabric.util.getRandomInt,
- rainbow = ["#ffcc66", "#ccff66", "#66ccff", "#ff6fcf", "#ff6666"],
- rainbowEnd = rainbow.length - 1;
+ var dot, i,
+ t1, t2,
+ startTimer = function() {
+ t1 = new Date().getTime();
+ return t1;
+ },
+ stopTimer = function() {
+ t2 = new Date().getTime();
+ return t2 - t1;
+ },
+ getRandomInt = fabric.util.getRandomInt,
+ rainbow = ["#ffcc66", "#ccff66", "#66ccff", "#ff6fcf", "#ff6666"],
+ rainbowEnd = rainbow.length - 1;
- //
- // Rendering canvas #1
- //
- var canvas1 = new fabric.Canvas('c1', { backgroundColor: "#000" }),
- results1 = document.getElementById('results-c1');
+ //
+ // Rendering canvas #1
+ //
+ var canvas1 = new fabric.Canvas('c1', { backgroundColor: "#000" }),
+ results1 = document.getElementById('results-c1');
- startTimer();
- for (i = 100; i >= 0; i--) {
- dot = new fabric.Circle({
- left: getRandomInt(0, 400),
- top: getRandomInt(0, 350),
- radius: 3,
- fill: rainbow[getRandomInt(0, rainbowEnd)]
- });
- canvas1.add(dot);
- }
- results1.innerHTML = 'Regular rendering of 100 elements in ' + stopTimer() + 'ms';
+ startTimer();
+ for (i = 100; i >= 0; i--) {
+ dot = new fabric.Circle({
+ left: getRandomInt(0, 400),
+ top: getRandomInt(0, 350),
+ radius: 3,
+ fill: rainbow[getRandomInt(0, rainbowEnd)]
+ });
+ canvas1.add(dot);
+ }
+ results1.innerHTML = 'Regular rendering of 100 elements in ' + stopTimer() + 'ms';
- //
- // Rendering canvas #2
- //
- var canvas2 = new fabric.Canvas('c2', { backgroundColor: "#000", renderOnAddition: false }),
- results2 = document.getElementById('results-c2');
+ //
+ // Rendering canvas #2
+ //
+ var canvas2 = new fabric.Canvas('c2', { backgroundColor: "#000", renderOnAddition: false }),
+ results2 = document.getElementById('results-c2');
- startTimer();
- for (i = 1000; i >= 0; i--) {
- dot = new fabric.Circle({
- left: getRandomInt(0, 400),
- top: getRandomInt(0, 350),
- radius: 3,
- fill: rainbow[getRandomInt(0, rainbowEnd)]
- });
- canvas2.add(dot);
- }
- canvas2.renderAll(); // Note, calling renderAll() is important in this case
- results2.innerHTML = 'Rendering 1000 elements using canvas.renderOnAddition = false in ' + stopTimer() + 'ms';
+ startTimer();
+ for (i = 1000; i >= 0; i--) {
+ dot = new fabric.Circle({
+ left: getRandomInt(0, 400),
+ top: getRandomInt(0, 350),
+ radius: 3,
+ fill: rainbow[getRandomInt(0, rainbowEnd)]
+ });
+ canvas2.add(dot);
+ }
+ canvas2.renderAll(); // Note, calling renderAll() is important in this case
+ results2.innerHTML = 'Rendering 1000 elements using canvas.renderOnAddition = false in ' + stopTimer() + 'ms';
}
function sample3() {
- var $ = function (id) {return document.getElementById(id) };
+ var $ = function(id) { return document.getElementById(id) };
- function applyFilter(index, filter) {
- var obj = canvas.getActiveObject();
- obj.filters[index] = filter;
- obj.applyFilters(canvas.renderAll.bind(canvas));
- }
-
- function applyFilterValue(index, prop, value) {
- var obj = canvas.getActiveObject();
- if (obj.filters[index]) {
- obj.filters[index][prop] = value;
- obj.applyFilters(canvas.renderAll.bind(canvas));
- }
- }
-
- var canvas = new fabric.Canvas('c', { backgroundImage: '../lib/bg.png' }),
- f = fabric.Image.filters;
-
- canvas.on({
- 'object:selected': function () {
- fabric.util.toArray(document.getElementsByTagName('input')).forEach(function (el) { el.disabled = false; })
-
- var filters = ['grayscale', 'invert', 'remove-white', 'sepia', 'sepia2', 'brightness',
- 'noise', 'gradient-transparency', 'pixelate', 'blur', 'sharpen'];
-
- for (var i = 0; i < filters.length; i++) {
- var checkBox = $(filters[i]);
- var image = canvas.getActiveObject();
- checkBox.checked = !!image.filters[i];
- }
- },
- 'selection:cleared': function () {
- fabric.util.toArray(document.getElementsByTagName('input')).forEach(function (el) { el.disabled = true; })
+ function applyFilter(index, filter) {
+ var obj = canvas.getActiveObject();
+ obj.filters[index] = filter;
+ obj.applyFilters(canvas.renderAll.bind(canvas));
}
- });
- fabric.Image.fromURL('../assets/printio.png', function (img) {
- var oImg = img.set({ left: 300, top: 300, angle: -15 }).scale(0.9);
- canvas.add(oImg).renderAll();
- canvas.setActiveObject(oImg);
- });
+ function applyFilterValue(index, prop, value) {
+ var obj = canvas.getActiveObject();
+ if (obj.filters[index]) {
+ obj.filters[index][prop] = value;
+ obj.applyFilters(canvas.renderAll.bind(canvas));
+ }
+ }
- $('grayscale').onclick = function () {
- applyFilter(0, this.checked && new f.Grayscale());
- };
- $('invert').onclick = function () {
- applyFilter(1, this.checked && new f.Invert());
- };
- $('remove-white').onclick = function () {
- applyFilter(2, this.checked && new f.RemoveWhite({
- threshold: ($('remove-white-threshold')).value,
- distance: ($('remove-white-distance')).value
- }));
- };
- $('remove-white-threshold').onchange = function () {
- applyFilterValue(2, 'threshold', this.value);
- };
- $('remove-white-distance').onchange = function () {
- applyFilterValue(2, 'distance', this.value);
- };
- $('sepia').onclick = function () {
- applyFilter(3, this.checked && new f.Sepia());
- };
- $('sepia2').onclick = function () {
- applyFilter(4, this.checked && new f.Sepia2());
- };
- $('brightness').onclick = function () {
- applyFilter(5, this.checked && new f.Brightness({
- brightness: parseInt(($('brightness-value')).value, 10)
- }));
- };
- $('brightness-value').onchange = function () {
- applyFilterValue(5, 'brightness', parseInt(this.value, 10));
- };
- $('noise').onclick = function () {
- applyFilter(6, this.checked && new f.Noise({
- noise: parseInt(($('noise-value')).value, 10)
- }));
- };
- $('noise-value').onchange = function () {
- applyFilterValue(6, 'noise', parseInt(this.value, 10));
- };
- $('gradient-transparency').onclick = function () {
- applyFilter(7, this.checked && new f.GradientTransparency({
- threshold: parseInt(($('gradient-transparency-value')).value, 10)
- }));
- };
- $('gradient-transparency-value').onchange = function () {
- applyFilterValue(7, 'threshold', parseInt(this.value, 10));
- };
- $('pixelate').onclick = function () {
- applyFilter(8, this.checked && new f.Pixelate({
- blocksize: parseInt(($('pixelate-value')).value, 10)
- }));
- };
- $('pixelate-value').onchange = function () {
- applyFilterValue(8, 'blocksize', parseInt(this.value, 10));
- };
- $('blur').onclick = function () {
- applyFilter(9, this.checked && new f.Convolute({
- matrix: [1 / 9, 1 / 9, 1 / 9,
- 1 / 9, 1 / 9, 1 / 9,
- 1 / 9, 1 / 9, 1 / 9]
- }));
- };
- $('sharpen').onclick = function () {
- applyFilter(10, this.checked && new f.Convolute({
- matrix: [0, -1, 0,
- -1, 5, -1,
- 0, -1, 0]
- }));
- };
- $('emboss').onclick = function () {
- applyFilter(11, this.checked && new f.Convolute({
- matrix: [1, 1, 1,
- 1, 0.7, -1,
- -1, -1, -1]
- }));
- };
+ var canvas = new fabric.Canvas('c', { backgroundImage: '../lib/bg.png' }),
+ f = fabric.Image.filters;
+
+ canvas.on({
+ 'object:selected': function() {
+ fabric.util.toArray(document.getElementsByTagName('input')).forEach(function(el) { el.disabled = false; })
+
+ var filters = ['grayscale', 'invert', 'remove-white', 'sepia', 'sepia2', 'brightness',
+ 'noise', 'gradient-transparency', 'pixelate', 'blur', 'sharpen'];
+
+ for (var i = 0; i < filters.length; i++) {
+ var checkBox = $(filters[i]);
+ var image = canvas.getActiveObject();
+ checkBox.checked = !!image.filters[i];
+ }
+ },
+ 'selection:cleared': function() {
+ fabric.util.toArray(document.getElementsByTagName('input')).forEach(function(el) { el.disabled = true; })
+ }
+ });
+
+ fabric.Image.fromURL('../assets/printio.png', function(img) {
+ var oImg = img.set({ left: 300, top: 300, angle: -15 }).scale(0.9);
+ canvas.add(oImg).renderAll();
+ canvas.setActiveObject(oImg);
+ });
+
+ $('grayscale').onclick = function() {
+ applyFilter(0, this.checked && new f.Grayscale());
+ };
+ $('invert').onclick = function() {
+ applyFilter(1, this.checked && new f.Invert());
+ };
+ $('remove-white').onclick = function() {
+ applyFilter(2, this.checked && new f.RemoveWhite({
+ threshold: parseInt(($('remove-white-threshold')).value),
+ distance: parseInt(($('remove-white-distance')).value)
+ }));
+ };
+ $('remove-white-threshold').onchange = function() {
+ applyFilterValue(2, 'threshold', this.value);
+ };
+ $('remove-white-distance').onchange = function() {
+ applyFilterValue(2, 'distance', this.value);
+ };
+ $('sepia').onclick = function() {
+ applyFilter(3, this.checked && new f.Sepia());
+ };
+ $('sepia2').onclick = function() {
+ applyFilter(4, this.checked && new f.Sepia2());
+ };
+ $('brightness').onclick = function() {
+ applyFilter(5, this.checked && new f.Brightness({
+ brightness: parseInt(($('brightness-value')).value, 10)
+ }));
+ };
+ $('brightness-value').onchange = function() {
+ applyFilterValue(5, 'brightness', parseInt(this.value, 10));
+ };
+ $('noise').onclick = function() {
+ applyFilter(6, this.checked && new f.Noise({
+ noise: parseInt(($('noise-value')).value, 10)
+ }));
+ };
+ $('noise-value').onchange = function() {
+ applyFilterValue(6, 'noise', parseInt(this.value, 10));
+ };
+ $('gradient-transparency').onclick = function() {
+ applyFilter(7, this.checked && new f.GradientTransparency({
+ threshold: parseInt(($('gradient-transparency-value')).value, 10)
+ }));
+ };
+ $('gradient-transparency-value').onchange = function() {
+ applyFilterValue(7, 'threshold', parseInt(this.value, 10));
+ };
+ $('pixelate').onclick = function() {
+ applyFilter(8, this.checked && new f.Pixelate({
+ blocksize: parseInt(($('pixelate-value')).value, 10)
+ }));
+ };
+ $('pixelate-value').onchange = function() {
+ applyFilterValue(8, 'blocksize', parseInt(this.value, 10));
+ };
+ $('blur').onclick = function() {
+ applyFilter(9, this.checked && new f.Convolute({
+ matrix: [1 / 9, 1 / 9, 1 / 9,
+ 1 / 9, 1 / 9, 1 / 9,
+ 1 / 9, 1 / 9, 1 / 9]
+ }));
+ };
+ $('sharpen').onclick = function() {
+ applyFilter(10, this.checked && new f.Convolute({
+ matrix: [0, -1, 0,
+ -1, 5, -1,
+ 0, -1, 0]
+ }));
+ };
+ $('emboss').onclick = function() {
+ applyFilter(11, this.checked && new f.Convolute({
+ matrix: [1, 1, 1,
+ 1, 0.7, -1,
+ -1, -1, -1]
+ }));
+ };
}
function sample4() {
- var canvas = new fabric.Canvas('c');
- var $ = function (id) { return document.getElementById(id); };
+ var canvas = new fabric.Canvas('c');
+ var $ = function(id) { return document.getElementById(id); };
- var rect = new fabric.Rect({
- width: 100,
- height: 100,
- top: 150,
- left: 150,
- fill: 'rgba(255,0,0,0.5)'
- });
+ var rect = new fabric.Rect({
+ width: 100,
+ height: 100,
+ top: 150,
+ left: 150,
+ fill: 'rgba(255,0,0,0.5)'
+ });
- canvas.add(rect);
+ canvas.add(rect);
- var angleControl = $('angle-control');
- angleControl.onchange = function () {
- rect.setAngle(this.value).setCoords();
- canvas.renderAll();
- };
+ var angleControl = $('angle-control');
+ angleControl.onchange = function() {
+ rect.setAngle(this.value).setCoords();
+ canvas.renderAll();
+ };
- var scaleControl = $('scale-control');
- scaleControl.onchange = function () {
- rect.scale(this.value).setCoords();
- canvas.renderAll();
- };
+ var scaleControl = $('scale-control');
+ scaleControl.onchange = function() {
+ rect.scale(this.value).setCoords();
+ canvas.renderAll();
+ };
- var topControl = $('top-control');
- topControl.onchange = function () {
- rect.setTop(this.value).setCoords();
- canvas.renderAll();
- };
+ var topControl = $('top-control');
+ topControl.onchange = function() {
+ rect.setTop(this.value).setCoords();
+ canvas.renderAll();
+ };
- var leftControl = $('left-control');
- leftControl.onchange = function () {
- rect.setLeft(this.value).setCoords();
- canvas.renderAll();
- };
+ var leftControl = $('left-control');
+ leftControl.onchange = function() {
+ rect.setLeft(this.value).setCoords();
+ canvas.renderAll();
+ };
- function updateControls() {
+ function updateControls() {
- scaleControl.value = rect.getScaleX().toString();
- angleControl.value = rect.getAngle().toString();
- leftControl.value = rect.getLeft().toString();
- topControl.value = rect.getTop().toString();
- }
- canvas.on({
- 'object:moving': updateControls,
- 'object:scaling': updateControls,
- 'object:resizing': updateControls
- });
+ scaleControl.value = rect.getScaleX().toString();
+ angleControl.value = rect.getAngle().toString();
+ leftControl.value = rect.getLeft().toString();
+ topControl.value = rect.getTop().toString();
+ }
+ canvas.on({
+ 'object:moving': updateControls,
+ 'object:scaling': updateControls,
+ 'object:resizing': updateControls
+ });
}
module fabric {
- export interface CircleWithLineInfos extends ICircle {
- line1?: ILine;
- line2?: ILine;
- line3?: ILine;
- line4?: ILine;
- }
+ export interface CircleWithLineInfos extends ICircle {
+ line1?: ILine;
+ line2?: ILine;
+ line3?: ILine;
+ line4?: ILine;
+ }
}
function sample5() {
- var makeCircle = function (left: number, top: number, line1?: fabric.ILine, line2?: fabric.ILine, line3?: fabric.ILine, line4?: fabric.ILine): fabric.ICircle {
- var c = new fabric.Circle({
- left: left,
- top: top,
- strokeWidth: 5,
- radius: 12,
- fill: '#fff',
- stroke: '#666'
- });
-
- c.line1 = line1;
- c.line2 = line2;
- c.line3 = line3;
- c.line4 = line4;
- c.hasControls = c.hasBorders = false;
- return c;
- }
-
-function makeLine(coords: number[]) {
- return new fabric.Line(coords, {
- fill: 'red',
- strokeWidth: 5,
- selectable: false
- });
- }
-
- var canvas = new fabric.Canvas('c', { selection: false });
-
- var line = makeLine([250, 125, 250, 175]),
- line2 = makeLine([250, 175, 250, 250]),
- line3 = makeLine([250, 250, 300, 350]),
- line4 = makeLine([250, 250, 200, 350]),
- line5 = makeLine([250, 175, 175, 225]),
- line6 = makeLine([250, 175, 325, 225]);
-
- canvas.add(line, line2, line3, line4, line5, line6);
-
- canvas.add(
- makeCircle(line.x1, line.y1, null, line),
- makeCircle(line.x2, line.y2, line, line2, line5, line6),
- makeCircle(line2.x2, line2.y2, line2, line3, line4),
- makeCircle(line3.x2, line3.y2, line3),
- makeCircle(line4.x2, line4.y2, line4),
- makeCircle(line5.x2, line5.y2, line5),
- makeCircle(line6.x2, line6.y2, line6)
- );
-
- canvas.on('object:moving', function (e) {
- var p = e.target;
- p.line1 && p.line1.set({ 'x2': p.left, 'y2': p.top });
- p.line2 && p.line2.set({ 'x1': p.left, 'y1': p.top });
- p.line3 && p.line3.set({ 'x1': p.left, 'y1': p.top });
- p.line4 && p.line4.set({ 'x1': p.left, 'y1': p.top });
- canvas.renderAll();
+ var makeCircle = function(left: number, top: number, line1?: fabric.ILine, line2?: fabric.ILine, line3?: fabric.ILine, line4?: fabric.ILine): fabric.ICircle {
+ var c = new fabric.Circle({
+ left: left,
+ top: top,
+ strokeWidth: 5,
+ radius: 12,
+ fill: '#fff',
+ stroke: '#666'
});
+
+ c.line1 = line1;
+ c.line2 = line2;
+ c.line3 = line3;
+ c.line4 = line4;
+ c.hasControls = c.hasBorders = false;
+ return c;
+ }
+
+ function makeLine(coords: number[]) {
+ return new fabric.Line(coords, {
+ fill: 'red',
+ strokeWidth: 5,
+ selectable: false
+ });
+ }
+
+ var canvas = new fabric.Canvas('c', { selection: false });
+
+ var line = makeLine([250, 125, 250, 175]),
+ line2 = makeLine([250, 175, 250, 250]),
+ line3 = makeLine([250, 250, 300, 350]),
+ line4 = makeLine([250, 250, 200, 350]),
+ line5 = makeLine([250, 175, 175, 225]),
+ line6 = makeLine([250, 175, 325, 225]);
+
+ canvas.add(line, line2, line3, line4, line5, line6);
+
+ canvas.add(
+ makeCircle(line.x1, line.y1, null, line),
+ makeCircle(line.x2, line.y2, line, line2, line5, line6),
+ makeCircle(line2.x2, line2.y2, line2, line3, line4),
+ makeCircle(line3.x2, line3.y2, line3),
+ makeCircle(line4.x2, line4.y2, line4),
+ makeCircle(line5.x2, line5.y2, line5),
+ makeCircle(line6.x2, line6.y2, line6)
+ );
+
+ canvas.on('object:moving', function(e) {
+ var p = e.target;
+ p.line1 && p.line1.set({ 'x2': p.left, 'y2': p.top });
+ p.line2 && p.line2.set({ 'x1': p.left, 'y1': p.top });
+ p.line3 && p.line3.set({ 'x1': p.left, 'y1': p.top });
+ p.line4 && p.line4.set({ 'x1': p.left, 'y1': p.top });
+ canvas.renderAll();
+ });
}
function sample6() {
- var canvas = new fabric.Canvas('c');
- fabric.loadSVGFromURL('../assets/135.svg', function (objects) {
- var obj = objects[0].scale(0.25);
- canvas.centerObject(obj);
- canvas.add(obj);
+ var canvas = new fabric.Canvas('c');
+ fabric.loadSVGFromURL('../assets/135.svg', function(objects) {
+ var obj = objects[0].scale(0.25);
+ canvas.centerObject(obj);
+ canvas.add(obj);
- canvas.add(obj.clone().set({ left: 100, top: 100, angle: -15 }));
- canvas.add(obj.clone().set({ left: 480, top: 100, angle: 15 }));
- canvas.add(obj.clone().set({ left: 100, top: 400, angle: -15 }));
- canvas.add(obj.clone().set({ left: 480, top: 400, angle: 15 }));
+ canvas.add(obj.clone(() => {}).set({ left: 100, top: 100, angle: -15 }));
+ canvas.add(obj.clone(() => {}).set({ left: 480, top: 100, angle: 15 }));
+ canvas.add(obj.clone(() => {}).set({ left: 100, top: 400, angle: -15 }));
+ canvas.add(obj.clone(() => {}).set({ left: 480, top: 400, angle: 15 }));
- canvas.on('mouse:move', function (options) {
- var p = canvas.getPointer(options.e);
+ canvas.on('mouse:move', function(options) {
+ var p = canvas.getPointer(options.e);
- canvas.forEachObject(function (obj) {
- var distX = Math.abs(p.x - obj.left),
- distY = Math.abs(p.y - obj.top),
- dist = Math.round(Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2)));
- obj.setOpacity(1 / (dist / 20));
- });
-
- });
+ canvas.forEachObject(function(obj) {
+ var distX = Math.abs(p.x - obj.left),
+ distY = Math.abs(p.y - obj.top),
+ dist = Math.round(Math.sqrt(Math.pow(distX, 2) + Math.pow(distY, 2)));
+ obj.setOpacity(1 / (dist / 20));
+ });
});
+
+ });
}
module fabric {
- export interface ImageWithInfo extends IImage {
- movingLeft: boolean;
- }
+ export interface ImageWithInfo extends IImage {
+ movingLeft: boolean;
+ }
}
function sample7() {
- var canvas = new fabric.Canvas('c', { selection: false });
+ var canvas = new fabric.Canvas('c', { selection: false });
- setInterval(function () {
- fabric.Image.fromURL('../assets/ladybug.png', function (obj) {
- var img = obj;
- img.set('left', fabric.util.getRandomInt(200, 600)).set('top', -50);
- img.movingLeft = !!Math.round(Math.random());
- canvas.add(img);
- });
- }, 1000);
-
-
- var animate = (function animate() {
- canvas.forEachObject(function (obj) {
- var img = obj;
- img.left += (img.movingLeft ? -1 : 1);
- img.top += 1;
- if (img.left > 900 || img.top > 500) {
- canvas.remove(img);
- }
- else {
- img.setAngle(img.getAngle() + 2);
- }
- });
- canvas.renderAll();
- window.requestAnimationFrame(animate);
+ setInterval(function() {
+ fabric.Image.fromURL('../assets/ladybug.png', function(obj) {
+ var img = obj;
+ img.set('left', fabric.util.getRandomInt(200, 600)).set('top', -50);
+ img.movingLeft = !!Math.round(Math.random());
+ canvas.add(img);
});
+ }, 1000);
- animate();
+
+ var animate = (function animate() {
+ canvas.forEachObject(function(obj) {
+ var img = obj;
+ img.left += (img.movingLeft ? -1 : 1);
+ img.top += 1;
+ if (img.left > 900 || img.top > 500) {
+ canvas.remove(img);
+ }
+ else {
+ img.setAngle(img.getAngle() + 2);
+ }
+ });
+ canvas.renderAll();
+ window.requestAnimationFrame(animate);
+ });
+
+ animate();
}
function sample8() {
- function pad(str: string, length: number): string {
- while (str.length < length) {
- str = '0' + str;
- }
- return str;
- };
+ function pad(str: string, length: number): string {
+ while (str.length < length) {
+ str = '0' + str;
+ }
+ return str;
+ };
- var getRandomInt = fabric.util.getRandomInt;
+ var getRandomInt = fabric.util.getRandomInt;
- function getRandomColor() {
- return (
- pad(getRandomInt(0, 255).toString(16), 2) +
- pad(getRandomInt(0, 255).toString(16), 2) +
- pad(getRandomInt(0, 255).toString(16), 2)
- );
+ function getRandomColor() {
+ return (
+ pad(getRandomInt(0, 255).toString(16), 2) +
+ pad(getRandomInt(0, 255).toString(16), 2) +
+ pad(getRandomInt(0, 255).toString(16), 2)
+ );
+ }
+
+ function getRandomNum(min: number, max: number): number {
+ return Math.random() * (max - min) + min;
+ }
+
+ if (/(iPhone|iPod|iPad)/i.test(navigator.userAgent)) {
+ fabric.Object.prototype.cornersize = 30;
+ }
+
+ var canvas = new fabric.Canvas('canvas');
+ // canvas.controlsAboveOverlay = true;
+
+ function updateComplexity() {
+ setTimeout(function() {
+ var element = document.getElementById('complexity').childNodes[1];
+ element.innerHTML = ' ' + canvas.complexity();
+ }, 100);
+ }
+
+ document.getElementById('commands').onclick = function(ev: any) {
+ var ev: any = ev || window.event;
+
+ if (ev.preventDefault) {
+ ev.preventDefault()
+ }
+ else if (ev.returnValue) {
+ ev.returnValue = false;
}
- function getRandomNum(min: number, max: number): number {
- return Math.random() * (max - min) + min;
+ var element: any = ev.target || ev.srcElement;
+ if (element.nodeName.toLowerCase() === 'strong') {
+ element = element.parentNode;
}
- if (/(iPhone|iPod|iPad)/i.test(navigator.userAgent)) {
- fabric.Object.prototype.cornersize = 30;
- }
-
- var canvas = new fabric.Canvas('canvas');
- // canvas.controlsAboveOverlay = true;
-
- function updateComplexity() {
- setTimeout(function () {
- var element = document.getElementById('complexity').childNodes[1];
- element.innerHTML = ' ' + canvas.complexity();
- }, 100);
- }
-
- document.getElementById('commands').onclick = function (ev: any) {
- var ev: any = ev || window.event;
-
- if (ev.preventDefault) {
- ev.preventDefault()
- }
- else if (ev.returnValue) {
- ev.returnValue = false;
- }
-
- var element: any = ev.target || ev.srcElement;
- if (element.nodeName.toLowerCase() === 'strong') {
- element = element.parentNode;
- }
-
- var className = element.className,
- offset = 50,
- left = fabric.util.getRandomInt(0 + offset, 700 - offset),
- top = fabric.util.getRandomInt(0 + offset, 500 - offset),
- angle = fabric.util.getRandomInt(-20, 40),
- width = fabric.util.getRandomInt(30, 50),
- opacity = (function (min, max) { return Math.random() * (max - min) + min; })(0.5, 1);
+ var className = element.className,
+ offset = 50,
+ left = fabric.util.getRandomInt(0 + offset, 700 - offset),
+ top = fabric.util.getRandomInt(0 + offset, 500 - offset),
+ angle = fabric.util.getRandomInt(-20, 40),
+ width = fabric.util.getRandomInt(30, 50),
+ opacity = (function(min, max) { return Math.random() * (max - min) + min; })(0.5, 1);
- switch (className) {
- case 'rect':
- canvas.add(new fabric.Rect({
- left: left,
- top: top,
- fill: '#' + getRandomColor(),
- width: 50,
- height: 50,
- opacity: 0.8
- }));
- break;
+ switch (className) {
+ case 'rect':
+ canvas.add(new fabric.Rect({
+ left: left,
+ top: top,
+ fill: '#' + getRandomColor(),
+ width: 50,
+ height: 50,
+ opacity: 0.8
+ }));
+ break;
- case 'circle':
- canvas.add(new fabric.Circle({
- left: left,
- top: top,
- fill: '#' + getRandomColor(),
- radius: 50,
- opacity: 0.8
- }));
- break;
+ case 'circle':
+ canvas.add(new fabric.Circle({
+ left: left,
+ top: top,
+ fill: '#' + getRandomColor(),
+ radius: 50,
+ opacity: 0.8
+ }));
+ break;
- case 'triangle':
- canvas.add(new fabric.Triangle({
- left: left,
- top: top,
- fill: '#' + getRandomColor(),
- width: 50,
- height: 50,
- opacity: 0.8
- }));
- break;
+ case 'triangle':
+ canvas.add(new fabric.Triangle({
+ left: left,
+ top: top,
+ fill: '#' + getRandomColor(),
+ width: 50,
+ height: 50,
+ opacity: 0.8
+ }));
+ break;
- case 'image1':
- fabric.Image.fromURL('../assets/pug.jpg', function (image) {
- image.set({
- left: left,
- top: top,
- angle: angle,
- padding: 10,
- cornersize: 10
- });
- image.scale(getRandomNum(0.1, 0.25)).setCoords();
- canvas.add(image);
- });
- break;
+ case 'image1':
+ fabric.Image.fromURL('../assets/pug.jpg', function(image) {
+ image.set({
+ left: left,
+ top: top,
+ angle: angle,
+ padding: 10,
+ cornersize: 10
+ });
+ image.scale(getRandomNum(0.1, 0.25)).setCoords();
+ canvas.add(image);
+ });
+ break;
- case 'image2':
- fabric.Image.fromURL('../assets/logo.png', function (image) {
- image.set({
- left: left,
- top: top,
- angle: angle,
- padding: 10,
- cornersize: 10
- });
- image.scale(getRandomNum(0.1, 1)).setCoords();
- canvas.add(image);
- updateComplexity();
- });
- break;
+ case 'image2':
+ fabric.Image.fromURL('../assets/logo.png', function(image) {
+ image.set({
+ left: left,
+ top: top,
+ angle: angle,
+ padding: 10,
+ cornersize: 10
+ });
+ image.scale(getRandomNum(0.1, 1)).setCoords();
+ canvas.add(image);
+ updateComplexity();
+ });
+ break;
- case 'shape':
- var id = element.id, match;
- if (match = /\d+$/.exec(id)) {
- fabric.loadSVGFromURL('../assets/' + match[0] + '.svg', function (objects, options) {
- var loadedObject = fabric.util.groupSVGElements(objects, options);
+ case 'shape':
+ var id = element.id, match;
+ if (match = /\d+$/.exec(id)) {
+ fabric.loadSVGFromURL('../assets/' + match[0] + '.svg', function(objects, options) {
+ var loadedObject = fabric.util.groupSVGElements(objects, options);
- loadedObject.set({
- left: left,
- top: top,
- angle: angle,
- padding: 10,
- cornersize: 10
- });
- loadedObject/*.scaleToWidth(300)*/.setCoords();
-
- // loadedObject.hasRotatingPoint = true;
-
- canvas.add(loadedObject);
- updateComplexity();
- canvas.calcOffset();
- });
- }
- break;
-
- case 'clear':
- if (confirm('Are you sure?')) {
- canvas.clear();
- }
- }
- updateComplexity();
- };
-
- document.getElementById('execute').onclick = function () {
- var code = (document.getElementById('canvas-console')).value;
- if (!(/^\s+$/).test(code)) {
- eval(code);
- }
- };
-
-
- document.getElementById('rasterize').onclick = function () {
- if (!fabric.Canvas.supports('toDataURL')) {
- alert('This browser doesn\'t provide means to serialize canvas to an image');
- }
- else {
- window.open(canvas.toDataURL('png'));
- }
- };
-
- var removeSelectedEl = document.getElementById('remove-selected');
- removeSelectedEl.onclick = function () {
- var activeObject = canvas.getActiveObject(),
- activeGroup = canvas.getActiveGroup();
- if (activeObject) {
- canvas.remove(activeObject);
- }
- else if (activeGroup) {
- var objectsInGroup = activeGroup.getObjects();
- canvas.discardActiveGroup();
- objectsInGroup.forEach(function (object) {
- canvas.remove(object);
+ loadedObject.set({
+ left: left,
+ top: top,
+ angle: angle,
+ padding: 10,
+ cornersize: 10
});
- }
- };
+ loadedObject/*.scaleToWidth(300)*/.setCoords();
- var supportsInputOfType = function (type) {
- return function () {
- var el = document.createElement('input');
- try {
- el.type = type;
- }
- catch (err) { }
- return el.type === type;
- };
- };
-
- var supportsSlider = supportsInputOfType('range'),
- supportsColorpicker = supportsInputOfType('color');
-
- if (supportsSlider()) {
- (function () {
- var controls = document.getElementById('controls');
-
- var sliderLabel = document.createElement('label');
- sliderLabel.htmlFor = 'opacity';
- sliderLabel.innerHTML = 'Opacity: ';
-
- var slider = document.createElement('input');
-
- try { slider.type = 'range'; } catch (err) { }
-
- slider.id = 'opacity';
- slider.value = "100";
-
- controls.appendChild(sliderLabel);
- controls.appendChild(slider);
+ // loadedObject.hasRotatingPoint = true;
+ canvas.add(loadedObject);
+ updateComplexity();
canvas.calcOffset();
+ });
+ }
+ break;
- slider.onchange = function () {
- var activeObject = canvas.getActiveObject(),
- activeGroup = canvas.getActiveGroup();
-
- if (activeObject || activeGroup) {
- (activeObject || activeGroup).setOpacity(parseInt(this.value, 10) / 100);
- canvas.renderAll();
- }
- };
- })();
+ case 'clear':
+ if (confirm('Are you sure?')) {
+ canvas.clear();
+ }
}
+ updateComplexity();
+ };
- if (supportsColorpicker()) {
- (function () {
- var controls = document.getElementById('controls');
-
- var label = document.createElement('label');
- label.htmlFor = 'color';
- label.innerHTML = 'Color: ';
- label.style.marginLeft = '10px';
-
- var colorpicker = document.createElement('input');
- colorpicker.type = 'color';
- colorpicker.id = 'color';
- colorpicker.style.width = '40px';
-
- controls.appendChild(label);
- controls.appendChild(colorpicker);
-
- canvas.calcOffset();
-
- colorpicker.onchange = function () {
- var activeObject = canvas.getActiveObject(),
- activeGroup = canvas.getActiveGroup();
-
- if (activeObject || activeGroup) {
- (activeObject || activeGroup).setFill(this.value);
- canvas.renderAll();
- }
- };
- })();
+ document.getElementById('execute').onclick = function() {
+ var code = (document.getElementById('canvas-console')).value;
+ if (!(/^\s+$/).test(code)) {
+ eval(code);
}
+ };
- var lockHorizontallyEl = document.getElementById('lock-horizontally');
- lockHorizontallyEl.onclick = function () {
- var activeObject: any = canvas.getActiveObject();
- if (activeObject) {
- activeObject.lockMovementX = !activeObject.lockMovementX;
- lockHorizontallyEl.innerHTML = activeObject.lockMovementX
- ? 'Unlock horizontal movement'
- : 'Lock horizontal movement';
- }
- };
- var lockVerticallyEl = document.getElementById('lock-vertically');
- lockVerticallyEl.onclick = function () {
- var activeObject: any = canvas.getActiveObject();
- if (activeObject) {
- activeObject.lockMovementY = !activeObject.lockMovementY;
- lockVerticallyEl.innerHTML = activeObject.lockMovementY
- ? 'Unlock vertical movement'
- : 'Lock vertical movement';
- }
- };
-
- var lockScalingXEl = document.getElementById('lock-scaling-x');
- lockScalingXEl.onclick = function () {
- var activeObject: any = canvas.getActiveObject();
- if (activeObject) {
- activeObject.lockScalingX = !activeObject.lockScalingX;
- lockScalingXEl.innerHTML = activeObject.lockScalingX
- ? 'Unlock horizontal scaling'
- : 'Lock horizontal scaling';
- }
- };
-
- var lockScalingYEl = document.getElementById('lock-scaling-y');
- lockScalingYEl.onclick = function () {
- var activeObject: any = canvas.getActiveObject();
- if (activeObject) {
- activeObject.lockScalingY = !activeObject.lockScalingY;
- lockScalingYEl.innerHTML = activeObject.lockScalingY
- ? 'Unlock vertical scaling'
- : 'Lock vertical scaling';
- }
- };
-
- var lockRotationEl = document.getElementById('lock-rotation');
- lockRotationEl.onclick = function () {
- var activeObject: any = canvas.getActiveObject();
- if (activeObject) {
- activeObject.lockRotation = !activeObject.lockRotation;
- lockRotationEl.innerHTML = activeObject.lockRotation
- ? 'Unlock rotation'
- : 'Lock rotation';
- }
- };
-
- var gradientifyBtn = document.getElementById('gradientify');
-
- var activeObjectButtons = [
- lockHorizontallyEl,
- lockVerticallyEl,
- lockScalingXEl,
- lockScalingYEl,
- lockRotationEl,
- removeSelectedEl,
- gradientifyBtn
- ];
-
- var opacityEl = document.getElementById('opacity');
- if (opacityEl) {
- activeObjectButtons.push(opacityEl);
+ document.getElementById('rasterize').onclick = function() {
+ if (!fabric.Canvas.supports('toDataURL')) {
+ alert('This browser doesn\'t provide means to serialize canvas to an image');
}
- var colorEl = document.getElementById('color');
- if (colorEl) {
- activeObjectButtons.push(colorEl);
+ else {
+ window.open(canvas.toDataURL('png'));
}
+ };
+
+ var removeSelectedEl = document.getElementById('remove-selected');
+ removeSelectedEl.onclick = function() {
+ var activeObject = canvas.getActiveObject(),
+ activeGroup = canvas.getActiveGroup();
+ if (activeObject) {
+ canvas.remove(activeObject);
+ }
+ else if (activeGroup) {
+ var objectsInGroup = activeGroup.getObjects();
+ canvas.discardActiveGroup();
+ objectsInGroup.forEach(function(object) {
+ canvas.remove(object);
+ });
+ }
+ };
+
+ var supportsInputOfType = function(type) {
+ return function() {
+ var el = document.createElement('input');
+ try {
+ el.type = type;
+ }
+ catch (err) { }
+ return el.type === type;
+ };
+ };
+
+ var supportsSlider = supportsInputOfType('range'),
+ supportsColorpicker = supportsInputOfType('color');
+
+ if (supportsSlider()) {
+ (function() {
+ var controls = document.getElementById('controls');
+
+ var sliderLabel = document.createElement('label');
+ sliderLabel.htmlFor = 'opacity';
+ sliderLabel.innerHTML = 'Opacity: ';
+
+ var slider = document.createElement('input');
+
+ try { slider.type = 'range'; } catch (err) { }
+
+ slider.id = 'opacity';
+ slider.value = "100";
+
+ controls.appendChild(sliderLabel);
+ controls.appendChild(slider);
+
+ canvas.calcOffset();
+
+ slider.onchange = function() {
+ var activeObject = canvas.getActiveObject(),
+ activeGroup = canvas.getActiveGroup();
+
+ if (activeObject || activeGroup) {
+ (activeObject || activeGroup).setOpacity(parseInt(this.value, 10) / 100);
+ canvas.renderAll();
+ }
+ };
+ })();
+ }
+
+ if (supportsColorpicker()) {
+ (function() {
+ var controls = document.getElementById('controls');
+
+ var label = document.createElement('label');
+ label.htmlFor = 'color';
+ label.innerHTML = 'Color: ';
+ label.style.marginLeft = '10px';
+
+ var colorpicker = document.createElement('input');
+ colorpicker.type = 'color';
+ colorpicker.id = 'color';
+ colorpicker.style.width = '40px';
+
+ controls.appendChild(label);
+ controls.appendChild(colorpicker);
+
+ canvas.calcOffset();
+
+ colorpicker.onchange = function() {
+ var activeObject = canvas.getActiveObject(),
+ activeGroup = canvas.getActiveGroup();
+
+ if (activeObject || activeGroup) {
+ (activeObject || activeGroup).setFill(this.value);
+ canvas.renderAll();
+ }
+ };
+ })();
+ }
+
+ var lockHorizontallyEl = document.getElementById('lock-horizontally');
+ lockHorizontallyEl.onclick = function() {
+ var activeObject: any = canvas.getActiveObject();
+ if (activeObject) {
+ activeObject.lockMovementX = !activeObject.lockMovementX;
+ lockHorizontallyEl.innerHTML = activeObject.lockMovementX
+ ? 'Unlock horizontal movement'
+ : 'Lock horizontal movement';
+ }
+ };
+
+ var lockVerticallyEl = document.getElementById('lock-vertically');
+ lockVerticallyEl.onclick = function() {
+ var activeObject: any = canvas.getActiveObject();
+ if (activeObject) {
+ activeObject.lockMovementY = !activeObject.lockMovementY;
+ lockVerticallyEl.innerHTML = activeObject.lockMovementY
+ ? 'Unlock vertical movement'
+ : 'Lock vertical movement';
+ }
+ };
+
+ var lockScalingXEl = document.getElementById('lock-scaling-x');
+ lockScalingXEl.onclick = function() {
+ var activeObject: any = canvas.getActiveObject();
+ if (activeObject) {
+ activeObject.lockScalingX = !activeObject.lockScalingX;
+ lockScalingXEl.innerHTML = activeObject.lockScalingX
+ ? 'Unlock horizontal scaling'
+ : 'Lock horizontal scaling';
+ }
+ };
+
+ var lockScalingYEl = document.getElementById('lock-scaling-y');
+ lockScalingYEl.onclick = function() {
+ var activeObject: any = canvas.getActiveObject();
+ if (activeObject) {
+ activeObject.lockScalingY = !activeObject.lockScalingY;
+ lockScalingYEl.innerHTML = activeObject.lockScalingY
+ ? 'Unlock vertical scaling'
+ : 'Lock vertical scaling';
+ }
+ };
+
+ var lockRotationEl = document.getElementById('lock-rotation');
+ lockRotationEl.onclick = function() {
+ var activeObject: any = canvas.getActiveObject();
+ if (activeObject) {
+ activeObject.lockRotation = !activeObject.lockRotation;
+ lockRotationEl.innerHTML = activeObject.lockRotation
+ ? 'Unlock rotation'
+ : 'Lock rotation';
+ }
+ };
+
+ var gradientifyBtn = document.getElementById('gradientify');
+
+ var activeObjectButtons = [
+ lockHorizontallyEl,
+ lockVerticallyEl,
+ lockScalingXEl,
+ lockScalingYEl,
+ lockRotationEl,
+ removeSelectedEl,
+ gradientifyBtn
+ ];
+
+ var opacityEl = document.getElementById('opacity');
+ if (opacityEl) {
+ activeObjectButtons.push(opacityEl);
+ }
+ var colorEl = document.getElementById('color');
+ if (colorEl) {
+ activeObjectButtons.push(colorEl);
+ }
+
+ for (var i = activeObjectButtons.length; i--;) {
+ activeObjectButtons[i].disabled = true;
+ }
+
+ canvas.on('object:selected', onObjectSelected);
+ canvas.on('group:selected', onObjectSelected);
+
+ function onObjectSelected(e) {
+ var selectedObject = e.target;
for (var i = activeObjectButtons.length; i--;) {
- activeObjectButtons[i].disabled = true;
+ activeObjectButtons[i].disabled = false;
}
- canvas.on('object:selected', onObjectSelected);
- canvas.on('group:selected', onObjectSelected);
+ lockHorizontallyEl.innerHTML = (selectedObject.lockMovementX ? 'Unlock horizontal movement' : 'Lock horizontal movement');
+ lockVerticallyEl.innerHTML = (selectedObject.lockMovementY ? 'Unlock vertical movement' : 'Lock vertical movement');
+ lockScalingXEl.innerHTML = (selectedObject.lockScalingX ? 'Unlock horizontal scaling' : 'Lock horizontal scaling');
+ lockScalingYEl.innerHTML = (selectedObject.lockScalingY ? 'Unlock vertical scaling' : 'Lock vertical scaling');
+ lockRotationEl.innerHTML = (selectedObject.lockRotation ? 'Unlock rotation' : 'Lock rotation');
+ }
- function onObjectSelected(e) {
- var selectedObject = e.target;
-
- for (var i = activeObjectButtons.length; i--;) {
- activeObjectButtons[i].disabled = false;
- }
-
- lockHorizontallyEl.innerHTML = (selectedObject.lockMovementX ? 'Unlock horizontal movement' : 'Lock horizontal movement');
- lockVerticallyEl.innerHTML = (selectedObject.lockMovementY ? 'Unlock vertical movement' : 'Lock vertical movement');
- lockScalingXEl.innerHTML = (selectedObject.lockScalingX ? 'Unlock horizontal scaling' : 'Lock horizontal scaling');
- lockScalingYEl.innerHTML = (selectedObject.lockScalingY ? 'Unlock vertical scaling' : 'Lock vertical scaling');
- lockRotationEl.innerHTML = (selectedObject.lockRotation ? 'Unlock rotation' : 'Lock rotation');
+ canvas.on('selection:cleared', function(e) {
+ for (var i = activeObjectButtons.length; i--;) {
+ activeObjectButtons[i].disabled = true;
}
+ });
- canvas.on('selection:cleared', function (e) {
- for (var i = activeObjectButtons.length; i--;) {
- activeObjectButtons[i].disabled = true;
- }
+ var drawingModeEl = document.getElementById('drawing-mode'),
+ drawingOptionsEl = document.getElementById('drawing-mode-options'),
+ drawingColorEl = document.getElementById('drawing-color'),
+ drawingLineWidthEl = document.getElementById('drawing-line-width');
+
+ drawingModeEl.onclick = function() {
+ var canvasWithDrawingMode: any = canvas;
+ canvasWithDrawingMode.isDrawingMode = !canvasWithDrawingMode.isDrawingMode;
+ if (canvasWithDrawingMode.isDrawingMode) {
+ drawingModeEl.innerHTML = 'Cancel drawing mode';
+ drawingModeEl.className = 'is-drawing';
+ drawingOptionsEl.style.display = '';
+ }
+ else {
+ drawingModeEl.innerHTML = 'Enter drawing mode';
+ drawingModeEl.className = '';
+ drawingOptionsEl.style.display = 'none';
+ }
+ };
+
+ canvas.on('path:created', function() {
+ updateComplexity();
+ });
+
+ drawingColorEl.onchange = function() {
+ canvas.freeDrawingColor = drawingColorEl.value;
+ };
+ drawingLineWidthEl.onchange = function() {
+ canvas.freeDrawingLineWidth = parseInt(drawingLineWidthEl.value, 10) || 1; // disallow 0, NaN, etc.
+ };
+
+ canvas.freeDrawingColor = drawingColorEl.value;
+ canvas.freeDrawingLineWidth = parseInt(drawingLineWidthEl.value, 10) || 1;
+
+
+ var text = 'Lorem ipsum dolor sit amet,\nconsectetur adipisicing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore magna aliqua.\n' +
+ 'Ut enim ad minim veniam,\nquis nostrud exercitation ullamco\nlaboris nisi ut aliquip ex ea commodo consequat.';
+
+ document.getElementById('add-text').onclick = function() {
+ var textSample = new fabric.Text(text.slice(0, getRandomInt(0, text.length)), {
+ left: getRandomInt(350, 400),
+ top: getRandomInt(350, 400),
+ fontFamily: 'helvetica',
+ angle: getRandomInt(-10, 10),
+ fill: '#' + getRandomColor(),
+ scaleX: 0.5,
+ scaleY: 0.5,
+ fontWeight: ''
});
+ canvas.add(textSample);
+ updateComplexity();
+ };
- var drawingModeEl = document.getElementById('drawing-mode'),
- drawingOptionsEl = document.getElementById('drawing-mode-options'),
- drawingColorEl = document.getElementById('drawing-color'),
- drawingLineWidthEl = document.getElementById('drawing-line-width');
- drawingModeEl.onclick = function () {
- var canvasWithDrawingMode: any = canvas;
- canvasWithDrawingMode.isDrawingMode = !canvasWithDrawingMode.isDrawingMode;
- if (canvasWithDrawingMode.isDrawingMode) {
- drawingModeEl.innerHTML = 'Cancel drawing mode';
- drawingModeEl.className = 'is-drawing';
- drawingOptionsEl.style.display = '';
+ document.onkeydown = function(e) {
+ var obj = canvas.getActiveObject() || canvas.getActiveGroup();
+ if (obj && e.keyCode === 8) {
+ // this is horrible. need to fix, so that unified interface can be used
+ if (obj.type === 'group') {
+ // var groupObjects = obj.getObjects();
+ // canvas.discardActiveGroup();
+ // groupObjects.forEach(function(obj) {
+ // canvas.remove(obj);
+ // });
+ }
+ else {
+ //canvas.remove(obj);
+ }
+ canvas.renderAll();
+ // return false;
+ }
+ };
+
+ setTimeout(function() {
+ canvas.calcOffset();
+ }, 100);
+
+ if (document.location.search.indexOf('guidelines') > -1) {
+ //initCenteringGuidelines(canvas);
+ //initAligningGuidelines(canvas);
+ }
+
+ gradientifyBtn.onclick = function() {
+ var obj = canvas.getActiveObject();
+ if (obj) {
+ obj.setGradient("fill", {
+ x2: (getRandomInt(0, 1) ? 0 : obj.width),
+ y2: (getRandomInt(0, 1) ? 0 : obj.height),
+ colorStops: {
+ 0: '#' + getRandomColor(),
+ 1: '#' + getRandomColor()
+ }
+ });
+ canvas.renderAll();
+ }
+ };
+
+ var textEl = document.getElementById('text');
+ if (textEl) {
+ textEl.onfocus = function() {
+ var activeObject = canvas.getActiveObject();
+
+ if (activeObject && activeObject.type === 'text') {
+ this.value = (activeObject).text;
+ }
+ };
+ textEl.onkeyup = function(e) {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject) {
+ if (!this.value) {
+ canvas.discardActiveObject();
}
else {
- drawingModeEl.innerHTML = 'Enter drawing mode';
- drawingModeEl.className = '';
- drawingOptionsEl.style.display = 'none';
+ (activeObject).text = this.value;
}
+ canvas.renderAll();
+ }
};
+ }
- canvas.on('path:created', function () {
- updateComplexity();
+ var cmdUnderlineBtn = document.getElementById('text-cmd-underline');
+ if (cmdUnderlineBtn) {
+ activeObjectButtons.push(cmdUnderlineBtn);
+ cmdUnderlineBtn.disabled = true;
+ cmdUnderlineBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.textDecoration = (activeObject.textDecoration == 'underline' ? '' : 'underline');
+ this.className = activeObject.textDecoration ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var cmdLinethroughBtn = document.getElementById('text-cmd-linethrough');
+ if (cmdLinethroughBtn) {
+ activeObjectButtons.push(cmdLinethroughBtn);
+ cmdLinethroughBtn.disabled = true;
+ cmdLinethroughBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.textDecoration = (activeObject.textDecoration == 'line-through' ? '' : 'line-through');
+ this.className = activeObject.textDecoration ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var cmdOverlineBtn = document.getElementById('text-cmd-overline');
+ if (cmdOverlineBtn) {
+ activeObjectButtons.push(cmdOverlineBtn);
+ cmdOverlineBtn.disabled = true;
+ cmdOverlineBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.textDecoration = (activeObject.textDecoration == 'overline' ? '' : 'overline');
+ this.className = activeObject.textDecoration ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var cmdBoldBtn = document.getElementById('text-cmd-bold');
+ if (cmdBoldBtn) {
+ activeObjectButtons.push(cmdBoldBtn);
+ cmdBoldBtn.disabled = true;
+ cmdBoldBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.fontWeight = (activeObject.fontWeight == 'bold' ? '' : 'bold');
+ this.className = activeObject.fontWeight ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var cmdItalicBtn = document.getElementById('text-cmd-italic');
+ if (cmdItalicBtn) {
+ activeObjectButtons.push(cmdItalicBtn);
+ cmdItalicBtn.disabled = true;
+ cmdItalicBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.fontStyle = (activeObject.fontStyle == 'italic' ? '' : 'italic');
+ this.className = activeObject.fontStyle ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var cmdShadowBtn = document.getElementById('text-cmd-shadow');
+ if (cmdShadowBtn) {
+ activeObjectButtons.push(cmdShadowBtn);
+ cmdShadowBtn.disabled = true;
+ cmdShadowBtn.onclick = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.shadow = !activeObject.shadow ? 'rgba(0,0,0,0.2) 2px 2px 10px' : '';
+ this.className = activeObject.shadow ? 'selected' : '';
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var textAlignSwitch = document.getElementById('text-align');
+ if (textAlignSwitch) {
+ activeObjectButtons.push(textAlignSwitch);
+ textAlignSwitch.disabled = true;
+ textAlignSwitch.onchange = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.textAlign = this.value.toLowerCase();
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var fontFamilySwitch = document.getElementById('font-family');
+ if (fontFamilySwitch) {
+ activeObjectButtons.push(fontFamilySwitch);
+ fontFamilySwitch.disabled = true;
+ fontFamilySwitch.onchange = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.fontFamily = this.value;
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var bgColorField = document.getElementById('text-bg-color');
+ if (bgColorField) {
+ bgColorField.onchange = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.backgroundColor = this.value;
+ canvas.renderAll();
+ }
+ };
+ }
+
+ var strokeColorField = document.getElementById('text-stroke-color');
+ if (strokeColorField) {
+ strokeColorField.onchange = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.stroke = this.value;
+ canvas.renderAll();
+ }
+ };
+ }
+
+ if (supportsSlider) {
+ (function() {
+ var container = document.getElementById('text-controls');
+ var slider = document.createElement('input');
+ var label = document.createElement('label');
+ label.innerHTML = 'Line height: ';
+ try { slider.type = 'range'; } catch (err) { }
+ slider.min = "0";
+ slider.max = "10";
+ slider.step = "0.1";
+ slider.value = "1.5";
+ container.appendChild(label);
+ label.appendChild(slider);
+ slider.title = "Line height";
+ slider.onchange = function() {
+ var activeObject = canvas.getActiveObject();
+ if (activeObject && activeObject.type === 'text') {
+ activeObject.lineHeight = this.value;
+ canvas.renderAll();
+ }
+ };
+
+ canvas.on('object:selected', function(e: fabric.IEvent) {
+ slider.value = String((e.target).lineHeight );
+ });
+ })();
+ }
+
+ document.getElementById('load-svg').onclick = function() {
+ var svg = (document.getElementById('svg-console')).value;
+ fabric.loadSVGFromString(svg, function(objects, options) {
+ var obj = fabric.util.groupSVGElements(objects, options);
+ canvas.add(obj).centerObject(obj).renderAll();
+ obj.setCoords();
});
-
- drawingColorEl.onchange = function () {
- canvas.freeDrawingColor = drawingColorEl.value;
- };
- drawingLineWidthEl.onchange = function () {
- canvas.freeDrawingLineWidth = parseInt(drawingLineWidthEl.value, 10) || 1; // disallow 0, NaN, etc.
- };
-
- canvas.freeDrawingColor = drawingColorEl.value;
- canvas.freeDrawingLineWidth = parseInt(drawingLineWidthEl.value, 10) || 1;
-
-
- var text = 'Lorem ipsum dolor sit amet,\nconsectetur adipisicing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore magna aliqua.\n' +
- 'Ut enim ad minim veniam,\nquis nostrud exercitation ullamco\nlaboris nisi ut aliquip ex ea commodo consequat.';
-
- document.getElementById('add-text').onclick = function () {
- var textSample = new fabric.Text(text.slice(0, getRandomInt(0, text.length)), {
- left: getRandomInt(350, 400),
- top: getRandomInt(350, 400),
- fontFamily: 'helvetica',
- angle: getRandomInt(-10, 10),
- fill: '#' + getRandomColor(),
- scaleX: 0.5,
- scaleY: 0.5,
- fontWeight: ''
- });
- canvas.add(textSample);
- updateComplexity();
- };
-
-
- document.onkeydown = function (e) {
- var obj = canvas.getActiveObject() || canvas.getActiveGroup();
- if (obj && e.keyCode === 8) {
- // this is horrible. need to fix, so that unified interface can be used
- if (obj.type === 'group') {
- // var groupObjects = obj.getObjects();
- // canvas.discardActiveGroup();
- // groupObjects.forEach(function(obj) {
- // canvas.remove(obj);
- // });
- }
- else {
- //canvas.remove(obj);
- }
- canvas.renderAll();
- // return false;
- }
- };
-
- setTimeout(function () {
- canvas.calcOffset();
- }, 100);
-
- if (document.location.search.indexOf('guidelines') > -1) {
- //initCenteringGuidelines(canvas);
- //initAligningGuidelines(canvas);
- }
-
- gradientifyBtn.onclick = function () {
- var obj = canvas.getActiveObject();
- if (obj) {
- obj.setGradientFill({
- x2: (getRandomInt(0, 1) ? 0 : obj.width),
- y2: (getRandomInt(0, 1) ? 0 : obj.height),
- colorStops: {
- 0: '#' + getRandomColor(),
- 1: '#' + getRandomColor()
- }
- });
- canvas.renderAll();
- }
- };
-
- var textEl = document.getElementById('text');
- if (textEl) {
- textEl.onfocus = function () {
- var activeObject = canvas.getActiveObject();
-
- if (activeObject && activeObject.type === 'text') {
- this.value = (activeObject).text;
- }
- };
- textEl.onkeyup = function (e) {
- var activeObject = canvas.getActiveObject();
- if (activeObject) {
- if (!this.value) {
- canvas.discardActiveObject();
- }
- else {
- (activeObject).text = this.value;
- }
- canvas.renderAll();
- }
- };
- }
-
- var cmdUnderlineBtn = document.getElementById('text-cmd-underline');
- if (cmdUnderlineBtn) {
- activeObjectButtons.push(cmdUnderlineBtn);
- cmdUnderlineBtn.disabled = true;
- cmdUnderlineBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.textDecoration = (activeObject.textDecoration == 'underline' ? '' : 'underline');
- this.className = activeObject.textDecoration ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var cmdLinethroughBtn = document.getElementById('text-cmd-linethrough');
- if (cmdLinethroughBtn) {
- activeObjectButtons.push(cmdLinethroughBtn);
- cmdLinethroughBtn.disabled = true;
- cmdLinethroughBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.textDecoration = (activeObject.textDecoration == 'line-through' ? '' : 'line-through');
- this.className = activeObject.textDecoration ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var cmdOverlineBtn = document.getElementById('text-cmd-overline');
- if (cmdOverlineBtn) {
- activeObjectButtons.push(cmdOverlineBtn);
- cmdOverlineBtn.disabled = true;
- cmdOverlineBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.textDecoration = (activeObject.textDecoration == 'overline' ? '' : 'overline');
- this.className = activeObject.textDecoration ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var cmdBoldBtn = document.getElementById('text-cmd-bold');
- if (cmdBoldBtn) {
- activeObjectButtons.push(cmdBoldBtn);
- cmdBoldBtn.disabled = true;
- cmdBoldBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.fontWeight = (activeObject.fontWeight == 'bold' ? '' : 'bold');
- this.className = activeObject.fontWeight ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var cmdItalicBtn = document.getElementById('text-cmd-italic');
- if (cmdItalicBtn) {
- activeObjectButtons.push(cmdItalicBtn);
- cmdItalicBtn.disabled = true;
- cmdItalicBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.fontStyle = (activeObject.fontStyle == 'italic' ? '' : 'italic');
- this.className = activeObject.fontStyle ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var cmdShadowBtn = document.getElementById('text-cmd-shadow');
- if (cmdShadowBtn) {
- activeObjectButtons.push(cmdShadowBtn);
- cmdShadowBtn.disabled = true;
- cmdShadowBtn.onclick = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.textShadow = !activeObject.textShadow ? 'rgba(0,0,0,0.2) 2px 2px 10px' : '';
- this.className = activeObject.textShadow ? 'selected' : '';
- canvas.renderAll();
- }
- };
- }
-
- var textAlignSwitch = document.getElementById('text-align');
- if (textAlignSwitch) {
- activeObjectButtons.push(textAlignSwitch);
- textAlignSwitch.disabled = true;
- textAlignSwitch.onchange = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.textAlign = this.value.toLowerCase();
- canvas.renderAll();
- }
- };
- }
-
- var fontFamilySwitch = document.getElementById('font-family');
- if (fontFamilySwitch) {
- activeObjectButtons.push(fontFamilySwitch);
- fontFamilySwitch.disabled = true;
- fontFamilySwitch.onchange = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.fontFamily = this.value;
- canvas.renderAll();
- }
- };
- }
-
- var bgColorField = document.getElementById('text-bg-color');
- if (bgColorField) {
- bgColorField.onchange = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.backgroundColor = this.value;
- canvas.renderAll();
- }
- };
- }
-
- var strokeColorField = document.getElementById('text-stroke-color');
- if (strokeColorField) {
- strokeColorField.onchange = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.strokeStyle = this.value;
- canvas.renderAll();
- }
- };
- }
-
- if (supportsSlider) {
- (function () {
- var container = document.getElementById('text-controls');
- var slider = document.createElement('input');
- var label = document.createElement('label');
- label.innerHTML = 'Line height: ';
- try { slider.type = 'range'; } catch (err) { }
- slider.min = "0";
- slider.max = "10";
- slider.step = "0.1";
- slider.value = "1.5";
- container.appendChild(label);
- label.appendChild(slider);
- slider.title = "Line height";
- slider.onchange = function () {
- var activeObject = canvas.getActiveObject();
- if (activeObject && activeObject.type === 'text') {
- activeObject.lineHeight = this.value;
- canvas.renderAll();
- }
- };
-
- canvas.on('object:selected', function (e) {
- slider.value = e.target.lineHeight;
- });
- })();
- }
-
- document.getElementById('load-svg').onclick = function () {
- var svg = (document.getElementById('svg-console')).value;
- fabric.loadSVGFromString(svg, function (objects, options) {
- var obj = fabric.util.groupSVGElements(objects, options);
- canvas.add(obj).centerObject(obj).renderAll();
- obj.setCoords();
- });
- };
+ };
}
function sample9() {
- var canvas = new fabric.Canvas('c');
- canvas.setBackgroundImage('yolo.jpg', () => {"a"}, {opacity: 45});
- canvas.setBackgroundImage('yolo.jpg', () => {"a"});
+ var canvas = new fabric.Canvas('c');
+ canvas.setBackgroundImage('yolo.jpg',() => { "a" }, { opacity: 45 });
+ canvas.setBackgroundImage('yolo.jpg',() => { "a" });
}
diff --git a/fabricjs/fabricjs.d.ts b/fabricjs/fabricjs.d.ts
index 048c915dfe..503b8c7dbf 100644
--- a/fabricjs/fabricjs.d.ts
+++ b/fabricjs/fabricjs.d.ts
@@ -1,8 +1,12 @@
// Type definitions for FabricJS v1.5.0
// Project: http://fabricjs.com/
-// Definitions by: Oliver Klemencic , edited by Joseph Livecchi
+// Definitions by: Oliver Klemencic , Joseph Livecchi
// Definitions: https://github.com/borisyankov/DefinitelyTyped
+/* tslint:disable:no-unused-variable */
+/* tslint:disable:whitespace */
+/* tslint:disable:typedef */
+
// Support AMD require
declare module "fabric" {
export = fabric;
@@ -32,61 +36,62 @@ declare module fabric {
*/
function createSVGFontFacesMarkup(objects: IObject[]): string;
/**
- * Takes string corresponding to an SVG document, and parses it into a set of fabric objects
- * @param {String} string
- * @param {Function} callback
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
- */
- function loadSVGFromString(string: string, callback: (results: IObject[], options) => void, reviver?: (el, obj) => void);
+ * Takes string corresponding to an SVG document, and parses it into a set of fabric objects
+ * @param {String} string
+ * @param {Function} callback
+ * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+ */
+ function loadSVGFromString(string: string, callback: (results: IObject[], options: any) => void, reviver?: Function);
/**
- * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)
- * @param {String} url
- * @param {Function} callback
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
- */
- function loadSVGFromURL(url, callback: (results: IObject[], options) => void, reviver?: (el, obj) => void);
+ * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.
+ * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)
+ * @param {String} url
+ * @param {Function} callback
+ * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+ */
+ function loadSVGFromURL(url: string, callback: (results: IObject[], options: any) => void, reviver?: Function);
/**
- * Returns CSS rules for a given SVG document
- * @param {SVGDocument} doc SVG document to parse
- */
+ * Returns CSS rules for a given SVG document
+ * @param {SVGDocument} doc SVG document to parse
+ */
function getCSSRules(doc: SVGElement): any;
- function parseElements(elements: any[], callback, options, reviver);
+ function parseElements(elements: any[], callback: Function, options: any, reviver?: Function);
/**
- * Parses "points" attribute, returning an array of values
- * @param {String} points points attribute string
- */
+ * Parses "points" attribute, returning an array of values
+ * @param {String} points points attribute string
+ */
function parsePointsAttribute(points: string): any[];
/**
- * Parses "style" attribute, retuning an object with values
- * @param {SVGElement} element Element to parse
- */
+ * Parses "style" attribute, retuning an object with values
+ * @param {SVGElement} element Element to parse
+ */
function parseStyleAttribute(element: SVGElement): any;
/**
- * Transforms an array of svg elements to corresponding fabric.* instances
- * @param {Array} elements Array of elements to parse
- * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)
- * @param {Object} [options] Options object
- * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
- */
+ * Transforms an array of svg elements to corresponding fabric.* instances
+ * @param {Array} elements Array of elements to parse
+ * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)
+ * @param {Object} [options] Options object
+ * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
+ */
function parseElements(elements: any[], callback: Function, options?: any, reviver?: Function): void;
/**
- * Returns an object of attributes' name/value, given element and an array of attribute names;
- * Parses parent "g" nodes recursively upwards.
- * @param {DOMElement} element Element to parse
- * @param {Array} attributes Array of attributes to parse
- */
+ * Returns an object of attributes' name/value, given element and an array of attribute names;
+ * Parses parent "g" nodes recursively upwards.
+ * @param {DOMElement} element Element to parse
+ * @param {Array} attributes Array of attributes to parse
+ */
function parseAttributes(elemen: HTMLElement, attributes: string[], svgUid?: string): { [key: string]: string }
/**
- * Parses an SVG document, returning all of the gradient declarations found in it
- * @param {SVGDocument} doc SVG document to parse
- */
+ * Parses an SVG document, returning all of the gradient declarations found in it
+ * @param {SVGDocument} doc SVG document to parse
+ */
function getGradientDefs(doc: SVGElement): { [key: string]: any };
/**
- * Parses a short font declaration, building adding its properties to a style object
- * @param {String} value font declaration
- * @param {Object} oStyle definition
- */
+ * Parses a short font declaration, building adding its properties to a style object
+ * @param {String} value font declaration
+ * @param {Object} oStyle definition
+ */
function parseFontDeclaration(value: string, oStyle: any): void;
/**
* Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback
@@ -94,7 +99,7 @@ declare module fabric {
* @param {Function} callback Callback to call when parsing is finished; It's being passed an array of elements (parsed from a document).
* @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
*/
- function parseSVGDocument(doc: SVGElement, callback: (results, options) => void, reviver?: (el, obj) => void);
+ function parseSVGDocument(doc: SVGElement, callback: (results: IObject[], options: any) => void, reviver?: Function);
/**
* Parses "transform" attribute, returning an array of values
* @param {String} attributeValue String containing attribute value
@@ -104,14 +109,13 @@ declare module fabric {
// fabric Log
// ---------------
/**
- * Wrapper around `console.log` (when available)
- */
- function log(values);
+ * Wrapper around `console.log` (when available)
+ */
+ function log(...values: any[]);
/**
- * Wrapper around `console.warn` (when available)
- */
- function warn(values);
-
+ * Wrapper around `console.warn` (when available)
+ */
+ function warn(...values: any[]);
////////////////////////////////////////////////////
// Classes
@@ -122,25 +126,25 @@ declare module fabric {
var Color: IColorStatic;
var Pattern: IPatternStatic;
var Intersection: IIntersectionStatic;
- var Point: IPointStatic
+ var Point: IPointStatic;
var Circle: ICircleStatic;
var Ellipse: IEllipseStatic;
var Group: IGroupStatic;
- var Image: IImageStatic
+ var Image: IImageStatic;
var Line: ILineStatic;
var Object: IObjectStatic;
var Path: IPathStatic;
- var PathGroup: IPathGroupStatic
- var Polygon: IPolygonStatic
+ var PathGroup: IPathGroupStatic;
+ var Polygon: IPolygonStatic;
var Polyline: IPolylineStatic;
var Rect: IRectStatic;
var Shadow: IShadowStatic;
var Text: ITextStatic;
var IText: IITextStatic;
- var Triangle: ITriangleStatic
+ var Triangle: ITriangleStatic;
- var util: Util;
+ var util: IUtil;
///////////////////////////////////////////////////////////////////////////////
// Data Object Interfaces - These intrface are not specific part of fabric,
@@ -148,32 +152,32 @@ declare module fabric {
//////////////////////////////////////////////////////////////////////////////
interface IDataURLOptions {
/**
- * The format of the output image. Either "jpeg" or "png"
- */
+ * The format of the output image. Either "jpeg" or "png"
+ */
format?: string;
/**
- * Quality level (0..1). Only used for jpeg
- */
+ * Quality level (0..1). Only used for jpeg
+ */
quality?: number;
/**
- * Multiplier to scale by
- */
+ * Multiplier to scale by
+ */
multiplier?: number;
/**
- * Cropping left offset. Introduced in v1.2.14
- */
+ * Cropping left offset. Introduced in v1.2.14
+ */
left?: number;
/**
- * Cropping top offset. Introduced in v1.2.14
- */
+ * Cropping top offset. Introduced in v1.2.14
+ */
top?: number;
/**
- * Cropping width. Introduced in v1.2.14
- */
+ * Cropping width. Introduced in v1.2.14
+ */
width?: number;
/**
- * Cropping height. Introduced in v1.2.14
- */
+ * Cropping height. Introduced in v1.2.14
+ */
height?: number;
}
@@ -184,169 +188,164 @@ declare module fabric {
interface IFillOptions {
/**
- * options.source Pattern source
- */
- source: string|HTMLImageElement;
+ * options.source Pattern source
+ */
+ source: string | HTMLImageElement;
/**
- * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)
- */
+ * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)
+ */
repeat?: string;
/**
- * Pattern horizontal offset from object's left/top corner
- */
+ * Pattern horizontal offset from object's left/top corner
+ */
offsetX?: number;
/**
- * Pattern vertical offset from object's left/top corner
- */
+ * Pattern vertical offset from object's left/top corner
+ */
offsetY?: number;
}
-
interface IToSVGOptions {
/**
- * If true xml tag is not included
- */
+ * If true xml tag is not included
+ */
suppressPreamble: boolean;
/**
- * SVG viewbox object
- */
+ * SVG viewbox object
+ */
viewBox: IViewBox;
/**
- * Encoding of SVG output
- */
+ * Encoding of SVG output
+ */
encoding: string;
}
interface IViewBox {
/**
- * x-cooridnate of viewbox
- */
+ * x-cooridnate of viewbox
+ */
x: number;
/**
- * y-coordinate of viewbox
- */
+ * y-coordinate of viewbox
+ */
y: number;
/**
- * Width of viewbox
- */
+ * Width of viewbox
+ */
width: number;
- /**Height of viewbox */
+ /**
+ * Height of viewbox
+ */
height: number;
}
-
- interface IFilter {
- new (): IFilter;
- new (options: any): IFilter;
- }
-
- interface IEventList {
- [index: string]: (e: Event) => void;
- }
-
///////////////////////////////////////////////////////////////////////////////
// Mixins Interfaces
//////////////////////////////////////////////////////////////////////////////
interface ICollection {
/**
- * Adds objects to collection, then renders canvas (if `renderOnAddRemove` is not `false`)
- * Objects should be instances of (or inherit from) fabric.Object
- * @param {...fabric.Object} object Zero or more fabric instances
- */
+ * Adds objects to collection, then renders canvas (if `renderOnAddRemove` is not `false`)
+ * Objects should be instances of (or inherit from) fabric.Object
+ * @param {...fabric.Object} object Zero or more fabric instances
+ */
add(...object: IObject[]): T;
/**
- * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)
- * An object should be an instance of (or inherit from) fabric.Object
- * @param {Object} object Object to insert
- * @param {Number} index Index to insert object at
- * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs
- * @return {Self} thisArg
- * @chainable
- */
+ * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)
+ * An object should be an instance of (or inherit from) fabric.Object
+ * @param {Object} object Object to insert
+ * @param {Number} index Index to insert object at
+ * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs
+ * @return {Self} thisArg
+ * @chainable
+ */
insertAt(object: IObject, index: number, nonSplicing: boolean): T;
/**
- * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)
- * @param {...fabric.Object} object Zero or more fabric instances
- * @return {Self} thisArg
- * @chainable
- */
+ * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)
+ * @param {...fabric.Object} object Zero or more fabric instances
+ * @return {Self} thisArg
+ * @chainable
+ */
remove(...object: IObject[]): T;
/**
- * Executes given function for each object in this group
- * @param {Function} callback
- * @param {Object} context Context (aka thisObject)
- * @return {Self} thisArg
- */
+ * Executes given function for each object in this group
+ * @param {Function} callback
+ * @param {Object} context Context (aka thisObject)
+ * @return {Self} thisArg
+ */
forEachObject(callback: (element: IObject, index: number, array: IObject[]) => any, context?: any): T;
/**
- * Returns an array of children objects of this instance
- * Type parameter introduced in 1.3.10
- * @param {String} [type] When specified, only objects of this type are returned
- * @return {Array}
- */
+ * Returns an array of children objects of this instance
+ * Type parameter introduced in 1.3.10
+ * @param {String} [type] When specified, only objects of this type are returned
+ * @return {Array}
+ */
getObjects(type?: string): IObject[];
-
/**
- * Returns object at specified index
- * @param {Number} index
- * @return {Self} thisArg
- */
+ * Returns object at specified index
+ * @param {Number} index
+ * @return {Self} thisArg
+ */
item(index: number): T;
/**
- * Returns true if collection contains no objects
- * @return {Boolean} true if collection is empty
- */
+ * Returns true if collection contains no objects
+ * @return {Boolean} true if collection is empty
+ */
isEmpty(): boolean;
/**
- * Returns a size of a collection (i.e: length of an array containing its objects)
- * @return {Number} Collection size
- */
+ * Returns a size of a collection (i.e: length of an array containing its objects)
+ * @return {Number} Collection size
+ */
size(): number;
/**
- * Returns true if collection contains an object
- * @param {Object} object Object to check against
- * @return {Boolean} `true` if collection contains an object
- */
+ * Returns true if collection contains an object
+ * @param {Object} object Object to check against
+ * @return {Boolean} `true` if collection contains an object
+ */
contains(object: IObject): boolean;
/**
- * Returns number representation of a collection complexity
- * @return {Number} complexity
- */
+ * Returns number representation of a collection complexity
+ * @return {Number} complexity
+ */
complexity(): number;
}
interface IObservable {
/**
* Observes specified event
- * @deprecated `observe` deprecated since 0.8.34 (use `on` instead)
- * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
- * @param {Function} handler Function that receives a notification when an event of the specified type occurs
+ * @param eventName Event name (eg. 'after:render')
+ * @param handler Function that receives a notification when an event of the specified type occurs
*/
- on(eventName: string|any, handler: (e: IEvent) => any): T;
+ on(eventName: string, handler: (e: IEvent) => any): T;
+
/**
- * Fires event with an optional options object
- * @deprecated `fire` deprecated since 1.0.7 (use `trigger` instead)
- * @param {String} eventName Event name to fire
- * @param {Object} [options] Options object
- */
+ * Observes specified event
+ * @param eventName Object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
+ */
+ on(eventName: {[key:string] : Function}): T;
+ /**
+ * Fires event with an optional options object
+ * @deprecated `fire` deprecated since 1.0.7 (use `trigger` instead)
+ * @param {String} eventName Event name to fire
+ * @param {Object} [options] Options object
+ */
trigger(eventName: string, options?: any): T;
/**
* Stops event observing for a particular event handler. Calling this method
* without arguments removes all handlers for all events
* @deprecated `stopObserving` deprecated since 0.8.34 (use `off` instead)
- * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
- * @param {Function} handler Function to be deleted from EventListeners
+ * @param eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})
+ * @param handler Function to be deleted from EventListeners
*/
- off(eventName: string|any, handler: (e) => any): T;
+ off(eventName: string|any, handler: (e: IEvent) => any): T;
}
// animation mixin
@@ -384,204 +383,204 @@ declare module fabric {
}
interface IObjectAnimation {
/**
- * Animates object's properties
- * object.animate('left', ..., {duration: ...});
- * @param property Property to animate
- * @param value Value to animate property
- * @param options The animation options
- */
- animate(property: string, value: number | string, options?: IAnimationOptions): IObject;
+ * Animates object's properties
+ * object.animate('left', ..., {duration: ...});
+ * @param property Property to animate
+ * @param value Value to animate property
+ * @param options The animation options
+ */
+ animate(property: string, value: number|string, options?: IAnimationOptions): IObject;
/**
- * Animates object's properties
- * object.animate({ left: ..., top: ... }, { duration: ... });
- * @param properties Properties to animate
- * @param value Options object
- */
+ * Animates object's properties
+ * object.animate({ left: ..., top: ... }, { duration: ... });
+ * @param properties Properties to animate
+ * @param value Options object
+ */
animate(properties: any, options?: IAnimationOptions): IObject;
}
interface IAnimationOptions {
/**
- * Allows to specify starting value of animatable property (if we don't want current value to be used).
- */
+ * Allows to specify starting value of animatable property (if we don't want current value to be used).
+ */
from?: string|number;
/**
- * Defaults to 500 (ms). Can be used to change duration of an animation.
- */
+ * Defaults to 500 (ms). Can be used to change duration of an animation.
+ */
duration?: number;
/**
- * Callback; invoked on every value change
- */
+ * Callback; invoked on every value change
+ */
onChange?: Function;
/**
- * Callback; invoked when value change is completed
- */
- onComplete?: Function
+ * Callback; invoked when value change is completed
+ */
+ onComplete?: Function;
+
/**
- * Easing function. Default: fabric.util.ease.easeInSine
- */
+ * Easing function. Default: fabric.util.ease.easeInSine
+ */
easing?: Function;
/**
* Value to modify the property by, default: end - start
*/
by?: number;
}
-
///////////////////////////////////////////////////////////////////////////////
// General Fabric Interfaces
//////////////////////////////////////////////////////////////////////////////
interface IColor {
/**
- * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])
- */
+ * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])
+ */
getSource(): number[];
/**
- * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])
- */
+ * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])
+ */
setSource(source: number[]);
/**
- * Returns color represenation in RGB format ex: rgb(0-255,0-255,0-255)
- */
+ * Returns color represenation in RGB format ex: rgb(0-255,0-255,0-255)
+ */
toRgb(): string;
/**
- * Returns color represenation in RGBA format ex: rgba(0-255,0-255,0-255,0-1)
- */
+ * Returns color represenation in RGBA format ex: rgba(0-255,0-255,0-255,0-1)
+ */
toRgba(): string;
/**
- * Returns color represenation in HSL format ex: hsl(0-360,0%-100%,0%-100%)
- */
+ * Returns color represenation in HSL format ex: hsl(0-360,0%-100%,0%-100%)
+ */
toHsl(): string;
/**
- * Returns color represenation in HSLA format ex: hsla(0-360,0%-100%,0%-100%,0-1)
- */
+ * Returns color represenation in HSLA format ex: hsla(0-360,0%-100%,0%-100%,0-1)
+ */
toHsla(): string;
/**
- * Returns color represenation in HEX format ex: FF5555
- */
+ * Returns color represenation in HEX format ex: FF5555
+ */
toHex(): string;
/**
- * Gets value of alpha channel for this color
- */
+ * Gets value of alpha channel for this color
+ */
getAlpha(): number;
/**
- * Sets value of alpha channel for this color
- * @param {Number} alpha Alpha value 0-1
- */
+ * Sets value of alpha channel for this color
+ * @param {Number} alpha Alpha value 0-1
+ */
setAlpha(alpha: number);
/**
- * Transforms color to its grayscale representation
- */
+ * Transforms color to its grayscale representation
+ */
toGrayscale(): IColor;
/**
- * Transforms color to its black and white representation
- * @param {Number} threshold
- */
+ * Transforms color to its black and white representation
+ * @param {Number} threshold
+ */
toBlackWhite(threshold: number): IColor;
/**
- * Overlays color with another color
- * @param {String|fabric.Color} otherColor
- */
+ * Overlays color with another color
+ * @param {String|fabric.Color} otherColor
+ */
overlayWith(otherColor: string|IColor): IColor;
}
interface IColorStatic {
/**
- * Color class
- * The purpose of Color is to abstract and encapsulate common color operations;
- * @param {String} color optional in hex or rgb(a) format
- */
+ * Color class
+ * The purpose of Color is to abstract and encapsulate common color operations;
+ * @param {String} color optional in hex or rgb(a) format
+ */
new (color?: string): IColor;
/**
- * Returns new color object, when given a color in RGB format
- * @param {String} color Color value ex: rgb(0-255,0-255,0-255)
- */
- fromRgb(color): IColor
+ * Returns new color object, when given a color in RGB format
+ * @param {String} color Color value ex: rgb(0-255,0-255,0-255)
+ */
+ fromRgb(color: string): IColor;
/**
- * Returns new color object, when given a color in RGBA format
- * @param {String} color Color value ex: rgb(0-255,0-255,0-255)
- */
- fromRgba(color): IColor
+ * Returns new color object, when given a color in RGBA format
+ * @param {String} color Color value ex: rgb(0-255,0-255,0-255)
+ */
+ fromRgba(color: string): IColor;
/**
- * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format
- * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)
- */
+ * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format
+ * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)
+ */
sourceFromRgb(color: string): number[];
/**
- * Returns new color object, when given a color in HSL format
- * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)
- */
- fromHsl(color: string): IColor
+ * Returns new color object, when given a color in HSL format
+ * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)
+ */
+ fromHsl(color: string): IColor;
/**
- * Returns new color object, when given a color in HSLA format
- * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)
- */
- fromHsla(color: string): IColor
+ * Returns new color object, when given a color in HSLA format
+ * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)
+ */
+ fromHsla(color: string): IColor;
/**
- * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.
- * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)
- */
+ * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.
+ * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)
+ */
sourceFromHsl(color: string): number[];
/**
- * Returns new color object, when given a color in HEX format
- * @param {String} color Color value ex: FF5555
- */
- fromHex(color: string): IColor
+ * Returns new color object, when given a color in HEX format
+ * @param {String} color Color value ex: FF5555
+ */
+ fromHex(color: string): IColor;
/**
- * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format
- * @param {String} color ex: FF5555
- */
+ * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format
+ * @param {String} color ex: FF5555
+ */
sourceFromHex(color: string): number[];
/**
- * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])
- * @param {Array} source
- */
+ * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])
+ * @param {Array} source
+ */
fromSource(source: number[]): IColor;
prototype: any;
}
interface IGradientOptions {
/**
- * @param {String} [options.type] Type of gradient 'radial' or 'linear'
- */
+ * @param {String} [options.type] Type of gradient 'radial' or 'linear'
+ */
type?: string;
/**
- * x-coordinate of start point
- */
+ * x-coordinate of start point
+ */
x1?: number;
/**
- * y-coordinate of start point
- */
+ * y-coordinate of start point
+ */
y1?: number;
/**
- * x-coordinate of end point
- */
+ * x-coordinate of end point
+ */
x2?: number;
/**
- * y-coordinate of end point
- */
+ * y-coordinate of end point
+ */
y2?: number;
/**
- * Radius of start point (only for radial gradients)
- */
+ * Radius of start point (only for radial gradients)
+ */
r1?: number;
/**
- * Radius of end point (only for radial gradients)
- */
+ * Radius of end point (only for radial gradients)
+ */
r2?: number;
/**
- * Color stops object eg. {0:string; 1:string;
- */
+ * Color stops object eg. {0:string; 1:string;
+ */
colorStops?: any;
}
interface IGradient extends IGradientOptions {
@@ -626,12 +625,12 @@ declare module fabric {
interface IIntersection {
/**
- * Appends a point to intersection
- */
+ * Appends a point to intersection
+ */
appendPoint(point: IPoint);
/**
- * Appends points to intersection
- */
+ * Appends points to intersection
+ */
appendPoints(points: IPoint[]);
}
interface IIntersectionStatic {
@@ -640,41 +639,41 @@ declare module fabric {
*/
new (status?: string);
/**
- * Checks if polygon intersects another polygon
- */
+ * Checks if polygon intersects another polygon
+ */
intersectPolygonPolygon(points1: IPoint[], points2: IPoint[]): IIntersection;
/**
- * Checks if line intersects polygon
- */
- intersectLinePolygon(a1: IPoint, a2: IPoint, points: IPoint[]): IIntersection
+ * Checks if line intersects polygon
+ */
+ intersectLinePolygon(a1: IPoint, a2: IPoint, points: IPoint[]): IIntersection;
/**
- * Checks if one line intersects another
- */
- intersectLineLine(a1: IPoint, a2: IPoint, b1: IPoint, b2: IPoint): IIntersection
+ * Checks if one line intersects another
+ */
+ intersectLineLine(a1: IPoint, a2: IPoint, b1: IPoint, b2: IPoint): IIntersection;
/**
- * Checks if polygon intersects rectangle
- */
+ * Checks if polygon intersects rectangle
+ */
intersectPolygonRectangle(points: IPoint[], r1: number, r2: number): IIntersection;
}
interface IPatternOptions {
/**
- * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)
- */
+ * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)
+ */
repeat: string;
/**
- * Pattern horizontal offset from object's left/top corner
- */
+ * Pattern horizontal offset from object's left/top corner
+ */
offsetX: number;
/**
- * Pattern vertical offset from object's left/top corner
- */
+ * Pattern vertical offset from object's left/top corner
+ */
offsetY: number;
/**
- * The source for the pattern
- */
+ * The source for the pattern
+ */
source: string|HTMLImageElement;
}
interface IPattern extends IPatternOptions {
@@ -682,18 +681,18 @@ declare module fabric {
initialise(options?: IPatternOptions): IPattern;
/**
- * Returns an instance of CanvasPattern
- */
+ * Returns an instance of CanvasPattern
+ */
toLive(ctx: CanvasRenderingContext2D): IPattern;
/**
- * Returns object representation of a pattern
- */
+ * Returns object representation of a pattern
+ */
toObject(): any;
/**
- * Returns SVG representation of a pattern
- * @param {fabric.Object} object
- */
+ * Returns SVG representation of a pattern
+ * @param {fabric.Object} object
+ */
toSVG(object: IObject): string;
}
interface IPatternStatic {
@@ -705,239 +704,216 @@ declare module fabric {
x: number;
y: number;
/**
- * Adds another point to this one and returns another one
- * @param {fabric.Point} that
- * @return {fabric.Point} new Point instance with added values
- */
+ * Adds another point to this one and returns another one
+ * @param {fabric.Point} that
+ */
add(that: IPoint): IPoint;
/**
- * Adds another point to this one
- * @param {fabric.Point} that
- * @return {fabric.Point} thisArg
- */
+ * Adds another point to this one
+ * @param {fabric.Point} that
+ */
addEquals(that: IPoint): IPoint;
/**
- * Adds value to this point and returns a new one
- * @param {Number} scalar
- * @return {fabric.Point} new Point with added value
- */
+ * Adds value to this point and returns a new one
+ * @param {Number} scalar
+ */
scalarAdd(scalar: number): IPoint;
/**
- * Adds value to this point
- * @param {Number} scalar
- * @return {fabric.Point} thisArg
- */
+ * Adds value to this point
+ * @param {Number} scalar
+ */
scalarAddEquals(scalar: number): IPoint;
/**
- * Subtracts another point from this point and returns a new one
- * @param {fabric.Point} that
- * @return {fabric.Point} new Point object with subtracted values
- */
- subtract(that: IPoint): IPoint
+ * Subtracts another point from this point and returns a new one
+ * @param {fabric.Point} that
+ */
+ subtract(that: IPoint): IPoint;
/**
- * Subtracts another point from this point
- * @param {fabric.Point} that
- * @return {fabric.Point} thisArg
- */
- subtractEquals(that): IPoint;
+ * Subtracts another point from this point
+ * @param {fabric.Point} that
+ */
+ subtractEquals(that: IPoint): IPoint;
/**
- * Subtracts value from this point and returns a new one
- * @param {Number} scalar
- * @return {fabric.Point}
- */
+ * Subtracts value from this point and returns a new one
+ * @param {Number} scalar
+ */
scalarSubtract(scalar: number): IPoint;
/**
- * Subtracts value from this point
- * @param {Number} scalar
- * @return {fabric.Point} thisArg
- */
+ * Subtracts value from this point
+ * @param {Number} scalar
+ */
scalarSubtractEquals(scalar: number): IPoint;
/**
- * Miltiplies this point by a value and returns a new one
- * @param {Number} scalar
- * @return {fabric.Point}
- */
+ * Miltiplies this point by a value and returns a new one
+ * @param {Number} scalar
+ */
multiply(scalar: number): IPoint;
/**
- * Miltiplies this point by a value
- * @param {Number} scalar
- * @return {fabric.Point} thisArg
- */
- multiplyEquals(scalar): IPoint;
+ * Miltiplies this point by a value
+ * @param {Number} scalar
+ */
+ multiplyEquals(scalar: number): IPoint;
/**
- * Divides this point by a value and returns a new one
- * @param {Number} scalar
- * @return {fabric.Point}
- */
- divide(scalar): IPoint;
+ * Divides this point by a value and returns a new one
+ * @param {Number} scalar
+ */
+ divide(scalar: number): IPoint;
/**
- * Divides this point by a value
- * @param {Number} scalar
- * @return {fabric.Point} thisArg
- */
+ * Divides this point by a value
+ * @param {Number} scalar
+ */
divideEquals(scalar: number): IPoint;
/**
- * Returns true if this point is equal to another one
- * @param {fabric.Point} that
- * @return {Boolean}
- */
+ * Returns true if this point is equal to another one
+ * @param {fabric.Point} that
+ */
eq(that: IPoint): IPoint;
/**
- * Returns true if this point is less than another one
- * @param {fabric.Point} that
- * @return {Boolean}
- */
+ * Returns true if this point is less than another one
+ * @param {fabric.Point} that
+ */
lt(that: IPoint): IPoint;
/**
- * Returns true if this point is less than or equal to another one
- * @param {fabric.Point} that
- * @return {Boolean}
- */
+ * Returns true if this point is less than or equal to another one
+ * @param {fabric.Point} that
+ */
lte(that: IPoint): IPoint;
/**
- * Returns true if this point is greater another one
- * @param {fabric.Point} that
- * @return {Boolean}
- */
+ * Returns true if this point is greater another one
+ * @param {fabric.Point} that
+ */
gt(that: IPoint): IPoint;
/**
- * Returns true if this point is greater than or equal to another one
- * @param {fabric.Point} that
- * @return {Boolean}
- */
+ * Returns true if this point is greater than or equal to another one
+ * @param {fabric.Point} that
+ */
gte(that: IPoint): IPoint;
/**
- * Returns new point which is the result of linear interpolation with this one and another one
- * @param {fabric.Point} that
- * @param {Number} t
- * @return {fabric.Point}
- */
- lerp(that, t: number): IPoint;
+ * Returns new point which is the result of linear interpolation with this one and another one
+ * @param {fabric.Point} that
+ * @param {Number} t
+ */
+ lerp(that: IPoint, t: number): IPoint;
/**
- * Returns distance from this point and another one
- * @param {fabric.Point} that
- * @return {Number}
- */
+ * Returns distance from this point and another one
+ * @param {fabric.Point} that
+ */
distanceFrom(that: IPoint): number;
/**
- * Returns the point between this point and another one
- * @param {fabric.Point} that
- * @return {fabric.Point}
- */
+ * Returns the point between this point and another one
+ * @param {fabric.Point} that
+ */
midPointFrom(that: IPoint): IPoint;
/**
- * Returns a new point which is the min of this and another one
- * @param {fabric.Point} that
- * @return {fabric.Point}
- */
+ * Returns a new point which is the min of this and another one
+ * @param {fabric.Point} that
+ */
min(that: IPoint): IPoint;
/**
- * Returns a new point which is the max of this and another one
- * @param {fabric.Point} that
- * @return {fabric.Point}
- */
+ * Returns a new point which is the max of this and another one
+ * @param {fabric.Point} that
+ */
max(that: IPoint): IPoint;
/**
- * Returns string representation of this point
- * @return {String}
- */
+ * Returns string representation of this point
+ */
toString(): string;
/**
- * Sets x/y of this point
- * @param {Number} x
- * @param {Number} y
- */
- setXY(x, y: IPoint): IPoint;
+ * Sets x/y of this point
+ * @param {Number} x
+ * @param {Number} y
+ */
+ setXY(x:number, y: number): IPoint;
/**
- * Sets x/y of this point from another point
- * @param {fabric.Point} that
- */
+ * Sets x/y of this point from another point
+ * @param {fabric.Point} that
+ */
setFromPoint(that: IPoint): IPoint;
/**
- * Swaps x/y of this point and another point
- * @param {fabric.Point} that
- */
+ * Swaps x/y of this point and another point
+ * @param {fabric.Point} that
+ */
swap(that: IPoint): IPoint;
}
interface IPointStatic {
- new (x, y): IPoint;
+ new (x: number, y: number): IPoint;
prototype: any;
}
interface IShadowOptions {
/**
- * Whether the shadow should affect stroke operations
- */
+ * Whether the shadow should affect stroke operations
+ */
affectStrike: boolean;
/**
- * Shadow blur
- */
+ * Shadow blur
+ */
blur: number;
/**
- * Shadow color
- */
+ * Shadow color
+ */
color: string;
/**
- * Indicates whether toObject should include default values
- */
+ * Indicates whether toObject should include default values
+ */
includeDefaultValues: boolean;
/**
- * Shadow horizontal offset
- */
+ * Shadow horizontal offset
+ */
offsetX: number;
/**
- * Shadow vertical offset
- */
+ * Shadow vertical offset
+ */
offsetY: number;
}
interface IShadow extends IShadowOptions {
initialize(options?: IShadowOptions|string): IShadow;
/**
- * Returns object representation of a shadow
- */
+ * Returns object representation of a shadow
+ */
toObject(): IObject;
/**
- * Returns a string representation of an instance, CSS3 text-shadow declaration
- */
+ * Returns a string representation of an instance, CSS3 text-shadow declaration
+ */
toString(): string;
/**
- * Returns SVG representation of a shadow
- * @param {fabric.Object} object
- */
+ * Returns SVG representation of a shadow
+ * @param {fabric.Object} object
+ */
toSVG(object: IObject): string;
/**
- * Regex matching shadow offsetX, offsetY and blur, Static
- */
+ * Regex matching shadow offsetX, offsetY and blur, Static
+ */
reOffsetsAndBlur: RegExp
}
interface IShadowStatic {
- new (options?: IShadowOptions): IShadow
+ new (options?: IShadowOptions): IShadow;
reOffsetsAndBlur: RegExp;
}
@@ -946,381 +922,421 @@ declare module fabric {
//////////////////////////////////////////////////////////////////////////////
interface ICanvasDimensions {
/**
- * Width of canvas element
- */
+ * Width of canvas element
+ */
width: number;
/**
- * Height of canvas element
- */
+ * Height of canvas element
+ */
height: number;
}
interface ICanvasDimensionsOptions {
/**
- * Set the given dimensions only as canvas backstore dimensions
- */
+ * Set the given dimensions only as canvas backstore dimensions
+ */
backstoreOnly?: boolean;
/**
- * Set the given dimensions only as css dimensions
- */
+ * Set the given dimensions only as css dimensions
+ */
cssOnly?: boolean;
}
interface IStaticCanvasOptions {
/**
- * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas
- */
+ * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas
+ */
allowTouchScrolling?: boolean;
/**
- * Indicates whether this canvas will use image smoothing, this is on by default in browsers
- */
+ * Indicates whether this canvas will use image smoothing, this is on by default in browsers
+ */
imageSmoothingEnabled?: boolean;
/**
- * Indicates whether objects should remain in current stack position when selected. When false objects are brought to top and rendered as part of the selection group
- */
+ * Indicates whether objects should remain in current stack position when selected.
+ * When false objects are brought to top and rendered as part of the selection group
+ */
preserveObjectStacking?: boolean;
/**
- * The transformation (in the format of Canvas transform) which focuses the viewport
- */
+ * The transformation (in the format of Canvas transform) which focuses the viewport
+ */
viewportTransform?: number[];
-
-
freeDrawingColor?: string;
freeDrawingLineWidth?: number;
/**
- * Background color of canvas instance.
- * Should be set via setBackgroundColor
- */
- backgroundColor?: string | IPattern;
+ * Background color of canvas instance.
+ * Should be set via setBackgroundColor
+ */
+ backgroundColor?: string|IPattern;
/**
- * Background image of canvas instance.
- * Should be set via setBackgroundImage
- * Backwards incompatibility note: The "backgroundImageOpacity" and "backgroundImageStretch" properties are deprecated since 1.3.9.
- */
- backgroundImage?: IImage;
+ * Background image of canvas instance.
+ * Should be set via setBackgroundImage
+ * Backwards incompatibility note: The "backgroundImageOpacity" and "backgroundImageStretch" properties are deprecated since 1.3.9.
+ */
+ backgroundImage?: IImage | string;
backgroundImageOpacity?: number;
backgroundImageStretch?: number;
/**
- * Function that determines clipping of entire canvas area
- * Being passed context as first argument. See clipping canvas area
- */
+ * Function that determines clipping of entire canvas area
+ * Being passed context as first argument. See clipping canvas area
+ */
clipTo?: (context: CanvasRenderingContext2D) => void;
/**
- * Indicates whether object controls (borders/controls) are rendered above overlay image
- */
+ * Indicates whether object controls (borders/controls) are rendered above overlay image
+ */
controlsAboveOverlay?: boolean;
/**
- * Indicates whether toObject/toDatalessObject should include default values
- */
+ * Indicates whether toObject/toDatalessObject should include default values
+ */
includeDefaultValues?: boolean;
/**
- * Overlay color of canvas instance.
- * Should be set via setOverlayColor
- */
- overlayColor?: string | IPattern;
+ * Overlay color of canvas instance.
+ * Should be set via setOverlayColor
+ */
+ overlayColor?: string|IPattern;
/**
- * Overlay image of canvas instance.
- * Should be set via setOverlayImage
- * Backwards incompatibility note: The "overlayImageLeft" and "overlayImageTop" properties are deprecated since 1.3.9.
- */
+ * Overlay image of canvas instance.
+ * Should be set via setOverlayImage
+ * Backwards incompatibility note: The "overlayImageLeft" and "overlayImageTop" properties are deprecated since 1.3.9.
+ */
overlayImage?: IImage;
overlayImageLeft?: number;
overlayImageTop?: number;
/**
- * Indicates whether add, insertAt and remove should also re-render canvas.
- * Disabling this option could give a great performance boost when adding/removing a lot of objects to/from canvas at once
- * (followed by a manual rendering after addition/deletion)
- */
+ * Indicates whether add, insertAt and remove should also re-render canvas.
+ * Disabling this option could give a great performance boost when adding/removing a lot of objects to/from canvas at once
+ * (followed by a manual rendering after addition/deletion)
+ */
renderOnAddRemove?: boolean;
/**
- * Indicates whether objects' state should be saved
- */
+ * Indicates whether objects' state should be saved
+ */
stateful?: boolean;
}
interface IStaticCanvas extends IObservable, IStaticCanvasOptions, ICollection, ICanvasAnimation {
/**
- * Calculates canvas element offset relative to the document
- * This method is also attached as "resize" event handler of window
- */
+ * Calculates canvas element offset relative to the document
+ * This method is also attached as "resize" event handler of window
+ */
calcOffset(): IStaticCanvas;
/**
- * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas
- * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to
- * @param {Function} callback callback to invoke when image is loaded and set as an overlay
- * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.
- */
- setOverlayImage(image: IImage | string, callback: Function, options?: IObjectOptions): IStaticCanvas;
+ * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas
+ * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to
+ * @param {Function} callback callback to invoke when image is loaded and set as an overlay
+ * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.
+ */
+ setOverlayImage(image: IImage|string, callback: Function, options?: IObjectOptions): IStaticCanvas;
/**
- * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas
- * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to
- * @param {Function} callback Callback to invoke when image is loaded and set as background
- * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.
- */
+ * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas
+ * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to
+ * @param {Function} callback Callback to invoke when image is loaded and set as background
+ * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.
+ */
setBackgroundImage(image: IImage|string, callback: Function, options?: IObjectOptions): IStaticCanvas;
/**
- * Sets {@link fabric.StaticCanvas#overlayColor|background color} for this canvas
- * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set background color to
- * @param {Function} callback Callback to invoke when background color is set
- */
+ * Sets {@link fabric.StaticCanvas#overlayColor|background color} for this canvas
+ * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set background color to
+ * @param {Function} callback Callback to invoke when background color is set
+ */
setOverlayColor(overlayColor: string|IPattern, callback: Function): IStaticCanvas;
/**
- * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas
- * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to
- * @param {Function} callback Callback to invoke when background color is set
- */
+ * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas
+ * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to
+ * @param {Function} callback Callback to invoke when background color is set
+ */
setBackgroundColor(backgroundColor: string|IPattern, callback: Function): IStaticCanvas;
/**
- * Returns canvas width (in px)
- */
+ * Returns canvas width (in px)
+ */
getWidth(): number;
/**
- * Returns canvas height (in px)
- */
+ * Returns canvas height (in px)
+ */
getHeight(): number;
/**
- * Sets width of this canvas instance
- * @param {Number|String} value Value to set width to
- * @param {Object} [options] Options object
- */
+ * Sets width of this canvas instance
+ * @param {Number|String} value Value to set width to
+ * @param {Object} [options] Options object
+ */
setWidth(value: number|string, options?: ICanvasDimensionsOptions): IStaticCanvas
/**
- * Sets height of this canvas instance
- * @param {Number|String} value Value to set height to
- * @param {Object} [options] Options object
- */
- setHeight(value: number|string, options?: ICanvasDimensionsOptions): IStaticCanvas
+ * Sets height of this canvas instance
+ * @param {Number|String} value Value to set height to
+ * @param {Object} [options] Options object
+ */
+ setHeight(value: number|string, options?: ICanvasDimensionsOptions): IStaticCanvas;
/**
- * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)
- * @param {Object} dimensions Object with width/height properties
- * @param {Object} [options] Options object
- */
+ * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)
+ * @param {Object} dimensions Object with width/height properties
+ * @param {Object} [options] Options object
+ */
setDimensions(dimensions: ICanvasDimensions, options?: ICanvasDimensionsOptions): IStaticCanvas;
-
+
/**
- * Returns canvas zoom level
- */
+ * Returns canvas zoom level
+ */
getZoom(): number;
/**
- * Sets viewport transform of this canvas instance
- * @param {Array} vpt the transform in the form of context.transform
- */
+ * Sets viewport transform of this canvas instance
+ * @param {Array} vpt the transform in the form of context.transform
+ */
setViewportTransform(vpt: number[]): IStaticCanvas;
-
/**
- * Sets zoom level of this canvas instance, zoom centered around point
- * @param {fabric.Point} point to zoom with respect to
- * @param {Number} value to set zoom to, less than 1 zooms out
- */
+ * Sets zoom level of this canvas instance, zoom centered around point
+ * @param {fabric.Point} point to zoom with respect to
+ * @param {Number} value to set zoom to, less than 1 zooms out
+ */
zoomToPoint(point: IPoint, value: number): IStaticCanvas;
/**
- * Sets zoom level of this canvas instance
- * @param {Number} value to set zoom to, less than 1 zooms out
- */
+ * Sets zoom level of this canvas instance
+ * @param {Number} value to set zoom to, less than 1 zooms out
+ */
setZoom(value: number): IStaticCanvas;
/**
- * Pan viewport so as to place point at top left corner of canvas
- * @param {fabric.Point} point to move to
- */
+ * Pan viewport so as to place point at top left corner of canvas
+ * @param {fabric.Point} point to move to
+ */
absolutePan(point: IPoint): IStaticCanvas;
/**
- * Pans viewpoint relatively
- * @param {fabric.Point} point (position vector) to move by
- */
+ * Pans viewpoint relatively
+ * @param {fabric.Point} point (position vector) to move by
+ */
relativePan(point: IPoint): IStaticCanvas;
/**
- * Returns