@@ -18,6 +18,8 @@ export type Event<T> = Events.Event<T> & {
18
18
export interface HtmlCanvasApi extends PluginApi {
19
19
/** Returns the underlying canvas element. */
20
20
get element ( ) : HTMLCanvasElement
21
+ /** Update the underlying canvas element. */
22
+ set element ( element : HTMLCanvasElement )
21
23
/** Returns the actual canvas context */
22
24
get context ( ) : CanvasRenderingContext2D
23
25
clientToCanvas ( clientPos : Geom . Point ) : Geom . Point
@@ -29,9 +31,9 @@ export class HtmlCanvas implements Plugin, HtmlCanvasAlternative {
29
31
private _container ?: HTMLElement
30
32
private _offscreenCanvas : HTMLCanvasElement
31
33
private _offscreenContext : CanvasRenderingContext2D
32
- private _mainCanvas : HTMLCanvasElement
33
- private _context : CanvasRenderingContext2D
34
- private _resizeObserver : ResizeObserver
34
+ private _mainCanvas ! : HTMLCanvasElement
35
+ private _context ! : CanvasRenderingContext2D
36
+ private _resizeObserver ! : ResizeObserver
35
37
private _resizeHandler : ( ) => void
36
38
private _prevUpdateHash : string = ''
37
39
private _scaleFactor : number = 1
@@ -41,8 +43,15 @@ export class HtmlCanvas implements Plugin, HtmlCanvasAlternative {
41
43
meta = { name : 'htmlCanvas' }
42
44
43
45
get api ( ) : HtmlCanvasApi {
46
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
47
+ const self = this
44
48
return {
45
- element : this . element ,
49
+ get element ( ) : HTMLCanvasElement {
50
+ return self . _mainCanvas
51
+ } ,
52
+ set element ( newCanvasElement : HTMLCanvasElement ) {
53
+ self . _setCanvas ( newCanvasElement )
54
+ } ,
46
55
context : this . context ,
47
56
clientToCanvas : this . _clientToCanvas . bind ( this ) ,
48
57
canvasToClient : this . _canvasToClient . bind ( this )
@@ -102,20 +111,25 @@ export class HtmlCanvas implements Plugin, HtmlCanvasAlternative {
102
111
}
103
112
104
113
constructor ( options : CanvasOptions ) {
105
- this . _mainCanvas = this . _toCanvasElement ( options . element )
106
114
this . _offscreenCanvas = document . createElement < 'canvas' > ( 'canvas' )
107
115
const offCtx = this . _offscreenCanvas . getContext ( '2d' )
108
116
if ( ! offCtx ) throw Error ( 'Cannot get rendering context of internal canvas' )
109
117
this . _offscreenContext = offCtx
118
+ this . _resizeHandler = ( ) : void => {
119
+ this . _update ( true )
120
+ }
121
+ this . _setCanvas ( options . element )
122
+ window . addEventListener ( 'resize' , this . _resizeHandler )
123
+ }
124
+
125
+ private _setCanvas ( element : HTMLElement ) : void {
126
+ this . _mainCanvas = this . _toCanvasElement ( element )
127
+ this . _prevUpdateHash = ''
110
128
const ctx = this . _mainCanvas . getContext ( '2d' )
111
129
if ( ! ctx ) throw Error ( 'Cannot get rendering context of canvas' )
112
130
this . _context = ctx
113
131
this . _calcSize ( )
114
132
this . _resizeObserver = this . _createResizeObserverFor ( this . _mainCanvas )
115
- this . _resizeHandler = ( ) : void => {
116
- this . _update ( true )
117
- }
118
- window . addEventListener ( 'resize' , this . _resizeHandler )
119
133
}
120
134
121
135
unregister ( ) : void {
@@ -128,6 +142,10 @@ export class HtmlCanvas implements Plugin, HtmlCanvasAlternative {
128
142
return this . _mainCanvas
129
143
}
130
144
145
+ set element ( element : HTMLCanvasElement ) {
146
+ this . _setCanvas ( element )
147
+ }
148
+
131
149
get context ( ) : CanvasRenderingContext2D {
132
150
return this . _offscreenContext
133
151
}
0 commit comments