UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

786 lines (574 loc) 23.2 kB
(function() { function getAbsolutePath(path) { var isAbsolute = /^https?:/.test(path); if (isAbsolute) return path; var imgEl = _createImageElement(); imgEl.src = path; var src = imgEl.src; imgEl = null; return src; } var IMG_SRC = fabric.isLikelyNode ? (__dirname + '/../fixtures/test_image.gif') : getAbsolutePath('../fixtures/test_image.gif'), IMG_WIDTH = 276, IMG_HEIGHT = 110; // var REFERENCE_IMG_OBJECT = { // 'type': 'image', // 'originX': 'left', // 'originY': 'top', // 'left': 0, // 'top': 0, // 'width': IMG_WIDTH, // node-canvas doesn't seem to allow setting width/height on image objects // 'height': IMG_HEIGHT, // or does it now? // 'fill': 'rgb(0,0,0)', // 'stroke': null, // 'strokeWidth': 1, // 'strokeDashArray': null, // 'strokeLineCap': 'butt', // 'strokeLineJoin': 'miter', // 'strokeMiterLimit': 10, // 'scaleX': 1, // 'scaleY': 1, // 'angle': 0, // 'flipX': false, // 'flipY': false, // 'opacity': 1, // 'src': fabric.isLikelyNode ? undefined : IMG_SRC, // 'selectable': true, // 'hasControls': true, // 'hasBorders': true, // 'hasRotatingPoint': true, // 'transparentCorners': true, // 'perPixelTargetFind': false, // 'shadow': null, // 'visible': true, // 'clipTo': null, // 'filters': [] // }; function _createImageElement() { return fabric.isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'); } function _createImageObject(width, height, callback) { var elImage = _createImageElement(); elImage.width = width; elImage.height = height; setSrc(elImage, IMG_SRC, function() { callback(new fabric.Image(elImage)); }); } function createImageObject(callback) { return _createImageObject(IMG_WIDTH, IMG_HEIGHT, callback); } function setSrc(img, src, callback) { if (fabric.isLikelyNode) { require('fs').readFile(src, function(err, imgData) { if (err) throw err; img.src = imgData; callback && callback(); }); } else { img.src = src; callback && callback(); } } QUnit.module('fabric.Image.filters.Brightness'); test('constructor', function() { ok(fabric.Image.filters.Brightness); var filter = new fabric.Image.filters.Brightness(); ok(filter instanceof fabric.Image.filters.Brightness, 'should inherit from fabric.Image.filters.Brightness'); }); test('properties', function() { var filter = new fabric.Image.filters.Brightness(); equal(filter.type, 'Brightness'); equal(filter.brightness, 0); var filter2 = new fabric.Image.filters.Brightness({brightness: 30}); equal(filter2.brightness, 30); }); test('applyTo', function() { var filter = new fabric.Image.filters.Brightness(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Brightness(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Brightness","brightness":0}'); filter.brightness = 100; object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Brightness","brightness":100}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Brightness(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Brightness","brightness":0}'); filter.brightness = 100; json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Brightness","brightness":100}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Brightness(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Brightness.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Convolute'); test('constructor', function() { ok(fabric.Image.filters.Convolute); var filter = new fabric.Image.filters.Convolute(); ok(filter instanceof fabric.Image.filters.Convolute, 'should inherit from fabric.Image.filters.Convolute'); }); test('properties', function() { var filter = new fabric.Image.filters.Convolute(); equal(filter.type, 'Convolute'); equal(filter.opaque, undefined); deepEqual(filter.matrix, [0,0,0,0,1,0,0,0,0]); var filter2 = new fabric.Image.filters.Convolute({opaque: 0.5, matrix: [1,-1,1,0,1,0,0,0,0]}); equal(filter2.opaque, 0.5); deepEqual(filter2.matrix, [1,-1,1,0,1,0,0,0,0]); }); test('applyTo', function() { var filter = new fabric.Image.filters.Convolute(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Convolute({opaque: 1}); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Convolute","opaque":1,"matrix":[0,0,0,0,1,0,0,0,0]}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Convolute({opaque: 1}); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Convolute","opaque":1,"matrix":[0,0,0,0,1,0,0,0,0]}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Convolute(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Convolute.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.GradientTransparency'); test('constructor', function() { ok(fabric.Image.filters.GradientTransparency); var filter = new fabric.Image.filters.GradientTransparency(); ok(filter instanceof fabric.Image.filters.GradientTransparency, 'should inherit from fabric.Image.filters.GradientTransparency'); }); test('properties', function() { var filter = new fabric.Image.filters.GradientTransparency(); equal(filter.type, 'GradientTransparency'); equal(filter.threshold, 100); var filter2 = new fabric.Image.filters.GradientTransparency({threshold: 50}); equal(filter2.threshold, 50); }); test('applyTo', function() { var filter = new fabric.Image.filters.GradientTransparency(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.GradientTransparency(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"GradientTransparency","threshold":100}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.GradientTransparency(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"GradientTransparency","threshold":100}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.GradientTransparency(); var object = filter.toObject(); deepEqual(fabric.Image.filters.GradientTransparency.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Grayscale'); test('constructor', function() { ok(fabric.Image.filters.Grayscale); var filter = new fabric.Image.filters.Grayscale(); ok(filter instanceof fabric.Image.filters.Grayscale, 'should inherit from fabric.Image.filters.Grayscale'); }); test('properties', function() { var filter = new fabric.Image.filters.Grayscale(); equal(filter.type, 'Grayscale'); }); test('applyTo', function() { var filter = new fabric.Image.filters.Grayscale(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Grayscale(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Grayscale"}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Grayscale(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Grayscale"}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Grayscale(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Grayscale.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Invert'); test('constructor', function() { ok(fabric.Image.filters.Invert); var filter = new fabric.Image.filters.Invert(); ok(filter instanceof fabric.Image.filters.Invert, 'should inherit from fabric.Image.filters.Invert'); }); test('properties', function() { var filter = new fabric.Image.filters.Invert(); equal(filter.type, 'Invert'); }); test('applyTo', function() { var filter = new fabric.Image.filters.Invert(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Invert(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Invert"}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Invert(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Invert"}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Invert(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Invert.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Noise'); test('constructor', function() { ok(fabric.Image.filters.Noise); var filter = new fabric.Image.filters.Noise(); ok(filter instanceof fabric.Image.filters.Noise, 'should inherit from fabric.Image.filters.Noise'); }); test('properties', function() { var filter = new fabric.Image.filters.Noise(); equal(filter.type, 'Noise'); equal(filter.noise, 0); var filter2 = new fabric.Image.filters.Noise({noise: 200}); equal(filter2.noise, 200); }); test('applyTo', function() { var filter = new fabric.Image.filters.Noise(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Noise(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Noise","noise":0}'); filter.noise = 100; object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Noise","noise":100}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Noise(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Noise","noise":0}'); filter.noise = 100; json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Noise","noise":100}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Noise(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Noise.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Pixelate'); test('constructor', function() { ok(fabric.Image.filters.Pixelate); var filter = new fabric.Image.filters.Pixelate(); ok(filter instanceof fabric.Image.filters.Pixelate, 'should inherit from fabric.Image.filters.Pixelate'); }); test('properties', function() { var filter = new fabric.Image.filters.Pixelate(); equal(filter.type, 'Pixelate'); equal(filter.blocksize, 4); var filter2 = new fabric.Image.filters.Pixelate({blocksize: 8}); equal(filter2.blocksize, 8); }); test('applyTo', function() { var filter = new fabric.Image.filters.Pixelate(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Pixelate(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Pixelate","blocksize":4}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Pixelate(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Pixelate","blocksize":4}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Pixelate(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Pixelate.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.RemoveWhite'); test('constructor', function() { ok(fabric.Image.filters.RemoveWhite); var filter = new fabric.Image.filters.RemoveWhite(); ok(filter instanceof fabric.Image.filters.RemoveWhite, 'should inherit from fabric.Image.filters.RemoveWhite'); }); test('properties', function() { var filter = new fabric.Image.filters.RemoveWhite(); equal(filter.type, 'RemoveWhite'); equal(filter.threshold, 30); equal(filter.distance, 20); var filter2 = new fabric.Image.filters.RemoveWhite({threshold: 10, distance: 60}); equal(filter2.threshold, 10); equal(filter2.distance, 60); }); test('applyTo', function() { var filter = new fabric.Image.filters.RemoveWhite(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.RemoveWhite(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"RemoveWhite","threshold":30,"distance":20}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.RemoveWhite(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"RemoveWhite","threshold":30,"distance":20}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.RemoveWhite(); var object = filter.toObject(); deepEqual(fabric.Image.filters.RemoveWhite.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Sepia2'); test('constructor', function() { ok(fabric.Image.filters.Sepia2); var filter = new fabric.Image.filters.Sepia2(); ok(filter instanceof fabric.Image.filters.Sepia2, 'should inherit from fabric.Image.filters.Sepia2'); }); test('properties', function() { var filter = new fabric.Image.filters.Sepia2(); equal(filter.type, 'Sepia2'); }); test('applyTo', function() { var filter = new fabric.Image.filters.Sepia2(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Sepia2(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Sepia2"}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Sepia2(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Sepia2"}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Sepia2(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Sepia2.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Sepia'); test('constructor', function() { ok(fabric.Image.filters.Sepia); var filter = new fabric.Image.filters.Sepia(); ok(filter instanceof fabric.Image.filters.Sepia, 'should inherit from fabric.Image.filters.Sepia'); }); test('properties', function() { var filter = new fabric.Image.filters.Sepia(); equal(filter.type, 'Sepia'); }); test('applyTo', function() { var filter = new fabric.Image.filters.Sepia(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Sepia(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Sepia"}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Sepia(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Sepia"}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Sepia(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Sepia.fromObject(object), filter); }); QUnit.module('fabric.Image.filters.Tint'); test('constructor', function() { ok(fabric.Image.filters.Tint); var filter = new fabric.Image.filters.Tint(); ok(filter instanceof fabric.Image.filters.Tint, 'should inherit from fabric.Image.filters.Tint'); }); test('properties', function() { var filter = new fabric.Image.filters.Tint(); equal(filter.type, 'Tint'); equal(filter.color, '#000000'); equal(filter.opacity, 1); var filter2 = new fabric.Image.filters.Tint({color: 'rgba(0,0,255,0.5)', opacity: 0.2}); equal(filter2.color, 'rgba(0,0,255,0.5)'); equal(filter2.opacity, 0.2); var filter3 = new fabric.Image.filters.Tint({color: 'rgba(0,0,255,0.5)'}); equal(filter3.color, 'rgba(0,0,255,0.5)'); equal(filter3.opacity, 0.5); }); test('applyTo', function() { var filter = new fabric.Image.filters.Tint(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Tint(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Tint","color":"#000000","opacity":1}'); filter.color = '#FF00FF'; filter.opacity = 0.2; equal(JSON.stringify(filter.toObject()), '{"type":"Tint","color":"#FF00FF","opacity":0.2}'); }); test('toJSON', function() { var filter = new fabric.Image.filters.Tint(); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(); equal(JSON.stringify(json), '{"type":"Tint","color":"#000000","opacity":1}'); filter.color = '#FF00FF'; filter.opacity = 0.2; equal(JSON.stringify(filter.toJSON()), '{"type":"Tint","color":"#FF00FF","opacity":0.2}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Tint(); var object = filter.toObject(); deepEqual(fabric.Image.filters.Tint.fromObject(object), filter); filter.color = '#FF0000'; filter.opacity = 0.8; deepEqual(fabric.Image.filters.Tint.fromObject(filter.toObject()), filter); }); QUnit.module('fabric.Image.filters.Mask'); test('constructor', function() { ok(fabric.Image.filters.Mask); var filter = new fabric.Image.filters.Mask(); ok(filter instanceof fabric.Image.filters.Mask, 'should inherit from fabric.Image.filters.Mask'); }); asyncTest('properties', function() { var filter = new fabric.Image.filters.Mask(); equal(filter.type, 'Mask'); equal(filter.mask, undefined); equal(filter.channel, 0); createImageObject(function(image) { var filter2 = new fabric.Image.filters.Mask({mask: image, channel: 2}); equal(filter2.mask, image); equal(filter2.channel, 2); start(); }); }); test('applyTo', function() { var filter = new fabric.Image.filters.Mask(); ok(typeof filter.applyTo == 'function'); }); asyncTest('toObject', function() { createImageObject(function(image) { var filter = new fabric.Image.filters.Mask({mask: image}); ok(typeof filter.toObject == 'function'); var object = filter.toObject(), maskObj = object.mask; // workaround for node-canvas sometimes producing images with width/height and sometimes not if (maskObj.width === 0) { maskObj.width = IMG_WIDTH; } if (maskObj.height === 0) { maskObj.height = IMG_HEIGHT; } equal(JSON.stringify(object), '{"type":"Mask","mask":'+JSON.stringify(maskObj)+',"channel":0}'); start(); }); }); asyncTest('toJSON', function() { createImageObject(function(image) { var filter = new fabric.Image.filters.Mask({mask: image}); ok(typeof filter.toJSON == 'function'); var json = filter.toJSON(), maskObj = json.mask; // workaround for node-canvas sometimes producing images with width/height and sometimes not if (maskObj.width === 0) { maskObj.width = IMG_WIDTH; } if (maskObj.height === 0) { maskObj.height = IMG_HEIGHT; } equal(JSON.stringify(json), '{"type":"Mask","mask":'+JSON.stringify(maskObj)+',"channel":0}'); start(); }); }); QUnit.module('fabric.Image.filters.Resize'); test('constructor', function() { ok(fabric.Image.filters.Resize); var filter = new fabric.Image.filters.Resize(); ok(filter instanceof fabric.Image.filters.Resize, 'should inherit from fabric.Image.filters.Resize'); }); test('properties', function() { var filter = new fabric.Image.filters.Resize(); equal(filter.type, 'Resize'); equal(filter.resizeType, 'hermite'); equal(filter.lanczosLobes, 3); equal(filter.scaleX, 0); equal(filter.scaleY, 0); var filter2 = new fabric.Image.filters.Resize({resizeType: 'bilinear', scaleX: 0.3, scaleY: 0.3}); equal(filter2.resizeType, 'bilinear'); equal(filter2.scaleX, 0.3); equal(filter2.scaleY, 0.3); }); test('applyTo', function() { var filter = new fabric.Image.filters.Resize(); ok(typeof filter.applyTo == 'function'); }); test('toObject', function() { var filter = new fabric.Image.filters.Resize(); ok(typeof filter.toObject == 'function'); var object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Resize","scaleX":0,"scaleY":0,"resizeType":"hermite","lanczosLobes":3}'); filter.resizeType = 'bilinear'; object = filter.toObject(); equal(JSON.stringify(object), '{"type":"Resize","scaleX":0,"scaleY":0,"resizeType":"bilinear","lanczosLobes":3}'); }); test('fromObject', function() { var filter = new fabric.Image.filters.Resize(); var object = filter.toObject(); var fromObject = fabric.Image.filters.Resize.fromObject(object); deepEqual(fromObject, filter); ok(fromObject instanceof fabric.Image.filters.Resize, 'should inherit from fabric.Image.filters.Resize'); filter.resizeType = 'bilinear'; filter.scaleX = 0.8; filter.scaleY = 0.8; deepEqual(fabric.Image.filters.Resize.fromObject(filter.toObject()), filter); }); // asyncTest('fromObject', function() { // createImageObject(function(image) { // var filter = new fabric.Image.filters.Mask({mask: image}); // var object = filter.toObject(); // fabric.Image.filters.Mask.fromObject(object, function(filterObj) { // deepEqual(filterObj, filter); // start(); // }); // }); // }); })();