@solidtv/renderer 1.5.0 → 1.5.2

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 (42) hide show
  1. package/dist/src/common/EventEmitter.d.ts +8 -0
  2. package/dist/src/common/EventEmitter.js +20 -0
  3. package/dist/src/common/EventEmitter.js.map +1 -1
  4. package/dist/src/core/Autosizer.js +3 -1
  5. package/dist/src/core/Autosizer.js.map +1 -1
  6. package/dist/src/core/CoreNode.d.ts +39 -0
  7. package/dist/src/core/CoreNode.js +115 -25
  8. package/dist/src/core/CoreNode.js.map +1 -1
  9. package/dist/src/core/CoreTextNode.js +11 -4
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/Stage.d.ts +6 -0
  12. package/dist/src/core/Stage.js +9 -0
  13. package/dist/src/core/Stage.js.map +1 -1
  14. package/dist/src/core/TextureMemoryManager.d.ts +39 -2
  15. package/dist/src/core/TextureMemoryManager.js +53 -1
  16. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  17. package/dist/src/core/renderers/canvas/CanvasRenderer.js +5 -1
  18. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  19. package/dist/src/core/renderers/webgl/WebGlRenderer.js +5 -1
  20. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  21. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +28 -0
  22. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +70 -10
  23. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  24. package/dist/src/main-api/Renderer.d.ts +23 -0
  25. package/dist/src/main-api/Renderer.js +2 -0
  26. package/dist/src/main-api/Renderer.js.map +1 -1
  27. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  28. package/package.json +1 -1
  29. package/src/common/EventEmitter.ts +21 -0
  30. package/src/core/Autosizer.ts +3 -1
  31. package/src/core/CoreNode.test.ts +425 -0
  32. package/src/core/CoreNode.ts +146 -26
  33. package/src/core/CoreTextNode.test.ts +62 -0
  34. package/src/core/CoreTextNode.ts +13 -4
  35. package/src/core/Stage.ts +9 -0
  36. package/src/core/TextureMemoryManager.test.ts +272 -5
  37. package/src/core/TextureMemoryManager.ts +59 -2
  38. package/src/core/renderers/canvas/CanvasRenderer.ts +7 -1
  39. package/src/core/renderers/webgl/WebGlRenderer.ts +6 -1
  40. package/src/core/renderers/webgl/WebGlShaderProgram.ts +78 -15
  41. package/src/core/renderers/webgl/WebGlShaderProgram.uniformDedup.test.ts +233 -0
  42. package/src/main-api/Renderer.ts +26 -0
@@ -14,5 +14,13 @@ export declare class EventEmitter implements IEventEmitter {
14
14
  off(event: string, listener?: (target: any, data: any) => void): void;
15
15
  once(event: string, listener: (target: any, data: any) => void): void;
16
16
  emit(event: string, data?: any): void;
17
+ /**
18
+ * Whether any listener is currently registered for any event.
19
+ *
20
+ * @remarks
21
+ * Used as a liveness signal: a `Texture` with no listeners has no
22
+ * `CoreNode` (or `SubTexture`) subscribed to it.
23
+ */
24
+ hasListeners(): boolean;
17
25
  removeAllListeners(): void;
18
26
  }
@@ -59,6 +59,26 @@ export class EventEmitter {
59
59
  listener(this, data);
60
60
  });
61
61
  }
62
+ /**
63
+ * Whether any listener is currently registered for any event.
64
+ *
65
+ * @remarks
66
+ * Used as a liveness signal: a `Texture` with no listeners has no
67
+ * `CoreNode` (or `SubTexture`) subscribed to it.
68
+ */
69
+ hasListeners() {
70
+ const map = this.eventListeners;
71
+ if (map === null) {
72
+ return false;
73
+ }
74
+ for (const event in map) {
75
+ const listeners = map[event];
76
+ if (listeners !== undefined && listeners.length > 0) {
77
+ return true;
78
+ }
79
+ }
80
+ return false;
81
+ }
62
82
  removeAllListeners() {
63
83
  this.eventListeners = null;
64
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../../src/common/EventEmitter.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;OAKG;IACK,cAAc,GAAwC,IAAI,CAAC;IAEnE,EAAE,CAAC,KAAa,EAAE,QAA0C;QAC1D,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS,GAAG,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAA2C;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,QAA0C;QAC5D,MAAM,YAAY,GAAG,CAAC,MAAW,EAAE,IAAS,EAAE,EAAE;YAC9C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC9B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,IAAU;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF"}
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../../src/common/EventEmitter.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB;;;;;OAKG;IACK,cAAc,GAAwC,IAAI,CAAC;IAEnE,EAAE,CAAC,KAAa,EAAE,QAA0C;QAC1D,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,SAAS,GAAG,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,QAA2C;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,QAA0C;QAC5D,MAAM,YAAY,GAAG,CAAC,MAAW,EAAE,IAAS,EAAE,EAAE;YAC9C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC9B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,IAAU;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,YAAY;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;QAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF"}
@@ -13,7 +13,9 @@ export var AutosizeUpdateType;
13
13
  const applyDimensions = (node, w, h) => {
14
14
  node.props.w = w;
15
15
  node.props.h = h;
16
- node.setUpdateType(UpdateType.Local);
16
+ // Direct props.w/h write bypasses the w/h setters, so raise RecalcUniforms
17
+ // here too — dimensions feed shader uniforms.
18
+ node.setUpdateType(UpdateType.Local | UpdateType.RecalcUniforms);
17
19
  };
18
20
  const getFilteredChildren = (children, childMap) => {
19
21
  const filtered = [];
@@ -1 +1 @@
1
- {"version":3,"file":"Autosizer.js","sourceRoot":"","sources":["../../../src/core/Autosizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAG1D,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,uDAAY,CAAA;IACZ,qDAAW,CAAA;AACb,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,MAAM,CAAN,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC5B,2DAAQ,CAAA;IACR,mEAAY,CAAA;IACZ,yDAAO,CAAA;AACT,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,QAI7B;AAED,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE;IAC/D,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,QAAkB,EAClB,QAA+B,EAC/B,EAAE;IACF,MAAM,QAAQ,GAAe,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAG,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,MAAM,OAAO,SAAS;IAuBD;IAtBZ,EAAE,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAiB,YAAY,CAAC,QAAQ,CAAC;IAC3C,UAAU,GAAuB,kBAAkB,CAAC,GAAG,CAAC;IACxD,SAAS,GAAW,CAAC,CAAC;IACtB,UAAU,GAAW,CAAC,CAAC;IACvB,cAAc,GAAY,KAAK,CAAC;IAEhC,eAAe,GAAa,EAAE,CAAC;IAC/B,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAC;IAE5C,IAAI,GAAG,QAAQ,CAAC;IAChB,IAAI,GAAG,QAAQ,CAAC;IAChB,IAAI,GAAG,CAAC,QAAQ,CAAC;IACjB,IAAI,GAAG,CAAC,QAAQ,CAAC;IAEjB,OAAO,GAAiC;QACtC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACd,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;KACf,CAAC;IAEF,YAAmB,IAAc;QAAd,SAAI,GAAJ,IAAI,CAAU;QAC/B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAc;QACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,wCAAwC;QACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAc;QACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,oCAAoC;YACpC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,EAAU;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,aAAa,CAAC,UAA8B;QAC1C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IACE,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO;YAClC,IAAI,CAAC,OAAO,KAAK,IAAI;YACrB,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,EAChC,CAAC;YACD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;gBACjC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,GACV,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,QAAQ;YAC7C,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACvE,SAAS;YACX,CAAC;YAED,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC;YACxD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAExB,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAE9B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;YACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;YACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;YAEzB,mBAAmB;YACnB,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;gBACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC7B,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC3B,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC;QAE1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3C,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;CACF"}
1
+ {"version":3,"file":"Autosizer.js","sourceRoot":"","sources":["../../../src/core/Autosizer.ts"],"names":[],"mappings":"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"}
@@ -322,6 +322,23 @@ export interface CoreNodeProps {
322
322
  * rendering.
323
323
  */
324
324
  colorBl: number;
325
+ /**
326
+ * Placeholder color shown while the Node's texture is not yet loaded.
327
+ *
328
+ * @remarks
329
+ * When set to a non-zero color and the Node has a texture (e.g. {@link src}),
330
+ * the Node renders a solid rectangle of this color until the texture
331
+ * finishes loading, instead of rendering nothing. The placeholder renders
332
+ * through the Node's shader, so rounded corners and borders apply to it.
333
+ * It also shows again if the texture is freed under memory pressure (until
334
+ * the reload completes) and remains if the texture permanently fails.
335
+ *
336
+ * The color value is a number in the format 0xRRGGBBAA. Set to `0` to
337
+ * disable (default). Has no effect on Nodes without a texture.
338
+ *
339
+ * @default `0`
340
+ */
341
+ placeholderColor: number;
325
342
  /**
326
343
  * The Node's parent Node.
327
344
  *
@@ -704,6 +721,14 @@ export declare class CoreNode extends EventEmitter {
704
721
  hasShaderTimeFn: boolean;
705
722
  private hasColorProps;
706
723
  textureLoaded: boolean;
724
+ /**
725
+ * True while this node should render its `placeholderColor` instead of its
726
+ * texture: `placeholderColor` is non-zero, a texture is set, and that
727
+ * texture is not loaded. Read by the renderers' quad path to substitute the
728
+ * stage's default (1x1 white) texture. Maintained by
729
+ * {@link updatePlaceholderActive} — never written elsewhere.
730
+ */
731
+ placeholderActive: boolean;
707
732
  updateType: UpdateType;
708
733
  childUpdateType: UpdateType;
709
734
  globalTransform?: Matrix3d;
@@ -767,6 +792,18 @@ export declare class CoreNode extends EventEmitter {
767
792
  parentAutosizer: Autosizer | null;
768
793
  destroyed: boolean;
769
794
  constructor(stage: Stage, props: CoreNodeProps);
795
+ /**
796
+ * Recompute {@link placeholderActive} after any of its inputs changed
797
+ * (placeholderColor, texture, textureLoaded).
798
+ *
799
+ * @remarks
800
+ * On a toggle this raises `PremultipliedColors` (the quad's vertex colors
801
+ * switch between the placeholder color and the regular color props — this
802
+ * also marks the quad dirty) and `IsRenderable` (a loading texture with a
803
+ * placeholder is renderable). Both are processed in the same frame's update
804
+ * pass, before quads are submitted.
805
+ */
806
+ private updatePlaceholderActive;
770
807
  loadTexture(): void;
771
808
  /**
772
809
  * Task for queueMicrotask to loadTexture
@@ -895,6 +932,8 @@ export declare class CoreNode extends EventEmitter {
895
932
  set clipping(value: boolean | [number, number, number, number]);
896
933
  get color(): number;
897
934
  set color(value: number);
935
+ get placeholderColor(): number;
936
+ set placeholderColor(value: number);
898
937
  get colorTop(): number;
899
938
  set colorTop(value: number);
900
939
  get colorBottom(): number;
@@ -171,6 +171,14 @@ export class CoreNode extends EventEmitter {
171
171
  hasShaderTimeFn = false;
172
172
  hasColorProps = false;
173
173
  textureLoaded = false;
174
+ /**
175
+ * True while this node should render its `placeholderColor` instead of its
176
+ * texture: `placeholderColor` is non-zero, a texture is set, and that
177
+ * texture is not loaded. Read by the renderers' quad path to substitute the
178
+ * stage's default (1x1 white) texture. Maintained by
179
+ * {@link updatePlaceholderActive} — never written elsewhere.
180
+ */
181
+ placeholderActive = false;
174
182
  updateType = UpdateType.All;
175
183
  childUpdateType = UpdateType.None;
176
184
  globalTransform;
@@ -314,6 +322,26 @@ export class CoreNode extends EventEmitter {
314
322
  this.updateIsSimple();
315
323
  }
316
324
  //#region Textures
325
+ /**
326
+ * Recompute {@link placeholderActive} after any of its inputs changed
327
+ * (placeholderColor, texture, textureLoaded).
328
+ *
329
+ * @remarks
330
+ * On a toggle this raises `PremultipliedColors` (the quad's vertex colors
331
+ * switch between the placeholder color and the regular color props — this
332
+ * also marks the quad dirty) and `IsRenderable` (a loading texture with a
333
+ * placeholder is renderable). Both are processed in the same frame's update
334
+ * pass, before quads are submitted.
335
+ */
336
+ updatePlaceholderActive() {
337
+ const active = this.props.placeholderColor !== 0 &&
338
+ this.props.texture !== null &&
339
+ this.textureLoaded === false;
340
+ if (active !== this.placeholderActive) {
341
+ this.placeholderActive = active;
342
+ this.setUpdateType(UpdateType.PremultipliedColors | UpdateType.IsRenderable);
343
+ }
344
+ }
317
345
  loadTexture() {
318
346
  if (this.props.texture === null) {
319
347
  return;
@@ -377,6 +405,7 @@ export class CoreNode extends EventEmitter {
377
405
  this.autosizer.update();
378
406
  }
379
407
  this.textureLoaded = true;
408
+ this.updatePlaceholderActive();
380
409
  this.setUpdateType(UpdateType.IsRenderable);
381
410
  // Texture was loaded. In case the RAF loop has already stopped, we request
382
411
  // a render to ensure the texture is rendered.
@@ -403,9 +432,12 @@ export class CoreNode extends EventEmitter {
403
432
  };
404
433
  onTextureFailed = (_, error) => {
405
434
  // immediately set isRenderable to false, so that we handle the error
406
- // without waiting for the next frame loop
435
+ // without waiting for the next frame loop. With a placeholder set, the
436
+ // same frame's update pass recomputes this to true and renders the
437
+ // placeholder instead.
407
438
  this.textureLoaded = false;
408
439
  this.isRenderable = false;
440
+ this.updatePlaceholderActive();
409
441
  this.updateTextureOwnership(false);
410
442
  this.setUpdateType(UpdateType.IsRenderable);
411
443
  // If parent has a render texture, flag that we need to update
@@ -422,9 +454,12 @@ export class CoreNode extends EventEmitter {
422
454
  };
423
455
  onTextureFreed = () => {
424
456
  // immediately set isRenderable to false, so that we handle the error
425
- // without waiting for the next frame loop
457
+ // without waiting for the next frame loop. With a placeholder set, the
458
+ // same frame's update pass recomputes this to true and renders the
459
+ // placeholder while the texture reloads.
426
460
  this.textureLoaded = false;
427
461
  this.isRenderable = false;
462
+ this.updatePlaceholderActive();
428
463
  this.updateTextureOwnership(false);
429
464
  this.setUpdateType(UpdateType.IsRenderable);
430
465
  // If parent has a render texture, flag that we need to update
@@ -642,7 +677,13 @@ export class CoreNode extends EventEmitter {
642
677
  }
643
678
  this.calculateRenderCoords();
644
679
  this.updateBoundingRect();
645
- updateType |= UpdateType.RenderState | UpdateType.RecalcUniforms;
680
+ // RecalcUniforms is intentionally NOT set here: shader uniforms are a
681
+ // function of resolvedProps + w/h only (that is exactly the shader
682
+ // value-key cache key), so pure transform changes (translate, scale,
683
+ // rotate) cannot affect them. The flag is raised where w/h actually
684
+ // change: the w/h setters, Autosizer.applyDimensions, text layout
685
+ // application, and the shader setter itself.
686
+ updateType |= UpdateType.RenderState;
646
687
  //only propagate children updates if not autosizing
647
688
  if ((updateType & UpdateType.Autosize) === 0) {
648
689
  updateType |= UpdateType.Children;
@@ -693,24 +734,37 @@ export class CoreNode extends EventEmitter {
693
734
  }
694
735
  if (updateType & UpdateType.PremultipliedColors) {
695
736
  const alpha = this.worldAlpha;
696
- const tl = props.colorTl;
697
- const tr = props.colorTr;
698
- const bl = props.colorBl;
699
- const br = props.colorBr;
700
- // Fast equality check (covers all 4 corners)
701
- const same = tl === tr && tl === bl && tl === br;
702
- const merged = premultiplyColorABGR(tl, alpha);
703
- this.premultipliedColorTl = merged;
704
- if (same === true) {
705
- this.premultipliedColorTr =
706
- this.premultipliedColorBl =
707
- this.premultipliedColorBr =
708
- merged;
737
+ if (this.placeholderActive === true) {
738
+ // Placeholder rendering: all four corners take the placeholder color.
739
+ // The quad samples the stage's default 1x1 white texture, so this is
740
+ // exactly the color-rect path.
741
+ const merged = premultiplyColorABGR(props.placeholderColor, alpha);
742
+ this.premultipliedColorTl =
743
+ this.premultipliedColorTr =
744
+ this.premultipliedColorBl =
745
+ this.premultipliedColorBr =
746
+ merged;
709
747
  }
710
748
  else {
711
- this.premultipliedColorTr = premultiplyColorABGR(tr, alpha);
712
- this.premultipliedColorBl = premultiplyColorABGR(bl, alpha);
713
- this.premultipliedColorBr = premultiplyColorABGR(br, alpha);
749
+ const tl = props.colorTl;
750
+ const tr = props.colorTr;
751
+ const bl = props.colorBl;
752
+ const br = props.colorBr;
753
+ // Fast equality check (covers all 4 corners)
754
+ const same = tl === tr && tl === bl && tl === br;
755
+ const merged = premultiplyColorABGR(tl, alpha);
756
+ this.premultipliedColorTl = merged;
757
+ if (same === true) {
758
+ this.premultipliedColorTr =
759
+ this.premultipliedColorBl =
760
+ this.premultipliedColorBr =
761
+ merged;
762
+ }
763
+ else {
764
+ this.premultipliedColorTr = premultiplyColorABGR(tr, alpha);
765
+ this.premultipliedColorBl = premultiplyColorABGR(bl, alpha);
766
+ this.premultipliedColorBr = premultiplyColorABGR(br, alpha);
767
+ }
714
768
  }
715
769
  }
716
770
  if (this.renderState === CoreNodeRenderState.OutOfBounds) {
@@ -947,14 +1001,19 @@ export class CoreNode extends EventEmitter {
947
1001
  // preemptive check for failed textures this will mark the current node as non-renderable
948
1002
  // and will prevent further checks until the texture is reloaded or retry is reset on the texture
949
1003
  if (this.texture.retryCount > this.texture.maxRetryCount) {
950
- // texture has failed to load, we cannot render
1004
+ // texture has failed to load, we cannot render the texture itself —
1005
+ // but a placeholder color still renders in its place
951
1006
  this.updateTextureOwnership(false);
952
- this.setRenderable(false);
1007
+ this.setRenderable(this.placeholderActive === true &&
1008
+ (this.stage.renderOnlyInViewport === false ||
1009
+ this.renderState === CoreNodeRenderState.InViewport));
953
1010
  return;
954
1011
  }
955
1012
  needsTextureOwnership = true;
956
- // Use cached boolean instead of string comparison
957
- newIsRenderable = this.textureLoaded;
1013
+ // Use cached boolean instead of string comparison; a placeholder
1014
+ // renders while the texture is loading
1015
+ newIsRenderable =
1016
+ this.textureLoaded === true || this.placeholderActive === true;
958
1017
  }
959
1018
  else if (
960
1019
  // check shader
@@ -965,6 +1024,14 @@ export class CoreNode extends EventEmitter {
965
1024
  // This mean we have dimensions and a color set, so we can render a ColorTexture
966
1025
  newIsRenderable = true;
967
1026
  }
1027
+ // renderOnlyInViewport: nodes in the preload margin keep texture
1028
+ // ownership above (so loading proceeds) but stay out of the render list
1029
+ // until they actually intersect the viewport.
1030
+ if (newIsRenderable === true &&
1031
+ this.stage.renderOnlyInViewport === true &&
1032
+ this.renderState !== CoreNodeRenderState.InViewport) {
1033
+ newIsRenderable = false;
1034
+ }
968
1035
  this.updateTextureOwnership(needsTextureOwnership);
969
1036
  this.setRenderable(newIsRenderable);
970
1037
  }
@@ -1184,6 +1251,9 @@ export class CoreNode extends EventEmitter {
1184
1251
  renderer.addQuad(this);
1185
1252
  }
1186
1253
  get renderTexture() {
1254
+ if (this.placeholderActive === true) {
1255
+ return this.stage.defaultTexture;
1256
+ }
1187
1257
  return this.props.texture || this.stage.defaultTexture;
1188
1258
  }
1189
1259
  get renderTextureCoords() {
@@ -1330,7 +1400,9 @@ export class CoreNode extends EventEmitter {
1330
1400
  const props = this.props;
1331
1401
  if (props.w !== value) {
1332
1402
  props.w = value;
1333
- let updateType = UpdateType.Local;
1403
+ // Dimensions feed shader uniforms (e.g. factored corner radius), so a
1404
+ // resize must recompute them; see the Global-update branch in update().
1405
+ let updateType = UpdateType.Local | UpdateType.RecalcUniforms;
1334
1406
  if (props.texture !== null &&
1335
1407
  this.stage.calculateTextureCoord === true &&
1336
1408
  props.textureOptions !== null) {
@@ -1351,7 +1423,9 @@ export class CoreNode extends EventEmitter {
1351
1423
  const props = this.props;
1352
1424
  if (props.h !== value) {
1353
1425
  props.h = value;
1354
- let updateType = UpdateType.Local;
1426
+ // Dimensions feed shader uniforms (e.g. factored corner radius), so a
1427
+ // resize must recompute them; see the Global-update branch in update().
1428
+ let updateType = UpdateType.Local | UpdateType.RecalcUniforms;
1355
1429
  if (props.texture !== null &&
1356
1430
  this.stage.calculateTextureCoord === true &&
1357
1431
  props.textureOptions !== null) {
@@ -1557,6 +1631,21 @@ export class CoreNode extends EventEmitter {
1557
1631
  this.colorRight = value;
1558
1632
  this.setUpdateType(UpdateType.PremultipliedColors);
1559
1633
  }
1634
+ get placeholderColor() {
1635
+ return this.props.placeholderColor;
1636
+ }
1637
+ set placeholderColor(value) {
1638
+ const p = this.props;
1639
+ if (p.placeholderColor === value)
1640
+ return;
1641
+ p.placeholderColor = value;
1642
+ this.updatePlaceholderActive();
1643
+ // If the placeholder is (still) showing, the new color must reach the
1644
+ // quad buffer even though the active state did not toggle.
1645
+ if (this.placeholderActive === true) {
1646
+ this.setUpdateType(UpdateType.PremultipliedColors);
1647
+ }
1648
+ }
1560
1649
  get colorTop() {
1561
1650
  return this.props.colorTop;
1562
1651
  }
@@ -1896,6 +1985,7 @@ export class CoreNode extends EventEmitter {
1896
1985
  this.textureCoords = undefined;
1897
1986
  this.props.texture = value;
1898
1987
  this.textureLoaded = value !== null && value.state === 'loaded';
1988
+ this.updatePlaceholderActive();
1899
1989
  if (value !== null) {
1900
1990
  if (this.autosizer !== null) {
1901
1991
  this.autosizer.setMode(AutosizeMode.Texture); // Set to texture size mode