@visactor/vrender-core 0.17.20-alpha.6 → 0.17.20-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/cjs/canvas/empty-context.d.ts +4 -1
  2. package/cjs/canvas/empty-context.js +5 -1
  3. package/cjs/canvas/empty-context.js.map +1 -1
  4. package/cjs/core/contributions/layerHandler/offscreen2d-contribution.js +4 -4
  5. package/cjs/core/contributions/layerHandler/offscreen2d-contribution.js.map +1 -1
  6. package/cjs/core/contributions/window/base-contribution.d.ts +8 -2
  7. package/cjs/core/contributions/window/base-contribution.js +15 -2
  8. package/cjs/core/contributions/window/base-contribution.js.map +1 -1
  9. package/cjs/core/graphic-utils.js +10 -6
  10. package/cjs/core/graphic-utils.js.map +1 -1
  11. package/cjs/core/layer.d.ts +0 -1
  12. package/cjs/core/layer.js +5 -23
  13. package/cjs/core/layer.js.map +1 -1
  14. package/cjs/core/stage.d.ts +5 -11
  15. package/cjs/core/stage.js +57 -66
  16. package/cjs/core/stage.js.map +1 -1
  17. package/cjs/core/window.d.ts +9 -2
  18. package/cjs/core/window.js +40 -4
  19. package/cjs/core/window.js.map +1 -1
  20. package/cjs/event/event-manager.js +1 -1
  21. package/cjs/event/event-manager.js.map +1 -1
  22. package/cjs/event/event-system.d.ts +3 -2
  23. package/cjs/event/event-system.js +12 -8
  24. package/cjs/event/event-system.js.map +1 -1
  25. package/cjs/graphic/config.js +1 -1
  26. package/cjs/graphic/config.js.map +1 -1
  27. package/cjs/graphic/richtext.d.ts +44 -1
  28. package/cjs/graphic/richtext.js +13 -2
  29. package/cjs/graphic/richtext.js.map +1 -1
  30. package/cjs/interface/context.d.ts +1 -0
  31. package/cjs/interface/context.js.map +1 -1
  32. package/cjs/interface/event.d.ts +3 -9
  33. package/cjs/interface/event.js.map +1 -1
  34. package/cjs/interface/graphic/richText.js.map +1 -1
  35. package/cjs/interface/layer.d.ts +5 -10
  36. package/cjs/interface/layer.js.map +1 -1
  37. package/cjs/interface/picker.d.ts +0 -1
  38. package/cjs/interface/picker.js.map +1 -1
  39. package/cjs/interface/render.d.ts +2 -5
  40. package/cjs/interface/render.js.map +1 -1
  41. package/cjs/interface/stage.d.ts +2 -1
  42. package/cjs/interface/stage.js.map +1 -1
  43. package/cjs/interface/window.d.ts +14 -3
  44. package/cjs/interface/window.js.map +1 -1
  45. package/cjs/picker/picker-service.js +6 -14
  46. package/cjs/picker/picker-service.js.map +1 -1
  47. package/cjs/plugins/builtin-plugin/incremental-auto-render-plugin.js +2 -4
  48. package/cjs/plugins/builtin-plugin/incremental-auto-render-plugin.js.map +1 -1
  49. package/cjs/render/contributions/render/area-render.js +2 -4
  50. package/cjs/render/contributions/render/area-render.js.map +1 -1
  51. package/cjs/render/contributions/render/draw-contribution.js +17 -23
  52. package/cjs/render/contributions/render/draw-contribution.js.map +1 -1
  53. package/cjs/render/contributions/render/incremental-draw-contribution.js +11 -19
  54. package/cjs/render/contributions/render/incremental-draw-contribution.js.map +1 -1
  55. package/es/canvas/empty-context.d.ts +4 -1
  56. package/es/canvas/empty-context.js +4 -1
  57. package/es/canvas/empty-context.js.map +1 -1
  58. package/es/core/contributions/layerHandler/offscreen2d-contribution.js +4 -4
  59. package/es/core/contributions/layerHandler/offscreen2d-contribution.js.map +1 -1
  60. package/es/core/contributions/window/base-contribution.d.ts +8 -2
  61. package/es/core/contributions/window/base-contribution.js +15 -1
  62. package/es/core/contributions/window/base-contribution.js.map +1 -1
  63. package/es/core/graphic-utils.js +10 -6
  64. package/es/core/graphic-utils.js.map +1 -1
  65. package/es/core/layer.d.ts +0 -1
  66. package/es/core/layer.js +5 -23
  67. package/es/core/layer.js.map +1 -1
  68. package/es/core/stage.d.ts +5 -11
  69. package/es/core/stage.js +58 -67
  70. package/es/core/stage.js.map +1 -1
  71. package/es/core/window.d.ts +9 -2
  72. package/es/core/window.js +40 -4
  73. package/es/core/window.js.map +1 -1
  74. package/es/event/event-manager.js +1 -1
  75. package/es/event/event-manager.js.map +1 -1
  76. package/es/event/event-system.d.ts +3 -2
  77. package/es/event/event-system.js +13 -9
  78. package/es/event/event-system.js.map +1 -1
  79. package/es/graphic/config.js +1 -1
  80. package/es/graphic/config.js.map +1 -1
  81. package/es/graphic/richtext.d.ts +44 -1
  82. package/es/graphic/richtext.js +13 -2
  83. package/es/graphic/richtext.js.map +1 -1
  84. package/es/interface/context.d.ts +1 -0
  85. package/es/interface/context.js.map +1 -1
  86. package/es/interface/event.d.ts +3 -9
  87. package/es/interface/event.js.map +1 -1
  88. package/es/interface/graphic/richText.js.map +1 -1
  89. package/es/interface/layer.d.ts +5 -10
  90. package/es/interface/layer.js.map +1 -1
  91. package/es/interface/picker.d.ts +0 -1
  92. package/es/interface/picker.js.map +1 -1
  93. package/es/interface/render.d.ts +2 -5
  94. package/es/interface/render.js.map +1 -1
  95. package/es/interface/stage.d.ts +2 -1
  96. package/es/interface/stage.js.map +1 -1
  97. package/es/interface/window.d.ts +14 -3
  98. package/es/interface/window.js.map +1 -1
  99. package/es/picker/picker-service.js +7 -15
  100. package/es/picker/picker-service.js.map +1 -1
  101. package/es/plugins/builtin-plugin/incremental-auto-render-plugin.js +2 -4
  102. package/es/plugins/builtin-plugin/incremental-auto-render-plugin.js.map +1 -1
  103. package/es/render/contributions/render/area-render.js +2 -4
  104. package/es/render/contributions/render/area-render.js.map +1 -1
  105. package/es/render/contributions/render/draw-contribution.js +17 -23
  106. package/es/render/contributions/render/draw-contribution.js.map +1 -1
  107. package/es/render/contributions/render/incremental-draw-contribution.js +11 -19
  108. package/es/render/contributions/render/incremental-draw-contribution.js.map +1 -1
  109. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import { type AABBBounds, type OBBBounds } from '@visactor/vutils';
2
- import type { IRichText, IRichTextCharacter, RichTextGlobalAlignType, RichTextGlobalBaselineType, RichTextVerticalDirection, RichTextWordBreak, IRichTextGraphicAttribute, IStage, ILayer, IRichTextIcon, EventPoint } from '../interface';
2
+ import type { IRichText, IRichTextCharacter, RichTextGlobalAlignType, RichTextGlobalBaselineType, RichTextVerticalDirection, RichTextWordBreak, IRichTextGraphicAttribute, IRichTextImageCharacter, IRichTextParagraphCharacter, IStage, ILayer, IRichTextIcon, EventPoint } from '../interface';
3
3
  import { Graphic } from './graphic';
4
4
  import Frame from './richtext/frame';
5
5
  export declare class RichText extends Graphic<IRichTextGraphicAttribute> implements IRichText {
@@ -69,6 +69,49 @@ export declare class RichText extends Graphic<IRichTextGraphicAttribute> impleme
69
69
  protected needUpdateTags(keys: string[]): boolean;
70
70
  protected needUpdateTag(key: string): boolean;
71
71
  getFrameCache(): Frame;
72
+ combinedStyleToCharacter(config: IRichTextImageCharacter | IRichTextParagraphCharacter): {
73
+ lineHeight?: string | number;
74
+ textAlign?: CanvasTextAlign;
75
+ textBaseline?: CanvasTextBaseline;
76
+ direction?: import("../interface").RichTextLayoutDirectionType;
77
+ text: string | number;
78
+ fontSize: any;
79
+ fontFamily: any;
80
+ fill: any;
81
+ stroke: any;
82
+ fontWeight: any;
83
+ fontStyle: any;
84
+ textDecoration?: import("../interface").RichTextTextDecoration;
85
+ script?: import("../interface").RichTextScript;
86
+ underline?: boolean;
87
+ lineThrough?: boolean;
88
+ } | {
89
+ lineHeight?: string | number;
90
+ textAlign?: CanvasTextAlign;
91
+ textBaseline?: CanvasTextBaseline;
92
+ direction?: import("../interface").RichTextLayoutDirectionType;
93
+ image: string | HTMLImageElement | HTMLCanvasElement;
94
+ width: number;
95
+ height: number;
96
+ backgroundShowMode?: "always" | "hover";
97
+ backgroundFill?: boolean | import("../interface").IColor;
98
+ backgroundFillOpacity?: number;
99
+ backgroundStroke?: boolean | import("../interface").IColor;
100
+ backgroundStrokeOpacity?: number;
101
+ backgroundRadius?: number;
102
+ backgroundWidth?: number;
103
+ backgroundHeight?: number;
104
+ id?: string;
105
+ margin?: number | number[];
106
+ funcType?: string;
107
+ hoverImage?: string | HTMLImageElement | HTMLCanvasElement;
108
+ fill: any;
109
+ stroke: any;
110
+ fontSize: any;
111
+ fontFamily: any;
112
+ fontStyle: any;
113
+ fontWeight: any;
114
+ };
72
115
  doUpdateFrameCache(): void;
73
116
  clone(): RichText;
74
117
  setStage(stage?: IStage, layer?: ILayer): void;
@@ -119,11 +119,22 @@ export class RichText extends Graphic {
119
119
  return this.shouldUpdateShape() && (this.doUpdateFrameCache(), this.clearUpdateShapeTag()),
120
120
  this._frameCache;
121
121
  }
122
+ combinedStyleToCharacter(config) {
123
+ const {fill: fill, stroke: stroke, fontSize: fontSize, fontFamily: fontFamily, fontStyle: fontStyle, fontWeight: fontWeight} = this.attribute;
124
+ return Object.assign({
125
+ fill: fill,
126
+ stroke: stroke,
127
+ fontSize: fontSize,
128
+ fontFamily: fontFamily,
129
+ fontStyle: fontStyle,
130
+ fontWeight: fontWeight
131
+ }, config);
132
+ }
122
133
  doUpdateFrameCache() {
123
134
  var _a;
124
135
  const {textConfig: textConfig = [], maxWidth: maxWidth, maxHeight: maxHeight, width: width, height: height, ellipsis: ellipsis, wordBreak: wordBreak, verticalDirection: verticalDirection, textAlign: textAlign, textBaseline: textBaseline, layoutDirection: layoutDirection, singleLine: singleLine} = this.attribute, paragraphs = [];
125
136
  for (let i = 0; i < textConfig.length; i++) if ("image" in textConfig[i]) {
126
- const config = textConfig[i], iconCache = config.id && this._frameCache && this._frameCache.icons && this._frameCache.icons.get(config.id);
137
+ const config = this.combinedStyleToCharacter(textConfig[i]), iconCache = config.id && this._frameCache && this._frameCache.icons && this._frameCache.icons.get(config.id);
127
138
  if (iconCache) paragraphs.push(iconCache); else {
128
139
  const icon = new RichTextIcon(config);
129
140
  icon.successCallback = () => {
@@ -132,7 +143,7 @@ export class RichText extends Graphic {
132
143
  }, icon.richtextId = config.id, paragraphs.push(icon);
133
144
  }
134
145
  } else {
135
- const richTextConfig = textConfig[i];
146
+ const richTextConfig = this.combinedStyleToCharacter(textConfig[i]);
136
147
  if (isNumber(richTextConfig.text) && (richTextConfig.text = `${richTextConfig.text}`),
137
148
  richTextConfig.text && richTextConfig.text.includes("\n")) {
138
149
  const textParts = richTextConfig.text.split("\n");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphic/richtext.ts"],"names":[],"mappings":"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","file":"richtext.js","sourcesContent":["import { isNumber, type AABBBounds, type OBBBounds } from '@visactor/vutils';\nimport type {\n IRichText,\n IRichTextCharacter,\n RichTextGlobalAlignType,\n RichTextGlobalBaselineType,\n RichTextVerticalDirection,\n RichTextWordBreak,\n IRichTextGraphicAttribute,\n IRichTextImageCharacter,\n IRichTextParagraphCharacter,\n IStage,\n ILayer,\n IRichTextIcon,\n EventPoint\n} from '../interface';\nimport { Graphic, GRAPHIC_UPDATE_TAG_KEY, NOWORK_ANIMATE_ATTR } from './graphic';\nimport { DefaultRichTextAttribute } from './config';\nimport Frame from './richtext/frame';\nimport Paragraph from './richtext/paragraph';\nimport Wrapper from './richtext/wrapper';\nimport { getTheme } from './theme';\nimport { RichTextIcon } from './richtext/icon';\nimport type { FederatedMouseEvent } from '../event';\nimport { application } from '../application';\nimport { parsePadding } from '../common/utils';\nimport { RICHTEXT_NUMBER_TYPE } from './constants';\n\nconst RICHTEXT_UPDATE_TAG_KEY = [\n 'width',\n 'height',\n 'ellipsis',\n 'wordBreak',\n 'verticalDirection',\n 'maxHeight',\n 'maxWidth',\n 'textAlign',\n 'textBaseline',\n 'textConfig',\n 'layoutDirection',\n ...GRAPHIC_UPDATE_TAG_KEY\n];\n\nexport class RichText extends Graphic<IRichTextGraphicAttribute> implements IRichText {\n type: 'richtext' = 'richtext';\n\n _frameCache: Frame; // 富文本布局画布\n _currentHoverIcon: IRichTextIcon | null = null;\n\n static NOWORK_ANIMATE_ATTR = {\n ellipsis: 1,\n wordBreak: 1,\n verticalDirection: 1,\n textAlign: 1,\n textBaseline: 1,\n textConfig: 1,\n layoutDirection: 1,\n ...NOWORK_ANIMATE_ATTR\n };\n\n constructor(params?: IRichTextGraphicAttribute) {\n super(params);\n this.numberType = RICHTEXT_NUMBER_TYPE;\n }\n\n get width(): number {\n return this.attribute.width ?? DefaultRichTextAttribute.width;\n }\n set width(w: number) {\n if (this.attribute.width === w) {\n return;\n }\n this.attribute.width = w;\n this.addUpdateShapeAndBoundsTag();\n }\n get height(): number {\n return this.attribute.height ?? DefaultRichTextAttribute.height;\n }\n set height(h: number) {\n if (this.attribute.height === h) {\n return;\n }\n this.attribute.height = h;\n this.addUpdateShapeAndBoundsTag();\n }\n get maxWidth(): number | undefined {\n return this.attribute.maxWidth;\n }\n set maxWidth(mw: number | undefined) {\n if (this.attribute.maxWidth === mw) {\n return;\n }\n this.attribute.maxWidth = mw;\n this.addUpdateShapeAndBoundsTag();\n }\n get maxHeight(): number | undefined {\n return this.attribute.maxHeight;\n }\n set maxHeight(mh: number | undefined) {\n if (this.attribute.maxHeight === mh) {\n return;\n }\n this.attribute.maxHeight = mh;\n this.addUpdateShapeAndBoundsTag();\n }\n get ellipsis(): boolean | string {\n return this.attribute.ellipsis ?? DefaultRichTextAttribute.ellipsis;\n }\n set ellipsis(e: boolean | string) {\n if (this.attribute.ellipsis === e) {\n return;\n }\n this.attribute.ellipsis = e;\n this.addUpdateShapeAndBoundsTag();\n }\n get wordBreak(): RichTextWordBreak {\n return this.attribute.wordBreak ?? DefaultRichTextAttribute.wordBreak;\n }\n set wordBreak(wb: RichTextWordBreak) {\n if (this.attribute.wordBreak === wb) {\n return;\n }\n this.attribute.wordBreak = wb;\n this.addUpdateShapeAndBoundsTag();\n }\n get verticalDirection(): RichTextVerticalDirection {\n return this.attribute.verticalDirection ?? DefaultRichTextAttribute.verticalDirection;\n }\n set verticalDirection(vd: RichTextVerticalDirection) {\n if (this.attribute.verticalDirection === vd) {\n return;\n }\n this.attribute.verticalDirection = vd;\n this.addUpdateShapeAndBoundsTag();\n }\n get textAlign(): RichTextGlobalAlignType {\n return this.attribute.textAlign ?? DefaultRichTextAttribute.textAlign;\n }\n set textAlign(align: RichTextGlobalAlignType) {\n if (this.attribute.textAlign === align) {\n return;\n }\n this.attribute.textAlign = align;\n this.addUpdateShapeAndBoundsTag();\n }\n get textBaseline(): RichTextGlobalBaselineType {\n return this.attribute.textBaseline ?? DefaultRichTextAttribute.textBaseline;\n }\n set textBaseline(baseline: RichTextGlobalBaselineType) {\n if (this.attribute.textBaseline === baseline) {\n return;\n }\n this.attribute.textBaseline = baseline;\n this.addUpdateShapeAndBoundsTag();\n }\n get textConfig(): IRichTextCharacter[] {\n return this.attribute.textConfig ?? DefaultRichTextAttribute.textConfig;\n }\n set textConfig(config: IRichTextCharacter[]) {\n this.attribute.textConfig = config;\n this.addUpdateShapeAndBoundsTag();\n }\n\n protected doUpdateAABBBounds(): AABBBounds {\n const richTextTheme = getTheme(this).richtext;\n this._AABBBounds.clear();\n const attribute = this.attribute;\n const bounds = application.graphicService.updateRichTextAABBBounds(\n attribute,\n getTheme(this).richtext,\n this._AABBBounds,\n this\n ) as AABBBounds;\n\n const { boundsPadding = richTextTheme.boundsPadding } = attribute;\n const paddingArray = parsePadding(boundsPadding);\n if (paddingArray) {\n bounds.expand(paddingArray);\n }\n\n this.clearUpdateBoundTag();\n return bounds;\n }\n\n protected tryUpdateOBBBounds(): OBBBounds {\n throw new Error('暂不支持');\n }\n\n getDefaultAttribute(name: string) {\n return DefaultRichTextAttribute[name];\n }\n\n protected needUpdateTags(keys: string[]): boolean {\n return super.needUpdateTags(keys, RICHTEXT_UPDATE_TAG_KEY);\n }\n protected needUpdateTag(key: string): boolean {\n return super.needUpdateTag(key, RICHTEXT_UPDATE_TAG_KEY);\n }\n getFrameCache(): Frame {\n if (this.shouldUpdateShape()) {\n this.doUpdateFrameCache();\n this.clearUpdateShapeTag();\n }\n return this._frameCache;\n }\n doUpdateFrameCache() {\n // 1. 测量,生成paragraph\n const {\n textConfig = [],\n maxWidth,\n maxHeight,\n width,\n height,\n ellipsis,\n wordBreak,\n verticalDirection,\n textAlign,\n textBaseline,\n layoutDirection,\n singleLine\n } = this.attribute;\n const paragraphs: (Paragraph | RichTextIcon)[] = [];\n\n for (let i = 0; i < textConfig.length; i++) {\n if ('image' in textConfig[i]) {\n const config = textConfig[i] as IRichTextImageCharacter;\n // 直接创建icon Mark\n const iconCache =\n config.id && this._frameCache && this._frameCache.icons && this._frameCache.icons.get(config.id);\n if (iconCache) {\n paragraphs.push(iconCache as RichTextIcon);\n } else {\n const icon = new RichTextIcon(config);\n icon.successCallback = () => {\n this.addUpdateBoundTag();\n this.stage?.renderNextFrame();\n };\n icon.richtextId = config.id;\n paragraphs.push(icon);\n }\n } else {\n const richTextConfig = textConfig[i] as IRichTextParagraphCharacter;\n if (isNumber(richTextConfig.text)) {\n richTextConfig.text = `${richTextConfig.text}`;\n }\n if (richTextConfig.text && richTextConfig.text.includes('\\n')) {\n // 如果有文字内有换行符,将该段文字切为多段,并在后一段加入newLine标记\n const textParts = richTextConfig.text.split('\\n');\n for (let j = 0; j < textParts.length; j++) {\n paragraphs.push(new Paragraph(textParts[j], j !== 0, richTextConfig));\n }\n } else if (richTextConfig.text) {\n paragraphs.push(new Paragraph(richTextConfig.text, false, richTextConfig));\n }\n }\n }\n\n // 2. 布局,生成frame\n // const frameHeight =\n // typeof maxHeight === 'number' && (!height || height > maxHeight) // height = 0或height>maxHeight,使用maxHeight布局\n // ? maxHeight\n // : height;\n // const frameWidth =\n // typeof maxWidth === 'number' && (!width || width > maxWidth) // height = 0或height>maxWidth,使用maxWidth布局\n // ? maxWidth\n // : width;\n\n const maxWidthFinite = typeof maxWidth === 'number' && Number.isFinite(maxWidth) && maxWidth > 0;\n const maxHeightFinite = typeof maxHeight === 'number' && Number.isFinite(maxHeight) && maxHeight > 0;\n\n const richTextWidthEnable =\n typeof width === 'number' &&\n Number.isFinite(width) &&\n width > 0 &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (!maxWidthFinite || width <= maxWidth);\n const richTextHeightEnable =\n typeof height === 'number' &&\n Number.isFinite(height) &&\n height > 0 &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (!maxHeightFinite || height <= maxHeight);\n\n const frameWidth = richTextWidthEnable ? width : maxWidthFinite ? maxWidth : 0;\n const frameHeight = richTextHeightEnable ? height : maxHeightFinite ? maxHeight : 0;\n\n const frame = new Frame(\n 0,\n 0,\n frameWidth || 0,\n frameHeight || 0,\n ellipsis,\n wordBreak,\n verticalDirection,\n textAlign,\n textBaseline,\n layoutDirection || 'horizontal',\n // typeof maxWidth === 'number' && (!width || width > maxWidth),\n // typeof maxHeight === 'number' && (!height || height > maxHeight),\n !richTextWidthEnable && maxWidthFinite,\n !richTextHeightEnable && maxHeightFinite,\n singleLine || false,\n this._frameCache?.icons\n );\n const wrapper = new Wrapper(frame);\n for (let i = 0; i < paragraphs.length; i++) {\n wrapper.deal(paragraphs[i]);\n }\n\n wrapper.send(); // 最后一行手动输出\n\n // 如果对应的配置宽度不可用,那么需要额外进行一次对齐\n const directionEnable = frame.layoutDirection === 'horizontal' ? richTextWidthEnable : richTextHeightEnable;\n if (!directionEnable) {\n // 使用实际宽度\n const frameSize = frame.getActualSizeWidthEllipsis();\n let offsetSize = frame.layoutDirection === 'horizontal' ? frameSize.width : frameSize.height;\n // 如果最大值可用\n if (frame.layoutDirection === 'horizontal' ? maxWidthFinite : maxHeightFinite) {\n // 取2者中的较小值\n offsetSize = Math.min(\n offsetSize,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n frame.layoutDirection === 'horizontal' ? maxWidth : maxHeight\n );\n }\n\n frame.lines.forEach(function (l) {\n l.calcOffset(offsetSize, false);\n });\n }\n\n this._frameCache = frame;\n\n // this.bindIconEvent();\n }\n\n clone() {\n return new RichText({ ...this.attribute });\n }\n\n setStage(stage?: IStage, layer?: ILayer) {\n super.setStage(stage, layer);\n const frameCache = this.getFrameCache();\n // for (let i = 0; i < frameCache.icons.length; i++) {\n // const icon = frameCache.icons[i];\n // icon.setStage(stage, layer);\n // }\n frameCache.icons.forEach(icon => {\n icon.setStage(stage, layer);\n });\n }\n\n // richtext绑定icon交互事件,供外部调用\n bindIconEvent() {\n this.addEventListener('pointermove', (e: FederatedMouseEvent) => {\n const pickedIcon = this.pickIcon(e.global);\n if (pickedIcon && pickedIcon === this._currentHoverIcon) {\n // do nothing\n } else if (pickedIcon) {\n this._currentHoverIcon?.setHoverState(false);\n this._currentHoverIcon = pickedIcon;\n this._currentHoverIcon.setHoverState(true);\n this.stage?.setCursor(pickedIcon.attribute.cursor);\n this.stage?.renderNextFrame();\n } else if (!pickedIcon && this._currentHoverIcon) {\n this._currentHoverIcon.setHoverState(false);\n this._currentHoverIcon = null;\n this.stage?.setCursor();\n // console.log('setCursor()');\n\n this.stage?.renderNextFrame();\n }\n });\n\n this.addEventListener('pointerleave', (e: FederatedMouseEvent) => {\n if (this._currentHoverIcon) {\n this._currentHoverIcon.setHoverState(false);\n this._currentHoverIcon = null;\n this.stage?.setCursor();\n this.stage?.renderNextFrame();\n }\n });\n }\n\n pickIcon(point: EventPoint): IRichTextIcon | undefined {\n const frameCache = this.getFrameCache();\n const { e: x, f: y } = this.globalTransMatrix;\n // for (let i = 0; i < frameCache.icons.length; i++) {\n // const icon = frameCache.icons[i];\n // if (icon.containsPoint(point.x - x, point.y - y)) {\n // return icon;\n // }\n // }\n let pickIcon: IRichTextIcon | undefined;\n frameCache.icons.forEach(icon => {\n if (icon.AABBBounds.containsPoint({ x: point.x - x, y: point.y - y })) {\n pickIcon = icon;\n\n pickIcon.globalX = (pickIcon.attribute.x ?? 0) + x;\n pickIcon.globalY = (pickIcon.attribute.y ?? 0) + y;\n }\n });\n\n return pickIcon;\n }\n\n getNoWorkAnimateAttr(): Record<string, number> {\n return RichText.NOWORK_ANIMATE_ATTR;\n }\n}\n\nexport function createRichText(attributes: IRichTextGraphicAttribute): IRichText {\n return new RichText(attributes);\n}\n"]}
1
+ {"version":3,"sources":["../src/graphic/richtext.ts"],"names":[],"mappings":"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","file":"richtext.js","sourcesContent":["import { isNumber, type AABBBounds, type OBBBounds } from '@visactor/vutils';\nimport type {\n IRichText,\n IRichTextCharacter,\n RichTextGlobalAlignType,\n RichTextGlobalBaselineType,\n RichTextVerticalDirection,\n RichTextWordBreak,\n IRichTextGraphicAttribute,\n IRichTextImageCharacter,\n IRichTextParagraphCharacter,\n IStage,\n ILayer,\n IRichTextIcon,\n EventPoint\n} from '../interface';\nimport { Graphic, GRAPHIC_UPDATE_TAG_KEY, NOWORK_ANIMATE_ATTR } from './graphic';\nimport { DefaultRichTextAttribute } from './config';\nimport Frame from './richtext/frame';\nimport Paragraph from './richtext/paragraph';\nimport Wrapper from './richtext/wrapper';\nimport { getTheme } from './theme';\nimport { RichTextIcon } from './richtext/icon';\nimport type { FederatedMouseEvent } from '../event';\nimport { application } from '../application';\nimport { parsePadding } from '../common/utils';\nimport { RICHTEXT_NUMBER_TYPE } from './constants';\n\nconst RICHTEXT_UPDATE_TAG_KEY = [\n 'width',\n 'height',\n 'ellipsis',\n 'wordBreak',\n 'verticalDirection',\n 'maxHeight',\n 'maxWidth',\n 'textAlign',\n 'textBaseline',\n 'textConfig',\n 'layoutDirection',\n ...GRAPHIC_UPDATE_TAG_KEY\n];\n\nexport class RichText extends Graphic<IRichTextGraphicAttribute> implements IRichText {\n type: 'richtext' = 'richtext';\n\n _frameCache: Frame; // 富文本布局画布\n _currentHoverIcon: IRichTextIcon | null = null;\n\n static NOWORK_ANIMATE_ATTR = {\n ellipsis: 1,\n wordBreak: 1,\n verticalDirection: 1,\n textAlign: 1,\n textBaseline: 1,\n textConfig: 1,\n layoutDirection: 1,\n ...NOWORK_ANIMATE_ATTR\n };\n\n constructor(params?: IRichTextGraphicAttribute) {\n super(params);\n this.numberType = RICHTEXT_NUMBER_TYPE;\n }\n\n get width(): number {\n return this.attribute.width ?? DefaultRichTextAttribute.width;\n }\n set width(w: number) {\n if (this.attribute.width === w) {\n return;\n }\n this.attribute.width = w;\n this.addUpdateShapeAndBoundsTag();\n }\n get height(): number {\n return this.attribute.height ?? DefaultRichTextAttribute.height;\n }\n set height(h: number) {\n if (this.attribute.height === h) {\n return;\n }\n this.attribute.height = h;\n this.addUpdateShapeAndBoundsTag();\n }\n get maxWidth(): number | undefined {\n return this.attribute.maxWidth;\n }\n set maxWidth(mw: number | undefined) {\n if (this.attribute.maxWidth === mw) {\n return;\n }\n this.attribute.maxWidth = mw;\n this.addUpdateShapeAndBoundsTag();\n }\n get maxHeight(): number | undefined {\n return this.attribute.maxHeight;\n }\n set maxHeight(mh: number | undefined) {\n if (this.attribute.maxHeight === mh) {\n return;\n }\n this.attribute.maxHeight = mh;\n this.addUpdateShapeAndBoundsTag();\n }\n get ellipsis(): boolean | string {\n return this.attribute.ellipsis ?? DefaultRichTextAttribute.ellipsis;\n }\n set ellipsis(e: boolean | string) {\n if (this.attribute.ellipsis === e) {\n return;\n }\n this.attribute.ellipsis = e;\n this.addUpdateShapeAndBoundsTag();\n }\n get wordBreak(): RichTextWordBreak {\n return this.attribute.wordBreak ?? DefaultRichTextAttribute.wordBreak;\n }\n set wordBreak(wb: RichTextWordBreak) {\n if (this.attribute.wordBreak === wb) {\n return;\n }\n this.attribute.wordBreak = wb;\n this.addUpdateShapeAndBoundsTag();\n }\n get verticalDirection(): RichTextVerticalDirection {\n return this.attribute.verticalDirection ?? DefaultRichTextAttribute.verticalDirection;\n }\n set verticalDirection(vd: RichTextVerticalDirection) {\n if (this.attribute.verticalDirection === vd) {\n return;\n }\n this.attribute.verticalDirection = vd;\n this.addUpdateShapeAndBoundsTag();\n }\n get textAlign(): RichTextGlobalAlignType {\n return this.attribute.textAlign ?? DefaultRichTextAttribute.textAlign;\n }\n set textAlign(align: RichTextGlobalAlignType) {\n if (this.attribute.textAlign === align) {\n return;\n }\n this.attribute.textAlign = align;\n this.addUpdateShapeAndBoundsTag();\n }\n get textBaseline(): RichTextGlobalBaselineType {\n return this.attribute.textBaseline ?? DefaultRichTextAttribute.textBaseline;\n }\n set textBaseline(baseline: RichTextGlobalBaselineType) {\n if (this.attribute.textBaseline === baseline) {\n return;\n }\n this.attribute.textBaseline = baseline;\n this.addUpdateShapeAndBoundsTag();\n }\n get textConfig(): IRichTextCharacter[] {\n return this.attribute.textConfig ?? DefaultRichTextAttribute.textConfig;\n }\n set textConfig(config: IRichTextCharacter[]) {\n this.attribute.textConfig = config;\n this.addUpdateShapeAndBoundsTag();\n }\n\n protected doUpdateAABBBounds(): AABBBounds {\n const richTextTheme = getTheme(this).richtext;\n this._AABBBounds.clear();\n const attribute = this.attribute;\n const bounds = application.graphicService.updateRichTextAABBBounds(\n attribute,\n getTheme(this).richtext,\n this._AABBBounds,\n this\n ) as AABBBounds;\n\n const { boundsPadding = richTextTheme.boundsPadding } = attribute;\n const paddingArray = parsePadding(boundsPadding);\n if (paddingArray) {\n bounds.expand(paddingArray);\n }\n\n this.clearUpdateBoundTag();\n return bounds;\n }\n\n protected tryUpdateOBBBounds(): OBBBounds {\n throw new Error('暂不支持');\n }\n\n getDefaultAttribute(name: string) {\n return DefaultRichTextAttribute[name];\n }\n\n protected needUpdateTags(keys: string[]): boolean {\n return super.needUpdateTags(keys, RICHTEXT_UPDATE_TAG_KEY);\n }\n protected needUpdateTag(key: string): boolean {\n return super.needUpdateTag(key, RICHTEXT_UPDATE_TAG_KEY);\n }\n getFrameCache(): Frame {\n if (this.shouldUpdateShape()) {\n this.doUpdateFrameCache();\n this.clearUpdateShapeTag();\n }\n return this._frameCache;\n }\n combinedStyleToCharacter(config: IRichTextImageCharacter | IRichTextParagraphCharacter) {\n const { fill, stroke, fontSize, fontFamily, fontStyle, fontWeight } = this.attribute as any;\n return { fill, stroke, fontSize, fontFamily, fontStyle, fontWeight, ...config };\n }\n doUpdateFrameCache() {\n // 1. 测量,生成paragraph\n const {\n textConfig = [],\n maxWidth,\n maxHeight,\n width,\n height,\n ellipsis,\n wordBreak,\n verticalDirection,\n textAlign,\n textBaseline,\n layoutDirection,\n singleLine\n } = this.attribute;\n const paragraphs: (Paragraph | RichTextIcon)[] = [];\n\n for (let i = 0; i < textConfig.length; i++) {\n if ('image' in textConfig[i]) {\n const config = this.combinedStyleToCharacter(\n textConfig[i] as IRichTextImageCharacter\n ) as IRichTextImageCharacter;\n // 直接创建icon Mark\n const iconCache =\n config.id && this._frameCache && this._frameCache.icons && this._frameCache.icons.get(config.id);\n if (iconCache) {\n paragraphs.push(iconCache as RichTextIcon);\n } else {\n const icon = new RichTextIcon(config);\n icon.successCallback = () => {\n this.addUpdateBoundTag();\n this.stage?.renderNextFrame();\n };\n icon.richtextId = config.id;\n paragraphs.push(icon);\n }\n } else {\n const richTextConfig = this.combinedStyleToCharacter(\n textConfig[i] as IRichTextParagraphCharacter\n ) as IRichTextParagraphCharacter;\n if (isNumber(richTextConfig.text)) {\n richTextConfig.text = `${richTextConfig.text}`;\n }\n if (richTextConfig.text && richTextConfig.text.includes('\\n')) {\n // 如果有文字内有换行符,将该段文字切为多段,并在后一段加入newLine标记\n const textParts = richTextConfig.text.split('\\n');\n for (let j = 0; j < textParts.length; j++) {\n paragraphs.push(new Paragraph(textParts[j], j !== 0, richTextConfig));\n }\n } else if (richTextConfig.text) {\n paragraphs.push(new Paragraph(richTextConfig.text, false, richTextConfig));\n }\n }\n }\n\n // 2. 布局,生成frame\n // const frameHeight =\n // typeof maxHeight === 'number' && (!height || height > maxHeight) // height = 0或height>maxHeight,使用maxHeight布局\n // ? maxHeight\n // : height;\n // const frameWidth =\n // typeof maxWidth === 'number' && (!width || width > maxWidth) // height = 0或height>maxWidth,使用maxWidth布局\n // ? maxWidth\n // : width;\n\n const maxWidthFinite = typeof maxWidth === 'number' && Number.isFinite(maxWidth) && maxWidth > 0;\n const maxHeightFinite = typeof maxHeight === 'number' && Number.isFinite(maxHeight) && maxHeight > 0;\n\n const richTextWidthEnable =\n typeof width === 'number' &&\n Number.isFinite(width) &&\n width > 0 &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (!maxWidthFinite || width <= maxWidth);\n const richTextHeightEnable =\n typeof height === 'number' &&\n Number.isFinite(height) &&\n height > 0 &&\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (!maxHeightFinite || height <= maxHeight);\n\n const frameWidth = richTextWidthEnable ? width : maxWidthFinite ? maxWidth : 0;\n const frameHeight = richTextHeightEnable ? height : maxHeightFinite ? maxHeight : 0;\n\n const frame = new Frame(\n 0,\n 0,\n frameWidth || 0,\n frameHeight || 0,\n ellipsis,\n wordBreak,\n verticalDirection,\n textAlign,\n textBaseline,\n layoutDirection || 'horizontal',\n // typeof maxWidth === 'number' && (!width || width > maxWidth),\n // typeof maxHeight === 'number' && (!height || height > maxHeight),\n !richTextWidthEnable && maxWidthFinite,\n !richTextHeightEnable && maxHeightFinite,\n singleLine || false,\n this._frameCache?.icons\n );\n const wrapper = new Wrapper(frame);\n for (let i = 0; i < paragraphs.length; i++) {\n wrapper.deal(paragraphs[i]);\n }\n\n wrapper.send(); // 最后一行手动输出\n\n // 如果对应的配置宽度不可用,那么需要额外进行一次对齐\n const directionEnable = frame.layoutDirection === 'horizontal' ? richTextWidthEnable : richTextHeightEnable;\n if (!directionEnable) {\n // 使用实际宽度\n const frameSize = frame.getActualSizeWidthEllipsis();\n let offsetSize = frame.layoutDirection === 'horizontal' ? frameSize.width : frameSize.height;\n // 如果最大值可用\n if (frame.layoutDirection === 'horizontal' ? maxWidthFinite : maxHeightFinite) {\n // 取2者中的较小值\n offsetSize = Math.min(\n offsetSize,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n frame.layoutDirection === 'horizontal' ? maxWidth : maxHeight\n );\n }\n\n frame.lines.forEach(function (l) {\n l.calcOffset(offsetSize, false);\n });\n }\n\n this._frameCache = frame;\n\n // this.bindIconEvent();\n }\n\n clone() {\n return new RichText({ ...this.attribute });\n }\n\n setStage(stage?: IStage, layer?: ILayer) {\n super.setStage(stage, layer);\n const frameCache = this.getFrameCache();\n // for (let i = 0; i < frameCache.icons.length; i++) {\n // const icon = frameCache.icons[i];\n // icon.setStage(stage, layer);\n // }\n frameCache.icons.forEach(icon => {\n icon.setStage(stage, layer);\n });\n }\n\n // richtext绑定icon交互事件,供外部调用\n bindIconEvent() {\n this.addEventListener('pointermove', (e: FederatedMouseEvent) => {\n const pickedIcon = this.pickIcon(e.global);\n if (pickedIcon && pickedIcon === this._currentHoverIcon) {\n // do nothing\n } else if (pickedIcon) {\n this._currentHoverIcon?.setHoverState(false);\n this._currentHoverIcon = pickedIcon;\n this._currentHoverIcon.setHoverState(true);\n this.stage?.setCursor(pickedIcon.attribute.cursor);\n this.stage?.renderNextFrame();\n } else if (!pickedIcon && this._currentHoverIcon) {\n this._currentHoverIcon.setHoverState(false);\n this._currentHoverIcon = null;\n this.stage?.setCursor();\n // console.log('setCursor()');\n\n this.stage?.renderNextFrame();\n }\n });\n\n this.addEventListener('pointerleave', (e: FederatedMouseEvent) => {\n if (this._currentHoverIcon) {\n this._currentHoverIcon.setHoverState(false);\n this._currentHoverIcon = null;\n this.stage?.setCursor();\n this.stage?.renderNextFrame();\n }\n });\n }\n\n pickIcon(point: EventPoint): IRichTextIcon | undefined {\n const frameCache = this.getFrameCache();\n const { e: x, f: y } = this.globalTransMatrix;\n // for (let i = 0; i < frameCache.icons.length; i++) {\n // const icon = frameCache.icons[i];\n // if (icon.containsPoint(point.x - x, point.y - y)) {\n // return icon;\n // }\n // }\n let pickIcon: IRichTextIcon | undefined;\n frameCache.icons.forEach(icon => {\n if (icon.AABBBounds.containsPoint({ x: point.x - x, y: point.y - y })) {\n pickIcon = icon;\n\n pickIcon.globalX = (pickIcon.attribute.x ?? 0) + x;\n pickIcon.globalY = (pickIcon.attribute.y ?? 0) + y;\n }\n });\n\n return pickIcon;\n }\n\n getNoWorkAnimateAttr(): Record<string, number> {\n return RichText.NOWORK_ANIMATE_ATTR;\n }\n}\n\nexport function createRichText(attributes: IRichTextGraphicAttribute): IRichText {\n return new RichText(attributes);\n}\n"]}
@@ -139,6 +139,7 @@ export interface IContext2d extends Releaseable {
139
139
  setTextStyleWithoutAlignBaseline: (params: Partial<ITextStyleParams>, defaultParams?: ITextStyleParams, z?: number) => void;
140
140
  draw: (...params: any) => void;
141
141
  clearMatrix: (setTransform?: boolean, dpr?: number) => void;
142
+ setClearMatrix: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
142
143
  onlyTranslate: (dpr?: number) => boolean;
143
144
  }
144
145
  export interface IContextLike {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/context.ts"],"names":[],"mappings":"","file":"context.js","sourcesContent":["import type { Matrix, IMatrix, IBoundsLike, IPointLike } from '@visactor/vutils';\nimport type { ICamera } from './camera';\nimport type { ICanvas } from './canvas';\nimport type { Releaseable } from './common';\nimport type { mat4, vec3 } from './matrix';\nimport type { IFillType, IStrokeType, ITransform } from './graphic';\n\nexport interface IConicalGradientData {\n addColorStop: (pos: number, color: string) => void;\n readonly stops: [number, string][];\n GetPattern: (minW: number, minH: number, deltaAngle?: number) => CanvasPattern | null;\n}\n\n// 用于commonStyle函数的参数\nexport interface ICommonStyleParams {\n fill?: IFillType;\n fillOpacity?: number;\n shadowBlur?: number;\n shadowColor?: string;\n shadowOffsetX?: number;\n shadowOffsetY?: number;\n globalCompositeOperation?: CanvasRenderingContext2D['globalCompositeOperation'] | '';\n opacity?: number;\n blur?: number;\n}\n\nexport interface IStrokeStyleParams {\n stroke?: IStrokeType | IStrokeType[];\n strokeOpacity?: number;\n lineDash?: number[];\n lineDashOffset?: number;\n lineWidth?: number;\n lineCap?: CanvasLineCap;\n lineJoin?: CanvasLineJoin;\n miterLimit?: number;\n opacity?: number;\n}\nexport interface ITextStyleParams {\n font?: string;\n fontSize: number;\n fontFamily?: string;\n fontWeight?: string | number;\n textAlign?: CanvasTextAlign;\n textBaseline?: CanvasTextBaseline;\n scaleIn3d?: boolean;\n}\n\nexport interface ISetCommonStyleParams {\n attribute: Partial<ICommonStyleParams & ITransform>;\n AABBBounds: IBoundsLike;\n}\n\nexport interface ISetStrokeStyleParams {\n attribute: Partial<IStrokeStyleParams & ITransform>;\n AABBBounds: IBoundsLike;\n}\nexport interface IContext2d extends Releaseable {\n stack: IMatrix[];\n inuse?: boolean;\n camera?: ICamera;\n modelMatrix?: mat4;\n drawPromise?: Promise<any>;\n // 属性代理\n fillStyle: string | CanvasGradient | CanvasPattern;\n disableFill?: boolean;\n disableStroke?: boolean;\n disableBeginPath?: boolean;\n /**\n * @deprecated font方法不建议使用,请使用setTextStyle\n */\n font: string;\n globalAlpha: number;\n lineCap: string;\n lineDashOffset: number;\n lineJoin: string;\n lineWidth: number;\n miterLimit: number;\n shadowBlur: number;\n shadowColor: string;\n shadowOffsetX: number;\n shadowOffsetY: number;\n strokeStyle: string | CanvasGradient | CanvasPattern;\n dpr: number;\n /**\n * @deprecated textAlign方法不建议使用,请使用setTextStyle\n */\n textAlign: string;\n /**\n * @deprecated textBaseline方法不建议使用,请使用setTextStyle\n */\n textBaseline: string;\n nativeContext: CanvasRenderingContext2D | any;\n canvas: ICanvas;\n [key: string]: any; //类型没有索引签名\n\n getCanvas: () => ICanvas;\n\n getContext: () => any;\n\n /**\n * 设置当前ctx 的transform信息\n */\n setTransformForCurrent: (force?: boolean) => void;\n /**\n * 获取当前矩阵信息\n */\n currentMatrix: IMatrix;\n\n /**\n * 清空画布\n */\n clear: () => void;\n\n restore: () => void;\n highPerformanceRestore: () => void;\n\n /**\n *\n * @param angle 弧度数\n */\n rotate: (angle: number, setTransform?: boolean) => void;\n\n save: () => void;\n highPerformanceSave: () => void;\n\n project?: (x: number, y: number, z?: number) => IPointLike;\n view?: (x: number, y: number, z?: number) => vec3;\n\n scale: (x: number, y: number, setTransform?: boolean) => void;\n\n scalePoint: (sx: number, sy: number, px: number, py: number, setTransform?: boolean) => void;\n transform: (\n m11: number,\n m12: number,\n m21: number,\n m22: number,\n dx: number,\n dy: number,\n setTransform?: boolean\n ) => void;\n transformFromMatrix: (matrix: Matrix, setTransform?: boolean) => void;\n setTransform: (\n m11: number,\n m12: number,\n m21: number,\n m22: number,\n dx: number,\n dy: number,\n setTransform?: boolean,\n dpr?: number\n ) => void;\n setTransformFromMatrix: (matrix: Matrix, setTransform?: boolean, dpr?: number) => void;\n\n resetTransform: (setTransform?: boolean, dpr?: number) => void;\n\n translate: (x: number, y: number, setTransform?: boolean) => void;\n /**\n * 旋转角度,自动转换为弧度\n * @param deg 角度数\n */\n rotateDegrees: (deg: number, setTransform?: boolean) => void;\n\n /**\n * 绕点旋转\n * @param rad 弧度\n * @param x 旋转中心点x\n * @param y 旋转中心点y\n */\n rotateAbout: (rad: number, x: number, y: number, setTransform?: boolean) => void;\n\n /**\n * 绕点旋转\n * @param deg 旋转角度\n * @param x 旋转中心点x\n * @param y 旋转中心点y\n */\n rotateDegreesAbout: (deg: number, x: number, y: number, setTransform?: boolean) => void;\n\n beginPath: () => void;\n\n clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);\n\n arc: (\n x: number,\n y: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean,\n z?: number\n ) => void;\n\n arcTo: (x1: number, y1: number, x2: number, y2: number, radius: number) => void;\n\n bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;\n\n closePath: () => void;\n\n ellipse: (\n x: number,\n y: number,\n radiusX: number,\n radiusY: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean\n ) => void;\n\n lineTo: (x: number, y: number, z?: number) => void;\n\n moveTo: (x: number, y: number, z?: number) => void;\n\n quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number, z?: number) => void;\n\n rect: (x: number, y: number, w: number, h: number, z?: number) => void;\n\n createImageData: (imageDataOrSw: number | ImageData, sh?: number) => ImageData;\n\n createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradient;\n\n createPattern: (\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ICanvas | any,\n repetition: string\n ) => CanvasPattern | null;\n\n createRadialGradient: (x0: number, y0: number, r0: number, x1: number, y1: number, r1: number) => CanvasGradient;\n\n createConicGradient: (x: number, y: number, startAngle: number, endAngle: number) => IConicalGradientData | null;\n\n // createConicGradient: (x: number, y: number, startAngle: number, endAngle: number) => IConicalGradient | null;\n\n // fill(fillRule?: CanvasFillRule): void;\n fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;\n\n fillRect: (x: number, y: number, w: number, h: number) => void;\n\n clearRect: (x: number, y: number, w: number, h: number) => void;\n\n fillText: (text: string, x: number, y: number, z?: number) => void;\n\n getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;\n\n getLineDash: () => number[];\n\n isPointInPath: (x: number, y: number) => boolean;\n isPointInStroke: (x: number, y: number) => boolean;\n\n measureText: (text: string, method?: 'native' | 'simple' | 'quick') => { width: number };\n\n putImageData: (imagedata: ImageData, dx: number, dy: number) => void;\n\n setLineDash: (segments: number[]) => void;\n\n stroke: (path?: Path2D) => void;\n\n strokeRect: (x: number, y: number, w: number, h: number) => void;\n\n strokeText: (text: string, x: number, y: number, z?: number) => void;\n\n drawImage: ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n dstX: number,\n dstY: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n srcX: number,\n srcY: number,\n srcW: number,\n srcH: number,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void);\n\n setCommonStyle: (\n params: ISetCommonStyleParams,\n attribute: ICommonStyleParams,\n // 用于渐变色\n offsetX: number,\n offsetY: number,\n defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]\n ) => void;\n\n setShadowBlendStyle?: (\n params: ISetCommonStyleParams,\n attribute: ICommonStyleParams,\n defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]\n ) => void;\n\n setStrokeStyle: (\n params: ISetStrokeStyleParams,\n attribute: IStrokeStyleParams,\n // 用于渐变色\n offsetX: number,\n offsetY: number,\n defultParams?: Required<IStrokeStyleParams> | Partial<IStrokeStyleParams>[]\n ) => void;\n\n setTextStyle: (params: Partial<ITextStyleParams>, defaultParams?: ITextStyleParams, z?: number) => void;\n setTextStyleWithoutAlignBaseline: (\n params: Partial<ITextStyleParams>,\n defaultParams?: ITextStyleParams,\n z?: number\n ) => void;\n\n draw: (...params: any) => void;\n\n clearMatrix: (setTransform?: boolean, dpr?: number) => void;\n onlyTranslate: (dpr?: number) => boolean;\n}\n\nexport interface IContextLike {\n // 属性代理\n fillStyle: string | CanvasGradient | CanvasPattern;\n /**\n * @deprecated font方法不建议使用,请使用setTextStyle\n */\n font: string;\n globalAlpha: number;\n lineCap: string;\n lineDashOffset: number;\n lineJoin: string;\n lineWidth: number;\n miterLimit: number;\n shadowBlur: number;\n shadowColor: string;\n shadowOffsetX: number;\n shadowOffsetY: number;\n strokeStyle: string | CanvasGradient | CanvasPattern;\n dpr: number;\n /**\n * @deprecated textAlign方法不建议使用,请使用setTextStyle\n */\n textAlign: string;\n /**\n * @deprecated textBaseline方法不建议使用,请使用setTextStyle\n */\n textBaseline: string;\n nativeContext: CanvasRenderingContext2D | any;\n [key: string]: any; //类型没有索引签名\n\n /**\n * 清空画布\n */\n clear: () => void;\n\n restore: () => void;\n\n save: () => void;\n\n // transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n\n translate: (x: number, y: number) => void;\n\n beginPath: () => void;\n\n clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);\n\n arc: (x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean) => void;\n\n arcTo: ((x1: number, y1: number, x2: number, y2: number, radius: number) => void) &\n ((x1: number, y1: number, x2: number, y2: number, radiusX: number, radiusY: number, rotation: number) => void);\n\n bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;\n\n closePath: () => void;\n\n ellipse: (\n x: number,\n y: number,\n radiusX: number,\n radiusY: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean\n ) => void;\n\n lineTo: (x: number, y: number) => void;\n\n moveTo: (x: number, y: number) => void;\n\n quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number) => void;\n\n rect: (x: number, y: number, w: number, h: number) => void;\n\n fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;\n\n fillRect: (x: number, y: number, w: number, h: number) => void;\n\n clearRect: (x: number, y: number, w: number, h: number) => void;\n\n fillText: (text: string, x: number, y: number, maxWidth?: number) => void;\n\n getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;\n\n getLineDash: () => number[];\n\n isPointInPath: (x: number, y: number) => boolean;\n isPointInStroke: (x: number, y: number) => boolean;\n\n measureText: (text: string, method?: 'native' | 'simple' | 'quick') => { width: number };\n\n putImageData: (\n imagedata: ImageData,\n dx: number,\n dy: number,\n dirtyX?: number,\n dirtyY?: number,\n dirtyWidth?: number,\n dirtyHeight?: number\n ) => void;\n\n setLineDash: (segments: number[]) => void;\n\n stroke: (path?: Path2D) => void;\n\n strokeRect: (x: number, y: number, w: number, h: number) => void;\n\n strokeText: (text: string, x: number, y: number, maxWidth?: number) => void;\n\n drawImage: ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n dstX: number,\n dstY: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n srcX: number,\n srcY: number,\n srcW: number,\n srcH: number,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void);\n\n clearMatrix: () => void;\n onlyTranslate: () => boolean;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/context.ts"],"names":[],"mappings":"","file":"context.js","sourcesContent":["import type { Matrix, IMatrix, IBoundsLike, IPointLike } from '@visactor/vutils';\nimport type { ICamera } from './camera';\nimport type { ICanvas } from './canvas';\nimport type { Releaseable } from './common';\nimport type { mat4, vec3 } from './matrix';\nimport type { IFillType, IStrokeType, ITransform } from './graphic';\n\nexport interface IConicalGradientData {\n addColorStop: (pos: number, color: string) => void;\n readonly stops: [number, string][];\n GetPattern: (minW: number, minH: number, deltaAngle?: number) => CanvasPattern | null;\n}\n\n// 用于commonStyle函数的参数\nexport interface ICommonStyleParams {\n fill?: IFillType;\n fillOpacity?: number;\n shadowBlur?: number;\n shadowColor?: string;\n shadowOffsetX?: number;\n shadowOffsetY?: number;\n globalCompositeOperation?: CanvasRenderingContext2D['globalCompositeOperation'] | '';\n opacity?: number;\n blur?: number;\n}\n\nexport interface IStrokeStyleParams {\n stroke?: IStrokeType | IStrokeType[];\n strokeOpacity?: number;\n lineDash?: number[];\n lineDashOffset?: number;\n lineWidth?: number;\n lineCap?: CanvasLineCap;\n lineJoin?: CanvasLineJoin;\n miterLimit?: number;\n opacity?: number;\n}\nexport interface ITextStyleParams {\n font?: string;\n fontSize: number;\n fontFamily?: string;\n fontWeight?: string | number;\n textAlign?: CanvasTextAlign;\n textBaseline?: CanvasTextBaseline;\n scaleIn3d?: boolean;\n}\n\nexport interface ISetCommonStyleParams {\n attribute: Partial<ICommonStyleParams & ITransform>;\n AABBBounds: IBoundsLike;\n}\n\nexport interface ISetStrokeStyleParams {\n attribute: Partial<IStrokeStyleParams & ITransform>;\n AABBBounds: IBoundsLike;\n}\nexport interface IContext2d extends Releaseable {\n stack: IMatrix[];\n inuse?: boolean;\n camera?: ICamera;\n modelMatrix?: mat4;\n drawPromise?: Promise<any>;\n // 属性代理\n fillStyle: string | CanvasGradient | CanvasPattern;\n disableFill?: boolean;\n disableStroke?: boolean;\n disableBeginPath?: boolean;\n /**\n * @deprecated font方法不建议使用,请使用setTextStyle\n */\n font: string;\n globalAlpha: number;\n lineCap: string;\n lineDashOffset: number;\n lineJoin: string;\n lineWidth: number;\n miterLimit: number;\n shadowBlur: number;\n shadowColor: string;\n shadowOffsetX: number;\n shadowOffsetY: number;\n strokeStyle: string | CanvasGradient | CanvasPattern;\n dpr: number;\n /**\n * @deprecated textAlign方法不建议使用,请使用setTextStyle\n */\n textAlign: string;\n /**\n * @deprecated textBaseline方法不建议使用,请使用setTextStyle\n */\n textBaseline: string;\n nativeContext: CanvasRenderingContext2D | any;\n canvas: ICanvas;\n [key: string]: any; //类型没有索引签名\n\n getCanvas: () => ICanvas;\n\n getContext: () => any;\n\n /**\n * 设置当前ctx 的transform信息\n */\n setTransformForCurrent: (force?: boolean) => void;\n /**\n * 获取当前矩阵信息\n */\n currentMatrix: IMatrix;\n\n /**\n * 清空画布\n */\n clear: () => void;\n\n restore: () => void;\n highPerformanceRestore: () => void;\n\n /**\n *\n * @param angle 弧度数\n */\n rotate: (angle: number, setTransform?: boolean) => void;\n\n save: () => void;\n highPerformanceSave: () => void;\n\n project?: (x: number, y: number, z?: number) => IPointLike;\n view?: (x: number, y: number, z?: number) => vec3;\n\n scale: (x: number, y: number, setTransform?: boolean) => void;\n\n scalePoint: (sx: number, sy: number, px: number, py: number, setTransform?: boolean) => void;\n transform: (\n m11: number,\n m12: number,\n m21: number,\n m22: number,\n dx: number,\n dy: number,\n setTransform?: boolean\n ) => void;\n transformFromMatrix: (matrix: Matrix, setTransform?: boolean) => void;\n setTransform: (\n m11: number,\n m12: number,\n m21: number,\n m22: number,\n dx: number,\n dy: number,\n setTransform?: boolean,\n dpr?: number\n ) => void;\n setTransformFromMatrix: (matrix: Matrix, setTransform?: boolean, dpr?: number) => void;\n\n resetTransform: (setTransform?: boolean, dpr?: number) => void;\n\n translate: (x: number, y: number, setTransform?: boolean) => void;\n /**\n * 旋转角度,自动转换为弧度\n * @param deg 角度数\n */\n rotateDegrees: (deg: number, setTransform?: boolean) => void;\n\n /**\n * 绕点旋转\n * @param rad 弧度\n * @param x 旋转中心点x\n * @param y 旋转中心点y\n */\n rotateAbout: (rad: number, x: number, y: number, setTransform?: boolean) => void;\n\n /**\n * 绕点旋转\n * @param deg 旋转角度\n * @param x 旋转中心点x\n * @param y 旋转中心点y\n */\n rotateDegreesAbout: (deg: number, x: number, y: number, setTransform?: boolean) => void;\n\n beginPath: () => void;\n\n clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);\n\n arc: (\n x: number,\n y: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean,\n z?: number\n ) => void;\n\n arcTo: (x1: number, y1: number, x2: number, y2: number, radius: number) => void;\n\n bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;\n\n closePath: () => void;\n\n ellipse: (\n x: number,\n y: number,\n radiusX: number,\n radiusY: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean\n ) => void;\n\n lineTo: (x: number, y: number, z?: number) => void;\n\n moveTo: (x: number, y: number, z?: number) => void;\n\n quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number, z?: number) => void;\n\n rect: (x: number, y: number, w: number, h: number, z?: number) => void;\n\n createImageData: (imageDataOrSw: number | ImageData, sh?: number) => ImageData;\n\n createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradient;\n\n createPattern: (\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ICanvas | any,\n repetition: string\n ) => CanvasPattern | null;\n\n createRadialGradient: (x0: number, y0: number, r0: number, x1: number, y1: number, r1: number) => CanvasGradient;\n\n createConicGradient: (x: number, y: number, startAngle: number, endAngle: number) => IConicalGradientData | null;\n\n // createConicGradient: (x: number, y: number, startAngle: number, endAngle: number) => IConicalGradient | null;\n\n // fill(fillRule?: CanvasFillRule): void;\n fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;\n\n fillRect: (x: number, y: number, w: number, h: number) => void;\n\n clearRect: (x: number, y: number, w: number, h: number) => void;\n\n fillText: (text: string, x: number, y: number, z?: number) => void;\n\n getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;\n\n getLineDash: () => number[];\n\n isPointInPath: (x: number, y: number) => boolean;\n isPointInStroke: (x: number, y: number) => boolean;\n\n measureText: (text: string, method?: 'native' | 'simple' | 'quick') => { width: number };\n\n putImageData: (imagedata: ImageData, dx: number, dy: number) => void;\n\n setLineDash: (segments: number[]) => void;\n\n stroke: (path?: Path2D) => void;\n\n strokeRect: (x: number, y: number, w: number, h: number) => void;\n\n strokeText: (text: string, x: number, y: number, z?: number) => void;\n\n drawImage: ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n dstX: number,\n dstY: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any,\n srcX: number,\n srcY: number,\n srcW: number,\n srcH: number,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void);\n\n setCommonStyle: (\n params: ISetCommonStyleParams,\n attribute: ICommonStyleParams,\n // 用于渐变色\n offsetX: number,\n offsetY: number,\n defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]\n ) => void;\n\n setShadowBlendStyle?: (\n params: ISetCommonStyleParams,\n attribute: ICommonStyleParams,\n defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]\n ) => void;\n\n setStrokeStyle: (\n params: ISetStrokeStyleParams,\n attribute: IStrokeStyleParams,\n // 用于渐变色\n offsetX: number,\n offsetY: number,\n defultParams?: Required<IStrokeStyleParams> | Partial<IStrokeStyleParams>[]\n ) => void;\n\n setTextStyle: (params: Partial<ITextStyleParams>, defaultParams?: ITextStyleParams, z?: number) => void;\n setTextStyleWithoutAlignBaseline: (\n params: Partial<ITextStyleParams>,\n defaultParams?: ITextStyleParams,\n z?: number\n ) => void;\n\n draw: (...params: any) => void;\n\n clearMatrix: (setTransform?: boolean, dpr?: number) => void;\n setClearMatrix: (a: number, b: number, c: number, d: number, e: number, f: number) => void;\n onlyTranslate: (dpr?: number) => boolean;\n}\n\nexport interface IContextLike {\n // 属性代理\n fillStyle: string | CanvasGradient | CanvasPattern;\n /**\n * @deprecated font方法不建议使用,请使用setTextStyle\n */\n font: string;\n globalAlpha: number;\n lineCap: string;\n lineDashOffset: number;\n lineJoin: string;\n lineWidth: number;\n miterLimit: number;\n shadowBlur: number;\n shadowColor: string;\n shadowOffsetX: number;\n shadowOffsetY: number;\n strokeStyle: string | CanvasGradient | CanvasPattern;\n dpr: number;\n /**\n * @deprecated textAlign方法不建议使用,请使用setTextStyle\n */\n textAlign: string;\n /**\n * @deprecated textBaseline方法不建议使用,请使用setTextStyle\n */\n textBaseline: string;\n nativeContext: CanvasRenderingContext2D | any;\n [key: string]: any; //类型没有索引签名\n\n /**\n * 清空画布\n */\n clear: () => void;\n\n restore: () => void;\n\n save: () => void;\n\n // transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;\n\n translate: (x: number, y: number) => void;\n\n beginPath: () => void;\n\n clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);\n\n arc: (x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean) => void;\n\n arcTo: ((x1: number, y1: number, x2: number, y2: number, radius: number) => void) &\n ((x1: number, y1: number, x2: number, y2: number, radiusX: number, radiusY: number, rotation: number) => void);\n\n bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;\n\n closePath: () => void;\n\n ellipse: (\n x: number,\n y: number,\n radiusX: number,\n radiusY: number,\n rotation: number,\n startAngle: number,\n endAngle: number,\n anticlockwise?: boolean\n ) => void;\n\n lineTo: (x: number, y: number) => void;\n\n moveTo: (x: number, y: number) => void;\n\n quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number) => void;\n\n rect: (x: number, y: number, w: number, h: number) => void;\n\n fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;\n\n fillRect: (x: number, y: number, w: number, h: number) => void;\n\n clearRect: (x: number, y: number, w: number, h: number) => void;\n\n fillText: (text: string, x: number, y: number, maxWidth?: number) => void;\n\n getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;\n\n getLineDash: () => number[];\n\n isPointInPath: (x: number, y: number) => boolean;\n isPointInStroke: (x: number, y: number) => boolean;\n\n measureText: (text: string, method?: 'native' | 'simple' | 'quick') => { width: number };\n\n putImageData: (\n imagedata: ImageData,\n dx: number,\n dy: number,\n dirtyX?: number,\n dirtyY?: number,\n dirtyWidth?: number,\n dirtyHeight?: number\n ) => void;\n\n setLineDash: (segments: number[]) => void;\n\n stroke: (path?: Path2D) => void;\n\n strokeRect: (x: number, y: number, w: number, h: number) => void;\n\n strokeText: (text: string, x: number, y: number, maxWidth?: number) => void;\n\n drawImage: ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n dstX: number,\n dstY: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void) &\n ((\n image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any,\n srcX: number,\n srcY: number,\n srcW: number,\n srcH: number,\n dstX: number,\n dstY: number,\n dstW: number,\n dstH: number\n ) => void);\n\n clearMatrix: () => void;\n onlyTranslate: () => boolean;\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  import type { INode } from './node-tree';
2
- import type { Dict, IBounds } from '@visactor/vutils';
2
+ import type { Dict } from '@visactor/vutils';
3
3
  import type { Cursor, IGraphicAttribute } from './graphic';
4
4
  import type { IDomRectLike, IEventElement } from './common';
5
5
  import type { ICanvas } from './canvas';
6
6
  import type { IGlobal } from './global';
7
+ import type { IWindow } from './window';
7
8
  export type EventPoint = {
8
9
  x: number;
9
10
  y: number;
@@ -147,18 +148,11 @@ export type IElementLike = Omit<IEventElement, 'on' | 'off' | 'once' | 'emit' |
147
148
  getBoundingClientRect: () => IDomRectLike;
148
149
  };
149
150
  export type RenderConfig = {
150
- targetElement: IElementLike;
151
+ targetElement: IWindow;
151
152
  resolution: number;
152
153
  rootNode: IEventTarget;
153
154
  global: IGlobal;
154
155
  autoPreventDefault?: boolean;
155
- viewport: {
156
- x: number;
157
- y: number;
158
- width: number;
159
- height: number;
160
- viewBox?: IBounds;
161
- };
162
156
  clickInterval?: number;
163
157
  supportsTouchEvents?: boolean;
164
158
  supportsPointerEvents?: boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/event.ts"],"names":[],"mappings":"","file":"event.js","sourcesContent":["import type { INode } from './node-tree';\nimport type { Dict, IBounds } from '@visactor/vutils';\nimport type { Cursor, IGraphicAttribute } from './graphic';\nimport type { IDomRectLike, IEventElement } from './common';\nimport type { ICanvas } from './canvas';\nimport type { IGlobal } from './global';\n\nexport type EventPoint = {\n x: number;\n y: number;\n};\n\nexport interface IEventManager {\n rootTarget: IEventTarget;\n dispatch: any;\n cursor: Cursor | string;\n addEventMapping: (type: string, fn: (e: IFederatedEvent, target: IEventTarget) => void) => void;\n dispatchEvent: (e: IFederatedEvent, type?: string) => void;\n mapEvent: (e: IFederatedEvent) => void;\n propagate: (e: IFederatedEvent, type?: string) => void;\n propagationPath: (target: IEventTarget) => IEventTarget[];\n copyWheelData: (from: IFederatedWheelEvent, to: IFederatedWheelEvent) => void;\n copyPointerData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n copyMouseData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n copyData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n}\n\nexport interface IFederatedEvent<N = Event> {\n bubbles: boolean;\n cancelBubble: boolean;\n cancelable: boolean;\n composed: boolean;\n currentTarget: IEventTarget | null;\n defaultPrevented: boolean;\n eventPhase: number;\n isTrusted: boolean;\n returnValue: boolean;\n srcElement: IEventTarget;\n target: IEventTarget | null;\n timeStamp: number;\n type: string;\n nativeEvent: N;\n originalEvent: IFederatedEvent<N> | null;\n propagationStopped: boolean;\n propagationImmediatelyStopped: boolean;\n path: IEventTarget[];\n manager?: IEventManager;\n detail: any;\n view: any;\n layer: EventPoint;\n get layerX(): number;\n get layerY(): number;\n page: EventPoint;\n get pageX(): number;\n get pageY(): number;\n canvas: EventPoint;\n get x(): number;\n get y(): number;\n get canvasX(): number;\n get canvasY(): number;\n viewport: EventPoint;\n get viewX(): number;\n get viewY(): number;\n composedPath: () => IEventTarget[];\n preventDefault: () => void;\n stopImmediatePropagation: () => void;\n stopPropagation: () => void;\n initEvent: () => void;\n initUIEvent: () => void;\n clone: () => void;\n which: number;\n}\n\nexport interface IFederatedMouseEvent extends IFederatedEvent {\n altKey: boolean;\n button: number;\n buttons: number;\n ctrlKey: boolean;\n metaKey: boolean;\n relatedTarget: EventTarget | null;\n shiftKey: boolean;\n client: EventPoint;\n get clientX(): number;\n get clientY(): number;\n detail: number;\n movement: EventPoint;\n get movementX(): number;\n get movementY(): number;\n offset: EventPoint;\n get offsetX(): number;\n get offsetY(): number;\n global: EventPoint;\n get globalX(): number;\n get globalY(): number;\n screen: EventPoint;\n get screenX(): number;\n get screenY(): number;\n getModifierState: (key: string) => boolean;\n initMouseEvent: (\n _typeArg: string,\n _canBubbleArg: boolean,\n _cancelableArg: boolean,\n _viewArg: Window,\n _detailArg: number,\n _screenXArg: number,\n _screenYArg: number,\n _clientXArg: number,\n _clientYArg: number,\n _ctrlKeyArg: boolean,\n _altKeyArg: boolean,\n _shiftKeyArg: boolean,\n _metaKeyArg: boolean,\n _buttonArg: number,\n _relatedTargetArg: EventTarget\n ) => void;\n}\n\nexport interface IFederatedWheelEvent extends IFederatedMouseEvent {\n deltaMode: number;\n deltaX: number;\n deltaY: number;\n deltaZ: number;\n clone: () => IFederatedWheelEvent;\n}\n\nexport interface IFederatedPointerEvent extends IFederatedMouseEvent {\n pointerId: number;\n width: number;\n height: number;\n isPrimary: boolean;\n pointerType: string;\n pressure: number;\n tangentialPressure: number;\n tiltX: number;\n tiltY: number;\n twist: number;\n detail: number;\n getCoalescedEvents: () => PointerEvent[];\n getPredictedEvents: () => PointerEvent[];\n clone: () => IFederatedPointerEvent;\n}\n\n/**\n * 代码参考自 https://github.com/pixijs/pixijs\n * The MIT License\n\n Copyright (c) 2013-2023 Mathew Groves, Chad Engler\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n */\n\nexport interface IEventTarget extends INode {\n /** Whether this event target should fire UI events. */\n pickable: boolean;\n /** The parent of this event target. */\n parent: IEventTarget | null;\n /** Whether this event target should be visible. */\n visible: boolean;\n\n /** The children of this event target. */\n children?: IEventTarget[];\n\n /** Whether this event target has any children that need UI events. This can be used optimize event propagation. */\n childrenPickable?: boolean;\n\n attribute?: Partial<IGraphicAttribute>;\n\n emit: (eventName: any, data: Dict<any>) => boolean;\n\n getCursor: () => string;\n setCursor: (c?: string) => void;\n}\n\nexport interface IRender {\n visualCanvas: {\n getCanvas: () => HTMLElement;\n };\n pickEvent: (position: [number, number], children: IEventTarget[], geoPick?: boolean) => IEventTarget | null;\n [key: string]: any;\n}\n\n// 事件系统扩展接口\nexport interface IEventExtension {\n /**\n * bind events\n */\n initEvents: () => void;\n /**\n * unbind events\n */\n removeEvents: () => void;\n /**\n * release\n */\n release: () => void;\n}\n\nexport type LooseFunction = (...args: any[]) => any;\n\nexport type IElementLike = Omit<IEventElement, 'on' | 'off' | 'once' | 'emit' | 'removeAllListeners'> & {\n style: CSSStyleDeclaration | Record<string, any>;\n getNativeHandler?: () => ICanvas;\n getBoundingClientRect: () => IDomRectLike;\n};\n\nexport type RenderConfig = {\n /**\n * 事件绑定的 canvas 元素\n */\n targetElement: IElementLike;\n /**\n * 环境分辨率\n */\n resolution: number;\n /**\n * 场景树根节点\n */\n rootNode: IEventTarget;\n global: IGlobal;\n /** 是否自动阻止事件 */\n autoPreventDefault?: boolean;\n /** 绘图视口 */\n viewport: {\n x: number;\n y: number;\n width: number;\n height: number;\n viewBox?: IBounds;\n };\n /**\n * 多次点击之间的最大时间,默认为 200 ms\n * @default 200\n */\n clickInterval?: number;\n\n /**\n * @since 0.17.15\n * 是否支持touch事件,不支持就不监听touch事件\n */\n supportsTouchEvents?: boolean;\n\n /**\n * @since 0.17.15\n * 是否支持pointer事件,不支持就监听mouse事件\n */\n supportsPointerEvents?: boolean;\n};\n\nexport type NativeEvent = MouseEvent | PointerEvent | TouchEvent;\n\nexport type GraphicEventType =\n | 'pointerdown'\n | 'pointerup'\n // 指针抬起与按下的图形不同时触发\n | 'pointerupoutside'\n | 'pointertap'\n | 'pointerover'\n | 'pointerenter'\n | 'pointerleave'\n | 'pointerout'\n | 'mousedown'\n | 'mouseup'\n | 'mouseupoutside'\n // 右键操作\n | 'rightdown'\n | 'rightup'\n | 'rightupoutside'\n | 'click'\n // 双击\n | 'dblclick'\n | 'mousemove'\n | 'mouseover'\n | 'mouseout'\n // 不会冒泡\n | 'mouseenter'\n // 不会冒泡\n | 'mouseleave'\n | 'wheel'\n | 'tap'\n | 'touchstart'\n | 'touchend'\n | 'touchendoutside'\n | 'touchmove'\n | 'touchcancel'\n // dragNdrop\n | 'dragstart'\n | 'drag'\n | 'dragenter'\n | 'dragleave'\n | 'dragover'\n | 'dragend'\n | 'drop'\n // gesture\n | 'pan'\n | 'panstart'\n | 'panend'\n | 'press'\n | 'pressup'\n | 'pressend'\n | 'pinch'\n | 'pinchstart'\n | 'pinchend'\n | 'swipe';\n"]}
1
+ {"version":3,"sources":["../src/interface/event.ts"],"names":[],"mappings":"","file":"event.js","sourcesContent":["import type { INode } from './node-tree';\nimport type { Dict, IBounds } from '@visactor/vutils';\nimport type { Cursor, IGraphicAttribute } from './graphic';\nimport type { IDomRectLike, IEventElement } from './common';\nimport type { ICanvas } from './canvas';\nimport type { IGlobal } from './global';\nimport type { IWindow } from './window';\n\nexport type EventPoint = {\n x: number;\n y: number;\n};\n\nexport interface IEventManager {\n rootTarget: IEventTarget;\n dispatch: any;\n cursor: Cursor | string;\n addEventMapping: (type: string, fn: (e: IFederatedEvent, target: IEventTarget) => void) => void;\n dispatchEvent: (e: IFederatedEvent, type?: string) => void;\n mapEvent: (e: IFederatedEvent) => void;\n propagate: (e: IFederatedEvent, type?: string) => void;\n propagationPath: (target: IEventTarget) => IEventTarget[];\n copyWheelData: (from: IFederatedWheelEvent, to: IFederatedWheelEvent) => void;\n copyPointerData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n copyMouseData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n copyData: (from: IFederatedEvent, to: IFederatedEvent) => void;\n}\n\nexport interface IFederatedEvent<N = Event> {\n bubbles: boolean;\n cancelBubble: boolean;\n cancelable: boolean;\n composed: boolean;\n currentTarget: IEventTarget | null;\n defaultPrevented: boolean;\n eventPhase: number;\n isTrusted: boolean;\n returnValue: boolean;\n srcElement: IEventTarget;\n target: IEventTarget | null;\n timeStamp: number;\n type: string;\n nativeEvent: N;\n originalEvent: IFederatedEvent<N> | null;\n propagationStopped: boolean;\n propagationImmediatelyStopped: boolean;\n path: IEventTarget[];\n manager?: IEventManager;\n detail: any;\n view: any;\n layer: EventPoint;\n get layerX(): number;\n get layerY(): number;\n page: EventPoint;\n get pageX(): number;\n get pageY(): number;\n canvas: EventPoint;\n get x(): number;\n get y(): number;\n get canvasX(): number;\n get canvasY(): number;\n viewport: EventPoint;\n get viewX(): number;\n get viewY(): number;\n composedPath: () => IEventTarget[];\n preventDefault: () => void;\n stopImmediatePropagation: () => void;\n stopPropagation: () => void;\n initEvent: () => void;\n initUIEvent: () => void;\n clone: () => void;\n which: number;\n}\n\nexport interface IFederatedMouseEvent extends IFederatedEvent {\n altKey: boolean;\n button: number;\n buttons: number;\n ctrlKey: boolean;\n metaKey: boolean;\n relatedTarget: EventTarget | null;\n shiftKey: boolean;\n client: EventPoint;\n get clientX(): number;\n get clientY(): number;\n detail: number;\n movement: EventPoint;\n get movementX(): number;\n get movementY(): number;\n offset: EventPoint;\n get offsetX(): number;\n get offsetY(): number;\n global: EventPoint;\n get globalX(): number;\n get globalY(): number;\n screen: EventPoint;\n get screenX(): number;\n get screenY(): number;\n getModifierState: (key: string) => boolean;\n initMouseEvent: (\n _typeArg: string,\n _canBubbleArg: boolean,\n _cancelableArg: boolean,\n _viewArg: Window,\n _detailArg: number,\n _screenXArg: number,\n _screenYArg: number,\n _clientXArg: number,\n _clientYArg: number,\n _ctrlKeyArg: boolean,\n _altKeyArg: boolean,\n _shiftKeyArg: boolean,\n _metaKeyArg: boolean,\n _buttonArg: number,\n _relatedTargetArg: EventTarget\n ) => void;\n}\n\nexport interface IFederatedWheelEvent extends IFederatedMouseEvent {\n deltaMode: number;\n deltaX: number;\n deltaY: number;\n deltaZ: number;\n clone: () => IFederatedWheelEvent;\n}\n\nexport interface IFederatedPointerEvent extends IFederatedMouseEvent {\n pointerId: number;\n width: number;\n height: number;\n isPrimary: boolean;\n pointerType: string;\n pressure: number;\n tangentialPressure: number;\n tiltX: number;\n tiltY: number;\n twist: number;\n detail: number;\n getCoalescedEvents: () => PointerEvent[];\n getPredictedEvents: () => PointerEvent[];\n clone: () => IFederatedPointerEvent;\n}\n\n/**\n * 代码参考自 https://github.com/pixijs/pixijs\n * The MIT License\n\n Copyright (c) 2013-2023 Mathew Groves, Chad Engler\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n */\n\nexport interface IEventTarget extends INode {\n /** Whether this event target should fire UI events. */\n pickable: boolean;\n /** The parent of this event target. */\n parent: IEventTarget | null;\n /** Whether this event target should be visible. */\n visible: boolean;\n\n /** The children of this event target. */\n children?: IEventTarget[];\n\n /** Whether this event target has any children that need UI events. This can be used optimize event propagation. */\n childrenPickable?: boolean;\n\n attribute?: Partial<IGraphicAttribute>;\n\n emit: (eventName: any, data: Dict<any>) => boolean;\n\n getCursor: () => string;\n setCursor: (c?: string) => void;\n}\n\nexport interface IRender {\n visualCanvas: {\n getCanvas: () => HTMLElement;\n };\n pickEvent: (position: [number, number], children: IEventTarget[], geoPick?: boolean) => IEventTarget | null;\n [key: string]: any;\n}\n\n// 事件系统扩展接口\nexport interface IEventExtension {\n /**\n * bind events\n */\n initEvents: () => void;\n /**\n * unbind events\n */\n removeEvents: () => void;\n /**\n * release\n */\n release: () => void;\n}\n\nexport type LooseFunction = (...args: any[]) => any;\n\nexport type IElementLike = Omit<IEventElement, 'on' | 'off' | 'once' | 'emit' | 'removeAllListeners'> & {\n style: CSSStyleDeclaration | Record<string, any>;\n getNativeHandler?: () => ICanvas;\n getBoundingClientRect: () => IDomRectLike;\n};\n\nexport type RenderConfig = {\n /**\n * 事件绑定的元素\n */\n targetElement: IWindow;\n /**\n * 环境分辨率\n */\n resolution: number;\n /**\n * 场景树根节点\n */\n rootNode: IEventTarget;\n global: IGlobal;\n /** 是否自动阻止事件 */\n autoPreventDefault?: boolean;\n /**\n * 多次点击之间的最大时间,默认为 200 ms\n * @default 200\n */\n clickInterval?: number;\n\n /**\n * @since 0.17.15\n * 是否支持touch事件,不支持就不监听touch事件\n */\n supportsTouchEvents?: boolean;\n\n /**\n * @since 0.17.15\n * 是否支持pointer事件,不支持就监听mouse事件\n */\n supportsPointerEvents?: boolean;\n};\n\nexport type NativeEvent = MouseEvent | PointerEvent | TouchEvent;\n\nexport type GraphicEventType =\n | 'pointerdown'\n | 'pointerup'\n // 指针抬起与按下的图形不同时触发\n | 'pointerupoutside'\n | 'pointertap'\n | 'pointerover'\n | 'pointerenter'\n | 'pointerleave'\n | 'pointerout'\n | 'mousedown'\n | 'mouseup'\n | 'mouseupoutside'\n // 右键操作\n | 'rightdown'\n | 'rightup'\n | 'rightupoutside'\n | 'click'\n // 双击\n | 'dblclick'\n | 'mousemove'\n | 'mouseover'\n | 'mouseout'\n // 不会冒泡\n | 'mouseenter'\n // 不会冒泡\n | 'mouseleave'\n | 'wheel'\n | 'tap'\n | 'touchstart'\n | 'touchend'\n | 'touchendoutside'\n | 'touchmove'\n | 'touchcancel'\n // dragNdrop\n | 'dragstart'\n | 'drag'\n | 'dragenter'\n | 'dragleave'\n | 'dragover'\n | 'dragend'\n | 'drop'\n // gesture\n | 'pan'\n | 'panstart'\n | 'panend'\n | 'press'\n | 'pressup'\n | 'pressend'\n | 'pinch'\n | 'pinchstart'\n | 'pinchend'\n | 'swipe';\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/graphic/richText.ts"],"names":[],"mappings":"","file":"richText.js","sourcesContent":["import type { IColor } from '../color';\nimport type { IContext2d } from '../context';\nimport type { IGraphicAttribute, IGraphic } from '../graphic';\nimport type { IImage, IImageGraphicAttribute } from './image';\n\nexport type IRichTextAttribute = {\n width: number;\n height: number;\n ellipsis: boolean | string;\n wordBreak: RichTextWordBreak;\n verticalDirection: RichTextVerticalDirection;\n maxHeight: number;\n maxWidth: number;\n textAlign: RichTextGlobalAlignType;\n textBaseline: RichTextGlobalBaselineType;\n layoutDirection: RichTextLayoutDirectionType;\n textConfig: IRichTextCharacter[];\n singleLine: boolean;\n};\n\nexport type IRichTextGraphicAttribute = Partial<IGraphicAttribute> & Partial<IRichTextAttribute>;\n\nexport type RichTextWordBreak = 'break-word' | 'break-all';\nexport type RichTextVerticalDirection = 'top' | 'middle' | 'bottom';\nexport type RichTextGlobalAlignType = 'left' | 'right' | 'center';\nexport type RichTextGlobalBaselineType = 'top' | 'middle' | 'bottom';\nexport type RichTextLayoutDirectionType = 'horizontal' | 'vertical';\nexport type RichTextFontStyle = 'normal' | 'italic' | 'oblique';\nexport type RichTextTextDecoration = 'none' | 'underline' | 'line-through';\n// export type RichTextTextAlign = 'left' | 'right' | 'center';\nexport type RichTextScript = 'normal' | 'sub' | 'super';\n\nexport type IRichTextBasicCharacter = {\n lineHeight?: number | string;\n textAlign?: CanvasTextAlign; // left, right, center\n textBaseline?: CanvasTextBaseline;\n direction?: RichTextLayoutDirectionType;\n};\n\nexport type IRichTextParagraphCharacter = IRichTextBasicCharacter & {\n text: string | number;\n fontSize?: number;\n fontFamily?: string;\n fill?: IColor | boolean;\n stroke?: IColor | boolean;\n fontWeight?: string;\n // lineHeight?: number;\n fontStyle?: RichTextFontStyle; // normal, italic, oblique\n textDecoration?: RichTextTextDecoration; // none, underline, line-through\n // textAlign?: RichTextTextAlign; // left, right, center\n script?: RichTextScript; // normal, sub, super\n underline?: boolean;\n lineThrough?: boolean;\n // direction?: RichTextLayoutDirectionType;\n};\n\nexport type IRichTextImageCharacter = IRichTextBasicCharacter & {\n // 图片基础属性\n image: string | HTMLImageElement | HTMLCanvasElement;\n width: number;\n height: number;\n\n // hover相关属性\n // backgroundShow?: boolean; // 是否显示background\n backgroundShowMode?: 'always' | 'hover';\n backgroundFill?: boolean | IColor; // 背景矩形填充颜色\n backgroundFillOpacity?: number; // 背景矩形填充透明度\n backgroundStroke?: boolean | IColor; // 背景矩形边框颜色\n backgroundStrokeOpacity?: number; // 背景矩形边框透明度\n backgroundRadius?: number; // 背景矩形圆角\n // background size 同时控制了该icon的响应范围\n backgroundWidth?: number;\n backgroundHeight?: number;\n\n // 唯一标识符\n id?: string;\n\n // lineHeight?: number;\n // textAlign?: RichTextTextAlign; // left, right, center\n // direction?: RichTextLayoutDirectionType;\n margin?: number | number[];\n\n funcType?: string;\n hoverImage?: string | HTMLImageElement | HTMLCanvasElement;\n};\n\nexport type IRichTextCharacter = IRichTextParagraphCharacter | IRichTextImageCharacter;\n\nexport type IRichTextIconGraphicAttribute = IImageGraphicAttribute & {\n id?: string;\n backgroundShowMode?: 'always' | 'hover' | 'never';\n backgroundFill?: boolean | IColor; // 背景矩形填充颜色\n backgroundFillOpacity?: number; // 背景矩形填充透明度\n backgroundStroke?: boolean | IColor; // 背景矩形边框颜色\n backgroundStrokeOpacity?: number; // 背景矩形边框透明度\n backgroundRadius?: number; // 背景矩形圆角\n backgroundWidth?: number;\n backgroundHeight?: number;\n\n // lineHeight?: number;\n textAlign?: CanvasTextAlign; // left, right, center\n textBaseline?: CanvasTextBaseline;\n direction?: RichTextLayoutDirectionType;\n\n margin?: number | number[];\n\n // backgroundShow?: boolean;\n};\n\nexport interface IRichTextParagraph {\n text: string;\n ascent: number;\n descent: number;\n width: number;\n height: number;\n lineHeight: number;\n fontSize: number;\n length: number;\n newLine: boolean;\n character: IRichTextParagraphCharacter;\n left: number;\n top: number;\n direction?: 'horizontal' | 'vertical';\n widthOrigin?: number;\n heightOrigin?: number;\n textBaseline?: CanvasTextBaseline;\n ellipsis: 'normal' | 'add' | 'replace' | 'hide';\n ellipsisWidth: number;\n ellipsisOtherParagraphWidth: number;\n verticalEllipsis?: boolean;\n updateWidth: () => void;\n draw: (ctx: IContext2d, baseline: number, deltaLeft: number, isLineFirst: boolean, textAlign: string) => void;\n getWidthWithEllips: (direction: string) => number;\n}\n\nexport interface IRichTextLine {\n left: number;\n top: number;\n width: number;\n height: number;\n baseline: number;\n ascent: number;\n descent: number;\n paragraphs: (IRichTextParagraph | IRichTextIcon)[];\n actualWidth: number;\n blankWidth: number;\n textAlign: string;\n direction: 'horizontal' | 'vertical';\n directionKey: {\n width: string;\n height: string;\n left: string;\n x: string;\n y: string;\n };\n draw: (\n ctx: IContext2d,\n lastLine: boolean,\n x: number,\n y: number,\n drawIcon: (icon: IRichTextIcon, context: IContext2d, x: number, y: number, baseline: number) => void\n ) => void;\n getWidthWithEllips: () => number;\n}\n\nexport interface IRichTextFrame {\n left: number;\n top: number;\n bottom: number;\n right: number;\n width: number;\n height: number;\n actualHeight: number;\n ellipsis: boolean | string;\n wordBreak: 'break-word' | 'break-all';\n verticalDirection: 'top' | 'middle' | 'bottom';\n lines: IRichTextLine[];\n globalAlign: 'left' | 'center' | 'right' | 'start' | 'end';\n globalBaseline: 'top' | 'middle' | 'bottom';\n layoutDirection: 'horizontal' | 'vertical';\n directionKey: {\n width: string;\n height: string;\n left: string;\n top: string;\n bottom: string;\n };\n isWidthMax: boolean;\n isHeightMax: boolean;\n singleLine: boolean;\n icons: Map<string, IRichTextIcon>;\n draw: (\n ctx: IContext2d,\n drawIcon: (icon: IRichTextIcon, context: IContext2d, x: number, y: number, baseline: number) => void\n ) => boolean;\n getActualSize: () => {\n width: number;\n height: number;\n };\n getRawActualSize: () => {\n width: number;\n height: number;\n };\n getActualSizeWidthEllipsis: () => {\n width: number;\n height: number;\n };\n}\n\nexport interface IRichText extends IGraphic<IRichTextGraphicAttribute> {\n getFrameCache: () => IRichTextFrame;\n}\n\nexport interface IRichTextIcon extends IImage {\n attribute: IRichTextIconGraphicAttribute;\n richtextId?: string;\n globalX?: number;\n globalY?: number;\n\n _x: number;\n _y: number;\n _hovered: boolean;\n _marginArray: [number, number, number, number];\n\n setHoverState: (hovered: boolean) => void;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/graphic/richText.ts"],"names":[],"mappings":"","file":"richText.js","sourcesContent":["import type { IColor } from '../color';\nimport type { IContext2d } from '../context';\nimport type { IGraphicAttribute, IGraphic } from '../graphic';\nimport type { IImage, IImageGraphicAttribute } from './image';\nimport type { ITextGraphicAttribute } from './text';\n\nexport type IRichTextAttribute = {\n width: number;\n height: number;\n ellipsis: boolean | string;\n wordBreak: RichTextWordBreak;\n verticalDirection: RichTextVerticalDirection;\n maxHeight: number;\n maxWidth: number;\n textAlign: RichTextGlobalAlignType;\n textBaseline: RichTextGlobalBaselineType;\n layoutDirection: RichTextLayoutDirectionType;\n textConfig: IRichTextCharacter[];\n singleLine: boolean;\n};\n\nexport type IRichTextGraphicAttribute = Partial<IGraphicAttribute> & Partial<IRichTextAttribute>;\n\nexport type RichTextWordBreak = 'break-word' | 'break-all';\nexport type RichTextVerticalDirection = 'top' | 'middle' | 'bottom';\nexport type RichTextGlobalAlignType = 'left' | 'right' | 'center';\nexport type RichTextGlobalBaselineType = 'top' | 'middle' | 'bottom';\nexport type RichTextLayoutDirectionType = 'horizontal' | 'vertical';\nexport type RichTextFontStyle = 'normal' | 'italic' | 'oblique';\nexport type RichTextTextDecoration = 'none' | 'underline' | 'line-through';\n// export type RichTextTextAlign = 'left' | 'right' | 'center';\nexport type RichTextScript = 'normal' | 'sub' | 'super';\n\nexport type IRichTextBasicCharacter = {\n lineHeight?: number | string;\n textAlign?: CanvasTextAlign; // left, right, center\n textBaseline?: CanvasTextBaseline;\n direction?: RichTextLayoutDirectionType;\n};\n\nexport type IRichTextParagraphCharacter = IRichTextBasicCharacter & {\n text: string | number;\n fontSize?: number;\n fontFamily?: string;\n fill?: IColor | boolean;\n stroke?: IColor | boolean;\n fontWeight?: string;\n // lineHeight?: number;\n fontStyle?: RichTextFontStyle; // normal, italic, oblique\n textDecoration?: RichTextTextDecoration; // none, underline, line-through\n // textAlign?: RichTextTextAlign; // left, right, center\n script?: RichTextScript; // normal, sub, super\n underline?: boolean;\n lineThrough?: boolean;\n // direction?: RichTextLayoutDirectionType;\n};\n\nexport type IRichTextImageCharacter = IRichTextBasicCharacter & {\n // 图片基础属性\n image: string | HTMLImageElement | HTMLCanvasElement;\n width: number;\n height: number;\n\n // hover相关属性\n // backgroundShow?: boolean; // 是否显示background\n backgroundShowMode?: 'always' | 'hover';\n backgroundFill?: boolean | IColor; // 背景矩形填充颜色\n backgroundFillOpacity?: number; // 背景矩形填充透明度\n backgroundStroke?: boolean | IColor; // 背景矩形边框颜色\n backgroundStrokeOpacity?: number; // 背景矩形边框透明度\n backgroundRadius?: number; // 背景矩形圆角\n // background size 同时控制了该icon的响应范围\n backgroundWidth?: number;\n backgroundHeight?: number;\n\n // 唯一标识符\n id?: string;\n\n // lineHeight?: number;\n // textAlign?: RichTextTextAlign; // left, right, center\n // direction?: RichTextLayoutDirectionType;\n margin?: number | number[];\n\n funcType?: string;\n hoverImage?: string | HTMLImageElement | HTMLCanvasElement;\n};\n\nexport type IRichTextCharacter = IRichTextParagraphCharacter | IRichTextImageCharacter;\n\nexport type IRichTextIconGraphicAttribute = IImageGraphicAttribute & {\n id?: string;\n backgroundShowMode?: 'always' | 'hover' | 'never';\n backgroundFill?: boolean | IColor; // 背景矩形填充颜色\n backgroundFillOpacity?: number; // 背景矩形填充透明度\n backgroundStroke?: boolean | IColor; // 背景矩形边框颜色\n backgroundStrokeOpacity?: number; // 背景矩形边框透明度\n backgroundRadius?: number; // 背景矩形圆角\n backgroundWidth?: number;\n backgroundHeight?: number;\n\n // lineHeight?: number;\n textAlign?: CanvasTextAlign; // left, right, center\n textBaseline?: CanvasTextBaseline;\n direction?: RichTextLayoutDirectionType;\n\n margin?: number | number[];\n\n // backgroundShow?: boolean;\n};\n\nexport interface IRichTextParagraph {\n text: string;\n ascent: number;\n descent: number;\n width: number;\n height: number;\n lineHeight: number;\n fontSize: number;\n length: number;\n newLine: boolean;\n character: IRichTextParagraphCharacter;\n left: number;\n top: number;\n direction?: 'horizontal' | 'vertical';\n widthOrigin?: number;\n heightOrigin?: number;\n textBaseline?: CanvasTextBaseline;\n ellipsis: 'normal' | 'add' | 'replace' | 'hide';\n ellipsisWidth: number;\n ellipsisOtherParagraphWidth: number;\n verticalEllipsis?: boolean;\n updateWidth: () => void;\n draw: (ctx: IContext2d, baseline: number, deltaLeft: number, isLineFirst: boolean, textAlign: string) => void;\n getWidthWithEllips: (direction: string) => number;\n}\n\nexport interface IRichTextLine {\n left: number;\n top: number;\n width: number;\n height: number;\n baseline: number;\n ascent: number;\n descent: number;\n paragraphs: (IRichTextParagraph | IRichTextIcon)[];\n actualWidth: number;\n blankWidth: number;\n textAlign: string;\n direction: 'horizontal' | 'vertical';\n directionKey: {\n width: string;\n height: string;\n left: string;\n x: string;\n y: string;\n };\n draw: (\n ctx: IContext2d,\n lastLine: boolean,\n x: number,\n y: number,\n drawIcon: (icon: IRichTextIcon, context: IContext2d, x: number, y: number, baseline: number) => void\n ) => void;\n getWidthWithEllips: () => number;\n}\n\nexport interface IRichTextFrame {\n left: number;\n top: number;\n bottom: number;\n right: number;\n width: number;\n height: number;\n actualHeight: number;\n ellipsis: boolean | string;\n wordBreak: 'break-word' | 'break-all';\n verticalDirection: 'top' | 'middle' | 'bottom';\n lines: IRichTextLine[];\n globalAlign: 'left' | 'center' | 'right' | 'start' | 'end';\n globalBaseline: 'top' | 'middle' | 'bottom';\n layoutDirection: 'horizontal' | 'vertical';\n directionKey: {\n width: string;\n height: string;\n left: string;\n top: string;\n bottom: string;\n };\n isWidthMax: boolean;\n isHeightMax: boolean;\n singleLine: boolean;\n icons: Map<string, IRichTextIcon>;\n draw: (\n ctx: IContext2d,\n drawIcon: (icon: IRichTextIcon, context: IContext2d, x: number, y: number, baseline: number) => void\n ) => boolean;\n getActualSize: () => {\n width: number;\n height: number;\n };\n getRawActualSize: () => {\n width: number;\n height: number;\n };\n getActualSizeWidthEllipsis: () => {\n width: number;\n height: number;\n };\n}\n\nexport interface IRichText extends IGraphic<IRichTextGraphicAttribute> {\n getFrameCache: () => IRichTextFrame;\n}\n\nexport interface IRichTextIcon extends IImage {\n attribute: IRichTextIconGraphicAttribute;\n richtextId?: string;\n globalX?: number;\n globalY?: number;\n\n _x: number;\n _y: number;\n _hovered: boolean;\n _marginArray: [number, number, number, number];\n\n setHoverState: (hovered: boolean) => void;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { IAABBBounds, IBounds, IBoundsLike } from '@visactor/vutils';
1
+ import type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils';
2
2
  import type { IGraphic } from './graphic';
3
3
  import type { IGroup } from './graphic/group';
4
4
  import type { IColor } from './color';
@@ -19,12 +19,12 @@ export interface ILayerDrawParams {
19
19
  renderService: IRenderService;
20
20
  background?: string | IColor;
21
21
  updateBounds: boolean;
22
+ viewBox: IAABBBounds;
23
+ transMatrix: IMatrix;
22
24
  }
23
25
  export interface IDrawToParams {
24
- x?: number;
25
- y?: number;
26
- width?: number;
27
- height?: number;
26
+ viewBox: IAABBBounds;
27
+ transMatrix: IMatrix;
28
28
  clear?: boolean;
29
29
  renderService: IRenderService;
30
30
  background?: string | IColor;
@@ -69,13 +69,8 @@ export interface ILayer extends IGroup {
69
69
  setToFrame: (t: number) => void;
70
70
  prepare: (dirtyBounds: IBounds, params: ILayerHandlerDrawParams) => void;
71
71
  drawTo: (target: IWindow, params: IDrawToParams) => void;
72
- combineTo: (target: IWindow, params: IDrawToParams) => void;
73
72
  }
74
73
  export interface ILayerHandlerDrawParams extends ILayerDrawParams {
75
- x: number;
76
- y: number;
77
- width: number;
78
- height: number;
79
74
  layer: ILayer;
80
75
  stage: IStage;
81
76
  updateBounds: boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/layer.ts"],"names":[],"mappings":"","file":"layer.js","sourcesContent":["import type { IAABBBounds, IBounds, IBoundsLike } from '@visactor/vutils';\nimport type { IGraphic } from './graphic';\nimport type { IGroup } from './graphic/group';\nimport type { IColor } from './color';\nimport type { IDrawContext, IDrawContribution, IRenderService, IRenderServiceDrawParams } from './render';\nimport type { IStage } from './stage';\nimport type { Releaseable } from './common';\nimport type { IContext2d } from './context';\nimport type { IWindow } from './window';\nimport { ICanvasLike } from './canvas';\n\nexport type LayerMode = 'static' | 'dynamic' | 'virtual';\nexport interface ILayerParams {\n main: boolean;\n zIndex?: number;\n layerMode: LayerMode;\n layerHandler: ILayerHandlerContribution;\n canvasId?: string;\n}\n\nexport interface ILayerDrawParams {\n renderService: IRenderService;\n background?: string | IColor;\n updateBounds: boolean;\n}\n\nexport interface IDrawToParams {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n clear?: boolean;\n renderService: IRenderService;\n background?: string | IColor;\n updateBounds: boolean;\n}\n\n// 不建议用户操作layer,尽量都通过stage实现\nexport interface ILayer extends IGroup {\n parent: any;\n // rootNode: IStage;\n main: boolean;\n width: number;\n height: number;\n viewWidth: number;\n viewHeight: number;\n\n readonly layerMode: LayerMode;\n renderCount: number;\n\n offscreen: boolean;\n subLayers: Map<number, { layer: ILayer; group?: IGroup; zIndex: number; drawContribution?: IDrawContribution }>;\n\n // mode: 'dynamic' | 'static';\n readonly dirtyBound: IAABBBounds;\n background: string;\n dpr: number;\n opacity: number;\n canvasId?: string;\n imageData?: ImageData;\n blendMode?: string;\n // TODO: getElementById\n pickable: boolean;\n pick: (x: number, y: number) => { graphic?: IGraphic; group?: IGroup } | false;\n render: (params: ILayerDrawParams, userParams?: Partial<IDrawContext>) => void;\n afterDraw: (cb: (l: this) => void) => void;\n\n resize: (w: number, h: number) => void;\n resizeView: (w: number, h: number) => void;\n setDpr: (dpr: number) => void;\n getNativeHandler: () => ILayerHandlerContribution;\n combineSubLayer: (removeIncrementalKey?: boolean) => void;\n\n // 动画相关\n startAnimate: (t: number) => void;\n setToFrame: (t: number) => void;\n prepare: (dirtyBounds: IBounds, params: ILayerHandlerDrawParams) => void;\n drawTo: (target: IWindow, params: IDrawToParams) => void;\n combineTo: (target: IWindow, params: IDrawToParams) => void;\n // 考虑操作回放\n}\n\nexport interface ILayerHandlerDrawParams extends ILayerDrawParams {\n x: number;\n y: number;\n width: number;\n height: number;\n layer: ILayer;\n stage: IStage;\n updateBounds: boolean;\n}\n\nexport interface ILayerHandlerInitParams {\n main: boolean;\n canvasId?: string;\n width: number;\n height: number;\n zIndex: number;\n dpr?: number;\n}\n\n// TODO: layer在resize的时候需要判断是否需要resize window对应的canvas\n\n// 具体的Layer实现\n// Canvas2d的Layer可以对应一个Canvas或者ImageData\nexport interface ILayerHandlerContribution extends Releaseable {\n // 所绑定的副layer handler\n secondaryHandlers?: ILayerHandlerContribution[];\n // 所依赖的主layer handler\n mainHandler?: ILayerHandlerContribution;\n type: LayerMode;\n init: (layer: ILayer, window: IWindow, params: ILayerHandlerInitParams) => void;\n resize: (w: number, h: number) => void;\n resizeView: (w: number, h: number) => void;\n setDpr: (dpr: number) => void;\n render: (group: IGroup[], params: ILayerHandlerDrawParams, userParams?: Partial<IDrawContext>) => void;\n prepare: (dirtyBounds: IBoundsLike, params: IRenderServiceDrawParams) => void;\n drawTo: (target: IWindow, group: IGroup[], params: IDrawToParams & ILayerHandlerDrawParams) => void;\n merge: (layerHandlers: ILayerHandlerContribution[]) => void;\n getContext: () => IContext2d;\n offscreen: boolean;\n layer: ILayer;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/layer.ts"],"names":[],"mappings":"","file":"layer.js","sourcesContent":["import type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils';\nimport type { IGraphic } from './graphic';\nimport type { IGroup } from './graphic/group';\nimport type { IColor } from './color';\nimport type { IDrawContext, IDrawContribution, IRenderService, IRenderServiceDrawParams } from './render';\nimport type { IStage } from './stage';\nimport type { Releaseable } from './common';\nimport type { IContext2d } from './context';\nimport type { IWindow } from './window';\nimport { ICanvasLike } from './canvas';\n\nexport type LayerMode = 'static' | 'dynamic' | 'virtual';\nexport interface ILayerParams {\n main: boolean;\n zIndex?: number;\n layerMode: LayerMode;\n layerHandler: ILayerHandlerContribution;\n canvasId?: string;\n}\n\nexport interface ILayerDrawParams {\n renderService: IRenderService;\n background?: string | IColor;\n updateBounds: boolean;\n viewBox: IAABBBounds;\n transMatrix: IMatrix;\n}\n\nexport interface IDrawToParams {\n viewBox: IAABBBounds;\n transMatrix: IMatrix;\n clear?: boolean;\n renderService: IRenderService;\n background?: string | IColor;\n updateBounds: boolean;\n}\n\n// 不建议用户操作layer,尽量都通过stage实现\nexport interface ILayer extends IGroup {\n parent: any;\n // rootNode: IStage;\n main: boolean;\n width: number;\n height: number;\n viewWidth: number;\n viewHeight: number;\n\n readonly layerMode: LayerMode;\n renderCount: number;\n\n offscreen: boolean;\n subLayers: Map<number, { layer: ILayer; group?: IGroup; zIndex: number; drawContribution?: IDrawContribution }>;\n\n // mode: 'dynamic' | 'static';\n readonly dirtyBound: IAABBBounds;\n background: string;\n dpr: number;\n opacity: number;\n canvasId?: string;\n imageData?: ImageData;\n blendMode?: string;\n // TODO: getElementById\n pickable: boolean;\n pick: (x: number, y: number) => { graphic?: IGraphic; group?: IGroup } | false;\n render: (params: ILayerDrawParams, userParams?: Partial<IDrawContext>) => void;\n afterDraw: (cb: (l: this) => void) => void;\n\n resize: (w: number, h: number) => void;\n resizeView: (w: number, h: number) => void;\n setDpr: (dpr: number) => void;\n getNativeHandler: () => ILayerHandlerContribution;\n combineSubLayer: (removeIncrementalKey?: boolean) => void;\n\n // 动画相关\n startAnimate: (t: number) => void;\n setToFrame: (t: number) => void;\n prepare: (dirtyBounds: IBounds, params: ILayerHandlerDrawParams) => void;\n drawTo: (target: IWindow, params: IDrawToParams) => void;\n // combineTo: (target: IWindow, params: IDrawToParams) => void;\n // 考虑操作回放\n}\n\nexport interface ILayerHandlerDrawParams extends ILayerDrawParams {\n layer: ILayer;\n stage: IStage;\n updateBounds: boolean;\n}\n\nexport interface ILayerHandlerInitParams {\n main: boolean;\n canvasId?: string;\n width: number;\n height: number;\n zIndex: number;\n dpr?: number;\n}\n\n// TODO: layer在resize的时候需要判断是否需要resize window对应的canvas\n\n// 具体的Layer实现\n// Canvas2d的Layer可以对应一个Canvas或者ImageData\nexport interface ILayerHandlerContribution extends Releaseable {\n // 所绑定的副layer handler\n secondaryHandlers?: ILayerHandlerContribution[];\n // 所依赖的主layer handler\n mainHandler?: ILayerHandlerContribution;\n type: LayerMode;\n init: (layer: ILayer, window: IWindow, params: ILayerHandlerInitParams) => void;\n resize: (w: number, h: number) => void;\n resizeView: (w: number, h: number) => void;\n setDpr: (dpr: number) => void;\n render: (group: IGroup[], params: ILayerHandlerDrawParams, userParams?: Partial<IDrawContext>) => void;\n prepare: (dirtyBounds: IBoundsLike, params: IRenderServiceDrawParams) => void;\n drawTo: (target: IWindow, group: IGroup[], params: IDrawToParams & ILayerHandlerDrawParams) => void;\n merge: (layerHandlers: ILayerHandlerContribution[]) => void;\n getContext: () => IContext2d;\n offscreen: boolean;\n layer: ILayer;\n}\n"]}
@@ -20,7 +20,6 @@ export interface IPickParams {
20
20
  group?: boolean;
21
21
  graphic?: boolean;
22
22
  bounds?: IBounds;
23
- keepMatrix?: boolean;
24
23
  pickContext?: IContext2d;
25
24
  pickerService?: IPickerService;
26
25
  in3dInterceptor?: boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/picker.ts"],"names":[],"mappings":"","file":"picker.js","sourcesContent":["import type { IBounds, IMatrix, IPoint, IPointLike } from '@visactor/vutils';\nimport type { IGraphic } from './graphic';\nimport type { IContext2d } from './context';\nimport type { EnvType, IGlobal } from './global';\nimport type { IGroup } from './graphic/group';\nimport type { IDrawContribution } from './render';\n\nexport type PickResult = {\n graphic?: IGraphic | null;\n group?: IGroup | null;\n params?: {\n shadowTarget?: IGraphic;\n };\n};\n\nexport interface IGraphicPicker {\n type: string;\n numberType: number;\n\n contains: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n}\n\nexport interface IPickParams {\n group?: boolean;\n graphic?: boolean;\n bounds?: IBounds;\n // 是否使用当前的Matrix,不用重新初始化matrix\n keepMatrix?: boolean;\n pickContext?: IContext2d;\n pickerService?: IPickerService;\n // 内部设置\n in3dInterceptor?: boolean;\n hack_pieFace?: string;\n}\n\nexport interface IPickerService {\n type: string;\n\n pickContext?: IContext2d;\n pickerMap: Map<number, IGraphicPicker>;\n configure: (global: IGlobal, env: EnvType) => void;\n pick: (group: IGraphic[], point: IPoint, params?: IPickParams) => PickResult;\n pickGroup: (group: IGroup, point: IPointLike, parentMatrix: IMatrix, params: IPickParams) => PickResult;\n pickItem: (\n graphic: IGraphic,\n point: IPointLike,\n parentMatrix: IMatrix | null,\n params?: IPickParams\n ) => PickResult | null;\n containsPoint: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n drawContribution?: IDrawContribution;\n}\n\nexport interface IPickItemInterceptorContribution {\n order: number;\n // null代表没匹配到,boolean代表是否pick中\n beforePickItem?: (\n graphic: IGraphic,\n pickerService: IPickerService,\n point: IPointLike,\n drawContext: {\n in3dInterceptor?: boolean;\n },\n params?: {\n parentMatrix: IMatrix;\n }\n ) => PickResult | null;\n\n afterPickItem?: (\n graphic: IGraphic,\n pickerService: IPickerService,\n point: IPointLike,\n drawContext: {\n in3dInterceptor?: boolean;\n },\n params?: {\n parentMatrix: IMatrix;\n }\n ) => PickResult | null;\n // afterPickItem?: (\n // graphic: IGraphic,\n // pickerService: IPickerService,\n // ) => boolean;\n}\n\nexport interface IBoundsPicker {\n type: string;\n numberType?: number;\n\n contains: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/picker.ts"],"names":[],"mappings":"","file":"picker.js","sourcesContent":["import type { IBounds, IMatrix, IPoint, IPointLike } from '@visactor/vutils';\nimport type { IGraphic } from './graphic';\nimport type { IContext2d } from './context';\nimport type { EnvType, IGlobal } from './global';\nimport type { IGroup } from './graphic/group';\nimport type { IDrawContribution } from './render';\n\nexport type PickResult = {\n graphic?: IGraphic | null;\n group?: IGroup | null;\n params?: {\n shadowTarget?: IGraphic;\n };\n};\n\nexport interface IGraphicPicker {\n type: string;\n numberType: number;\n\n contains: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n}\n\nexport interface IPickParams {\n group?: boolean;\n graphic?: boolean;\n bounds?: IBounds;\n pickContext?: IContext2d;\n pickerService?: IPickerService;\n // 内部设置\n in3dInterceptor?: boolean;\n hack_pieFace?: string;\n}\n\nexport interface IPickerService {\n type: string;\n\n pickContext?: IContext2d;\n pickerMap: Map<number, IGraphicPicker>;\n configure: (global: IGlobal, env: EnvType) => void;\n pick: (group: IGraphic[], point: IPoint, params?: IPickParams) => PickResult;\n pickGroup: (group: IGroup, point: IPointLike, parentMatrix: IMatrix, params: IPickParams) => PickResult;\n pickItem: (\n graphic: IGraphic,\n point: IPointLike,\n parentMatrix: IMatrix | null,\n params?: IPickParams\n ) => PickResult | null;\n containsPoint: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n drawContribution?: IDrawContribution;\n}\n\nexport interface IPickItemInterceptorContribution {\n order: number;\n // null代表没匹配到,boolean代表是否pick中\n beforePickItem?: (\n graphic: IGraphic,\n pickerService: IPickerService,\n point: IPointLike,\n drawContext: {\n in3dInterceptor?: boolean;\n },\n params?: {\n parentMatrix: IMatrix;\n }\n ) => PickResult | null;\n\n afterPickItem?: (\n graphic: IGraphic,\n pickerService: IPickerService,\n point: IPointLike,\n drawContext: {\n in3dInterceptor?: boolean;\n },\n params?: {\n parentMatrix: IMatrix;\n }\n ) => PickResult | null;\n // afterPickItem?: (\n // graphic: IGraphic,\n // pickerService: IPickerService,\n // ) => boolean;\n}\n\nexport interface IBoundsPicker {\n type: string;\n numberType?: number;\n\n contains: (graphic: IGraphic, point: IPointLike, params?: IPickParams) => boolean;\n}\n"]}
@@ -12,11 +12,8 @@ import type { ISyncHook } from './sync-hook';
12
12
  export interface IRenderServiceDrawParams {
13
13
  context?: IContext2d;
14
14
  clear?: string | IColor | boolean;
15
- width: number;
16
- height: number;
17
- x: number;
18
- y: number;
19
- keepMatrix?: boolean;
15
+ viewBox: IBounds;
16
+ transMatrix?: IMatrixLike;
20
17
  stage: IStage;
21
18
  layer: ILayer;
22
19
  renderService: IRenderService;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/render.ts"],"names":[],"mappings":"","file":"render.js","sourcesContent":["import type { IAABBBounds, IBounds, IMatrixLike } from '@visactor/vutils';\nimport type { IColor } from './color';\nimport type { IContext2d } from './context';\nimport type { IGraphic, IGraphicAttribute } from './graphic';\nimport type { IMarkAttribute, IThemeAttribute } from './graphic/creator';\nimport type { IFullThemeSpec } from './graphic/theme';\nimport type { ILayer } from './layer';\nimport type { IStage } from './stage';\nimport type { IGroup } from './graphic/group';\nimport type { MaybePromise } from './common';\nimport type { ISyncHook } from './sync-hook';\n\n// 用于绘制的参数,提供context\n// TODO: 考虑是否可以隐藏上下文类型\nexport interface IRenderServiceDrawParams {\n context?: IContext2d;\n\n // 绘制的区域以及是否需要清屏\n clear?: string | IColor | boolean;\n width: number;\n height: number;\n x: number;\n y: number;\n // 是否使用当前的Matrix,不用重新初始化matrix\n keepMatrix?: boolean;\n stage: IStage;\n layer: ILayer;\n renderService: IRenderService;\n updateBounds: boolean;\n renderStyle?: string;\n}\n\nexport interface IRenderService {\n dirtyBounds: IBounds;\n renderTreeRoots: IGraphic[]; // 此次render的数组\n renderLists: IGraphic[];\n drawParams: IRenderServiceDrawParams;\n\n prepare: (updateBounds: boolean) => void;\n prepareRenderList: () => void;\n beforeDraw: (params: IRenderServiceDrawParams) => void;\n draw: (params: IRenderServiceDrawParams) => void;\n afterDraw: (params: IRenderServiceDrawParams) => void;\n render: (groups: IGroup[], params: IRenderServiceDrawParams) => MaybePromise<void>;\n}\n\nexport interface IDrawContext extends IRenderServiceDrawParams {\n startAtId?: number;\n break?: boolean;\n restartIncremental?: boolean;\n // multi图元开始的位置\n multiGraphicOptions?: {\n startAtIdx: number;\n length: number;\n };\n in3dInterceptor?: boolean;\n drawContribution?: IDrawContribution;\n // hack内容\n hack_pieFace?: 'inside' | 'bottom' | 'top' | 'outside';\n}\n\nexport interface IDrawContribution {\n hooks?: {\n completeDraw: ISyncHook<[]>;\n };\n dirtyBounds?: IAABBBounds;\n backupDirtyBounds?: IAABBBounds;\n rendering?: boolean;\n currentRenderMap: Map<number, IGraphicRender>;\n defaultRenderMap: Map<number, IGraphicRender>;\n styleRenderMap: Map<string, Map<number, IGraphicRender>>;\n draw: (renderService: IRenderService, drawParams: IDrawContext) => MaybePromise<void>;\n afterDraw?: (renderService: IRenderService, drawParams: IDrawContext) => MaybePromise<void>;\n getRenderContribution: (graphic: IGraphic) => IGraphicRender | null;\n renderGroup: (group: IGroup, drawContext: IDrawContext, matrix: IMatrixLike, skipSort?: boolean) => void;\n renderItem: (graphic: IGraphic, drawContext: IDrawContext, params?: IGraphicRenderDrawParams) => void;\n}\n\nexport interface IGraphicRenderDrawParams {\n beforeDrawCb?: () => void;\n afterDrawCb?: () => void;\n drawingCb?: () => void;\n skipDraw?: boolean;\n theme?: IFullThemeSpec;\n}\n\nexport interface IGraphicRender {\n type: string; // 图元类型\n numberType: number;\n style?: string;\n z?: number;\n draw: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams\n ) => void;\n drawShape?: (\n graphic: IGraphic,\n ctx: IContext2d,\n x: number,\n y: number,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams,\n fillCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean,\n strokeCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean\n ) => void;\n}\n\nexport interface IBeforeRenderConstribution {\n apply: (renderService: IRenderService) => MaybePromise<void>;\n}\n\nexport interface IRenderSelector {\n selector: (graphic: IGraphic) => IGraphicRender | null;\n}\n\nexport interface IDrawItemInterceptorContribution {\n order: number;\n beforeDrawItem?: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n drawContribution: IDrawContribution,\n params?: IGraphicRenderDrawParams\n ) => boolean;\n afterDrawItem?: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n drawContribution: IDrawContribution,\n params?: IGraphicRenderDrawParams\n ) => boolean;\n}\n"]}
1
+ {"version":3,"sources":["../src/interface/render.ts"],"names":[],"mappings":"","file":"render.js","sourcesContent":["import type { IAABBBounds, IBounds, IMatrix, IMatrixLike } from '@visactor/vutils';\nimport type { IColor } from './color';\nimport type { IContext2d } from './context';\nimport type { IGraphic, IGraphicAttribute } from './graphic';\nimport type { IMarkAttribute, IThemeAttribute } from './graphic/creator';\nimport type { IFullThemeSpec } from './graphic/theme';\nimport type { ILayer } from './layer';\nimport type { IStage } from './stage';\nimport type { IGroup } from './graphic/group';\nimport type { MaybePromise } from './common';\nimport type { ISyncHook } from './sync-hook';\n\n// 用于绘制的参数,提供context\n// TODO: 考虑是否可以隐藏上下文类型\nexport interface IRenderServiceDrawParams {\n context?: IContext2d;\n\n // 绘制的区域以及是否需要清屏\n clear?: string | IColor | boolean;\n viewBox: IBounds;\n transMatrix?: IMatrixLike;\n stage: IStage;\n layer: ILayer;\n renderService: IRenderService;\n updateBounds: boolean;\n renderStyle?: string;\n}\n\nexport interface IRenderService {\n dirtyBounds: IBounds;\n renderTreeRoots: IGraphic[]; // 此次render的数组\n renderLists: IGraphic[];\n drawParams: IRenderServiceDrawParams;\n\n prepare: (updateBounds: boolean) => void;\n prepareRenderList: () => void;\n beforeDraw: (params: IRenderServiceDrawParams) => void;\n draw: (params: IRenderServiceDrawParams) => void;\n afterDraw: (params: IRenderServiceDrawParams) => void;\n render: (groups: IGroup[], params: IRenderServiceDrawParams) => MaybePromise<void>;\n}\n\nexport interface IDrawContext extends IRenderServiceDrawParams {\n startAtId?: number;\n break?: boolean;\n restartIncremental?: boolean;\n // multi图元开始的位置\n multiGraphicOptions?: {\n startAtIdx: number;\n length: number;\n };\n in3dInterceptor?: boolean;\n drawContribution?: IDrawContribution;\n // hack内容\n hack_pieFace?: 'inside' | 'bottom' | 'top' | 'outside';\n}\n\nexport interface IDrawContribution {\n hooks?: {\n completeDraw: ISyncHook<[]>;\n };\n dirtyBounds?: IAABBBounds;\n backupDirtyBounds?: IAABBBounds;\n rendering?: boolean;\n currentRenderMap: Map<number, IGraphicRender>;\n defaultRenderMap: Map<number, IGraphicRender>;\n styleRenderMap: Map<string, Map<number, IGraphicRender>>;\n draw: (renderService: IRenderService, drawParams: IDrawContext) => MaybePromise<void>;\n afterDraw?: (renderService: IRenderService, drawParams: IDrawContext) => MaybePromise<void>;\n getRenderContribution: (graphic: IGraphic) => IGraphicRender | null;\n renderGroup: (group: IGroup, drawContext: IDrawContext, matrix: IMatrixLike, skipSort?: boolean) => void;\n renderItem: (graphic: IGraphic, drawContext: IDrawContext, params?: IGraphicRenderDrawParams) => void;\n}\n\nexport interface IGraphicRenderDrawParams {\n beforeDrawCb?: () => void;\n afterDrawCb?: () => void;\n drawingCb?: () => void;\n skipDraw?: boolean;\n theme?: IFullThemeSpec;\n}\n\nexport interface IGraphicRender {\n type: string; // 图元类型\n numberType: number;\n style?: string;\n z?: number;\n draw: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams\n ) => void;\n drawShape?: (\n graphic: IGraphic,\n ctx: IContext2d,\n x: number,\n y: number,\n drawContext: IDrawContext,\n params?: IGraphicRenderDrawParams,\n fillCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean,\n strokeCb?: (\n ctx: IContext2d,\n markAttribute: Partial<IMarkAttribute & IGraphicAttribute>,\n themeAttribute: IThemeAttribute\n ) => boolean\n ) => void;\n}\n\nexport interface IBeforeRenderConstribution {\n apply: (renderService: IRenderService) => MaybePromise<void>;\n}\n\nexport interface IRenderSelector {\n selector: (graphic: IGraphic) => IGraphicRender | null;\n}\n\nexport interface IDrawItemInterceptorContribution {\n order: number;\n beforeDrawItem?: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n drawContribution: IDrawContribution,\n params?: IGraphicRenderDrawParams\n ) => boolean;\n afterDrawItem?: (\n graphic: IGraphic,\n renderService: IRenderService,\n drawContext: IDrawContext,\n drawContribution: IDrawContribution,\n params?: IGraphicRenderDrawParams\n ) => boolean;\n}\n"]}
@@ -40,7 +40,6 @@ export interface IStageParams {
40
40
  event?: EventConfig;
41
41
  supportsTouchEvents?: boolean;
42
42
  supportsPointerEvents?: boolean;
43
- renderKeepMatrix?: boolean;
44
43
  }
45
44
  export type EventConfig = {
46
45
  autoPreventDefault?: boolean;
@@ -147,6 +146,8 @@ export interface IStage extends INode {
147
146
  clearViewBox: (color?: string) => void;
148
147
  release: () => void;
149
148
  setStage: (stage?: IStage) => void;
149
+ pauseRender: () => void;
150
+ resumeRender: () => void;
150
151
  setCursor: (mode?: string) => void;
151
152
  getTheme: () => IFullThemeSpec;
152
153
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interface/stage.ts"],"names":[],"mappings":"","file":"stage.js","sourcesContent":["import type { INode } from './node-tree';\nimport type { ILayer, LayerMode } from './layer';\nimport type { IColor } from './color';\nimport type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils';\nimport type { ICamera } from './camera';\nimport type { vec3 } from './matrix';\nimport type { IDirectionLight } from './light';\nimport type { ISyncHook } from './sync-hook';\nimport type { IDrawContext, IRenderService } from './render';\nimport type { ITicker, ITimeline } from './animate';\nimport type { IPickerService, PickResult } from './picker';\nimport type { IPlugin, IPluginService } from './plugin';\nimport type { IWindow } from './window';\nimport type { ILayerService } from './core';\nimport type { IFullThemeSpec } from './graphic/theme';\n\nexport type IExportType = 'canvas' | 'imageData';\n\nexport interface IStageParams {\n // x: number;\n // y: number;\n // // 视口的宽高\n // viewWidth: number;\n // viewHeight: number;\n\n // 视口的宽高\n viewBox: IBoundsLike;\n // 总的宽高\n width: number;\n height: number;\n dpr: number;\n // stage的背景\n background: string | IColor;\n // 外部的canvas\n canvas: string | HTMLCanvasElement;\n // canvas的container容器,如果不传入canvas,那就会在容器中创建canvas\n container: string | HTMLElement;\n // 是否是受控制的canvas,如果不是的话,不会进行resize等操作,也不会修改canvas的样式\n canvasControled: boolean;\n title: string;\n // 是否开启自动渲染\n autoRender: boolean;\n // 是否开启布局支持\n enableLayout: boolean;\n // 是否关闭脏矩形检测\n disableDirtyBounds: boolean;\n // 是否支持interactiveLayer,默认为true\n interactiveLayer: boolean;\n // 是否支持HTML属性\n enableHtmlAttribute: string | boolean | HTMLElement;\n // 是否支持滚动条\n enableScroll: boolean;\n poptip: boolean;\n // 绘制之前的钩子函数\n beforeRender: (stage: IStage) => void;\n // 绘制之后的钩子函数\n afterRender: (stage: IStage) => void;\n renderStyle?: string;\n ticker?: ITicker;\n pluginList?: string[];\n // 优化配置\n optimize?: IOptimizeType;\n /**\n * 事件系统相关配置\n */\n event?: EventConfig;\n\n /**\n * @since 0.17.15\n * 是否支持touch事件,不支持就不监听touch事件\n */\n supportsTouchEvents?: boolean;\n\n /**\n * @since 0.17.15\n * 是否支持pointer事件,不支持就监听mouse事件\n */\n supportsPointerEvents?: boolean;\n /**\n * Render的时候使用原来的矩阵,不清除\n */\n renderKeepMatrix?: boolean;\n}\n\nexport type EventConfig = {\n /** 是否自动阻止事件 */\n autoPreventDefault?: boolean;\n /**\n * 多次点击之间的最大时间,默认为 200 ms\n * @default 200\n */\n clickInterval?: number;\n [key: string]: any;\n};\n\nexport type IOptimizeType = {\n // 视口不在可视区,跳过渲染,默认为true\n skipRenderWithOutRange?: boolean;\n // 跳过图元在区间外的判断\n // 不存在dirtyBounds的时候,根据该配置判断是否关闭图元的超出边界判定\n // 如果有dirtyBounds那么该配置不生效\n disableCheckGraphicWidthOutRange?: boolean;\n};\n\nexport interface IOption3D {\n enableView3dTransform?: boolean; // 是否开启view3d自动旋转\n alpha?: number; // x轴的转角\n beta?: number; // y轴的转角\n gama?: number; // z轴的转角\n center?: { x?: number; y?: number; z?: number; dx?: number; dy?: number; dz?: number }; // 中心位置\n fieldRatio?: number; // 透视的视域缩放比例\n fieldDepth?: number;\n light?: {\n dir?: vec3;\n color?: string;\n ambient?: number;\n };\n // 配置相机后,alpha、beta、gamma配置会失效\n camera?: any; // 相机配置\n}\n\n// TODO 命名方式\nexport interface IStage extends INode {\n stage?: IStage;\n parent: IStage | null;\n // rootNode: IStage;\n x: number;\n y: number;\n\n params: Partial<IStageParams>;\n\n window: IWindow;\n\n width: number;\n height: number;\n viewWidth: number;\n viewHeight: number;\n defaultLayer: ILayer;\n dirtyBounds: IBounds | null;\n\n autoRender: boolean;\n renderCount: number;\n\n hooks: {\n beforeRender: ISyncHook<[IStage]>;\n afterRender: ISyncHook<[IStage]>;\n };\n\n option3d?: IOption3D;\n\n set3dOptions: (options: IOption3D) => void;\n light?: IDirectionLight;\n camera?: ICamera;\n\n dpr: number;\n\n viewBox: IBoundsLike;\n background: string | IColor;\n ticker: ITicker;\n increaseAutoRender: boolean;\n readonly renderService: IRenderService;\n pickerService?: IPickerService;\n readonly pluginService: IPluginService;\n readonly layerService: ILayerService;\n // 如果传入CanvasId,如果存在相同Id,说明这两个图层使用相同的Canvas绘制\n // 但需要注意的是依然是两个图层(用于解决Table嵌入ChartSpace不影响Table的绘制)\n createLayer: (canvasId?: string, layerMode?: LayerMode) => ILayer;\n getLayer: (name: string) => ILayer;\n sortLayer: (cb: (layer1: ILayer, layer2: ILayer) => number) => void;\n removeLayer: (layerId: number) => ILayer | false;\n\n getTimeline: () => ITimeline;\n\n render: (layers?: ILayer[], params?: Partial<IDrawContext>) => void;\n /**\n * 下一帧渲染\n * @param layers 渲染的图层\n * @param force 是否强行下一帧渲染,不采取优化方案\n * @returns\n */\n renderNextFrame: (layers?: ILayer[], force?: boolean) => void;\n tryInitInteractiveLayer: () => void;\n\n // 画布操作\n resize: (w: number, h: number, rerender?: boolean) => void;\n resizeWindow: (w: number, h: number, rerender?: boolean) => void;\n resizeView: (w: number, h: number, rerender?: boolean) => void;\n setViewBox:\n | ((viewBox: IBoundsLike, rerender: boolean) => void)\n | ((x: number, y: number, w: number, h: number, rerender: boolean) => void)\n | ((x: number | IBoundsLike, y: number | boolean, w?: number, h?: number, rerender?: boolean) => void);\n setDpr: (dpr: number, rerender?: boolean) => void;\n setOrigin: (x: number, y: number) => void;\n export: (type: IExportType) => HTMLCanvasElement | ImageData;\n pick: (x: number, y: number) => PickResult | false;\n\n // 动画相关\n startAnimate: (t: number) => void;\n setToFrame: (t: number) => void;\n dirty: (b: IBounds, matrix?: IMatrix) => void;\n // 考虑操作回放\n\n renderTo: (window: IWindow, params: { x: number; y: number; width: number; height: number }) => void;\n\n renderToNewWindow: (fullImage?: boolean) => IWindow;\n\n toCanvas: (fullImage?: boolean, viewBox?: IAABBBounds) => HTMLCanvasElement | null;\n\n setBeforeRender: (cb: (stage: IStage) => void) => void;\n\n setAfterRender: (cb: (stage: IStage) => void) => void;\n\n afterNextRender: (cb: (stage: IStage) => void) => void;\n enableAutoRender: () => void;\n disableAutoRender: () => void;\n enableIncrementalAutoRender: () => void;\n disableIncrementalAutoRender: () => void;\n enableDirtyBounds: () => void;\n disableDirtyBounds: () => void;\n enableView3dTransform: () => void;\n disableView3dTranform: () => void;\n getPluginsByName: (name: string) => IPlugin[];\n clearViewBox: (color?: string) => void;\n release: () => void;\n setStage: (stage?: IStage) => void;\n\n setCursor: (mode?: string) => void;\n\n getTheme: () => IFullThemeSpec;\n}\n\nexport declare function combineStage(srages: IStage[], params: { canvas: string | HTMLCanvasElement }): IStage;\n"]}
1
+ {"version":3,"sources":["../src/interface/stage.ts"],"names":[],"mappings":"","file":"stage.js","sourcesContent":["import type { INode } from './node-tree';\nimport type { ILayer, LayerMode } from './layer';\nimport type { IColor } from './color';\nimport type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils';\nimport type { ICamera } from './camera';\nimport type { vec3 } from './matrix';\nimport type { IDirectionLight } from './light';\nimport type { ISyncHook } from './sync-hook';\nimport type { IDrawContext, IRenderService } from './render';\nimport type { ITicker, ITimeline } from './animate';\nimport type { IPickerService, PickResult } from './picker';\nimport type { IPlugin, IPluginService } from './plugin';\nimport type { IWindow } from './window';\nimport type { ILayerService } from './core';\nimport type { IFullThemeSpec } from './graphic/theme';\n\nexport type IExportType = 'canvas' | 'imageData';\n\nexport interface IStageParams {\n // x: number;\n // y: number;\n // // 视口的宽高\n // viewWidth: number;\n // viewHeight: number;\n\n // 视口的宽高\n viewBox: IBoundsLike;\n // 总的宽高\n width: number;\n height: number;\n dpr: number;\n // stage的背景\n background: string | IColor;\n // 外部的canvas\n canvas: string | HTMLCanvasElement;\n // canvas的container容器,如果不传入canvas,那就会在容器中创建canvas\n container: string | HTMLElement;\n // 是否是受控制的canvas,如果不是的话,不会进行resize等操作,也不会修改canvas的样式\n canvasControled: boolean;\n title: string;\n // 是否开启自动渲染\n autoRender: boolean;\n // 是否开启布局支持\n enableLayout: boolean;\n // 是否关闭脏矩形检测\n disableDirtyBounds: boolean;\n // 是否支持interactiveLayer,默认为true\n interactiveLayer: boolean;\n // 是否支持HTML属性\n enableHtmlAttribute: string | boolean | HTMLElement;\n // 是否支持滚动条\n enableScroll: boolean;\n poptip: boolean;\n // 绘制之前的钩子函数\n beforeRender: (stage: IStage) => void;\n // 绘制之后的钩子函数\n afterRender: (stage: IStage) => void;\n renderStyle?: string;\n ticker?: ITicker;\n pluginList?: string[];\n // 优化配置\n optimize?: IOptimizeType;\n /**\n * 事件系统相关配置\n */\n event?: EventConfig;\n\n /**\n * @since 0.17.15\n * 是否支持touch事件,不支持就不监听touch事件\n */\n supportsTouchEvents?: boolean;\n\n /**\n * @since 0.17.15\n * 是否支持pointer事件,不支持就监听mouse事件\n */\n supportsPointerEvents?: boolean;\n}\n\nexport type EventConfig = {\n /** 是否自动阻止事件 */\n autoPreventDefault?: boolean;\n /**\n * 多次点击之间的最大时间,默认为 200 ms\n * @default 200\n */\n clickInterval?: number;\n [key: string]: any;\n};\n\nexport type IOptimizeType = {\n // 视口不在可视区,跳过渲染,默认为true\n skipRenderWithOutRange?: boolean;\n // 跳过图元在区间外的判断\n // 不存在dirtyBounds的时候,根据该配置判断是否关闭图元的超出边界判定\n // 如果有dirtyBounds那么该配置不生效\n disableCheckGraphicWidthOutRange?: boolean;\n};\n\nexport interface IOption3D {\n enableView3dTransform?: boolean; // 是否开启view3d自动旋转\n alpha?: number; // x轴的转角\n beta?: number; // y轴的转角\n gama?: number; // z轴的转角\n center?: { x?: number; y?: number; z?: number; dx?: number; dy?: number; dz?: number }; // 中心位置\n fieldRatio?: number; // 透视的视域缩放比例\n fieldDepth?: number;\n light?: {\n dir?: vec3;\n color?: string;\n ambient?: number;\n };\n // 配置相机后,alpha、beta、gamma配置会失效\n camera?: any; // 相机配置\n}\n\n// TODO 命名方式\nexport interface IStage extends INode {\n stage?: IStage;\n parent: IStage | null;\n // rootNode: IStage;\n x: number;\n y: number;\n\n params: Partial<IStageParams>;\n\n window: IWindow;\n\n width: number;\n height: number;\n viewWidth: number;\n viewHeight: number;\n defaultLayer: ILayer;\n dirtyBounds: IBounds | null;\n\n autoRender: boolean;\n renderCount: number;\n\n hooks: {\n beforeRender: ISyncHook<[IStage]>;\n afterRender: ISyncHook<[IStage]>;\n };\n\n option3d?: IOption3D;\n\n set3dOptions: (options: IOption3D) => void;\n light?: IDirectionLight;\n camera?: ICamera;\n\n dpr: number;\n\n viewBox: IBoundsLike;\n background: string | IColor;\n ticker: ITicker;\n increaseAutoRender: boolean;\n readonly renderService: IRenderService;\n pickerService?: IPickerService;\n readonly pluginService: IPluginService;\n readonly layerService: ILayerService;\n // 如果传入CanvasId,如果存在相同Id,说明这两个图层使用相同的Canvas绘制\n // 但需要注意的是依然是两个图层(用于解决Table嵌入ChartSpace不影响Table的绘制)\n createLayer: (canvasId?: string, layerMode?: LayerMode) => ILayer;\n getLayer: (name: string) => ILayer;\n sortLayer: (cb: (layer1: ILayer, layer2: ILayer) => number) => void;\n removeLayer: (layerId: number) => ILayer | false;\n\n getTimeline: () => ITimeline;\n\n render: (layers?: ILayer[], params?: Partial<IDrawContext>) => void;\n /**\n * 下一帧渲染\n * @param layers 渲染的图层\n * @param force 是否强行下一帧渲染,不采取优化方案\n * @returns\n */\n renderNextFrame: (layers?: ILayer[], force?: boolean) => void;\n tryInitInteractiveLayer: () => void;\n\n // 画布操作\n resize: (w: number, h: number, rerender?: boolean) => void;\n resizeWindow: (w: number, h: number, rerender?: boolean) => void;\n resizeView: (w: number, h: number, rerender?: boolean) => void;\n setViewBox:\n | ((viewBox: IBoundsLike, rerender: boolean) => void)\n | ((x: number, y: number, w: number, h: number, rerender: boolean) => void)\n | ((x: number | IBoundsLike, y: number | boolean, w?: number, h?: number, rerender?: boolean) => void);\n setDpr: (dpr: number, rerender?: boolean) => void;\n setOrigin: (x: number, y: number) => void;\n export: (type: IExportType) => HTMLCanvasElement | ImageData;\n pick: (x: number, y: number) => PickResult | false;\n\n // 动画相关\n startAnimate: (t: number) => void;\n setToFrame: (t: number) => void;\n dirty: (b: IBounds, matrix?: IMatrix) => void;\n // 考虑操作回放\n\n renderTo: (window: IWindow, params: { x: number; y: number; width: number; height: number }) => void;\n\n renderToNewWindow: (fullImage?: boolean) => IWindow;\n\n toCanvas: (fullImage?: boolean, viewBox?: IAABBBounds) => HTMLCanvasElement | null;\n\n setBeforeRender: (cb: (stage: IStage) => void) => void;\n\n setAfterRender: (cb: (stage: IStage) => void) => void;\n\n afterNextRender: (cb: (stage: IStage) => void) => void;\n enableAutoRender: () => void;\n disableAutoRender: () => void;\n enableIncrementalAutoRender: () => void;\n disableIncrementalAutoRender: () => void;\n enableDirtyBounds: () => void;\n disableDirtyBounds: () => void;\n enableView3dTransform: () => void;\n disableView3dTranform: () => void;\n getPluginsByName: (name: string) => IPlugin[];\n clearViewBox: (color?: string) => void;\n release: () => void;\n setStage: (stage?: IStage) => void;\n\n pauseRender: () => void;\n resumeRender: () => void;\n\n setCursor: (mode?: string) => void;\n\n getTheme: () => IFullThemeSpec;\n}\n\nexport declare function combineStage(srages: IStage[], params: { canvas: string | HTMLCanvasElement }): IStage;\n"]}