From 20088aeacef17551b85b8e35a6cee6c56a76d9de Mon Sep 17 00:00:00 2001 From: neuqzxy Date: Tue, 15 Oct 2024 08:19:32 +0000 Subject: [PATCH 01/16] docs: generate changelog of release v0.20.9 --- docs/assets/changelog/en/changelog.md | 26 ++++++++++++++++++++++++++ docs/assets/changelog/zh/changelog.md | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/docs/assets/changelog/en/changelog.md b/docs/assets/changelog/en/changelog.md index 85ec76d09..830f86df4 100644 --- a/docs/assets/changelog/en/changelog.md +++ b/docs/assets/changelog/en/changelog.md @@ -1,3 +1,29 @@ +# v0.20.9 + +2024-10-15 + + +**🆕 New feature** + +- **@visactor/vrender-components**: support axis label `firstVisible` in autoHide and linear axis sampling +- **@visactor/vrender-components**: add `interactInvertType` for smartInvert +- **@visactor/vrender-core**: text support keep-all, closed [#1466](https://github.com/VisActor/VRender/issues/1466) + +**🐛 Bug fix** + +- **@visactor/vrender-components**: fix smartInvert when `outsideEnable` is true +- **@visactor/vrender-components**: fix max width of arc label in left +- **@visactor/vrender-components**: fix `pager.space` of discrete legend +- **@visactor/vrender-components**: fix smart invert when only has intercet width base mark +- **@visactor/vrender-components**: fix `legend.item.label.space` when has value +- **@visactor/vrender-components**: legend scroll critical value leads last page not render. fix@VisActor/VChart[#3172](https://github.com/VisActor/VRender/issues/3172) +- **@visactor/vrender-kits**: fix max width of arc label in left +- **@visactor/vrender-core**: fix max width of arc label in left + + + +[more detail about v0.20.9](https://github.com/VisActor/VRender/releases/tag/v0.20.9) + # v0.20.8 2024-09-30 diff --git a/docs/assets/changelog/zh/changelog.md b/docs/assets/changelog/zh/changelog.md index 0488ab7ab..628510c06 100644 --- a/docs/assets/changelog/zh/changelog.md +++ b/docs/assets/changelog/zh/changelog.md @@ -1,3 +1,29 @@ +# v0.20.9 + +2024-10-15 + + +**🆕 新增功能** + +- **@visactor/vrender-components**: support axis label `firstVisible` in autoHide and linear axis sampling +- **@visactor/vrender-components**: add `interactInvertType` for smartInvert +- **@visactor/vrender-core**: text support keep-all, closed [#1466](https://github.com/VisActor/VRender/issues/1466) + +**🐛 功能修复** + +- **@visactor/vrender-components**: fix smartInvert when `outsideEnable` is true +- **@visactor/vrender-components**: fix max width of arc label in left +- **@visactor/vrender-components**: fix `pager.space` of discrete legend +- **@visactor/vrender-components**: fix smart invert when only has intercet width base mark +- **@visactor/vrender-components**: fix `legend.item.label.space` when has value +- **@visactor/vrender-components**: legend scroll critical value leads last page not render. fix@VisActor/VChart[#3172](https://github.com/VisActor/VRender/issues/3172) +- **@visactor/vrender-kits**: fix max width of arc label in left +- **@visactor/vrender-core**: fix max width of arc label in left + + + +[更多详情请查看 v0.20.9](https://github.com/VisActor/VRender/releases/tag/v0.20.9) + # v0.20.8 2024-09-30 From 10a2e9d8947a23dec1e39fd0112d7e6465076794 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Tue, 15 Oct 2024 16:39:35 +0800 Subject: [PATCH 02/16] fix: remove length check for firstVisible --- .../src/axis/overlap/auto-hide.ts | 18 ++++++++++-------- .../src/axis/tick-data/continuous.ts | 8 +++++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/vrender-components/src/axis/overlap/auto-hide.ts b/packages/vrender-components/src/axis/overlap/auto-hide.ts index d94534e35..d6ba7622c 100644 --- a/packages/vrender-components/src/axis/overlap/auto-hide.ts +++ b/packages/vrender-components/src/axis/overlap/auto-hide.ts @@ -105,21 +105,23 @@ export function autoHide(labels: IText[], config: HideConfig) { do { items = reduce(items, sep); } while (items.length >= 3 && hasOverlap(items, sep)); - /** - * 0.17.10 之前,当最后label个数小于3 的时候,才做最后的label强制显示的策略 - */ - const shouldCheck = (length: number, visibility: boolean) => length < 3 || visibility; + const shouldCheck = (length: number, visibility: boolean, checkLength: boolean = true) => { + return checkLength ? length < 3 || visibility : visibility; + }; - const checkFirst = shouldCheck(items.length, config.firstVisible); - let checkLast = shouldCheck(items.length, config.lastVisible); + let checkFirst = shouldCheck(items.length, config.firstVisible, false); + /** + * 0.17.10 之前,当最后 label 个数小于 3 的时候,才做最后的label强制显示的策略 + */ + const checkLast = shouldCheck(items.length, config.lastVisible); const firstSourceItem = source[0]; const lastSourceItem = last(source); - if (intersect(firstSourceItem, lastSourceItem, sep)) { + if (intersect(firstSourceItem, lastSourceItem, sep) && checkFirst && checkLast) { lastSourceItem.setAttribute('opacity', 0); // Or firstSourceItem, depending on preference - checkLast = false; + checkFirst = false; } forceItemVisible(firstSourceItem, items, checkFirst, (item: IText) => intersect(item, firstSourceItem, sep)); diff --git a/packages/vrender-components/src/axis/tick-data/continuous.ts b/packages/vrender-components/src/axis/tick-data/continuous.ts index a92fd9541..1c776fceb 100644 --- a/packages/vrender-components/src/axis/tick-data/continuous.ts +++ b/packages/vrender-components/src/axis/tick-data/continuous.ts @@ -158,13 +158,15 @@ export const continuousTicks = (scale: ContinuousScale, op: ITickDataOpt): ITick items = samplingMethod(items, labelGap); } - const shouldCheck = (length: number, visibility: boolean) => length < 3 || visibility; + const shouldCheck = (length: number, visibility: boolean, checkLength: boolean = true) => { + return checkLength ? length < 3 || visibility : visibility; + }; - const checkFirst = shouldCheck(items.length, op.labelFirstVisible); + const checkFirst = shouldCheck(items.length, op.labelFirstVisible, false); let checkLast = shouldCheck(items.length, op.labelLastVisible); if (intersect(firstSourceItem as any, lastSourceItem as any, labelGap)) { - if (items.includes(lastSourceItem) && items.length > 1) { + if (items.includes(lastSourceItem) && items.length > 1 && checkFirst && checkLast) { items.splice(items.indexOf(lastSourceItem), 1); checkLast = false; } From 140d9886df873a97d1e15237a1a20116cb61e306 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Tue, 15 Oct 2024 18:07:00 +0800 Subject: [PATCH 03/16] fix: remove length limit in continous scale sampling --- .../vrender-components/src/axis/tick-data/continuous.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/vrender-components/src/axis/tick-data/continuous.ts b/packages/vrender-components/src/axis/tick-data/continuous.ts index 1c776fceb..b1435d6d5 100644 --- a/packages/vrender-components/src/axis/tick-data/continuous.ts +++ b/packages/vrender-components/src/axis/tick-data/continuous.ts @@ -158,12 +158,8 @@ export const continuousTicks = (scale: ContinuousScale, op: ITickDataOpt): ITick items = samplingMethod(items, labelGap); } - const shouldCheck = (length: number, visibility: boolean, checkLength: boolean = true) => { - return checkLength ? length < 3 || visibility : visibility; - }; - - const checkFirst = shouldCheck(items.length, op.labelFirstVisible, false); - let checkLast = shouldCheck(items.length, op.labelLastVisible); + const checkFirst = op.labelFirstVisible; + let checkLast = op.labelLastVisible; // 这里和 auto-hide 里的逻辑有差异,不根据 length 自动强制显示最后一个(会引起 vtable 较多 badcase)。 if (intersect(firstSourceItem as any, lastSourceItem as any, labelGap)) { if (items.includes(lastSourceItem) && items.length > 1 && checkFirst && checkLast) { From c598fd20beeb53cfb98ab120ff3fd3e454b1103e Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Tue, 15 Oct 2024 19:49:51 +0800 Subject: [PATCH 04/16] fix: keep show first --- packages/vrender-components/src/axis/overlap/auto-hide.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vrender-components/src/axis/overlap/auto-hide.ts b/packages/vrender-components/src/axis/overlap/auto-hide.ts index d6ba7622c..6e42555f5 100644 --- a/packages/vrender-components/src/axis/overlap/auto-hide.ts +++ b/packages/vrender-components/src/axis/overlap/auto-hide.ts @@ -110,18 +110,18 @@ export function autoHide(labels: IText[], config: HideConfig) { return checkLength ? length < 3 || visibility : visibility; }; - let checkFirst = shouldCheck(items.length, config.firstVisible, false); + const checkFirst = shouldCheck(items.length, config.firstVisible, false); /** * 0.17.10 之前,当最后 label 个数小于 3 的时候,才做最后的label强制显示的策略 */ - const checkLast = shouldCheck(items.length, config.lastVisible); + let checkLast = shouldCheck(items.length, config.lastVisible); const firstSourceItem = source[0]; const lastSourceItem = last(source); if (intersect(firstSourceItem, lastSourceItem, sep) && checkFirst && checkLast) { lastSourceItem.setAttribute('opacity', 0); // Or firstSourceItem, depending on preference - checkFirst = false; + checkLast = false; } forceItemVisible(firstSourceItem, items, checkFirst, (item: IText) => intersect(item, firstSourceItem, sep)); From ee696c1123621015441943653ca5cf354fb22d0a Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Thu, 17 Oct 2024 11:33:46 +0800 Subject: [PATCH 05/16] fix: fix label overlap boundary judgment issue --- .../src/label/overlap/place.ts | 11 +++++--- .../src/label/overlap/scaler.ts | 26 +++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/vrender-components/src/label/overlap/place.ts b/packages/vrender-components/src/label/overlap/place.ts index 71843365f..c4ffa892f 100644 --- a/packages/vrender-components/src/label/overlap/place.ts +++ b/packages/vrender-components/src/label/overlap/place.ts @@ -6,7 +6,7 @@ import type { LabelBase } from '../base'; import type { BaseLabelAttrs, OverlapAttrs, Strategy } from '../type'; import type { Bitmap } from './bitmap'; import type { BitmapTool } from './scaler'; -import { boundToRange } from './scaler'; +import { boundToRange, clampRangeByBitmap } from './scaler'; /** * 防重叠逻辑参考 https://github.com/vega/vega/ @@ -51,12 +51,17 @@ export function canPlace($: BitmapTool, bitmap: Bitmap, bound: IBoundsLike, chec } range = boundToRange($, range); - const outOfBounds = checkBound && bitmap.outOfBounds(range); + const outOfBounds = bitmap.outOfBounds(range); - if (outOfBounds) { + if (checkBound && outOfBounds) { return false; } + // 超出边界,需要将判断区域调整到可视区域内 + if (outOfBounds) { + range = clampRangeByBitmap($, range); + } + return !bitmap.getRange(range); } diff --git a/packages/vrender-components/src/label/overlap/scaler.ts b/packages/vrender-components/src/label/overlap/scaler.ts index 428215fe9..2289bbc25 100644 --- a/packages/vrender-components/src/label/overlap/scaler.ts +++ b/packages/vrender-components/src/label/overlap/scaler.ts @@ -56,19 +56,23 @@ export function bitmapTool( return scale; } +export function clampRangeByBitmap($: BitmapTool, range: IBoundsLike) { + const { x1, x2, y1, y2 } = range; + const _x1 = clampRange(x1, 0, $.width); + const _x2 = clampRange(x2, 0, $.width); + const _y1 = clampRange(y1, 0, $.height); + const _y2 = clampRange(y2, 0, $.height); + return { + x1: $.x(_x1), + x2: $.x(_x2), + y1: $.y(_y1), + y2: $.y(_y2) + }; +} + export function boundToRange($: BitmapTool, bound: IBoundsLike, clamp: boolean = false) { if (clamp) { - const { x1, x2, y1, y2 } = bound; - const _x1 = clampRange(x1, 0, $.width); - const _x2 = clampRange(x2, 0, $.width); - const _y1 = clampRange(y1, 0, $.height); - const _y2 = clampRange(y2, 0, $.height); - return { - x1: $.x(_x1), - x2: $.x(_x2), - y1: $.y(_y1), - y2: $.y(_y2) - }; + return clampRangeByBitmap($, bound); } return { From 91128308403a601e55efb2553a819f582f19760c Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Mon, 21 Oct 2024 11:36:57 +0800 Subject: [PATCH 06/16] fix: fix the accuracy issue of number matching, closed #1488 --- .../fix-subview-check_2024-10-21-03-36.json | 10 ++++++++++ packages/vrender-core/src/core/window.ts | 6 +++--- 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json diff --git a/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json b/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json new file mode 100644 index 000000000..cc67be1e3 --- /dev/null +++ b/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vrender-core", + "comment": "fix: fix the accuracy issue of number matching, closed #1488", + "type": "none" + } + ], + "packageName": "@visactor/vrender-core" +} \ No newline at end of file diff --git a/packages/vrender-core/src/core/window.ts b/packages/vrender-core/src/core/window.ts index 75b8fe166..ab44691cb 100644 --- a/packages/vrender-core/src/core/window.ts +++ b/packages/vrender-core/src/core/window.ts @@ -1,6 +1,6 @@ import { inject, injectable } from '../common/inversify-lite'; import type { IPointLike } from '@visactor/vutils'; -import { Matrix, type IBoundsLike, type IMatrix, IBounds, Point } from '@visactor/vutils'; +import { Matrix, type IBoundsLike, type IMatrix, IBounds, Point, isEqual, isNumberClose } from '@visactor/vutils'; import { Generator } from '../common/generator'; import type { ICanvas, @@ -234,8 +234,8 @@ export class DefaultWindow implements IWindow { return !( viewBox.x1 === 0 && viewBox.y1 === 0 && - this.width === viewBox.width() && - this.height === viewBox.height() + isNumberClose(this.width, viewBox.width()) && + isNumberClose(this.height, viewBox.height()) ); } From c351599f110a1a2a5640de981c1b83ae88e58dfc Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Tue, 22 Oct 2024 15:56:48 +0800 Subject: [PATCH 07/16] fix: fix issue with parse m where multi pos follow, closed #1490 --- .../vrender-core/fix-path-move_2024-10-22-07-57.json | 10 ++++++++++ packages/vrender-core/src/common/path-svg.ts | 9 ++++++++- packages/vrender/__tests__/browser/src/pages/symbol.ts | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json diff --git a/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json b/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json new file mode 100644 index 000000000..2765a8289 --- /dev/null +++ b/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vrender-core", + "comment": "fix: fix issue with parse m where multi pos follow, closed #1490", + "type": "none" + } + ], + "packageName": "@visactor/vrender-core" +} \ No newline at end of file diff --git a/packages/vrender-core/src/common/path-svg.ts b/packages/vrender-core/src/common/path-svg.ts index 25e43d75d..aeed7315e 100644 --- a/packages/vrender-core/src/common/path-svg.ts +++ b/packages/vrender-core/src/common/path-svg.ts @@ -97,12 +97,19 @@ export function parseSvgPath(str: string): Array[] { if (currCommandData.length - 1 > standardCommandLen) { // 如果命令长度超过默认长度,就拆分为多个命令 let subCommand: (string | number)[]; + let bestCommandChar = commandChar; for (let i = 1, len = currCommandData.length; i < len; i += standardCommandLen) { - subCommand = [commandChar]; + subCommand = [bestCommandChar]; for (let j = i, subLen = i + standardCommandLen; j < subLen; j++) { subCommand.push(currCommandData[j]); } result.push(subCommand); + // 如果是一堆m命令,后续就转为l命令 + if (bestCommandChar === 'm') { + bestCommandChar = 'l'; + } else if (bestCommandChar === 'M') { + bestCommandChar = 'L'; + } } } else { result.push(currCommandData); diff --git a/packages/vrender/__tests__/browser/src/pages/symbol.ts b/packages/vrender/__tests__/browser/src/pages/symbol.ts index 8c217636c..72e4e4d73 100644 --- a/packages/vrender/__tests__/browser/src/pages/symbol.ts +++ b/packages/vrender/__tests__/browser/src/pages/symbol.ts @@ -67,7 +67,8 @@ export const page = () => { 'M -2 2 L 4 -5 L 7 -6 L 6 -3 L -1 3 C 0 4 0 5 1 4 C 1 5 2 6 1 6 A 1.42 1.42 0 0 1 0 7 A 5 5 0 0 0 -2 4 Q -2.5 3.9 -2.5 4.5 T -4 5.8 T -4.8 5 T -3.5 3.5 T -3 3 A 5 5 90 0 0 -6 1 A 1.42 1.42 0 0 1 -5 0 C -5 -1 -4 0 -3 0 C -4 1 -3 1 -2 2 M 4 -5 L 4 -3 L 6 -3 L 5 -4 L 4 -5', ``, ``, - 'M -1 1 L 0 0 L 1 1' + 'M -1 1 L 0 0 L 1 1', + 'm 415.0625,28.75 -47.375,13.71875 -39.75,8.625 13.875,77.6875 7.59375,-14.96875 4.5,-3 c 0,0 0.0602,0.27071 0.0625,0.28125 l 11.9375,-10.28125 17.5,-6 16,-1 0,-0.5 23,15.5 3.53125,5.21875 2.875,-1.53125 -13.75,-83.75 z' ]; const graphics: IGraphic[] = []; From a23f5ff28f952b4c931aa798516c6dca259894c2 Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Tue, 22 Oct 2024 16:49:36 +0800 Subject: [PATCH 08/16] feat: support fillStrokeOrder, closed #1505 --- ...at-fill-stroke-order_2024-10-22-08-48.json | 10 + packages/vrender-core/src/graphic/config.ts | 2 + .../vrender-core/src/interface/graphic.ts | 2 + .../render/contributions/render/arc-render.ts | 94 +++++---- .../contributions/render/area-render.ts | 188 ++++++++++-------- .../contributions/render/circle-render.ts | 41 ++-- .../contributions/render/group-render.ts | 42 ++-- .../contributions/render/image-render.ts | 117 ++++++----- .../contributions/render/path-render.ts | 44 ++-- .../contributions/render/polygon-render.ts | 45 +++-- .../contributions/render/rect-render.ts | 45 +++-- .../contributions/render/symbol-render.ts | 90 ++++++--- .../__tests__/browser/src/pages/rect.ts | 2 +- .../__tests__/browser/src/pages/symbol.ts | 2 + 14 files changed, 449 insertions(+), 275 deletions(-) create mode 100644 common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json diff --git a/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json b/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json new file mode 100644 index 000000000..7ef79d431 --- /dev/null +++ b/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@visactor/vrender-core", + "comment": "feat: support fillStrokeOrder, closed #1505", + "type": "none" + } + ], + "packageName": "@visactor/vrender-core" +} \ No newline at end of file diff --git a/packages/vrender-core/src/graphic/config.ts b/packages/vrender-core/src/graphic/config.ts index 4dea6d5db..a20752e31 100644 --- a/packages/vrender-core/src/graphic/config.ts +++ b/packages/vrender-core/src/graphic/config.ts @@ -177,6 +177,7 @@ export const DefaultAttribute: Required = { zIndex: 0, layout: null, boundsPadding: 0, + fillStrokeOrder: 0, renderStyle: 'default', pickMode: 'accurate', customPickShape: null, @@ -275,6 +276,7 @@ export const DefaultLineAttribute: Required = { export const DefaultPathAttribute: Required = { ...DefaultAttribute, path: new CustomPath2D(), + fillStrokeOrder: 1, customPath: () => { Logger.getInstance().warn('空函数'); } diff --git a/packages/vrender-core/src/interface/graphic.ts b/packages/vrender-core/src/interface/graphic.ts index 248a1d001..722969374 100644 --- a/packages/vrender-core/src/interface/graphic.ts +++ b/packages/vrender-core/src/interface/graphic.ts @@ -320,6 +320,8 @@ export type IGraphicAttribute = IDebugType & globalCompositeOperation: CanvasRenderingContext2D['globalCompositeOperation'] | ''; // 完全支持滚动 | 完全不支持滚动 | 支持x方向的滚动 | 支持y方向的滚动 overflow: 'scroll' | 'hidden' | 'scroll-x' | 'scroll-y'; + // 绘制fill和stroke的顺序,为0表示fill在前,1表示stroke在前 + fillStrokeOrder: number; }; export interface IGraphicJson = Partial> { diff --git a/packages/vrender-core/src/render/contributions/render/arc-render.ts b/packages/vrender-core/src/render/contributions/render/arc-render.ts index fe58be5a6..574fe0956 100644 --- a/packages/vrender-core/src/render/contributions/render/arc-render.ts +++ b/packages/vrender-core/src/render/contributions/render/arc-render.ts @@ -216,7 +216,8 @@ export class DefaultCanvasArcRender extends BaseRender implements IGraphic fill = arcAttribute.fill, stroke = arcAttribute.stroke, x: originX = arcAttribute.x, - y: originY = arcAttribute.y + y: originY = arcAttribute.y, + fillStrokeOrder = arcAttribute.fillStrokeOrder } = arc.attribute; const data = this.valid(arc, arcAttribute, fillCb, strokeCb); if (!data) { @@ -281,22 +282,34 @@ export class DefaultCanvasArcRender extends BaseRender implements IGraphic strokeCb ); - if (doFill) { - if (fillCb) { - fillCb(context, arc.attribute, arcAttribute); - } else if (fVisible) { - context.setCommonStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute); - context.fill(); + const _runFill = () => { + if (doFill) { + if (fillCb) { + fillCb(context, arc.attribute, arcAttribute); + } else if (fVisible) { + context.setCommonStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute); + context.fill(); + } } - } + }; - if (doStroke && isFullStroke) { - if (strokeCb) { - strokeCb(context, arc.attribute, arcAttribute); - } else if (sVisible) { - context.setStrokeStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute); - context.stroke(); + const _runStroke = () => { + if (doStroke && isFullStroke) { + if (strokeCb) { + strokeCb(context, arc.attribute, arcAttribute); + } else if (sVisible) { + context.setStrokeStyle(arc, arc.attribute, originX - x, originY - y, arcAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } } @@ -360,29 +373,42 @@ export class DefaultCanvasArcRender extends BaseRender implements IGraphic ); } - if (doFill) { - // 获取渐变色最后一个颜色 - const color = fill; - if ((color as IGradientColor).gradient === 'conical') { - const lastColor = getConicGradientAt(0, 0, endAngle, color as any); - if (fillCb) { - // fillCb(context, arc.attribute, arcAttribute); - } else if (fillVisible) { - // context.closePath(); - context.setCommonStyle(arc, arc.attribute, x, y, arcAttribute); - context.fillStyle = lastColor as string; - context.fill(); + const _runFill = () => { + if (doFill) { + // 获取渐变色最后一个颜色 + const color = fill; + if ((color as IGradientColor).gradient === 'conical') { + const lastColor = getConicGradientAt(0, 0, endAngle, color as any); + if (fillCb) { + // fillCb(context, arc.attribute, arcAttribute); + } else if (fillVisible) { + // context.closePath(); + context.setCommonStyle(arc, arc.attribute, x, y, arcAttribute); + context.fillStyle = lastColor as string; + context.fill(); + } } } - } - if (doStroke) { - if (strokeCb) { - // fillCb(context, arc.attribute, arcAttribute); - } else if (sVisible) { - context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute); - // context.strokeStyle = 'red'; - context.stroke(); + }; + + const _runStroke = () => { + if (doStroke) { + if (strokeCb) { + // fillCb(context, arc.attribute, arcAttribute); + } else if (sVisible) { + context.setStrokeStyle(arc, arc.attribute, x, y, arcAttribute); + // context.strokeStyle = 'red'; + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runFill(); + _runStroke(); } } } diff --git a/packages/vrender-core/src/render/contributions/render/area-render.ts b/packages/vrender-core/src/render/contributions/render/area-render.ts index 21b0d0cc4..e52d24fa6 100644 --- a/packages/vrender-core/src/render/contributions/render/area-render.ts +++ b/packages/vrender-core/src/render/contributions/render/area-render.ts @@ -71,7 +71,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph themeAttribute: IThemeAttribute ) => boolean ) { - const { points } = area.attribute; + const { points, fillStrokeOrder = areaAttribute.fillStrokeOrder } = area.attribute; if (points.length < 2) { return; } @@ -111,13 +111,52 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph ); const { x: originX = 0, x: originY = 0 } = area.attribute; - if (fill !== false) { - if (fillCb) { - fillCb(context, area.attribute, areaAttribute); - } else if (fillOpacity) { - context.setCommonStyle(area, area.attribute, originX - offsetX, originY - offsetY, areaAttribute); - context.fill(); + const _runFill = () => { + if (fill !== false) { + if (fillCb) { + fillCb(context, area.attribute, areaAttribute); + } else if (fillOpacity) { + context.setCommonStyle(area, area.attribute, originX - offsetX, originY - offsetY, areaAttribute); + context.fill(); + } } + }; + + const _runStroke = () => { + if (stroke) { + const { stroke = areaAttribute && areaAttribute.stroke } = area.attribute; + if (isArray(stroke) && (stroke[0] || stroke[2]) && stroke[1] === false) { + context.beginPath(); + if (stroke[0]) { + context.moveTo(startP.x + offsetX, startP.y + offsetY, z); + for (let i = 1; i < points.length; i++) { + const p = points[i]; + context.lineTo(p.x + offsetX, p.y + offsetY, z); + } + } else if (stroke[2]) { + const endP = points[points.length - 1]; + context.moveTo(endP.x + offsetX, endP.y + offsetY, z); + for (let i = points.length - 2; i >= 0; i--) { + const p = points[i]; + context.lineTo((p.x1 ?? p.x) + offsetX, (p.y1 ?? p.y) + offsetY, z); + } + } + } + if (strokeCb) { + strokeCb(context, area.attribute, areaAttribute); + } else { + context.setStrokeStyle(area, area.attribute, originX - offsetX, originY - offsetY, areaAttribute); + context.stroke(); + } + } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( @@ -135,33 +174,6 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph null, { attribute: area.attribute } ); - - if (stroke) { - const { stroke = areaAttribute && areaAttribute.stroke } = area.attribute; - if (isArray(stroke) && (stroke[0] || stroke[2]) && stroke[1] === false) { - context.beginPath(); - if (stroke[0]) { - context.moveTo(startP.x + offsetX, startP.y + offsetY, z); - for (let i = 1; i < points.length; i++) { - const p = points[i]; - context.lineTo(p.x + offsetX, p.y + offsetY, z); - } - } else if (stroke[2]) { - const endP = points[points.length - 1]; - context.moveTo(endP.x + offsetX, endP.y + offsetY, z); - for (let i = points.length - 2; i >= 0; i--) { - const p = points[i]; - context.lineTo((p.x1 ?? p.x) + offsetX, (p.y1 ?? p.y) + offsetY, z); - } - } - } - if (strokeCb) { - strokeCb(context, area.attribute, areaAttribute); - } else { - context.setStrokeStyle(area, area.attribute, originX - offsetX, originY - offsetY, areaAttribute); - context.stroke(); - } - } } drawShape( @@ -538,7 +550,8 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph } // 绘制connect区域 let { connectedType, connectedX, connectedY, connectedStyle } = attribute; - const da = []; + const { fillStrokeOrder = (defaultAttribute as any).fillStrokeOrder } = attribute; + const da: any[] = []; if (connect) { if (isArray(defaultAttribute)) { connectedType = connectedType ?? defaultAttribute[0].connectedType ?? defaultAttribute[1].connectedType; @@ -627,19 +640,66 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph context.setShadowBlendStyle && context.setShadowBlendStyle(area, attribute, defaultAttribute); const { x: originX = 0, x: originY = 0 } = attribute; - if (fill !== false) { - if (fillCb) { - fillCb(context, attribute, defaultAttribute); - } else if (fillOpacity) { - context.setCommonStyle( - area, - connect ? connectedStyle : attribute, - originX - offsetX, - originY - offsetY, - connect ? da : defaultAttribute - ); - context.fill(); + const _runFill = () => { + if (fill !== false) { + if (fillCb) { + fillCb(context, attribute, defaultAttribute); + } else if (fillOpacity) { + context.setCommonStyle( + area, + connect ? connectedStyle : attribute, + originX - offsetX, + originY - offsetY, + connect ? da : defaultAttribute + ); + context.fill(); + } } + }; + + const _runStroke = () => { + if (stroke !== false) { + if (strokeCb) { + strokeCb(context, attribute, defaultAttribute); + } else { + const { stroke = defaultAttribute && (defaultAttribute as any)[1] && (defaultAttribute as any)[1].stroke } = + attribute; + if (isArray(stroke) && (stroke[0] || stroke[2]) && stroke[1] === false) { + context.beginPath(); + drawSegments( + context.camera ? context : context.nativeContext, + stroke[0] ? cache.top : cache.bottom, + clipRange, + direction === Direction.ROW ? 'x' : 'y', + { + offsetX, + offsetY, + offsetZ, + drawConnect: connect, + mode: connectedType, + zeroX: connectedX, + zeroY: connectedY + } + ); + } + context.setStrokeStyle( + area, + connect ? connectedStyle : attribute, + originX - offsetX, + originY - offsetY, + connect ? da : defaultAttribute + ); + context.stroke(); + } + } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( @@ -658,40 +718,6 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph { attribute } ); - if (stroke !== false) { - if (strokeCb) { - strokeCb(context, attribute, defaultAttribute); - } else { - const { stroke = defaultAttribute && defaultAttribute[1] && defaultAttribute[1].stroke } = attribute; - if (isArray(stroke) && (stroke[0] || stroke[2]) && stroke[1] === false) { - context.beginPath(); - drawSegments( - context.camera ? context : context.nativeContext, - stroke[0] ? cache.top : cache.bottom, - clipRange, - direction === Direction.ROW ? 'x' : 'y', - { - offsetX, - offsetY, - offsetZ, - drawConnect: connect, - mode: connectedType, - zeroX: connectedX, - zeroY: connectedY - } - ); - } - context.setStrokeStyle( - area, - connect ? connectedStyle : attribute, - originX - offsetX, - originY - offsetY, - connect ? da : defaultAttribute - ); - context.stroke(); - } - } - return ret; } } diff --git a/packages/vrender-core/src/render/contributions/render/circle-render.ts b/packages/vrender-core/src/render/contributions/render/circle-render.ts index 95a4f9c0d..7a19d25a0 100644 --- a/packages/vrender-core/src/render/contributions/render/circle-render.ts +++ b/packages/vrender-core/src/render/contributions/render/circle-render.ts @@ -68,7 +68,8 @@ export class DefaultCanvasCircleRender extends BaseRender implements IG startAngle = circleAttribute.startAngle, endAngle = circleAttribute.endAngle, x: originX = circleAttribute.x, - y: originY = circleAttribute.y + y: originY = circleAttribute.y, + fillStrokeOrder = circleAttribute.fillStrokeOrder } = circle.attribute; const data = this.valid(circle, circleAttribute, fillCb, strokeCb); @@ -99,22 +100,34 @@ export class DefaultCanvasCircleRender extends BaseRender implements IG strokeCb ); - if (doFill) { - if (fillCb) { - fillCb(context, circle.attribute, circleAttribute); - } else if (fVisible) { - context.setCommonStyle(circle, circle.attribute, originX - x, originY - y, circleAttribute); - context.fill(); + const _runFill = () => { + if (doFill) { + if (fillCb) { + fillCb(context, circle.attribute, circleAttribute); + } else if (fVisible) { + context.setCommonStyle(circle, circle.attribute, originX - x, originY - y, circleAttribute); + context.fill(); + } } - } + }; - if (doStroke) { - if (strokeCb) { - strokeCb(context, circle.attribute, circleAttribute); - } else if (sVisible) { - context.setStrokeStyle(circle, circle.attribute, originX - x, originY - y, circleAttribute); - context.stroke(); + const _runStroke = () => { + if (doStroke) { + if (strokeCb) { + strokeCb(context, circle.attribute, circleAttribute); + } else if (sVisible) { + context.setStrokeStyle(circle, circle.attribute, originX - x, originY - y, circleAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( diff --git a/packages/vrender-core/src/render/contributions/render/group-render.ts b/packages/vrender-core/src/render/contributions/render/group-render.ts index 5ee0c0698..b63ce2491 100644 --- a/packages/vrender-core/src/render/contributions/render/group-render.ts +++ b/packages/vrender-core/src/render/contributions/render/group-render.ts @@ -72,7 +72,8 @@ export class DefaultCanvasGroupRender implements IGraphicRender { cornerRadius = groupAttribute.cornerRadius, path = groupAttribute.path, lineWidth = groupAttribute.lineWidth, - visible = groupAttribute.visible + visible = groupAttribute.visible, + fillStrokeOrder = groupAttribute.fillStrokeOrder } = group.attribute; // 不绘制或者透明 @@ -160,21 +161,34 @@ export class DefaultCanvasGroupRender implements IGraphicRender { // shadow context.setShadowBlendStyle && context.setShadowBlendStyle(group, group.attribute, groupAttribute); - if (doFillOrStroke.doFill) { - if (fillCb) { - fillCb(context, group.attribute, groupAttribute); - } else if (fVisible) { - context.setCommonStyle(group, group.attribute, x, y, groupAttribute); - context.fill(); + const _runFill = () => { + if ((doFillOrStroke as any).doFill) { + if (fillCb) { + fillCb(context, group.attribute, groupAttribute); + } else if (fVisible) { + context.setCommonStyle(group, group.attribute, x, y, groupAttribute); + context.fill(); + } } - } - if (doFillOrStroke.doStroke) { - if (strokeCb) { - strokeCb(context, group.attribute, groupAttribute); - } else if (sVisible) { - context.setStrokeStyle(group, group.attribute, x, y, groupAttribute); - context.stroke(); + }; + + const _runStroke = () => { + if ((doFillOrStroke as any).doStroke) { + if (strokeCb) { + strokeCb(context, group.attribute, groupAttribute); + } else if (sVisible) { + context.setStrokeStyle(group, group.attribute, x, y, groupAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this._groupRenderContribitions.forEach(c => { diff --git a/packages/vrender-core/src/render/contributions/render/image-render.ts b/packages/vrender-core/src/render/contributions/render/image-render.ts index af36f450e..71aaa4b17 100644 --- a/packages/vrender-core/src/render/contributions/render/image-render.ts +++ b/packages/vrender-core/src/render/contributions/render/image-render.ts @@ -70,6 +70,7 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra x: originX = imageAttribute.x, y: originY = imageAttribute.y, cornerRadius = imageAttribute.cornerRadius, + fillStrokeOrder = imageAttribute.fillStrokeOrder, image: url } = image.attribute; @@ -87,61 +88,73 @@ export class DefaultCanvasImageRender extends BaseRender implements IGra // context.beginPath(); // context.image(x, y, width, height); - if (doFill) { - if (fillCb) { - fillCb(context, image.attribute, imageAttribute); - } else if (fVisible) { - if (!url || !image.resources) { - return; - } - const res = image.resources.get(url); - if (res.state !== 'success') { - return; - } - - // deal with cornerRadius - let needRestore = false; - if (cornerRadius === 0 || (isArray(cornerRadius) && (cornerRadius).every(num => num === 0))) { - // 不需要处理圆角 - } else { - context.beginPath(); - createRectPath(context, x, y, width, height, cornerRadius); - context.save(); - context.clip(); - needRestore = true; - } - - context.setCommonStyle(image, image.attribute, x, y, imageAttribute); - let repeat = 0; - if (repeatX === 'repeat') { - repeat |= 0b0001; - } - if (repeatY === 'repeat') { - repeat |= 0b0010; - } - if (repeat) { - const pattern = context.createPattern(res.data, repeatStr[repeat]); - context.fillStyle = pattern; - context.translate(x, y, true); - context.fillRect(0, 0, width, height); - context.translate(-x, -y, true); - } else { - context.drawImage(res.data, x, y, width, height); - } - - if (needRestore) { - context.restore(); + const _runFill = () => { + if (doFill) { + if (fillCb) { + fillCb(context, image.attribute, imageAttribute); + } else if (fVisible) { + if (!url || !image.resources) { + return; + } + const res = image.resources.get(url); + if (res.state !== 'success') { + return; + } + + // deal with cornerRadius + let needRestore = false; + if (cornerRadius === 0 || (isArray(cornerRadius) && (cornerRadius).every(num => num === 0))) { + // 不需要处理圆角 + } else { + context.beginPath(); + createRectPath(context, x, y, width, height, cornerRadius); + context.save(); + context.clip(); + needRestore = true; + } + + context.setCommonStyle(image, image.attribute, x, y, imageAttribute); + let repeat = 0; + if (repeatX === 'repeat') { + repeat |= 0b0001; + } + if (repeatY === 'repeat') { + repeat |= 0b0010; + } + if (repeat) { + const pattern = context.createPattern(res.data, repeatStr[repeat]); + context.fillStyle = pattern; + context.translate(x, y, true); + context.fillRect(0, 0, width, height); + context.translate(-x, -y, true); + } else { + context.drawImage(res.data, x, y, width, height); + } + + if (needRestore) { + context.restore(); + } } } - } - - if (doStroke) { - if (strokeCb) { - strokeCb(context, image.attribute, imageAttribute); - } else if (sVisible) { - context.setStrokeStyle(image, image.attribute, originX - x, originY - y, imageAttribute); - context.stroke(); + }; + + const _runStroke = () => { + if (doStroke) { + if (strokeCb) { + strokeCb(context, image.attribute, imageAttribute); + } else if (sVisible) { + context.setStrokeStyle(image, image.attribute, originX - x, originY - y, imageAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep(image, context, x, y, doFill, false, fVisible, false, imageAttribute, drawContext, fillCb); diff --git a/packages/vrender-core/src/render/contributions/render/path-render.ts b/packages/vrender-core/src/render/contributions/render/path-render.ts index a16ee0a3e..269d1d8de 100644 --- a/packages/vrender-core/src/render/contributions/render/path-render.ts +++ b/packages/vrender-core/src/render/contributions/render/path-render.ts @@ -65,7 +65,11 @@ export class DefaultCanvasPathRender extends BaseRender implements IGraph ) { // const pathAttribute = graphicService.themeService.getCurrentTheme().pathAttribute; const pathAttribute = this.tempTheme ?? getTheme(path, params?.theme).path; - const { x: originX = pathAttribute.x, y: originY = pathAttribute.y } = path.attribute; + const { + x: originX = pathAttribute.x, + y: originY = pathAttribute.y, + fillStrokeOrder = pathAttribute.fillStrokeOrder + } = path.attribute; const z = this.z ?? 0; @@ -101,21 +105,33 @@ export class DefaultCanvasPathRender extends BaseRender implements IGraph strokeCb ); - if (doStroke) { - if (strokeCb) { - strokeCb(context, path.attribute, pathAttribute); - } else if (sVisible) { - context.setStrokeStyle(path, path.attribute, originX - x, originY - y, pathAttribute); - context.stroke(); + const _runStroke = () => { + if (doStroke) { + if (strokeCb) { + strokeCb(context, path.attribute, pathAttribute); + } else if (sVisible) { + context.setStrokeStyle(path, path.attribute, originX - x, originY - y, pathAttribute); + context.stroke(); + } } - } - if (doFill) { - if (fillCb) { - fillCb(context, path.attribute, pathAttribute); - } else if (fVisible) { - context.setCommonStyle(path, path.attribute, originX - x, originY - y, pathAttribute); - context.fill(); + }; + const _runFill = () => { + if (doFill) { + if (fillCb) { + fillCb(context, path.attribute, pathAttribute); + } else if (fVisible) { + context.setCommonStyle(path, path.attribute, originX - x, originY - y, pathAttribute); + context.fill(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( diff --git a/packages/vrender-core/src/render/contributions/render/polygon-render.ts b/packages/vrender-core/src/render/contributions/render/polygon-render.ts index 2f7094a02..79df3c262 100644 --- a/packages/vrender-core/src/render/contributions/render/polygon-render.ts +++ b/packages/vrender-core/src/render/contributions/render/polygon-render.ts @@ -67,7 +67,8 @@ export class DefaultCanvasPolygonRender extends BaseRender implements cornerRadius = polygonAttribute.cornerRadius, x: originX = polygonAttribute.x, y: originY = polygonAttribute.y, - closePath = polygonAttribute.closePath + closePath = polygonAttribute.closePath, + fillStrokeOrder = polygonAttribute.fillStrokeOrder } = polygon.attribute; const data = this.valid(polygon, polygonAttribute, fillCb, strokeCb); @@ -105,23 +106,35 @@ export class DefaultCanvasPolygonRender extends BaseRender implements strokeCb ); - if (doFill) { - if (fillCb) { - fillCb(context, polygon.attribute, polygonAttribute); - } else if (fVisible) { - // 存在fill - context.setCommonStyle(polygon, polygon.attribute, originX - x, originY - y, polygonAttribute); - context.fill(); + const _runFill = () => { + if (doFill) { + if (fillCb) { + fillCb(context, polygon.attribute, polygonAttribute); + } else if (fVisible) { + // 存在fill + context.setCommonStyle(polygon, polygon.attribute, originX - x, originY - y, polygonAttribute); + context.fill(); + } } - } - if (doStroke) { - if (strokeCb) { - strokeCb(context, polygon.attribute, polygonAttribute); - } else if (sVisible) { - // 存在stroke - context.setStrokeStyle(polygon, polygon.attribute, originX - x, originY - y, polygonAttribute); - context.stroke(); + }; + const _runStroke = () => { + if (doStroke) { + if (strokeCb) { + strokeCb(context, polygon.attribute, polygonAttribute); + } else if (sVisible) { + // 存在stroke + context.setStrokeStyle(polygon, polygon.attribute, originX - x, originY - y, polygonAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( diff --git a/packages/vrender-core/src/render/contributions/render/rect-render.ts b/packages/vrender-core/src/render/contributions/render/rect-render.ts index e599e2b54..9cefdcfca 100644 --- a/packages/vrender-core/src/render/contributions/render/rect-render.ts +++ b/packages/vrender-core/src/render/contributions/render/rect-render.ts @@ -80,7 +80,8 @@ export class DefaultCanvasRectRender extends BaseRender implements IGraph x1, y1, x: originX = rectAttribute.x, - y: originY = rectAttribute.y + y: originY = rectAttribute.y, + fillStrokeOrder = rectAttribute.fillStrokeOrder } = rect.attribute; let { width, height } = rect.attribute; width = (width ?? x1 - originX) || 0; @@ -140,23 +141,35 @@ export class DefaultCanvasRectRender extends BaseRender implements IGraph doFillOrStroke ); - if (doFillOrStroke.doFill) { - if (fillCb) { - fillCb(context, rect.attribute, rectAttribute); - } else if (fVisible) { - // 存在fill - context.setCommonStyle(rect, rect.attribute, originX - x, originY - y, rectAttribute); - context.fill(); + const _runFill = () => { + if (doFillOrStroke.doFill) { + if (fillCb) { + fillCb(context, rect.attribute, rectAttribute); + } else if (fVisible) { + // 存在fill + context.setCommonStyle(rect, rect.attribute, originX - x, originY - y, rectAttribute); + context.fill(); + } } - } - if (doFillOrStroke.doStroke) { - if (strokeCb) { - strokeCb(context, rect.attribute, rectAttribute); - } else if (sVisible) { - // 存在stroke - context.setStrokeStyle(rect, rect.attribute, originX - x, originY - y, rectAttribute); - context.stroke(); + }; + const _runStroke = () => { + if (doFillOrStroke.doStroke) { + if (strokeCb) { + strokeCb(context, rect.attribute, rectAttribute); + } else if (sVisible) { + // 存在stroke + context.setStrokeStyle(rect, rect.attribute, originX - x, originY - y, rectAttribute); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( diff --git a/packages/vrender-core/src/render/contributions/render/symbol-render.ts b/packages/vrender-core/src/render/contributions/render/symbol-render.ts index 42a407dae..f223ad7e5 100644 --- a/packages/vrender-core/src/render/contributions/render/symbol-render.ts +++ b/packages/vrender-core/src/render/contributions/render/symbol-render.ts @@ -72,7 +72,8 @@ export class DefaultCanvasSymbolRender extends BaseRender implements IG x: originX = symbolAttribute.x, y: originY = symbolAttribute.y, scaleX = symbolAttribute.scaleX, - scaleY = symbolAttribute.scaleY + scaleY = symbolAttribute.scaleY, + fillStrokeOrder = symbolAttribute.fillStrokeOrder } = symbol.attribute; const data = this.valid(symbol, symbolAttribute, fillCb, strokeCb); @@ -101,21 +102,32 @@ export class DefaultCanvasSymbolRender extends BaseRender implements IG obj.stroke = a.stroke ?? symbol.attribute.stroke; a = obj; } - if (a.fill) { - if (fillCb) { - fillCb(context, symbol.attribute, symbolAttribute); - } else { - context.setCommonStyle(symbol, a, originX - x, originY - y, symbolAttribute); - context.fill(); + const _runFill = () => { + if (a.fill) { + if (fillCb) { + fillCb(context, symbol.attribute, symbolAttribute); + } else { + context.setCommonStyle(symbol, a, originX - x, originY - y, symbolAttribute); + context.fill(); + } } - } - if (a.stroke) { - if (strokeCb) { - strokeCb(context, symbol.attribute, symbolAttribute); - } else { - context.setStrokeStyle(symbol, a, (originX - x) / scaleX, (originY - y) / scaleY, symbolAttribute); - context.stroke(); + }; + const _runStroke = () => { + if (a.stroke) { + if (strokeCb) { + strokeCb(context, symbol.attribute, symbolAttribute); + } else { + context.setStrokeStyle(symbol, a, (originX - x) / scaleX, (originY - y) / scaleY, symbolAttribute); + context.stroke(); + } } + }; + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } }; if (keepDirIn3d && context.camera && context.project) { @@ -169,27 +181,39 @@ export class DefaultCanvasSymbolRender extends BaseRender implements IG // } // svg就不用fill和stroke了 - if (doFill && !parsedPath.isSvg) { - if (fillCb) { - fillCb(context, symbol.attribute, symbolAttribute); - } else if (fVisible) { - context.setCommonStyle(symbol, symbol.attribute, originX - x, originY - y, symbolAttribute); - context.fill(); + const _runFill = () => { + if (doFill && !parsedPath.isSvg) { + if (fillCb) { + fillCb(context, symbol.attribute, symbolAttribute); + } else if (fVisible) { + context.setCommonStyle(symbol, symbol.attribute, originX - x, originY - y, symbolAttribute); + context.fill(); + } } - } - if (doStroke && !parsedPath.isSvg) { - if (strokeCb) { - strokeCb(context, symbol.attribute, symbolAttribute); - } else if (sVisible) { - context.setStrokeStyle( - symbol, - symbol.attribute, - (originX - x) / scaleX, - (originY - y) / scaleY, - symbolAttribute - ); - context.stroke(); + }; + const _runStroke = () => { + if (doStroke && !parsedPath.isSvg) { + if (strokeCb) { + strokeCb(context, symbol.attribute, symbolAttribute); + } else if (sVisible) { + context.setStrokeStyle( + symbol, + symbol.attribute, + (originX - x) / scaleX, + (originY - y) / scaleY, + symbolAttribute + ); + context.stroke(); + } } + }; + + if (!fillStrokeOrder) { + _runFill(); + _runStroke(); + } else { + _runStroke(); + _runFill(); } this.afterRenderStep( diff --git a/packages/vrender/__tests__/browser/src/pages/rect.ts b/packages/vrender/__tests__/browser/src/pages/rect.ts index d1d33f0c2..58c0c9494 100644 --- a/packages/vrender/__tests__/browser/src/pages/rect.ts +++ b/packages/vrender/__tests__/browser/src/pages/rect.ts @@ -57,7 +57,7 @@ export const page = () => { width: 200, height: 200, cornerRadius: [0, 10, 10, 0], - stroke: ['red', 'red', 'red', false], + stroke: 'red', // scaleCenter: ['50%', '50%'], // _debug_bounds: true, fill: 'conic-gradient(from 90deg, rgba(5,0,255,1) 16%, rgba(0,255,10,1) 41%, rgba(9,9,121,1) 53%, rgba(0,212,255,1) 100%)', diff --git a/packages/vrender/__tests__/browser/src/pages/symbol.ts b/packages/vrender/__tests__/browser/src/pages/symbol.ts index 8c217636c..5a17c4c0b 100644 --- a/packages/vrender/__tests__/browser/src/pages/symbol.ts +++ b/packages/vrender/__tests__/browser/src/pages/symbol.ts @@ -102,6 +102,8 @@ export const page = () => { stroke: 'black', lineWidth: 3, lineCap: 'round', + fill: 'pink', + fillStrokeOrder: 1, size: 40 }); const text = createText({ From 0f86d11255329a8140db9c186937ca29d4f73322 Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Tue, 22 Oct 2024 16:54:55 +0800 Subject: [PATCH 09/16] docs: modify comments --- packages/vrender-core/src/interface/graphic.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vrender-core/src/interface/graphic.ts b/packages/vrender-core/src/interface/graphic.ts index 722969374..63279cd60 100644 --- a/packages/vrender-core/src/interface/graphic.ts +++ b/packages/vrender-core/src/interface/graphic.ts @@ -320,7 +320,7 @@ export type IGraphicAttribute = IDebugType & globalCompositeOperation: CanvasRenderingContext2D['globalCompositeOperation'] | ''; // 完全支持滚动 | 完全不支持滚动 | 支持x方向的滚动 | 支持y方向的滚动 overflow: 'scroll' | 'hidden' | 'scroll-x' | 'scroll-y'; - // 绘制fill和stroke的顺序,为0表示fill在前,1表示stroke在前 + // 绘制fill和stroke的顺序,为0表示fill先绘制,1表示stroke先绘制 fillStrokeOrder: number; }; From 062395710156e71ead7e6ac985c4371c6825fed1 Mon Sep 17 00:00:00 2001 From: zhouxinyu Date: Wed, 23 Oct 2024 11:34:39 +0800 Subject: [PATCH 10/16] fix: convert area fillStrokeOrder strategy --- .../contributions/render/area-render.ts | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/packages/vrender-core/src/render/contributions/render/area-render.ts b/packages/vrender-core/src/render/contributions/render/area-render.ts index e52d24fa6..aed87ba04 100644 --- a/packages/vrender-core/src/render/contributions/render/area-render.ts +++ b/packages/vrender-core/src/render/contributions/render/area-render.ts @@ -71,7 +71,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph themeAttribute: IThemeAttribute ) => boolean ) { - const { points, fillStrokeOrder = areaAttribute.fillStrokeOrder } = area.attribute; + const { points } = area.attribute; if (points.length < 2) { return; } @@ -151,14 +151,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph } }; - if (!fillStrokeOrder) { - _runFill(); - _runStroke(); - } else { - _runStroke(); - _runFill(); - } - + _runFill(); this.afterRenderStep( area, context, @@ -174,6 +167,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph null, { attribute: area.attribute } ); + _runStroke(); } drawShape( @@ -550,7 +544,6 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph } // 绘制connect区域 let { connectedType, connectedX, connectedY, connectedStyle } = attribute; - const { fillStrokeOrder = (defaultAttribute as any).fillStrokeOrder } = attribute; const da: any[] = []; if (connect) { if (isArray(defaultAttribute)) { @@ -694,14 +687,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph } }; - if (!fillStrokeOrder) { - _runFill(); - _runStroke(); - } else { - _runStroke(); - _runFill(); - } - + _runFill(); this.afterRenderStep( area, context, @@ -717,6 +703,7 @@ export class DefaultCanvasAreaRender extends BaseRender implements IGraph null, { attribute } ); + _runStroke(); return ret; } From 3e9102fba7844d6a4b349218224af37da944cd33 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 14 Oct 2024 16:41:35 +0800 Subject: [PATCH 11/16] feat: support overlap priorty config --- packages/vrender-components/src/label/base.ts | 72 ++++++++++++++--- .../src/label/overlap/shiftY.ts | 80 +++++++++++++++++++ packages/vrender-components/src/label/type.ts | 43 +++++++++- 3 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 packages/vrender-components/src/label/overlap/shiftY.ts diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index c174c3657..8055edfca 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -33,7 +33,7 @@ import type { PointLocationCfg } from '../core/type'; import { labelSmartInvert, contrastAccessibilityChecker, smartInvertStrategy } from '../util/label-smartInvert'; import { createTextGraphicByType, getMarksByName, getNoneGroupMarksByName, traverseGroup } from '../util'; import { StateValue } from '../constant'; -import type { Bitmap } from './overlap'; +import type { Bitmap, BitmapTool } from './overlap'; // eslint-disable-next-line no-duplicate-imports import { bitmapTool, boundToRange, canPlace, clampText, place } from './overlap'; import type { @@ -45,12 +45,15 @@ import type { ILabelEnterAnimation, ILabelExitAnimation, ILabelUpdateAnimation, - LabelContent + LabelContent, + ShiftYStrategy, + Strategy } from './type'; import { DefaultLabelAnimation, getAnimationAttributes, updateAnimation } from './animate/animate'; import { connectLineBetweenBounds, getPointsOfLineArea } from './util'; import type { ComponentOptions } from '../interface'; import { loadLabelComponent } from './register'; +import { shiftY } from './overlap/shiftY'; loadLabelComponent(); export class LabelBase extends AbstractComponent { @@ -491,7 +494,6 @@ export class LabelBase extends AbstractComponent { return []; } const option = (isObject(this.attribute.overlap) ? this.attribute.overlap : {}) as OverlapAttrs; - const result: (IText | IRichText)[] = []; const baseMarkGroup = this.getBaseMarkGroup(); const size = option.size ?? { @@ -503,6 +505,61 @@ export class LabelBase extends AbstractComponent { return labels; } + const { strategy, priority } = option; + + const bmpTool = this._bmpTool || bitmapTool(size.width, size.height); + const bitmap = this._bitmap || bmpTool.bitmap(); + + if (priority) { + labels = labels.sort((a, b) => priority((b.attribute as any).data) - priority((a.attribute as any).data)); + } + + if ((strategy as ShiftYStrategy)?.type === 'shiftY') { + return this._overlapGlobal(labels, option, bmpTool, bitmap); + } + return this._overlapByStrategy(labels, option, bmpTool, bitmap); + } + + protected _overlapGlobal(labels: (IText | IRichText)[], option: OverlapAttrs, bmpTool: BitmapTool, bitmap: Bitmap) { + let result = labels.filter(label => label.attribute.visible && label.attribute.opacity !== 0); + const { clampForce = true, hideOnHit = true, overlapPadding, strategy } = option; + if (clampForce) { + for (let i = 0; i < result.length; i++) { + const text = labels[i] as IText | IRichText; + const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height); + if (dx !== 0 || dy !== 0) { + text.setAttributes({ x: text.attribute.x + dx, y: text.attribute.y + dy }); + } + } + } + result = shiftY(result, { + maxY: bmpTool.height, + ...(strategy as ShiftYStrategy) + }) as (IText | IRichText)[]; + + for (let i = 0; i < result.length; i++) { + const text = result[i] as IText | IRichText; + const range = boundToRange(bmpTool, text.AABBBounds, true); + if (canPlace(bmpTool, bitmap, text.AABBBounds, clampForce, overlapPadding)) { + bitmap.setRange(range); + } else { + if (hideOnHit) { + text.setAttributes({ visible: false }); + } else { + bitmap.setRange(range); + } + } + } + + return result; + } + + protected _overlapByStrategy( + labels: (IText | IRichText)[], + option: OverlapAttrs, + bmpTool: BitmapTool, + bitmap: Bitmap + ) { const { avoidBaseMark, strategy = [], @@ -511,10 +568,9 @@ export class LabelBase extends AbstractComponent { avoidMarks = [], overlapPadding } = option; - const bmpTool = this._bmpTool || bitmapTool(size.width, size.height); - const bitmap = this._bitmap || bmpTool.bitmap(); - const checkBounds = strategy.some(s => s.type === 'bound'); + const result: (IText | IRichText)[] = []; + const checkBounds = (strategy as Strategy[]).some(s => s.type === 'bound'); // 躲避关联的基础图元 if (avoidBaseMark) { this._baseMarks?.forEach(mark => { @@ -546,7 +602,6 @@ export class LabelBase extends AbstractComponent { if (!isRectIntersect(baseMark.AABBBounds, { x1: 0, x2: bmpTool.width, y1: 0, y2: bmpTool.height }, true)) { continue; } - // 默认位置可以放置 if (canPlace(bmpTool, bitmap, text.AABBBounds, clampForce, overlapPadding)) { // 如果配置了限制在图形内部,需要提前判断; @@ -570,7 +625,7 @@ export class LabelBase extends AbstractComponent { let hasPlace: ReturnType = false; // 发生碰撞,根据策略寻找可放置的位置 - for (let j = 0; j < strategy.length; j++) { + for (let j = 0; j < (strategy as Strategy[]).length; j++) { hasPlace = place( bmpTool, bitmap, @@ -622,7 +677,6 @@ export class LabelBase extends AbstractComponent { !hasPlace && !hideOnHit && result.push(text); } - return result; } diff --git a/packages/vrender-components/src/label/overlap/shiftY.ts b/packages/vrender-components/src/label/overlap/shiftY.ts new file mode 100644 index 000000000..b10e2fbc0 --- /dev/null +++ b/packages/vrender-components/src/label/overlap/shiftY.ts @@ -0,0 +1,80 @@ +import type { IText } from '@visactor/vrender-core'; + +function useMap() { + const map = new Map(); + const get = (key: K) => map.get(key) as V; + const set = (key: K, value: V) => map.set(key, value); + return [get, set] as const; +} + +export interface IShiftYOption { + maxIterations?: number; + maxError?: number; + padding?: number; + maxY?: number; +} + +export function shiftY(texts: IText[], option: IShiftYOption = {}) { + const { maxIterations = 10, maxError = 0.1, padding = 1, maxY = Number.MAX_VALUE } = option; + + const n = texts.length; + if (n <= 1) { + return texts; + } + + const isIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => { + return d > a && b > c; + }; + + const [y0, setY0] = useMap(); + const [y, setY] = useMap(); + const [h, setH] = useMap(); + const [xx, setXX] = useMap(); + for (const text of texts) { + const { y1, y2, x1, x2 } = text.AABBBounds; + setY0(text, y1); + setY(text, y1); + setH(text, y2 - y1); + setXX(text, [x1, x2]); + } + for (let iter = 0; iter < maxIterations; iter++) { + texts.sort((a, b) => (y(a) as number) - (y(b) as number)); + let error = 0; + for (let i = 0; i < n - 1; i++) { + const l0 = texts[i]; + let j = i + 1; + let l1; + while ((l1 = texts[j]) && !isIntersect(xx(l0) as any, xx(l1) as any)) { + j += 1; + } + if (l1) { + const y0 = y(l0); + const h0 = h(l0); + const y1 = y(l1); + const delta = y1 - (y0 + h0); + if (delta < padding) { + const newDelta = (padding - delta) / 2; + error = Math.max(error, newDelta); + if (y1 + newDelta + h(l1) > maxY) { + setY(l0, y0 - (padding - delta)); + } else if (y0 - newDelta < 0) { + setY(l1, y1 + (padding - delta)); + } else { + setY(l0, y0 - newDelta); + setY(l1, y1 + newDelta); + } + } + } + } + if (error < maxError) { + break; + } + } + + for (const text of texts) { + const finalY = (text.attribute.y as number) + y(text) - y0(text); + text.setAttribute('y', finalY); + } + + return texts; +} diff --git a/packages/vrender-components/src/label/type.ts b/packages/vrender-components/src/label/type.ts index 15ab9dc36..450c58254 100644 --- a/packages/vrender-components/src/label/type.ts +++ b/packages/vrender-components/src/label/type.ts @@ -179,14 +179,23 @@ export interface OverlapAttrs { /** * 发生重叠后的躲避策略 + * @since 0.20.9支持全局 Y 方向偏移策略 'shiftY'。当标签发生重叠时,会保相对位置并在 Y 方向上散开。由于 'shiftY' 是全局布局策略,不与其他策略同时生效。 */ - strategy?: Strategy[]; + strategy?: Strategy[] | ShiftYStrategy; /** * 文字在防重叠计算中预留的边距。 * @default 0 */ overlapPadding?: number; + + /** + * 防重叠的顺序权重 + * @since 0.20.9 + * @param labelItem + * @returns number 数值越大,权重越高。权重越高的标签越优先被布局。 + */ + priority?: (labelItem: LabelItem) => number; } export interface SmartInvertAttrs { @@ -253,6 +262,25 @@ export interface SmartInvertAttrs { interactInvertType?: 'none' | 'stroked' | 'inside'; } +export type ShiftYStrategy = { + type: 'shiftY'; + /** + * 布局迭代次数 + * @default 10 + */ + iteration?: number; + /** + * 布局容差 + * @default 0.1 + */ + maxError?: number; + /** + * 散开后的间距 + * @default 1 + */ + padding?: number; +}; + export type PositionStrategy = { /** * 可选位置策略。 @@ -295,6 +323,17 @@ export type MoveXStrategy = { offset: Functional; }; +export type DodgeYStrategy = { + /** + * 整体布局,发生重叠后在 Y 方向上散开。 + * + */ + type: 'dodgeY'; + padding?: number; + iteration?: number; + maxError?: number; +}; + export type Strategy = PositionStrategy | BoundStrategy | MoveYStrategy | MoveXStrategy; export type LabelPosition = SymbolLabelAttrs['position'] | RectLabelAttrs['position']; @@ -497,6 +536,8 @@ export interface DataLabelAttrs extends IGroupGraphicAttribute { * 防重叠的区域大小 */ size: { width: number; height: number; padding?: { top?: number; left?: number; right?: number; bottom?: number } }; + + overlapStrategy?: 'default' | 'global'; } export type Functional = T | ((data: any) => T); From d4bc984625c0002f9278eefb36f32bdbd1168cf8 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Mon, 14 Oct 2024 16:43:54 +0800 Subject: [PATCH 12/16] fix: fix type error --- packages/vrender-components/src/label/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index 8055edfca..88b26a95f 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -532,7 +532,7 @@ export class LabelBase extends AbstractComponent { } } } - result = shiftY(result, { + result = shiftY(result as any, { maxY: bmpTool.height, ...(strategy as ShiftYStrategy) }) as (IText | IRichText)[]; From f2439c28acc62732dc17b672b870111178bcbd7b Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Tue, 15 Oct 2024 11:29:21 +0800 Subject: [PATCH 13/16] refactor: optimize code --- packages/vrender-components/src/label/base.ts | 14 ++--- .../src/label/overlap/shiftY.ts | 63 ++++++++++--------- packages/vrender-components/src/label/type.ts | 13 ---- 3 files changed, 40 insertions(+), 50 deletions(-) diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index 88b26a95f..7b1a93f99 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -525,22 +525,20 @@ export class LabelBase extends AbstractComponent { const { clampForce = true, hideOnHit = true, overlapPadding, strategy } = option; if (clampForce) { for (let i = 0; i < result.length; i++) { - const text = labels[i] as IText | IRichText; + const text = labels[i]; const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height); if (dx !== 0 || dy !== 0) { text.setAttributes({ x: text.attribute.x + dx, y: text.attribute.y + dy }); } } } - result = shiftY(result as any, { - maxY: bmpTool.height, - ...(strategy as ShiftYStrategy) - }) as (IText | IRichText)[]; + result = shiftY(result as any, { maxY: bmpTool.height, ...(strategy as ShiftYStrategy) }); for (let i = 0; i < result.length; i++) { - const text = result[i] as IText | IRichText; - const range = boundToRange(bmpTool, text.AABBBounds, true); - if (canPlace(bmpTool, bitmap, text.AABBBounds, clampForce, overlapPadding)) { + const text = result[i]; + const bounds = text.AABBBounds; + const range = boundToRange(bmpTool, bounds, true); + if (canPlace(bmpTool, bitmap, bounds, clampForce, overlapPadding)) { bitmap.setRange(range); } else { if (hideOnHit) { diff --git a/packages/vrender-components/src/label/overlap/shiftY.ts b/packages/vrender-components/src/label/overlap/shiftY.ts index b10e2fbc0..24b090567 100644 --- a/packages/vrender-components/src/label/overlap/shiftY.ts +++ b/packages/vrender-components/src/label/overlap/shiftY.ts @@ -1,12 +1,5 @@ import type { IText } from '@visactor/vrender-core'; -function useMap() { - const map = new Map(); - const get = (key: K) => map.get(key) as V; - const set = (key: K, value: V) => map.set(key, value); - return [get, set] as const; -} - export interface IShiftYOption { maxIterations?: number; maxError?: number; @@ -26,42 +19,54 @@ export function shiftY(texts: IText[], option: IShiftYOption = {}) { return d > a && b > c; }; - const [y0, setY0] = useMap(); - const [y, setY] = useMap(); - const [h, setH] = useMap(); - const [xx, setXX] = useMap(); + const textInformation = new Map(); + + // y0 : 初始位置 + // y : 最终位置 + // height : 高度 + // x1, x2 : 左右边界 + const getY0 = (text: IText) => textInformation.get(text).y0; + const getY = (text: IText) => textInformation.get(text).y; + const getHeight = (text: IText) => textInformation.get(text).height; + const getX1 = (text: IText) => textInformation.get(text).x1; + const getX2 = (text: IText) => textInformation.get(text).x2; + const setY = (text: IText, y: number) => { + textInformation.get(text).y = y; + }; + for (const text of texts) { const { y1, y2, x1, x2 } = text.AABBBounds; - setY0(text, y1); - setY(text, y1); - setH(text, y2 - y1); - setXX(text, [x1, x2]); + textInformation.set(text, { y0: y1, y: y1, height: y2 - y1, x1, x2 }); } + for (let iter = 0; iter < maxIterations; iter++) { - texts.sort((a, b) => (y(a) as number) - (y(b) as number)); + texts.sort((a, b) => getY(a) - getY(b)); let error = 0; for (let i = 0; i < n - 1; i++) { - const l0 = texts[i]; + const curText = texts[i]; let j = i + 1; - let l1; - while ((l1 = texts[j]) && !isIntersect(xx(l0) as any, xx(l1) as any)) { + let nextText; + while ( + (nextText = texts[j]) && + !isIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)]) + ) { j += 1; } - if (l1) { - const y0 = y(l0); - const h0 = h(l0); - const y1 = y(l1); + if (nextText) { + const y0 = getY(curText); + const h0 = getHeight(curText); + const y1 = getY(nextText); const delta = y1 - (y0 + h0); if (delta < padding) { const newDelta = (padding - delta) / 2; error = Math.max(error, newDelta); - if (y1 + newDelta + h(l1) > maxY) { - setY(l0, y0 - (padding - delta)); + if (y1 + newDelta + getHeight(nextText) > maxY) { + setY(curText, y0 - (padding - delta)); } else if (y0 - newDelta < 0) { - setY(l1, y1 + (padding - delta)); + setY(nextText, y1 + (padding - delta)); } else { - setY(l0, y0 - newDelta); - setY(l1, y1 + newDelta); + setY(curText, y0 - newDelta); + setY(nextText, y1 + newDelta); } } } @@ -72,7 +77,7 @@ export function shiftY(texts: IText[], option: IShiftYOption = {}) { } for (const text of texts) { - const finalY = (text.attribute.y as number) + y(text) - y0(text); + const finalY = text.attribute.y + getY(text) - getY0(text); text.setAttribute('y', finalY); } diff --git a/packages/vrender-components/src/label/type.ts b/packages/vrender-components/src/label/type.ts index 450c58254..0c4688728 100644 --- a/packages/vrender-components/src/label/type.ts +++ b/packages/vrender-components/src/label/type.ts @@ -323,17 +323,6 @@ export type MoveXStrategy = { offset: Functional; }; -export type DodgeYStrategy = { - /** - * 整体布局,发生重叠后在 Y 方向上散开。 - * - */ - type: 'dodgeY'; - padding?: number; - iteration?: number; - maxError?: number; -}; - export type Strategy = PositionStrategy | BoundStrategy | MoveYStrategy | MoveXStrategy; export type LabelPosition = SymbolLabelAttrs['position'] | RectLabelAttrs['position']; @@ -536,8 +525,6 @@ export interface DataLabelAttrs extends IGroupGraphicAttribute { * 防重叠的区域大小 */ size: { width: number; height: number; padding?: { top?: number; left?: number; right?: number; bottom?: number } }; - - overlapStrategy?: 'default' | 'global'; } export type Functional = T | ((data: any) => T); From a97c13041c1323a5e75d8a6a868be77beb8ab105 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Wed, 23 Oct 2024 14:23:21 +0800 Subject: [PATCH 14/16] fix: label visible judgement --- packages/vrender-components/src/label/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index 7b1a93f99..082be58b2 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -590,7 +590,7 @@ export class LabelBase extends AbstractComponent { } for (let i = 0; i < labels.length; i++) { - if (labels[i].visible === false) { + if (labels[i].attribute.visible === false) { continue; } From 68e08d1f76080b32f0c80c8c476a769bfa70f6d6 Mon Sep 17 00:00:00 2001 From: xiaoluoHe Date: Wed, 23 Oct 2024 14:24:17 +0800 Subject: [PATCH 15/16] docs: update since version --- packages/vrender-components/src/label/type.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vrender-components/src/label/type.ts b/packages/vrender-components/src/label/type.ts index 0c4688728..53006cf99 100644 --- a/packages/vrender-components/src/label/type.ts +++ b/packages/vrender-components/src/label/type.ts @@ -179,7 +179,7 @@ export interface OverlapAttrs { /** * 发生重叠后的躲避策略 - * @since 0.20.9支持全局 Y 方向偏移策略 'shiftY'。当标签发生重叠时,会保相对位置并在 Y 方向上散开。由于 'shiftY' 是全局布局策略,不与其他策略同时生效。 + * @since 0.20.10 支持全局 Y 方向偏移策略 'shiftY'。当标签发生重叠时,会保相对位置并在 Y 方向上散开。由于 'shiftY' 是全局布局策略,不与其他策略同时生效。 */ strategy?: Strategy[] | ShiftYStrategy; @@ -191,7 +191,7 @@ export interface OverlapAttrs { /** * 防重叠的顺序权重 - * @since 0.20.9 + * @since 0.20.10 * @param labelItem * @returns number 数值越大,权重越高。权重越高的标签越优先被布局。 */ From b008ce1151a2d965999e44f3f8eaa6e177fd8bce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 08:41:53 +0000 Subject: [PATCH 16/16] build: prelease version 0.20.10 --- ...at-fill-stroke-order_2024-10-22-08-48.json | 10 ------- .../fix-path-move_2024-10-22-07-57.json | 10 ------- .../fix-subview-check_2024-10-21-03-36.json | 10 ------- common/config/rush/pnpm-lock.yaml | 26 +++++++++---------- common/config/rush/version-policies.json | 2 +- docs/package.json | 2 +- packages/react-vrender-utils/CHANGELOG.json | 6 +++++ packages/react-vrender-utils/CHANGELOG.md | 7 ++++- packages/react-vrender-utils/package.json | 6 ++--- packages/react-vrender/CHANGELOG.json | 6 +++++ packages/react-vrender/CHANGELOG.md | 7 ++++- packages/react-vrender/package.json | 4 +-- packages/vrender-components/CHANGELOG.json | 6 +++++ packages/vrender-components/CHANGELOG.md | 7 ++++- packages/vrender-components/package.json | 6 ++--- packages/vrender-core/CHANGELOG.json | 18 +++++++++++++ packages/vrender-core/CHANGELOG.md | 11 +++++++- packages/vrender-core/package.json | 2 +- packages/vrender-kits/CHANGELOG.json | 6 +++++ packages/vrender-kits/CHANGELOG.md | 7 ++++- packages/vrender-kits/package.json | 4 +-- packages/vrender/CHANGELOG.json | 6 +++++ packages/vrender/CHANGELOG.md | 7 ++++- packages/vrender/package.json | 6 ++--- tools/bugserver-trigger/package.json | 8 +++--- 25 files changed, 121 insertions(+), 69 deletions(-) delete mode 100644 common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json delete mode 100644 common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json delete mode 100644 common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json diff --git a/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json b/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json deleted file mode 100644 index 7ef79d431..000000000 --- a/common/changes/@visactor/vrender-core/feat-fill-stroke-order_2024-10-22-08-48.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@visactor/vrender-core", - "comment": "feat: support fillStrokeOrder, closed #1505", - "type": "none" - } - ], - "packageName": "@visactor/vrender-core" -} \ No newline at end of file diff --git a/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json b/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json deleted file mode 100644 index 2765a8289..000000000 --- a/common/changes/@visactor/vrender-core/fix-path-move_2024-10-22-07-57.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@visactor/vrender-core", - "comment": "fix: fix issue with parse m where multi pos follow, closed #1490", - "type": "none" - } - ], - "packageName": "@visactor/vrender-core" -} \ No newline at end of file diff --git a/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json b/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json deleted file mode 100644 index cc67be1e3..000000000 --- a/common/changes/@visactor/vrender-core/fix-subview-check_2024-10-21-03-36.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "changes": [ - { - "packageName": "@visactor/vrender-core", - "comment": "fix: fix the accuracy issue of number matching, closed #1488", - "type": "none" - } - ], - "packageName": "@visactor/vrender-core" -} \ No newline at end of file diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 817588127..06038dc61 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: '@types/react-dom': ^18.0.0 '@visactor/vchart': 1.3.0 '@visactor/vgrammar': ~0.5.7 - '@visactor/vrender': workspace:0.20.9 + '@visactor/vrender': workspace:0.20.10 '@visactor/vutils': ~0.18.17 '@vitejs/plugin-react': 3.1.0 axios: ^1.4.0 @@ -71,7 +71,7 @@ importers: '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 '@types/react-reconciler': ^0.28.2 - '@visactor/vrender': workspace:0.20.9 + '@visactor/vrender': workspace:0.20.10 '@visactor/vutils': ~0.18.17 '@vitejs/plugin-react': 3.1.0 cross-env: ^7.0.3 @@ -111,8 +111,8 @@ importers: '@rushstack/eslint-patch': ~1.1.4 '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 - '@visactor/react-vrender': workspace:0.20.9 - '@visactor/vrender': workspace:0.20.9 + '@visactor/react-vrender': workspace:0.20.10 + '@visactor/vrender': workspace:0.20.10 '@visactor/vutils': ~0.18.17 '@vitejs/plugin-react': 3.1.0 cross-env: ^7.0.3 @@ -153,8 +153,8 @@ importers: '@types/jest': ^26.0.0 '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 - '@visactor/vrender-core': workspace:0.20.9 - '@visactor/vrender-kits': workspace:0.20.9 + '@visactor/vrender-core': workspace:0.20.10 + '@visactor/vrender-kits': workspace:0.20.10 '@visactor/vutils': ~0.18.17 '@vitejs/plugin-react': 3.1.0 canvas: 2.11.2 @@ -200,8 +200,8 @@ importers: '@internal/ts-config': workspace:* '@rushstack/eslint-patch': ~1.1.4 '@types/jest': ^26.0.0 - '@visactor/vrender-core': workspace:0.20.9 - '@visactor/vrender-kits': workspace:0.20.9 + '@visactor/vrender-core': workspace:0.20.10 + '@visactor/vrender-kits': workspace:0.20.10 '@visactor/vscale': ~0.18.17 '@visactor/vutils': ~0.18.17 cross-env: ^7.0.3 @@ -287,7 +287,7 @@ importers: '@types/node-fetch': 2.6.4 '@types/react': ^18.0.0 '@types/react-dom': ^18.0.0 - '@visactor/vrender-core': workspace:0.20.9 + '@visactor/vrender-core': workspace:0.20.10 '@visactor/vutils': ~0.18.17 '@vitejs/plugin-react': 3.1.0 canvas: 2.11.2 @@ -369,10 +369,10 @@ importers: '@rushstack/eslint-patch': ~1.1.4 '@types/node': '*' '@types/node-fetch': 2.6.4 - '@visactor/vrender': workspace:0.20.9 - '@visactor/vrender-components': workspace:0.20.9 - '@visactor/vrender-core': workspace:0.20.9 - '@visactor/vrender-kits': workspace:0.20.9 + '@visactor/vrender': workspace:0.20.10 + '@visactor/vrender-components': workspace:0.20.10 + '@visactor/vrender-core': workspace:0.20.10 + '@visactor/vrender-kits': workspace:0.20.10 cross-env: ^7.0.3 eslint: ~8.18.0 form-data: ~4.0.0 diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json index b14988c71..d5b6d4a32 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -1 +1 @@ -[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"0.20.9","nextBump":"patch"}] +[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"0.20.10","nextBump":"patch"}] diff --git a/docs/package.json b/docs/package.json index c73efafa9..0409ac301 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,7 +13,7 @@ "@visactor/vchart": "1.3.0", "@visactor/vutils": "~0.18.17", "@visactor/vgrammar": "~0.5.7", - "@visactor/vrender": "workspace:0.20.9", + "@visactor/vrender": "workspace:0.20.10", "markdown-it": "^13.0.0", "highlight.js": "^11.8.0", "axios": "^1.4.0", diff --git a/packages/react-vrender-utils/CHANGELOG.json b/packages/react-vrender-utils/CHANGELOG.json index b618cf023..c354be9ae 100644 --- a/packages/react-vrender-utils/CHANGELOG.json +++ b/packages/react-vrender-utils/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/react-vrender-utils", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/react-vrender-utils_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": {} + }, { "version": "0.20.9", "tag": "@visactor/react-vrender-utils_v0.20.9", diff --git a/packages/react-vrender-utils/CHANGELOG.md b/packages/react-vrender-utils/CHANGELOG.md index b105880eb..ec5e36bf0 100644 --- a/packages/react-vrender-utils/CHANGELOG.md +++ b/packages/react-vrender-utils/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @visactor/react-vrender-utils -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +_Version update only_ ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/react-vrender-utils/package.json b/packages/react-vrender-utils/package.json index 8bbdb1f6c..cb94cf187 100644 --- a/packages/react-vrender-utils/package.json +++ b/packages/react-vrender-utils/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/react-vrender-utils", - "version": "0.20.9", + "version": "0.20.10", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -24,8 +24,8 @@ "react-dom": "^18.2.0" }, "dependencies": { - "@visactor/vrender": "workspace:0.20.9", - "@visactor/react-vrender": "workspace:0.20.9", + "@visactor/vrender": "workspace:0.20.10", + "@visactor/react-vrender": "workspace:0.20.10", "@visactor/vutils": "~0.18.17", "react-reconciler": "^0.29.0", "tslib": "^2.3.1" diff --git a/packages/react-vrender/CHANGELOG.json b/packages/react-vrender/CHANGELOG.json index 5e1e2b1a1..f7ecfed18 100644 --- a/packages/react-vrender/CHANGELOG.json +++ b/packages/react-vrender/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/react-vrender", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/react-vrender_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": {} + }, { "version": "0.20.9", "tag": "@visactor/react-vrender_v0.20.9", diff --git a/packages/react-vrender/CHANGELOG.md b/packages/react-vrender/CHANGELOG.md index dd52783fc..9448844bb 100644 --- a/packages/react-vrender/CHANGELOG.md +++ b/packages/react-vrender/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @visactor/react-vrender -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +_Version update only_ ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/react-vrender/package.json b/packages/react-vrender/package.json index e466816fe..3b90ce5e1 100644 --- a/packages/react-vrender/package.json +++ b/packages/react-vrender/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/react-vrender", - "version": "0.20.9", + "version": "0.20.10", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -23,7 +23,7 @@ "react": "^18.2.0" }, "dependencies": { - "@visactor/vrender": "workspace:0.20.9", + "@visactor/vrender": "workspace:0.20.10", "@visactor/vutils": "~0.18.17", "react-reconciler": "^0.29.0", "tslib": "^2.3.1" diff --git a/packages/vrender-components/CHANGELOG.json b/packages/vrender-components/CHANGELOG.json index 6a77e1fe3..c723e26e6 100644 --- a/packages/vrender-components/CHANGELOG.json +++ b/packages/vrender-components/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/vrender-components", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/vrender-components_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": {} + }, { "version": "0.20.9", "tag": "@visactor/vrender-components_v0.20.9", diff --git a/packages/vrender-components/CHANGELOG.md b/packages/vrender-components/CHANGELOG.md index 61d6f785b..3dd5e99a2 100644 --- a/packages/vrender-components/CHANGELOG.md +++ b/packages/vrender-components/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @visactor/vrender-components -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +_Version update only_ ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/vrender-components/package.json b/packages/vrender-components/package.json index b3f7b5994..0fbba3785 100644 --- a/packages/vrender-components/package.json +++ b/packages/vrender-components/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-components", - "version": "0.20.9", + "version": "0.20.10", "description": "components library for dp visualization", "sideEffects": false, "main": "cjs/index.js", @@ -26,8 +26,8 @@ "dependencies": { "@visactor/vutils": "~0.18.17", "@visactor/vscale": "~0.18.17", - "@visactor/vrender-core": "workspace:0.20.9", - "@visactor/vrender-kits": "workspace:0.20.9" + "@visactor/vrender-core": "workspace:0.20.10", + "@visactor/vrender-kits": "workspace:0.20.10" }, "devDependencies": { "@internal/bundler": "workspace:*", diff --git a/packages/vrender-core/CHANGELOG.json b/packages/vrender-core/CHANGELOG.json index 294bb20d9..9ddc2e2a6 100644 --- a/packages/vrender-core/CHANGELOG.json +++ b/packages/vrender-core/CHANGELOG.json @@ -1,6 +1,24 @@ { "name": "@visactor/vrender-core", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/vrender-core_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": { + "none": [ + { + "comment": "feat: support fillStrokeOrder, closed #1505" + }, + { + "comment": "fix: fix issue with parse m where multi pos follow, closed #1490" + }, + { + "comment": "fix: fix the accuracy issue of number matching, closed #1488" + } + ] + } + }, { "version": "0.20.9", "tag": "@visactor/vrender-core_v0.20.9", diff --git a/packages/vrender-core/CHANGELOG.md b/packages/vrender-core/CHANGELOG.md index e5bb94a7b..9b75a753d 100644 --- a/packages/vrender-core/CHANGELOG.md +++ b/packages/vrender-core/CHANGELOG.md @@ -1,6 +1,15 @@ # Change Log - @visactor/vrender-core -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +### Updates + +- feat: support fillStrokeOrder, closed #1505 +- fix: fix issue with parse m where multi pos follow, closed #1490 +- fix: fix the accuracy issue of number matching, closed #1488 ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/vrender-core/package.json b/packages/vrender-core/package.json index bc1fc2927..7534136dc 100644 --- a/packages/vrender-core/package.json +++ b/packages/vrender-core/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-core", - "version": "0.20.9", + "version": "0.20.10", "description": "", "sideEffects": [ "./src/modules.ts", diff --git a/packages/vrender-kits/CHANGELOG.json b/packages/vrender-kits/CHANGELOG.json index d49b964ac..9d6bd8a31 100644 --- a/packages/vrender-kits/CHANGELOG.json +++ b/packages/vrender-kits/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/vrender-kits", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/vrender-kits_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": {} + }, { "version": "0.20.9", "tag": "@visactor/vrender-kits_v0.20.9", diff --git a/packages/vrender-kits/CHANGELOG.md b/packages/vrender-kits/CHANGELOG.md index 27b3fb110..09bb362b0 100644 --- a/packages/vrender-kits/CHANGELOG.md +++ b/packages/vrender-kits/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @visactor/vrender-kits -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +_Version update only_ ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/vrender-kits/package.json b/packages/vrender-kits/package.json index f31c24184..4dc2af2f8 100644 --- a/packages/vrender-kits/package.json +++ b/packages/vrender-kits/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-kits", - "version": "0.20.9", + "version": "0.20.10", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -21,7 +21,7 @@ }, "dependencies": { "@visactor/vutils": "~0.18.17", - "@visactor/vrender-core": "workspace:0.20.9", + "@visactor/vrender-core": "workspace:0.20.10", "@resvg/resvg-js": "2.4.1", "roughjs": "4.5.2" }, diff --git a/packages/vrender/CHANGELOG.json b/packages/vrender/CHANGELOG.json index b316b8114..5176ad52d 100644 --- a/packages/vrender/CHANGELOG.json +++ b/packages/vrender/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/vrender", "entries": [ + { + "version": "0.20.10", + "tag": "@visactor/vrender_v0.20.10", + "date": "Wed, 23 Oct 2024 08:37:33 GMT", + "comments": {} + }, { "version": "0.20.9", "tag": "@visactor/vrender_v0.20.9", diff --git a/packages/vrender/CHANGELOG.md b/packages/vrender/CHANGELOG.md index 35ca580b2..041d27e94 100644 --- a/packages/vrender/CHANGELOG.md +++ b/packages/vrender/CHANGELOG.md @@ -1,6 +1,11 @@ # Change Log - @visactor/vrender -This log was last generated on Tue, 15 Oct 2024 03:50:15 GMT and should not be manually modified. +This log was last generated on Wed, 23 Oct 2024 08:37:33 GMT and should not be manually modified. + +## 0.20.10 +Wed, 23 Oct 2024 08:37:33 GMT + +_Version update only_ ## 0.20.9 Tue, 15 Oct 2024 03:50:15 GMT diff --git a/packages/vrender/package.json b/packages/vrender/package.json index fc16f3f3e..9718256b6 100644 --- a/packages/vrender/package.json +++ b/packages/vrender/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender", - "version": "0.20.9", + "version": "0.20.10", "description": "", "sideEffects": true, "main": "cjs/index.js", @@ -24,8 +24,8 @@ "test-watch": "cross-env DEBUG_MODE=1 jest --watch" }, "dependencies": { - "@visactor/vrender-core": "workspace:0.20.9", - "@visactor/vrender-kits": "workspace:0.20.9" + "@visactor/vrender-core": "workspace:0.20.10", + "@visactor/vrender-kits": "workspace:0.20.10" }, "devDependencies": { "@internal/bundler": "workspace:*", diff --git a/tools/bugserver-trigger/package.json b/tools/bugserver-trigger/package.json index 84cee3fbe..ce6bab629 100644 --- a/tools/bugserver-trigger/package.json +++ b/tools/bugserver-trigger/package.json @@ -8,10 +8,10 @@ "ci": "ts-node --transpileOnly --skipProject ./scripts/trigger-test.ts" }, "dependencies": { - "@visactor/vrender": "workspace:0.20.9", - "@visactor/vrender-core": "workspace:0.20.9", - "@visactor/vrender-kits": "workspace:0.20.9", - "@visactor/vrender-components": "workspace:0.20.9" + "@visactor/vrender": "workspace:0.20.10", + "@visactor/vrender-core": "workspace:0.20.10", + "@visactor/vrender-kits": "workspace:0.20.10", + "@visactor/vrender-components": "workspace:0.20.10" }, "devDependencies": { "@rushstack/eslint-patch": "~1.1.4",