diff --git a/.gitignore b/.gitignore index 1400f09a7..592fd6d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -96,3 +96,6 @@ docs/demos/src/node/image.png # generated documents docs/public/documents + +spec-types +*.tsbuildinfo diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 7f2f36628..a2479c883 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.15 + '@visactor/vrender': workspace:0.20.16 '@visactor/vutils': ~0.18.18 '@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.15 + '@visactor/vrender': workspace:0.20.16 '@visactor/vutils': ~0.18.18 '@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.15 - '@visactor/vrender': workspace:0.20.15 + '@visactor/react-vrender': workspace:0.20.16 + '@visactor/vrender': workspace:0.20.16 '@visactor/vutils': ~0.18.18 '@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.15 - '@visactor/vrender-kits': workspace:0.20.15 + '@visactor/vrender-core': workspace:0.20.16 + '@visactor/vrender-kits': workspace:0.20.16 '@visactor/vutils': ~0.18.18 '@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.15 - '@visactor/vrender-kits': workspace:0.20.15 + '@visactor/vrender-core': workspace:0.20.16 + '@visactor/vrender-kits': workspace:0.20.16 '@visactor/vscale': ~0.18.18 '@visactor/vutils': ~0.18.18 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.15 + '@visactor/vrender-core': workspace:0.20.16 '@visactor/vutils': ~0.18.18 '@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.15 - '@visactor/vrender-components': workspace:0.20.15 - '@visactor/vrender-core': workspace:0.20.15 - '@visactor/vrender-kits': workspace:0.20.15 + '@visactor/vrender': workspace:0.20.16 + '@visactor/vrender-components': workspace:0.20.16 + '@visactor/vrender-core': workspace:0.20.16 + '@visactor/vrender-kits': workspace:0.20.16 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 c84da51d1..4d35d32f8 100644 --- a/common/config/rush/version-policies.json +++ b/common/config/rush/version-policies.json @@ -1 +1 @@ -[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"0.20.15","nextBump":"patch"}] +[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"0.20.16","nextBump":"patch"}] diff --git a/docs/assets/changelog/en/changelog.md b/docs/assets/changelog/en/changelog.md index e263f9080..91f793d4b 100644 --- a/docs/assets/changelog/en/changelog.md +++ b/docs/assets/changelog/en/changelog.md @@ -1,3 +1,20 @@ +# v0.20.15 + +2024-11-21 + + +**🆕 New feature** + +- **@visactor/vrender-core**: support keepStrokeScale + +**🐛 Bug fix** + +- **@visactor/vrender-kits**: fix press in andiord + + + +[more detail about v0.20.15](https://github.com/VisActor/VRender/releases/tag/v0.20.15) + # v0.20.14 2024-11-13 diff --git a/docs/assets/changelog/zh/changelog.md b/docs/assets/changelog/zh/changelog.md index d10fd3ac0..fd528f80e 100644 --- a/docs/assets/changelog/zh/changelog.md +++ b/docs/assets/changelog/zh/changelog.md @@ -1,3 +1,20 @@ +# v0.20.15 + +2024-11-21 + + +**🆕 新增功能** + +- **@visactor/vrender-core**: support keepStrokeScale + +**🐛 功能修复** + +- **@visactor/vrender-kits**: fix press in andiord + + + +[更多详情请查看 v0.20.15](https://github.com/VisActor/VRender/releases/tag/v0.20.15) + # v0.20.14 2024-11-13 diff --git a/docs/package.json b/docs/package.json index 1659d51a1..6e8981852 100644 --- a/docs/package.json +++ b/docs/package.json @@ -13,7 +13,7 @@ "@visactor/vchart": "1.3.0", "@visactor/vutils": "~0.18.18", "@visactor/vgrammar": "~0.5.7", - "@visactor/vrender": "workspace:0.20.15", + "@visactor/vrender": "workspace:0.20.16", "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 1409ba4cb..2eecc39e8 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.16", + "tag": "@visactor/react-vrender-utils_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": {} + }, { "version": "0.20.15", "tag": "@visactor/react-vrender-utils_v0.20.15", diff --git a/packages/react-vrender-utils/CHANGELOG.md b/packages/react-vrender-utils/CHANGELOG.md index 411f782c6..109741940 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 Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +_Version update only_ ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/react-vrender-utils/package.json b/packages/react-vrender-utils/package.json index 8246d622a..d7a5e79c4 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.15", + "version": "0.20.16", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -24,8 +24,8 @@ "react-dom": "^18.2.0" }, "dependencies": { - "@visactor/vrender": "workspace:0.20.15", - "@visactor/react-vrender": "workspace:0.20.15", + "@visactor/vrender": "workspace:0.20.16", + "@visactor/react-vrender": "workspace:0.20.16", "@visactor/vutils": "~0.18.18", "react-reconciler": "^0.29.0", "tslib": "^2.3.1" diff --git a/packages/react-vrender/CHANGELOG.json b/packages/react-vrender/CHANGELOG.json index 4f9bb1534..2a1f3ad45 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.16", + "tag": "@visactor/react-vrender_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": {} + }, { "version": "0.20.15", "tag": "@visactor/react-vrender_v0.20.15", diff --git a/packages/react-vrender/CHANGELOG.md b/packages/react-vrender/CHANGELOG.md index 8bdf4e09f..0a8a53be3 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 Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +_Version update only_ ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/react-vrender/package.json b/packages/react-vrender/package.json index f96bf02bb..1c778f9ff 100644 --- a/packages/react-vrender/package.json +++ b/packages/react-vrender/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/react-vrender", - "version": "0.20.15", + "version": "0.20.16", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -23,7 +23,7 @@ "react": "^18.2.0" }, "dependencies": { - "@visactor/vrender": "workspace:0.20.15", + "@visactor/vrender": "workspace:0.20.16", "@visactor/vutils": "~0.18.18", "react-reconciler": "^0.29.0", "tslib": "^2.3.1" diff --git a/packages/vrender-components/CHANGELOG.json b/packages/vrender-components/CHANGELOG.json index 40b238d62..ee02cbe13 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.16", + "tag": "@visactor/vrender-components_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": {} + }, { "version": "0.20.15", "tag": "@visactor/vrender-components_v0.20.15", diff --git a/packages/vrender-components/CHANGELOG.md b/packages/vrender-components/CHANGELOG.md index 4719edd20..677537a3a 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 Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +_Version update only_ ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/vrender-components/package.json b/packages/vrender-components/package.json index 5c16d6f99..6b6b90941 100644 --- a/packages/vrender-components/package.json +++ b/packages/vrender-components/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-components", - "version": "0.20.15", + "version": "0.20.16", "description": "components library for dp visualization", "sideEffects": false, "main": "cjs/index.js", @@ -21,13 +21,14 @@ "test-cov": "jest --coverage", "test-live": "npm run test-watch __tests__/unit/", "test-watch": "cross-env DEBUG_MODE=1 jest --watch", - "analysis-core": "cross-env DEBUG='Bundler*' bundle -f umd -a -i core.ts" + "analysis-core": "cross-env DEBUG='Bundler*' bundle -f umd -a -i core.ts", + "build:spec-types": "rm -rf ./spec-types && tsc -p ./tsconfig.spec.json --declaration --emitDeclarationOnly --outDir ./spec-types" }, "dependencies": { "@visactor/vutils": "~0.18.18", "@visactor/vscale": "~0.18.18", - "@visactor/vrender-core": "workspace:0.20.15", - "@visactor/vrender-kits": "workspace:0.20.15" + "@visactor/vrender-core": "workspace:0.20.16", + "@visactor/vrender-kits": "workspace:0.20.16" }, "devDependencies": { "@internal/bundler": "workspace:*", diff --git a/packages/vrender-components/src/axis/type.ts b/packages/vrender-components/src/axis/type.ts index a9c46a44f..52b816f19 100644 --- a/packages/vrender-components/src/axis/type.ts +++ b/packages/vrender-components/src/axis/type.ts @@ -1,6 +1,5 @@ import type { ILineGraphicAttribute, - SymbolType, ITextGraphicAttribute, ISymbolGraphicAttribute, IRectGraphicAttribute, @@ -12,8 +11,8 @@ import type { import type { Dict } from '@visactor/vutils'; import type { ContinuousScale, CustomTicksFunc } from '@visactor/vscale'; import type { Point, TextContent } from '../core/type'; -import type { SegmentAttributes } from '../segment'; -import type { TagAttributes } from '../tag'; +import type { SegmentAttributes } from '../segment/type'; +import type { TagAttributes } from '../tag/type'; export type AxisItemStateStyle = { hover?: T; diff --git a/packages/vrender-components/src/data-zoom/type.ts b/packages/vrender-components/src/data-zoom/type.ts index 291236f4e..17492712b 100644 --- a/packages/vrender-components/src/data-zoom/type.ts +++ b/packages/vrender-components/src/data-zoom/type.ts @@ -8,7 +8,7 @@ import type { } from '@visactor/vrender-core'; import type { IPointLike } from '@visactor/vutils'; import type { IDelayType, OrientType } from '../interface'; -import type { TagAttributes } from '../tag'; +import type { TagAttributes } from '../tag/type'; export enum DataZoomActiveTag { startHandler = 'startHandler', diff --git a/packages/vrender-components/src/interface.ts b/packages/vrender-components/src/interface.ts index 5daa44740..826d72e4d 100644 --- a/packages/vrender-components/src/interface.ts +++ b/packages/vrender-components/src/interface.ts @@ -1,12 +1,4 @@ -import type { - ICustomPath2D, - IGraphicAttribute, - IGroup, - IRectGraphicAttribute, - IRichText, - IText -} from '@visactor/vrender-core'; -import type { TextContent } from './core/type'; +import type { ICustomPath2D, IGraphicAttribute, IGroup, IRectGraphicAttribute } from '@visactor/vrender-core'; export type Direction = 'horizontal' | 'vertical'; diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index 42287c6cc..08ed969f4 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -527,19 +527,30 @@ export class LabelBase extends AbstractComponent { if (clampForce) { for (let i = 0; i < result.length; i++) { const text = labels[i]; - const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height); + const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height, bmpTool.padding); if (dx !== 0 || dy !== 0) { text.setAttributes({ x: text.attribute.x + dx, y: text.attribute.y + dy }); + text._isClamped = true; } } } - result = shiftY(result as any, { maxY: bmpTool.height, ...(strategy as ShiftYStrategy) }); + result = shiftY(result as any, { + maxY: bmpTool.height, + ...(strategy as ShiftYStrategy), + labelling: (text: IText) => { + const baseMark = this.getRelatedGraphic(text.attribute); + const graphicBound = this._isCollectionBase + ? this.getGraphicBounds(null, this._idToPoint.get((text.attribute as any).id)) + : this.getGraphicBounds(baseMark, text); + return this.labeling(text.AABBBounds, graphicBound, 'bottom', this.attribute.offset); + } + }); for (let i = 0; i < result.length; i++) { const text = result[i]; const bounds = text.AABBBounds; const range = boundToRange(bmpTool, bounds, true); - if (canPlace(bmpTool, bitmap, bounds, clampForce, overlapPadding)) { + if (canPlace(bmpTool, bitmap, bounds, clampForce, text._isClamped ? 0 : overlapPadding)) { bitmap.setRange(range); } else { if (hideOnHit) { @@ -549,7 +560,6 @@ export class LabelBase extends AbstractComponent { } } } - return result; } @@ -646,7 +656,7 @@ export class LabelBase extends AbstractComponent { // 尝试向内挤压 if (!hasPlace && clampForce) { // 向内挤压不考虑 overlapPadding - const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height); + const { dx = 0, dy = 0 } = clampText(text as IText, bmpTool.width, bmpTool.height, bmpTool.padding); if (dx === 0 && dy === 0) { if (canPlace(bmpTool, bitmap, text.AABBBounds)) { // xy方向偏移都为0,意味着不考虑 overlapPadding 时,实际上可以放得下 diff --git a/packages/vrender-components/src/label/overlap/place.ts b/packages/vrender-components/src/label/overlap/place.ts index c4ffa892f..14d8e4439 100644 --- a/packages/vrender-components/src/label/overlap/place.ts +++ b/packages/vrender-components/src/label/overlap/place.ts @@ -161,28 +161,41 @@ export function defaultLabelPosition(type?: string) { } } -export function clampText(text: IText, width: number, height: number) { +export function clampText( + text: IText, + width: number, + height: number, + padding: { top?: number; left?: number; right?: number; bottom?: number } = {} +) { const { x1, x2, y1, y2 } = text.AABBBounds; + const { top = 0, left = 0, right = 0, bottom = 0 } = padding; + const minX = Math.min(x1, x2); const maxX = Math.max(x1, x2); const minY = Math.min(y1, y2); const maxY = Math.max(y1, y2); + const minXWithPadding = 0 - left; + const maxXWithPadding = width + right; + + const minYWithPadding = 0 - top; + const maxYWithPadding = height + bottom; + let dx = 0; let dy = 0; // x 方向 - if (minX < 0 && maxX - minX <= width) { + if (minX < minXWithPadding && maxX - minX <= width) { dx = -minX; - } else if (maxX > width && minX - (maxX - width) >= 0) { + } else if (maxX > maxXWithPadding && minX - (maxX - width) >= minXWithPadding) { dx = width - maxX; } // y 方向 - if (minY < 0 && maxY - minY <= height) { + if (minY < minYWithPadding && maxY - minY <= height) { dy = -minY; - } else if (maxY > height && minY - (maxY - height) >= 0) { + } else if (maxY > maxYWithPadding && minY - (maxY - height) >= minYWithPadding) { dy = height - maxY; } diff --git a/packages/vrender-components/src/label/overlap/shiftY.ts b/packages/vrender-components/src/label/overlap/shiftY.ts index 24b090567..5559daf0c 100644 --- a/packages/vrender-components/src/label/overlap/shiftY.ts +++ b/packages/vrender-components/src/label/overlap/shiftY.ts @@ -1,85 +1,269 @@ import type { IText } from '@visactor/vrender-core'; +import { isNumberClose } from '@visactor/vutils'; export interface IShiftYOption { - maxIterations?: number; - maxError?: number; - padding?: number; + labelling: (...args: any[]) => any; + maxY?: number; + globalShiftY?: { + /** + * 是否开启全局调整,开启后,所有文字会整体调整,否则只会按照 x 分组调整 top/bottom + * @default true + */ + enable?: boolean; + /** + * 最大迭代次数 + * @default 10 + */ + maxIterations?: number; + /** + * 最大误差 + * @default 0.1 + */ + maxError?: number; + /** + * 调整后 text 之间的 padding + * @default 1 + */ + padding?: number; + /** + * 每个 text 最大被调整的次数 + * @default 1000 + */ + maxAttempts?: number; + /** + * 每个 text 调整的 y 坐标差值限制 + */ + deltaYTolerance?: number; + }; +} + +const isIntersect = (top: number, bottom: number) => { + return Math.ceil(top) > Math.floor(bottom); +}; + +const isXIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => { + return d > a && b > c; +}; + +function getIntersectionLength(range1: number[], range2: number[]) { + const [start1, end1] = range1; + const [start2, end2] = range2; + + const start = Math.max(start1, start2); + const end = Math.min(end1, end2); + + return Math.max(0, end - start); } -export function shiftY(texts: IText[], option: IShiftYOption = {}) { - const { maxIterations = 10, maxError = 0.1, padding = 1, maxY = Number.MAX_VALUE } = option; +export function shiftY(texts: IText[], option: IShiftYOption) { + const { + maxY = Number.MAX_VALUE, + labelling, + globalShiftY = { enable: true, maxIterations: 10, maxError: 0.1, padding: 1 } + } = 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 textInformation = new Map(); + // 根据 x 坐标给 text 分组,存放信息到 map 中 + const xMap = new Map<{ start: number; end: number }, IText[]>(); + const textInformation = new Map< + IText, + { + y1Initial: number; + y1: number; + y: number; + y2: number; + height: number; + x1: number; + x2: number; + x: number; + attempts: number; + } + >(); - // y0 : 初始位置 - // y : 最终位置 - // height : 高度 - // x1, x2 : 左右边界 - const getY0 = (text: IText) => textInformation.get(text).y0; - const getY = (text: IText) => textInformation.get(text).y; + const getY1Initial = (text: IText) => textInformation.get(text).y1Initial; const getHeight = (text: IText) => textInformation.get(text).height; + const getY1 = (text: IText) => textInformation.get(text).y1; + const getY = (text: IText) => textInformation.get(text).y; + const getX = (text: IText) => textInformation.get(text).x; 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; + const getAdjustAttempts = (text: IText) => textInformation.get(text).attempts; + + const setY1 = (text: IText, y: number) => { + textInformation.get(text).y1 = y; + }; + + const setAdjustAttempts = (text: IText, attempts: number) => { + textInformation.get(text).attempts = attempts; }; + function adjustPositionInOneGroup(texts: IText[]) { + if (texts.length === 1) { + return; + } + // 从最后一个 text 向前遍历,如果与前一个 text 相交,则尝试放到下方(需要判断和前一个 text 是否相交,若相交则不能放到下方) + for (let i = texts.length - 1; i > 0; i--) { + const curText = texts[i]; + const upperText = texts[i - 1]; + const lowerText = texts[i + 1]; + + // 当前 text 和上面一个 text 相交 + if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) { + const { y } = labelling(curText); + // 挪动当前 text 后, 和下面一个 text 不相交 + if (!lowerText || !isIntersect(y + getHeight(curText) / 2, getY1(lowerText))) { + if (y + getHeight(curText) / 2 <= maxY) { + setY1(curText, getY1(curText) + y - getY(curText)); + } + } + } + } + } + + // 根据 x 坐标进行分组 + texts.sort((a, b) => a.attribute.x - b.attribute.x); for (const text of texts) { const { y1, y2, x1, x2 } = text.AABBBounds; - textInformation.set(text, { y0: y1, y: y1, height: y2 - y1, x1, x2 }); - } + const { x, y } = text.attribute; + textInformation.set(text, { y1Initial: y1, y1, y2, y, height: y2 - y1, x1, x2, x, attempts: 0 }); + let hasRange = false; - for (let iter = 0; iter < maxIterations; iter++) { - texts.sort((a, b) => getY(a) - getY(b)); - let error = 0; - for (let i = 0; i < n - 1; i++) { - const curText = texts[i]; - let j = i + 1; - let nextText; - while ( - (nextText = texts[j]) && - !isIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)]) - ) { - j += 1; + for (const [range, xGroupTexts] of xMap) { + const { start, end } = range; + // 1. x1,x2 在 start 和 end 范围内 + if (x1 >= start && x2 <= end) { + xGroupTexts.push(text); + hasRange = true; + } + // 2. x 坐标接近,相差在 5px 以内 + else if (isNumberClose(x, getX(xGroupTexts[0]), undefined, 5)) { + // x 坐标相等,也纳入到一个分组中,并且要扩大分组 range + const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) }; + xGroupTexts.push(text); + xMap.set(newRange, xGroupTexts); + xMap.delete(range); + hasRange = true; + } + // 3. 与区间相交范围 > 50% + else if (getIntersectionLength([start, end], [x1, x2]) / (end - start) > 0.5) { + const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) }; + xGroupTexts.push(text); + xMap.set(newRange, xGroupTexts); + xMap.delete(range); + hasRange = true; } - 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 + getHeight(nextText) > maxY) { - setY(curText, y0 - (padding - delta)); - } else if (y0 - newDelta < 0) { - setY(nextText, y1 + (padding - delta)); - } else { - setY(curText, y0 - newDelta); - setY(nextText, y1 + newDelta); + + if (hasRange) { + break; + } + } + + if (!hasRange) { + xMap.set({ start: x1, end: x2 }, [text]); + } + } + + // 对每个 x 坐标的 text 数组进行排序 + for (const xTexts of xMap.values()) { + // 从上到下排序 + xTexts.sort((a, b) => getY1Initial(a) - getY1Initial(b)); + adjustPositionInOneGroup(xTexts); + } + + // 整体调整一次 Y 坐标,进行散开 + if (globalShiftY.enable !== false) { + const { + maxIterations = 10, + maxError = 0.1, + padding = 1, + maxAttempts = 1000, + deltaYTolerance = Number.MAX_VALUE + } = globalShiftY; + for (let iter = 0; iter < maxIterations; iter++) { + texts.sort((a, b) => getY1(a) - getY1(b)); + let error = 0; + for (let i = 0; i < n - 1; i++) { + const curText = texts[i]; + if (getAdjustAttempts(curText) >= maxAttempts) { + continue; + } + let j = i + 1; + let nextText; + while ( + (nextText = texts[j]) && + !isXIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)]) + ) { + j += 1; + } + if (nextText) { + const y1 = getY1(curText); + const h0 = getHeight(curText); + const nextY1 = getY1(nextText); + const delta = nextY1 - (y1 + h0); + if (delta < padding) { + const newDelta = (padding - delta) / 2; + error = Math.max(error, newDelta); + if (y1 + newDelta + getHeight(nextText) > maxY) { + const newY1 = y1 - (padding - delta); + const curTextDelta = getY1Initial(curText) - newY1; + if (Math.abs(curTextDelta) <= deltaYTolerance) { + setY1(curText, newY1); + setAdjustAttempts(curText, getAdjustAttempts(curText) + 1); + } + } else if (y1 - newDelta < 0) { + const newY1 = nextY1 + (padding - delta); + const nextTextDelta = getY1Initial(nextText) - newY1; + if (Math.abs(nextTextDelta) <= deltaYTolerance) { + setY1(nextText, newY1); + setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1); + } + } else { + const newCurY1 = y1 - newDelta; + const curTextDelta = getY1Initial(curText) - newCurY1; + const newNextY1 = nextY1 + newDelta; + const nextTextDelta = getY1Initial(nextText) - newNextY1; + if (Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance) { + setY1(curText, newCurY1); + setY1(nextText, newNextY1); + setAdjustAttempts(curText, getAdjustAttempts(curText) + 1); + setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1); + } + } } } } - } - if (error < maxError) { - break; + if (error < maxError) { + break; + } } } for (const text of texts) { - const finalY = text.attribute.y + getY(text) - getY0(text); + const finalY = text.attribute.y + getY1(text) - getY1Initial(text); text.setAttribute('y', finalY); } - return texts; + const result = []; + // 调整文字顺序,越靠前的越优先占据空间 + // texts 按照 x 进行排序,然后左右交替,保证首尾标签优先展示 + texts.sort((a, b) => a.attribute.x - b.attribute.x); + let start = 0; + let end = texts.length - 1; + + while (start <= end) { + if (start === end) { + result.push(texts[start]); + } else { + result.push(texts[start]); + result.push(texts[end]); + } + start++; + end--; + } + return result; } diff --git a/packages/vrender-components/src/legend/color/type.ts b/packages/vrender-components/src/legend/color/type.ts index 393fd1ae7..5552686e0 100644 --- a/packages/vrender-components/src/legend/color/type.ts +++ b/packages/vrender-components/src/legend/color/type.ts @@ -1,5 +1,5 @@ -import { SliderAttributes } from '../../slider/type'; -import { LegendBaseAttributes } from '../type'; +import type { SliderAttributes } from '../../slider/type'; +import type { LegendBaseAttributes } from '../type'; export type ColorLegendAttributes = { /** * 图例的颜色 diff --git a/packages/vrender-components/src/legend/discrete/type.ts b/packages/vrender-components/src/legend/discrete/type.ts index 171eaf94c..11b73f872 100644 --- a/packages/vrender-components/src/legend/discrete/type.ts +++ b/packages/vrender-components/src/legend/discrete/type.ts @@ -6,7 +6,7 @@ import type { ITextGraphicAttribute } from '@visactor/vrender-core'; import type { BaseGraphicAttributes, Padding } from '../../core/type'; -import type { PagerAttributes } from '../../pager'; +import type { PagerAttributes } from '../../pager/type'; import type { LegendBaseAttributes } from '../type'; import type { ScrollBarAttributes } from '../../scrollbar/type'; import type { GraphicEventType } from '@visactor/vrender-core'; diff --git a/packages/vrender-components/src/marker/type.ts b/packages/vrender-components/src/marker/type.ts index 8fb0350b3..981d8c7f8 100644 --- a/packages/vrender-components/src/marker/type.ts +++ b/packages/vrender-components/src/marker/type.ts @@ -13,8 +13,8 @@ import type { ISymbolGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core'; -import type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment'; -import type { TagAttributes } from '../tag'; +import type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment/type'; +import type { TagAttributes } from '../tag/type'; import type { Point, State } from '../core/type'; export enum IMarkLineLabelPosition { diff --git a/packages/vrender-components/src/player/type/discrete-player.ts b/packages/vrender-components/src/player/type/discrete-player.ts index d70943b02..c533bf365 100644 --- a/packages/vrender-components/src/player/type/discrete-player.ts +++ b/packages/vrender-components/src/player/type/discrete-player.ts @@ -1,6 +1,6 @@ -import { BasePlayerAttributes } from './base'; -import { DirectionType } from './direction'; -import { BasePlayerLayoutAttributes } from './layout'; +import type { BasePlayerAttributes } from './base'; +import type { DirectionType } from './direction'; +import type { BasePlayerLayoutAttributes } from './layout'; export type DiscretePlayerAttributes = { /** diff --git a/packages/vrender-components/src/player/type/index.ts b/packages/vrender-components/src/player/type/index.ts index 6031acda7..d4eeff7ab 100644 --- a/packages/vrender-components/src/player/type/index.ts +++ b/packages/vrender-components/src/player/type/index.ts @@ -1,5 +1,5 @@ -import { ContinuousPlayerAttributes } from './continuous-player'; -import { DiscretePlayerAttributes } from './discrete-player'; +import type { ContinuousPlayerAttributes } from './continuous-player'; +import type { DiscretePlayerAttributes } from './discrete-player'; export * from './base'; export * from './direction'; diff --git a/packages/vrender-components/src/timeline/type.ts b/packages/vrender-components/src/timeline/type.ts index f95efd13a..3c3b45d6a 100644 --- a/packages/vrender-components/src/timeline/type.ts +++ b/packages/vrender-components/src/timeline/type.ts @@ -4,7 +4,6 @@ import type { ISymbolGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core'; -import { ILineAttribute, ISymbolAttribute } from '@visactor/vrender-core'; export interface TimelineAttrs extends IGroupGraphicAttribute { width: number; diff --git a/packages/vrender-components/tsconfig.spec.json b/packages/vrender-components/tsconfig.spec.json new file mode 100644 index 000000000..2733c803f --- /dev/null +++ b/packages/vrender-components/tsconfig.spec.json @@ -0,0 +1,22 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "composite": true, + "isolatedModules": false, + "sourceMap": false, + "removeComments": false + }, + "include": ["src/**/type.ts", "src/player/type/", "src/player/controller/constant.ts", "src/interface.ts"], + "references": [ + { + "path": "../vrender" + }, + { + "path": "../vrender-core" + }, + { + "path": "../vrender-kits" + } + ] +} diff --git a/packages/vrender-core/CHANGELOG.json b/packages/vrender-core/CHANGELOG.json index 45c974d85..4dd3498da 100644 --- a/packages/vrender-core/CHANGELOG.json +++ b/packages/vrender-core/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@visactor/vrender-core", "entries": [ + { + "version": "0.20.16", + "tag": "@visactor/vrender-core_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": { + "none": [ + { + "comment": "fix: fix issue with _debug_bounds" + }, + { + "comment": "fix: fix issue with string linear-gradient" + }, + { + "comment": "fix: fix issue where not work when lineWidth is set to 0" + }, + { + "comment": "fix: fix drawing issue when size is array" + } + ] + } + }, { "version": "0.20.15", "tag": "@visactor/vrender-core_v0.20.15", diff --git a/packages/vrender-core/CHANGELOG.md b/packages/vrender-core/CHANGELOG.md index 1d822e9a8..505e5c3c1 100644 --- a/packages/vrender-core/CHANGELOG.md +++ b/packages/vrender-core/CHANGELOG.md @@ -1,6 +1,16 @@ # Change Log - @visactor/vrender-core -This log was last generated on Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +### Updates + +- fix: fix issue with _debug_bounds +- fix: fix issue with string linear-gradient +- fix: fix issue where not work when lineWidth is set to 0 +- fix: fix drawing issue when size is array ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/vrender-core/package.json b/packages/vrender-core/package.json index 14844c57b..377351a8b 100644 --- a/packages/vrender-core/package.json +++ b/packages/vrender-core/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-core", - "version": "0.20.15", + "version": "0.20.16", "description": "", "sideEffects": [ "./src/modules.ts", @@ -25,7 +25,8 @@ "test": "jest", "test-live": "npm run test-watch __tests__/unit/theme/line.test.ts", "test-watch": "cross-env DEBUG_MODE=1 jest --watch", - "test-cov": "jest -w 16 --coverage" + "test-cov": "jest -w 16 --coverage", + "build:spec-types": "rm -rf ./spec-types && tsc -p ./tsconfig.spec.json --declaration --emitDeclarationOnly --outDir ./spec-types" }, "dependencies": { "color-convert": "2.0.1", diff --git a/packages/vrender-core/src/common/color-utils.ts b/packages/vrender-core/src/common/color-utils.ts index b2e01ed99..8c85830ec 100644 --- a/packages/vrender-core/src/common/color-utils.ts +++ b/packages/vrender-core/src/common/color-utils.ts @@ -414,7 +414,7 @@ export class GradientParser { while (angle < 0) { angle += pi2; } - while (angle > pi2) { + while (angle >= pi2) { angle -= pi2; } let x0 = 0; @@ -425,7 +425,7 @@ export class GradientParser { x0 = 0; y0 = 1; x1 = Math.sin(angle); - y1 = Math.cos(angle); + y1 = y0 - Math.cos(angle); } else if (angle < pi) { x0 = 0; y0 = 0; diff --git a/packages/vrender-core/src/graphic/builtin-symbol/arrow.ts b/packages/vrender-core/src/graphic/builtin-symbol/arrow.ts index 02f70b605..67af20a99 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/arrow.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/arrow.ts @@ -62,12 +62,12 @@ export class ArrowSymbol extends BaseSymbol implements ISymbolClass { 'M-0.07142857142857142,0.5L0.07142857142857142,0.5L0.07142857142857142,-0.0625L0.2,-0.0625L0,-0.5L-0.2,-0.0625L-0.07142857142857142,-0.0625Z'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return arrow(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return arrow(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-down.ts b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-down.ts index 6dfe2e71b..d15a576ef 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-down.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-down.ts @@ -18,12 +18,12 @@ export class Arrow2DownSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M -0.5 -0.25 L 0 0.25 l 0.5 -0.25'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 4; + const r = this.parseSize(size) / 4; return arrow2Down(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 4 + offset; + const r = this.parseSize(size) / 4 + offset; return arrow2Down(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-left.ts b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-left.ts index f02fa0211..ea4c35f2b 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-left.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-left.ts @@ -48,12 +48,12 @@ export class Arrow2LeftSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M 0.25 -0.5 L -0.25 0 l 0.25 0.5'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 4; + const r = this.parseSize(size) / 4; return arrow2Left(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 4 + offset; + const r = this.parseSize(size) / 4 + offset; return arrow2Left(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-right.ts b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-right.ts index bffd6efaa..4a4e30785 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-right.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-right.ts @@ -48,12 +48,12 @@ export class Arrow2RightSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M -0.25 -0.5 l 0.25 0 l -0.25 0.5'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 4; + const r = this.parseSize(size) / 4; return arrow2Right(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 4 + offset; + const r = this.parseSize(size) / 4 + offset; return arrow2Right(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-up.ts b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-up.ts index 5ad9fed50..b81281ef8 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/arrow2-up.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/arrow2-up.ts @@ -18,12 +18,12 @@ export class Arrow2UpSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M -0.5 0.25 L 0 -0.25 l 0.5 0.25'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 4; + const r = this.parseSize(size) / 4; return arrow2Up(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 4 + offset; + const r = this.parseSize(size) / 4 + offset; return arrow2Up(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/base.ts b/packages/vrender-core/src/graphic/builtin-symbol/base.ts index a966492a4..9640a6976 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/base.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/base.ts @@ -16,4 +16,8 @@ export class BaseSymbol { bounds.y2 = size[1] / 2; } } + + protected parseSize(size: number | [number, number]) { + return isNumber(size) ? size : Math.min(size[0], size[1]); + } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/circle.ts b/packages/vrender-core/src/graphic/builtin-symbol/circle.ts index 567b7196b..9853551cf 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/circle.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/circle.ts @@ -4,7 +4,7 @@ import type { IContext2d, SymbolType, ISymbolClass, IPath2D } from '../../interf import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -37,17 +37,17 @@ export class CircleSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M0.5,0A0.5,0.5,0,1,1,-0.5,0A0.5,0.5,0,1,1,0.5,0'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return circle(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return circle(ctx, r, x, y, z); } drawToSvgPath(size: number, x: number, y: number, z?: number): string { - const r = size / 2; + const r = this.parseSize(size) / 2; return `M ${x - r}, ${y} a ${r},${r} 0 1,0 ${r * 2},0 a ${r},${r} 0 1,0 -${r * 2},0`; } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/close.ts b/packages/vrender-core/src/graphic/builtin-symbol/close.ts index 6299fea90..36c95898f 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/close.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/close.ts @@ -18,17 +18,17 @@ export class CloseSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,-0.5L0.5,0.5,M0.5,-0.5L-0.5,0.5'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return close(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return close(ctx, r, x, y, z); } drawToSvgPath(size: number, x: number, y: number, z?: number): string { - const r = size / 2; + const r = this.parseSize(size) / 2; return `M ${x - r}, ${y - r} L ${x + r},${y + r} M ${x + r}, ${y - r} L ${x - r},${y + r}`; } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/cross.ts b/packages/vrender-core/src/graphic/builtin-symbol/cross.ts index da2395ccf..72b01625d 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/cross.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/cross.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -62,12 +62,12 @@ export class CrossSymbol extends BaseSymbol implements ISymbolClass { 'M-0.5,-0.2L-0.5,0.2L-0.2,0.2L-0.2,0.5L0.2,0.5L0.2,0.2L0.5,0.2L0.5,-0.2L0.2,-0.2L0.2,-0.5L-0.2,-0.5L-0.2,-0.2Z'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 6; + const r = this.parseSize(size) / 6; return cross(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 6; + const r = this.parseSize(size) / 6; return crossOffset(ctx, r, x, y, offset, z); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/diamond.ts b/packages/vrender-core/src/graphic/builtin-symbol/diamond.ts index 5ce4f738b..ac332d9ab 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/diamond.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/diamond.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -37,18 +37,18 @@ export class DiamondSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,0L0,-0.5L0.5,0L0,0.5Z'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return diamond(ctx, r, x, y, z); } // 适应方向的draw drawFitDir(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return diamond(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return diamond(ctx, r, x, y, z); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/line-h.ts b/packages/vrender-core/src/graphic/builtin-symbol/line-h.ts index 21436fee0..4d58a3869 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/line-h.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/line-h.ts @@ -15,17 +15,17 @@ export class LineHSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,0L0.5,0'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return lineH(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return lineH(ctx, r, x, y, z); } drawToSvgPath(size: number, x: number, y: number, z?: number): string { - const r = size / 2; + const r = this.parseSize(size) / 2; return `M ${x - r}, ${y} L ${x + r},${y}`; } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/line-v.ts b/packages/vrender-core/src/graphic/builtin-symbol/line-v.ts index d57767e35..b70206790 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/line-v.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/line-v.ts @@ -15,17 +15,17 @@ export class LineVSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M0,-0.5L0,0.5'; draw(ctx: IContext2d, size: number, x: number, y: number, z?: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return lineV(ctx, r, x, y, z); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number, z?: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return lineV(ctx, r, x, y, z); } drawToSvgPath(size: number, x: number, y: number, z?: number): string { - const r = size / 2; + const r = this.parseSize(size) / 2; return `M ${x}, ${y - r} L ${x},${y + r}`; } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/square.ts b/packages/vrender-core/src/graphic/builtin-symbol/square.ts index baeddc5ee..b786244cb 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/square.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/square.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -32,12 +32,12 @@ export class SquareSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,-0.5h1v1h-1Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return square(ctx, r, x, y); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return square(ctx, r, x, y); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/star.ts b/packages/vrender-core/src/graphic/builtin-symbol/star.ts index c02afe8ac..d96e28ebc 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/star.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/star.ts @@ -4,7 +4,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -51,12 +51,12 @@ export class StarSymbol extends BaseSymbol implements ISymbolClass { 'M0 -1L0.22451398828979266 -0.3090169943749474L0.9510565162951535 -0.30901699437494745L0.3632712640026804 0.1180339887498948L0.5877852522924732 0.8090169943749473L8.326672684688674e-17 0.3819660112501051L-0.587785252292473 0.8090169943749476L-0.3632712640026804 0.11803398874989487L-0.9510565162951536 -0.30901699437494723L-0.22451398828979274 -0.30901699437494734Z'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return star(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return star(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/stroke.ts b/packages/vrender-core/src/graphic/builtin-symbol/stroke.ts index 30fd1513a..db5ba3ecf 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/stroke.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/stroke.ts @@ -45,12 +45,12 @@ export class StrokeSymbol extends BaseSymbol implements ISymbolClass { pathStr: '' = ''; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return stroke(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return stroke(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/thin-triangle.ts b/packages/vrender-core/src/graphic/builtin-symbol/thin-triangle.ts index 01ad3c2b0..b817fcd28 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/thin-triangle.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/thin-triangle.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -37,12 +37,12 @@ export class ThinTriangleSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M0,-0.5773502691896257L-0.5,0.28867513459481287L0.5,0.28867513459481287Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2 / sqrt3; + const r = this.parseSize(size) / 2 / sqrt3; return thinTriangle(ctx, r, x, y); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2 / sqrt3 + offset; + const r = this.parseSize(size) / 2 / sqrt3 + offset; return thinTriangle(ctx, r, x, y); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/triangle-down.ts b/packages/vrender-core/src/graphic/builtin-symbol/triangle-down.ts index 62409766c..192d09582 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/triangle-down.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/triangle-down.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -34,12 +34,12 @@ export class TriangleDownSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,-0.5 L0.5,-0.5 L0,0.5 Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglDownOffset(ctx, r, x, y); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglDownOffset(ctx, r, x, y, offset); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/triangle-left.ts b/packages/vrender-core/src/graphic/builtin-symbol/triangle-left.ts index d856fff8d..53e5f6f27 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/triangle-left.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/triangle-left.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -35,12 +35,12 @@ export class TriangleLeftSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,0 L0.5,0.5 L0.5,-0.5 Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglLeftOffset(ctx, r, x, y, 0); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglLeftOffset(ctx, r, x, y, offset); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/triangle-right.ts b/packages/vrender-core/src/graphic/builtin-symbol/triangle-right.ts index 55b0f8d9a..84cc5e999 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/triangle-right.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/triangle-right.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -35,12 +35,12 @@ export class TriangleRightSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M-0.5,0.5 L0.5,0 L-0.5,-0.5 Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglRightOffset(ctx, r, x, y); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglRightOffset(ctx, r, x, y, offset); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/triangle-up.ts b/packages/vrender-core/src/graphic/builtin-symbol/triangle-up.ts index 818394571..d1cd43966 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/triangle-up.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/triangle-up.ts @@ -3,7 +3,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -35,12 +35,12 @@ export class TriangleUpSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M0.5,0.5 L-0.5,0.5 L0,-0.5 Z'; draw(ctx: IContext2d, size: number, x: number, y: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglUpOffset(ctx, r, x, y); } drawOffset(ctx: IContext2d, size: number, x: number, y: number, offset: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return trianglUpOffset(ctx, r, x, y, offset); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/utils.ts b/packages/vrender-core/src/graphic/builtin-symbol/utils.ts index 9bf034008..ca1259e13 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/utils.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/utils.ts @@ -1,4 +1,4 @@ -import { isArray, type IBounds, AABBBounds } from '@visactor/vutils'; +import { isArray, type IBounds, AABBBounds, isNumber } from '@visactor/vutils'; import { renderCommandList } from '../../common/render-command-list'; import type { IContext2d, ICustomPath2D, IGraphicAttribute, ISymbolClass } from '../../interface'; @@ -33,6 +33,7 @@ export class CustomSymbolClass implements ISymbolClass { z?: number, cb?: (path: ICustomPath2D, attribute?: Record) => void ) { + size = this.parseSize(size); if (this.isSvg) { if (!this.svgCache) { return false; @@ -56,10 +57,16 @@ export class CustomSymbolClass implements ISymbolClass { z?: number, cb?: (path: ICustomPath2D, attribute?: Record) => void ) { + size = this.parseSize(size); return this.drawOffset(ctx, size, x, y, 0, z, cb); } + protected parseSize(size: number | [number, number]): number { + return isNumber(size) ? size : Math.min(size[0], size[1]); + } + bounds(size: number, bounds: IBounds) { + size = this.parseSize(size); if (this.isSvg) { if (!this.svgCache) { return; diff --git a/packages/vrender-core/src/graphic/builtin-symbol/wedge.ts b/packages/vrender-core/src/graphic/builtin-symbol/wedge.ts index b5a9db86a..e87c63f4e 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/wedge.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/wedge.ts @@ -48,12 +48,12 @@ export class WedgeSymbol extends BaseSymbol implements ISymbolClass { pathStr: string = 'M0,-0.5773502691896257L-0.125,0.28867513459481287L0.125,0.28867513459481287Z'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; return wedge(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; return wedge(ctx, r, transX, transY); } } diff --git a/packages/vrender-core/src/graphic/builtin-symbol/wye.ts b/packages/vrender-core/src/graphic/builtin-symbol/wye.ts index 0e8b0202b..76c50a3bf 100644 --- a/packages/vrender-core/src/graphic/builtin-symbol/wye.ts +++ b/packages/vrender-core/src/graphic/builtin-symbol/wye.ts @@ -4,7 +4,7 @@ import type { IContext2d, SymbolType, ISymbolClass } from '../../interface'; import { BaseSymbol } from './base'; /** - * + * *Copyright 2010-2021 Mike Bostock Permission to use, copy, modify, and/or distribute this software for any purpose @@ -54,13 +54,13 @@ export class WyeSymbol extends BaseSymbol implements ISymbolClass { 'M0.25 0.14433756729740646L0.25 0.6443375672974064L-0.25 0.6443375672974064L-0.25 0.14433756729740643L-0.6830127018922193 -0.10566243270259357L-0.4330127018922193 -0.5386751345948129L0 -0.28867513459481287L0.4330127018922193 -0.5386751345948129L0.6830127018922193 -0.10566243270259357Z'; draw(ctx: IContext2d, size: number, transX: number, transY: number) { - const r = size / 2; + const r = this.parseSize(size) / 2; // const r = sqrt(size / a); return wye(ctx, r, transX, transY); } drawOffset(ctx: IContext2d, size: number, transX: number, transY: number, offset: number) { - const r = size / 2 + offset; + const r = this.parseSize(size) / 2 + offset; // const r = sqrt(size / a); return wye(ctx, r, transX, transY); } diff --git a/packages/vrender-core/src/graphic/richtext/line.ts b/packages/vrender-core/src/graphic/richtext/line.ts index 74f499e72..60a9b8b4f 100644 --- a/packages/vrender-core/src/graphic/richtext/line.ts +++ b/packages/vrender-core/src/graphic/richtext/line.ts @@ -2,7 +2,7 @@ import type { IContext2d, IRichTextIcon } from '../../interface'; import { RichTextIcon } from './icon'; import Paragraph from './paragraph'; -import { DIRECTION_KEY, measureTextCanvas, regFirstSpace } from './utils'; +import { applyFillStyle, applyStrokeStyle, DIRECTION_KEY, measureTextCanvas, regFirstSpace } from './utils'; /** * 部分代码参考 https://github.com/danielearwicker/carota/ @@ -202,7 +202,7 @@ export default class Line { } // 正常绘制 - this.paragraphs.map((paragraph, index) => { + this.paragraphs.forEach((paragraph, index) => { if (paragraph instanceof RichTextIcon) { // 更新icon位置 paragraph.setAttributes({ @@ -214,6 +214,15 @@ export default class Line { drawIcon(paragraph, ctx, x + paragraph._x, y + paragraph._y, this.ascent); return; } + const b = { + x1: this.left, + y1: this.top, + x2: this.left + this.actualWidth, + y2: this.top + this.height + }; + applyStrokeStyle(ctx, paragraph.character); + // 下面绘制underline和line-through时需要设置FillStyle + applyFillStyle(ctx, paragraph.character, b); paragraph.draw(ctx, y + this.ascent, x, index === 0, this.textAlign); }); } @@ -250,7 +259,7 @@ export default class Line { let width = 0; // 正常绘制 - this.paragraphs.map((paragraph, index) => { + this.paragraphs.forEach((paragraph, index) => { if (paragraph instanceof RichTextIcon) { width += paragraph.width; // todo: 处理direction } else { diff --git a/packages/vrender-core/src/graphic/richtext/paragraph.ts b/packages/vrender-core/src/graphic/richtext/paragraph.ts index edc3d8c11..0751bff05 100644 --- a/packages/vrender-core/src/graphic/richtext/paragraph.ts +++ b/packages/vrender-core/src/graphic/richtext/paragraph.ts @@ -1,6 +1,6 @@ import { calculateLineHeight } from '../../common/utils'; import type { IContext2d, IRichTextParagraphCharacter } from '../../interface'; -import { measureTextCanvas, applyFillStyle, applyStrokeStyle, getStrByWithCanvas } from './utils'; +import { measureTextCanvas, getStrByWithCanvas } from './utils'; /** * 部分代码参考 https://github.com/danielearwicker/carota/ @@ -209,14 +209,11 @@ export default class Paragraph { baseline = 0; } - if (this.character.stroke) { - applyStrokeStyle(ctx, this.character); + const { lineWidth = 1 } = this.character; + if (this.character.stroke && lineWidth) { ctx.strokeText(text, left, baseline); } - // 下面绘制underline和line-through时需要设置FillStyle - applyFillStyle(ctx, this.character); - if (this.character.fill) { ctx.fillText(text, left, baseline); } diff --git a/packages/vrender-core/src/graphic/richtext/utils.ts b/packages/vrender-core/src/graphic/richtext/utils.ts index b9c79ea9f..ed9303af9 100644 --- a/packages/vrender-core/src/graphic/richtext/utils.ts +++ b/packages/vrender-core/src/graphic/richtext/utils.ts @@ -1,4 +1,6 @@ +import type { IBoundsLike } from '@visactor/vutils'; import { application } from '../../application'; +import { createColor } from '../../common/canvas-utils'; import type { IContext2d, ITextStyleParams, IRichTextParagraphCharacter } from '../../interface'; export const DIRECTION_KEY = { @@ -60,7 +62,7 @@ const setTextStyle = (ctx: IContext2d, character: IRichTextParagraphCharacter) = }; // Applies the style of a run to the canvas context -export function applyFillStyle(ctx: IContext2d, character: IRichTextParagraphCharacter) { +export function applyFillStyle(ctx: IContext2d, character: IRichTextParagraphCharacter, b?: IBoundsLike) { const fillStyle = (character && (character.fill as string)) || defaultFormatting.fill; if (!fillStyle) { ctx.globalAlpha = 0; @@ -70,7 +72,7 @@ export function applyFillStyle(ctx: IContext2d, character: IRichTextParagraphCha const { fillOpacity = 1, opacity = 1 } = character; ctx.globalAlpha = fillOpacity * opacity; - ctx.fillStyle = fillStyle as string; + ctx.fillStyle = b ? createColor(ctx, fillStyle, { AABBBounds: b }) : (fillStyle as string); setTextStyle(ctx, character); } diff --git a/packages/vrender-core/src/render/contributions/render/draw-interceptor.ts b/packages/vrender-core/src/render/contributions/render/draw-interceptor.ts index 71f34908d..ed768d25b 100644 --- a/packages/vrender-core/src/render/contributions/render/draw-interceptor.ts +++ b/packages/vrender-core/src/render/contributions/render/draw-interceptor.ts @@ -94,7 +94,9 @@ export class ShadowRootDrawItemInterceptorContribution implements IDrawItemInter const { context } = drawContext; context.highPerformanceSave(); // 直接transform - context.transformFromMatrix(graphic.transMatrix, true); + const t1 = graphic.parent.globalTransMatrix; + const t2 = graphic.stage.window.getViewBoxTransform().clone().multiply(t1.a, t1.b, t1.c, t1.d, t1.e, t1.f); + graphic.parent && context.setTransformFromMatrix(t2, true); // 变换dirtyBounds if (drawContribution.dirtyBounds && drawContribution.backupDirtyBounds) { diff --git a/packages/vrender-core/tsconfig.spec.json b/packages/vrender-core/tsconfig.spec.json new file mode 100644 index 000000000..7a1c6f131 --- /dev/null +++ b/packages/vrender-core/tsconfig.spec.json @@ -0,0 +1,12 @@ +{ + "extends": "@internal/ts-config/tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "composite": true, + "target": "ES2016", + "isolatedModules": false, + "sourceMap": false, + "removeComments": false + }, + "include": ["src/interface/", "src/common/enums.ts"] +} diff --git a/packages/vrender-kits/CHANGELOG.json b/packages/vrender-kits/CHANGELOG.json index 5100c51c4..56017c391 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.16", + "tag": "@visactor/vrender-kits_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": {} + }, { "version": "0.20.15", "tag": "@visactor/vrender-kits_v0.20.15", diff --git a/packages/vrender-kits/CHANGELOG.md b/packages/vrender-kits/CHANGELOG.md index 8b7005724..433a27295 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 Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +_Version update only_ ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/vrender-kits/package.json b/packages/vrender-kits/package.json index fcab86e77..e917ce573 100644 --- a/packages/vrender-kits/package.json +++ b/packages/vrender-kits/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender-kits", - "version": "0.20.15", + "version": "0.20.16", "description": "", "sideEffects": false, "main": "cjs/index.js", @@ -21,7 +21,7 @@ }, "dependencies": { "@visactor/vutils": "~0.18.18", - "@visactor/vrender-core": "workspace:0.20.15", + "@visactor/vrender-core": "workspace:0.20.16", "@resvg/resvg-js": "2.4.1", "roughjs": "4.5.2" }, diff --git a/packages/vrender/CHANGELOG.json b/packages/vrender/CHANGELOG.json index 6300441aa..fc27307b7 100644 --- a/packages/vrender/CHANGELOG.json +++ b/packages/vrender/CHANGELOG.json @@ -1,6 +1,12 @@ { "name": "@visactor/vrender", "entries": [ + { + "version": "0.20.16", + "tag": "@visactor/vrender_v0.20.16", + "date": "Thu, 21 Nov 2024 06:58:23 GMT", + "comments": {} + }, { "version": "0.20.15", "tag": "@visactor/vrender_v0.20.15", diff --git a/packages/vrender/CHANGELOG.md b/packages/vrender/CHANGELOG.md index 23181ce42..e5b556e46 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 Fri, 15 Nov 2024 08:34:34 GMT and should not be manually modified. +This log was last generated on Thu, 21 Nov 2024 06:58:23 GMT and should not be manually modified. + +## 0.20.16 +Thu, 21 Nov 2024 06:58:23 GMT + +_Version update only_ ## 0.20.15 Fri, 15 Nov 2024 08:34:34 GMT diff --git a/packages/vrender/__tests__/browser/src/pages/richtext.ts b/packages/vrender/__tests__/browser/src/pages/richtext.ts index ad3c22cae..b5423d37f 100644 --- a/packages/vrender/__tests__/browser/src/pages/richtext.ts +++ b/packages/vrender/__tests__/browser/src/pages/richtext.ts @@ -10,221 +10,220 @@ const svg = export const page = () => { const shapes = []; - shapes.push( - createRichText({ - visible: true, - fontSize: 26, - width: 0, - background: 'green', - // "textAlign": "center", - textConfig: [ - { - text: '我', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '们', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '是', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '无', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '缘', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '无', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '故', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '的', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '尘', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '埃\n', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '无', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '缘', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '无', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '故', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '的', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '游', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '走\n', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '黑', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '暗', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '只', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '需', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '要', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '张', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '开', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '一', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '张', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '缝', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '隙\n', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '就', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '能', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '挂', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '起', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '飓', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - }, - { - text: '风\n', - fontSize: 26, - textAlign: 'center', - fill: '#0f51b5' - } - ] - }) - ); + const r = createRichText({ + visible: true, + fontSize: 26, + width: 0, + background: 'green', + fill: 'linear-gradient(45deg, red 0%, green 100%)', + stroke: 'green', + // "textAlign": "center", + textConfig: [ + { + text: '我', + fontSize: 26, + textAlign: 'center' + }, + { + text: '们', + fontSize: 26, + textAlign: 'center' + }, + { + text: '是', + fontSize: 26, + textAlign: 'center' + }, + { + text: '无', + fontSize: 26, + textAlign: 'center' + }, + { + text: '缘', + fontSize: 26, + textAlign: 'center' + }, + { + text: '无', + fontSize: 26, + textAlign: 'center' + }, + { + text: '故', + fontSize: 26, + textAlign: 'center' + }, + { + text: '的', + fontSize: 26, + textAlign: 'center' + }, + { + text: '尘', + fontSize: 26, + textAlign: 'center' + }, + { + text: '埃\n', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '无', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '缘', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '无', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '故', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '的', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '游', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '走\n', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '黑', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '暗', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '只', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '需', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '要', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '张', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '开', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '一', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '张', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '缝', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '隙\n', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '就', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '能', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '挂', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '起', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '飓', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + }, + { + text: '风\n', + fontSize: 26, + textAlign: 'center', + fill: '#0f51b5' + } + ] + }); + shapes.push(r); + let angle = 0; + r.animate().to({ stroke: 'pink' }, 10000, 'linear'); + // .onFrame(() => { + // angle += 0.01; + // console.log(angle); + // r.setAttributes({ fill: `linear-gradient(${angle}deg, red 0%, green 100%)` }); + // }); shapes.push( createRichText({ @@ -1030,7 +1029,7 @@ export const page = () => { // .replaceAll('"', '\\"')}; width: 30; height: 30; id: circle-0" />` // ); - shapes.length = 0; + // shapes.length = 0; shapes.push(rt); diff --git a/packages/vrender/package.json b/packages/vrender/package.json index 7cf1b7e7b..8d2584e0a 100644 --- a/packages/vrender/package.json +++ b/packages/vrender/package.json @@ -1,6 +1,6 @@ { "name": "@visactor/vrender", - "version": "0.20.15", + "version": "0.20.16", "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.15", - "@visactor/vrender-kits": "workspace:0.20.15" + "@visactor/vrender-core": "workspace:0.20.16", + "@visactor/vrender-kits": "workspace:0.20.16" }, "devDependencies": { "@internal/bundler": "workspace:*", diff --git a/tools/bugserver-trigger/package.json b/tools/bugserver-trigger/package.json index 6f26dd10c..889f41b11 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.15", - "@visactor/vrender-core": "workspace:0.20.15", - "@visactor/vrender-kits": "workspace:0.20.15", - "@visactor/vrender-components": "workspace:0.20.15" + "@visactor/vrender": "workspace:0.20.16", + "@visactor/vrender-core": "workspace:0.20.16", + "@visactor/vrender-kits": "workspace:0.20.16", + "@visactor/vrender-components": "workspace:0.20.16" }, "devDependencies": { "@rushstack/eslint-patch": "~1.1.4",