Skip to content

Commit 37384f5

Browse files
authored
feat:删除callId关联逻辑、caf修改成offcanvas实现 (#323)
1 parent 1ff6d10 commit 37384f5

File tree

1 file changed

+11
-42
lines changed

1 file changed

+11
-42
lines changed

packages/f-my/src/adapter.ts

+11-42
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,9 @@ interface IMiniProgramCanvasContext_v1 {
104104
}
105105

106106
export function createCanvasAdapter(canvasContext: any) {
107+
const element = new CanvasElement(canvasContext);
107108
const context = new SimulatedCanvasContext(canvasContext);
108-
const addCallIdAction = context.addCallIdActions.bind(context);
109-
110-
const element = new CanvasElement(canvasContext, addCallIdAction);
109+
111110
context.canvas = element;
112111

113112
return {
@@ -136,13 +135,12 @@ export function createCanvasAdapter(canvasContext: any) {
136135
// })
137136
}
138137
}
139-
function bindDrawRunnable(fn: any, canvasContext: IMiniProgramCanvasContext_v1, addCallIdAction: () => void) {
138+
function bindDrawRunnable(fn: any, canvasContext: IMiniProgramCanvasContext_v1) {
140139
return function (this: any, ...args: unknown[]) {
141140
try {
142141
fn.apply(this, args);
143142
} finally {
144143
canvasContext.draw(true);
145-
addCallIdAction();
146144
}
147145
}
148146
}
@@ -161,7 +159,7 @@ class CanvasImageElement {
161159

162160
return target;
163161
}
164-
constructor(public url: string, private _context: IMiniProgramCanvasContext_v1, private _addCallIdAction: () => void) {
162+
constructor(public url: string, private _context: IMiniProgramCanvasContext_v1) {
165163
preloadCanvasImage(url, (img) => {
166164
this._rawImgObj = img || {};
167165
this._complete(this._rawImgObj);
@@ -173,12 +171,12 @@ class CanvasImageElement {
173171
}
174172
if (img.url == this.url && img.id !== -1) {
175173
if (this._onload) {
176-
bindDrawRunnable(this._onload, this._context, this._addCallIdAction)();
174+
bindDrawRunnable(this._onload, this._context)();
177175
this._invoked = true;
178176
}
179177
} else {
180178
if (this._onerror) {
181-
bindDrawRunnable(this._onerror, this._context, this._addCallIdAction)();
179+
bindDrawRunnable(this._onerror, this._context)();
182180
this._invoked = true;
183181
}
184182
}
@@ -196,40 +194,32 @@ class CanvasImageElement {
196194
class CanvasElement {
197195
constructor(
198196
private canvasContext: IMiniProgramCanvasContext_v1,
199-
private _addCallIdAction: () => void,
200197
private offscreenCanvas = (my as any).createOffscreenCanvas
201198
? (my as any).createOffscreenCanvas()
202199
: { requestAnimationFrame: () => {} }
203200
) {
204201

205202
}
206203
createImage(url: string) {
207-
return new CanvasImageElement(url, this.canvasContext, this._addCallIdAction);
204+
return new CanvasImageElement(url, this.canvasContext);
208205
}
209206
requestAnimationFrame(fn: any) {
210-
const frameFn = bindDrawRunnable(fn, this.canvasContext,this._addCallIdAction);
207+
const frameFn = bindDrawRunnable(fn, this.canvasContext);
211208

212209
return this.offscreenCanvas.requestAnimationFrame(() => {
213210
frameFn(Date.now());
214211
});
215212
}
216213
cancelAnimationFrame(tid: any) {
217-
return clearTimeout(tid);
214+
return this.offscreenCanvas.cancelAnimationFrame(tid);
218215
}
219216
}
220217
class SimulatedCanvasContext {
221218
public canvas: CanvasElement;
222-
private _callIdCache: Record<string, Array<TCanvasGradient | TCanvasPattern>>;
223-
private _enableCacheCallId: boolean;
224219

225220
constructor(
226221
private ctx: IMiniProgramCanvasContext_v1
227222
) {
228-
this._enableCacheCallId = true;
229-
this._callIdCache = {
230-
linearGradient: [],
231-
radialGradient: []
232-
};
233223
}
234224

235225
private _fillStyle: string | TCanvasGradient | null | TCanvasPattern;
@@ -316,36 +306,15 @@ class SimulatedCanvasContext {
316306
return this.ctx.closePath();
317307
}
318308
// 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-
}
332309
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);
338311
}
339312
public createPattern(image: TCanvasImageSource, repeat: TCanvasPatternRepeat): TCanvasPattern {
340313
const target = CanvasImageElement.toImageSource(image);
341314
return this.ctx.createPattern(target, repeat);
342315
}
343316
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);
349318
}
350319
// WontFIX: createPath2D
351320
drawImage(

0 commit comments

Comments
 (0)