From 361026bdcf1b17b8d7724f7f3de756df2be47a2e Mon Sep 17 00:00:00 2001 From: Univer <68851825+DR-Univer@users.noreply.github.com> Date: Fri, 17 Jul 2026 11:42:36 +0800 Subject: [PATCH] feat(engine-render): support drawing group shadows (#7252) --- .../src/__tests__/drawing-group.spec.ts | 14 +++++++++++++ packages/engine-render/src/drawing-group.ts | 20 +++++++++++++++++++ packages/engine-render/src/index.ts | 1 + 3 files changed, 35 insertions(+) diff --git a/packages/engine-render/src/__tests__/drawing-group.spec.ts b/packages/engine-render/src/__tests__/drawing-group.spec.ts index 339aabf792..b0ced29113 100644 --- a/packages/engine-render/src/__tests__/drawing-group.spec.ts +++ b/packages/engine-render/src/__tests__/drawing-group.spec.ts @@ -43,6 +43,10 @@ function createContext() { lineDashOffset: 0, lineJoin: 'round', miterLimit: 0, + shadowColor: '', + shadowBlur: 0, + shadowOffsetX: 0, + shadowOffsetY: 0, } as any; } @@ -125,6 +129,12 @@ describe('drawing group', () => { }); const childRenderSpy = vi.spyOn(child, 'render').mockImplementation(() => child); drawingGroup.addObject(child); + drawingGroup.setOuterShadow({ + shadowColor: 'rgba(0, 0, 0, 0.5)', + shadowBlur: 12, + shadowOffsetX: -4, + shadowOffsetY: 4, + }); const ctx = createContext(); drawingGroup.render(ctx, { @@ -133,6 +143,10 @@ describe('drawing group', () => { expect(ctx.transform).toHaveBeenCalled(); expect(childRenderSpy).toHaveBeenCalled(); + expect(ctx.shadowColor).toBe('rgba(0, 0, 0, 0.5)'); + expect(ctx.shadowBlur).toBe(12); + expect(ctx.shadowOffsetX).toBe(-4); + expect(ctx.shadowOffsetY).toBe(4); }); it('maps children of nested drawing groups through the parent rendered bound', () => { diff --git a/packages/engine-render/src/drawing-group.ts b/packages/engine-render/src/drawing-group.ts index 1d054171d5..12d04a20b4 100644 --- a/packages/engine-render/src/drawing-group.ts +++ b/packages/engine-render/src/drawing-group.ts @@ -21,6 +21,13 @@ import type { UniverRenderingContext } from './context'; import { RENDER_CLASS_TYPE, Transform } from './basics'; import { Group } from './group'; +export interface IDrawingGroupShadow { + shadowColor: string; + shadowBlur: number; + shadowOffsetX: number; + shadowOffsetY: number; +} + export class DrawingGroupObject extends Group { protected override _selfSizeMode: boolean = true; /** @@ -36,6 +43,13 @@ export class DrawingGroupObject extends Group { height: 0, }; + private _outerShadow?: IDrawingGroupShadow; + + setOuterShadow(shadow?: IDrawingGroupShadow): void { + this._outerShadow = shadow; + this.makeDirty(true); + } + /** * Set the baseBound (chOff/chExt in OOXML) for this group. * This defines the coordinate space of children within the group. @@ -89,6 +103,12 @@ export class DrawingGroupObject extends Group { const centerX = realLeft + realWidth / 2; const centerY = realTop + realHeight / 2; ctx.transform(m[0], m[1], m[2], m[3], centerX, centerY); + if (this._outerShadow) { + ctx.shadowColor = this._outerShadow.shadowColor; + ctx.shadowBlur = this._outerShadow.shadowBlur; + ctx.shadowOffsetX = this._outerShadow.shadowOffsetX; + ctx.shadowOffsetY = this._outerShadow.shadowOffsetY; + } const objects = this.getObjectsByOrder(); // ctx.rect(0, 0, this.width, this.height); diff --git a/packages/engine-render/src/index.ts b/packages/engine-render/src/index.ts index 069ca3f9a9..2e6c1d7a7d 100644 --- a/packages/engine-render/src/index.ts +++ b/packages/engine-render/src/index.ts @@ -67,6 +67,7 @@ export type { IUniverEngineRenderConfig } from './config/config'; export * from './context'; export * from './custom'; export { DrawingGroupObject } from './drawing-group'; +export type { IDrawingGroupShadow } from './drawing-group'; export * from './engine'; export * from './group'; export * from './layer';