fabric-rails 1.0.12 → 1.0.12.1

Sign up to get free protection for your applications and to get access to all the features.
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);