mirror of
https://github.com/Hopiu/fabric.js.git
synced 2026-03-16 22:10:32 +00:00
full build (#5408)
This commit is contained in:
parent
f3317569ff
commit
f56886eab7
5 changed files with 91 additions and 51 deletions
|
|
@ -1,5 +1,12 @@
|
|||
# Changelog
|
||||
|
||||
## [2.4.4]
|
||||
- Fix: add clipPath to stateful cache check. [#5384](https://github.com/fabricjs/fabric.js/pull/5384)
|
||||
- Fix: restore draggability of small objects [#5379](https://github.com/fabricjs/fabric.js/pull/5379)
|
||||
- Improvement: Added strokeDashOffset to objects and from SVG import. [#5398](https://github.com/fabricjs/fabric.js/pull/5398)
|
||||
- Fix: do not mark objects as invisible if strokeWidth is > 0 [#5382](https://github.com/fabricjs/fabric.js/pull/5382)
|
||||
- Improvement: Better gradients parsing with xlink:href [#5357](https://github.com/fabricjs/fabric.js/pull/5357)
|
||||
|
||||
## [2.4.3]
|
||||
- Fix: Shift click and onSelect function [#5348](https://github.com/fabricjs/fabric.js/pull/5348)
|
||||
- Fix: Load from Json from images with filters and resize filters [#5346](https://github.com/fabricjs/fabric.js/pull/5346)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */
|
||||
|
||||
var fabric = fabric || { version: '2.4.3' };
|
||||
var fabric = fabric || { version: '2.4.4' };
|
||||
if (typeof exports !== 'undefined') {
|
||||
exports.fabric = fabric;
|
||||
}
|
||||
|
|
|
|||
129
dist/fabric.js
vendored
129
dist/fabric.js
vendored
|
|
@ -1,7 +1,7 @@
|
|||
/* build: `node build.js modules=ALL exclude=gestures,accessors requirejs minifier=uglifyjs` */
|
||||
/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */
|
||||
|
||||
var fabric = fabric || { version: '2.4.3' };
|
||||
var fabric = fabric || { version: '2.4.4' };
|
||||
if (typeof exports !== 'undefined') {
|
||||
exports.fabric = fabric;
|
||||
}
|
||||
|
|
@ -33,7 +33,8 @@ else {
|
|||
* True when in environment that supports touch events
|
||||
* @type boolean
|
||||
*/
|
||||
fabric.isTouchSupported = 'ontouchstart' in fabric.window;
|
||||
fabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||
|
||||
(fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);
|
||||
|
||||
/**
|
||||
* True when in environment that's probably Node.js
|
||||
|
|
@ -52,7 +53,7 @@ fabric.SHARED_ATTRIBUTES = [
|
|||
'transform',
|
||||
'fill', 'fill-opacity', 'fill-rule',
|
||||
'opacity',
|
||||
'stroke', 'stroke-dasharray', 'stroke-linecap',
|
||||
'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',
|
||||
'stroke-linejoin', 'stroke-miterlimit',
|
||||
'stroke-opacity', 'stroke-width',
|
||||
'id', 'paint-order',
|
||||
|
|
@ -1788,7 +1789,10 @@ fabric.CommonMethods = {
|
|||
(function() {
|
||||
/**
|
||||
* Copies all enumerable properties of one js object to another
|
||||
* this does not and cannot compete with generic utils.
|
||||
* Does not clone or extend fabric.Object subclasses.
|
||||
* This is mostly for internal use and has extra handling for fabricJS objects
|
||||
* it skips the canvas property in deep cloning.
|
||||
* @memberOf fabric.util.object
|
||||
* @param {Object} destination Where to copy to
|
||||
* @param {Object} source Where to copy from
|
||||
|
|
@ -1812,7 +1816,10 @@ fabric.CommonMethods = {
|
|||
}
|
||||
else if (source && typeof source === 'object') {
|
||||
for (var property in source) {
|
||||
if (source.hasOwnProperty(property)) {
|
||||
if (property === 'canvas') {
|
||||
destination[property] = extend({ }, source[property]);
|
||||
}
|
||||
else if (source.hasOwnProperty(property)) {
|
||||
destination[property] = extend({ }, source[property], deep);
|
||||
}
|
||||
}
|
||||
|
|
@ -3379,6 +3386,7 @@ if (typeof console !== 'undefined') {
|
|||
'letter-spacing': 'charSpacing',
|
||||
'paint-order': 'paintFirst',
|
||||
'stroke-dasharray': 'strokeDashArray',
|
||||
'stroke-dashoffset': 'strokeDashOffset',
|
||||
'stroke-linecap': 'strokeLineCap',
|
||||
'stroke-linejoin': 'strokeLineJoin',
|
||||
'stroke-miterlimit': 'strokeMiterLimit',
|
||||
|
|
@ -3570,14 +3578,7 @@ if (typeof console !== 'undefined') {
|
|||
}
|
||||
|
||||
// identity matrix
|
||||
var iMatrix = [
|
||||
1, // a
|
||||
0, // b
|
||||
0, // c
|
||||
1, // d
|
||||
0, // e
|
||||
0 // f
|
||||
],
|
||||
var iMatrix = fabric.iMatrix,
|
||||
|
||||
// == begin transform regexp
|
||||
number = fabric.reNum,
|
||||
|
|
@ -3783,7 +3784,7 @@ if (typeof console !== 'undefined') {
|
|||
|
||||
/**
|
||||
* @private
|
||||
* to support IE8 missing getElementById on SVGdocument
|
||||
* to support IE8 missing getElementById on SVGdocument and on node xmlDOM
|
||||
*/
|
||||
function elementById(doc, id) {
|
||||
var el;
|
||||
|
|
@ -4056,6 +4057,28 @@ if (typeof console !== 'undefined') {
|
|||
}, clone(options), reviver, parsingOptions);
|
||||
};
|
||||
|
||||
function recursivelyParseGradientsXlink(doc, gradient) {
|
||||
var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],
|
||||
xlinkAttr = 'xlink:href',
|
||||
xLink = gradient.getAttribute(xlinkAttr).substr(1),
|
||||
referencedGradient = elementById(doc, xLink);
|
||||
if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {
|
||||
recursivelyParseGradientsXlink(doc, referencedGradient);
|
||||
}
|
||||
gradientsAttrs.forEach(function(attr) {
|
||||
if (!gradient.hasAttribute(attr)) {
|
||||
gradient.setAttribute(attr, referencedGradient.getAttribute(attr));
|
||||
}
|
||||
});
|
||||
if (!gradient.children.length) {
|
||||
var referenceClone = referencedGradient.cloneNode(true);
|
||||
while (referenceClone.firstChild) {
|
||||
gradient.appendChild(referenceClone.firstChild);
|
||||
}
|
||||
}
|
||||
gradient.removeAttribute(xlinkAttr);
|
||||
}
|
||||
|
||||
var reFontDeclaration = new RegExp(
|
||||
'(normal|italic)?\\s*(normal|small-caps)?\\s*' +
|
||||
'(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' +
|
||||
|
|
@ -4117,26 +4140,14 @@ if (typeof console !== 'undefined') {
|
|||
'svg:linearGradient',
|
||||
'svg:radialGradient'],
|
||||
elList = _getMultipleNodes(doc, tagArray),
|
||||
el, j = 0, id, xlink,
|
||||
gradientDefs = { }, idsToXlinkMap = { };
|
||||
el, j = 0, gradientDefs = { };
|
||||
j = elList.length;
|
||||
|
||||
while (j--) {
|
||||
el = elList[j];
|
||||
xlink = el.getAttribute('xlink:href');
|
||||
id = el.getAttribute('id');
|
||||
if (xlink) {
|
||||
idsToXlinkMap[id] = xlink.substr(1);
|
||||
}
|
||||
gradientDefs[id] = el;
|
||||
}
|
||||
|
||||
for (id in idsToXlinkMap) {
|
||||
var el2 = gradientDefs[idsToXlinkMap[id]].cloneNode(true);
|
||||
el = gradientDefs[id];
|
||||
while (el2.firstChild) {
|
||||
el.appendChild(el2.firstChild);
|
||||
if (el.getAttribute('xlink:href')) {
|
||||
recursivelyParseGradientsXlink(doc, el);
|
||||
}
|
||||
gradientDefs[el.getAttribute('id')] = el;
|
||||
}
|
||||
return gradientDefs;
|
||||
},
|
||||
|
|
@ -9834,8 +9845,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
|
|||
/**
|
||||
* @private
|
||||
*/
|
||||
_getActionFromCorner: function(target, corner, e) {
|
||||
if (!corner) {
|
||||
_getActionFromCorner: function(alreadySelected, corner, e) {
|
||||
if (!corner || !alreadySelected) {
|
||||
return 'drag';
|
||||
}
|
||||
|
||||
|
|
@ -9858,14 +9869,14 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
|
|||
* @param {Event} e Event object
|
||||
* @param {fabric.Object} target
|
||||
*/
|
||||
_setupCurrentTransform: function (e, target) {
|
||||
_setupCurrentTransform: function (e, target, alreadySelected) {
|
||||
if (!target) {
|
||||
return;
|
||||
}
|
||||
|
||||
var pointer = this.getPointer(e),
|
||||
corner = target._findTargetCorner(this.getPointer(e, true)),
|
||||
action = this._getActionFromCorner(target, corner, e),
|
||||
action = this._getActionFromCorner(alreadySelected, corner, e),
|
||||
origin = this._getOriginFromCorner(target, corner);
|
||||
|
||||
this._currentTransform = {
|
||||
|
|
@ -10338,8 +10349,11 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
|
|||
/**
|
||||
* Method that determines what object we are clicking on
|
||||
* the skipGroup parameter is for internal use, is needed for shift+click action
|
||||
* 11/09/2018 TODO: would be cool if findTarget could discern between being a full target
|
||||
* or the outside part of the corner.
|
||||
* @param {Event} e mouse event
|
||||
* @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through
|
||||
* @return {fabric.Object} the target found
|
||||
*/
|
||||
findTarget: function (e, skipGroup) {
|
||||
if (this.skipTargetFind) {
|
||||
|
|
@ -11512,11 +11526,12 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab
|
|||
}
|
||||
|
||||
if (target) {
|
||||
var alreadySelected = target === this._activeObject;
|
||||
if (target.selectable) {
|
||||
this.setActiveObject(target, e);
|
||||
}
|
||||
if (target === this._activeObject && (target.__corner || !shouldGroup)) {
|
||||
this._setupCurrentTransform(e, target);
|
||||
this._setupCurrentTransform(e, target, alreadySelected);
|
||||
}
|
||||
}
|
||||
this._handleEvent(e, 'down');
|
||||
|
|
@ -12715,6 +12730,13 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
*/
|
||||
strokeDashArray: null,
|
||||
|
||||
/**
|
||||
* Line offset of an object's stroke
|
||||
* @type Number
|
||||
* @default
|
||||
*/
|
||||
strokeDashOffset: 0,
|
||||
|
||||
/**
|
||||
* Line endings style of an object's stroke (one of "butt", "round", "square")
|
||||
* @type String
|
||||
|
|
@ -12956,7 +12978,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
dirty: true,
|
||||
|
||||
/**
|
||||
* keeps the value of the last hovered coner during mouse move.
|
||||
* keeps the value of the last hovered corner during mouse move.
|
||||
* 0 is no corner, or 'mt', 'ml', 'mtr' etc..
|
||||
* It should be private, but there is no harm in using it as
|
||||
* a read-only property.
|
||||
|
|
@ -12966,7 +12988,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
__corner: 0,
|
||||
|
||||
/**
|
||||
* Determins if the fill or the stroke is drawn first (one of "fill" or "stroke")
|
||||
* Determines if the fill or the stroke is drawn first (one of "fill" or "stroke")
|
||||
* @type String
|
||||
* @default
|
||||
*/
|
||||
|
|
@ -12980,9 +13002,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
*/
|
||||
stateProperties: (
|
||||
'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +
|
||||
'stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit ' +
|
||||
'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +
|
||||
'angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor ' +
|
||||
'skewX skewY fillRule paintFirst'
|
||||
'skewX skewY fillRule paintFirst clipPath'
|
||||
).split(' '),
|
||||
|
||||
/**
|
||||
|
|
@ -12994,7 +13016,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
*/
|
||||
cacheProperties: (
|
||||
'fill stroke strokeWidth strokeDashArray width height paintFirst' +
|
||||
' strokeLineCap strokeLineJoin strokeMiterLimit backgroundColor'
|
||||
' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'
|
||||
).split(' '),
|
||||
|
||||
/**
|
||||
|
|
@ -13007,7 +13029,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
clipPath: undefined,
|
||||
|
||||
/**
|
||||
* Meaningfull ONLY when the object is used as clipPath.
|
||||
* Meaningful ONLY when the object is used as clipPath.
|
||||
* if true, the clipPath will make the object clip to the outside of the clipPath
|
||||
* since 2.4.0
|
||||
* @type boolean
|
||||
|
|
@ -13016,7 +13038,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
inverted: false,
|
||||
|
||||
/**
|
||||
* Meaningfull ONLY when the object is used as clipPath.
|
||||
* Meaningful ONLY when the object is used as clipPath.
|
||||
* if true, the clipPath will have its top and left relative to canvas, and will
|
||||
* not be influenced by the object transform. This will make the clipPath relative
|
||||
* to the canvas, but clipping just a particular object.
|
||||
|
|
@ -13235,6 +13257,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),
|
||||
strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,
|
||||
strokeLineCap: this.strokeLineCap,
|
||||
strokeDashOffset: this.strokeDashOffset,
|
||||
strokeLineJoin: this.strokeLineJoin,
|
||||
strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),
|
||||
scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),
|
||||
|
|
@ -13409,7 +13432,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
* Retrieves viewportTransform from Object's canvas if possible
|
||||
* @method getViewportTransform
|
||||
* @memberOf fabric.Object.prototype
|
||||
* @return {Boolean}
|
||||
* @return {Array}
|
||||
*/
|
||||
getViewportTransform: function() {
|
||||
if (this.canvas && this.canvas.viewportTransform) {
|
||||
|
|
@ -13425,7 +13448,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
* @return {Boolean}
|
||||
*/
|
||||
isNotVisible: function() {
|
||||
return this.opacity === 0 || (this.width === 0 && this.height === 0) || !this.visible;
|
||||
return this.opacity === 0 ||
|
||||
(this.width === 0 && this.height === 0 && this.strokeWidth === 0) ||
|
||||
!this.visible;
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -13624,7 +13649,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
},
|
||||
|
||||
/**
|
||||
* Draws a background for the object big as its untrasformed dimensions
|
||||
* Draws a background for the object big as its untransformed dimensions
|
||||
* @private
|
||||
* @param {CanvasRenderingContext2D} ctx Context to render on
|
||||
*/
|
||||
|
|
@ -13663,6 +13688,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
if (decl.stroke) {
|
||||
ctx.lineWidth = decl.strokeWidth;
|
||||
ctx.lineCap = decl.strokeLineCap;
|
||||
ctx.lineDashOffset = decl.strokeDashOffset;
|
||||
ctx.lineJoin = decl.strokeLineJoin;
|
||||
ctx.miterLimit = decl.strokeMiterLimit;
|
||||
ctx.strokeStyle = decl.stroke.toLive
|
||||
|
|
@ -13690,7 +13716,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
* Sets line dash
|
||||
* @param {CanvasRenderingContext2D} ctx Context to set the dash line on
|
||||
* @param {Array} dashArray array representing dashes
|
||||
* @param {Function} alternative function to call if browaser does not support lineDash
|
||||
* @param {Function} alternative function to call if browser does not support lineDash
|
||||
*/
|
||||
_setLineDash: function(ctx, dashArray, alternative) {
|
||||
if (!dashArray) {
|
||||
|
|
@ -13857,7 +13883,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
},
|
||||
|
||||
/**
|
||||
* This function is an helper for svg import. it decoompose the transformMatrix
|
||||
* This function is an helper for svg import. it decompose the transformMatrix
|
||||
* and assign properties to object.
|
||||
* untransformed coordinates
|
||||
* @private
|
||||
|
|
@ -14054,7 +14080,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
* @param {Number} [options.r1=0] Radius of start point (only for radial gradients)
|
||||
* @param {Number} [options.r2=0] Radius of end point (only for radial gradients)
|
||||
* @param {Object} [options.colorStops] Color stops object eg. {0: 'ff0000', 1: '000000'}
|
||||
* @param {Object} [options.gradientTransform] transforMatrix for gradient
|
||||
* @param {Object} [options.gradientTransform] transformMatrix for gradient
|
||||
* @return {fabric.Object} thisArg
|
||||
* @chainable
|
||||
* @see {@link http://jsfiddle.net/fabricjs/58y8b/|jsFiddle demo}
|
||||
|
|
@ -14281,7 +14307,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati
|
|||
|
||||
/**
|
||||
* Sets canvas globalCompositeOperation for specific object
|
||||
* custom composition operation for the particular object can be specifed using globalCompositeOperation property
|
||||
* custom composition operation for the particular object can be specified using globalCompositeOperation property
|
||||
* @param {CanvasRenderingContext2D} ctx Rendering canvas context
|
||||
*/
|
||||
_setupCompositeOperation: function (ctx) {
|
||||
|
|
@ -15343,6 +15369,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot
|
|||
var fillRule = this.fillRule ? this.fillRule : 'nonzero',
|
||||
strokeWidth = this.strokeWidth ? this.strokeWidth : '0',
|
||||
strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',
|
||||
strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',
|
||||
strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',
|
||||
strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',
|
||||
strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',
|
||||
|
|
@ -15357,6 +15384,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot
|
|||
'stroke-width: ', strokeWidth, '; ',
|
||||
'stroke-dasharray: ', strokeDashArray, '; ',
|
||||
'stroke-linecap: ', strokeLineCap, '; ',
|
||||
'stroke-dashoffset: ', strokeDashOffset, '; ',
|
||||
'stroke-linejoin: ', strokeLineJoin, '; ',
|
||||
'stroke-miterlimit: ', strokeMiterLimit, '; ',
|
||||
fill,
|
||||
|
|
@ -15616,6 +15644,11 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot
|
|||
}
|
||||
for (var i = 0, len = keys.length; i < len; i++) {
|
||||
key = keys[i];
|
||||
// since clipPath is in the statefull cache list and the clipPath objects
|
||||
// would be iterated as an object, this would lead to possible infinite recursion
|
||||
if (key === 'canvas') {
|
||||
continue;
|
||||
}
|
||||
if (!_isEqual(origValue[key], currentValue[key])) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
2
dist/fabric.min.js
vendored
2
dist/fabric.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -2,7 +2,7 @@
|
|||
"name": "fabric",
|
||||
"description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.",
|
||||
"homepage": "http://fabricjs.com/",
|
||||
"version": "2.4.3",
|
||||
"version": "2.4.4",
|
||||
"author": "Juriy Zaytsev <kangax@gmail.com>",
|
||||
"contributors": [
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue