Skip to content

Commit 6856b3e

Browse files
committed
feat: support afterClearRect hooks
1 parent c95b23f commit 6856b3e

4 files changed

Lines changed: 26 additions & 1 deletion

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"changes": [
3+
{
4+
"packageName": "@visactor/vrender-core",
5+
"comment": "feat: support afterClearRect hooks",
6+
"type": "none"
7+
}
8+
],
9+
"packageName": "@visactor/vrender-core"
10+
}

packages/vrender-core/src/core/stage.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export class Stage extends Group implements IStage {
8989
beforeRender: ISyncHook<[IStage]>;
9090
afterRender: ISyncHook<[IStage]>;
9191
afterClearScreen: ISyncHook<[IRenderServiceDrawParams]>;
92+
afterClearRect: ISyncHook<[IRenderServiceDrawParams]>;
9293
};
9394

9495
set viewBox(b: IBoundsLike) {
@@ -190,6 +191,7 @@ export class Stage extends Group implements IStage {
190191
protected _beforeRender?: (stage: IStage) => void;
191192
protected _afterRender?: (stage: IStage) => void;
192193
protected _afterClearScreen?: (drawParams: any) => void;
194+
protected _afterClearRect?: (drawParams: any) => void;
193195
// 0: 正常渲染, > 0: 跳过隐藏canvas的渲染, < 0: 禁止渲染
194196
protected _skipRender?: number;
195197
protected _afterNextRenderCbs?: ((stage: IStage) => void)[];
@@ -236,7 +238,8 @@ export class Stage extends Group implements IStage {
236238
this.hooks = {
237239
beforeRender: new SyncHook(['stage']),
238240
afterRender: new SyncHook(['stage']),
239-
afterClearScreen: new SyncHook(['stage'])
241+
afterClearScreen: new SyncHook(['stage']),
242+
afterClearRect: new SyncHook(['stage'])
240243
};
241244
this.global = application.global;
242245
if (!this.global.env && isBrowserEnv()) {
@@ -306,9 +309,11 @@ export class Stage extends Group implements IStage {
306309
this.hooks.beforeRender.tap('constructor', this.beforeRender);
307310
this.hooks.afterRender.tap('constructor', this.afterRender);
308311
this.hooks.afterClearScreen.tap('constructor', this.afterClearScreen);
312+
this.hooks.afterClearRect.tap('constructor', this.afterClearRect);
309313
this._beforeRender = params.beforeRender;
310314
this._afterRender = params.afterRender;
311315
this._afterClearScreen = params.afterClearScreen;
316+
this._afterClearRect = params.afterClearRect;
312317
this.supportInteractiveLayer = params.interactiveLayer !== false;
313318
if (!params.optimize) {
314319
params.optimize = {
@@ -499,6 +504,9 @@ export class Stage extends Group implements IStage {
499504
protected afterClearScreen = (drawParams: any) => {
500505
this._afterClearScreen && this._afterClearScreen(drawParams);
501506
};
507+
protected afterClearRect = (drawParams: any) => {
508+
this._afterClearRect && this._afterClearRect(drawParams);
509+
};
502510

503511
protected afterRender = (stage: IStage) => {
504512
this.renderCount++;

packages/vrender-core/src/interface/stage.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ export interface IStageParams {
6565
afterRender: (stage: IStage) => void;
6666
// 清屏之后的钩子函数
6767
afterClearScreen: (drawParams: any) => void;
68+
// 清除矩形区域之后的钩子函数
69+
afterClearRect: (drawParams: any) => void;
70+
6871
renderStyle?: string;
6972
ticker?: ITicker;
7073
pluginList?: string[];
@@ -161,6 +164,7 @@ export interface IStage extends INode {
161164
beforeRender: ISyncHook<[IStage]>;
162165
afterRender: ISyncHook<[IStage]>;
163166
afterClearScreen: ISyncHook<[IRenderServiceDrawParams]>;
167+
afterClearRect: ISyncHook<[IRenderServiceDrawParams]>;
164168
};
165169

166170
option3d?: IOption3D;

packages/vrender-core/src/render/contributions/render/draw-contribution.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,9 @@ export class DefaultDrawContribution implements IDrawContribution {
471471
const height = viewBox.height();
472472
if (clear) {
473473
context.clearRect(x, y, width, height);
474+
if (renderService.drawParams?.stage) {
475+
renderService.drawParams.stage.hooks.afterClearRect.call(renderService.drawParams);
476+
}
474477
const stage = renderService.drawParams?.stage;
475478
stage && (context.globalAlpha = (stage as any).attribute.opacity ?? 1);
476479
if (stage && (stage as any).backgroundImg && (stage as any).resources) {

0 commit comments

Comments
 (0)