shank 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/.gitignore +22 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +22 -0
  4. data/README.md +0 -0
  5. data/Rakefile +2 -0
  6. data/lib/assets/javascripts/engine.gamepads.coffee +46 -0
  7. data/lib/assets/javascripts/engine_stats.coffee +10 -0
  8. data/lib/assets/javascripts/error_handler.coffee +11 -0
  9. data/lib/assets/javascripts/game_keys.coffee +6 -0
  10. data/lib/assets/javascripts/gamepads.coffee +21 -0
  11. data/lib/assets/javascripts/gamepads.controller.coffee +138 -0
  12. data/lib/assets/javascripts/init.coffee +6 -0
  13. data/lib/assets/javascripts/joysticks.coffee +238 -0
  14. data/lib/assets/javascripts/jquery.hotkeys.coffee +161 -0
  15. data/lib/assets/javascripts/jquery.reverse_merge.coffee +21 -0
  16. data/lib/assets/javascripts/keydown.coffee +73 -0
  17. data/lib/assets/javascripts/mouse.coffee +66 -0
  18. data/lib/assets/javascripts/music.coffee +78 -0
  19. data/lib/assets/javascripts/pixie_canvas.coffee +739 -0
  20. data/lib/assets/javascripts/request_animation_frame.coffee +22 -0
  21. data/lib/assets/javascripts/shank.coffee +18 -0
  22. data/lib/assets/javascripts/sound.coffee +131 -0
  23. data/lib/assets/javascripts/storage.coffee +88 -0
  24. data/lib/shank/version.rb +3 -0
  25. data/lib/shank.rb +10 -0
  26. data/shank.gemspec +17 -0
  27. data/test/jquery.reverse_merge.coffee +43 -0
  28. data/test/keydown.coffee +19 -0
  29. data/test/pixie_canvas.coffee +18 -0
  30. data/test/request_animation_frame.coffee +7 -0
  31. data/test/sound.coffee +7 -0
  32. data/test/storage.coffee +47 -0
  33. data/test/xstats.coffee +7 -0
  34. data/vendor/assets/javascripts/xstats.js +767 -0
  35. metadata +113 -0
@@ -0,0 +1,739 @@
1
+ ( ($) ->
2
+ $.fn.pixieCanvas = (options={}) ->
3
+ canvas = this.get(0)
4
+ context = undefined
5
+
6
+ ###*
7
+ PixieCanvas provides a convenient wrapper for working with Context2d.
8
+
9
+ Methods try to be as flexible as possible as to what arguments they take.
10
+
11
+ Non-getter methods return `this` for method chaining.
12
+
13
+ @name PixieCanvas
14
+ @constructor
15
+ ###
16
+ $canvas = $(canvas).extend
17
+ ###*
18
+ Passes this canvas to the block with the given matrix transformation
19
+ applied. All drawing methods called within the block will draw
20
+ into the canvas with the transformation applied. The transformation
21
+ is removed at the end of the block, even if the block throws an error.
22
+
23
+ @name withTransform
24
+ @methodOf PixieCanvas#
25
+
26
+ @param {Matrix} matrix
27
+ @param {Function} block
28
+
29
+ @returns {PixieCanvas} this
30
+ ###
31
+ withTransform: (matrix, block) ->
32
+ context.save()
33
+
34
+ context.transform(
35
+ matrix.a,
36
+ matrix.b,
37
+ matrix.c,
38
+ matrix.d,
39
+ matrix.tx,
40
+ matrix.ty
41
+ )
42
+
43
+ try
44
+ block(@)
45
+ finally
46
+ context.restore()
47
+
48
+ return @
49
+
50
+ ###*
51
+ Clear the canvas (or a portion of it).
52
+
53
+ Clear the entire canvas
54
+
55
+ <code><pre>
56
+ canvas.clear()
57
+ </pre></code>
58
+
59
+ Clear a portion of the canvas
60
+
61
+ <code class="run"><pre>
62
+ # Set up: Fill canvas with blue
63
+ canvas.fill("blue")
64
+
65
+ # Clear a portion of the canvas
66
+ canvas.clear
67
+ x: 50
68
+ y: 50
69
+ width: 50
70
+ height: 50
71
+ </pre></code>
72
+
73
+ You can also clear the canvas by passing x, y, width height as
74
+ unnamed parameters:
75
+
76
+ <code><pre>
77
+ canvas.clear(25, 25, 50, 50)
78
+ </pre></code>
79
+
80
+ @name clear
81
+ @methodOf PixieCanvas#
82
+
83
+ @param {Number} [x] where to start clearing on the x axis
84
+ @param {Number} [y] where to start clearing on the y axis
85
+ @param {Number} [width] width of area to clear
86
+ @param {Number} [height] height of area to clear
87
+
88
+ @returns {PixieCanvas} this
89
+ ###
90
+ clear: (x={}, y, width, height) ->
91
+ unless y?
92
+ {x, y, width, height} = x
93
+
94
+ x ||= 0
95
+ y ||= 0
96
+ width = canvas.width unless width?
97
+ height = canvas.height unless height?
98
+
99
+ context.clearRect(x, y, width, height)
100
+
101
+ return @
102
+
103
+ ###*
104
+ Fills the entire canvas (or a specified section of it) with
105
+ the given color.
106
+
107
+ <code class="run"><pre>
108
+ # Paint the town (entire canvas) red
109
+ canvas.fill "red"
110
+
111
+ # Fill a section of the canvas white (#FFF)
112
+ canvas.fill
113
+ x: 50
114
+ y: 50
115
+ width: 50
116
+ height: 50
117
+ color: "#FFF"
118
+ </pre></code>
119
+
120
+ @name fill
121
+ @methodOf PixieCanvas#
122
+
123
+ @param {Number} [x=0] Optional x position to fill from
124
+ @param {Number} [y=0] Optional y position to fill from
125
+ @param {Number} [width=canvas.width] Optional width of area to fill
126
+ @param {Number} [height=canvas.height] Optional height of area to fill
127
+ @param {Bounds} [bounds] bounds object to fill
128
+ @param {String|Color} [color] color of area to fill
129
+
130
+ @returns {PixieCanvas} this
131
+ ###
132
+ fill: (color={}) ->
133
+ unless color.isString?() || color.channels
134
+ {x, y, width, height, bounds, color} = color
135
+
136
+ {x, y, width, height} = bounds if bounds
137
+
138
+ x ||= 0
139
+ y ||= 0
140
+ width = canvas.width unless width?
141
+ height = canvas.height unless height?
142
+
143
+ @fillColor(color)
144
+ context.fillRect(x, y, width, height)
145
+
146
+ return @
147
+
148
+ ###*
149
+ A direct map to the Context2d draw image. `GameObject`s
150
+ that implement drawable will have this wrapped up nicely,
151
+ so there is a good chance that you will not have to deal with
152
+ it directly.
153
+
154
+ @name drawImage
155
+ @methodOf PixieCanvas#
156
+
157
+ @param image
158
+ @param {Number} sx
159
+ @param {Number} sy
160
+ @param {Number} sWidth
161
+ @param {Number} sHeight
162
+ @param {Number} dx
163
+ @param {Number} dy
164
+ @param {Number} dWidth
165
+ @param {Number} dHeight
166
+
167
+ @returns {PixieCanvas} this
168
+ ###
169
+ drawImage: (image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) ->
170
+ context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
171
+
172
+ return @
173
+
174
+ ###*
175
+ Draws a circle at the specified position with the specified
176
+ radius and color.
177
+
178
+ <code class="run"><pre>
179
+ # Draw a large orange circle
180
+ canvas.drawCircle
181
+ radius: 30
182
+ position: Point(100, 75)
183
+ color: "orange"
184
+
185
+ # Draw a blue circle with radius 10 at (25, 50)
186
+ # and a red stroke
187
+ canvas.drawCircle
188
+ x: 25
189
+ y: 50
190
+ radius: 10
191
+ color: "blue"
192
+ stroke:
193
+ color: "red"
194
+ width: 1
195
+
196
+ # Create a circle object to set up the next examples
197
+ circle =
198
+ radius: 20
199
+ x: 50
200
+ y: 50
201
+
202
+ # Draw a given circle in yellow
203
+ canvas.drawCircle
204
+ circle: circle
205
+ color: "yellow"
206
+
207
+ # Draw the circle in green at a different position
208
+ canvas.drawCircle
209
+ circle: circle
210
+ position: Point(25, 75)
211
+ color: "green"
212
+
213
+ # Draw an outline circle in purple.
214
+ canvas.drawCircle
215
+ x: 50
216
+ y: 75
217
+ radius: 10
218
+ stroke:
219
+ color: "purple"
220
+ width: 2
221
+ </pre></code>
222
+
223
+ @name drawCircle
224
+ @methodOf PixieCanvas#
225
+
226
+ @param {Number} [x] location on the x axis to start drawing
227
+ @param {Number} [y] location on the y axis to start drawing
228
+ @param {Point} [position] position object of location to start drawing. This will override x and y values passed
229
+ @param {Number} [radius] length of the radius of the circle
230
+ @param {Color|String} [color] color of the circle
231
+ @param {Circle} [circle] circle object that contains position and radius. Overrides x, y, and radius if passed
232
+ @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width
233
+
234
+ @returns {PixieCanvas} this
235
+ ###
236
+ drawCircle: ({x, y, radius, position, color, stroke, circle}) ->
237
+ {x, y, radius} = circle if circle
238
+ {x, y} = position if position
239
+
240
+ context.beginPath()
241
+ context.arc(x, y, radius, 0, Math.TAU, true)
242
+ context.closePath()
243
+
244
+ if color
245
+ @fillColor(color)
246
+ context.fill()
247
+
248
+ if stroke
249
+ @strokeColor(stroke.color)
250
+ @lineWidth(stroke.width)
251
+ context.stroke()
252
+
253
+ return @
254
+
255
+ ###*
256
+ Draws a rectangle at the specified position with given
257
+ width and height. Optionally takes a position, bounds
258
+ and color argument.
259
+
260
+ <code class="run"><pre>
261
+ # Draw a red rectangle using x, y, width and height
262
+ canvas.drawRect
263
+ x: 50
264
+ y: 50
265
+ width: 50
266
+ height: 50
267
+ color: "#F00"
268
+
269
+ # Draw a blue rectangle using position, width and height
270
+ # and throw in a stroke for good measure
271
+ canvas.drawRect
272
+ position: Point(0, 0)
273
+ width: 50
274
+ height: 50
275
+ color: "blue"
276
+ stroke:
277
+ color: "orange"
278
+ width: 3
279
+
280
+ # Set up a bounds object for the next examples
281
+ bounds =
282
+ x: 100
283
+ y: 0
284
+ width: 100
285
+ height: 100
286
+
287
+ # Draw a purple rectangle using bounds
288
+ canvas.drawRect
289
+ bounds: bounds
290
+ color: "green"
291
+
292
+ # Draw the outline of the same bounds, but at a different position
293
+ canvas.drawRect
294
+ bounds: bounds
295
+ position: Point(0, 50)
296
+ stroke:
297
+ color: "purple"
298
+ width: 2
299
+ </pre></code>
300
+
301
+ @name drawRect
302
+ @methodOf PixieCanvas#
303
+
304
+ @param {Number} [x] location on the x axis to start drawing
305
+ @param {Number} [y] location on the y axis to start drawing
306
+ @param {Number} [width] width of rectangle to draw
307
+ @param {Number} [height] height of rectangle to draw
308
+ @param {Point} [position] position to start drawing. Overrides x and y if passed
309
+ @param {Color|String} [color] color of rectangle
310
+ @param {Bounds} [bounds] bounds of rectangle. Overrides x, y, width, height if passed
311
+ @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width
312
+
313
+ @returns {PixieCanvas} this
314
+ ###
315
+ drawRect: ({x, y, width, height, position, bounds, color, stroke}) ->
316
+ {x, y, width, height} = bounds if bounds
317
+ {x, y} = position if position
318
+
319
+ if color
320
+ @fillColor(color)
321
+ context.fillRect(x, y, width, height)
322
+
323
+ if stroke
324
+ @strokeColor(stroke.color)
325
+ @lineWidth(stroke.width)
326
+ context.strokeRect(x, y, width, height)
327
+
328
+ return @
329
+
330
+ ###*
331
+ Draw a line from `start` to `end`.
332
+
333
+ <code class="run"><pre>
334
+ # Draw a sweet diagonal
335
+ canvas.drawLine
336
+ start: Point(0, 0)
337
+ end: Point(200, 200)
338
+ color: "purple"
339
+
340
+ # Draw another sweet diagonal
341
+ canvas.drawLine
342
+ start: Point(200, 0)
343
+ end: Point(0, 200)
344
+ color: "red"
345
+ width: 6
346
+
347
+ # Now draw a sweet horizontal with a direction and a length
348
+ canvas.drawLine
349
+ start: Point(0, 100)
350
+ length: 200
351
+ direction: Point(1, 0)
352
+ color: "orange"
353
+
354
+ </pre></code>
355
+
356
+ @name drawLine
357
+ @methodOf PixieCanvas#
358
+
359
+ @param {Point} start position to start drawing from
360
+ @param {Point} [end] position to stop drawing
361
+ @param {Number} [width] width of the line
362
+ @param {String|Color} [color] color of the line
363
+
364
+ @returns {PixieCanvas} this
365
+ ###
366
+ drawLine: ({start, end, width, color, direction, length}) ->
367
+ width ||= 3
368
+
369
+ if direction
370
+ end = direction.norm(length).add(start)
371
+
372
+ @lineWidth(width)
373
+ @strokeColor(color)
374
+
375
+ context.beginPath()
376
+ context.moveTo(start.x, start.y)
377
+ context.lineTo(end.x, end.y)
378
+ context.closePath()
379
+ context.stroke()
380
+
381
+ return @
382
+
383
+ ###*
384
+ Draw a polygon.
385
+
386
+ <code class="run"><pre>
387
+ # Draw a sweet rhombus
388
+ canvas.drawPoly
389
+ points: [
390
+ Point(50, 25)
391
+ Point(75, 50)
392
+ Point(50, 75)
393
+ Point(25, 50)
394
+ ]
395
+ color: "purple"
396
+ stroke:
397
+ color: "red"
398
+ width: 2
399
+ </pre></code>
400
+
401
+ @name drawPoly
402
+ @methodOf PixieCanvas#
403
+
404
+ @param {Point[]} [points] collection of points that define the vertices of the polygon
405
+ @param {String|Color} [color] color of the polygon
406
+ @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width
407
+
408
+ @returns {PixieCanvas} this
409
+ ###
410
+ drawPoly: ({points, color, stroke}) ->
411
+ context.beginPath()
412
+ points.each (point, i) ->
413
+ if i == 0
414
+ context.moveTo(point.x, point.y)
415
+ else
416
+ context.lineTo(point.x, point.y)
417
+ context.lineTo points[0].x, points[0].y
418
+
419
+ if color
420
+ @fillColor(color)
421
+ context.fill()
422
+
423
+ if stroke
424
+ @strokeColor(stroke.color)
425
+ @lineWidth(stroke.width)
426
+ context.stroke()
427
+
428
+ return @
429
+
430
+ ###*
431
+ Draw a rounded rectangle.
432
+
433
+ Adapted from http://js-bits.blogspot.com/2010/07/canvas-rounded-corner-rectangles.html
434
+
435
+ <code class="run"><pre>
436
+ # Draw a purple rounded rectangle with a red outline
437
+ canvas.drawRoundRect
438
+ position: Point(25, 25)
439
+ radius: 10
440
+ width: 150
441
+ height: 100
442
+ color: "purple"
443
+ stroke:
444
+ color: "red"
445
+ width: 2
446
+ </pre></code>
447
+
448
+ @name drawRoundRect
449
+ @methodOf PixieCanvas#
450
+
451
+ @param {Number} [x] location on the x axis to start drawing
452
+ @param {Number} [y] location on the y axis to start drawing
453
+ @param {Number} [width] width of the rounded rectangle
454
+ @param {Number} [height] height of the rounded rectangle
455
+ @param {Number} [radius=5] radius to round the rectangle corners
456
+ @param {Point} [position] position to start drawing. Overrides x and y if passed
457
+ @param {Color|String} [color] color of the rounded rectangle
458
+ @param {Bounds} [bounds] bounds of the rounded rectangle. Overrides x, y, width, and height if passed
459
+ @param {Stroke} [stroke] stroke object that specifies stroke color and stroke width
460
+
461
+ @returns {PixieCanvas} this
462
+ ###
463
+ drawRoundRect: ({x, y, width, height, radius, position, bounds, color, stroke}) ->
464
+ radius = 5 unless radius?
465
+
466
+ {x, y, width, height} = bounds if bounds
467
+ {x, y} = position if position
468
+
469
+ context.beginPath()
470
+ context.moveTo(x + radius, y)
471
+ context.lineTo(x + width - radius, y)
472
+ context.quadraticCurveTo(x + width, y, x + width, y + radius)
473
+ context.lineTo(x + width, y + height - radius)
474
+ context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height)
475
+ context.lineTo(x + radius, y + height)
476
+ context.quadraticCurveTo(x, y + height, x, y + height - radius)
477
+ context.lineTo(x, y + radius)
478
+ context.quadraticCurveTo(x, y, x + radius, y)
479
+ context.closePath()
480
+
481
+ if color
482
+ @fillColor(color)
483
+ context.fill()
484
+
485
+ if stroke
486
+ @lineWidth(stroke.width)
487
+ @strokeColor(stroke.color)
488
+ context.stroke()
489
+
490
+ return @
491
+
492
+ ###*
493
+ Draws text on the canvas at the given position, in the given color.
494
+ If no color is given then the previous fill color is used.
495
+
496
+ <code class="run"><pre>
497
+ # Fill canvas to indicate bounds
498
+ canvas.fill
499
+ color: '#eee'
500
+
501
+ # A line to indicate the baseline
502
+ canvas.drawLine
503
+ start: Point(25, 50)
504
+ end: Point(125, 50)
505
+ color: "#333"
506
+ width: 1
507
+
508
+ # Draw some text, note the position of the baseline
509
+ canvas.drawText
510
+ position: Point(25, 50)
511
+ color: "red"
512
+ text: "It's dangerous to go alone"
513
+
514
+ </pre></code>
515
+
516
+ @name drawText
517
+ @methodOf PixieCanvas#
518
+
519
+ @param {Number} [x] location on x axis to start printing
520
+ @param {Number} [y] location on y axis to start printing
521
+ @param {String} text text to print
522
+ @param {Point} [position] position to start printing. Overrides x and y if passed
523
+ @param {String|Color} [color] color of text to start printing
524
+ @param {String} [font] font of text to print
525
+
526
+ @returns {PixieCanvas} this
527
+ ###
528
+ drawText: ({x, y, text, position, color, font}) ->
529
+ {x, y} = position if position
530
+
531
+ @fillColor(color)
532
+ @font(font) if font
533
+ context.fillText(text, x, y)
534
+
535
+ return @
536
+
537
+ ###*
538
+ Centers the given text on the canvas at the given y position. An x position
539
+ or point position can also be given in which case the text is centered at the
540
+ x, y or position value specified.
541
+
542
+ <code class="run"><pre>
543
+ # Fill canvas to indicate bounds
544
+ canvas.fill
545
+ color: "#eee"
546
+
547
+ # A line to indicate the baseline
548
+ canvas.drawLine
549
+ start: Point(25, 25)
550
+ end: Point(125, 25)
551
+ color: "#333"
552
+ width: 1
553
+
554
+ # Center text on the screen at y value 25
555
+ canvas.centerText
556
+ y: 25
557
+ color: "red"
558
+ text: "It's dangerous to go alone"
559
+
560
+ # Center text at point (75, 75)
561
+ canvas.centerText
562
+ position: Point(75, 75)
563
+ color: "green"
564
+ text: "take this"
565
+
566
+ </pre></code>
567
+
568
+ @name centerText
569
+ @methodOf PixieCanvas#
570
+
571
+ @param {String} text Text to print
572
+ @param {Number} [y] location on the y axis to start printing
573
+ @param {Number} [x] location on the x axis to start printing. Overrides the default centering behavior if passed
574
+ @param {Point} [position] position to start printing. Overrides x and y if passed
575
+ @param {String|Color} [color] color of text to print
576
+ @param {String} [font] font of text to print
577
+
578
+ @returns {PixieCanvas} this
579
+ ###
580
+ centerText: ({text, x, y, position, color, font}) ->
581
+ {x, y} = position if position
582
+
583
+ x = canvas.width / 2 unless x?
584
+
585
+ textWidth = @measureText(text)
586
+
587
+ @drawText {
588
+ text
589
+ color
590
+ font
591
+ x: x - (textWidth) / 2
592
+ y
593
+ }
594
+
595
+ ###*
596
+ A getter / setter method to set the canvas fillColor.
597
+
598
+ <code><pre>
599
+ # Set the fill color
600
+ canvas.fillColor('#FF0000')
601
+
602
+ # Passing no arguments returns the fillColor
603
+ canvas.fillColor()
604
+ # => '#FF0000'
605
+
606
+ # You can also pass a Color object
607
+ canvas.fillColor(Color('sky blue'))
608
+ </pre></code>
609
+
610
+ @name fillColor
611
+ @methodOf PixieCanvas#
612
+
613
+ @param {String|Color} [color] color to make the canvas fillColor
614
+
615
+ @returns {PixieCanvas} this
616
+ ###
617
+ fillColor: (color) ->
618
+ if color
619
+ if color.channels
620
+ context.fillStyle = color.toString()
621
+ else
622
+ context.fillStyle = color
623
+
624
+ return @
625
+ else
626
+ return context.fillStyle
627
+
628
+ ###*
629
+ A getter / setter method to set the canvas strokeColor.
630
+
631
+ <code><pre>
632
+ # Set the stroke color
633
+ canvas.strokeColor('#FF0000')
634
+
635
+ # Passing no arguments returns the strokeColor
636
+ canvas.strokeColor()
637
+ # => '#FF0000'
638
+
639
+ # You can also pass a Color object
640
+ canvas.strokeColor(Color('sky blue'))
641
+ </pre></code>
642
+
643
+ @name strokeColor
644
+ @methodOf PixieCanvas#
645
+
646
+ @param {String|Color} [color] color to make the canvas strokeColor
647
+
648
+ @returns {PixieCanvas} this
649
+ ###
650
+ strokeColor: (color) ->
651
+ if color
652
+ if color.channels
653
+ context.strokeStyle = color.toString()
654
+ else
655
+ context.strokeStyle = color
656
+
657
+ return @
658
+ else
659
+ return context.strokeStyle
660
+
661
+ ###*
662
+ Determine how wide some text is.
663
+
664
+ <code><pre>
665
+ canvas.measureText('Hello World!')
666
+ # => 55
667
+ </pre></code>
668
+
669
+ @name measureText
670
+ @methodOf PixieCanvas#
671
+
672
+ @param {String} [text] the text to measure
673
+
674
+ @returns {PixieCanvas} this
675
+ ###
676
+ measureText: (text) ->
677
+ context.measureText(text).width
678
+
679
+ putImageData: (imageData, x, y) ->
680
+ context.putImageData(imageData, x, y)
681
+
682
+ return @
683
+
684
+ context: ->
685
+ context
686
+
687
+ element: ->
688
+ canvas
689
+
690
+ createPattern: (image, repitition) ->
691
+ context.createPattern(image, repitition)
692
+
693
+ clip: (x, y, width, height) ->
694
+ context.beginPath()
695
+ context.rect(x, y, width, height)
696
+ context.clip()
697
+
698
+ return @
699
+
700
+ contextAttrAccessor = (attrs...) ->
701
+ attrs.each (attr) ->
702
+ $canvas[attr] = (newVal) ->
703
+ if newVal?
704
+ context[attr] = newVal
705
+ return @
706
+ else
707
+ context[attr]
708
+
709
+ canvasAttrAccessor = (attrs...) ->
710
+ attrs.each (attr) ->
711
+ $canvas[attr] = (newVal) ->
712
+ if newVal?
713
+ canvas[attr] = newVal
714
+ return @
715
+ else
716
+ canvas[attr]
717
+
718
+ contextAttrAccessor(
719
+ "font",
720
+ "globalAlpha",
721
+ "globalCompositeOperation",
722
+ "lineWidth",
723
+ "textAlign",
724
+ )
725
+
726
+ canvasAttrAccessor(
727
+ "height",
728
+ "width",
729
+ )
730
+
731
+ if canvas?.getContext
732
+ context = canvas.getContext('2d')
733
+
734
+ if options.init
735
+ options.init($canvas)
736
+
737
+ return $canvas
738
+
739
+ )(jQuery)