ice-render 1.0.7 → 1.2.0
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.
|
@@ -26,6 +26,14 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
26
26
|
parentNode: any;
|
|
27
27
|
protected static instanceCounter: number;
|
|
28
28
|
protected __dirty: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 本组件是否**已经真正绘制过一次**(`__renderCore` 走完了 doRender 才会置真)。
|
|
31
|
+
*
|
|
32
|
+
* 存在的意义:`dirty` 同时承担两个语义 —— 「本帧要重绘」和「几何缓存(`ICEPath.createPathObject`)
|
|
33
|
+
* 是否有效」。后者只在 doRender 里以 `if (this.dirty)` 的形式被消费,因此**从未渲染过的组件
|
|
34
|
+
* 一旦被置干净,它的路径缓存就永远不会被建立**,首次上屏是空的(见 `__applyDirty`)。
|
|
35
|
+
*/
|
|
36
|
+
protected __everRendered: boolean;
|
|
29
37
|
private __localBoxScratch;
|
|
30
38
|
/** 本渲染通道的「本地 → 设备」CTM(主画布通道 = 视口·composed;离屏位图通道 = base·composed)。 */
|
|
31
39
|
private __activeCtm;
|
|
@@ -286,6 +294,29 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
286
294
|
* 表现为「连线的箭头与标签在缓存位图里整块消失」——离屏缓存保真测试就是抓这个的。
|
|
287
295
|
*/
|
|
288
296
|
protected applyActiveTransform(): void;
|
|
297
|
+
/**
|
|
298
|
+
* 是否存在开启 `clipChildren` 的祖先(热路径用,命中检测与离屏缓存的门控都要问它)。
|
|
299
|
+
* 顶层组件直接 O(1) 返回。
|
|
300
|
+
*/
|
|
301
|
+
hasClippingAncestor(): boolean;
|
|
302
|
+
/**
|
|
303
|
+
* 世界坐标点是否落在某个「裁剪祖先」的盒子之外。
|
|
304
|
+
*
|
|
305
|
+
* 命中检测用它实现「滚出可视区的子组件点不到」—— 与渲染时的裁剪语义保持一致。
|
|
306
|
+
*/
|
|
307
|
+
isPointClippedOut(wx: number, wy: number): boolean;
|
|
308
|
+
/**
|
|
309
|
+
* 把「裁剪祖先」的盒子作为裁剪区应用到 ctx —— 在**设备空间**建立。
|
|
310
|
+
*
|
|
311
|
+
* 做法与脏矩形路径一致(见 CanvasRenderer 的局部重绘分支):
|
|
312
|
+
* `setTransform(单位矩阵) → rect → clip → 复原本组件 CTM`。clip 记录在 ctx 的裁剪状态里,
|
|
313
|
+
* 之后组件自己 `setTransform` 不会清掉它;`restore()` 才移除。
|
|
314
|
+
*
|
|
315
|
+
* 祖先有旋转/缩放时按其世界 AABB 裁剪(保守,宁可多裁不可漏裁)。
|
|
316
|
+
*
|
|
317
|
+
* @returns 是否建立过裁剪(true 时调用方必须 `ctx.restore()`)
|
|
318
|
+
*/
|
|
319
|
+
private __applyAncestorClips;
|
|
289
320
|
/**
|
|
290
321
|
* 把「世界 → 设备」矩阵应用到 ctx。
|
|
291
322
|
* debug 包围盒的坐标本身就是世界坐标,不能套「本地 → 世界」的 composed 矩阵。
|
|
@@ -335,6 +366,17 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
335
366
|
protected __afterStateMerge(sizeChanged: boolean): void;
|
|
336
367
|
set dirty(flag: boolean);
|
|
337
368
|
get dirty(): boolean;
|
|
369
|
+
/**
|
|
370
|
+
* 按 `markDirty` 语义更新脏标记。
|
|
371
|
+
*
|
|
372
|
+
* `markDirty = false` 的含义是「这次操作**不要**主动把组件标记为要重绘」(批量挂载时的性能优化),
|
|
373
|
+
* 而**不是**「把它强制置干净」:对从未绘制过的组件置干净会让几何缓存永不建立,首次上屏画不出
|
|
374
|
+
* 自身的路径(`ICEPath.doRender` 只在 dirty 时调用 `createPathObject`)。
|
|
375
|
+
*
|
|
376
|
+
* 例:`UIButton` 构造函数里 `addChild(this.label, false)` 会把自己置干净,导致按钮的圆角矩形
|
|
377
|
+
* 背景/边框在首帧是空路径 —— 页面上表现为「白底白字、完全看不见的按钮」。
|
|
378
|
+
*/
|
|
379
|
+
protected __applyDirty(markDirty: boolean): void;
|
|
338
380
|
set paramsDirty(flag: boolean);
|
|
339
381
|
get paramsDirty(): boolean;
|
|
340
382
|
/**
|
|
@@ -26,6 +26,14 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
26
26
|
parentNode: any;
|
|
27
27
|
protected static instanceCounter: number;
|
|
28
28
|
protected __dirty: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 本组件是否**已经真正绘制过一次**(`__renderCore` 走完了 doRender 才会置真)。
|
|
31
|
+
*
|
|
32
|
+
* 存在的意义:`dirty` 同时承担两个语义 —— 「本帧要重绘」和「几何缓存(`ICEPath.createPathObject`)
|
|
33
|
+
* 是否有效」。后者只在 doRender 里以 `if (this.dirty)` 的形式被消费,因此**从未渲染过的组件
|
|
34
|
+
* 一旦被置干净,它的路径缓存就永远不会被建立**,首次上屏是空的(见 `__applyDirty`)。
|
|
35
|
+
*/
|
|
36
|
+
protected __everRendered: boolean;
|
|
29
37
|
private __localBoxScratch;
|
|
30
38
|
/** 本渲染通道的「本地 → 设备」CTM(主画布通道 = 视口·composed;离屏位图通道 = base·composed)。 */
|
|
31
39
|
private __activeCtm;
|
|
@@ -286,6 +294,29 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
286
294
|
* 表现为「连线的箭头与标签在缓存位图里整块消失」——离屏缓存保真测试就是抓这个的。
|
|
287
295
|
*/
|
|
288
296
|
protected applyActiveTransform(): void;
|
|
297
|
+
/**
|
|
298
|
+
* 是否存在开启 `clipChildren` 的祖先(热路径用,命中检测与离屏缓存的门控都要问它)。
|
|
299
|
+
* 顶层组件直接 O(1) 返回。
|
|
300
|
+
*/
|
|
301
|
+
hasClippingAncestor(): boolean;
|
|
302
|
+
/**
|
|
303
|
+
* 世界坐标点是否落在某个「裁剪祖先」的盒子之外。
|
|
304
|
+
*
|
|
305
|
+
* 命中检测用它实现「滚出可视区的子组件点不到」—— 与渲染时的裁剪语义保持一致。
|
|
306
|
+
*/
|
|
307
|
+
isPointClippedOut(wx: number, wy: number): boolean;
|
|
308
|
+
/**
|
|
309
|
+
* 把「裁剪祖先」的盒子作为裁剪区应用到 ctx —— 在**设备空间**建立。
|
|
310
|
+
*
|
|
311
|
+
* 做法与脏矩形路径一致(见 CanvasRenderer 的局部重绘分支):
|
|
312
|
+
* `setTransform(单位矩阵) → rect → clip → 复原本组件 CTM`。clip 记录在 ctx 的裁剪状态里,
|
|
313
|
+
* 之后组件自己 `setTransform` 不会清掉它;`restore()` 才移除。
|
|
314
|
+
*
|
|
315
|
+
* 祖先有旋转/缩放时按其世界 AABB 裁剪(保守,宁可多裁不可漏裁)。
|
|
316
|
+
*
|
|
317
|
+
* @returns 是否建立过裁剪(true 时调用方必须 `ctx.restore()`)
|
|
318
|
+
*/
|
|
319
|
+
private __applyAncestorClips;
|
|
289
320
|
/**
|
|
290
321
|
* 把「世界 → 设备」矩阵应用到 ctx。
|
|
291
322
|
* debug 包围盒的坐标本身就是世界坐标,不能套「本地 → 世界」的 composed 矩阵。
|
|
@@ -335,6 +366,17 @@ declare abstract class ICEComponent extends ICEEventTarget {
|
|
|
335
366
|
protected __afterStateMerge(sizeChanged: boolean): void;
|
|
336
367
|
set dirty(flag: boolean);
|
|
337
368
|
get dirty(): boolean;
|
|
369
|
+
/**
|
|
370
|
+
* 按 `markDirty` 语义更新脏标记。
|
|
371
|
+
*
|
|
372
|
+
* `markDirty = false` 的含义是「这次操作**不要**主动把组件标记为要重绘」(批量挂载时的性能优化),
|
|
373
|
+
* 而**不是**「把它强制置干净」:对从未绘制过的组件置干净会让几何缓存永不建立,首次上屏画不出
|
|
374
|
+
* 自身的路径(`ICEPath.doRender` 只在 dirty 时调用 `createPathObject`)。
|
|
375
|
+
*
|
|
376
|
+
* 例:`UIButton` 构造函数里 `addChild(this.label, false)` 会把自己置干净,导致按钮的圆角矩形
|
|
377
|
+
* 背景/边框在首帧是空路径 —— 页面上表现为「白底白字、完全看不见的按钮」。
|
|
378
|
+
*/
|
|
379
|
+
protected __applyDirty(markDirty: boolean): void;
|
|
338
380
|
set paramsDirty(flag: boolean);
|
|
339
381
|
get paramsDirty(): boolean;
|
|
340
382
|
/**
|