fabric-rails 0.0.8 → 0.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +1 -49
- data/fabric-rails.gemspec +2 -2
- data/lib/fabric/rails/version.rb +2 -2
- data/vendor/assets/javascripts/fabric.js +733 -585
- metadata +4 -30
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,59 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fabric-rails (
|
5
|
-
railties (>= 3.2.0, < 5.0)
|
6
|
-
thor (~> 0.14)
|
4
|
+
fabric-rails (1.0.10)
|
7
5
|
|
8
6
|
GEM
|
9
7
|
remote: http://rubygems.org/
|
10
8
|
specs:
|
11
|
-
actionpack (3.2.1)
|
12
|
-
activemodel (= 3.2.1)
|
13
|
-
activesupport (= 3.2.1)
|
14
|
-
builder (~> 3.0.0)
|
15
|
-
erubis (~> 2.7.0)
|
16
|
-
journey (~> 1.0.1)
|
17
|
-
rack (~> 1.4.0)
|
18
|
-
rack-cache (~> 1.1)
|
19
|
-
rack-test (~> 0.6.1)
|
20
|
-
sprockets (~> 2.1.2)
|
21
|
-
activemodel (3.2.1)
|
22
|
-
activesupport (= 3.2.1)
|
23
|
-
builder (~> 3.0.0)
|
24
|
-
activesupport (3.2.1)
|
25
|
-
i18n (~> 0.6)
|
26
|
-
multi_json (~> 1.0)
|
27
|
-
builder (3.0.0)
|
28
|
-
erubis (2.7.0)
|
29
|
-
hike (1.2.1)
|
30
|
-
i18n (0.6.0)
|
31
|
-
journey (1.0.3)
|
32
|
-
json (1.6.5)
|
33
|
-
multi_json (1.1.0)
|
34
|
-
rack (1.4.1)
|
35
|
-
rack-cache (1.2)
|
36
|
-
rack (>= 0.4)
|
37
|
-
rack-ssl (1.3.2)
|
38
|
-
rack
|
39
|
-
rack-test (0.6.1)
|
40
|
-
rack (>= 1.0)
|
41
|
-
railties (3.2.1)
|
42
|
-
actionpack (= 3.2.1)
|
43
|
-
activesupport (= 3.2.1)
|
44
|
-
rack-ssl (~> 1.3.2)
|
45
|
-
rake (>= 0.8.7)
|
46
|
-
rdoc (~> 3.4)
|
47
|
-
thor (~> 0.14.6)
|
48
|
-
rake (0.9.2.2)
|
49
|
-
rdoc (3.12)
|
50
|
-
json (~> 1.4)
|
51
|
-
sprockets (2.1.2)
|
52
|
-
hike (~> 1.2)
|
53
|
-
rack (~> 1.0)
|
54
|
-
tilt (~> 1.1, != 1.3.0)
|
55
|
-
thor (0.14.6)
|
56
|
-
tilt (1.3.3)
|
57
9
|
|
58
10
|
PLATFORMS
|
59
11
|
ruby
|
data/fabric-rails.gemspec
CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.required_rubygems_version = ">= 1.3.6"
|
15
15
|
s.rubyforge_project = "fabric-rails"
|
16
16
|
|
17
|
-
s.add_dependency "railties", ">= 3.2.0", "< 5.0"
|
18
|
-
s.add_dependency "thor", "~> 0.14"
|
17
|
+
# s.add_dependency "railties", ">= 3.2.0", "< 5.0"
|
18
|
+
# s.add_dependency "thor", "~> 0.14"
|
19
19
|
|
20
20
|
s.files = `git ls-files`.split("\n")
|
21
21
|
s.executables = []
|
data/lib/fabric/rails/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* build: `node build.js modules=ALL` */
|
2
2
|
/*! Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */
|
3
3
|
|
4
|
-
var fabric = fabric || { version: "0.9.
|
4
|
+
var fabric = fabric || { version: "0.9.16" };
|
5
5
|
|
6
6
|
if (typeof exports != 'undefined') {
|
7
7
|
exports.fabric = fabric;
|
@@ -1784,7 +1784,12 @@ fabric.Observable = {
|
|
1784
1784
|
this.__eventListeners = { };
|
1785
1785
|
}
|
1786
1786
|
if (this.__eventListeners[eventName]) {
|
1787
|
-
|
1787
|
+
if (handler) {
|
1788
|
+
fabric.util.removeFromArray(this.__eventListeners[eventName], handler);
|
1789
|
+
}
|
1790
|
+
else {
|
1791
|
+
this.__eventListeners[eventName].length = 0;
|
1792
|
+
}
|
1788
1793
|
}
|
1789
1794
|
},
|
1790
1795
|
|
@@ -1796,7 +1801,7 @@ fabric.Observable = {
|
|
1796
1801
|
*/
|
1797
1802
|
fire: function(eventName, options) {
|
1798
1803
|
if (!this.__eventListeners) {
|
1799
|
-
this.__eventListeners = { }
|
1804
|
+
this.__eventListeners = { };
|
1800
1805
|
}
|
1801
1806
|
var listenersForEvent = this.__eventListeners[eventName];
|
1802
1807
|
if (!listenersForEvent) return;
|
@@ -1842,7 +1847,7 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
1842
1847
|
array.splice(idx, 1);
|
1843
1848
|
}
|
1844
1849
|
return array;
|
1845
|
-
}
|
1850
|
+
}
|
1846
1851
|
|
1847
1852
|
/**
|
1848
1853
|
* Returns random number between 2 specified ones.
|
@@ -1914,19 +1919,19 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
1914
1919
|
|
1915
1920
|
var start = +new Date(),
|
1916
1921
|
duration = options.duration || 500,
|
1917
|
-
finish = start + duration, time,
|
1922
|
+
finish = start + duration, time,
|
1918
1923
|
onChange = options.onChange || function() { },
|
1919
1924
|
abort = options.abort || function() { return false; },
|
1920
1925
|
easing = options.easing || function(t, b, c, d) {return -c * Math.cos(t/d * (Math.PI/2)) + c + b;},
|
1921
1926
|
startValue = 'startValue' in options ? options.startValue : 0,
|
1922
|
-
endValue = 'endValue' in options ? options.endValue : 100
|
1927
|
+
endValue = 'endValue' in options ? options.endValue : 100,
|
1923
1928
|
byValue = options.byValue || endValue - startValue;
|
1924
1929
|
|
1925
1930
|
options.onStart && options.onStart();
|
1926
1931
|
|
1927
1932
|
(function tick() {
|
1928
1933
|
time = +new Date();
|
1929
|
-
currentTime = time > finish ? duration : (time - start);
|
1934
|
+
var currentTime = time > finish ? duration : (time - start);
|
1930
1935
|
onChange(easing(currentTime, startValue, byValue, duration));
|
1931
1936
|
if (time > finish || abort()) {
|
1932
1937
|
options.onComplete && options.onComplete();
|
@@ -1941,7 +1946,7 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
1941
1946
|
fabric.window.mozRequestAnimationFrame ||
|
1942
1947
|
fabric.window.oRequestAnimationFrame ||
|
1943
1948
|
fabric.window.msRequestAnimationFrame ||
|
1944
|
-
function(callback
|
1949
|
+
function(callback) {
|
1945
1950
|
fabric.window.setTimeout(callback, 1000 / 60);
|
1946
1951
|
};
|
1947
1952
|
/**
|
@@ -2014,6 +2019,15 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2014
2019
|
});
|
2015
2020
|
}
|
2016
2021
|
|
2022
|
+
/**
|
2023
|
+
* Groups SVG elements (usually those retrieved from SVG document)
|
2024
|
+
* @static
|
2025
|
+
* @memberOf fabric.util
|
2026
|
+
* @method groupSVGElements
|
2027
|
+
* @param {Array} elements
|
2028
|
+
* @param {Object} options optional
|
2029
|
+
* @return {String} path optional
|
2030
|
+
*/
|
2017
2031
|
function groupSVGElements(elements, options, path) {
|
2018
2032
|
var object = elements.length > 1
|
2019
2033
|
? new fabric.PathGroup(elements, options)
|
@@ -2037,9 +2051,9 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2037
2051
|
fabric.util.groupSVGElements = groupSVGElements;
|
2038
2052
|
})();
|
2039
2053
|
(function() {
|
2040
|
-
|
2054
|
+
|
2041
2055
|
var slice = Array.prototype.slice;
|
2042
|
-
|
2056
|
+
|
2043
2057
|
if (!Array.prototype.indexOf) {
|
2044
2058
|
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
|
2045
2059
|
if (this === void 0 || this === null) {
|
@@ -2069,7 +2083,7 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2069
2083
|
}
|
2070
2084
|
}
|
2071
2085
|
return -1;
|
2072
|
-
}
|
2086
|
+
};
|
2073
2087
|
}
|
2074
2088
|
|
2075
2089
|
if (!Array.prototype.forEach) {
|
@@ -2077,7 +2091,7 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2077
2091
|
for (var i = 0, len = this.length >>> 0; i < len; i++) {
|
2078
2092
|
if (i in this) {
|
2079
2093
|
fn.call(context, this[i], i, this);
|
2080
|
-
}
|
2094
|
+
}
|
2081
2095
|
}
|
2082
2096
|
};
|
2083
2097
|
}
|
@@ -2186,8 +2200,8 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2186
2200
|
*/
|
2187
2201
|
function max(array, byProperty) {
|
2188
2202
|
if (!array || array.length === 0) return undefined;
|
2189
|
-
|
2190
|
-
var i = array.length - 1,
|
2203
|
+
|
2204
|
+
var i = array.length - 1,
|
2191
2205
|
result = byProperty ? array[i][byProperty] : array[i];
|
2192
2206
|
if (byProperty) {
|
2193
2207
|
while (i--) {
|
@@ -2215,8 +2229,8 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2215
2229
|
*/
|
2216
2230
|
function min(array, byProperty) {
|
2217
2231
|
if (!array || array.length === 0) return undefined;
|
2218
|
-
|
2219
|
-
var i = array.length - 1,
|
2232
|
+
|
2233
|
+
var i = array.length - 1,
|
2220
2234
|
result = byProperty ? array[i][byProperty] : array[i];
|
2221
2235
|
|
2222
2236
|
if (byProperty) {
|
@@ -2242,7 +2256,7 @@ fabric.Observable.off = fabric.Observable.stopObserving;
|
|
2242
2256
|
min: min,
|
2243
2257
|
max: max
|
2244
2258
|
};
|
2245
|
-
|
2259
|
+
|
2246
2260
|
})();
|
2247
2261
|
(function(){
|
2248
2262
|
|
@@ -2333,11 +2347,11 @@ fabric.util.string = {
|
|
2333
2347
|
}());
|
2334
2348
|
|
2335
2349
|
(function() {
|
2336
|
-
|
2350
|
+
|
2337
2351
|
var slice = Array.prototype.slice,
|
2338
2352
|
apply = Function.prototype.apply,
|
2339
|
-
|
2340
|
-
|
2353
|
+
Dummy = function() { };
|
2354
|
+
|
2341
2355
|
if (!Function.prototype.bind) {
|
2342
2356
|
/**
|
2343
2357
|
* Cross-browser approximation of ES5 Function.prototype.bind (not fully spec conforming)
|
@@ -2349,22 +2363,22 @@ fabric.util.string = {
|
|
2349
2363
|
Function.prototype.bind = function(thisArg) {
|
2350
2364
|
var fn = this, args = slice.call(arguments, 1), bound;
|
2351
2365
|
if (args.length) {
|
2352
|
-
bound = function() {
|
2353
|
-
return apply.call(fn, this instanceof
|
2366
|
+
bound = function() {
|
2367
|
+
return apply.call(fn, this instanceof Dummy ? this : thisArg, args.concat(slice.call(arguments)));
|
2354
2368
|
};
|
2355
2369
|
}
|
2356
2370
|
else {
|
2357
|
-
bound = function() {
|
2358
|
-
return apply.call(fn, this instanceof
|
2371
|
+
bound = function() {
|
2372
|
+
return apply.call(fn, this instanceof Dummy ? this : thisArg, arguments);
|
2359
2373
|
};
|
2360
2374
|
}
|
2361
|
-
|
2362
|
-
bound.prototype = new
|
2363
|
-
|
2375
|
+
Dummy.prototype = this.prototype;
|
2376
|
+
bound.prototype = new Dummy();
|
2377
|
+
|
2364
2378
|
return bound;
|
2365
2379
|
};
|
2366
2380
|
}
|
2367
|
-
|
2381
|
+
|
2368
2382
|
})();
|
2369
2383
|
(function() {
|
2370
2384
|
|
@@ -2381,7 +2395,7 @@ fabric.util.string = {
|
|
2381
2395
|
var addMethods = function(klass, source, parent) {
|
2382
2396
|
for (var property in source) {
|
2383
2397
|
|
2384
|
-
if (property in klass.prototype && typeof klass.prototype[property]
|
2398
|
+
if (property in klass.prototype && typeof klass.prototype[property] === 'function') {
|
2385
2399
|
|
2386
2400
|
klass.prototype[property] = (function(property) {
|
2387
2401
|
return function() {
|
@@ -2394,7 +2408,7 @@ fabric.util.string = {
|
|
2394
2408
|
if (property !== 'initialize') {
|
2395
2409
|
return returnValue;
|
2396
2410
|
}
|
2397
|
-
}
|
2411
|
+
};
|
2398
2412
|
})(property);
|
2399
2413
|
}
|
2400
2414
|
else {
|
@@ -2412,7 +2426,7 @@ fabric.util.string = {
|
|
2412
2426
|
}
|
2413
2427
|
};
|
2414
2428
|
|
2415
|
-
function
|
2429
|
+
function Subclass() { }
|
2416
2430
|
|
2417
2431
|
/**
|
2418
2432
|
* Helper for creation of "classes"
|
@@ -2434,8 +2448,8 @@ fabric.util.string = {
|
|
2434
2448
|
klass.subclasses = [ ];
|
2435
2449
|
|
2436
2450
|
if (parent) {
|
2437
|
-
|
2438
|
-
klass.prototype = new
|
2451
|
+
Subclass.prototype = parent.prototype;
|
2452
|
+
klass.prototype = new Subclass();
|
2439
2453
|
parent.subclasses.push(klass);
|
2440
2454
|
}
|
2441
2455
|
for (var i = 0, length = properties.length; i < length; i++) {
|
@@ -2450,7 +2464,7 @@ fabric.util.string = {
|
|
2450
2464
|
|
2451
2465
|
fabric.util.createClass = createClass;
|
2452
2466
|
})();
|
2453
|
-
(function (
|
2467
|
+
(function () {
|
2454
2468
|
|
2455
2469
|
/* EVENT HANDLING */
|
2456
2470
|
|
@@ -2635,26 +2649,26 @@ fabric.util.string = {
|
|
2635
2649
|
return { x: pointerX(event), y: pointerY(event) };
|
2636
2650
|
}
|
2637
2651
|
|
2638
|
-
|
2652
|
+
var pointerX = function(event) {
|
2639
2653
|
var docElement = fabric.document.documentElement,
|
2640
2654
|
body = fabric.document.body || { scrollLeft: 0 };
|
2641
2655
|
|
2642
2656
|
// looks like in IE (<9) clientX at certain point (apparently when mouseup fires on VML element)
|
2643
2657
|
// is represented as COM object, with all the consequences, like "unknown" type and error on [[Get]]
|
2644
2658
|
// need to investigate later
|
2645
|
-
return event.pageX || ((typeof event.clientX
|
2659
|
+
return event.pageX || ((typeof event.clientX !== 'unknown' ? event.clientX : 0) +
|
2646
2660
|
(docElement.scrollLeft || body.scrollLeft) -
|
2647
2661
|
(docElement.clientLeft || 0));
|
2648
|
-
}
|
2662
|
+
};
|
2649
2663
|
|
2650
|
-
|
2664
|
+
var pointerY = function(event) {
|
2651
2665
|
var docElement = fabric.document.documentElement,
|
2652
2666
|
body = fabric.document.body || { scrollTop: 0 };
|
2653
2667
|
|
2654
|
-
return
|
2668
|
+
return event.pageY || ((typeof event.clientY !== 'unknown' ? event.clientY : 0) +
|
2655
2669
|
(docElement.scrollTop || body.scrollTop) -
|
2656
2670
|
(docElement.clientTop || 0));
|
2657
|
-
}
|
2671
|
+
};
|
2658
2672
|
|
2659
2673
|
if (fabric.isTouchSupported) {
|
2660
2674
|
pointerX = function(event) {
|
@@ -2669,7 +2683,7 @@ fabric.util.string = {
|
|
2669
2683
|
|
2670
2684
|
fabric.util.object.extend(fabric.util, fabric.Observable);
|
2671
2685
|
|
2672
|
-
})(
|
2686
|
+
})();
|
2673
2687
|
(function () {
|
2674
2688
|
|
2675
2689
|
/**
|
@@ -2681,7 +2695,7 @@ fabric.util.string = {
|
|
2681
2695
|
* @return {HTMLElement} Element that was passed as a first argument
|
2682
2696
|
*/
|
2683
2697
|
function setStyle(element, styles) {
|
2684
|
-
var elementStyle = element.style
|
2698
|
+
var elementStyle = element.style;
|
2685
2699
|
if (!elementStyle) {
|
2686
2700
|
return element;
|
2687
2701
|
}
|
@@ -2708,8 +2722,6 @@ fabric.util.string = {
|
|
2708
2722
|
var parseEl = fabric.document.createElement('div'),
|
2709
2723
|
supportsOpacity = typeof parseEl.style.opacity === 'string',
|
2710
2724
|
supportsFilters = typeof parseEl.style.filter === 'string',
|
2711
|
-
view = fabric.document.defaultView,
|
2712
|
-
supportsGCS = view && typeof view.getComputedStyle !== 'undefined',
|
2713
2725
|
reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,
|
2714
2726
|
|
2715
2727
|
/** @ignore */
|
@@ -2744,7 +2756,7 @@ fabric.util.string = {
|
|
2744
2756
|
|
2745
2757
|
})();
|
2746
2758
|
(function() {
|
2747
|
-
|
2759
|
+
|
2748
2760
|
var _slice = Array.prototype.slice;
|
2749
2761
|
|
2750
2762
|
/**
|
@@ -2765,12 +2777,13 @@ fabric.util.string = {
|
|
2765
2777
|
* @param {Object} arrayLike
|
2766
2778
|
* @return {Array}
|
2767
2779
|
*/
|
2768
|
-
|
2780
|
+
var toArray = function(arrayLike) {
|
2769
2781
|
return _slice.call(arrayLike, 0);
|
2770
|
-
}
|
2782
|
+
};
|
2771
2783
|
|
2784
|
+
var sliceCanConvertNodelists;
|
2772
2785
|
try {
|
2773
|
-
|
2786
|
+
sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;
|
2774
2787
|
}
|
2775
2788
|
catch(err) { }
|
2776
2789
|
|
@@ -2818,7 +2831,7 @@ fabric.util.string = {
|
|
2818
2831
|
function addClass(element, className) {
|
2819
2832
|
if ((' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {
|
2820
2833
|
element.className += (element.className ? ' ' : '') + className;
|
2821
|
-
}
|
2834
|
+
}
|
2822
2835
|
}
|
2823
2836
|
|
2824
2837
|
/**
|
@@ -2856,7 +2869,7 @@ fabric.util.string = {
|
|
2856
2869
|
valueT += element.offsetTop || 0;
|
2857
2870
|
valueL += element.offsetLeft || 0;
|
2858
2871
|
element = element.offsetParent;
|
2859
|
-
}
|
2872
|
+
}
|
2860
2873
|
while (element);
|
2861
2874
|
return ({ left: valueL, top: valueT });
|
2862
2875
|
}
|
@@ -2866,12 +2879,12 @@ fabric.util.string = {
|
|
2866
2879
|
|
2867
2880
|
var selectProp = 'userSelect' in style
|
2868
2881
|
? 'userSelect'
|
2869
|
-
: 'MozUserSelect' in style
|
2870
|
-
? 'MozUserSelect'
|
2871
|
-
: 'WebkitUserSelect' in style
|
2872
|
-
? 'WebkitUserSelect'
|
2873
|
-
: 'KhtmlUserSelect' in style
|
2874
|
-
? 'KhtmlUserSelect'
|
2882
|
+
: 'MozUserSelect' in style
|
2883
|
+
? 'MozUserSelect'
|
2884
|
+
: 'WebkitUserSelect' in style
|
2885
|
+
? 'WebkitUserSelect'
|
2886
|
+
: 'KhtmlUserSelect' in style
|
2887
|
+
? 'KhtmlUserSelect'
|
2875
2888
|
: '';
|
2876
2889
|
|
2877
2890
|
/**
|
@@ -2888,7 +2901,7 @@ fabric.util.string = {
|
|
2888
2901
|
if (selectProp) {
|
2889
2902
|
element.style[selectProp] = 'none';
|
2890
2903
|
}
|
2891
|
-
else if (typeof element.unselectable
|
2904
|
+
else if (typeof element.unselectable === 'string') {
|
2892
2905
|
element.unselectable = 'on';
|
2893
2906
|
}
|
2894
2907
|
return element;
|
@@ -2908,7 +2921,7 @@ fabric.util.string = {
|
|
2908
2921
|
if (selectProp) {
|
2909
2922
|
element.style[selectProp] = '';
|
2910
2923
|
}
|
2911
|
-
else if (typeof element.unselectable
|
2924
|
+
else if (typeof element.unselectable === 'string') {
|
2912
2925
|
element.unselectable = '';
|
2913
2926
|
}
|
2914
2927
|
return element;
|
@@ -2928,28 +2941,28 @@ fabric.util.string = {
|
|
2928
2941
|
* @param {Function} callback Callback to execute when script is finished loading
|
2929
2942
|
*/
|
2930
2943
|
function getScript(url, callback) {
|
2931
|
-
|
2932
|
-
|
2933
|
-
|
2934
|
-
|
2935
|
-
|
2936
|
-
|
2937
|
-
|
2938
|
-
|
2939
|
-
|
2940
|
-
|
2941
|
-
|
2942
|
-
|
2943
|
-
|
2944
|
-
|
2945
|
-
|
2946
|
-
|
2947
|
-
|
2948
|
-
|
2949
|
-
|
2950
|
-
|
2951
|
-
|
2952
|
-
|
2944
|
+
var headEl = fabric.document.getElementsByTagName("head")[0],
|
2945
|
+
scriptEl = fabric.document.createElement('script'),
|
2946
|
+
loading = true;
|
2947
|
+
|
2948
|
+
scriptEl.type = 'text/javascript';
|
2949
|
+
scriptEl.setAttribute('runat', 'server');
|
2950
|
+
|
2951
|
+
/** @ignore */
|
2952
|
+
scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) {
|
2953
|
+
if (loading) {
|
2954
|
+
if (typeof this.readyState === 'string' &&
|
2955
|
+
this.readyState !== 'loaded' &&
|
2956
|
+
this.readyState !== 'complete') return;
|
2957
|
+
loading = false;
|
2958
|
+
callback(e || fabric.window.event);
|
2959
|
+
scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null;
|
2960
|
+
}
|
2961
|
+
};
|
2962
|
+
scriptEl.src = url;
|
2963
|
+
headEl.appendChild(scriptEl);
|
2964
|
+
// causes issue in Opera
|
2965
|
+
// headEl.removeChild(scriptEl);
|
2953
2966
|
}
|
2954
2967
|
|
2955
2968
|
fabric.util.getScript = getScript;
|
@@ -2961,14 +2974,14 @@ fabric.util.string = {
|
|
2961
2974
|
fabric.util.addClass = addClass;
|
2962
2975
|
fabric.util.wrapElement = wrapElement;
|
2963
2976
|
fabric.util.getElementOffset = getElementOffset;
|
2964
|
-
|
2977
|
+
|
2965
2978
|
})();
|
2966
2979
|
(function(){
|
2967
|
-
|
2980
|
+
|
2968
2981
|
function addParamToUrl(url, param) {
|
2969
2982
|
return url + (/\?/.test(url) ? '&' : '?') + param;
|
2970
2983
|
}
|
2971
|
-
|
2984
|
+
|
2972
2985
|
var makeXHR = (function() {
|
2973
2986
|
var factories = [
|
2974
2987
|
function() { return new ActiveXObject("Microsoft.XMLHTTP"); },
|
@@ -2987,8 +3000,8 @@ fabric.util.string = {
|
|
2987
3000
|
}
|
2988
3001
|
})();
|
2989
3002
|
|
2990
|
-
function emptyFn() { }
|
2991
|
-
|
3003
|
+
function emptyFn() { }
|
3004
|
+
|
2992
3005
|
/**
|
2993
3006
|
* Cross-browser abstraction for sending XMLHttpRequest
|
2994
3007
|
* @method request
|
@@ -3005,34 +3018,34 @@ fabric.util.string = {
|
|
3005
3018
|
|
3006
3019
|
var method = options.method ? options.method.toUpperCase() : 'GET',
|
3007
3020
|
onComplete = options.onComplete || function() { },
|
3008
|
-
|
3021
|
+
xhr = makeXHR(),
|
3009
3022
|
body;
|
3010
|
-
|
3023
|
+
|
3011
3024
|
/** @ignore */
|
3012
|
-
|
3013
|
-
if (
|
3014
|
-
onComplete(
|
3015
|
-
|
3025
|
+
xhr.onreadystatechange = function() {
|
3026
|
+
if (xhr.readyState === 4) {
|
3027
|
+
onComplete(xhr);
|
3028
|
+
xhr.onreadystatechange = emptyFn;
|
3016
3029
|
}
|
3017
3030
|
};
|
3018
|
-
|
3031
|
+
|
3019
3032
|
if (method === 'GET') {
|
3020
3033
|
body = null;
|
3021
|
-
if (typeof options.parameters
|
3034
|
+
if (typeof options.parameters === 'string') {
|
3022
3035
|
url = addParamToUrl(url, options.parameters);
|
3023
3036
|
}
|
3024
3037
|
}
|
3025
3038
|
|
3026
|
-
|
3027
|
-
|
3039
|
+
xhr.open(method, url, true);
|
3040
|
+
|
3028
3041
|
if (method === 'POST' || method === 'PUT') {
|
3029
|
-
|
3042
|
+
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
3030
3043
|
}
|
3031
3044
|
|
3032
|
-
|
3033
|
-
return
|
3034
|
-
}
|
3035
|
-
|
3045
|
+
xhr.send(body);
|
3046
|
+
return xhr;
|
3047
|
+
}
|
3048
|
+
|
3036
3049
|
fabric.util.request = request;
|
3037
3050
|
})();
|
3038
3051
|
(function() {
|
@@ -3058,7 +3071,8 @@ fabric.util.string = {
|
|
3058
3071
|
* @memberOf fabric.util.ease
|
3059
3072
|
*/
|
3060
3073
|
function easeInOutQuad(t, b, c, d) {
|
3061
|
-
|
3074
|
+
t /= (d/2);
|
3075
|
+
if (t < 1) return c/2*t*t + b;
|
3062
3076
|
return -c/2 * ((--t)*(t-2) - 1) + b;
|
3063
3077
|
}
|
3064
3078
|
|
@@ -3083,7 +3097,8 @@ fabric.util.string = {
|
|
3083
3097
|
* @memberOf fabric.util.ease
|
3084
3098
|
*/
|
3085
3099
|
function easeInOutCubic(t, b, c, d) {
|
3086
|
-
|
3100
|
+
t /= d/2;
|
3101
|
+
if (t < 1) return c/2*t*t*t + b;
|
3087
3102
|
return c/2*((t-=2)*t*t + 2) + b;
|
3088
3103
|
}
|
3089
3104
|
|
@@ -3108,7 +3123,8 @@ fabric.util.string = {
|
|
3108
3123
|
* @memberOf fabric.util.ease
|
3109
3124
|
*/
|
3110
3125
|
function easeInOutQuart(t, b, c, d) {
|
3111
|
-
|
3126
|
+
t /= d/2;
|
3127
|
+
if (t < 1) return c/2*t*t*t*t + b;
|
3112
3128
|
return -c/2 * ((t-=2)*t*t*t - 2) + b;
|
3113
3129
|
}
|
3114
3130
|
|
@@ -3133,7 +3149,8 @@ fabric.util.string = {
|
|
3133
3149
|
* @memberOf fabric.util.ease
|
3134
3150
|
*/
|
3135
3151
|
function easeInOutQuint(t, b, c, d) {
|
3136
|
-
|
3152
|
+
t /= d/2;
|
3153
|
+
if (t < 1) return c/2*t*t*t*t*t + b;
|
3137
3154
|
return c/2*((t-=2)*t*t*t*t + 2) + b;
|
3138
3155
|
}
|
3139
3156
|
|
@@ -3166,7 +3183,7 @@ fabric.util.string = {
|
|
3166
3183
|
* @memberOf fabric.util.ease
|
3167
3184
|
*/
|
3168
3185
|
function easeInExpo(t, b, c, d) {
|
3169
|
-
return (t
|
3186
|
+
return (t===0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
|
3170
3187
|
}
|
3171
3188
|
|
3172
3189
|
/**
|
@@ -3174,7 +3191,7 @@ fabric.util.string = {
|
|
3174
3191
|
* @memberOf fabric.util.ease
|
3175
3192
|
*/
|
3176
3193
|
function easeOutExpo(t, b, c, d) {
|
3177
|
-
return (t
|
3194
|
+
return (t===d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
|
3178
3195
|
}
|
3179
3196
|
|
3180
3197
|
/**
|
@@ -3182,9 +3199,10 @@ fabric.util.string = {
|
|
3182
3199
|
* @memberOf fabric.util.ease
|
3183
3200
|
*/
|
3184
3201
|
function easeInOutExpo(t, b, c, d) {
|
3185
|
-
if (t
|
3186
|
-
if (t
|
3187
|
-
|
3202
|
+
if (t===0) return b;
|
3203
|
+
if (t===d) return b+c;
|
3204
|
+
t /= d/2;
|
3205
|
+
if (t < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
|
3188
3206
|
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
|
3189
3207
|
}
|
3190
3208
|
|
@@ -3209,7 +3227,8 @@ fabric.util.string = {
|
|
3209
3227
|
* @memberOf fabric.util.ease
|
3210
3228
|
*/
|
3211
3229
|
function easeInOutCirc(t, b, c, d) {
|
3212
|
-
|
3230
|
+
t /= d/2;
|
3231
|
+
if (t < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
|
3213
3232
|
return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
|
3214
3233
|
}
|
3215
3234
|
|
@@ -3219,9 +3238,12 @@ fabric.util.string = {
|
|
3219
3238
|
*/
|
3220
3239
|
function easeInElastic(t, b, c, d) {
|
3221
3240
|
var s=1.70158;var p=0;var a=c;
|
3222
|
-
if (t
|
3223
|
-
|
3224
|
-
|
3241
|
+
if (t===0) return b;
|
3242
|
+
t /= d;
|
3243
|
+
if (t===1) return b+c;
|
3244
|
+
if (!p) p=d*0.3;
|
3245
|
+
if (a < Math.abs(c)) { a=c; s=p/4; }
|
3246
|
+
else s = p/(2*Math.PI) * Math.asin (c/a);
|
3225
3247
|
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
|
3226
3248
|
}
|
3227
3249
|
|
@@ -3231,9 +3253,12 @@ fabric.util.string = {
|
|
3231
3253
|
*/
|
3232
3254
|
function easeOutElastic(t, b, c, d) {
|
3233
3255
|
var s=1.70158;var p=0;var a=c;
|
3234
|
-
if (t
|
3235
|
-
|
3236
|
-
|
3256
|
+
if (t===0) return b;
|
3257
|
+
t /= d;
|
3258
|
+
if (t===1) return b+c;
|
3259
|
+
if (!p) p=d*0.3;
|
3260
|
+
if (a < Math.abs(c)) { a=c; s=p/4; }
|
3261
|
+
else s = p/(2*Math.PI) * Math.asin (c/a);
|
3237
3262
|
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
|
3238
3263
|
}
|
3239
3264
|
|
@@ -3243,11 +3268,14 @@ fabric.util.string = {
|
|
3243
3268
|
*/
|
3244
3269
|
function easeInOutElastic(t, b, c, d) {
|
3245
3270
|
var s=1.70158;var p=0;var a=c;
|
3246
|
-
if (t
|
3247
|
-
|
3248
|
-
|
3249
|
-
if (
|
3250
|
-
|
3271
|
+
if (t===0) return b;
|
3272
|
+
t /= d/2;
|
3273
|
+
if (t===2) return b+c;
|
3274
|
+
if (!p) p=d*(0.3*1.5);
|
3275
|
+
if (a < Math.abs(c)) { a=c; s=p/4; }
|
3276
|
+
else s = p/(2*Math.PI) * Math.asin (c/a);
|
3277
|
+
if (t < 1) return -0.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
|
3278
|
+
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
|
3251
3279
|
}
|
3252
3280
|
|
3253
3281
|
/**
|
@@ -3255,7 +3283,7 @@ fabric.util.string = {
|
|
3255
3283
|
* @memberOf fabric.util.ease
|
3256
3284
|
*/
|
3257
3285
|
function easeInBack(t, b, c, d, s) {
|
3258
|
-
if (s
|
3286
|
+
if (s === undefined) s = 1.70158;
|
3259
3287
|
return c*(t/=d)*t*((s+1)*t - s) + b;
|
3260
3288
|
}
|
3261
3289
|
|
@@ -3264,7 +3292,7 @@ fabric.util.string = {
|
|
3264
3292
|
* @memberOf fabric.util.ease
|
3265
3293
|
*/
|
3266
3294
|
function easeOutBack(t, b, c, d, s) {
|
3267
|
-
if (s
|
3295
|
+
if (s === undefined) s = 1.70158;
|
3268
3296
|
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
|
3269
3297
|
}
|
3270
3298
|
|
@@ -3273,8 +3301,9 @@ fabric.util.string = {
|
|
3273
3301
|
* @memberOf fabric.util.ease
|
3274
3302
|
*/
|
3275
3303
|
function easeInOutBack(t, b, c, d, s) {
|
3276
|
-
if (s
|
3277
|
-
|
3304
|
+
if (s === undefined) s = 1.70158;
|
3305
|
+
t /= d/2;
|
3306
|
+
if (t < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
|
3278
3307
|
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
|
3279
3308
|
}
|
3280
3309
|
|
@@ -3294,11 +3323,11 @@ fabric.util.string = {
|
|
3294
3323
|
if ((t/=d) < (1/2.75)) {
|
3295
3324
|
return c*(7.5625*t*t) + b;
|
3296
3325
|
} else if (t < (2/2.75)) {
|
3297
|
-
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
|
3326
|
+
return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
|
3298
3327
|
} else if (t < (2.5/2.75)) {
|
3299
|
-
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
|
3328
|
+
return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
|
3300
3329
|
} else {
|
3301
|
-
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
|
3330
|
+
return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
|
3302
3331
|
}
|
3303
3332
|
}
|
3304
3333
|
|
@@ -3307,8 +3336,8 @@ fabric.util.string = {
|
|
3307
3336
|
* @memberOf fabric.util.ease
|
3308
3337
|
*/
|
3309
3338
|
function easeInOutBounce(t, b, c, d) {
|
3310
|
-
if (t < d/2) return easeInBounce (t*2, 0, c, d) * .5 + b;
|
3311
|
-
return easeOutBounce (t*2-d, 0, c, d) * .5 + c
|
3339
|
+
if (t < d/2) return easeInBounce (t*2, 0, c, d) * 0.5 + b;
|
3340
|
+
return easeOutBounce (t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
|
3312
3341
|
}
|
3313
3342
|
|
3314
3343
|
/** @namespace fabric.util.ease */
|
@@ -3435,7 +3464,7 @@ fabric.util.string = {
|
|
3435
3464
|
|
3436
3465
|
ownAttributes = extend(ownAttributes, extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element)));
|
3437
3466
|
return extend(parentAttributes, ownAttributes);
|
3438
|
-
}
|
3467
|
+
}
|
3439
3468
|
|
3440
3469
|
/**
|
3441
3470
|
* Parses "transform" attribute, returning an array of values
|
@@ -3566,9 +3595,9 @@ fabric.util.string = {
|
|
3566
3595
|
matrix = args;
|
3567
3596
|
break;
|
3568
3597
|
}
|
3569
|
-
})
|
3598
|
+
});
|
3570
3599
|
return matrix;
|
3571
|
-
}
|
3600
|
+
};
|
3572
3601
|
})();
|
3573
3602
|
|
3574
3603
|
/**
|
@@ -3588,17 +3617,21 @@ fabric.util.string = {
|
|
3588
3617
|
var asPairs = points.indexOf(',') > -1;
|
3589
3618
|
|
3590
3619
|
points = points.split(/\s+/);
|
3591
|
-
var parsedPoints = [ ];
|
3620
|
+
var parsedPoints = [ ], i, len;
|
3592
3621
|
|
3593
3622
|
// points could look like "10,20 30,40" or "10 20 30 40"
|
3594
3623
|
if (asPairs) {
|
3595
|
-
|
3596
|
-
|
3597
|
-
|
3598
|
-
|
3624
|
+
i = 0;
|
3625
|
+
len = points.length;
|
3626
|
+
for (; i < len; i++) {
|
3627
|
+
var pair = points[i].split(',');
|
3628
|
+
parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) });
|
3629
|
+
}
|
3599
3630
|
}
|
3600
3631
|
else {
|
3601
|
-
|
3632
|
+
i = 0;
|
3633
|
+
len = points.length;
|
3634
|
+
for (; i < len; i+=2) {
|
3602
3635
|
parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) });
|
3603
3636
|
}
|
3604
3637
|
}
|
@@ -3609,7 +3642,7 @@ fabric.util.string = {
|
|
3609
3642
|
}
|
3610
3643
|
|
3611
3644
|
return parsedPoints;
|
3612
|
-
}
|
3645
|
+
}
|
3613
3646
|
|
3614
3647
|
/**
|
3615
3648
|
* Parses "style" attribute, retuning an object with values
|
@@ -3622,22 +3655,24 @@ fabric.util.string = {
|
|
3622
3655
|
function parseStyleAttribute(element) {
|
3623
3656
|
var oStyle = { },
|
3624
3657
|
style = element.getAttribute('style');
|
3625
|
-
|
3626
|
-
|
3627
|
-
|
3628
|
-
|
3629
|
-
|
3630
|
-
|
3631
|
-
|
3632
|
-
|
3633
|
-
|
3634
|
-
|
3635
|
-
|
3636
|
-
|
3658
|
+
|
3659
|
+
if (!style) return oStyle;
|
3660
|
+
|
3661
|
+
if (typeof style === 'string') {
|
3662
|
+
style = style.replace(/;$/, '').split(';').forEach(function (current) {
|
3663
|
+
var attr = current.split(':');
|
3664
|
+
oStyle[normalizeAttr(attr[0].trim().toLowerCase())] = attr[1].trim();
|
3665
|
+
});
|
3666
|
+
}
|
3667
|
+
else {
|
3668
|
+
for (var prop in style) {
|
3669
|
+
if (typeof style[prop] === 'undefined') continue;
|
3670
|
+
oStyle[normalizeAttr(prop.toLowerCase())] = style[prop];
|
3637
3671
|
}
|
3638
3672
|
}
|
3673
|
+
|
3639
3674
|
return oStyle;
|
3640
|
-
}
|
3675
|
+
}
|
3641
3676
|
|
3642
3677
|
function resolveGradients(instances) {
|
3643
3678
|
for (var i = instances.length; i--; ) {
|
@@ -3666,7 +3701,7 @@ fabric.util.string = {
|
|
3666
3701
|
* @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.
|
3667
3702
|
*/
|
3668
3703
|
function parseElements(elements, callback, options, reviver) {
|
3669
|
-
var instances = Array(elements.length), i = elements.length;
|
3704
|
+
var instances = new Array(elements.length), i = elements.length;
|
3670
3705
|
|
3671
3706
|
function checkIfDone() {
|
3672
3707
|
if (--i === 0) {
|
@@ -3707,7 +3742,7 @@ fabric.util.string = {
|
|
3707
3742
|
checkIfDone();
|
3708
3743
|
}
|
3709
3744
|
}
|
3710
|
-
}
|
3745
|
+
}
|
3711
3746
|
|
3712
3747
|
/**
|
3713
3748
|
* Returns CSS rules for a given SVG document
|
@@ -3731,12 +3766,12 @@ fabric.util.string = {
|
|
3731
3766
|
styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, '');
|
3732
3767
|
|
3733
3768
|
rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g);
|
3734
|
-
rules = rules.map(function(rule) { return rule.trim() });
|
3769
|
+
rules = rules.map(function(rule) { return rule.trim(); });
|
3735
3770
|
|
3736
3771
|
rules.forEach(function(rule) {
|
3737
|
-
var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/)
|
3738
|
-
|
3739
|
-
|
3772
|
+
var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/);
|
3773
|
+
rule = match[1];
|
3774
|
+
var declaration = match[2].trim(),
|
3740
3775
|
propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/);
|
3741
3776
|
|
3742
3777
|
if (!allRules[rule]) {
|
@@ -3898,7 +3933,7 @@ fabric.util.string = {
|
|
3898
3933
|
* @param {String} url
|
3899
3934
|
* @param {Function} callback
|
3900
3935
|
*/
|
3901
|
-
get: function (
|
3936
|
+
get: function () {
|
3902
3937
|
/* NOOP */
|
3903
3938
|
},
|
3904
3939
|
|
@@ -3907,7 +3942,7 @@ fabric.util.string = {
|
|
3907
3942
|
* @param {String} url
|
3908
3943
|
* @param {Object} object
|
3909
3944
|
*/
|
3910
|
-
set: function (
|
3945
|
+
set: function () {
|
3911
3946
|
/* NOOP */
|
3912
3947
|
}
|
3913
3948
|
};
|
@@ -3991,7 +4026,7 @@ fabric.util.string = {
|
|
3991
4026
|
}
|
3992
4027
|
}
|
3993
4028
|
else if (fabric.window.ActiveXObject) {
|
3994
|
-
|
4029
|
+
doc = new ActiveXObject('Microsoft.XMLDOM');
|
3995
4030
|
doc.async = 'false';
|
3996
4031
|
//IE chokes on DOCTYPE
|
3997
4032
|
doc.loadXML(string.replace(/<!DOCTYPE[\s\S]*?(\[[\s\S]*\])*?>/i,''));
|
@@ -4045,7 +4080,7 @@ fabric.util.string = {
|
|
4045
4080
|
createSVGFontFacesMarkup: createSVGFontFacesMarkup
|
4046
4081
|
});
|
4047
4082
|
|
4048
|
-
})(typeof exports
|
4083
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
4049
4084
|
|
4050
4085
|
(function() {
|
4051
4086
|
|
@@ -4140,10 +4175,8 @@ fabric.util.string = {
|
|
4140
4175
|
*/
|
4141
4176
|
|
4142
4177
|
var colorStopEls = el.getElementsByTagName('stop'),
|
4143
|
-
el,
|
4144
4178
|
offset,
|
4145
4179
|
colorStops = { },
|
4146
|
-
colorStopFromStyle,
|
4147
4180
|
coords = {
|
4148
4181
|
x1: el.getAttribute('x1') || 0,
|
4149
4182
|
y1: el.getAttribute('y1') || 0,
|
@@ -4215,15 +4248,17 @@ fabric.util.string = {
|
|
4215
4248
|
function getGradientDefs(doc) {
|
4216
4249
|
var linearGradientEls = doc.getElementsByTagName('linearGradient'),
|
4217
4250
|
radialGradientEls = doc.getElementsByTagName('radialGradient'),
|
4218
|
-
el,
|
4251
|
+
el, i,
|
4219
4252
|
gradientDefs = { };
|
4220
4253
|
|
4221
|
-
|
4254
|
+
i = linearGradientEls.length;
|
4255
|
+
for (; i--; ) {
|
4222
4256
|
el = linearGradientEls[i];
|
4223
4257
|
gradientDefs[el.getAttribute('id')] = el;
|
4224
4258
|
}
|
4225
4259
|
|
4226
|
-
|
4260
|
+
i = radialGradientEls.length;
|
4261
|
+
for (; i--; ) {
|
4227
4262
|
el = radialGradientEls[i];
|
4228
4263
|
gradientDefs[el.getAttribute('id')] = el;
|
4229
4264
|
}
|
@@ -4235,20 +4270,20 @@ fabric.util.string = {
|
|
4235
4270
|
|
4236
4271
|
})();
|
4237
4272
|
(function(global) {
|
4238
|
-
|
4273
|
+
|
4239
4274
|
"use strict";
|
4240
|
-
|
4275
|
+
|
4241
4276
|
/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */
|
4242
|
-
|
4277
|
+
|
4243
4278
|
var fabric = global.fabric || (global.fabric = { });
|
4244
4279
|
|
4245
|
-
if (fabric.Point) {
|
4280
|
+
if (fabric.Point) {
|
4246
4281
|
fabric.warn('fabric.Point is already defined');
|
4247
4282
|
return;
|
4248
4283
|
}
|
4249
4284
|
|
4250
4285
|
fabric.Point = Point;
|
4251
|
-
|
4286
|
+
|
4252
4287
|
/**
|
4253
4288
|
* @name Point
|
4254
4289
|
* @memberOf fabric
|
@@ -4262,11 +4297,11 @@ fabric.util.string = {
|
|
4262
4297
|
this.init(x, y);
|
4263
4298
|
}
|
4264
4299
|
}
|
4265
|
-
|
4300
|
+
|
4266
4301
|
Point.prototype = /** @scope fabric.Point.prototype */ {
|
4267
|
-
|
4302
|
+
|
4268
4303
|
constructor: Point,
|
4269
|
-
|
4304
|
+
|
4270
4305
|
/**
|
4271
4306
|
* @method init
|
4272
4307
|
* @param {Number} x
|
@@ -4276,7 +4311,7 @@ fabric.util.string = {
|
|
4276
4311
|
this.x = x;
|
4277
4312
|
this.y = y;
|
4278
4313
|
},
|
4279
|
-
|
4314
|
+
|
4280
4315
|
/**
|
4281
4316
|
* @method add
|
4282
4317
|
* @param {fabric.Point} that
|
@@ -4285,7 +4320,7 @@ fabric.util.string = {
|
|
4285
4320
|
add: function (that) {
|
4286
4321
|
return new Point(this.x + that.x, this.y + that.y);
|
4287
4322
|
},
|
4288
|
-
|
4323
|
+
|
4289
4324
|
/**
|
4290
4325
|
* @method addEquals
|
4291
4326
|
* @param {fabric.Point} that
|
@@ -4296,7 +4331,7 @@ fabric.util.string = {
|
|
4296
4331
|
this.y += that.y;
|
4297
4332
|
return this;
|
4298
4333
|
},
|
4299
|
-
|
4334
|
+
|
4300
4335
|
/**
|
4301
4336
|
* @method scalarAdd
|
4302
4337
|
* @param {Number} scalar
|
@@ -4305,7 +4340,7 @@ fabric.util.string = {
|
|
4305
4340
|
scalarAdd: function (scalar) {
|
4306
4341
|
return new Point(this.x + scalar, this.y + scalar);
|
4307
4342
|
},
|
4308
|
-
|
4343
|
+
|
4309
4344
|
/**
|
4310
4345
|
* @method scalarAddEquals
|
4311
4346
|
* @param {Number} scalar
|
@@ -4316,7 +4351,7 @@ fabric.util.string = {
|
|
4316
4351
|
this.y += scalar;
|
4317
4352
|
return this;
|
4318
4353
|
},
|
4319
|
-
|
4354
|
+
|
4320
4355
|
/**
|
4321
4356
|
* @method subtract
|
4322
4357
|
* @param {fabric.Point} that
|
@@ -4325,7 +4360,7 @@ fabric.util.string = {
|
|
4325
4360
|
subtract: function (that) {
|
4326
4361
|
return new Point(this.x - that.x, this.y - that.y);
|
4327
4362
|
},
|
4328
|
-
|
4363
|
+
|
4329
4364
|
/**
|
4330
4365
|
* @method subtractEquals
|
4331
4366
|
* @param {fabric.Point} that
|
@@ -4336,89 +4371,89 @@ fabric.util.string = {
|
|
4336
4371
|
this.y -= that.y;
|
4337
4372
|
return this;
|
4338
4373
|
},
|
4339
|
-
|
4374
|
+
|
4340
4375
|
scalarSubtract: function (scalar) {
|
4341
4376
|
return new Point(this.x - scalar, this.y - scalar);
|
4342
4377
|
},
|
4343
|
-
|
4378
|
+
|
4344
4379
|
scalarSubtractEquals: function (scalar) {
|
4345
4380
|
this.x -= scalar;
|
4346
4381
|
this.y -= scalar;
|
4347
4382
|
return this;
|
4348
4383
|
},
|
4349
|
-
|
4384
|
+
|
4350
4385
|
multiply: function (scalar) {
|
4351
4386
|
return new Point(this.x * scalar, this.y * scalar);
|
4352
4387
|
},
|
4353
|
-
|
4388
|
+
|
4354
4389
|
multiplyEquals: function (scalar) {
|
4355
4390
|
this.x *= scalar;
|
4356
4391
|
this.y *= scalar;
|
4357
4392
|
return this;
|
4358
4393
|
},
|
4359
|
-
|
4394
|
+
|
4360
4395
|
divide: function (scalar) {
|
4361
4396
|
return new Point(this.x / scalar, this.y / scalar);
|
4362
4397
|
},
|
4363
|
-
|
4398
|
+
|
4364
4399
|
divideEquals: function (scalar) {
|
4365
4400
|
this.x /= scalar;
|
4366
4401
|
this.y /= scalar;
|
4367
4402
|
return this;
|
4368
4403
|
},
|
4369
|
-
|
4404
|
+
|
4370
4405
|
eq: function (that) {
|
4371
|
-
return (this.x
|
4406
|
+
return (this.x === that.x && this.y === that.y);
|
4372
4407
|
},
|
4373
|
-
|
4408
|
+
|
4374
4409
|
lt: function (that) {
|
4375
4410
|
return (this.x < that.x && this.y < that.y);
|
4376
4411
|
},
|
4377
|
-
|
4412
|
+
|
4378
4413
|
lte: function (that) {
|
4379
4414
|
return (this.x <= that.x && this.y <= that.y);
|
4380
4415
|
},
|
4381
|
-
|
4416
|
+
|
4382
4417
|
gt: function (that) {
|
4383
4418
|
return (this.x > that.x && this.y > that.y);
|
4384
4419
|
},
|
4385
|
-
|
4420
|
+
|
4386
4421
|
gte: function (that) {
|
4387
4422
|
return (this.x >= that.x && this.y >= that.y);
|
4388
4423
|
},
|
4389
|
-
|
4424
|
+
|
4390
4425
|
lerp: function (that, t) {
|
4391
4426
|
return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);
|
4392
4427
|
},
|
4393
|
-
|
4428
|
+
|
4394
4429
|
distanceFrom: function (that) {
|
4395
4430
|
var dx = this.x - that.x,
|
4396
4431
|
dy = this.y - that.y;
|
4397
4432
|
return Math.sqrt(dx * dx + dy * dy);
|
4398
4433
|
},
|
4399
|
-
|
4434
|
+
|
4400
4435
|
min: function (that) {
|
4401
4436
|
return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));
|
4402
4437
|
},
|
4403
|
-
|
4438
|
+
|
4404
4439
|
max: function (that) {
|
4405
4440
|
return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));
|
4406
4441
|
},
|
4407
|
-
|
4442
|
+
|
4408
4443
|
toString: function () {
|
4409
4444
|
return this.x + "," + this.y;
|
4410
4445
|
},
|
4411
|
-
|
4446
|
+
|
4412
4447
|
setXY: function (x, y) {
|
4413
4448
|
this.x = x;
|
4414
4449
|
this.y = y;
|
4415
4450
|
},
|
4416
|
-
|
4451
|
+
|
4417
4452
|
setFromPoint: function (that) {
|
4418
4453
|
this.x = that.x;
|
4419
4454
|
this.y = that.y;
|
4420
4455
|
},
|
4421
|
-
|
4456
|
+
|
4422
4457
|
swap: function (that) {
|
4423
4458
|
var x = this.x,
|
4424
4459
|
y = this.y;
|
@@ -4428,8 +4463,8 @@ fabric.util.string = {
|
|
4428
4463
|
that.y = y;
|
4429
4464
|
}
|
4430
4465
|
};
|
4431
|
-
|
4432
|
-
})(typeof exports
|
4466
|
+
|
4467
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
4433
4468
|
(function(global) {
|
4434
4469
|
|
4435
4470
|
"use strict";
|
@@ -4492,7 +4527,7 @@ fabric.util.string = {
|
|
4492
4527
|
ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),
|
4493
4528
|
ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),
|
4494
4529
|
u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
|
4495
|
-
if (u_b
|
4530
|
+
if (u_b !== 0) {
|
4496
4531
|
var ua = ua_t / u_b,
|
4497
4532
|
ub = ub_t / u_b;
|
4498
4533
|
if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {
|
@@ -4504,7 +4539,7 @@ fabric.util.string = {
|
|
4504
4539
|
}
|
4505
4540
|
}
|
4506
4541
|
else {
|
4507
|
-
if (ua_t
|
4542
|
+
if (ua_t === 0 || ub_t === 0) {
|
4508
4543
|
result = new Intersection("Coincident");
|
4509
4544
|
}
|
4510
4545
|
else {
|
@@ -4578,18 +4613,18 @@ fabric.util.string = {
|
|
4578
4613
|
return result;
|
4579
4614
|
};
|
4580
4615
|
|
4581
|
-
})(typeof exports
|
4616
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
4582
4617
|
(function(global) {
|
4583
|
-
|
4618
|
+
|
4584
4619
|
"use strict";
|
4585
|
-
|
4620
|
+
|
4586
4621
|
var fabric = global.fabric || (global.fabric = { });
|
4587
|
-
|
4622
|
+
|
4588
4623
|
if (fabric.Color) {
|
4589
4624
|
fabric.warn('fabric.Color is already defined.');
|
4590
4625
|
return;
|
4591
4626
|
}
|
4592
|
-
|
4627
|
+
|
4593
4628
|
/**
|
4594
4629
|
* The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;
|
4595
4630
|
* {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.
|
@@ -4606,11 +4641,11 @@ fabric.util.string = {
|
|
4606
4641
|
this._tryParsingColor(color);
|
4607
4642
|
}
|
4608
4643
|
}
|
4609
|
-
|
4644
|
+
|
4610
4645
|
fabric.Color = Color;
|
4611
|
-
|
4646
|
+
|
4612
4647
|
fabric.Color.prototype = /** @scope fabric.Color.prototype */ {
|
4613
|
-
|
4648
|
+
|
4614
4649
|
/**
|
4615
4650
|
* @private
|
4616
4651
|
* @method _tryParsingColor
|
@@ -4672,19 +4707,19 @@ fabric.util.string = {
|
|
4672
4707
|
var source = this.getSource();
|
4673
4708
|
|
4674
4709
|
var r = source[0].toString(16);
|
4675
|
-
r = (r.length
|
4710
|
+
r = (r.length === 1) ? ('0' + r) : r;
|
4676
4711
|
|
4677
4712
|
var g = source[1].toString(16);
|
4678
|
-
g = (g.length
|
4713
|
+
g = (g.length === 1) ? ('0' + g) : g;
|
4679
4714
|
|
4680
4715
|
var b = source[2].toString(16);
|
4681
|
-
b = (b.length
|
4716
|
+
b = (b.length === 1) ? ('0' + b) : b;
|
4682
4717
|
|
4683
4718
|
return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();
|
4684
4719
|
},
|
4685
4720
|
|
4686
4721
|
/**
|
4687
|
-
* Gets value of alpha channel for this color
|
4722
|
+
* Gets value of alpha channel for this color
|
4688
4723
|
* @method getAlpha
|
4689
4724
|
* @return {Number} 0-1
|
4690
4725
|
*/
|
@@ -4726,8 +4761,9 @@ fabric.util.string = {
|
|
4726
4761
|
toBlackWhite: function(threshold) {
|
4727
4762
|
var source = this.getSource(),
|
4728
4763
|
average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),
|
4729
|
-
currentAlpha = source[3]
|
4730
|
-
|
4764
|
+
currentAlpha = source[3];
|
4765
|
+
|
4766
|
+
threshold = threshold || 127;
|
4731
4767
|
|
4732
4768
|
average = (Number(average) < Number(threshold)) ? 0 : 255;
|
4733
4769
|
this.setSource([average, average, average, currentAlpha]);
|
@@ -4760,14 +4796,14 @@ fabric.util.string = {
|
|
4760
4796
|
return this;
|
4761
4797
|
}
|
4762
4798
|
};
|
4763
|
-
|
4799
|
+
|
4764
4800
|
/**
|
4765
4801
|
* Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgb(255, 100, 10, 0.5), rgb(1,1,1))
|
4766
4802
|
* @static
|
4767
4803
|
* @field
|
4768
4804
|
*/
|
4769
4805
|
fabric.Color.reRGBa = /^rgba?\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(\d+(?:\.\d+)?))?\)$/;
|
4770
|
-
|
4806
|
+
|
4771
4807
|
/**
|
4772
4808
|
* Regex matching color in HEX format (ex: #FF5555, 010155, aff)
|
4773
4809
|
* @static
|
@@ -4784,7 +4820,7 @@ fabric.util.string = {
|
|
4784
4820
|
fabric.Color.fromRgb = function(color) {
|
4785
4821
|
return Color.fromSource(Color.sourceFromRgb(color));
|
4786
4822
|
};
|
4787
|
-
|
4823
|
+
|
4788
4824
|
/**
|
4789
4825
|
* Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format
|
4790
4826
|
* @method sourceFromRgb
|
@@ -4822,7 +4858,7 @@ fabric.util.string = {
|
|
4822
4858
|
fabric.Color.fromHex = function(color) {
|
4823
4859
|
return Color.fromSource(Color.sourceFromHex(color));
|
4824
4860
|
};
|
4825
|
-
|
4861
|
+
|
4826
4862
|
/**
|
4827
4863
|
* Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format
|
4828
4864
|
* @static
|
@@ -4846,7 +4882,7 @@ fabric.util.string = {
|
|
4846
4882
|
];
|
4847
4883
|
}
|
4848
4884
|
};
|
4849
|
-
|
4885
|
+
|
4850
4886
|
/**
|
4851
4887
|
* Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])
|
4852
4888
|
* @static
|
@@ -4859,8 +4895,8 @@ fabric.util.string = {
|
|
4859
4895
|
return oColor;
|
4860
4896
|
};
|
4861
4897
|
|
4862
|
-
})(typeof exports
|
4863
|
-
(function (
|
4898
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
4899
|
+
(function () {
|
4864
4900
|
|
4865
4901
|
"use strict";
|
4866
4902
|
|
@@ -4924,6 +4960,28 @@ fabric.util.string = {
|
|
4924
4960
|
*/
|
4925
4961
|
backgroundImageStretch: true,
|
4926
4962
|
|
4963
|
+
/**
|
4964
|
+
* Overlay image of canvas instance
|
4965
|
+
* Should be set via `setOverlayImage`
|
4966
|
+
* @property
|
4967
|
+
* @type String
|
4968
|
+
*/
|
4969
|
+
overlayImage: '',
|
4970
|
+
|
4971
|
+
/**
|
4972
|
+
* Left offset of overlay image (if present)
|
4973
|
+
* @property
|
4974
|
+
* @type Number
|
4975
|
+
*/
|
4976
|
+
overlayImageLeft: 0,
|
4977
|
+
|
4978
|
+
/**
|
4979
|
+
* Top offset of overlay image (if present)
|
4980
|
+
* @property
|
4981
|
+
* @type Number
|
4982
|
+
*/
|
4983
|
+
overlayImageTop: 0,
|
4984
|
+
|
4927
4985
|
/**
|
4928
4986
|
* Indicates whether toObject/toDatalessObject should include default values
|
4929
4987
|
* @property
|
@@ -4965,17 +5023,10 @@ fabric.util.string = {
|
|
4965
5023
|
* @method onBeforeScaleRotate
|
4966
5024
|
* @param {fabric.Object} target Object that's about to be scaled/rotated
|
4967
5025
|
*/
|
4968
|
-
onBeforeScaleRotate: function (
|
5026
|
+
onBeforeScaleRotate: function () {
|
4969
5027
|
/* NOOP */
|
4970
5028
|
},
|
4971
5029
|
|
4972
|
-
/**
|
4973
|
-
* Callback; invoked on every redraw of canvas and is being passed a number indicating current fps
|
4974
|
-
* @method onFpsUpdate
|
4975
|
-
* @param {Number} fps
|
4976
|
-
*/
|
4977
|
-
onFpsUpdate: null,
|
4978
|
-
|
4979
5030
|
_initStatic: function(el, options) {
|
4980
5031
|
this._objects = [];
|
4981
5032
|
|
@@ -5343,39 +5394,25 @@ fabric.util.string = {
|
|
5343
5394
|
this.clearContext(canvasToDrawOn);
|
5344
5395
|
}
|
5345
5396
|
|
5346
|
-
var
|
5347
|
-
activeGroup = this.getActiveGroup(),
|
5348
|
-
startTime = new Date();
|
5397
|
+
var activeGroup = this.getActiveGroup();
|
5349
5398
|
|
5350
5399
|
if (this.clipTo) {
|
5351
|
-
|
5352
|
-
canvasToDrawOn.beginPath();
|
5353
|
-
this.clipTo(canvasToDrawOn);
|
5354
|
-
canvasToDrawOn.clip();
|
5400
|
+
this._clipCanvas(canvasToDrawOn);
|
5355
5401
|
}
|
5356
5402
|
|
5357
5403
|
canvasToDrawOn.fillStyle = this.backgroundColor;
|
5358
5404
|
canvasToDrawOn.fillRect(0, 0, this.width, this.height);
|
5359
5405
|
|
5360
|
-
if (typeof this.backgroundImage
|
5361
|
-
|
5362
|
-
canvasToDrawOn.globalAlpha = this.backgroundImageOpacity;
|
5363
|
-
|
5364
|
-
if (this.backgroundImageStretch) {
|
5365
|
-
canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height);
|
5366
|
-
}
|
5367
|
-
else {
|
5368
|
-
canvasToDrawOn.drawImage(this.backgroundImage, 0, 0);
|
5369
|
-
}
|
5370
|
-
canvasToDrawOn.restore();
|
5406
|
+
if (typeof this.backgroundImage === 'object') {
|
5407
|
+
this._drawBackroundImage(canvasToDrawOn);
|
5371
5408
|
}
|
5372
5409
|
|
5373
|
-
|
5374
|
-
|
5375
|
-
|
5376
|
-
|
5377
|
-
this.
|
5378
|
-
|
5410
|
+
this.fire('before:render');
|
5411
|
+
|
5412
|
+
for (var i = 0, length = this._objects.length; i < length; ++i) {
|
5413
|
+
if (!activeGroup ||
|
5414
|
+
(activeGroup && this._objects[i] && !activeGroup.contains(this._objects[i]))) {
|
5415
|
+
this._draw(canvasToDrawOn, this._objects[i]);
|
5379
5416
|
}
|
5380
5417
|
}
|
5381
5418
|
|
@@ -5389,23 +5426,38 @@ fabric.util.string = {
|
|
5389
5426
|
}
|
5390
5427
|
|
5391
5428
|
if (this.overlayImage) {
|
5392
|
-
this.contextContainer.drawImage(this.overlayImage,
|
5429
|
+
this.contextContainer.drawImage(this.overlayImage, this.overlayImageLeft, this.overlayImageTop);
|
5393
5430
|
}
|
5394
5431
|
|
5395
5432
|
if (this.controlsAboveOverlay) {
|
5396
5433
|
this.drawControls(this.contextContainer);
|
5397
5434
|
}
|
5398
5435
|
|
5399
|
-
if (this.onFpsUpdate) {
|
5400
|
-
var elapsedTime = new Date() - startTime;
|
5401
|
-
this.onFpsUpdate(~~(1000 / elapsedTime));
|
5402
|
-
}
|
5403
|
-
|
5404
5436
|
this.fire('after:render');
|
5405
5437
|
|
5406
5438
|
return this;
|
5407
5439
|
},
|
5408
5440
|
|
5441
|
+
_clipCanvas: function(canvasToDrawOn) {
|
5442
|
+
canvasToDrawOn.save();
|
5443
|
+
canvasToDrawOn.beginPath();
|
5444
|
+
this.clipTo(canvasToDrawOn);
|
5445
|
+
canvasToDrawOn.clip();
|
5446
|
+
},
|
5447
|
+
|
5448
|
+
_drawBackroundImage: function(canvasToDrawOn) {
|
5449
|
+
canvasToDrawOn.save();
|
5450
|
+
canvasToDrawOn.globalAlpha = this.backgroundImageOpacity;
|
5451
|
+
|
5452
|
+
if (this.backgroundImageStretch) {
|
5453
|
+
canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height);
|
5454
|
+
}
|
5455
|
+
else {
|
5456
|
+
canvasToDrawOn.drawImage(this.backgroundImage, 0, 0);
|
5457
|
+
}
|
5458
|
+
canvasToDrawOn.restore();
|
5459
|
+
},
|
5460
|
+
|
5409
5461
|
/**
|
5410
5462
|
* Method to render only the top canvas.
|
5411
5463
|
* Also used to render the group selection box.
|
@@ -5417,7 +5469,7 @@ fabric.util.string = {
|
|
5417
5469
|
this.clearContext(this.contextTop || this.contextContainer);
|
5418
5470
|
|
5419
5471
|
if (this.overlayImage) {
|
5420
|
-
this.contextContainer.drawImage(this.overlayImage,
|
5472
|
+
this.contextContainer.drawImage(this.overlayImage, this.overlayImageLeft, this.overlayImageTop);
|
5421
5473
|
}
|
5422
5474
|
|
5423
5475
|
// we render the top context - last object
|
@@ -5470,8 +5522,12 @@ fabric.util.string = {
|
|
5470
5522
|
* @return {String}
|
5471
5523
|
*/
|
5472
5524
|
toDataURL: function (format, quality) {
|
5525
|
+
var canvasEl = this.upperCanvasEl || this.lowerCanvasEl;
|
5526
|
+
|
5473
5527
|
this.renderAll(true);
|
5474
|
-
var data = (
|
5528
|
+
var data = (fabric.StaticCanvas.supports('toDataURLWithQuality'))
|
5529
|
+
? canvasEl.toDataURL('image/' + format, quality)
|
5530
|
+
: canvasEl.toDataURL('image/' + format);
|
5475
5531
|
this.renderAll();
|
5476
5532
|
return data;
|
5477
5533
|
},
|
@@ -5634,8 +5690,9 @@ fabric.util.string = {
|
|
5634
5690
|
var data = {
|
5635
5691
|
objects: this._objects.map(function (instance) {
|
5636
5692
|
// TODO (kangax): figure out how to clean this up
|
5693
|
+
var originalValue;
|
5637
5694
|
if (!this.includeDefaultValues) {
|
5638
|
-
|
5695
|
+
originalValue = instance.includeDefaultValues;
|
5639
5696
|
instance.includeDefaultValues = false;
|
5640
5697
|
}
|
5641
5698
|
var object = instance[methodName]();
|
@@ -5929,7 +5986,7 @@ fabric.util.string = {
|
|
5929
5986
|
*
|
5930
5987
|
* @method supports
|
5931
5988
|
* @param methodName {String} Method to check support for;
|
5932
|
-
* Could be one of "getImageData" or "
|
5989
|
+
* Could be one of "getImageData", "toDataURL" or "toDataURLWithQuality"
|
5933
5990
|
* @return {Boolean | null} `true` if method is supported (or at least exists),
|
5934
5991
|
* `null` if canvas element or context can not be initialized
|
5935
5992
|
*/
|
@@ -5956,6 +6013,14 @@ fabric.util.string = {
|
|
5956
6013
|
case 'toDataURL':
|
5957
6014
|
return typeof el.toDataURL !== 'undefined';
|
5958
6015
|
|
6016
|
+
case 'toDataURLWithQuality':
|
6017
|
+
try {
|
6018
|
+
el.toDataURL('image/jpeg', 0);
|
6019
|
+
return true;
|
6020
|
+
}
|
6021
|
+
catch (e) { }
|
6022
|
+
return false;
|
6023
|
+
|
5959
6024
|
default:
|
5960
6025
|
return null;
|
5961
6026
|
}
|
@@ -5970,8 +6035,7 @@ fabric.util.string = {
|
|
5970
6035
|
*/
|
5971
6036
|
fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;
|
5972
6037
|
|
5973
|
-
})(
|
5974
|
-
|
6038
|
+
})();
|
5975
6039
|
(function() {
|
5976
6040
|
|
5977
6041
|
var extend = fabric.util.object.extend,
|
@@ -6013,13 +6077,14 @@ fabric.util.string = {
|
|
6013
6077
|
|
6014
6078
|
this._initStatic(el, options);
|
6015
6079
|
this._initInteractive();
|
6080
|
+
this._createCacheCanvas();
|
6016
6081
|
|
6017
6082
|
fabric.Canvas.activeInstance = this;
|
6018
6083
|
};
|
6019
6084
|
|
6020
6085
|
function ProtoProxy(){ }
|
6021
6086
|
ProtoProxy.prototype = fabric.StaticCanvas.prototype;
|
6022
|
-
fabric.Canvas.prototype = new ProtoProxy;
|
6087
|
+
fabric.Canvas.prototype = new ProtoProxy();
|
6023
6088
|
|
6024
6089
|
var InteractiveMethods = /** @scope fabric.Canvas.prototype */ {
|
6025
6090
|
|
@@ -6107,6 +6172,24 @@ fabric.util.string = {
|
|
6107
6172
|
*/
|
6108
6173
|
containerClass: 'canvas-container',
|
6109
6174
|
|
6175
|
+
/**
|
6176
|
+
* When true, object detection happens on per-pixel basis rather than on per-bounding-box
|
6177
|
+
* @property
|
6178
|
+
* @type Boolean
|
6179
|
+
*/
|
6180
|
+
perPixelTargetFind: false,
|
6181
|
+
|
6182
|
+
/**
|
6183
|
+
* Number of pixels around target pixel to tolerate (consider active) during object detection
|
6184
|
+
* @property
|
6185
|
+
* @type Number
|
6186
|
+
*/
|
6187
|
+
targetFindTolerance: 0,
|
6188
|
+
|
6189
|
+
/**
|
6190
|
+
* @method _initInteractive
|
6191
|
+
* @private
|
6192
|
+
*/
|
6110
6193
|
_initInteractive: function() {
|
6111
6194
|
this._currentTransform = null;
|
6112
6195
|
this._groupSelector = null;
|
@@ -6158,7 +6241,7 @@ fabric.util.string = {
|
|
6158
6241
|
_this.__onMouseMove(e);
|
6159
6242
|
};
|
6160
6243
|
|
6161
|
-
this._onResize = function (
|
6244
|
+
this._onResize = function () {
|
6162
6245
|
_this.calcOffset();
|
6163
6246
|
};
|
6164
6247
|
|
@@ -6185,6 +6268,8 @@ fabric.util.string = {
|
|
6185
6268
|
*/
|
6186
6269
|
__onMouseUp: function (e) {
|
6187
6270
|
|
6271
|
+
var target;
|
6272
|
+
|
6188
6273
|
if (this.isDrawingMode && this._isCurrentlyDrawing) {
|
6189
6274
|
this._finalizeDrawingPath();
|
6190
6275
|
this.fire('mouse:up', { e: e });
|
@@ -6193,9 +6278,9 @@ fabric.util.string = {
|
|
6193
6278
|
|
6194
6279
|
if (this._currentTransform) {
|
6195
6280
|
|
6196
|
-
var transform = this._currentTransform
|
6197
|
-
target = transform.target;
|
6281
|
+
var transform = this._currentTransform;
|
6198
6282
|
|
6283
|
+
target = transform.target;
|
6199
6284
|
if (target._scaling) {
|
6200
6285
|
target._scaling = false;
|
6201
6286
|
}
|
@@ -6242,7 +6327,7 @@ fabric.util.string = {
|
|
6242
6327
|
}, 50);
|
6243
6328
|
|
6244
6329
|
this.fire('mouse:up', { target: target, e: e });
|
6245
|
-
target && target.fire('mouseup', { e: e })
|
6330
|
+
target && target.fire('mouseup', { e: e });
|
6246
6331
|
},
|
6247
6332
|
|
6248
6333
|
/**
|
@@ -6257,7 +6342,7 @@ fabric.util.string = {
|
|
6257
6342
|
__onMouseDown: function (e) {
|
6258
6343
|
|
6259
6344
|
// accept only left clicks
|
6260
|
-
var isLeftClick = 'which' in e ? e.which
|
6345
|
+
var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1;
|
6261
6346
|
if (!isLeftClick && !fabric.isTouchSupported) return;
|
6262
6347
|
|
6263
6348
|
if (this.isDrawingMode) {
|
@@ -6293,7 +6378,7 @@ fabric.util.string = {
|
|
6293
6378
|
// rotate and scale will happen at the same time
|
6294
6379
|
this.stateful && target.saveState();
|
6295
6380
|
|
6296
|
-
if (corner = target._findTargetCorner(e, this._offset)) {
|
6381
|
+
if ((corner = target._findTargetCorner(e, this._offset))) {
|
6297
6382
|
this.onBeforeScaleRotate(target);
|
6298
6383
|
}
|
6299
6384
|
|
@@ -6329,6 +6414,8 @@ fabric.util.string = {
|
|
6329
6414
|
*/
|
6330
6415
|
__onMouseMove: function (e) {
|
6331
6416
|
|
6417
|
+
var target;
|
6418
|
+
|
6332
6419
|
if (this.isDrawingMode) {
|
6333
6420
|
if (this._isCurrentlyDrawing) {
|
6334
6421
|
this._captureDrawingPath(e);
|
@@ -6337,11 +6424,12 @@ fabric.util.string = {
|
|
6337
6424
|
return;
|
6338
6425
|
}
|
6339
6426
|
|
6340
|
-
var groupSelector = this._groupSelector;
|
6427
|
+
var groupSelector = this._groupSelector, pointer;
|
6341
6428
|
|
6342
6429
|
// We initially clicked in an empty area, so we draw a box for multiple selection.
|
6343
6430
|
if (groupSelector !== null) {
|
6344
|
-
|
6431
|
+
pointer = getPointer(e);
|
6432
|
+
|
6345
6433
|
groupSelector.left = pointer.x - this._offset.left - groupSelector.ex;
|
6346
6434
|
groupSelector.top = pointer.y - this._offset.top - groupSelector.ey;
|
6347
6435
|
this.renderTop();
|
@@ -6355,7 +6443,7 @@ fabric.util.string = {
|
|
6355
6443
|
// what part of the pictures we are hovering to change the caret symbol.
|
6356
6444
|
// We won't do that while dragging or rotating in order to improve the
|
6357
6445
|
// performance.
|
6358
|
-
|
6446
|
+
target = this.findTarget(e);
|
6359
6447
|
|
6360
6448
|
if (!target) {
|
6361
6449
|
// image/text was hovered-out from, we remove its borders
|
@@ -6377,8 +6465,9 @@ fabric.util.string = {
|
|
6377
6465
|
}
|
6378
6466
|
else {
|
6379
6467
|
// object is being transformed (scaled/rotated/moved/etc.)
|
6380
|
-
|
6381
|
-
|
6468
|
+
pointer = getPointer(e);
|
6469
|
+
|
6470
|
+
var x = pointer.x,
|
6382
6471
|
y = pointer.y;
|
6383
6472
|
|
6384
6473
|
this._currentTransform.target.isMoving = true;
|
@@ -6495,6 +6584,49 @@ fabric.util.string = {
|
|
6495
6584
|
return { x: x, y: y };
|
6496
6585
|
},
|
6497
6586
|
|
6587
|
+
_isTargetTransparent: function (target, x, y) {
|
6588
|
+
var cacheContext = this.contextCache;
|
6589
|
+
|
6590
|
+
var hasBorders = target.hasBorders, transparentCorners = target.transparentCorners;
|
6591
|
+
target.hasBorders = target.transparentCorners = false;
|
6592
|
+
|
6593
|
+
this._draw(cacheContext, target);
|
6594
|
+
|
6595
|
+
target.hasBorders = hasBorders;
|
6596
|
+
target.transparentCorners = transparentCorners;
|
6597
|
+
|
6598
|
+
// If tolerance is > 0 adjust start coords to take into account. If moves off Canvas fix to 0
|
6599
|
+
if (this.targetFindTolerance > 0) {
|
6600
|
+
if (x > this.targetFindTolerance) {
|
6601
|
+
x -= this.targetFindTolerance;
|
6602
|
+
}
|
6603
|
+
else {
|
6604
|
+
x = 0;
|
6605
|
+
}
|
6606
|
+
if (y > this.targetFindTolerance) {
|
6607
|
+
y -= this.targetFindTolerance;
|
6608
|
+
}
|
6609
|
+
else {
|
6610
|
+
y = 0;
|
6611
|
+
}
|
6612
|
+
}
|
6613
|
+
|
6614
|
+
var isTransparent = true;
|
6615
|
+
var imageData = cacheContext.getImageData(
|
6616
|
+
x, y, (this.targetFindTolerance * 2) || 1, (this.targetFindTolerance * 2) || 1);
|
6617
|
+
|
6618
|
+
// Split image data - for tolerance > 1, pixelDataSize = 4;
|
6619
|
+
for (var i = 3; i < imageData.data.length; i += 4) {
|
6620
|
+
var temp = imageData.data[i];
|
6621
|
+
isTransparent = temp <= 0;
|
6622
|
+
if (isTransparent === false) break; //Stop if colour found
|
6623
|
+
}
|
6624
|
+
|
6625
|
+
imageData = null;
|
6626
|
+
this.clearContext(cacheContext);
|
6627
|
+
return isTransparent;
|
6628
|
+
},
|
6629
|
+
|
6498
6630
|
/**
|
6499
6631
|
* @private
|
6500
6632
|
* @method _shouldClearSelection
|
@@ -6522,7 +6654,7 @@ fabric.util.string = {
|
|
6522
6654
|
corner,
|
6523
6655
|
pointer = getPointer(e);
|
6524
6656
|
|
6525
|
-
if (corner = target._findTargetCorner(e, this._offset)) {
|
6657
|
+
if ((corner = target._findTargetCorner(e, this._offset))) {
|
6526
6658
|
action = (corner === 'ml' || corner === 'mr')
|
6527
6659
|
? 'scaleX'
|
6528
6660
|
: (corner === 'mt' || corner === 'mb')
|
@@ -6652,17 +6784,14 @@ fabric.util.string = {
|
|
6652
6784
|
minY = utilMin(this._freeDrawingYPoints),
|
6653
6785
|
maxX = utilMax(this._freeDrawingXPoints),
|
6654
6786
|
maxY = utilMax(this._freeDrawingYPoints),
|
6655
|
-
ctx = this.contextTop,
|
6656
6787
|
path = [ ],
|
6657
|
-
xPoint,
|
6658
|
-
yPoint,
|
6659
6788
|
xPoints = this._freeDrawingXPoints,
|
6660
6789
|
yPoints = this._freeDrawingYPoints;
|
6661
6790
|
|
6662
6791
|
path.push('M ', xPoints[0] - minX, ' ', yPoints[0] - minY, ' ');
|
6663
6792
|
|
6664
|
-
for (var i = 1
|
6665
|
-
path.push('L ',
|
6793
|
+
for (var i = 1, len = xPoints.length; i < len; i++) {
|
6794
|
+
path.push('L ', xPoints[i] - minX, ' ', yPoints[i] - minY, ' ');
|
6666
6795
|
}
|
6667
6796
|
|
6668
6797
|
// TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path,
|
@@ -6827,9 +6956,7 @@ fabric.util.string = {
|
|
6827
6956
|
},
|
6828
6957
|
|
6829
6958
|
_findSelectedObjects: function (e) {
|
6830
|
-
var
|
6831
|
-
targetRegion,
|
6832
|
-
group = [ ],
|
6959
|
+
var group = [ ],
|
6833
6960
|
x1 = this._groupSelector.ex,
|
6834
6961
|
y1 = this._groupSelector.ey,
|
6835
6962
|
x2 = x1 + this._groupSelector.left,
|
@@ -6858,7 +6985,7 @@ fabric.util.string = {
|
|
6858
6985
|
this.setActiveObject(group[0], e);
|
6859
6986
|
}
|
6860
6987
|
else if (group.length > 1) {
|
6861
|
-
|
6988
|
+
group = new fabric.Group(group);
|
6862
6989
|
this.setActiveGroup(group);
|
6863
6990
|
group.saveCoords();
|
6864
6991
|
this.fire('selection:created', { target: group });
|
@@ -6887,9 +7014,25 @@ fabric.util.string = {
|
|
6887
7014
|
}
|
6888
7015
|
|
6889
7016
|
// then check all of the objects on canvas
|
7017
|
+
// Cache all targets where their bounding box contains point.
|
7018
|
+
var possibleTargets = [];
|
6890
7019
|
for (var i = this._objects.length; i--; ) {
|
6891
7020
|
if (this._objects[i] && this.containsPoint(e, this._objects[i])) {
|
6892
|
-
|
7021
|
+
if (this.perPixelTargetFind || this._objects[i].perPixelTargetFind) {
|
7022
|
+
possibleTargets[possibleTargets.length] = this._objects[i];
|
7023
|
+
}
|
7024
|
+
else {
|
7025
|
+
target = this._objects[i];
|
7026
|
+
this.relatedTarget = target;
|
7027
|
+
break;
|
7028
|
+
}
|
7029
|
+
}
|
7030
|
+
}
|
7031
|
+
for (var j = 0, len = possibleTargets.length; j < len; j++) {
|
7032
|
+
pointer = this.getPointer(e);
|
7033
|
+
var isTransparent = this._isTargetTransparent(possibleTargets[j], pointer.x, pointer.y);
|
7034
|
+
if (!isTransparent) {
|
7035
|
+
target = possibleTargets[j];
|
6893
7036
|
this.relatedTarget = target;
|
6894
7037
|
break;
|
6895
7038
|
}
|
@@ -6927,6 +7070,13 @@ fabric.util.string = {
|
|
6927
7070
|
this.contextTop = this.upperCanvasEl.getContext('2d');
|
6928
7071
|
},
|
6929
7072
|
|
7073
|
+
_createCacheCanvas: function () {
|
7074
|
+
this.cacheCanvasEl = this._createCanvasElement();
|
7075
|
+
this.cacheCanvasEl.setAttribute('width', this.width);
|
7076
|
+
this.cacheCanvasEl.setAttribute('height', this.height);
|
7077
|
+
this.contextCache = this.cacheCanvasEl.getContext('2d');
|
7078
|
+
},
|
7079
|
+
|
6930
7080
|
/**
|
6931
7081
|
* @private
|
6932
7082
|
* @method _initWrapperElement
|
@@ -7279,95 +7429,96 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7279
7429
|
}
|
7280
7430
|
}
|
7281
7431
|
|
7282
|
-
|
7283
|
-
|
7284
|
-
numTotalObjects = objects.length;
|
7432
|
+
/** @ignore */
|
7433
|
+
function loadObject(obj, index) {
|
7285
7434
|
|
7286
|
-
|
7287
|
-
|
7288
|
-
}
|
7435
|
+
var pathProp = obj.paths ? 'paths' : 'path';
|
7436
|
+
var path = obj[pathProp];
|
7289
7437
|
|
7290
|
-
|
7291
|
-
|
7292
|
-
|
7293
|
-
|
7294
|
-
|
7295
|
-
|
7296
|
-
|
7297
|
-
|
7298
|
-
if (typeof path !== 'string') {
|
7299
|
-
switch (obj.type) {
|
7300
|
-
case 'image':
|
7301
|
-
fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) {
|
7302
|
-
onObjectLoaded(o, index);
|
7303
|
-
});
|
7304
|
-
break;
|
7305
|
-
default:
|
7306
|
-
var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))];
|
7307
|
-
if (klass && klass.fromObject) {
|
7308
|
-
// restore path
|
7309
|
-
if (path) {
|
7310
|
-
obj[pathProp] = path;
|
7311
|
-
}
|
7312
|
-
onObjectLoaded(klass.fromObject(obj), index);
|
7313
|
-
}
|
7314
|
-
break;
|
7315
|
-
}
|
7438
|
+
delete obj[pathProp];
|
7439
|
+
|
7440
|
+
if (typeof path !== 'string') {
|
7441
|
+
if (obj.type === 'image') {
|
7442
|
+
fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) {
|
7443
|
+
onObjectLoaded(o, index);
|
7444
|
+
});
|
7316
7445
|
}
|
7317
7446
|
else {
|
7318
|
-
|
7319
|
-
|
7320
|
-
var oImg = new fabric.Image(image);
|
7447
|
+
var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))];
|
7448
|
+
if (!klass || !klass.fromObject) return;
|
7321
7449
|
|
7322
|
-
|
7450
|
+
// restore path
|
7451
|
+
if (path) {
|
7452
|
+
obj[pathProp] = path;
|
7453
|
+
}
|
7454
|
+
onObjectLoaded(klass.fromObject(obj), index);
|
7455
|
+
}
|
7456
|
+
}
|
7457
|
+
else {
|
7458
|
+
if (obj.type === 'image') {
|
7459
|
+
fabric.util.loadImage(path, function (image) {
|
7460
|
+
var oImg = new fabric.Image(image);
|
7323
7461
|
|
7324
|
-
|
7325
|
-
oImg.setAngle(obj.angle);
|
7462
|
+
oImg.setSourcePath(path);
|
7326
7463
|
|
7327
|
-
|
7328
|
-
|
7329
|
-
}
|
7330
|
-
else if (obj.type === 'text') {
|
7464
|
+
fabric.util.object.extend(oImg, obj);
|
7465
|
+
oImg.setAngle(obj.angle);
|
7331
7466
|
|
7332
|
-
|
7333
|
-
|
7334
|
-
|
7335
|
-
|
7336
|
-
obj.path = path;
|
7337
|
-
var object = fabric.Text.fromObject(obj);
|
7338
|
-
var onscriptload = function () {
|
7339
|
-
// TODO (kangax): find out why Opera refuses to work without this timeout
|
7340
|
-
if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') {
|
7341
|
-
setTimeout(function () {
|
7342
|
-
onObjectLoaded(object, index);
|
7343
|
-
}, 500);
|
7344
|
-
}
|
7345
|
-
else {
|
7346
|
-
onObjectLoaded(object, index);
|
7347
|
-
}
|
7348
|
-
}
|
7467
|
+
onObjectLoaded(oImg, index);
|
7468
|
+
});
|
7469
|
+
}
|
7470
|
+
else if (obj.type === 'text') {
|
7349
7471
|
|
7350
|
-
|
7351
|
-
|
7472
|
+
if (obj.useNative) {
|
7473
|
+
onObjectLoaded(fabric.Text.fromObject(obj), index);
|
7352
7474
|
}
|
7353
7475
|
else {
|
7354
|
-
|
7355
|
-
|
7356
|
-
|
7357
|
-
//
|
7358
|
-
|
7359
|
-
|
7360
|
-
|
7361
|
-
|
7362
|
-
object.setAngle(obj.angle);
|
7363
|
-
}
|
7476
|
+
obj.path = path;
|
7477
|
+
var object = fabric.Text.fromObject(obj);
|
7478
|
+
var onscriptload = function () {
|
7479
|
+
// TODO (kangax): find out why Opera refuses to work without this timeout
|
7480
|
+
if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') {
|
7481
|
+
setTimeout(function () {
|
7482
|
+
onObjectLoaded(object, index);
|
7483
|
+
}, 500);
|
7364
7484
|
}
|
7485
|
+
else {
|
7486
|
+
onObjectLoaded(object, index);
|
7487
|
+
}
|
7488
|
+
};
|
7365
7489
|
|
7366
|
-
|
7367
|
-
});
|
7490
|
+
fabric.util.getScript(path, onscriptload);
|
7368
7491
|
}
|
7369
7492
|
}
|
7370
|
-
|
7493
|
+
else {
|
7494
|
+
fabric.loadSVGFromURL(path, function (elements) {
|
7495
|
+
var object = fabric.util.groupSVGElements(elements, obj, path);
|
7496
|
+
|
7497
|
+
// copy parameters from serialied json to object (left, top, scaleX, scaleY, etc.)
|
7498
|
+
// skip this step if an object is a PathGroup, since we already passed it options object before
|
7499
|
+
if (!(object instanceof fabric.PathGroup)) {
|
7500
|
+
fabric.util.object.extend(object, obj);
|
7501
|
+
if (typeof obj.angle !== 'undefined') {
|
7502
|
+
object.setAngle(obj.angle);
|
7503
|
+
}
|
7504
|
+
}
|
7505
|
+
|
7506
|
+
onObjectLoaded(object, index);
|
7507
|
+
});
|
7508
|
+
}
|
7509
|
+
}
|
7510
|
+
}
|
7511
|
+
|
7512
|
+
var _this = this,
|
7513
|
+
numLoadedObjects = 0,
|
7514
|
+
numTotalObjects = objects.length;
|
7515
|
+
|
7516
|
+
if (numTotalObjects === 0 && callback) {
|
7517
|
+
callback();
|
7518
|
+
}
|
7519
|
+
|
7520
|
+
try {
|
7521
|
+
objects.forEach(loadObject, this);
|
7371
7522
|
}
|
7372
7523
|
catch(e) {
|
7373
7524
|
fabric.log(e.message);
|
@@ -7503,7 +7654,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7503
7654
|
|
7504
7655
|
var fabric = global.fabric || (global.fabric = { }),
|
7505
7656
|
extend = fabric.util.object.extend,
|
7506
|
-
clone = fabric.util.object.clone,
|
7507
7657
|
toFixed = fabric.util.toFixed,
|
7508
7658
|
capitalize = fabric.util.string.capitalize,
|
7509
7659
|
getPointer = fabric.util.getPointer,
|
@@ -7593,6 +7743,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7593
7743
|
*/
|
7594
7744
|
cornersize: 12,
|
7595
7745
|
|
7746
|
+
/**
|
7747
|
+
* @property
|
7748
|
+
* @type Boolean
|
7749
|
+
*/
|
7750
|
+
transparentCorners: true,
|
7751
|
+
|
7596
7752
|
/**
|
7597
7753
|
* @property
|
7598
7754
|
* @type Number
|
@@ -7706,9 +7862,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7706
7862
|
* @property
|
7707
7863
|
* @type Number
|
7708
7864
|
*/
|
7709
|
-
_theta:
|
7865
|
+
_theta: 0,
|
7866
|
+
|
7867
|
+
perPixelTargetFind: false,
|
7710
7868
|
|
7711
|
-
includeDefaultValues:
|
7869
|
+
includeDefaultValues: true,
|
7712
7870
|
|
7713
7871
|
/**
|
7714
7872
|
* List of properties to consider when checking if state of an object is changed (fabric.Object#hasStateChanged);
|
@@ -7742,7 +7900,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7742
7900
|
initialize: function(options) {
|
7743
7901
|
if (options) {
|
7744
7902
|
this.setOptions(options);
|
7745
|
-
this._initGradient(options);
|
7746
7903
|
}
|
7747
7904
|
},
|
7748
7905
|
|
@@ -7750,7 +7907,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7750
7907
|
* @method initGradient
|
7751
7908
|
*/
|
7752
7909
|
_initGradient: function(options) {
|
7753
|
-
if (options.fill && typeof options.fill
|
7910
|
+
if (options.fill && typeof options.fill === 'object' && !(options.fill instanceof fabric.Gradient)) {
|
7754
7911
|
this.set('fill', new fabric.Gradient(options.fill));
|
7755
7912
|
}
|
7756
7913
|
},
|
@@ -7767,6 +7924,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7767
7924
|
this.set(prop, options[prop]);
|
7768
7925
|
}
|
7769
7926
|
}
|
7927
|
+
this._initGradient(options);
|
7770
7928
|
},
|
7771
7929
|
|
7772
7930
|
/**
|
@@ -7812,7 +7970,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
7812
7970
|
selectable: this.selectable,
|
7813
7971
|
hasControls: this.hasControls,
|
7814
7972
|
hasBorders: this.hasBorders,
|
7815
|
-
hasRotatingPoint: this.hasRotatingPoint
|
7973
|
+
hasRotatingPoint: this.hasRotatingPoint,
|
7974
|
+
transparentCorners: this.transparentCorners,
|
7975
|
+
perPixelTargetFind: this.perPixelTargetFind
|
7816
7976
|
};
|
7817
7977
|
|
7818
7978
|
if (!this.includeDefaultValues) {
|
@@ -8025,7 +8185,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8025
8185
|
|
8026
8186
|
if (this.active && !noTransform) {
|
8027
8187
|
this.drawBorders(ctx);
|
8028
|
-
this.
|
8188
|
+
this.drawCorners(ctx);
|
8029
8189
|
}
|
8030
8190
|
ctx.restore();
|
8031
8191
|
},
|
@@ -8058,29 +8218,34 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8058
8218
|
scale: function(value) {
|
8059
8219
|
this.scaleX = value;
|
8060
8220
|
this.scaleY = value;
|
8221
|
+
this.setCoords();
|
8061
8222
|
return this;
|
8062
8223
|
},
|
8063
8224
|
|
8064
8225
|
/**
|
8065
|
-
* Scales an object to a given width (scaling by x/y equally)
|
8226
|
+
* Scales an object to a given width, with respect to bounding box (scaling by x/y equally)
|
8066
8227
|
* @method scaleToWidth
|
8067
8228
|
* @param value {Number} new width value
|
8068
8229
|
* @return {fabric.Object} thisArg
|
8069
8230
|
* @chainable
|
8070
8231
|
*/
|
8071
8232
|
scaleToWidth: function(value) {
|
8072
|
-
|
8233
|
+
// adjust to bounding rect factor so that rotated shapes would fit as well
|
8234
|
+
var boundingRectFactor = this.getBoundingRectWidth() / this.getWidth();
|
8235
|
+
return this.scale(value / this.width / boundingRectFactor);
|
8073
8236
|
},
|
8074
8237
|
|
8075
8238
|
/**
|
8076
|
-
* Scales an object to a given height (scaling by x/y equally)
|
8239
|
+
* Scales an object to a given height, with respect to bounding box (scaling by x/y equally)
|
8077
8240
|
* @method scaleToHeight
|
8078
8241
|
* @param value {Number} new height value
|
8079
8242
|
* @return {fabric.Object} thisArg
|
8080
8243
|
* @chainable
|
8081
8244
|
*/
|
8082
8245
|
scaleToHeight: function(value) {
|
8083
|
-
|
8246
|
+
// adjust to bounding rect factor so that rotated shapes would fit as well
|
8247
|
+
var boundingRectFactor = this.getBoundingRectHeight() / this.getHeight();
|
8248
|
+
return this.scale(value / this.height / boundingRectFactor);
|
8084
8249
|
},
|
8085
8250
|
|
8086
8251
|
/**
|
@@ -8130,6 +8295,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8130
8295
|
this.currentWidth = (this.width + strokeWidth) * this.scaleX + padding * 2;
|
8131
8296
|
this.currentHeight = (this.height + strokeWidth) * this.scaleY + padding * 2;
|
8132
8297
|
|
8298
|
+
//If width is negative, make postive. Fixes path selection issue
|
8299
|
+
if(this.currentWidth < 0){
|
8300
|
+
this.currentWidth = Math.abs(this.currentWidth);
|
8301
|
+
}
|
8302
|
+
|
8133
8303
|
this._hypotenuse = Math.sqrt(
|
8134
8304
|
Math.pow(this.currentWidth / 2, 2) +
|
8135
8305
|
Math.pow(this.currentHeight / 2, 2));
|
@@ -8209,6 +8379,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8209
8379
|
* @return {Number} width value
|
8210
8380
|
*/
|
8211
8381
|
getBoundingRectWidth: function() {
|
8382
|
+
this.oCoords || this.setCoords();
|
8212
8383
|
var xCoords = [this.oCoords.tl.x, this.oCoords.tr.x, this.oCoords.br.x, this.oCoords.bl.x];
|
8213
8384
|
var minX = fabric.util.array.min(xCoords);
|
8214
8385
|
var maxX = fabric.util.array.max(xCoords);
|
@@ -8221,6 +8392,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8221
8392
|
* @return {Number} height value
|
8222
8393
|
*/
|
8223
8394
|
getBoundingRectHeight: function() {
|
8395
|
+
this.oCoords || this.setCoords();
|
8224
8396
|
var yCoords = [this.oCoords.tl.y, this.oCoords.tr.y, this.oCoords.br.y, this.oCoords.bl.y];
|
8225
8397
|
var minY = fabric.util.array.min(yCoords);
|
8226
8398
|
var maxY = fabric.util.array.max(yCoords);
|
@@ -8266,7 +8438,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8266
8438
|
~~(h + padding2 + strokeWidth * this.scaleY)
|
8267
8439
|
);
|
8268
8440
|
|
8269
|
-
if (this.hasRotatingPoint && !this.
|
8441
|
+
if (this.hasRotatingPoint && !this.lockRotation && this.hasControls) {
|
8270
8442
|
|
8271
8443
|
var rotateHeight = (
|
8272
8444
|
this.flipY
|
@@ -8274,8 +8446,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8274
8446
|
: -h - (strokeWidth * this.scaleY) - (padding * 2)
|
8275
8447
|
) / 2;
|
8276
8448
|
|
8277
|
-
var rotateWidth = (-w/2);
|
8278
|
-
|
8279
8449
|
ctx.beginPath();
|
8280
8450
|
ctx.moveTo(0, rotateHeight);
|
8281
8451
|
ctx.lineTo(0, rotateHeight + (this.flipY ? this.rotatingPointOffset : -this.rotatingPointOffset));
|
@@ -8298,8 +8468,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8298
8468
|
x = -this.width/2, y = -this.height/2,
|
8299
8469
|
_this = this,
|
8300
8470
|
padding = this.padding,
|
8301
|
-
width = this.getWidth(),
|
8302
|
-
height = this.getHeight(),
|
8303
8471
|
dashedArrayLength = this.strokeDashArray.length;
|
8304
8472
|
|
8305
8473
|
ctx.save();
|
@@ -8308,6 +8476,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8308
8476
|
function renderSide(xMultiplier, yMultiplier) {
|
8309
8477
|
|
8310
8478
|
var lineLength = 0,
|
8479
|
+
lengthDiff = 0,
|
8311
8480
|
sideLength = (yMultiplier ? _this.height : _this.width) + padding * 2;
|
8312
8481
|
|
8313
8482
|
while (lineLength < sideLength) {
|
@@ -8316,7 +8485,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8316
8485
|
lineLength += lengthOfSubPath;
|
8317
8486
|
|
8318
8487
|
if (lineLength > sideLength) {
|
8319
|
-
|
8488
|
+
lengthDiff = lineLength - sideLength;
|
8320
8489
|
}
|
8321
8490
|
|
8322
8491
|
// track coords
|
@@ -8372,7 +8541,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8372
8541
|
scaleOffsetSizeX = (size2 - size) / this.scaleX,
|
8373
8542
|
scaleOffsetSizeY = (size2 - size) / this.scaleY,
|
8374
8543
|
height = this.height,
|
8375
|
-
width = this.width
|
8544
|
+
width = this.width,
|
8545
|
+
methodName = this.transparentCorners ? 'strokeRect' : 'fillRect';
|
8376
8546
|
|
8377
8547
|
ctx.save();
|
8378
8548
|
|
@@ -8386,28 +8556,28 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8386
8556
|
_top = top - scaleOffsetY - strokeWidth2 - paddingY;
|
8387
8557
|
|
8388
8558
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8389
|
-
ctx
|
8559
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8390
8560
|
|
8391
8561
|
// top-right
|
8392
8562
|
_left = left + width - scaleOffsetX + strokeWidth2 + paddingX;
|
8393
8563
|
_top = top - scaleOffsetY - strokeWidth2 - paddingY;
|
8394
8564
|
|
8395
8565
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8396
|
-
ctx
|
8566
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8397
8567
|
|
8398
8568
|
// bottom-left
|
8399
8569
|
_left = left - scaleOffsetX - strokeWidth2 - paddingX;
|
8400
8570
|
_top = top + height + scaleOffsetSizeY + strokeWidth2 + paddingY;
|
8401
8571
|
|
8402
8572
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8403
|
-
ctx
|
8573
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8404
8574
|
|
8405
8575
|
// bottom-right
|
8406
8576
|
_left = left + width + scaleOffsetSizeX + strokeWidth2 + paddingX;
|
8407
8577
|
_top = top + height + scaleOffsetSizeY + strokeWidth2 + paddingY;
|
8408
8578
|
|
8409
8579
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8410
|
-
ctx
|
8580
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8411
8581
|
|
8412
8582
|
if (!this.lockUniScaling) {
|
8413
8583
|
// middle-top
|
@@ -8415,28 +8585,28 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8415
8585
|
_top = top - scaleOffsetY - strokeWidth2 - paddingY;
|
8416
8586
|
|
8417
8587
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8418
|
-
ctx
|
8588
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8419
8589
|
|
8420
8590
|
// middle-bottom
|
8421
8591
|
_left = left + width/2 - scaleOffsetX;
|
8422
8592
|
_top = top + height + scaleOffsetSizeY + strokeWidth2 + paddingY;
|
8423
8593
|
|
8424
8594
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8425
|
-
ctx
|
8595
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8426
8596
|
|
8427
8597
|
// middle-right
|
8428
8598
|
_left = left + width + scaleOffsetSizeX + strokeWidth2 + paddingX;
|
8429
8599
|
_top = top + height/2 - scaleOffsetY;
|
8430
8600
|
|
8431
8601
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8432
|
-
ctx
|
8602
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8433
8603
|
|
8434
8604
|
// middle-left
|
8435
8605
|
_left = left - scaleOffsetX - strokeWidth2 - paddingX;
|
8436
8606
|
_top = top + height/2 - scaleOffsetY;
|
8437
8607
|
|
8438
8608
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8439
|
-
ctx
|
8609
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8440
8610
|
}
|
8441
8611
|
|
8442
8612
|
// middle-top-rotate
|
@@ -8449,7 +8619,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8449
8619
|
: (top - (this.rotatingPointOffset / this.scaleY) - sizeY/2 - strokeWidth2 - paddingY);
|
8450
8620
|
|
8451
8621
|
ctx.clearRect(_left, _top, sizeX, sizeY);
|
8452
|
-
ctx
|
8622
|
+
ctx[methodName](_left, _top, sizeX, sizeY);
|
8453
8623
|
}
|
8454
8624
|
|
8455
8625
|
ctx.restore();
|
@@ -8511,12 +8681,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8511
8681
|
*/
|
8512
8682
|
toDataURL: function(callback) {
|
8513
8683
|
var el = fabric.document.createElement('canvas');
|
8514
|
-
if (!el.getContext && typeof G_vmlCanvasManager
|
8684
|
+
if (!el.getContext && typeof G_vmlCanvasManager !== 'undefined') {
|
8515
8685
|
G_vmlCanvasManager.initElement(el);
|
8516
8686
|
}
|
8517
8687
|
|
8518
|
-
this.
|
8519
|
-
el.width = this.getBoundingRectWidth();
|
8688
|
+
el.width = this.getBoundingRectWidth();
|
8520
8689
|
el.height = this.getBoundingRectHeight();
|
8521
8690
|
|
8522
8691
|
fabric.util.wrapElement(el, 'div');
|
@@ -8614,7 +8783,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8614
8783
|
tr: new fabric.Point(oCoords.tr.x, oCoords.tr.y),
|
8615
8784
|
bl: new fabric.Point(oCoords.bl.x, oCoords.bl.y),
|
8616
8785
|
br: new fabric.Point(oCoords.br.x, oCoords.br.y)
|
8617
|
-
}
|
8786
|
+
};
|
8618
8787
|
}
|
8619
8788
|
var thisCoords = getCoords(this.oCoords),
|
8620
8789
|
otherCoords = getCoords(other.oCoords);
|
@@ -8648,8 +8817,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8648
8817
|
var oCoords = this.oCoords,
|
8649
8818
|
tl = new fabric.Point(oCoords.tl.x, oCoords.tl.y),
|
8650
8819
|
tr = new fabric.Point(oCoords.tr.x, oCoords.tr.y),
|
8651
|
-
bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y)
|
8652
|
-
br = new fabric.Point(oCoords.br.x, oCoords.br.y);
|
8820
|
+
bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y);
|
8653
8821
|
|
8654
8822
|
return tl.x > selectionTL.x
|
8655
8823
|
&& tr.x < selectionBR.x
|
@@ -8684,29 +8852,33 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8684
8852
|
lines;
|
8685
8853
|
|
8686
8854
|
for (var i in this.oCoords) {
|
8855
|
+
|
8687
8856
|
if (i === 'mtr' && !this.hasRotatingPoint) {
|
8688
|
-
|
8857
|
+
continue;
|
8689
8858
|
}
|
8859
|
+
|
8690
8860
|
if (this.lockUniScaling && (i === 'mt' || i === 'mr' || i === 'mb' || i === 'ml')) {
|
8691
|
-
|
8861
|
+
continue;
|
8692
8862
|
}
|
8693
8863
|
|
8694
8864
|
lines = this._getImageLines(this.oCoords[i].corner, i);
|
8865
|
+
|
8695
8866
|
// debugging
|
8867
|
+
|
8696
8868
|
// canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);
|
8697
|
-
//
|
8698
|
-
|
8699
|
-
//
|
8700
|
-
//
|
8701
|
-
|
8702
|
-
//
|
8703
|
-
//
|
8704
|
-
|
8705
|
-
//
|
8706
|
-
//
|
8869
|
+
// canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);
|
8870
|
+
|
8871
|
+
// canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);
|
8872
|
+
// canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);
|
8873
|
+
|
8874
|
+
// canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);
|
8875
|
+
// canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);
|
8876
|
+
|
8877
|
+
// canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);
|
8878
|
+
// canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);
|
8707
8879
|
|
8708
8880
|
xpoints = this._findCrossPoints(ex, ey, lines);
|
8709
|
-
if (xpoints % 2
|
8881
|
+
if (xpoints % 2 === 1 && xpoints !== 0) {
|
8710
8882
|
this.__corner = i;
|
8711
8883
|
return i;
|
8712
8884
|
}
|
@@ -8739,7 +8911,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8739
8911
|
continue;
|
8740
8912
|
}
|
8741
8913
|
// optimisation 3: vertical line case
|
8742
|
-
if ((iLine.o.x
|
8914
|
+
if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= ex)) {
|
8743
8915
|
xi = iLine.o.x;
|
8744
8916
|
yi = ey;
|
8745
8917
|
}
|
@@ -8758,7 +8930,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8758
8930
|
xcount += 1;
|
8759
8931
|
}
|
8760
8932
|
// optimisation 4: specific for square images
|
8761
|
-
if (xcount
|
8933
|
+
if (xcount === 2) {
|
8762
8934
|
break;
|
8763
8935
|
}
|
8764
8936
|
}
|
@@ -8771,7 +8943,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8771
8943
|
* @private
|
8772
8944
|
* @param oCoords {Object} coordinates of the image corners
|
8773
8945
|
*/
|
8774
|
-
_getImageLines: function(oCoords
|
8946
|
+
_getImageLines: function(oCoords) {
|
8775
8947
|
return {
|
8776
8948
|
topline: {
|
8777
8949
|
o: oCoords.tl,
|
@@ -8789,7 +8961,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
8789
8961
|
o: oCoords.bl,
|
8790
8962
|
d: oCoords.tl
|
8791
8963
|
}
|
8792
|
-
}
|
8964
|
+
};
|
8793
8965
|
},
|
8794
8966
|
|
8795
8967
|
/**
|
@@ -9010,11 +9182,44 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9010
9182
|
return this.toObject();
|
9011
9183
|
},
|
9012
9184
|
|
9185
|
+
/**
|
9186
|
+
* @method setGradientFill
|
9187
|
+
*/
|
9013
9188
|
setGradientFill: function(options) {
|
9014
9189
|
this.set('fill', fabric.Gradient.forObject(this, options));
|
9015
9190
|
},
|
9016
9191
|
|
9017
|
-
|
9192
|
+
/**
|
9193
|
+
* @method animate
|
9194
|
+
*
|
9195
|
+
* As object — multiple properties
|
9196
|
+
*
|
9197
|
+
* object.animate({ left: ..., top: ... });
|
9198
|
+
* object.animate({ left: ..., top: ... }, { duration: ... });
|
9199
|
+
*
|
9200
|
+
* As string — one property
|
9201
|
+
*
|
9202
|
+
* object.animate('left', ...);
|
9203
|
+
* object.animate('left', { duration: ... });
|
9204
|
+
*
|
9205
|
+
*/
|
9206
|
+
animate: function() {
|
9207
|
+
if (arguments[0] && typeof arguments[0] === 'object') {
|
9208
|
+
for (var prop in arguments[0]) {
|
9209
|
+
this._animate(prop, arguments[0][prop], arguments[1]);
|
9210
|
+
}
|
9211
|
+
}
|
9212
|
+
else {
|
9213
|
+
this._animate.apply(this, arguments);
|
9214
|
+
}
|
9215
|
+
return this;
|
9216
|
+
},
|
9217
|
+
|
9218
|
+
/**
|
9219
|
+
* @private
|
9220
|
+
* @method _animate
|
9221
|
+
*/
|
9222
|
+
_animate: function(property, to, options) {
|
9018
9223
|
var obj = this;
|
9019
9224
|
|
9020
9225
|
options || (options = { });
|
@@ -9023,7 +9228,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9023
9228
|
options.from = this.get(property);
|
9024
9229
|
}
|
9025
9230
|
|
9026
|
-
if (/[
|
9231
|
+
if (/[+\-]/.test((to + '').charAt(0))) {
|
9027
9232
|
to = this.get(property) + parseFloat(to);
|
9028
9233
|
}
|
9029
9234
|
|
@@ -9176,7 +9381,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9176
9381
|
|
9177
9382
|
});
|
9178
9383
|
|
9179
|
-
})(typeof exports
|
9384
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
9180
9385
|
|
9181
9386
|
(function(global) {
|
9182
9387
|
|
@@ -9184,7 +9389,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9184
9389
|
|
9185
9390
|
var fabric = global.fabric || (global.fabric = { }),
|
9186
9391
|
extend = fabric.util.object.extend,
|
9187
|
-
parentSet = fabric.Object.prototype.set,
|
9188
9392
|
coordProps = { 'x1': 1, 'x2': 1, 'y1': 1, 'y2': 1 };
|
9189
9393
|
|
9190
9394
|
if (fabric.Line) {
|
@@ -9212,6 +9416,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9212
9416
|
* @return {fabric.Line} thisArg
|
9213
9417
|
*/
|
9214
9418
|
initialize: function(points, options) {
|
9419
|
+
options = options || { };
|
9420
|
+
|
9215
9421
|
if (!points) {
|
9216
9422
|
points = [0, 0, 0, 0];
|
9217
9423
|
}
|
@@ -9361,7 +9567,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9361
9567
|
return new fabric.Line(points, object);
|
9362
9568
|
};
|
9363
9569
|
|
9364
|
-
})(typeof exports
|
9570
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
9365
9571
|
(function(global) {
|
9366
9572
|
|
9367
9573
|
"use strict";
|
@@ -9436,7 +9642,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9436
9642
|
_render: function(ctx, noTransform) {
|
9437
9643
|
ctx.beginPath();
|
9438
9644
|
// multiply by currently set alpha (the one that was set by path group where this object is contained, for example)
|
9439
|
-
ctx.globalAlpha
|
9645
|
+
ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity;
|
9440
9646
|
ctx.arc(noTransform ? this.left : 0, noTransform ? this.top : 0, this.radius, 0, piBy2, false);
|
9441
9647
|
ctx.closePath();
|
9442
9648
|
if (this.fill) {
|
@@ -9505,7 +9711,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9505
9711
|
options || (options = { });
|
9506
9712
|
var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);
|
9507
9713
|
if (!isValidRadius(parsedAttributes)) {
|
9508
|
-
throw Error('value of `r` attribute is required and can not be negative');
|
9714
|
+
throw new Error('value of `r` attribute is required and can not be negative');
|
9509
9715
|
}
|
9510
9716
|
if ('left' in parsedAttributes) {
|
9511
9717
|
parsedAttributes.left -= (options.width / 2) || 0;
|
@@ -9534,30 +9740,30 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9534
9740
|
return new fabric.Circle(object);
|
9535
9741
|
};
|
9536
9742
|
|
9537
|
-
})(typeof exports
|
9743
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
9538
9744
|
(function(global) {
|
9539
|
-
|
9745
|
+
|
9540
9746
|
"use strict";
|
9541
|
-
|
9747
|
+
|
9542
9748
|
var fabric = global.fabric || (global.fabric = { });
|
9543
|
-
|
9749
|
+
|
9544
9750
|
if (fabric.Triangle) {
|
9545
9751
|
fabric.warn('fabric.Triangle is already defined');
|
9546
9752
|
return;
|
9547
9753
|
}
|
9548
|
-
|
9549
|
-
/**
|
9754
|
+
|
9755
|
+
/**
|
9550
9756
|
* @class Triangle
|
9551
9757
|
* @extends fabric.Object
|
9552
9758
|
*/
|
9553
9759
|
fabric.Triangle = fabric.util.createClass(fabric.Object, /** @scope fabric.Triangle.prototype */ {
|
9554
|
-
|
9760
|
+
|
9555
9761
|
/**
|
9556
9762
|
* @property
|
9557
9763
|
* @type String
|
9558
9764
|
*/
|
9559
9765
|
type: 'triangle',
|
9560
|
-
|
9766
|
+
|
9561
9767
|
/**
|
9562
9768
|
* Constructor
|
9563
9769
|
* @method initialize
|
@@ -9566,28 +9772,28 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9566
9772
|
*/
|
9567
9773
|
initialize: function(options) {
|
9568
9774
|
options = options || { };
|
9569
|
-
|
9775
|
+
|
9570
9776
|
this.callSuper('initialize', options);
|
9571
|
-
|
9777
|
+
|
9572
9778
|
this.set('width', options.width || 100)
|
9573
9779
|
.set('height', options.height || 100);
|
9574
9780
|
},
|
9575
|
-
|
9781
|
+
|
9576
9782
|
/**
|
9577
9783
|
* @private
|
9578
9784
|
* @method _render
|
9579
9785
|
* @param ctx {CanvasRenderingContext2D} Context to render on
|
9580
9786
|
*/
|
9581
|
-
_render: function(ctx) {
|
9787
|
+
_render: function(ctx) {
|
9582
9788
|
var widthBy2 = this.width / 2,
|
9583
9789
|
heightBy2 = this.height / 2;
|
9584
|
-
|
9790
|
+
|
9585
9791
|
ctx.beginPath();
|
9586
9792
|
ctx.moveTo(-widthBy2, heightBy2);
|
9587
9793
|
ctx.lineTo(0, -heightBy2);
|
9588
9794
|
ctx.lineTo(widthBy2, heightBy2);
|
9589
9795
|
ctx.closePath();
|
9590
|
-
|
9796
|
+
|
9591
9797
|
if (this.fill) {
|
9592
9798
|
ctx.fill();
|
9593
9799
|
}
|
@@ -9595,7 +9801,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9595
9801
|
ctx.stroke();
|
9596
9802
|
}
|
9597
9803
|
},
|
9598
|
-
|
9804
|
+
|
9599
9805
|
/**
|
9600
9806
|
* Returns complexity of an instance
|
9601
9807
|
* @method complexity
|
@@ -9604,7 +9810,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9604
9810
|
complexity: function() {
|
9605
9811
|
return 1;
|
9606
9812
|
},
|
9607
|
-
|
9813
|
+
|
9608
9814
|
/**
|
9609
9815
|
* Returns svg representation of an instance
|
9610
9816
|
* @method toSVG
|
@@ -9628,7 +9834,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9628
9834
|
'/>';
|
9629
9835
|
}
|
9630
9836
|
});
|
9631
|
-
|
9837
|
+
|
9632
9838
|
/**
|
9633
9839
|
* Returns fabric.Triangle instance from an object representation
|
9634
9840
|
* @static
|
@@ -9640,7 +9846,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9640
9846
|
return new fabric.Triangle(object);
|
9641
9847
|
};
|
9642
9848
|
|
9643
|
-
})(typeof exports
|
9849
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
9644
9850
|
(function(global){
|
9645
9851
|
|
9646
9852
|
"use strict";
|
@@ -9732,7 +9938,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9732
9938
|
_render: function(ctx, noTransform) {
|
9733
9939
|
ctx.beginPath();
|
9734
9940
|
ctx.save();
|
9735
|
-
ctx.globalAlpha
|
9941
|
+
ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity;
|
9736
9942
|
if (this.transformMatrix && this.group) {
|
9737
9943
|
ctx.translate(this.cx, this.cy);
|
9738
9944
|
}
|
@@ -9805,7 +10011,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9805
10011
|
return new fabric.Ellipse(object);
|
9806
10012
|
};
|
9807
10013
|
|
9808
|
-
})(typeof exports
|
10014
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
9809
10015
|
(function(global) {
|
9810
10016
|
|
9811
10017
|
"use strict";
|
@@ -9824,18 +10030,21 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9824
10030
|
fabric.Rect = fabric.util.createClass(fabric.Object, /** @scope fabric.Rect.prototype */ {
|
9825
10031
|
|
9826
10032
|
/**
|
10033
|
+
* Type of the instance
|
9827
10034
|
* @property
|
9828
10035
|
* @type String
|
9829
10036
|
*/
|
9830
10037
|
type: 'rect',
|
9831
10038
|
|
9832
10039
|
/**
|
10040
|
+
* Horizontal border radius
|
9833
10041
|
* @property
|
9834
10042
|
* @type Number
|
9835
10043
|
*/
|
9836
10044
|
rx: 0,
|
9837
10045
|
|
9838
10046
|
/**
|
10047
|
+
* Vertical border radius
|
9839
10048
|
* @property
|
9840
10049
|
* @type Number
|
9841
10050
|
*/
|
@@ -9848,6 +10057,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9848
10057
|
* @return {Object} thisArg
|
9849
10058
|
*/
|
9850
10059
|
initialize: function(options) {
|
10060
|
+
options = options || { };
|
10061
|
+
|
9851
10062
|
this._initStateProperties();
|
9852
10063
|
this.callSuper('initialize', options);
|
9853
10064
|
this._initRxRy();
|
@@ -9890,7 +10101,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9890
10101
|
h = this.height;
|
9891
10102
|
|
9892
10103
|
ctx.beginPath();
|
9893
|
-
ctx.globalAlpha
|
10104
|
+
ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity;
|
9894
10105
|
|
9895
10106
|
if (this.transformMatrix && this.group) {
|
9896
10107
|
ctx.translate(
|
@@ -9926,7 +10137,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9926
10137
|
}
|
9927
10138
|
},
|
9928
10139
|
|
9929
|
-
|
10140
|
+
/**
|
10141
|
+
* @method _normalizeLeftTopProperties
|
10142
|
+
* @private
|
10143
|
+
* Since coordinate system differs from that of SVG
|
10144
|
+
*/
|
9930
10145
|
_normalizeLeftTopProperties: function(parsedAttributes) {
|
9931
10146
|
if (parsedAttributes.left) {
|
9932
10147
|
this.set('left', parsedAttributes.left + this.getWidth() / 2);
|
@@ -9940,6 +10155,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
9940
10155
|
},
|
9941
10156
|
|
9942
10157
|
/**
|
10158
|
+
* Returns complexity of an instance
|
9943
10159
|
* @method complexity
|
9944
10160
|
* @return {Number} complexity
|
9945
10161
|
*/
|
@@ -10025,7 +10241,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10025
10241
|
return new fabric.Rect(object);
|
10026
10242
|
};
|
10027
10243
|
|
10028
|
-
})(typeof exports
|
10244
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
10029
10245
|
(function(global) {
|
10030
10246
|
|
10031
10247
|
"use strict";
|
@@ -10177,7 +10393,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10177
10393
|
return new fabric.Polyline(points, object);
|
10178
10394
|
};
|
10179
10395
|
|
10180
|
-
})(typeof exports
|
10396
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
10181
10397
|
(function(global) {
|
10182
10398
|
|
10183
10399
|
"use strict";
|
@@ -10193,9 +10409,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10193
10409
|
return;
|
10194
10410
|
}
|
10195
10411
|
|
10196
|
-
function byX(p) { return p.x; }
|
10197
|
-
function byY(p) { return p.y; }
|
10198
|
-
|
10199
10412
|
/**
|
10200
10413
|
* @class Polygon
|
10201
10414
|
* @extends fabric.Object
|
@@ -10348,7 +10561,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10348
10561
|
return new fabric.Polygon(object.points, object);
|
10349
10562
|
};
|
10350
10563
|
|
10351
|
-
})(typeof exports
|
10564
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
10352
10565
|
(function(global) {
|
10353
10566
|
|
10354
10567
|
var commandLengths = {
|
@@ -10417,7 +10630,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10417
10630
|
var sfactor_sq = 1 / d - 0.25;
|
10418
10631
|
if (sfactor_sq < 0) sfactor_sq = 0;
|
10419
10632
|
var sfactor = Math.sqrt(sfactor_sq);
|
10420
|
-
if (sweep
|
10633
|
+
if (sweep === large) sfactor = -sfactor;
|
10421
10634
|
var xc = 0.5 * (x0 + x1) - sfactor * (y1-y0);
|
10422
10635
|
var yc = 0.5 * (y0 + y1) + sfactor * (x1-x0);
|
10423
10636
|
|
@@ -10425,9 +10638,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10425
10638
|
var th1 = Math.atan2(y1-yc, x1-xc);
|
10426
10639
|
|
10427
10640
|
var th_arc = th1-th0;
|
10428
|
-
if (th_arc < 0 && sweep
|
10641
|
+
if (th_arc < 0 && sweep === 1){
|
10429
10642
|
th_arc += 2*Math.PI;
|
10430
|
-
} else if (th_arc > 0 && sweep
|
10643
|
+
} else if (th_arc > 0 && sweep === 0) {
|
10431
10644
|
th_arc -= 2 * Math.PI;
|
10432
10645
|
}
|
10433
10646
|
|
@@ -10481,10 +10694,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10481
10694
|
fabric.warn('fabric.Path is already defined');
|
10482
10695
|
return;
|
10483
10696
|
}
|
10484
|
-
if (!fabric.Object) {
|
10485
|
-
fabric.warn('fabric.Path requires fabric.Object');
|
10486
|
-
return;
|
10487
|
-
}
|
10488
10697
|
|
10489
10698
|
/**
|
10490
10699
|
* @private
|
@@ -10530,7 +10739,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10530
10739
|
this.setOptions(options);
|
10531
10740
|
|
10532
10741
|
if (!path) {
|
10533
|
-
throw Error('`path` argument is required');
|
10742
|
+
throw new Error('`path` argument is required');
|
10534
10743
|
}
|
10535
10744
|
|
10536
10745
|
var fromArray = _toString.call(path) === '[object Array]';
|
@@ -10982,7 +11191,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
10982
11191
|
chunks,
|
10983
11192
|
parsed;
|
10984
11193
|
|
10985
|
-
for (var i = 0,
|
11194
|
+
for (var i = 0, chunksParsed, len = this.path.length; i < len; i++) {
|
10986
11195
|
currentPath = this.path[i];
|
10987
11196
|
chunks = currentPath.slice(1).trim().replace(/(\d)-/g, '$1###-').split(/\s|,|###/);
|
10988
11197
|
chunksParsed = [ currentPath.charAt(0) ];
|
@@ -11110,7 +11319,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11110
11319
|
return new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options));
|
11111
11320
|
};
|
11112
11321
|
|
11113
|
-
})(typeof exports
|
11322
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
11114
11323
|
(function(global) {
|
11115
11324
|
|
11116
11325
|
"use strict";
|
@@ -11118,7 +11327,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11118
11327
|
var fabric = global.fabric || (global.fabric = { }),
|
11119
11328
|
extend = fabric.util.object.extend,
|
11120
11329
|
invoke = fabric.util.array.invoke,
|
11121
|
-
parentSet = fabric.Object.prototype.set,
|
11122
11330
|
parentToObject = fabric.Object.prototype.toObject,
|
11123
11331
|
camelize = fabric.util.string.camelize,
|
11124
11332
|
capitalize = fabric.util.string.capitalize;
|
@@ -11226,7 +11434,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11226
11434
|
*/
|
11227
11435
|
toObject: function() {
|
11228
11436
|
return extend(parentToObject.call(this), {
|
11229
|
-
paths: invoke(this.getObjects(), '
|
11437
|
+
paths: invoke(this.getObjects(), 'toObject'),
|
11230
11438
|
sourcePath: this.sourcePath
|
11231
11439
|
});
|
11232
11440
|
},
|
@@ -11339,7 +11547,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11339
11547
|
}
|
11340
11548
|
|
11341
11549
|
/**
|
11342
|
-
* Creates fabric.
|
11550
|
+
* Creates fabric.PathGroup instance from an object representation
|
11343
11551
|
* @static
|
11344
11552
|
* @method fabric.PathGroup.fromObject
|
11345
11553
|
* @param {Object} object
|
@@ -11350,7 +11558,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11350
11558
|
return new fabric.PathGroup(paths, object);
|
11351
11559
|
};
|
11352
11560
|
|
11353
|
-
})(typeof exports
|
11561
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
11354
11562
|
(function(global){
|
11355
11563
|
|
11356
11564
|
"use strict";
|
@@ -11386,6 +11594,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11386
11594
|
* @return {Object} thisArg
|
11387
11595
|
*/
|
11388
11596
|
initialize: function(objects, options) {
|
11597
|
+
options = options || { };
|
11598
|
+
|
11389
11599
|
this.objects = objects || [];
|
11390
11600
|
this.originalState = { };
|
11391
11601
|
|
@@ -11546,7 +11756,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11546
11756
|
*/
|
11547
11757
|
toObject: function() {
|
11548
11758
|
return extend(this.callSuper('toObject'), {
|
11549
|
-
objects: invoke(this.objects, '
|
11759
|
+
objects: invoke(this.objects, 'toObject')
|
11550
11760
|
});
|
11551
11761
|
},
|
11552
11762
|
|
@@ -11561,8 +11771,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11561
11771
|
|
11562
11772
|
var groupScaleFactor = Math.max(this.scaleX, this.scaleY);
|
11563
11773
|
|
11564
|
-
for (var i = 0, len = this.objects.length
|
11774
|
+
for (var i = 0, len = this.objects.length; i < len; i++) {
|
11775
|
+
|
11776
|
+
var object = this.objects[i];
|
11565
11777
|
var originalScaleFactor = object.borderScaleFactor;
|
11778
|
+
|
11566
11779
|
object.borderScaleFactor = groupScaleFactor;
|
11567
11780
|
object.render(ctx);
|
11568
11781
|
object.borderScaleFactor = originalScaleFactor;
|
@@ -11592,7 +11805,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11592
11805
|
*/
|
11593
11806
|
complexity: function() {
|
11594
11807
|
return this.getObjects().reduce(function(total, object) {
|
11595
|
-
total += (typeof object.complexity
|
11808
|
+
total += (typeof object.complexity === 'function') ? object.complexity() : 0;
|
11596
11809
|
return total;
|
11597
11810
|
}, 0);
|
11598
11811
|
},
|
@@ -11621,8 +11834,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11621
11834
|
var groupLeft = this.get('left'),
|
11622
11835
|
groupTop = this.get('top'),
|
11623
11836
|
groupAngle = this.getAngle() * (Math.PI / 180),
|
11624
|
-
objectLeft = object.get('originalLeft'),
|
11625
|
-
objectTop = object.get('originalTop'),
|
11626
11837
|
rotatedTop = Math.cos(groupAngle) * object.get('top') + Math.sin(groupAngle) * object.get('left'),
|
11627
11838
|
rotatedLeft = -Math.sin(groupAngle) * object.get('top') + Math.cos(groupAngle) * object.get('left');
|
11628
11839
|
|
@@ -11752,7 +11963,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11752
11963
|
aX.push(o.oCoords[prop].x);
|
11753
11964
|
aY.push(o.oCoords[prop].y);
|
11754
11965
|
}
|
11755
|
-
}
|
11966
|
+
}
|
11756
11967
|
|
11757
11968
|
minX = min(aX);
|
11758
11969
|
maxX = max(aX);
|
@@ -11834,7 +12045,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11834
12045
|
|
11835
12046
|
fabric.Group.async = true;
|
11836
12047
|
|
11837
|
-
})(typeof exports
|
12048
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
11838
12049
|
(function(global) {
|
11839
12050
|
|
11840
12051
|
"use strict";
|
@@ -11848,11 +12059,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11848
12059
|
if (global.fabric.Image) {
|
11849
12060
|
fabric.warn('fabric.Image is already defined.');
|
11850
12061
|
return;
|
11851
|
-
};
|
11852
|
-
|
11853
|
-
if (!fabric.Object) {
|
11854
|
-
fabric.warn('fabric.Object is required for fabric.Image initialization');
|
11855
|
-
return;
|
11856
12062
|
}
|
11857
12063
|
|
11858
12064
|
/**
|
@@ -11867,18 +12073,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11867
12073
|
*/
|
11868
12074
|
active: false,
|
11869
12075
|
|
11870
|
-
/**
|
11871
|
-
* @property
|
11872
|
-
* @type Boolean
|
11873
|
-
*/
|
11874
|
-
bordervisibility: false,
|
11875
|
-
|
11876
|
-
/**
|
11877
|
-
* @property
|
11878
|
-
* @type Boolean
|
11879
|
-
*/
|
11880
|
-
cornervisibility: false,
|
11881
|
-
|
11882
12076
|
/**
|
11883
12077
|
* @property
|
11884
12078
|
* @type String
|
@@ -11941,26 +12135,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
11941
12135
|
};
|
11942
12136
|
},
|
11943
12137
|
|
11944
|
-
/**
|
11945
|
-
* Sets border visibility
|
11946
|
-
* @method setBorderVisibility
|
11947
|
-
* @param {Boolean} visible When true, border is set to be visible
|
11948
|
-
*/
|
11949
|
-
setBorderVisibility: function(visible) {
|
11950
|
-
this._resetWidthHeight();
|
11951
|
-
this._adjustWidthHeightToBorders(showBorder);
|
11952
|
-
this.setCoords();
|
11953
|
-
},
|
11954
|
-
|
11955
|
-
/**
|
11956
|
-
* Sets corner visibility
|
11957
|
-
* @method setCornersVisibility
|
11958
|
-
* @param {Boolean} visible When true, corners are set to be visible
|
11959
|
-
*/
|
11960
|
-
setCornersVisibility: function(visible) {
|
11961
|
-
this.cornervisibility = !!visible;
|
11962
|
-
},
|
11963
|
-
|
11964
12138
|
/**
|
11965
12139
|
* Renders image on a specified context
|
11966
12140
|
* @method render
|
@@ -12060,10 +12234,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12060
12234
|
var isLikelyNode = typeof Buffer !== 'undefined' && typeof window === 'undefined',
|
12061
12235
|
imgEl = this._originalImage,
|
12062
12236
|
canvasEl = fabric.document.createElement('canvas'),
|
12063
|
-
replacement = isLikelyNode ? new (require('canvas').Image) : fabric.document.createElement('img'),
|
12237
|
+
replacement = isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'),
|
12064
12238
|
_this = this;
|
12065
12239
|
|
12066
|
-
if (!canvasEl.getContext && typeof G_vmlCanvasManager
|
12240
|
+
if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') {
|
12067
12241
|
G_vmlCanvasManager.initElement(canvasEl);
|
12068
12242
|
}
|
12069
12243
|
|
@@ -12102,6 +12276,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12102
12276
|
|
12103
12277
|
/**
|
12104
12278
|
* @private
|
12279
|
+
* @method _render
|
12105
12280
|
*/
|
12106
12281
|
_render: function(ctx) {
|
12107
12282
|
ctx.drawImage(
|
@@ -12115,20 +12290,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12115
12290
|
|
12116
12291
|
/**
|
12117
12292
|
* @private
|
12118
|
-
|
12119
|
-
_adjustWidthHeightToBorders: function(showBorder) {
|
12120
|
-
if (showBorder) {
|
12121
|
-
this.currentBorder = this.borderwidth;
|
12122
|
-
this.width += (2 * this.currentBorder);
|
12123
|
-
this.height += (2 * this.currentBorder);
|
12124
|
-
}
|
12125
|
-
else {
|
12126
|
-
this.currentBorder = 0;
|
12127
|
-
}
|
12128
|
-
},
|
12129
|
-
|
12130
|
-
/**
|
12131
|
-
* @private
|
12293
|
+
* @method _resetWidthHeight
|
12132
12294
|
*/
|
12133
12295
|
_resetWidthHeight: function() {
|
12134
12296
|
var element = this.getElement();
|
@@ -12140,6 +12302,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12140
12302
|
/**
|
12141
12303
|
* The Image class's initialization method. This method is automatically
|
12142
12304
|
* called by the constructor.
|
12305
|
+
* @private
|
12143
12306
|
* @method _initElement
|
12144
12307
|
* @param {HTMLImageElement|String} el The element representing the image
|
12145
12308
|
*/
|
@@ -12149,17 +12312,18 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12149
12312
|
},
|
12150
12313
|
|
12151
12314
|
/**
|
12315
|
+
* @private
|
12152
12316
|
* @method _initConfig
|
12153
12317
|
* @param {Object} options Options object
|
12154
12318
|
*/
|
12155
12319
|
_initConfig: function(options) {
|
12156
12320
|
options || (options = { });
|
12157
12321
|
this.setOptions(options);
|
12158
|
-
this._setBorder();
|
12159
12322
|
this._setWidthHeight(options);
|
12160
12323
|
},
|
12161
12324
|
|
12162
12325
|
/**
|
12326
|
+
* @private
|
12163
12327
|
* @method _initFilters
|
12164
12328
|
* @param {Object} object Object with filters property
|
12165
12329
|
*/
|
@@ -12173,29 +12337,17 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12173
12337
|
|
12174
12338
|
/**
|
12175
12339
|
* @private
|
12176
|
-
|
12177
|
-
|
12178
|
-
if (this.bordervisibility) {
|
12179
|
-
this.currentBorder = this.borderwidth;
|
12180
|
-
}
|
12181
|
-
else {
|
12182
|
-
this.currentBorder = 0;
|
12183
|
-
}
|
12184
|
-
},
|
12185
|
-
|
12186
|
-
/**
|
12187
|
-
* @private
|
12340
|
+
* @method _setWidthHeight
|
12341
|
+
* @param {Object} options Object with width/height properties
|
12188
12342
|
*/
|
12189
12343
|
_setWidthHeight: function(options) {
|
12190
|
-
var sidesBorderWidth = 2 * this.currentBorder;
|
12191
|
-
|
12192
12344
|
this.width = 'width' in options
|
12193
12345
|
? options.width
|
12194
|
-
: (
|
12346
|
+
: (this.getElement().width || 0);
|
12195
12347
|
|
12196
12348
|
this.height = 'height' in options
|
12197
12349
|
? options.height
|
12198
|
-
: (
|
12350
|
+
: (this.getElement().height || 0);
|
12199
12351
|
},
|
12200
12352
|
|
12201
12353
|
/**
|
@@ -12293,7 +12445,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, {
|
|
12293
12445
|
|
12294
12446
|
fabric.Image.async = true;
|
12295
12447
|
|
12296
|
-
})(typeof exports
|
12448
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
12297
12449
|
|
12298
12450
|
fabric.util.object.extend(fabric.Object.prototype, {
|
12299
12451
|
|
@@ -12855,29 +13007,29 @@ fabric.Image.filters.Tint = fabric.util.createClass( /** @scope fabric.Image.fil
|
|
12855
13007
|
* @param {Object} canvasEl Canvas element to apply filter to
|
12856
13008
|
*/
|
12857
13009
|
applyTo: function(canvasEl) {
|
12858
|
-
|
13010
|
+
|
12859
13011
|
var context = canvasEl.getContext('2d'),
|
12860
13012
|
imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height),
|
12861
13013
|
data = imageData.data,
|
12862
|
-
iLen = data.length, i,
|
12863
|
-
|
12864
|
-
|
12865
|
-
|
12866
|
-
|
12867
|
-
|
12868
|
-
|
12869
|
-
|
13014
|
+
iLen = data.length, i, a;
|
13015
|
+
|
13016
|
+
var rgb = parseInt(this.color, 10).toString(16);
|
13017
|
+
|
13018
|
+
var cr = parseInt('0x' + rgb.substr(0, 2), 16);
|
13019
|
+
var cg = parseInt('0x' + rgb.substr(2, 2), 16);
|
13020
|
+
var cb = parseInt('0x' + rgb.substr(4, 2), 16);
|
13021
|
+
|
12870
13022
|
for (i = 0; i < iLen; i+=4) {
|
12871
13023
|
|
12872
13024
|
a = data[i+3];
|
12873
|
-
|
12874
|
-
if (a > 0){
|
13025
|
+
|
13026
|
+
if (a > 0){
|
12875
13027
|
data[i] = cr;
|
12876
13028
|
data[i+1] = cg;
|
12877
|
-
data[i+2] = cb;
|
12878
|
-
}
|
13029
|
+
data[i+2] = cb;
|
13030
|
+
}
|
12879
13031
|
}
|
12880
|
-
|
13032
|
+
|
12881
13033
|
context.putImageData(imageData, 0, 0);
|
12882
13034
|
},
|
12883
13035
|
|
@@ -12909,10 +13061,6 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
12909
13061
|
fabric.warn('fabric.Text is already defined');
|
12910
13062
|
return;
|
12911
13063
|
}
|
12912
|
-
if (!fabric.Object) {
|
12913
|
-
fabric.warn('fabric.Text requires fabric.Object');
|
12914
|
-
return;
|
12915
|
-
}
|
12916
13064
|
|
12917
13065
|
/**
|
12918
13066
|
* @class Text
|
@@ -13015,9 +13163,11 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13015
13163
|
* @return {fabric.Text} thisArg
|
13016
13164
|
*/
|
13017
13165
|
initialize: function(text, options) {
|
13166
|
+
options = options || { };
|
13167
|
+
|
13018
13168
|
this._initStateProperties();
|
13019
13169
|
this.text = text;
|
13020
|
-
this.setOptions(options
|
13170
|
+
this.setOptions(options);
|
13021
13171
|
this._theta = this.angle * Math.PI / 180;
|
13022
13172
|
this._initDimensions();
|
13023
13173
|
this.setCoords();
|
@@ -13031,7 +13181,7 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13031
13181
|
_initDimensions: function() {
|
13032
13182
|
var canvasEl = fabric.document.createElement('canvas');
|
13033
13183
|
|
13034
|
-
if (!canvasEl.getContext && typeof G_vmlCanvasManager
|
13184
|
+
if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') {
|
13035
13185
|
G_vmlCanvasManager.initElement(canvasEl);
|
13036
13186
|
}
|
13037
13187
|
|
@@ -13343,29 +13493,30 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13343
13493
|
_renderTextDecoration: function(ctx, textLines) {
|
13344
13494
|
|
13345
13495
|
var halfOfVerticalBox = this._getTextHeight(ctx, textLines) / 2;
|
13496
|
+
var _this = this;
|
13346
13497
|
|
13347
13498
|
function renderLinesAtOffset(offset) {
|
13348
13499
|
for (var i = 0, len = textLines.length; i < len; i++) {
|
13349
13500
|
|
13350
13501
|
var lineWidth = ctx.measureText(textLines[i]).width;
|
13351
|
-
var lineLeftOffset =
|
13502
|
+
var lineLeftOffset = _this._getLineLeftOffset(lineWidth);
|
13352
13503
|
|
13353
13504
|
ctx.fillRect(
|
13354
|
-
(-
|
13355
|
-
(offset + (i *
|
13505
|
+
(-_this.width / 2) + lineLeftOffset,
|
13506
|
+
(offset + (i * _this.fontSize * _this.lineHeight)) - halfOfVerticalBox,
|
13356
13507
|
lineWidth,
|
13357
13508
|
1);
|
13358
13509
|
}
|
13359
13510
|
}
|
13360
13511
|
|
13361
13512
|
if (this.textDecoration.indexOf('underline') > -1) {
|
13362
|
-
renderLinesAtOffset
|
13513
|
+
renderLinesAtOffset(this.fontSize);
|
13363
13514
|
}
|
13364
13515
|
if (this.textDecoration.indexOf('line-through') > -1) {
|
13365
|
-
renderLinesAtOffset
|
13516
|
+
renderLinesAtOffset(this.fontSize / 2);
|
13366
13517
|
}
|
13367
13518
|
if (this.textDecoration.indexOf('overline') > -1) {
|
13368
|
-
renderLinesAtOffset
|
13519
|
+
renderLinesAtOffset(0);
|
13369
13520
|
}
|
13370
13521
|
},
|
13371
13522
|
|
@@ -13393,7 +13544,7 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13393
13544
|
// Cufon doesn't play nice with textDecoration=underline if element doesn't have a parent
|
13394
13545
|
container.appendChild(el);
|
13395
13546
|
|
13396
|
-
if (typeof G_vmlCanvasManager
|
13547
|
+
if (typeof G_vmlCanvasManager === 'undefined') {
|
13397
13548
|
el.innerHTML = this.text;
|
13398
13549
|
}
|
13399
13550
|
else {
|
@@ -13677,16 +13828,16 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13677
13828
|
}
|
13678
13829
|
|
13679
13830
|
var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES);
|
13680
|
-
|
13831
|
+
options = fabric.util.object.extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes);
|
13681
13832
|
var text = new fabric.Text(element.textContent, options);
|
13682
13833
|
|
13683
13834
|
return text;
|
13684
13835
|
};
|
13685
13836
|
|
13686
|
-
})(typeof exports
|
13837
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
13687
13838
|
(function() {
|
13688
13839
|
|
13689
|
-
if (typeof document
|
13840
|
+
if (typeof document !== 'undefined' && typeof window !== 'undefined') {
|
13690
13841
|
return;
|
13691
13842
|
}
|
13692
13843
|
|
@@ -13700,7 +13851,7 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13700
13851
|
function request(url, encoding, callback) {
|
13701
13852
|
var oURL = URL.parse(url),
|
13702
13853
|
client = HTTP.createClient(oURL.port, oURL.hostname),
|
13703
|
-
|
13854
|
+
req = client.request('GET', oURL.pathname, { 'host': oURL.hostname });
|
13704
13855
|
|
13705
13856
|
client.addListener('error', function(err) {
|
13706
13857
|
if (err.errno === process.ECONNREFUSED) {
|
@@ -13711,8 +13862,8 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13711
13862
|
}
|
13712
13863
|
});
|
13713
13864
|
|
13714
|
-
|
13715
|
-
|
13865
|
+
req.end();
|
13866
|
+
req.on('response', function (response) {
|
13716
13867
|
var body = "";
|
13717
13868
|
if (encoding) {
|
13718
13869
|
response.setEncoding(encoding);
|
@@ -13721,7 +13872,7 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13721
13872
|
callback(body);
|
13722
13873
|
});
|
13723
13874
|
response.on('data', function (chunk) {
|
13724
|
-
if (response.statusCode
|
13875
|
+
if (response.statusCode === 200) {
|
13725
13876
|
body += chunk;
|
13726
13877
|
}
|
13727
13878
|
});
|
@@ -13787,8 +13938,8 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13787
13938
|
canvasEl.width = nodeCanvas.width;
|
13788
13939
|
canvasEl.height = nodeCanvas.height;
|
13789
13940
|
|
13790
|
-
var
|
13791
|
-
var fabricCanvas = new
|
13941
|
+
var FabricCanvas = fabric.Canvas || fabric.StaticCanvas;
|
13942
|
+
var fabricCanvas = new FabricCanvas(canvasEl);
|
13792
13943
|
fabricCanvas.contextContainer = nodeCanvas.getContext('2d');
|
13793
13944
|
fabricCanvas.nodeCanvas = nodeCanvas;
|
13794
13945
|
|
@@ -13798,9 +13949,6 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13798
13949
|
fabric.StaticCanvas.prototype.createPNGStream = function() {
|
13799
13950
|
return this.nodeCanvas.createPNGStream();
|
13800
13951
|
};
|
13801
|
-
if (fabric.Canvas) {
|
13802
|
-
fabric.Canvas.prototype.createPNGStream
|
13803
|
-
}
|
13804
13952
|
|
13805
13953
|
var origSetWidth = fabric.StaticCanvas.prototype.setWidth;
|
13806
13954
|
fabric.StaticCanvas.prototype.setWidth = function(width) {
|
@@ -13822,4 +13970,4 @@ fabric.Image.filters.Tint.fromObject = function(object) {
|
|
13822
13970
|
fabric.Canvas.prototype.setHeight = fabric.StaticCanvas.prototype.setHeight;
|
13823
13971
|
}
|
13824
13972
|
|
13825
|
-
})();
|
13973
|
+
})();
|