melonjs 10.9.0 → 10.12.0

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 (96) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +32 -25
  3. package/dist/melonjs.js +1635 -2383
  4. package/dist/melonjs.min.js +4 -4
  5. package/dist/melonjs.module.d.ts +929 -1504
  6. package/dist/melonjs.module.js +1581 -2344
  7. package/package.json +18 -18
  8. package/src/audio/audio.js +0 -1
  9. package/src/camera/camera2d.js +1 -16
  10. package/src/entity/entity.js +6 -11
  11. package/src/game.js +2 -2
  12. package/src/geometries/ellipse.js +19 -28
  13. package/src/geometries/line.js +5 -8
  14. package/src/geometries/path2d.js +14 -24
  15. package/src/geometries/poly.js +29 -47
  16. package/src/geometries/rectangle.js +25 -37
  17. package/src/geometries/roundrect.js +8 -12
  18. package/src/index.js +7 -2
  19. package/src/input/gamepad.js +3 -14
  20. package/src/input/keyboard.js +1 -9
  21. package/src/input/pointer.js +0 -1
  22. package/src/input/pointerevent.js +14 -23
  23. package/src/lang/deprecated.js +9 -6
  24. package/src/level/level.js +0 -9
  25. package/src/level/tiled/TMXGroup.js +0 -4
  26. package/src/level/tiled/TMXLayer.js +0 -8
  27. package/src/level/tiled/TMXObject.js +0 -3
  28. package/src/level/tiled/TMXTile.js +4 -5
  29. package/src/level/tiled/TMXTileMap.js +1 -7
  30. package/src/level/tiled/TMXTileset.js +0 -5
  31. package/src/level/tiled/TMXTilesetGroup.js +1 -4
  32. package/src/level/tiled/TMXUtils.js +1 -4
  33. package/src/level/tiled/renderer/TMXHexagonalRenderer.js +2 -3
  34. package/src/level/tiled/renderer/TMXIsometricRenderer.js +0 -1
  35. package/src/level/tiled/renderer/TMXRenderer.js +1 -7
  36. package/src/loader/loader.js +0 -11
  37. package/src/loader/loadingscreen.js +16 -5
  38. package/src/math/color.js +10 -30
  39. package/src/math/math.js +0 -10
  40. package/src/math/matrix2.js +12 -27
  41. package/src/math/matrix3.js +1 -22
  42. package/src/math/observable_vector2.js +0 -29
  43. package/src/math/observable_vector3.js +0 -29
  44. package/src/math/vector2.js +3 -40
  45. package/src/math/vector3.js +4 -41
  46. package/src/particles/emitter.js +11 -12
  47. package/src/physics/body.js +4 -5
  48. package/src/physics/bounds.js +5 -19
  49. package/src/physics/collision.js +1 -13
  50. package/src/physics/detector.js +6 -56
  51. package/src/physics/quadtree.js +0 -7
  52. package/src/physics/response.js +48 -0
  53. package/src/physics/sat.js +4 -4
  54. package/src/physics/world.js +0 -4
  55. package/src/plugin/plugin.js +0 -2
  56. package/src/polyfill/roundrect.js +4 -2
  57. package/src/renderable/GUI.js +11 -14
  58. package/src/renderable/collectable.js +1 -0
  59. package/src/renderable/colorlayer.js +9 -7
  60. package/src/renderable/container.js +38 -64
  61. package/src/renderable/dragndrop.js +1 -10
  62. package/src/renderable/imagelayer.js +8 -12
  63. package/src/renderable/light2d.js +118 -0
  64. package/src/renderable/renderable.js +27 -48
  65. package/src/renderable/sprite.js +17 -29
  66. package/src/renderable/trigger.js +10 -3
  67. package/src/state/stage.js +72 -6
  68. package/src/state/state.js +22 -23
  69. package/src/system/device.js +14 -53
  70. package/src/system/event.js +11 -0
  71. package/src/system/pooling.js +20 -9
  72. package/src/system/save.js +9 -11
  73. package/src/system/timer.js +239 -218
  74. package/src/text/bitmaptextdata.js +1 -4
  75. package/src/text/glyph.js +2 -2
  76. package/src/text/text.js +25 -24
  77. package/src/text/textmetrics.js +0 -2
  78. package/src/tweens/easing.js +1 -1
  79. package/src/tweens/interpolation.js +2 -2
  80. package/src/tweens/tween.js +1 -13
  81. package/src/utils/agent.js +1 -3
  82. package/src/utils/array.js +0 -3
  83. package/src/utils/file.js +0 -2
  84. package/src/utils/function.js +0 -2
  85. package/src/utils/string.js +0 -6
  86. package/src/utils/utils.js +0 -3
  87. package/src/video/canvas/canvas_renderer.js +73 -90
  88. package/src/video/renderer.js +34 -49
  89. package/src/video/{texture.js → texture/atlas.js} +10 -8
  90. package/src/video/{texture_cache.js → texture/cache.js} +4 -5
  91. package/src/video/texture/canvas_texture.js +99 -0
  92. package/src/video/video.js +3 -3
  93. package/src/video/webgl/glshader.js +0 -5
  94. package/src/video/webgl/utils/uniforms.js +3 -6
  95. package/src/video/webgl/webgl_compositor.js +0 -14
  96. package/src/video/webgl/webgl_renderer.js +73 -97
@@ -1,11 +1,12 @@
1
1
  import Color from "./../../math/color.js";
2
2
  import Renderer from "./../renderer.js";
3
- import TextureCache from "./../texture_cache.js";
3
+ import TextureCache from "./../texture/cache.js";
4
4
  import Ellipse from "./../../geometries/ellipse.js";
5
5
  import RoundRect from "./../../geometries/roundrect.js";
6
+ import Rect from "./../../geometries/rectangle.js";
7
+ import Bounds from "./../../physics/bounds.js";
6
8
  import { createCanvas } from "./../video.js";
7
-
8
-
9
+ import * as event from "./../../system/event.js";
9
10
 
10
11
  /**
11
12
  * @classdesc
@@ -72,8 +73,7 @@ class CanvasRenderer extends Renderer {
72
73
  /**
73
74
  * Reset context state
74
75
  * @name reset
75
- * @memberof CanvasRenderer.prototype
76
- * @function
76
+ * @memberof CanvasRenderer
77
77
  */
78
78
  reset() {
79
79
  super.reset();
@@ -83,8 +83,7 @@ class CanvasRenderer extends Renderer {
83
83
  /**
84
84
  * Reset the canvas transform to identity
85
85
  * @name resetTransform
86
- * @memberof CanvasRenderer.prototype
87
- * @function
86
+ * @memberof CanvasRenderer
88
87
  */
89
88
  resetTransform() {
90
89
  this.backBufferContext2D.setTransform(1, 0, 0, 1, 0, 0);
@@ -103,8 +102,7 @@ class CanvasRenderer extends Renderer {
103
102
  * <img src="images/screen-blendmode.png" width="510"/> <br>
104
103
  * @name setBlendMode
105
104
  * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
106
- * @memberof CanvasRenderer.prototype
107
- * @function
105
+ * @memberof CanvasRenderer
108
106
  * @param {string} [mode="normal"] blend mode : "normal", "multiply", "lighter, "additive", "screen"
109
107
  * @param {CanvasRenderingContext2D} [context]
110
108
  */
@@ -141,8 +139,7 @@ class CanvasRenderer extends Renderer {
141
139
  /**
142
140
  * prepare the framebuffer for drawing a new frame
143
141
  * @name clear
144
- * @memberof CanvasRenderer.prototype
145
- * @function
142
+ * @memberof CanvasRenderer
146
143
  */
147
144
  clear() {
148
145
  if (this.settings.transparent) {
@@ -153,8 +150,7 @@ class CanvasRenderer extends Renderer {
153
150
  /**
154
151
  * render the main framebuffer on screen
155
152
  * @name flush
156
- * @memberof CanvasRenderer.prototype
157
- * @function
153
+ * @memberof CanvasRenderer
158
154
  */
159
155
  flush() {
160
156
  if (this.settings.doubleBuffering) {
@@ -165,8 +161,7 @@ class CanvasRenderer extends Renderer {
165
161
  /**
166
162
  * Clears the main framebuffer with the given color
167
163
  * @name clearColor
168
- * @memberof CanvasRenderer.prototype
169
- * @function
164
+ * @memberof CanvasRenderer
170
165
  * @param {Color|string} [color="#000000"] CSS color.
171
166
  * @param {boolean} [opaque=false] Allow transparency [default] or clear the surface completely [true]
172
167
  */
@@ -182,8 +177,7 @@ class CanvasRenderer extends Renderer {
182
177
  /**
183
178
  * Erase the pixels in the given rectangular area by setting them to transparent black (rgba(0,0,0,0)).
184
179
  * @name clearRect
185
- * @memberof CanvasRenderer.prototype
186
- * @function
180
+ * @memberof CanvasRenderer
187
181
  * @param {number} x x axis of the coordinate for the rectangle starting point.
188
182
  * @param {number} y y axis of the coordinate for the rectangle starting point.
189
183
  * @param {number} width The rectangle's width.
@@ -196,8 +190,7 @@ class CanvasRenderer extends Renderer {
196
190
  /**
197
191
  * Create a pattern with the specified repetition
198
192
  * @name createPattern
199
- * @memberof CanvasRenderer.prototype
200
- * @function
193
+ * @memberof CanvasRenderer
201
194
  * @param {Image} image Source image
202
195
  * @param {string} repeat Define how the pattern should be repeated
203
196
  * @returns {CanvasPattern}
@@ -215,8 +208,7 @@ class CanvasRenderer extends Renderer {
215
208
  /**
216
209
  * Draw an image onto the main using the canvas api
217
210
  * @name drawImage
218
- * @memberof CanvasRenderer.prototype
219
- * @function
211
+ * @memberof CanvasRenderer
220
212
  * @param {Image} image An element to draw into the context. The specification permits any canvas image source (CanvasImageSource), specifically, a CSSImageValue, an HTMLImageElement, an SVGImageElement, an HTMLVideoElement, an HTMLCanvasElement, an ImageBitmap, or an OffscreenCanvas.
221
213
  * @param {number} sx The X coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.
222
214
  * @param {number} sy The Y coordinate of the top left corner of the sub-rectangle of the source image to draw into the destination context.
@@ -279,8 +271,7 @@ class CanvasRenderer extends Renderer {
279
271
  /**
280
272
  * Draw a pattern within the given rectangle.
281
273
  * @name drawPattern
282
- * @memberof CanvasRenderer.prototype
283
- * @function
274
+ * @memberof CanvasRenderer
284
275
  * @param {CanvasPattern} pattern Pattern object
285
276
  * @param {number} x
286
277
  * @param {number} y
@@ -303,8 +294,7 @@ class CanvasRenderer extends Renderer {
303
294
  /**
304
295
  * Stroke an arc at the specified coordinates with given radius, start and end points
305
296
  * @name strokeArc
306
- * @memberof CanvasRenderer.prototype
307
- * @function
297
+ * @memberof CanvasRenderer
308
298
  * @param {number} x arc center point x-axis
309
299
  * @param {number} y arc center point y-axis
310
300
  * @param {number} radius
@@ -330,8 +320,7 @@ class CanvasRenderer extends Renderer {
330
320
  /**
331
321
  * Fill an arc at the specified coordinates with given radius, start and end points
332
322
  * @name fillArc
333
- * @memberof CanvasRenderer.prototype
334
- * @function
323
+ * @memberof CanvasRenderer
335
324
  * @param {number} x arc center point x-axis
336
325
  * @param {number} y arc center point y-axis
337
326
  * @param {number} radius
@@ -346,8 +335,7 @@ class CanvasRenderer extends Renderer {
346
335
  /**
347
336
  * Stroke an ellipse at the specified coordinates with given radius
348
337
  * @name strokeEllipse
349
- * @memberof CanvasRenderer.prototype
350
- * @function
338
+ * @memberof CanvasRenderer
351
339
  * @param {number} x ellipse center point x-axis
352
340
  * @param {number} y ellipse center point y-axis
353
341
  * @param {number} w horizontal radius of the ellipse
@@ -388,8 +376,7 @@ class CanvasRenderer extends Renderer {
388
376
  /**
389
377
  * Fill an ellipse at the specified coordinates with given radius
390
378
  * @name fillEllipse
391
- * @memberof CanvasRenderer.prototype
392
- * @function
379
+ * @memberof CanvasRenderer
393
380
  * @param {number} x ellipse center point x-axis
394
381
  * @param {number} y ellipse center point y-axis
395
382
  * @param {number} w horizontal radius of the ellipse
@@ -402,8 +389,7 @@ class CanvasRenderer extends Renderer {
402
389
  /**
403
390
  * Stroke a line of the given two points
404
391
  * @name strokeLine
405
- * @memberof CanvasRenderer.prototype
406
- * @function
392
+ * @memberof CanvasRenderer
407
393
  * @param {number} startX the start x coordinate
408
394
  * @param {number} startY the start y coordinate
409
395
  * @param {number} endX the end x coordinate
@@ -415,6 +401,8 @@ class CanvasRenderer extends Renderer {
415
401
  return;
416
402
  }
417
403
 
404
+ var context = this.getContext();
405
+
418
406
  context.beginPath();
419
407
  context.moveTo(startX, startY);
420
408
  context.lineTo(endX, endY);
@@ -424,8 +412,7 @@ class CanvasRenderer extends Renderer {
424
412
  /**
425
413
  * Fill a line of the given two points
426
414
  * @name fillLine
427
- * @memberof CanvasRenderer.prototype
428
- * @function
415
+ * @memberof CanvasRenderer
429
416
  * @param {number} startX the start x coordinate
430
417
  * @param {number} startY the start y coordinate
431
418
  * @param {number} endX the end x coordinate
@@ -438,8 +425,7 @@ class CanvasRenderer extends Renderer {
438
425
  /**
439
426
  * Stroke the given me.Polygon on the screen
440
427
  * @name strokePolygon
441
- * @memberof CanvasRenderer.prototype
442
- * @function
428
+ * @memberof CanvasRenderer
443
429
  * @param {Polygon} poly the shape to draw
444
430
  * @param {boolean} [fill=false] also fill the shape with the current color if true
445
431
  */
@@ -467,8 +453,7 @@ class CanvasRenderer extends Renderer {
467
453
  /**
468
454
  * Fill the given me.Polygon on the screen
469
455
  * @name fillPolygon
470
- * @memberof CanvasRenderer.prototype
471
- * @function
456
+ * @memberof CanvasRenderer
472
457
  * @param {Polygon} poly the shape to draw
473
458
  */
474
459
  fillPolygon(poly) {
@@ -478,8 +463,7 @@ class CanvasRenderer extends Renderer {
478
463
  /**
479
464
  * Stroke a rectangle at the specified coordinates
480
465
  * @name strokeRect
481
- * @memberof CanvasRenderer.prototype
482
- * @function
466
+ * @memberof CanvasRenderer
483
467
  * @param {number} x
484
468
  * @param {number} y
485
469
  * @param {number} width
@@ -499,8 +483,7 @@ class CanvasRenderer extends Renderer {
499
483
  /**
500
484
  * Draw a filled rectangle at the specified coordinates
501
485
  * @name fillRect
502
- * @memberof CanvasRenderer.prototype
503
- * @function
486
+ * @memberof CanvasRenderer
504
487
  * @param {number} x
505
488
  * @param {number} y
506
489
  * @param {number} width
@@ -513,8 +496,7 @@ class CanvasRenderer extends Renderer {
513
496
  /**
514
497
  * Stroke a rounded rectangle at the specified coordinates
515
498
  * @name strokeRoundRect
516
- * @memberof CanvasRenderer.prototype
517
- * @function
499
+ * @memberof CanvasRenderer
518
500
  * @param {number} x
519
501
  * @param {number} y
520
502
  * @param {number} width
@@ -537,8 +519,7 @@ class CanvasRenderer extends Renderer {
537
519
  /**
538
520
  * Draw a rounded filled rectangle at the specified coordinates
539
521
  * @name fillRoundRect
540
- * @memberof CanvasRenderer.prototype
541
- * @function
522
+ * @memberof CanvasRenderer
542
523
  * @param {number} x
543
524
  * @param {number} y
544
525
  * @param {number} width
@@ -553,8 +534,7 @@ class CanvasRenderer extends Renderer {
553
534
  /**
554
535
  * return a reference to the system 2d Context
555
536
  * @name getContext
556
- * @memberof CanvasRenderer.prototype
557
- * @function
537
+ * @memberof CanvasRenderer
558
538
  * @returns {CanvasRenderingContext2D}
559
539
  */
560
540
  getContext() {
@@ -573,8 +553,7 @@ class CanvasRenderer extends Renderer {
573
553
  /**
574
554
  * save the canvas context
575
555
  * @name save
576
- * @memberof CanvasRenderer.prototype
577
- * @function
556
+ * @memberof CanvasRenderer
578
557
  */
579
558
  save() {
580
559
  this.backBufferContext2D.save();
@@ -583,8 +562,7 @@ class CanvasRenderer extends Renderer {
583
562
  /**
584
563
  * restores the canvas context
585
564
  * @name restore
586
- * @memberof CanvasRenderer.prototype
587
- * @function
565
+ * @memberof CanvasRenderer
588
566
  */
589
567
  restore() {
590
568
  this.backBufferContext2D.restore();
@@ -598,8 +576,7 @@ class CanvasRenderer extends Renderer {
598
576
  /**
599
577
  * rotates the canvas context
600
578
  * @name rotate
601
- * @memberof CanvasRenderer.prototype
602
- * @function
579
+ * @memberof CanvasRenderer
603
580
  * @param {number} angle in radians
604
581
  */
605
582
  rotate(angle) {
@@ -609,8 +586,7 @@ class CanvasRenderer extends Renderer {
609
586
  /**
610
587
  * scales the canvas context
611
588
  * @name scale
612
- * @memberof CanvasRenderer.prototype
613
- * @function
589
+ * @memberof CanvasRenderer
614
590
  * @param {number} x
615
591
  * @param {number} y
616
592
  */
@@ -622,8 +598,7 @@ class CanvasRenderer extends Renderer {
622
598
  * Set the current fill & stroke style color.
623
599
  * By default, or upon reset, the value is set to #000000.
624
600
  * @name setColor
625
- * @memberof CanvasRenderer.prototype
626
- * @function
601
+ * @memberof CanvasRenderer
627
602
  * @param {Color|string} color css color value
628
603
  */
629
604
  setColor(color) {
@@ -638,8 +613,7 @@ class CanvasRenderer extends Renderer {
638
613
  /**
639
614
  * Set the global alpha
640
615
  * @name setGlobalAlpha
641
- * @memberof CanvasRenderer.prototype
642
- * @function
616
+ * @memberof CanvasRenderer
643
617
  * @param {number} alpha 0.0 to 1.0 values accepted.
644
618
  */
645
619
  setGlobalAlpha(alpha) {
@@ -649,8 +623,7 @@ class CanvasRenderer extends Renderer {
649
623
  /**
650
624
  * Return the global alpha
651
625
  * @name getGlobalAlpha
652
- * @memberof CanvasRenderer.prototype
653
- * @function
626
+ * @memberof CanvasRenderer
654
627
  * @returns {number} global alpha value
655
628
  */
656
629
  getGlobalAlpha() {
@@ -660,8 +633,7 @@ class CanvasRenderer extends Renderer {
660
633
  /**
661
634
  * Set the line width on the context
662
635
  * @name setLineWidth
663
- * @memberof CanvasRenderer.prototype
664
- * @function
636
+ * @memberof CanvasRenderer
665
637
  * @param {number} width Line width
666
638
  */
667
639
  setLineWidth(width) {
@@ -672,8 +644,7 @@ class CanvasRenderer extends Renderer {
672
644
  * Reset (overrides) the renderer transformation matrix to the
673
645
  * identity one, and then apply the given transformation matrix.
674
646
  * @name setTransform
675
- * @memberof CanvasRenderer.prototype
676
- * @function
647
+ * @memberof CanvasRenderer
677
648
  * @param {Matrix2d} mat2d Matrix to transform by
678
649
  */
679
650
  setTransform(mat2d) {
@@ -684,8 +655,7 @@ class CanvasRenderer extends Renderer {
684
655
  /**
685
656
  * Multiply given matrix into the renderer tranformation matrix
686
657
  * @name transform
687
- * @memberof CanvasRenderer.prototype
688
- * @function
658
+ * @memberof CanvasRenderer
689
659
  * @param {Matrix2d} mat2d Matrix to transform by
690
660
  */
691
661
  transform(mat2d) {
@@ -708,8 +678,7 @@ class CanvasRenderer extends Renderer {
708
678
  /**
709
679
  * Translates the context to the given position
710
680
  * @name translate
711
- * @memberof CanvasRenderer.prototype
712
- * @function
681
+ * @memberof CanvasRenderer
713
682
  * @param {number} x
714
683
  * @param {number} y
715
684
  */
@@ -728,8 +697,7 @@ class CanvasRenderer extends Renderer {
728
697
  * and restore it (with the restore() method) any time in the future.
729
698
  * (<u>this is an experimental feature !</u>)
730
699
  * @name clipRect
731
- * @memberof CanvasRenderer.prototype
732
- * @function
700
+ * @memberof CanvasRenderer
733
701
  * @param {number} x
734
702
  * @param {number} y
735
703
  * @param {number} width
@@ -761,21 +729,27 @@ class CanvasRenderer extends Renderer {
761
729
  * So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.
762
730
  * Mask are not preserved through renderer context save and restore.
763
731
  * @name setMask
764
- * @memberof CanvasRenderer.prototype
765
- * @function
732
+ * @memberof CanvasRenderer
766
733
  * @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] the shape defining the mask to be applied
734
+ * @param {boolean} [invert=false] either the given shape should define what is visible (default) or the opposite
767
735
  */
768
- setMask(mask) {
736
+ setMask(mask, invert = false) {
769
737
  var context = this.getContext();
770
- var _x = mask.pos.x, _y = mask.pos.y;
771
738
 
772
- context.save();
773
-
774
- context.beginPath();
739
+ if (this.maskLevel === 0) {
740
+ // only save context on the first mask
741
+ context.save();
742
+ context.beginPath();
743
+ }
775
744
 
776
745
  // https://github.com/melonjs/melonJS/issues/648
777
- if (mask instanceof Ellipse) {
778
- var hw = mask.radiusV.x,
746
+ else if (mask instanceof RoundRect) {
747
+ context.roundRect(mask.top, mask.left, mask.width, mask.height, mask.radius);
748
+ } else if (mask instanceof Rect || mask instanceof Bounds) {
749
+ context.rect(mask.top, mask.left, mask.width, mask.height);
750
+ } else if (mask instanceof Ellipse) {
751
+ const _x = mask.pos.x, _y = mask.pos.y,
752
+ hw = mask.radiusV.x,
779
753
  hh = mask.radiusV.y,
780
754
  lx = _x - hw,
781
755
  rx = _x + hw,
@@ -794,31 +768,40 @@ class CanvasRenderer extends Renderer {
794
768
  context.bezierCurveTo(rx, ymax, xmax, by, _x, by);
795
769
  context.bezierCurveTo(xmin, by, lx, ymax, lx, _y);
796
770
  context.bezierCurveTo(lx, ymin, xmin, ty, _x, ty);
797
- } else if (mask instanceof RoundRect) {
798
- context.roundRect(_x, _y, mask.width, mask.height, mask.radius);
799
771
  } else {
800
- context.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);
772
+ const _x = mask.pos.x, _y = mask.pos.y;
801
773
  var point;
774
+
775
+ context.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);
802
776
  for (var i = 1; i < mask.points.length; i++) {
803
777
  point = mask.points[i];
804
778
  context.lineTo(_x + point.x, _y + point.y);
805
779
  }
806
780
  }
807
781
 
808
- context.clip();
782
+ this.maskLevel++;
783
+
784
+ if (invert === true) {
785
+ context.closePath();
786
+ context.globalCompositeOperation = "destination-atop";
787
+ context.fill();
788
+ } else {
789
+ context.clip();
790
+ }
809
791
  }
810
792
 
811
793
  /**
812
794
  * disable (remove) the rendering mask set through setMask.
813
795
  * @name clearMask
814
796
  * @see CanvasRenderer#setMask
815
- * @memberof CanvasRenderer.prototype
816
- * @function
797
+ * @memberof CanvasRenderer
817
798
  */
818
799
  clearMask() {
819
- this.getContext().restore();
800
+ if (this.maskLevel > 0) {
801
+ this.maskLevel = 0;
802
+ this.getContext().restore();
803
+ }
820
804
  }
821
-
822
805
  };
823
806
 
824
807
  export default CanvasRenderer;