@@ -104,10 +104,9 @@ interface IMiniProgramCanvasContext_v1 {
104
104
}
105
105
106
106
export function createCanvasAdapter ( canvasContext : any ) {
107
+ const element = new CanvasElement ( canvasContext ) ;
107
108
const context = new SimulatedCanvasContext ( canvasContext ) ;
108
- const addCallIdAction = context . addCallIdActions . bind ( context ) ;
109
-
110
- const element = new CanvasElement ( canvasContext , addCallIdAction ) ;
109
+
111
110
context . canvas = element ;
112
111
113
112
return {
@@ -136,13 +135,12 @@ export function createCanvasAdapter(canvasContext: any) {
136
135
// })
137
136
}
138
137
}
139
- function bindDrawRunnable ( fn : any , canvasContext : IMiniProgramCanvasContext_v1 , addCallIdAction : ( ) => void ) {
138
+ function bindDrawRunnable ( fn : any , canvasContext : IMiniProgramCanvasContext_v1 ) {
140
139
return function ( this : any , ...args : unknown [ ] ) {
141
140
try {
142
141
fn . apply ( this , args ) ;
143
142
} finally {
144
143
canvasContext . draw ( true ) ;
145
- addCallIdAction ( ) ;
146
144
}
147
145
}
148
146
}
@@ -161,7 +159,7 @@ class CanvasImageElement {
161
159
162
160
return target ;
163
161
}
164
- constructor ( public url : string , private _context : IMiniProgramCanvasContext_v1 , private _addCallIdAction : ( ) => void ) {
162
+ constructor ( public url : string , private _context : IMiniProgramCanvasContext_v1 ) {
165
163
preloadCanvasImage ( url , ( img ) => {
166
164
this . _rawImgObj = img || { } ;
167
165
this . _complete ( this . _rawImgObj ) ;
@@ -173,12 +171,12 @@ class CanvasImageElement {
173
171
}
174
172
if ( img . url == this . url && img . id !== - 1 ) {
175
173
if ( this . _onload ) {
176
- bindDrawRunnable ( this . _onload , this . _context , this . _addCallIdAction ) ( ) ;
174
+ bindDrawRunnable ( this . _onload , this . _context ) ( ) ;
177
175
this . _invoked = true ;
178
176
}
179
177
} else {
180
178
if ( this . _onerror ) {
181
- bindDrawRunnable ( this . _onerror , this . _context , this . _addCallIdAction ) ( ) ;
179
+ bindDrawRunnable ( this . _onerror , this . _context ) ( ) ;
182
180
this . _invoked = true ;
183
181
}
184
182
}
@@ -196,40 +194,32 @@ class CanvasImageElement {
196
194
class CanvasElement {
197
195
constructor (
198
196
private canvasContext : IMiniProgramCanvasContext_v1 ,
199
- private _addCallIdAction : ( ) => void ,
200
197
private offscreenCanvas = ( my as any ) . createOffscreenCanvas
201
198
? ( my as any ) . createOffscreenCanvas ( )
202
199
: { requestAnimationFrame : ( ) => { } }
203
200
) {
204
201
205
202
}
206
203
createImage ( url : string ) {
207
- return new CanvasImageElement ( url , this . canvasContext , this . _addCallIdAction ) ;
204
+ return new CanvasImageElement ( url , this . canvasContext ) ;
208
205
}
209
206
requestAnimationFrame ( fn : any ) {
210
- const frameFn = bindDrawRunnable ( fn , this . canvasContext , this . _addCallIdAction ) ;
207
+ const frameFn = bindDrawRunnable ( fn , this . canvasContext ) ;
211
208
212
209
return this . offscreenCanvas . requestAnimationFrame ( ( ) => {
213
210
frameFn ( Date . now ( ) ) ;
214
211
} ) ;
215
212
}
216
213
cancelAnimationFrame ( tid : any ) {
217
- return clearTimeout ( tid ) ;
214
+ return this . offscreenCanvas . cancelAnimationFrame ( tid ) ;
218
215
}
219
216
}
220
217
class SimulatedCanvasContext {
221
218
public canvas : CanvasElement ;
222
- private _callIdCache : Record < string , Array < TCanvasGradient | TCanvasPattern > > ;
223
- private _enableCacheCallId : boolean ;
224
219
225
220
constructor (
226
221
private ctx : IMiniProgramCanvasContext_v1
227
222
) {
228
- this . _enableCacheCallId = true ;
229
- this . _callIdCache = {
230
- linearGradient : [ ] ,
231
- radialGradient : [ ]
232
- } ;
233
223
}
234
224
235
225
private _fillStyle : string | TCanvasGradient | null | TCanvasPattern ;
@@ -316,36 +306,15 @@ class SimulatedCanvasContext {
316
306
return this . ctx . closePath ( ) ;
317
307
}
318
308
// WontFIX: createImageData
319
- public addCallIdActions ( ) : void {
320
- const { linearGradient, radialGradient } = this . _callIdCache ;
321
- this . _enableCacheCallId = false ;
322
- for ( const item of linearGradient ) {
323
- const gradient = this . ctx . createLinearGradient ( 0 , 0 , 0 , 0 ) ;
324
- Object . assign ( gradient , item ) ;
325
- }
326
- for ( const item of radialGradient ) {
327
- const gradient = this . ctx . createRadialGradient ( 0 , 0 , 0 , 0 , 0 , 0 ) ;
328
- Object . assign ( gradient , item ) ;
329
- }
330
- this . _enableCacheCallId = true ;
331
- }
332
309
public createLinearGradient ( x0 : number , y0 : number , x1 : number , y1 : number ) : TCanvasGradient {
333
- const gradient = this . ctx . createLinearGradient ( x0 , y0 , x1 , y1 ) ;
334
- if ( this . _enableCacheCallId ) {
335
- this . _callIdCache . linearGradient . push ( gradient ) ;
336
- }
337
- return gradient ;
310
+ return this . ctx . createLinearGradient ( x0 , y0 , x1 , y1 ) ;
338
311
}
339
312
public createPattern ( image : TCanvasImageSource , repeat : TCanvasPatternRepeat ) : TCanvasPattern {
340
313
const target = CanvasImageElement . toImageSource ( image ) ;
341
314
return this . ctx . createPattern ( target , repeat ) ;
342
315
}
343
316
public createRadialGradient ( x0 : number , y0 : number , r0 : number , x1 : number , y1 : number , r1 : number ) : TCanvasGradient {
344
- const gradient = this . ctx . createRadialGradient ( x0 , y0 , r0 , x1 , y1 , r1 ) ;
345
- if ( this . _enableCacheCallId ) {
346
- this . _callIdCache . radialGradient . push ( gradient ) ;
347
- }
348
- return gradient ;
317
+ return this . ctx . createRadialGradient ( x0 , y0 , r0 , x1 , y1 , r1 ) ;
349
318
}
350
319
// WontFIX: createPath2D
351
320
drawImage (
0 commit comments