melonjs 10.9.0 → 10.10.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.
@@ -1,6 +1,7 @@
1
1
  import { renderer } from "./../video/video.js";
2
2
  import * as game from "./../game.js";
3
3
  import Camera2d from "./../camera/camera2d.js";
4
+ import Color from "./../math/color.js";
4
5
 
5
6
  // a default camera instance to use across all stages
6
7
  var default_camera;
@@ -37,6 +38,40 @@ class Stage {
37
38
  */
38
39
  this.cameras = new Map();
39
40
 
41
+ /**
42
+ * The list of active lights in this stage.
43
+ * (Note: Canvas Renderering mode will only properly support one light per stage)
44
+ * @public
45
+ * @type {Map<Light2d>}
46
+ * @name lights
47
+ * @memberof Stage
48
+ * @see Light2d
49
+ * @see Stage.ambientLight
50
+ * @example
51
+ * // create a white spot light
52
+ * var whiteLight = new me.Light2d(0, 0, 140, "#fff", 0.7);
53
+ * // and add the light to this current stage
54
+ * this.lights.set("whiteLight", whiteLight);
55
+ * // set a dark ambient light
56
+ * this.ambientLight.parseCSS("#1117");
57
+ * // make the light follow the mouse
58
+ * me.input.registerPointerEvent("pointermove", me.game.viewport, (event) => {
59
+ * whiteLight.centerOn(event.gameX, event.gameY);
60
+ * });
61
+ */
62
+ this.lights = new Map();
63
+
64
+ /**
65
+ * an ambient light that will be added to the stage rendering
66
+ * @public
67
+ * @type {Color}
68
+ * @name ambientLight
69
+ * @memberof Stage
70
+ * @default "#000000"
71
+ * @see Light2d
72
+ */
73
+ this.ambientLight = new Color(0, 0, 0, 0);
74
+
40
75
  /**
41
76
  * The given constructor options
42
77
  * @public
@@ -92,7 +127,14 @@ class Stage {
92
127
  // update the camera/viewport
93
128
  // iterate through all cameras
94
129
  this.cameras.forEach(function(camera) {
95
- if (camera.update(dt)) {
130
+ if (camera.update(dt) === true) {
131
+ isDirty = true;
132
+ };
133
+ });
134
+
135
+ // update all lights
136
+ this.lights.forEach((light) => {
137
+ if (light.update(dt) === true) {
96
138
  isDirty = true;
97
139
  };
98
140
  });
@@ -110,9 +152,32 @@ class Stage {
110
152
  */
111
153
  draw(renderer) {
112
154
  // iterate through all cameras
113
- this.cameras.forEach(function(camera) {
155
+ this.cameras.forEach((camera) => {
114
156
  // render the root container
115
157
  camera.draw(renderer, game.world);
158
+
159
+ // render the ambient light
160
+ if (this.ambientLight.alpha !== 0) {
161
+ renderer.save();
162
+ // iterate through all lights
163
+ this.lights.forEach((light) => {
164
+ // cut out all lights visible areas
165
+ renderer.setMask(light.getVisibleArea(), true);
166
+ });
167
+ // fill the screen with the ambient color
168
+ renderer.setColor(this.ambientLight);
169
+ renderer.fillRect(0, 0, camera.width, camera.height);
170
+ // clear all masks
171
+ renderer.clearMask();
172
+ renderer.restore();
173
+ }
174
+
175
+ // render all lights
176
+ this.lights.forEach((light) => {
177
+ light.preDraw(renderer, game.world);
178
+ light.draw(renderer, game.world);
179
+ light.postDraw(renderer, game.world);
180
+ });
116
181
  });
117
182
  }
118
183
 
@@ -123,6 +188,11 @@ class Stage {
123
188
  destroy() {
124
189
  // clear all cameras
125
190
  this.cameras.clear();
191
+ // clear all lights
192
+ this.lights.forEach((light) => {
193
+ light.destroy();
194
+ });
195
+ this.lights.clear();
126
196
  // notify the object
127
197
  this.onDestroyEvent.apply(this, arguments);
128
198
  }
package/src/text/text.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import Color from "./../math/color.js";
2
2
  import WebGLRenderer from "./../video/webgl/webgl_renderer.js";
3
- import { renderer as globalRenderer, createCanvas } from "./../video/video.js";
3
+ import { renderer as globalRenderer } from "./../video/video.js";
4
4
  import { trimRight } from "./../utils/string.js";
5
5
  import pool from "./../system/pooling.js";
6
6
  import Renderable from "./../renderable/renderable.js";
@@ -23,7 +23,7 @@ var toPX = [12, 24, 0.75, 1];
23
23
  // return a valid 2d context for Text rendering/styling
24
24
  var getContext2d = function (renderer, text) {
25
25
  if (text.offScreenCanvas === true) {
26
- return text.context;
26
+ return text.canvasTexture.context;
27
27
  } else {
28
28
  return renderer.getFontContext();
29
29
  }
@@ -190,8 +190,7 @@ class Text extends Renderable {
190
190
 
191
191
  if (settings.offScreenCanvas === true) {
192
192
  this.offScreenCanvas = true;
193
- this.canvas = createCanvas(2, 2, true);
194
- this.context = this.canvas.getContext("2d");
193
+ this.canvasTexture = pool.pull("CanvasTexture", 2, 2, true);
195
194
  }
196
195
 
197
196
  // instance to text metrics functions
@@ -206,10 +205,9 @@ class Text extends Renderable {
206
205
  // free the canvas and potential corresponding texture when deactivated
207
206
  if (this.offScreenCanvas === true) {
208
207
  globalRenderer.currentCompositor.deleteTexture2D(globalRenderer.currentCompositor.getTexture2D(this.glTextureUnit));
209
- globalRenderer.cache.delete(this.canvas);
210
- this.canvas.width = this.canvas.height = 0;
211
- this.context = undefined;
212
- this.canvas = undefined;
208
+ globalRenderer.cache.delete(this.canvasTexture.canvas);
209
+ pool.push(this.canvasTexture);
210
+ this.canvasTexture = undefined;
213
211
  this.glTextureUnit = undefined;
214
212
  }
215
213
  }
@@ -307,7 +305,7 @@ class Text extends Renderable {
307
305
 
308
306
  if (globalRenderer instanceof WebGLRenderer) {
309
307
  // invalidate the previous corresponding texture so that it can reuploaded once changed
310
- this.glTextureUnit = globalRenderer.cache.getUnit(globalRenderer.cache.get(this.canvas));
308
+ this.glTextureUnit = globalRenderer.cache.getUnit(globalRenderer.cache.get(this.canvasTexture.canvas));
311
309
  globalRenderer.currentCompositor.unbindTexture2D(null, this.glTextureUnit);
312
310
 
313
311
  if (globalRenderer.WebGLVersion === 1) {
@@ -318,14 +316,12 @@ class Text extends Renderable {
318
316
  }
319
317
 
320
318
  // resize the cache canvas if necessary
321
- if (this.canvas.width < width || this.canvas.height < height) {
322
- this.canvas.width = width;
323
- this.canvas.height = height;
324
- // resizing the canvas will automatically clear its content
325
- } else {
326
- this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
319
+ if (this.canvasTexture.width < width || this.canvasTexture.height < height) {
320
+ this.canvasTexture.resize(width, height);
327
321
  }
328
- this._drawFont(this.context, this._text, this.pos.x - this.metrics.x, this.pos.y - this.metrics.y, false);
322
+
323
+ this.canvasTexture.clear();
324
+ this._drawFont(this.canvasTexture.context, this._text, this.pos.x - this.metrics.x, this.pos.y - this.metrics.y, false);
329
325
  }
330
326
 
331
327
  this.isDirty = true;
@@ -389,7 +385,7 @@ class Text extends Renderable {
389
385
 
390
386
  // draw the text
391
387
  if (this.offScreenCanvas === true) {
392
- renderer.drawImage(this.canvas, x, y);
388
+ renderer.drawImage(this.canvasTexture.canvas, x, y);
393
389
  } else {
394
390
  renderer.drawFont(this._drawFont(renderer.getFontContext(), this._text, x, y, stroke));
395
391
  }
@@ -1,8 +1,9 @@
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 Bounds from "./../../physics/bounds.js";
6
7
  import { createCanvas } from "./../video.js";
7
8
 
8
9
 
@@ -72,7 +73,7 @@ class CanvasRenderer extends Renderer {
72
73
  /**
73
74
  * Reset context state
74
75
  * @name reset
75
- * @memberof CanvasRenderer.prototype
76
+ * @memberof CanvasRenderer
76
77
  * @function
77
78
  */
78
79
  reset() {
@@ -83,7 +84,7 @@ class CanvasRenderer extends Renderer {
83
84
  /**
84
85
  * Reset the canvas transform to identity
85
86
  * @name resetTransform
86
- * @memberof CanvasRenderer.prototype
87
+ * @memberof CanvasRenderer
87
88
  * @function
88
89
  */
89
90
  resetTransform() {
@@ -103,7 +104,7 @@ class CanvasRenderer extends Renderer {
103
104
  * <img src="images/screen-blendmode.png" width="510"/> <br>
104
105
  * @name setBlendMode
105
106
  * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
106
- * @memberof CanvasRenderer.prototype
107
+ * @memberof CanvasRenderer
107
108
  * @function
108
109
  * @param {string} [mode="normal"] blend mode : "normal", "multiply", "lighter, "additive", "screen"
109
110
  * @param {CanvasRenderingContext2D} [context]
@@ -141,7 +142,7 @@ class CanvasRenderer extends Renderer {
141
142
  /**
142
143
  * prepare the framebuffer for drawing a new frame
143
144
  * @name clear
144
- * @memberof CanvasRenderer.prototype
145
+ * @memberof CanvasRenderer
145
146
  * @function
146
147
  */
147
148
  clear() {
@@ -153,7 +154,7 @@ class CanvasRenderer extends Renderer {
153
154
  /**
154
155
  * render the main framebuffer on screen
155
156
  * @name flush
156
- * @memberof CanvasRenderer.prototype
157
+ * @memberof CanvasRenderer
157
158
  * @function
158
159
  */
159
160
  flush() {
@@ -165,7 +166,7 @@ class CanvasRenderer extends Renderer {
165
166
  /**
166
167
  * Clears the main framebuffer with the given color
167
168
  * @name clearColor
168
- * @memberof CanvasRenderer.prototype
169
+ * @memberof CanvasRenderer
169
170
  * @function
170
171
  * @param {Color|string} [color="#000000"] CSS color.
171
172
  * @param {boolean} [opaque=false] Allow transparency [default] or clear the surface completely [true]
@@ -182,7 +183,7 @@ class CanvasRenderer extends Renderer {
182
183
  /**
183
184
  * Erase the pixels in the given rectangular area by setting them to transparent black (rgba(0,0,0,0)).
184
185
  * @name clearRect
185
- * @memberof CanvasRenderer.prototype
186
+ * @memberof CanvasRenderer
186
187
  * @function
187
188
  * @param {number} x x axis of the coordinate for the rectangle starting point.
188
189
  * @param {number} y y axis of the coordinate for the rectangle starting point.
@@ -196,7 +197,7 @@ class CanvasRenderer extends Renderer {
196
197
  /**
197
198
  * Create a pattern with the specified repetition
198
199
  * @name createPattern
199
- * @memberof CanvasRenderer.prototype
200
+ * @memberof CanvasRenderer
200
201
  * @function
201
202
  * @param {Image} image Source image
202
203
  * @param {string} repeat Define how the pattern should be repeated
@@ -215,7 +216,7 @@ class CanvasRenderer extends Renderer {
215
216
  /**
216
217
  * Draw an image onto the main using the canvas api
217
218
  * @name drawImage
218
- * @memberof CanvasRenderer.prototype
219
+ * @memberof CanvasRenderer
219
220
  * @function
220
221
  * @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
222
  * @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.
@@ -279,7 +280,7 @@ class CanvasRenderer extends Renderer {
279
280
  /**
280
281
  * Draw a pattern within the given rectangle.
281
282
  * @name drawPattern
282
- * @memberof CanvasRenderer.prototype
283
+ * @memberof CanvasRenderer
283
284
  * @function
284
285
  * @param {CanvasPattern} pattern Pattern object
285
286
  * @param {number} x
@@ -303,7 +304,7 @@ class CanvasRenderer extends Renderer {
303
304
  /**
304
305
  * Stroke an arc at the specified coordinates with given radius, start and end points
305
306
  * @name strokeArc
306
- * @memberof CanvasRenderer.prototype
307
+ * @memberof CanvasRenderer
307
308
  * @function
308
309
  * @param {number} x arc center point x-axis
309
310
  * @param {number} y arc center point y-axis
@@ -330,7 +331,7 @@ class CanvasRenderer extends Renderer {
330
331
  /**
331
332
  * Fill an arc at the specified coordinates with given radius, start and end points
332
333
  * @name fillArc
333
- * @memberof CanvasRenderer.prototype
334
+ * @memberof CanvasRenderer
334
335
  * @function
335
336
  * @param {number} x arc center point x-axis
336
337
  * @param {number} y arc center point y-axis
@@ -346,7 +347,7 @@ class CanvasRenderer extends Renderer {
346
347
  /**
347
348
  * Stroke an ellipse at the specified coordinates with given radius
348
349
  * @name strokeEllipse
349
- * @memberof CanvasRenderer.prototype
350
+ * @memberof CanvasRenderer
350
351
  * @function
351
352
  * @param {number} x ellipse center point x-axis
352
353
  * @param {number} y ellipse center point y-axis
@@ -388,7 +389,7 @@ class CanvasRenderer extends Renderer {
388
389
  /**
389
390
  * Fill an ellipse at the specified coordinates with given radius
390
391
  * @name fillEllipse
391
- * @memberof CanvasRenderer.prototype
392
+ * @memberof CanvasRenderer
392
393
  * @function
393
394
  * @param {number} x ellipse center point x-axis
394
395
  * @param {number} y ellipse center point y-axis
@@ -402,7 +403,7 @@ class CanvasRenderer extends Renderer {
402
403
  /**
403
404
  * Stroke a line of the given two points
404
405
  * @name strokeLine
405
- * @memberof CanvasRenderer.prototype
406
+ * @memberof CanvasRenderer
406
407
  * @function
407
408
  * @param {number} startX the start x coordinate
408
409
  * @param {number} startY the start y coordinate
@@ -424,7 +425,7 @@ class CanvasRenderer extends Renderer {
424
425
  /**
425
426
  * Fill a line of the given two points
426
427
  * @name fillLine
427
- * @memberof CanvasRenderer.prototype
428
+ * @memberof CanvasRenderer
428
429
  * @function
429
430
  * @param {number} startX the start x coordinate
430
431
  * @param {number} startY the start y coordinate
@@ -438,7 +439,7 @@ class CanvasRenderer extends Renderer {
438
439
  /**
439
440
  * Stroke the given me.Polygon on the screen
440
441
  * @name strokePolygon
441
- * @memberof CanvasRenderer.prototype
442
+ * @memberof CanvasRenderer
442
443
  * @function
443
444
  * @param {Polygon} poly the shape to draw
444
445
  * @param {boolean} [fill=false] also fill the shape with the current color if true
@@ -467,7 +468,7 @@ class CanvasRenderer extends Renderer {
467
468
  /**
468
469
  * Fill the given me.Polygon on the screen
469
470
  * @name fillPolygon
470
- * @memberof CanvasRenderer.prototype
471
+ * @memberof CanvasRenderer
471
472
  * @function
472
473
  * @param {Polygon} poly the shape to draw
473
474
  */
@@ -478,7 +479,7 @@ class CanvasRenderer extends Renderer {
478
479
  /**
479
480
  * Stroke a rectangle at the specified coordinates
480
481
  * @name strokeRect
481
- * @memberof CanvasRenderer.prototype
482
+ * @memberof CanvasRenderer
482
483
  * @function
483
484
  * @param {number} x
484
485
  * @param {number} y
@@ -499,7 +500,7 @@ class CanvasRenderer extends Renderer {
499
500
  /**
500
501
  * Draw a filled rectangle at the specified coordinates
501
502
  * @name fillRect
502
- * @memberof CanvasRenderer.prototype
503
+ * @memberof CanvasRenderer
503
504
  * @function
504
505
  * @param {number} x
505
506
  * @param {number} y
@@ -513,7 +514,7 @@ class CanvasRenderer extends Renderer {
513
514
  /**
514
515
  * Stroke a rounded rectangle at the specified coordinates
515
516
  * @name strokeRoundRect
516
- * @memberof CanvasRenderer.prototype
517
+ * @memberof CanvasRenderer
517
518
  * @function
518
519
  * @param {number} x
519
520
  * @param {number} y
@@ -537,7 +538,7 @@ class CanvasRenderer extends Renderer {
537
538
  /**
538
539
  * Draw a rounded filled rectangle at the specified coordinates
539
540
  * @name fillRoundRect
540
- * @memberof CanvasRenderer.prototype
541
+ * @memberof CanvasRenderer
541
542
  * @function
542
543
  * @param {number} x
543
544
  * @param {number} y
@@ -553,7 +554,7 @@ class CanvasRenderer extends Renderer {
553
554
  /**
554
555
  * return a reference to the system 2d Context
555
556
  * @name getContext
556
- * @memberof CanvasRenderer.prototype
557
+ * @memberof CanvasRenderer
557
558
  * @function
558
559
  * @returns {CanvasRenderingContext2D}
559
560
  */
@@ -573,7 +574,7 @@ class CanvasRenderer extends Renderer {
573
574
  /**
574
575
  * save the canvas context
575
576
  * @name save
576
- * @memberof CanvasRenderer.prototype
577
+ * @memberof CanvasRenderer
577
578
  * @function
578
579
  */
579
580
  save() {
@@ -583,7 +584,7 @@ class CanvasRenderer extends Renderer {
583
584
  /**
584
585
  * restores the canvas context
585
586
  * @name restore
586
- * @memberof CanvasRenderer.prototype
587
+ * @memberof CanvasRenderer
587
588
  * @function
588
589
  */
589
590
  restore() {
@@ -598,7 +599,7 @@ class CanvasRenderer extends Renderer {
598
599
  /**
599
600
  * rotates the canvas context
600
601
  * @name rotate
601
- * @memberof CanvasRenderer.prototype
602
+ * @memberof CanvasRenderer
602
603
  * @function
603
604
  * @param {number} angle in radians
604
605
  */
@@ -609,7 +610,7 @@ class CanvasRenderer extends Renderer {
609
610
  /**
610
611
  * scales the canvas context
611
612
  * @name scale
612
- * @memberof CanvasRenderer.prototype
613
+ * @memberof CanvasRenderer
613
614
  * @function
614
615
  * @param {number} x
615
616
  * @param {number} y
@@ -622,7 +623,7 @@ class CanvasRenderer extends Renderer {
622
623
  * Set the current fill & stroke style color.
623
624
  * By default, or upon reset, the value is set to #000000.
624
625
  * @name setColor
625
- * @memberof CanvasRenderer.prototype
626
+ * @memberof CanvasRenderer
626
627
  * @function
627
628
  * @param {Color|string} color css color value
628
629
  */
@@ -638,7 +639,7 @@ class CanvasRenderer extends Renderer {
638
639
  /**
639
640
  * Set the global alpha
640
641
  * @name setGlobalAlpha
641
- * @memberof CanvasRenderer.prototype
642
+ * @memberof CanvasRenderer
642
643
  * @function
643
644
  * @param {number} alpha 0.0 to 1.0 values accepted.
644
645
  */
@@ -649,7 +650,7 @@ class CanvasRenderer extends Renderer {
649
650
  /**
650
651
  * Return the global alpha
651
652
  * @name getGlobalAlpha
652
- * @memberof CanvasRenderer.prototype
653
+ * @memberof CanvasRenderer
653
654
  * @function
654
655
  * @returns {number} global alpha value
655
656
  */
@@ -660,7 +661,7 @@ class CanvasRenderer extends Renderer {
660
661
  /**
661
662
  * Set the line width on the context
662
663
  * @name setLineWidth
663
- * @memberof CanvasRenderer.prototype
664
+ * @memberof CanvasRenderer
664
665
  * @function
665
666
  * @param {number} width Line width
666
667
  */
@@ -672,7 +673,7 @@ class CanvasRenderer extends Renderer {
672
673
  * Reset (overrides) the renderer transformation matrix to the
673
674
  * identity one, and then apply the given transformation matrix.
674
675
  * @name setTransform
675
- * @memberof CanvasRenderer.prototype
676
+ * @memberof CanvasRenderer
676
677
  * @function
677
678
  * @param {Matrix2d} mat2d Matrix to transform by
678
679
  */
@@ -684,7 +685,7 @@ class CanvasRenderer extends Renderer {
684
685
  /**
685
686
  * Multiply given matrix into the renderer tranformation matrix
686
687
  * @name transform
687
- * @memberof CanvasRenderer.prototype
688
+ * @memberof CanvasRenderer
688
689
  * @function
689
690
  * @param {Matrix2d} mat2d Matrix to transform by
690
691
  */
@@ -708,7 +709,7 @@ class CanvasRenderer extends Renderer {
708
709
  /**
709
710
  * Translates the context to the given position
710
711
  * @name translate
711
- * @memberof CanvasRenderer.prototype
712
+ * @memberof CanvasRenderer
712
713
  * @function
713
714
  * @param {number} x
714
715
  * @param {number} y
@@ -728,7 +729,7 @@ class CanvasRenderer extends Renderer {
728
729
  * and restore it (with the restore() method) any time in the future.
729
730
  * (<u>this is an experimental feature !</u>)
730
731
  * @name clipRect
731
- * @memberof CanvasRenderer.prototype
732
+ * @memberof CanvasRenderer
732
733
  * @function
733
734
  * @param {number} x
734
735
  * @param {number} y
@@ -761,21 +762,28 @@ class CanvasRenderer extends Renderer {
761
762
  * So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.
762
763
  * Mask are not preserved through renderer context save and restore.
763
764
  * @name setMask
764
- * @memberof CanvasRenderer.prototype
765
+ * @memberof CanvasRenderer
765
766
  * @function
766
767
  * @param {Rect|RoundRect|Polygon|Line|Ellipse} [mask] the shape defining the mask to be applied
768
+ * @param {boolean} [invert=false] either the given shape should define what is visible (default) or the opposite
767
769
  */
768
- setMask(mask) {
770
+ setMask(mask, invert = false) {
769
771
  var context = this.getContext();
770
- var _x = mask.pos.x, _y = mask.pos.y;
771
772
 
772
- context.save();
773
-
774
- context.beginPath();
773
+ if (this.maskLevel === 0) {
774
+ // only save context on the first mask
775
+ context.save();
776
+ context.beginPath();
777
+ }
775
778
 
776
779
  // https://github.com/melonjs/melonJS/issues/648
777
- if (mask instanceof Ellipse) {
778
- var hw = mask.radiusV.x,
780
+ else if (mask instanceof RoundRect) {
781
+ context.roundRect(mask.top, mask.left, mask.width, mask.height, mask.radius);
782
+ } else if (mask instanceof Rect || mask instanceof Bounds) {
783
+ context.rect(mask.top, mask.left, mask.width, mask.height);
784
+ } else if (mask instanceof Ellipse) {
785
+ const _x = mask.pos.x, _y = mask.pos.y,
786
+ hw = mask.radiusV.x,
779
787
  hh = mask.radiusV.y,
780
788
  lx = _x - hw,
781
789
  rx = _x + hw,
@@ -794,31 +802,41 @@ class CanvasRenderer extends Renderer {
794
802
  context.bezierCurveTo(rx, ymax, xmax, by, _x, by);
795
803
  context.bezierCurveTo(xmin, by, lx, ymax, lx, _y);
796
804
  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
805
  } else {
800
- context.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);
806
+ const _x = mask.pos.x, _y = mask.pos.y;
801
807
  var point;
808
+
809
+ context.moveTo(_x + mask.points[0].x, _y + mask.points[0].y);
802
810
  for (var i = 1; i < mask.points.length; i++) {
803
811
  point = mask.points[i];
804
812
  context.lineTo(_x + point.x, _y + point.y);
805
813
  }
806
814
  }
807
815
 
808
- context.clip();
816
+ this.maskLevel++;
817
+
818
+ if (invert === true) {
819
+ context.closePath();
820
+ context.globalCompositeOperation = "destination-atop";
821
+ context.fill();
822
+ } else {
823
+ context.clip();
824
+ }
809
825
  }
810
826
 
811
827
  /**
812
828
  * disable (remove) the rendering mask set through setMask.
813
829
  * @name clearMask
814
830
  * @see CanvasRenderer#setMask
815
- * @memberof CanvasRenderer.prototype
831
+ * @memberof CanvasRenderer
816
832
  * @function
817
833
  */
818
834
  clearMask() {
819
- this.getContext().restore();
835
+ if (this.maskLevel > 0) {
836
+ this.maskLevel = 0;
837
+ this.getContext().restore();
838
+ }
820
839
  }
821
-
822
840
  };
823
841
 
824
842
  export default CanvasRenderer;