ice-render 1.0.4 → 1.0.5

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 (145) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +229 -141
  3. package/dist/THIRD-PARTY-NOTICES.txt +32 -0
  4. package/dist/index.cjs +30 -0
  5. package/dist/index.mjs +30 -0
  6. package/dist/index.umd.js +6 -1
  7. package/dist/types/FrameManager.d.mts +26 -0
  8. package/dist/types/FrameManager.d.ts +26 -26
  9. package/dist/types/ICE.d.mts +369 -0
  10. package/dist/types/ICE.d.ts +369 -107
  11. package/dist/types/a11y/accessibility.d.mts +46 -0
  12. package/dist/types/a11y/accessibility.d.ts +46 -0
  13. package/dist/types/animation/AnimationManager.d.mts +96 -0
  14. package/dist/types/animation/AnimationManager.d.ts +96 -25
  15. package/dist/types/animation/Easing.d.mts +33 -0
  16. package/dist/types/animation/Easing.d.ts +33 -32
  17. package/dist/types/consts/BIG_ZINDEX_NUMBER.d.mts +14 -0
  18. package/dist/types/consts/BIG_ZINDEX_NUMBER.d.ts +14 -14
  19. package/dist/types/consts/COMPONENT_TYPE_MAPPING.d.mts +45 -0
  20. package/dist/types/consts/COMPONENT_TYPE_MAPPING.d.ts +45 -36
  21. package/dist/types/consts/DOM_EVENT_MAPPING_CONSTS.d.mts +37 -0
  22. package/dist/types/consts/DOM_EVENT_MAPPING_CONSTS.d.ts +37 -19
  23. package/dist/types/consts/ICE_EVENT_NAME_CONSTS.d.mts +27 -0
  24. package/dist/types/consts/ICE_EVENT_NAME_CONSTS.d.ts +27 -20
  25. package/dist/types/control-panel/AlignmentGuideManager.d.mts +92 -0
  26. package/dist/types/control-panel/AlignmentGuideManager.d.ts +92 -0
  27. package/dist/types/control-panel/ICEControlPanel.d.mts +37 -0
  28. package/dist/types/control-panel/ICEControlPanel.d.ts +37 -37
  29. package/dist/types/control-panel/ICEControlPanelManager.d.mts +25 -0
  30. package/dist/types/control-panel/ICEControlPanelManager.d.ts +25 -23
  31. package/dist/types/control-panel/link-controls/LineControlPanel.d.mts +39 -0
  32. package/dist/types/control-panel/link-controls/LineControlPanel.d.ts +39 -39
  33. package/dist/types/control-panel/transform-controls/ResizeControl.d.mts +38 -0
  34. package/dist/types/control-panel/transform-controls/ResizeControl.d.ts +38 -38
  35. package/dist/types/control-panel/transform-controls/RotateControl.d.mts +12 -0
  36. package/dist/types/control-panel/transform-controls/RotateControl.d.ts +12 -12
  37. package/dist/types/control-panel/transform-controls/TransformControlPanel.d.mts +83 -0
  38. package/dist/types/control-panel/transform-controls/TransformControlPanel.d.ts +83 -74
  39. package/dist/types/control-panel/transform-controls/constraints.d.mts +24 -0
  40. package/dist/types/control-panel/transform-controls/constraints.d.ts +24 -0
  41. package/dist/types/cross-platform/PolyfillPath2D.d.mts +31 -0
  42. package/dist/types/cross-platform/PolyfillPath2D.d.ts +31 -0
  43. package/dist/types/cross-platform/root.d.mts +7 -0
  44. package/dist/types/cross-platform/root.d.ts +7 -2
  45. package/dist/types/event/DOMEventDispatcher.d.mts +68 -0
  46. package/dist/types/event/DOMEventDispatcher.d.ts +68 -29
  47. package/dist/types/event/DOMEventInterceptor.d.mts +36 -0
  48. package/dist/types/event/DOMEventInterceptor.d.ts +36 -7
  49. package/dist/types/event/EventBus.d.mts +27 -0
  50. package/dist/types/event/EventBus.d.ts +27 -27
  51. package/dist/types/event/ICEEvent.d.mts +46 -0
  52. package/dist/types/event/ICEEvent.d.ts +46 -46
  53. package/dist/types/event/ICEEventTarget.d.mts +106 -0
  54. package/dist/types/event/ICEEventTarget.d.ts +106 -106
  55. package/dist/types/event/input-normalize.d.mts +75 -0
  56. package/dist/types/event/input-normalize.d.ts +75 -0
  57. package/dist/types/geometry/GeoLine.d.mts +24 -0
  58. package/dist/types/geometry/GeoLine.d.ts +24 -23
  59. package/dist/types/geometry/GeoPoint.d.mts +53 -0
  60. package/dist/types/geometry/GeoPoint.d.ts +53 -66
  61. package/dist/types/geometry/GeoUtil.d.mts +73 -0
  62. package/dist/types/geometry/GeoUtil.d.ts +73 -37
  63. package/dist/types/geometry/ICEBoundingBox.d.mts +81 -0
  64. package/dist/types/geometry/ICEBoundingBox.d.ts +81 -81
  65. package/dist/types/graphic/ICEComponent.d.mts +436 -0
  66. package/dist/types/graphic/ICEComponent.d.ts +436 -264
  67. package/dist/types/graphic/ICEDotPath.d.mts +99 -0
  68. package/dist/types/graphic/ICEDotPath.d.ts +99 -63
  69. package/dist/types/graphic/ICEImage.d.mts +17 -0
  70. package/dist/types/graphic/ICEImage.d.ts +17 -17
  71. package/dist/types/graphic/ICEPath.d.mts +39 -0
  72. package/dist/types/graphic/ICEPath.d.ts +39 -36
  73. package/dist/types/graphic/container/ICEGroup.d.mts +101 -0
  74. package/dist/types/graphic/container/ICEGroup.d.ts +101 -53
  75. package/dist/types/graphic/link/ICEBezier.d.mts +23 -0
  76. package/dist/types/graphic/link/ICEBezier.d.ts +23 -15
  77. package/dist/types/graphic/link/ICELinkHook.d.mts +52 -0
  78. package/dist/types/graphic/link/ICELinkHook.d.ts +52 -52
  79. package/dist/types/graphic/link/ICELinkSlot.d.mts +54 -0
  80. package/dist/types/graphic/link/ICELinkSlot.d.ts +54 -46
  81. package/dist/types/graphic/link/ICELinkSlotManager.d.mts +28 -0
  82. package/dist/types/graphic/link/ICELinkSlotManager.d.ts +28 -28
  83. package/dist/types/graphic/link/ICEPolyLine.d.mts +292 -0
  84. package/dist/types/graphic/link/ICEPolyLine.d.ts +292 -219
  85. package/dist/types/graphic/link/ICEVisioLink.d.mts +163 -0
  86. package/dist/types/graphic/link/ICEVisioLink.d.ts +163 -129
  87. package/dist/types/graphic/shape/ICECircle.d.mts +19 -0
  88. package/dist/types/graphic/shape/ICECircle.d.ts +19 -19
  89. package/dist/types/graphic/shape/ICEEllipse.d.mts +29 -0
  90. package/dist/types/graphic/shape/ICEEllipse.d.ts +29 -23
  91. package/dist/types/graphic/shape/ICEIsogon.d.mts +52 -0
  92. package/dist/types/graphic/shape/ICEIsogon.d.ts +52 -52
  93. package/dist/types/graphic/shape/ICERect.d.mts +10 -0
  94. package/dist/types/graphic/shape/ICERect.d.ts +10 -17
  95. package/dist/types/graphic/shape/ICERose.d.mts +41 -0
  96. package/dist/types/graphic/shape/ICERose.d.ts +41 -41
  97. package/dist/types/graphic/shape/ICEStar.d.mts +45 -0
  98. package/dist/types/graphic/shape/ICEStar.d.ts +45 -45
  99. package/dist/types/graphic/text/ICEText.d.mts +137 -0
  100. package/dist/types/graphic/text/ICEText.d.ts +137 -65
  101. package/dist/types/index.d.mts +55 -0
  102. package/dist/types/index.d.ts +55 -41
  103. package/dist/types/layout/ICEBorderLayout.d.mts +34 -0
  104. package/dist/types/layout/ICEBorderLayout.d.ts +34 -0
  105. package/dist/types/layout/ICEBoxLayout.d.mts +30 -0
  106. package/dist/types/layout/ICEBoxLayout.d.ts +30 -0
  107. package/dist/types/layout/ICECardLayout.d.mts +36 -0
  108. package/dist/types/layout/ICECardLayout.d.ts +36 -0
  109. package/dist/types/layout/ICEFlowLayout.d.mts +31 -0
  110. package/dist/types/layout/ICEFlowLayout.d.ts +31 -0
  111. package/dist/types/layout/ICEGridLayout.d.mts +33 -0
  112. package/dist/types/layout/ICEGridLayout.d.ts +33 -0
  113. package/dist/types/layout/ICELayeredLayout.d.mts +49 -0
  114. package/dist/types/layout/ICELayeredLayout.d.ts +49 -0
  115. package/dist/types/layout/ICELayoutManager.d.mts +33 -0
  116. package/dist/types/layout/ICELayoutManager.d.ts +33 -0
  117. package/dist/types/layout/ICEOverlayLayout.d.mts +25 -0
  118. package/dist/types/layout/ICEOverlayLayout.d.ts +25 -0
  119. package/dist/types/persistence/Deserializer.d.mts +43 -0
  120. package/dist/types/persistence/Deserializer.d.ts +43 -14
  121. package/dist/types/persistence/Serializer.d.mts +35 -0
  122. package/dist/types/persistence/Serializer.d.ts +35 -26
  123. package/dist/types/plugin/PluginHost.d.mts +86 -0
  124. package/dist/types/plugin/PluginHost.d.ts +86 -0
  125. package/dist/types/renderer/CanvasRenderer.d.mts +150 -0
  126. package/dist/types/renderer/CanvasRenderer.d.ts +150 -22
  127. package/dist/types/renderer/ObjectCache.d.mts +79 -0
  128. package/dist/types/renderer/ObjectCache.d.ts +79 -0
  129. package/dist/types/renderer/dirty-rect-util.d.mts +86 -0
  130. package/dist/types/renderer/dirty-rect-util.d.ts +86 -0
  131. package/dist/types/theme/ICETheme.d.mts +382 -0
  132. package/dist/types/theme/ICETheme.d.ts +382 -0
  133. package/dist/types/util/ImageCache.d.mts +19 -0
  134. package/dist/types/util/ImageCache.d.ts +19 -19
  135. package/dist/types/util/data-util.d.mts +43 -0
  136. package/dist/types/util/data-util.d.ts +43 -19
  137. package/dist/types/util/gl-matrix-skew.d.mts +14 -0
  138. package/dist/types/util/gl-matrix-skew.d.ts +14 -14
  139. package/dist/types/util/lang.d.mts +28 -0
  140. package/dist/types/util/lang.d.ts +28 -0
  141. package/dist/types/util/uuid.d.mts +1 -0
  142. package/dist/types/util/uuid.d.ts +1 -1
  143. package/package.json +119 -81
  144. package/dist/index.cjs.js +0 -25
  145. package/dist/index.js +0 -25
@@ -0,0 +1,436 @@
1
+ /**
2
+ * Copyright (c) 2022 大漠穷秋.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ import { mat2d } from 'gl-matrix';
9
+ import EventBus from '../event/EventBus.mjs';
10
+ import ICEEventTarget from '../event/ICEEventTarget.mjs';
11
+ import ICEBoundingBox from '../geometry/ICEBoundingBox.mjs';
12
+ import ICE from '../ICE.mjs';
13
+ /**
14
+ * @class ICEComponent
15
+ *
16
+ * 最顶级的抽象类,Canvas 内部所有可见的组件都是它的子类。
17
+ *
18
+ * @abstract
19
+ * @author 大漠穷秋<damoqiongqiu@126.com>
20
+ */
21
+ declare abstract class ICEComponent extends ICEEventTarget {
22
+ ice: ICE;
23
+ root: any;
24
+ ctx: any;
25
+ evtBus: EventBus;
26
+ parentNode: any;
27
+ protected static instanceCounter: number;
28
+ protected __dirty: boolean;
29
+ private __localBoxScratch;
30
+ /** 本渲染通道的「本地 → 设备」CTM(主画布通道 = 视口·composed;离屏位图通道 = base·composed)。 */
31
+ private __activeCtm;
32
+ /** 本渲染通道的「世界 → 设备」矩阵(主画布通道 = 视口;离屏通道 = 缓存位图的 base 矩阵)。 */
33
+ private __activeWorldMatrix;
34
+ /** 可见性缓存(代际号 + 值):见 `isEffectivelyVisible` 的说明。 */
35
+ private __visEpoch;
36
+ private __visValue;
37
+ /** 声明式渐变缓存:按描述对象引用判定,`refreshParams()` 里失效(setState 必然触发它)。 */
38
+ private __gradCache;
39
+ /**
40
+ * 「自身派生参数需要重算」标志(尺寸 / 点集 / 文本量测等,由 calcComponentParams 产出)。
41
+ *
42
+ * 与 `dirty` 的区别:
43
+ * - `dirty` 表示**需要重绘**。祖先变换变化时,后代的绝对矩阵变了 → 必须重绘;
44
+ * - `paramsDirty` 表示**自身派生参数需要重算**。它只取决于组件自身的 state,
45
+ * 与祖先变换无关。
46
+ *
47
+ * 拆分的目的:移动一个容器时,旧实现递归把所有后代置 `dirty`,而后代又以 `dirty`
48
+ * 判断是否重算派生参数 → 后代(尤其点集类图元)会白白重算 `calcDots()`。
49
+ * 现在后代只置 `dirty`(要重绘),派生参数仍为干净 → 跳过重量测。
50
+ *
51
+ * 统一由 `refreshParams()` 读取与清理,不要在别处手工维护。
52
+ */
53
+ protected __paramsDirty: boolean;
54
+ private __absScratchA;
55
+ private __absScratchB;
56
+ private __transScratch;
57
+ private __originScratch;
58
+ private __composeScratch;
59
+ private __viewportScratch;
60
+ /**
61
+ * @cfg
62
+ * {
63
+ * id: 'ICE_XXXXXXX', //UUID
64
+ * left: 0, //x 坐标相对于父组件的偏移量
65
+ * top: 0, //y 坐标相对于父组件的偏移量
66
+ * width: 0, //原始宽度,没有经过变换
67
+ * height: 0, //原始高度,没有经过变换
68
+ * style: {
69
+ * fillStyle: 'red',
70
+ * strokeStyle: 'blue',
71
+ * lineWidth: 1,
72
+ * },
73
+ * fill:true, //是否填充
74
+ * stroke:true, //是否描边
75
+ * animations: {}, //动画
76
+ * transform: { //组件自身的变换参数,不包含父组件
77
+ * translate: [0, 0], //平移,像素
78
+ * scale: [1, 1], //X轴缩放倍数,Y轴缩放倍数
79
+ * skew: [0, 0], //X轴扭曲角度,Y轴扭曲角度
80
+ * rotate: 0, //旋转角度
81
+ * },
82
+ * linearMatrix: [], //线性变换矩阵,不含平移,按照 gl-matrix 的格式定义
83
+ * composedMatrix: [], //复合变换矩阵,包含所有祖先节点的平移、原点移动、线性变换计算,composedMatrix 不会实时更新,如果需要获取当前最新的变换矩阵,需要调用 composeMatrix() 方法。按照 gl-matrix 的格式定义
84
+ * origin:'localCenter',
85
+ * localOrigin: [0,0], //相对于组件本地坐标系(组件内部的左上角为 [0,0] 点)计算的原点坐标
86
+ * absoluteOrigin: [0,0], //相对于全局坐标系(canvas 的左上角 [0,0] 点)计算的原点坐标
87
+ * zIndex: ICEComponent.instanceCounter++, //类似于 CSS 中的 zIndex
88
+ * display:true, //如果 display 为 false , Renderer 不会调用其 render 方法,对象在内存中存在,但是不会被渲染出来。如果 display 为 false ,所有子组件也不会被渲染出来。
89
+ * draggable:true, //是否可以拖动
90
+ * transformable:true, //是否可以进行变换:scale/rotate/skew ,以及 resize ,但是不控制拖动
91
+ * linkable:true, //组件是否可以用连接线连接起来,如果此状态为 true ,ICELinkSlotManager 在运行时会动态在组件上创建连接插槽 ICELinkSlot 的实例
92
+ * interactive: true, //是否可以进行用户交互操作,如果此参数为 false , draggable, transformable TODO:动画运行过程中不允许选中,不能进行交互???
93
+ * showMinBoundingBox:true, //是否显示最小包围盒,开发时打开,主要用于 debug
94
+ * showMaxBoundingBox:true, //是否显示最大包围盒,开发时打开,主要用于 debug
95
+ * }
96
+ * @param props
97
+ */
98
+ props: any;
99
+ /**
100
+ * 在 ICE 引擎中,所有对象都可以启用动画效果,所以对象的 state 随时可能发生变化。
101
+ * props 与 state 之间的关系与行为模式借鉴自 React 框架,概念模型完全一致。
102
+ * @see https://reactjs.org/docs/components-and-props.html
103
+ */
104
+ state: any;
105
+ private __presetName?;
106
+ private __userProps?;
107
+ constructor(props?: any);
108
+ /**
109
+ * 初始化 state:同样原型继承共享默认,只把用户传入的 own 字段深拷贝到实例,
110
+ * 运行时派生字段(矩阵/原点等)预分配 own 空值。
111
+ *
112
+ * 这样 state 与 props 是独立对象,任何「直接写 state」都不会污染 props 或共享默认;
113
+ * 同时省去「完整 cloneDeep(props)」里重复的默认嵌套对象(内存优化)。
114
+ */
115
+ private __initState;
116
+ /**
117
+ * 重新 resolve preset(主题热切换用):把 preset 补丁按当前主题重新展开,
118
+ * 只更新 preset 涉及的字段(style + radius/stroke/fill 等),用户显式传的值优先。
119
+ */
120
+ __reapplyPreset(theme?: any): void;
121
+ /**
122
+ * @method initEvents 注册默认支持的事件
123
+ *
124
+ * - ICEComponent 是顶级类,这里注册的事件所有子类都会响应。
125
+ * - 子类可以提供自己特殊的实现,也可以把此方法覆盖成空函数。
126
+ *
127
+ * @see {ICEComponent.keyboardEvtHandler}
128
+ */
129
+ protected initEvents(): void;
130
+ protected mouseDownEvtHandler(evt?: any): void;
131
+ protected mouseMoveEvtHandler(evt: any): boolean;
132
+ protected mouseUpEvtHandler(evt?: any): void;
133
+ /**
134
+ * @method keyboardEvtHandler 默认键盘事件处理
135
+ *
136
+ * - ICE 中的所有组件默认都可以接收键盘事件,子类可以覆盖此方法提供自己的实现。
137
+ * - 子类如果不需要响应键盘事件,可以覆盖一个空实现,或者在构造完成之后删掉对键盘事件的监听。
138
+ *
139
+ * !注意,这里只支持标准写法,不再兼容历史的 charCode 和 keyCode 写法。
140
+ * !W3C 标准按键值定义 https://www.w3.org/TR/uievents-key/#key-attribute-value
141
+ * @param evt
142
+ * @returns
143
+ */
144
+ protected keyboardEvtHandler(evt: any): void;
145
+ /**
146
+ * !Important: 核心方法,FrameManager 会调度此方法进行实际的渲染操作。
147
+ * !Important: 这些方法调用有顺序
148
+ */
149
+ render(): void;
150
+ /**
151
+ * 把组件渲染到指定的目标上下文(离屏缓存用)。
152
+ *
153
+ * - baseMatrix:在组件自身 composedMatrix 之前再叠加的基准矩阵。离屏缓存用它把世界盒
154
+ * 平移到离屏画布左上角,即最终 CTM = baseMatrix · composedMatrix。
155
+ * - 渲染期间临时把 this.ctx 重定向到 targetCtx,结束后恢复,不改变组件状态。
156
+ */
157
+ renderTo(targetCtx: any, baseMatrix?: number[] | null): void;
158
+ /**
159
+ * 「最终可见」:自身与**所有祖先**的 `state.display` 都为真。
160
+ *
161
+ * `state.display = false` 的语义是「整棵子树都不渲染」(见上方 props 文档),但渲染队列
162
+ * 是把树拉平后逐个入队的,只判组件自身的话,把一个父容器设为 false 后它的子组件仍会被
163
+ * 画出来、也仍能被点中。
164
+ *
165
+ * 顶层组件(无 parentNode)走 O(1) 快路径 —— 绝大多数组件都是顶层,热路径上不付出遍历成本。
166
+ */
167
+ isEffectivelyVisible(): boolean;
168
+ /** 真正沿父链判定一次(只在代际变化时执行)。 */
169
+ private __computeEffectivelyVisible;
170
+ private __renderCore;
171
+ protected applyStyleToCtx(): void;
172
+ /**
173
+ * 应用单个样式属性到 ctx,支持简写:
174
+ * - shadow: 'sm' | 'md' | 'lg' 展开成 shadowColor/shadowBlur/shadowOffsetX/shadowOffsetY。
175
+ */
176
+ private __applyStyleProp;
177
+ /**
178
+ * 把声明式渐变描述解析成 `CanvasGradient`(带缓存)。
179
+ *
180
+ * 描述形状(坐标是**组件本地坐标**):
181
+ * ```
182
+ * { type: 'linear', from: [0,0], to: [100,0], stops: [[0,'#fff'],[1,'#000']] }
183
+ * { type: 'radial', center: [50,50], radius: 50, innerRadius: 0, stops: [...] }
184
+ * { type: 'conic', center: [50,50], startAngle: 0, stops: [...] }
185
+ * ```
186
+ * 它比手搓 `CanvasGradient` 多两个好处:**可序列化**(纯对象,存盘不丢)与**可用于主题 preset**。
187
+ */
188
+ private __resolveGradient;
189
+ /** 真正构造 CanvasGradient。缺少对应 ctx API 时返回 null(调用方会退回纯色)。 */
190
+ private __buildGradient;
191
+ /**
192
+ * @method calcComponentParams
193
+ * - 计算组件最原始的宽高和位置,此时没有经过任何变换,也没有移动坐标原点。
194
+ * - 在计算组件的原始尺寸时还没有确定原点坐标,所以只能基于组件本地坐标系的左上角 (0,0) 点进行计算。
195
+ * - 此方法不能依赖原点位置和 transform 矩阵。
196
+ * - 此方法会在 render() 中调用,所以不需要在构造函数中调用。
197
+ * - 此方法中不能使用 setState() ,如果需要修改状态,直接赋值,如:this.state.width = 100;
198
+ * - 子类可以覆盖此方法,实现自己的计算逻辑。
199
+ * @returns
200
+ */
201
+ protected calcComponentParams(): {
202
+ width: any;
203
+ height: any;
204
+ };
205
+ /**
206
+ * 组件**本地包围盒**(未变换、未减去原点),写入并返回 [x0, y0, x1, y1]。
207
+ *
208
+ * 默认约定:几何自本地 (0,0) 起、尺寸为 `state.width/height`。
209
+ * **子类若几何不遵守该约定必须覆盖本方法** —— 例如 `ICEPolyLine` 的本地原点固定为 (0,0),
210
+ * 而点集可以含负坐标,此时 [0,0,w,h] 并非它的真实盒子。
211
+ *
212
+ * `getMinBoundingBox()` 与 `__paintWorldBox()` 都消费本方法,因此两者**必然一致**。
213
+ * 这两者以前各算各的:`__paintWorldBox()` 直接由 width/height 推导,而折线的 `width ≈ 0`
214
+ * (见 ICEPolyLine.calcComponentParams 的历史实现)→ 它上屏快照是个退化小盒 →
215
+ * dirty-rect 按快照盒挑选「需要重画的组件」时会漏掉折线,导致擦除区域内折线笔迹丢失。
216
+ *
217
+ * 注意:返回的是实例内复用缓冲,调用方应**立即读取**,不要持有。
218
+ */
219
+ protected __localBox(): number[];
220
+ /**
221
+ * 显式「测量」:刷新一次自身派生参数(尺寸 / 点集 / 文本量测)。
222
+ *
223
+ * 布局管理器(`ICELayoutManager`)排布时读的是 `child.state.width/height`,
224
+ * 而这些值在首次渲染之前是 0(文本甚至是 10 的哨兵值)—— 布局因此会算错。
225
+ * 由容器在布局前统一调一次本方法,布局就不必「等一帧才正确」。
226
+ */
227
+ measure(): void;
228
+ /**
229
+ * 派生参数刷新入口(**唯一**):按需调用子类的 `calcComponentParams()`,并在算完后清除 `paramsDirty`。
230
+ *
231
+ * - 参数干净时直接返回,因此「只重绘、不改自身参数」的帧(例如祖先移动)不会重算点集/文本量测。
232
+ * - 需要强制重算时请先置 `paramsDirty = true`(`setState` 已自动做这件事)。
233
+ */
234
+ refreshParams(): void;
235
+ /**
236
+ * 计算本地原点坐标,相对于组件本地坐标系。
237
+ * 此方法依赖于 width/height ,需要先计算组件的尺寸,然后才能调用此方法。
238
+ * @returns
239
+ */
240
+ protected calcLocalOrigin(): any;
241
+ /**
242
+ * 根据原点位置描述计算原点坐标值。
243
+ * 移动坐标原点后,组件内部所有的坐标点数值、边界盒子的坐标,都会受到影响。
244
+ * 计算出的原点数值已经包含了所有父层的移位和变换。
245
+ * @method calcAbsoluteOrigin
246
+ */
247
+ calcAbsoluteOrigin(): any;
248
+ /**
249
+ * 计算线性变换矩阵,此矩阵不包含平移操作。
250
+ * 线性变换顺序:旋转->错切->缩放
251
+ * 由于矩阵变换有顺序,这里采用符合自然理解的顺序进行。
252
+ * @method calcLinearMatrix
253
+ * @returns
254
+ */
255
+ protected calcLinearMatrix(): any;
256
+ /**
257
+ * 复合所有祖先节点的线性变换矩阵,获得相对于全局 canvas 对象的变换矩阵。
258
+ * @returns
259
+ */
260
+ calcAbsoluteLinearMatrix(): any;
261
+ /**
262
+ * 仿射变换由2步完成:
263
+ * - ctx 平移到指定的原点。
264
+ * - ctx 进行线性变换。
265
+ *
266
+ * Canvas 绘图过程中的仿射变换动作与线性代数中的规则有差异:
267
+ * - Canvas 的 Y 坐标轴方向是向下的。
268
+ * - Canvas 在做仿射变换时,变换的是 ctx 本身,而不是组件对象,相当于画布本身是具有弹性的可变形对象。
269
+ *
270
+ * @method composeMatrix
271
+ * @returns
272
+ */
273
+ protected composeMatrix(): mat2d;
274
+ /**
275
+ * 把变换矩阵应用到 this.ctx 上
276
+ */
277
+ protected applyTransformToCtx(baseMatrix?: number[] | null, applyViewport?: boolean): void;
278
+ /**
279
+ * 复原「本渲染通道的完整 CTM」(`base·composed` 或 `viewport·composed`)。
280
+ *
281
+ * 子类在 `super.doRender()` 之后需要重新拿到完整变换 —— 链上的 `ICEComponent.doRender()` 会
282
+ * 把 CTM 换成「世界 → 设备」矩阵以绘制 debug 包围盒。
283
+ *
284
+ * **不要用 `applyTransformToCtx(null, true)` 代替**:那条路径无条件按主画布视口重算,
285
+ * 在离屏位图通道里会把内容画到完全错误的位置(丢掉位图原点的平移),
286
+ * 表现为「连线的箭头与标签在缓存位图里整块消失」——离屏缓存保真测试就是抓这个的。
287
+ */
288
+ protected applyActiveTransform(): void;
289
+ /**
290
+ * 把「世界 → 设备」矩阵应用到 ctx。
291
+ * debug 包围盒的坐标本身就是世界坐标,不能套「本地 → 世界」的 composed 矩阵。
292
+ */
293
+ protected applyWorldTransform(): void;
294
+ /**
295
+ * 所有子类都应该提供具体的实现。
296
+ * @method doRender
297
+ */
298
+ protected doRender(): void;
299
+ /** 判断两个边界盒是否在视觉上重合(用于避免重复绘制几乎相同的 min/max 框)。 */
300
+ private __areBoundingBoxesNearlyEqual;
301
+ /**
302
+ * 获取组件的最小包围盒,此盒子的变换矩阵与组件自身完全相同。
303
+ * 此方法需要在 render() 之后调用,组件没有渲染时无法计算最小包围盒。
304
+ * @returns
305
+ */
306
+ getMinBoundingBox(refresh?: boolean): ICEBoundingBox;
307
+ /**
308
+ * 获取组件的最大包围盒:
309
+ * - 盒子保持水平和竖直,不旋转、不错切。
310
+ * - 盒子的4边在全局坐标 X/Y 轴上的投影范围与组件完全一致。
311
+ * @returns
312
+ */
313
+ getMaxBoundingBox(refresh?: boolean): ICEBoundingBox;
314
+ /**
315
+ * @method setState 更新组件状态
316
+ *
317
+ * - setState 仅仅修改参数,不会立即导致重新渲染,需要等待 FrameManager 调度,最小延迟时间约为 1/60=16.67 ms 。
318
+ * - state 上的所有数据是随时可能发生变化的,而 props 构造参数是不可变的,这一特性与 React 框架保持一致。 @see https://reactjs.org/docs/components-and-props.html
319
+ * - state 上的所有参数默认都会被序列化。
320
+ *
321
+ * @param newState
322
+ */
323
+ setState(newState: any): void;
324
+ /**
325
+ * `setState` 的**前置**钩子:必须在 `merge(this.state, newState)` 之前调用(要对比新旧值)。
326
+ *
327
+ * 覆盖 `setState` 的子类**必须**成对调用前后置钩子 —— `ICEGroup.setState` 是独立实现
328
+ * (它自己 merge、且不调 `super.setState`),曾因此漏掉这两件事:
329
+ * 「隐藏一个分组」不会让后代的可见性缓存失效、「分组改尺寸」不会触发父容器重排。
330
+ *
331
+ * @returns 尺寸是否变化(决定 `__afterStateMerge` 是否需要请求重排)
332
+ */
333
+ protected __beforeStateMerge(newState: any): boolean;
334
+ /** `setState` 的**后置**钩子:尺寸变化时请求父容器重排(合并到下一帧,见 `ICEGroup.requestLayout`)。 */
335
+ protected __afterStateMerge(sizeChanged: boolean): void;
336
+ set dirty(flag: boolean);
337
+ get dirty(): boolean;
338
+ set paramsDirty(flag: boolean);
339
+ get paramsDirty(): boolean;
340
+ /**
341
+ * 相对于父组件的坐标系和原点。
342
+ * @param left
343
+ * @param top
344
+ * @param evt
345
+ */
346
+ setPosition(left: number, top: number, evt?: any): void;
347
+ /**
348
+ * 在全局空间(canvas)中移动指定的位移。
349
+ * 注意:此方法用于直接设置组件在全局空间中的位移,而不是相对于其它坐标系。
350
+ * @param tx
351
+ * @param ty
352
+ * @param evt
353
+ */
354
+ moveGlobalPosition(tx: number, ty: number, evt?: any): void;
355
+ /**
356
+ * 直接设置在全局空间 (canvas) 中的位置。
357
+ * 注意:此方法用于直接设置组件在全局空间中的位置,而不是相对于其它坐标系。
358
+ * @param left
359
+ * @param top
360
+ * @param evt
361
+ */
362
+ setGlobalPosition(left: number, top: number, evt?: any): void;
363
+ /**
364
+ * 在全局空间(canvas)中旋转指定的角度。
365
+ * 注意:此方法用于直接设置组件在全局空间中的旋转角,而不是相对于其它坐标系。
366
+ * @param rotateAngle
367
+ */
368
+ setGlobalRotate(rotateAngle: any): void;
369
+ /**
370
+ * 组件局部坐标系中的点转换成全局空间(canvas)中的点,包含移动原点的操作。
371
+ * @param localX
372
+ * @param localY
373
+ * @returns
374
+ */
375
+ localToGlobal(localX: number, localY: number): number[];
376
+ /**
377
+ * 全局空间(canvas)中的点转换成组件局部坐标系中的点,包含移动原点的操作。
378
+ * @param globalX
379
+ * @param globalY
380
+ * @returns
381
+ */
382
+ globalToLocal(globalX: number, globalY: number): number[];
383
+ /**
384
+ * @method getRotateAngle 获取组件的旋转角度。
385
+ * 根据变换矩阵计算组件在全局空间(canvas)中的旋转角度。
386
+ * @param refresh 如果为 true ,则重新计算变换矩阵,否则使用缓存的变换矩阵。
387
+ * @returns
388
+ */
389
+ getRotateAngle(refresh?: boolean): number;
390
+ /**
391
+ * @method getLocalLeftTop 得到组件在局部坐标系中的左上角坐标。
392
+ * @param refresh 如果为 true ,则重新计算变换矩阵,否则使用缓存的变换矩阵。
393
+ * @returns
394
+ */
395
+ getLocalLeftTop(refresh?: boolean): {
396
+ left: number;
397
+ top: number;
398
+ width: number;
399
+ height: number;
400
+ };
401
+ /**
402
+ * @internal 渲染器专用:render 结束后的 ctx 泄漏属性归位(组件自包含,见顶部 LEAKY_CTX_PROPS)。
403
+ * 仅当本组件确实写过了某个泄漏属性时才归位,避免无谓的每帧属性写入。
404
+ */
405
+ __resetLeakyCtxState(): void;
406
+ private __leakyIndex;
407
+ /**
408
+ * @internal 渲染器专用:用「当前的 composedMatrix + __localBox() + localOrigin」计算世界轴对齐
409
+ * 包围盒 [minX, minY, maxX, maxY],零分配(手动 4 角变换,不复用 vec2 以免每帧分配)。
410
+ * 前置条件:调用方已保证 composedMatrix 新鲜(render 之后 / composeMatrix 之后)。
411
+ */
412
+ __paintWorldBox(out?: any): number[];
413
+ containsPoint(x: number, y: number): boolean;
414
+ /**
415
+ * 判断本地坐标(以组件 origin 为原点的空间)的点是否位于图元内部。
416
+ * 默认用最小包围盒(AABB),子类可覆盖为精确形状判定。
417
+ * @param localX
418
+ * @param localY
419
+ */
420
+ protected containsLocalPoint(localX: number, localY: number): boolean;
421
+ /**
422
+ * @method destory
423
+ * 销毁组件
424
+ * - FIXME:立即停止组件上的所有动画效果
425
+ * - 需要清理绑定的事件
426
+ * - 带有子节点的组件需要先销毁子节点,然后再销毁自身。
427
+ * - 子类需要覆盖此方法,释放自己占有的资源。
428
+ */
429
+ /**
430
+ * `destory()` 的拼写修正别名。
431
+ * 历史 API 拼写为 `destory`(已对外发布,不能直接改名),这里提供正确拼写作为等价入口。
432
+ */
433
+ destroy(): void;
434
+ destory(): void;
435
+ }
436
+ export default ICEComponent;