shank 0.0.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 (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)