fabric-rails 1.0.12 → 1.0.12.1

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.
Files changed (56) hide show
  1. data/CHANGELOG.md +16 -0
  2. data/README.md +1 -1
  3. data/lib/fabric/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/event.js +1909 -0
  5. data/vendor/assets/javascripts/fabric.js +64 -16464
  6. data/vendor/assets/javascripts/fabric/HEADER.js +31 -0
  7. data/vendor/assets/javascripts/fabric/canvas.class.js +1007 -0
  8. data/vendor/assets/javascripts/fabric/canvas_animation.mixin.js +113 -0
  9. data/vendor/assets/javascripts/fabric/canvas_events.mixin.js +482 -0
  10. data/vendor/assets/javascripts/fabric/canvas_gestures.mixin.js +79 -0
  11. data/vendor/assets/javascripts/fabric/canvas_serialization.mixin.js +311 -0
  12. data/vendor/assets/javascripts/fabric/circle.class.js +182 -0
  13. data/vendor/assets/javascripts/fabric/color.class.js +284 -0
  14. data/vendor/assets/javascripts/fabric/ellipse.class.js +169 -0
  15. data/vendor/assets/javascripts/fabric/freedrawing.class.js +256 -0
  16. data/vendor/assets/javascripts/fabric/gradient.class.js +211 -0
  17. data/vendor/assets/javascripts/fabric/group.class.js +556 -0
  18. data/vendor/assets/javascripts/fabric/image.class.js +418 -0
  19. data/vendor/assets/javascripts/fabric/image_filters.js +809 -0
  20. data/vendor/assets/javascripts/fabric/intersection.class.js +178 -0
  21. data/vendor/assets/javascripts/fabric/line.class.js +188 -0
  22. data/vendor/assets/javascripts/fabric/log.js +26 -0
  23. data/vendor/assets/javascripts/fabric/node.js +149 -0
  24. data/vendor/assets/javascripts/fabric/object.class.js +1068 -0
  25. data/vendor/assets/javascripts/fabric/object_geometry.mixin.js +308 -0
  26. data/vendor/assets/javascripts/fabric/object_interactivity.mixin.js +496 -0
  27. data/vendor/assets/javascripts/fabric/object_origin.mixin.js +207 -0
  28. data/vendor/assets/javascripts/fabric/object_straightening.mixin.js +94 -0
  29. data/vendor/assets/javascripts/fabric/observable.mixin.js +91 -0
  30. data/vendor/assets/javascripts/fabric/parser.js +750 -0
  31. data/vendor/assets/javascripts/fabric/path.class.js +794 -0
  32. data/vendor/assets/javascripts/fabric/path_group.class.js +240 -0
  33. data/vendor/assets/javascripts/fabric/pattern.class.js +69 -0
  34. data/vendor/assets/javascripts/fabric/point.class.js +327 -0
  35. data/vendor/assets/javascripts/fabric/polygon.class.js +184 -0
  36. data/vendor/assets/javascripts/fabric/polyline.class.js +157 -0
  37. data/vendor/assets/javascripts/fabric/rect.class.js +298 -0
  38. data/vendor/assets/javascripts/fabric/scout.js +45 -0
  39. data/vendor/assets/javascripts/fabric/shadow.class.js +70 -0
  40. data/vendor/assets/javascripts/fabric/stateful.js +88 -0
  41. data/vendor/assets/javascripts/fabric/static_canvas.class.js +1298 -0
  42. data/vendor/assets/javascripts/fabric/text.class.js +934 -0
  43. data/vendor/assets/javascripts/fabric/triangle.class.js +108 -0
  44. data/vendor/assets/javascripts/fabric/util/anim_ease.js +360 -0
  45. data/vendor/assets/javascripts/fabric/util/dom_event.js +237 -0
  46. data/vendor/assets/javascripts/fabric/util/dom_misc.js +245 -0
  47. data/vendor/assets/javascripts/fabric/util/dom_request.js +72 -0
  48. data/vendor/assets/javascripts/fabric/util/dom_style.js +71 -0
  49. data/vendor/assets/javascripts/fabric/util/lang_array.js +250 -0
  50. data/vendor/assets/javascripts/fabric/util/lang_class.js +97 -0
  51. data/vendor/assets/javascripts/fabric/util/lang_function.js +35 -0
  52. data/vendor/assets/javascripts/fabric/util/lang_object.js +34 -0
  53. data/vendor/assets/javascripts/fabric/util/lang_string.js +60 -0
  54. data/vendor/assets/javascripts/fabric/util/misc.js +406 -0
  55. data/vendor/assets/javascripts/json2.js +491 -0
  56. metadata +53 -2
@@ -0,0 +1,556 @@
1
+ (function(global){
2
+
3
+ "use strict";
4
+
5
+ var fabric = global.fabric || (global.fabric = { }),
6
+ extend = fabric.util.object.extend,
7
+ min = fabric.util.array.min,
8
+ max = fabric.util.array.max,
9
+ invoke = fabric.util.array.invoke,
10
+ removeFromArray = fabric.util.removeFromArray;
11
+
12
+ if (fabric.Group) {
13
+ return;
14
+ }
15
+
16
+ // lock-related properties, for use in fabric.Group#get
17
+ // to enable locking behavior on group
18
+ // when one of its objects has lock-related properties set
19
+ var _lockProperties = {
20
+ lockMovementX: true,
21
+ lockMovementY: true,
22
+ lockRotation: true,
23
+ lockScalingX: true,
24
+ lockScalingY: true,
25
+ lockUniScaling: true
26
+ };
27
+
28
+ /**
29
+ * Group class
30
+ * @class Group
31
+ * @extends fabric.Object
32
+ */
33
+ fabric.Group = fabric.util.createClass(fabric.Object, /** @scope fabric.Group.prototype */ {
34
+
35
+ /**
36
+ * Type of an object
37
+ * @property
38
+ * @type String
39
+ */
40
+ type: 'group',
41
+
42
+ /**
43
+ * Constructor
44
+ * @method initialized
45
+ * @param {Object} objects Group objects
46
+ * @param {Object} [options] Options object
47
+ * @return {Object} thisArg
48
+ */
49
+ initialize: function(objects, options) {
50
+ options = options || { };
51
+
52
+ this.objects = objects || [];
53
+ this.originalState = { };
54
+
55
+ this.callSuper('initialize');
56
+
57
+ this._calcBounds();
58
+ this._updateObjectsCoords();
59
+
60
+ if (options) {
61
+ extend(this, options);
62
+ }
63
+ this._setOpacityIfSame();
64
+
65
+ // group is active by default
66
+ this.setCoords(true);
67
+ this.saveCoords();
68
+
69
+ //this.activateAllObjects();
70
+ },
71
+
72
+ /**
73
+ * @private
74
+ * @method _updateObjectsCoords
75
+ */
76
+ _updateObjectsCoords: function() {
77
+ var groupDeltaX = this.left,
78
+ groupDeltaY = this.top;
79
+
80
+ this.forEachObject(function(object) {
81
+
82
+ var objectLeft = object.get('left'),
83
+ objectTop = object.get('top');
84
+
85
+ object.set('originalLeft', objectLeft);
86
+ object.set('originalTop', objectTop);
87
+
88
+ object.set('left', objectLeft - groupDeltaX);
89
+ object.set('top', objectTop - groupDeltaY);
90
+
91
+ object.setCoords();
92
+
93
+ // do not display corners of objects enclosed in a group
94
+ object.hasControls = false;
95
+ }, this);
96
+ },
97
+
98
+ /**
99
+ * Returns string represenation of a group
100
+ * @method toString
101
+ * @return {String}
102
+ */
103
+ toString: function() {
104
+ return '#<fabric.Group: (' + this.complexity() + ')>';
105
+ },
106
+
107
+ /**
108
+ * Returns an array of all objects in this group
109
+ * @method getObjects
110
+ * @return {Array} group objects
111
+ */
112
+ getObjects: function() {
113
+ return this.objects;
114
+ },
115
+
116
+ /**
117
+ * Adds an object to a group; Then recalculates group's dimension, position.
118
+ * @method addWithUpdate
119
+ * @param {Object} object
120
+ * @return {fabric.Group} thisArg
121
+ * @chainable
122
+ */
123
+ addWithUpdate: function(object) {
124
+ this._restoreObjectsState();
125
+ this.objects.push(object);
126
+ this._calcBounds();
127
+ this._updateObjectsCoords();
128
+ return this;
129
+ },
130
+
131
+ /**
132
+ * Removes an object from a group; Then recalculates group's dimension, position.
133
+ * @method removeWithUpdate
134
+ * @param {Object} object
135
+ * @return {fabric.Group} thisArg
136
+ * @chainable
137
+ */
138
+ removeWithUpdate: function(object) {
139
+ this._restoreObjectsState();
140
+ removeFromArray(this.objects, object);
141
+ object.setActive(false);
142
+ this._calcBounds();
143
+ this._updateObjectsCoords();
144
+ return this;
145
+ },
146
+
147
+ /**
148
+ * Adds an object to a group
149
+ * @method add
150
+ * @param {Object} object
151
+ * @return {fabric.Group} thisArg
152
+ * @chainable
153
+ */
154
+ add: function(object) {
155
+ this.objects.push(object);
156
+ return this;
157
+ },
158
+
159
+ /**
160
+ * Removes an object from a group
161
+ * @method remove
162
+ * @param {Object} object
163
+ * @return {fabric.Group} thisArg
164
+ * @chainable
165
+ */
166
+ remove: function(object) {
167
+ removeFromArray(this.objects, object);
168
+ return this;
169
+ },
170
+
171
+ /**
172
+ * Returns a size of a group (i.e: length of an array containing its objects)
173
+ * @return {Number} Group size
174
+ */
175
+ size: function() {
176
+ return this.getObjects().length;
177
+ },
178
+
179
+ /**
180
+ * Properties that are delegated to group objects when reading/writing
181
+ */
182
+ delegatedProperties: {
183
+ fill: true,
184
+ opacity: true,
185
+ fontFamily: true,
186
+ fontWeight: true,
187
+ lineHeight: true,
188
+ textDecoration: true,
189
+ textShadow: true,
190
+ backgroundColor: true
191
+ },
192
+
193
+ /**
194
+ * @private
195
+ */
196
+ _set: function(key, value) {
197
+ if (key in this.delegatedProperties) {
198
+ var i = this.objects.length;
199
+ this[key] = value;
200
+ while (i--) {
201
+ this.objects[i].set(key, value);
202
+ }
203
+ }
204
+ else {
205
+ this[key] = value;
206
+ }
207
+ },
208
+
209
+ /**
210
+ * Returns true if a group contains an object
211
+ * @method contains
212
+ * @param {Object} object Object to check against
213
+ * @return {Boolean} `true` if group contains an object
214
+ */
215
+ contains: function(object) {
216
+ return this.objects.indexOf(object) > -1;
217
+ },
218
+
219
+ /**
220
+ * Returns object representation of an instance
221
+ * @method toObject
222
+ * @param {Array} propertiesToInclude
223
+ * @return {Object} object representation of an instance
224
+ */
225
+ toObject: function(propertiesToInclude) {
226
+ return extend(this.callSuper('toObject', propertiesToInclude), {
227
+ objects: invoke(this.objects, 'toObject', propertiesToInclude)
228
+ });
229
+ },
230
+
231
+ /**
232
+ * Renders instance on a given context
233
+ * @method render
234
+ * @param {CanvasRenderingContext2D} ctx context to render instance on
235
+ */
236
+ render: function(ctx, noTransform) {
237
+ ctx.save();
238
+ this.transform(ctx);
239
+
240
+ var groupScaleFactor = Math.max(this.scaleX, this.scaleY);
241
+
242
+ //The array is now sorted in order of highest first, so start from end.
243
+ for (var i = this.objects.length; i > 0; i--) {
244
+
245
+ var object = this.objects[i-1],
246
+ originalScaleFactor = object.borderScaleFactor,
247
+ originalHasRotatingPoint = object.hasRotatingPoint;
248
+
249
+ object.borderScaleFactor = groupScaleFactor;
250
+ object.hasRotatingPoint = false;
251
+
252
+ object.render(ctx);
253
+
254
+ object.borderScaleFactor = originalScaleFactor;
255
+ object.hasRotatingPoint = originalHasRotatingPoint;
256
+ }
257
+
258
+ if (!noTransform && this.active) {
259
+ this.drawBorders(ctx);
260
+ this.drawControls(ctx);
261
+ }
262
+ ctx.restore();
263
+ this.setCoords();
264
+ },
265
+
266
+ /**
267
+ * Returns object from the group at the specified index
268
+ * @method item
269
+ * @param index {Number} index of item to get
270
+ * @return {fabric.Object}
271
+ */
272
+ item: function(index) {
273
+ return this.getObjects()[index];
274
+ },
275
+
276
+ /**
277
+ * Returns complexity of an instance
278
+ * @method complexity
279
+ * @return {Number} complexity
280
+ */
281
+ complexity: function() {
282
+ return this.getObjects().reduce(function(total, object) {
283
+ total += (typeof object.complexity === 'function') ? object.complexity() : 0;
284
+ return total;
285
+ }, 0);
286
+ },
287
+
288
+ /**
289
+ * Retores original state of each of group objects (original state is that which was before group was created).
290
+ * @private
291
+ * @method _restoreObjectsState
292
+ * @return {fabric.Group} thisArg
293
+ * @chainable
294
+ */
295
+ _restoreObjectsState: function() {
296
+ this.objects.forEach(this._restoreObjectState, this);
297
+ return this;
298
+ },
299
+
300
+ /**
301
+ * Restores original state of a specified object in group
302
+ * @private
303
+ * @method _restoreObjectState
304
+ * @param {fabric.Object} object
305
+ * @return {fabric.Group} thisArg
306
+ */
307
+ _restoreObjectState: function(object) {
308
+
309
+ var groupLeft = this.get('left'),
310
+ groupTop = this.get('top'),
311
+ groupAngle = this.getAngle() * (Math.PI / 180),
312
+ rotatedTop = Math.cos(groupAngle) * object.get('top') + Math.sin(groupAngle) * object.get('left'),
313
+ rotatedLeft = -Math.sin(groupAngle) * object.get('top') + Math.cos(groupAngle) * object.get('left');
314
+
315
+ object.setAngle(object.getAngle() + this.getAngle());
316
+
317
+ object.set('left', groupLeft + rotatedLeft * this.get('scaleX'));
318
+ object.set('top', groupTop + rotatedTop * this.get('scaleY'));
319
+
320
+ object.set('scaleX', object.get('scaleX') * this.get('scaleX'));
321
+ object.set('scaleY', object.get('scaleY') * this.get('scaleY'));
322
+
323
+ object.setCoords();
324
+ object.hasControls = true;
325
+ object.setActive(false);
326
+ object.setCoords();
327
+
328
+ return this;
329
+ },
330
+
331
+ /**
332
+ * Destroys a group (restoring state of its objects)
333
+ * @method destroy
334
+ * @return {fabric.Group} thisArg
335
+ * @chainable
336
+ */
337
+ destroy: function() {
338
+ return this._restoreObjectsState();
339
+ },
340
+
341
+ /**
342
+ * Saves coordinates of this instance (to be used together with `hasMoved`)
343
+ * @saveCoords
344
+ * @return {fabric.Group} thisArg
345
+ * @chainable
346
+ */
347
+ saveCoords: function() {
348
+ this._originalLeft = this.get('left');
349
+ this._originalTop = this.get('top');
350
+ return this;
351
+ },
352
+
353
+ /**
354
+ * Checks whether this group was moved (since `saveCoords` was called last)
355
+ * @method hasMoved
356
+ * @return {Boolean} true if an object was moved (since fabric.Group#saveCoords was called)
357
+ */
358
+ hasMoved: function() {
359
+ return this._originalLeft !== this.get('left') ||
360
+ this._originalTop !== this.get('top');
361
+ },
362
+
363
+ /**
364
+ * Sets coordinates of all group objects
365
+ * @method setObjectsCoords
366
+ * @return {fabric.Group} thisArg
367
+ * @chainable
368
+ */
369
+ setObjectsCoords: function() {
370
+ this.forEachObject(function(object) {
371
+ object.setCoords();
372
+ });
373
+ return this;
374
+ },
375
+
376
+ /**
377
+ * Activates (makes active) all group objects
378
+ * @method activateAllObjects
379
+ * @return {fabric.Group} thisArg
380
+ * @chainable
381
+ */
382
+ activateAllObjects: function() {
383
+ this.forEachObject(function(object) {
384
+ object.setActive();
385
+ });
386
+ return this;
387
+ },
388
+
389
+ /**
390
+ * Executes given function for each object in this group
391
+ * @method forEachObject
392
+ * @param {Function} callback
393
+ * Callback invoked with current object as first argument,
394
+ * index - as second and an array of all objects - as third.
395
+ * Iteration happens in reverse order (for performance reasons).
396
+ * Callback is invoked in a context of Global Object (e.g. `window`)
397
+ * when no `context` argument is given
398
+ *
399
+ * @param {Object} context Context (aka thisObject)
400
+ *
401
+ * @return {fabric.Group} thisArg
402
+ * @chainable
403
+ */
404
+ forEachObject: fabric.StaticCanvas.prototype.forEachObject,
405
+
406
+ /**
407
+ * @private
408
+ * @method _setOpacityIfSame
409
+ */
410
+ _setOpacityIfSame: function() {
411
+ var objects = this.getObjects(),
412
+ firstValue = objects[0] ? objects[0].get('opacity') : 1;
413
+
414
+ var isSameOpacity = objects.every(function(o) {
415
+ return o.get('opacity') === firstValue;
416
+ });
417
+
418
+ if (isSameOpacity) {
419
+ this.opacity = firstValue;
420
+ }
421
+ },
422
+
423
+ /**
424
+ * @private
425
+ * @method _calcBounds
426
+ */
427
+ _calcBounds: function() {
428
+ var aX = [],
429
+ aY = [],
430
+ minX, minY, maxX, maxY, o, width, height,
431
+ i = 0,
432
+ len = this.objects.length;
433
+
434
+ for (; i < len; ++i) {
435
+ o = this.objects[i];
436
+ o.setCoords();
437
+ for (var prop in o.oCoords) {
438
+ aX.push(o.oCoords[prop].x);
439
+ aY.push(o.oCoords[prop].y);
440
+ }
441
+ }
442
+
443
+ minX = min(aX);
444
+ maxX = max(aX);
445
+ minY = min(aY);
446
+ maxY = max(aY);
447
+
448
+ width = (maxX - minX) || 0;
449
+ height = (maxY - minY) || 0;
450
+
451
+ this.width = width;
452
+ this.height = height;
453
+
454
+ this.left = (minX + width / 2) || 0;
455
+ this.top = (minY + height / 2) || 0;
456
+ },
457
+
458
+ /**
459
+ * Checks if point is contained within the group
460
+ * @method containsPoint
461
+ * @param {fabric.Point} point point with `x` and `y` properties
462
+ * @return {Boolean} true if point is contained within group
463
+ */
464
+ containsPoint: function(point) {
465
+
466
+ var halfWidth = this.get('width') / 2,
467
+ halfHeight = this.get('height') / 2,
468
+ centerX = this.get('left'),
469
+ centerY = this.get('top');
470
+
471
+ return centerX - halfWidth < point.x &&
472
+ centerX + halfWidth > point.x &&
473
+ centerY - halfHeight < point.y &&
474
+ centerY + halfHeight > point.y;
475
+ },
476
+
477
+ /**
478
+ * Makes all of this group's objects grayscale (i.e. calling `toGrayscale` on them)
479
+ * @method toGrayscale
480
+ * @return {fabric.Group} thisArg
481
+ * @chainable
482
+ */
483
+ toGrayscale: function() {
484
+ var i = this.objects.length;
485
+ while (i--) {
486
+ this.objects[i].toGrayscale();
487
+ }
488
+ return this;
489
+ },
490
+
491
+ /**
492
+ * Returns svg representation of an instance
493
+ * @method toSVG
494
+ * @return {String} svg representation of an instance
495
+ */
496
+ toSVG: function() {
497
+ var objectsMarkup = [ ];
498
+ for (var i = this.objects.length; i--; ) {
499
+ objectsMarkup.push(this.objects[i].toSVG());
500
+ }
501
+
502
+ return (
503
+ '<g transform="' + this.getSvgTransform() + '">' +
504
+ objectsMarkup.join('') +
505
+ '</g>');
506
+ },
507
+
508
+ /**
509
+ * Returns requested property
510
+ * @method get
511
+ * @param {String} prop Property to get
512
+ * @return {Any}
513
+ */
514
+ get: function(prop) {
515
+ if (prop in _lockProperties) {
516
+ if (this[prop]) {
517
+ return this[prop];
518
+ }
519
+ else {
520
+ for (var i = 0, len = this.objects.length; i < len; i++) {
521
+ if (this.objects[i][prop]) {
522
+ return true;
523
+ }
524
+ }
525
+ return false;
526
+ }
527
+ }
528
+ else {
529
+ return this[prop];
530
+ }
531
+ }
532
+ });
533
+
534
+ /**
535
+ * Returns {@link fabric.Group} instance from an object representation
536
+ * @static
537
+ * @method fabric.Group.fromObject
538
+ * @param {Object} object Object to create a group from
539
+ * @param {Object} [options] Options object
540
+ * @return {fabric.Group} An instance of fabric.Group
541
+ */
542
+ fabric.Group.fromObject = function(object, callback) {
543
+ fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {
544
+ delete object.objects;
545
+ callback && callback(new fabric.Group(enlivenedObjects, object));
546
+ });
547
+ };
548
+
549
+ /**
550
+ * Indicates that instances of this type are async
551
+ * @static
552
+ * @type Boolean
553
+ */
554
+ fabric.Group.async = true;
555
+
556
+ })(typeof exports !== 'undefined' ? exports : this);