@babylonjs/gui 7.7.0 → 7.7.1
Sign up to get free protection for your applications and to get access to all the features.
- package/2D/controls/control.js +1 -1
- package/2D/controls/control.js.map +1 -1
- package/2D/controls/image.js +24 -15
- package/2D/controls/image.js.map +1 -1
- package/package.json +2 -2
package/2D/controls/control.js
CHANGED
@@ -1923,7 +1923,7 @@ export class Control {
|
|
1923
1923
|
this.fontSizeInPixels +
|
1924
1924
|
"px " +
|
1925
1925
|
this._getStyleProperty("fontFamily", "Arial");
|
1926
|
-
this._fontOffset = Control._GetFontOffset(this._font, this._host
|
1926
|
+
this._fontOffset = Control._GetFontOffset(this._font, this._host?.getScene()?.getEngine());
|
1927
1927
|
//children need to be refreshed
|
1928
1928
|
this.getDescendants().forEach((child) => child._markAllAsDirty());
|
1929
1929
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/control.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,6CAA+B;AAElE,OAAO,EAAE,iBAAiB,EAAE,gDAAkC;AAC9D,OAAO,EAAE,MAAM,EAAE,uCAAyB;AAC1C,OAAO,EAAE,KAAK,EAAE,sCAAwB;AAMxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,0CAA4B;AAC9D,OAAO,EAAE,SAAS,EAAE,2CAA6B;AACjD,OAAO,EAAE,mBAAmB,EAAE,yDAA2C;AAEzE,OAAO,EAAE,WAAW,EAAE,+CAAiC;AAQvD;;;GAGG;AACH,MAAM,OAAO,OAAO;IAmHhB;;;OAGG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAc;QAChC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAyBD;;;OAGG;IACH,IAAW,YAAY,CAAC,KAAc;QAClC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAGD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAGD;;;OAGG;IACH,IAAW,WAAW,CAAC,KAAc;QACjC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAGD,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAWD,yFAAyF;IAEzF,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAGD,yFAAyF;IAEzF,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAID,qFAAqF;IAErF,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC;QAE5C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAGD,4FAA4F;IAE5F,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE;YAC7B,OAAO;SACV;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAWD,aAAa;IAEb,iCAAiC;IACjC,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAW,gBAAgB,CAAC,KAAkC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,mCAAmC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAoED;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,iFAAiF;IAEjF,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,MAA2D;QAC7E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,iGAAiG;IAEjG,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK,CAAC,KAAa;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACvB,OAAO;SACV;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,IAAW,kBAAkB,CAAC,KAAa;QACvC,IAAI,IAAI,CAAC,mBAAmB,KAAK,KAAK,EAAE;YACpC,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,KAAc;QACnC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAQD;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,cAAc,CAAC,KAAa;QACnC,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE;YAChC,OAAO;SACV;QAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IAEH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,MAAM,CAAC,KAAa;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;YACxB,OAAO;SACV;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IAEH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,MAAM,CAAC,KAAa;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;YACxB,OAAO;SACV;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IAEH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAAa;QAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;YAC1B,OAAO;SACV;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IAEH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAa;QACrC,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAAE;YAClC,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IAEH,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAa;QACrC,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,EAAE;YAClC,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;;OAGG;IAEH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,IAAW,mBAAmB,CAAC,KAAa;QACxC,IAAI,IAAI,CAAC,oBAAoB,KAAK,KAAK,EAAE;YACrC,OAAO;SACV;QAED,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IAEH,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;YACnC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAGD,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IAEH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAGD,IAAI,uBAAuB,CAAC,KAAc;QACtC,IAAI,IAAI,CAAC,wBAAwB,KAAK,KAAK,EAAE;YACzC,OAAO;SACV;QACD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IAEH,IAAI,uBAAuB;QACvB,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACzC,CAAC;IAED;;;OAGG;IAEH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,IAAW,KAAK,CAAC,KAAsB;QACnC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QAErC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC5C,OAAO;SACV;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QAClC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED;;;OAGG;IAEH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,MAAM,CAAC,KAAsB;QACpC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC7C,OAAO;SACV;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAChC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtF,CAAC;IAED,IAAW,cAAc,CAAC,KAAa;QACnC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,8BAA8B;IAC9B,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,8BAA8B;IAC9B,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAa;QAC9B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;YAC3B,OAAO;SACV;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,+BAA+B;IAC/B,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,UAAU,CAAC,KAAa;QAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IAEH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK,CAAC,KAAsB;QACnC,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;SACN;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB;IAChB,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,IAAW,gBAAgB;QACvB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAE3E,IAAI,aAAa,CAAC,OAAO,EAAE;YACvB,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7C;QAED,OAAO,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACzH,CAAC;IAED,IAAW,gBAAgB,CAAC,KAAa;QACrC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,6BAA6B;IAC7B,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,IAAW,QAAQ,CAAC,KAAsB;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC/C,OAAO;SACV;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;IACL,CAAC;IAED,oCAAoC;IAEpC,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK,CAAC,KAAa;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACvB,OAAO;SACV;QAED,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,wEAAwE;IAExE,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAA6B;QAC7C,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;YAC1B,OAAO;SACV;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,2EAA2E;IAE3E,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,MAAM,CAAC,KAAa;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACvB,OAAO;SACV;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACrC;IACL,CAAC;IAED,uEAAuE;IAEvE,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,aAAa,CAAC,KAAc;QACnC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE;YAC7B,OAAO;SACV;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,kEAAkE;IAElE,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;YAC3B,OAAO;SACV;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAExB,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,+EAA+E;IAC/E,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;OAGG;IAEH,IAAW,sBAAsB;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACxC,CAAC;IAED,IAAW,sBAAsB,CAAC,KAAc;QAC5C,IAAI,IAAI,CAAC,uBAAuB,KAAK,KAAK,EAAE;YACxC,OAAO;SACV;QAED,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;OAGG;IAEH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,IAAW,WAAW,CAAC,KAAsB;QACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1F,CAAC;IAED,IAAW,mBAAmB,CAAC,KAAa;QACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,gBAAgB;IAChB,IAAW,oBAAoB;QAC3B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,OAAO,CAAC,CAAC;SACZ;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED;;;OAGG;IAEH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAW,YAAY,CAAC,KAAsB;QAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,oBAAoB;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED,IAAW,oBAAoB,CAAC,KAAa;QACzC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,gBAAgB;IAChB,IAAW,qBAAqB;QAC5B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,OAAO,CAAC,CAAC;SACZ;QAED,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED;;;OAGG;IAEH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,IAAW,UAAU,CAAC,KAAsB;QACxC,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACpC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED,IAAW,kBAAkB,CAAC,KAAa;QACvC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,gBAAgB;IAChB,IAAW,mBAAmB;QAC1B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,OAAO,CAAC,CAAC;SACZ;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED;;;OAGG;IAEH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,IAAW,aAAa,CAAC,KAAsB;QAC3C,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACvC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7F,CAAC;IAED,IAAW,qBAAqB,CAAC,KAAa;QAC1C,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,gBAAgB;IAChB,IAAW,sBAAsB;QAC7B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,OAAO,CAAC,CAAC;SACZ;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IAED;;;OAGG;IAEH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,IAAW,IAAI,CAAC,KAAsB;QAClC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,IAAW,YAAY,CAAC,KAAa;QACjC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED;;;OAGG;IAEH,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,IAAW,GAAG,CAAC,KAAsB;QACjC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnF,CAAC;IAED,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;;OAGG;IAEH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,IAAW,WAAW,CAAC,KAAsB;QACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1F,CAAC;IAED,IAAW,mBAAmB,CAAC,KAAa;QACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IAEH,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,IAAW,WAAW,CAAC,KAAsB;QACzC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACrC,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IAED,IAAW,mBAAmB,CAAC,KAAa;QACxC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;YACd,OAAO;SACV;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,2CAA2C;IAC3C,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,2CAA2C;IAC3C,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,yCAAyC;IAEzC,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;YAC3B,OAAO;SACV;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,qGAAqG;QACrG,MAAM,yBAAyB,GAAG,CAAC,OAAgB,EAAE,EAAE;YACnD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACf,OAAO;aACV;YACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACjD,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;oBACjD,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;iBACjD;aACJ;YACD,IAAK,OAAqB,CAAC,QAAQ,KAAK,SAAS,EAAE;gBAC9C,OAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;aACtE;QACL,CAAC,CAAC;QACF,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,+BAA+B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,+FAA+F;IAE/F,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,KAAa;QAClC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IACD,4FAA4F;IAE5F,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAa;QACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;YACnC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAqBD,YAAY;IAEZ;;;OAGG;IACH;IACI,sCAAsC;IAC/B,IAAa;QAAb,SAAI,GAAJ,IAAI,CAAS;QAzvChB,WAAM,GAAG,CAAC,CAAC;QACX,cAAS,GAAG,KAAK,CAAC;QAClB,YAAO,GAAG,CAAC,CAAC;QAKpB,gBAAgB;QACT,oBAAe,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,gBAAgB;QACT,wBAAmB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,gBAAW,GAAG,EAAE,CAAC;QACjB,eAAU,GAAG,EAAE,CAAC;QAChB,gBAAW,GAAG,EAAE,CAAC;QACjB,cAAS,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAE7E,gBAAgB;QACT,WAAM,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC7E,gBAAgB;QACT,YAAO,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAGtE,WAAM,GAAG,EAAE,CAAC;QACZ,WAAM,GAAoB,IAAI,CAAC;QAEvC,gBAAgB;QACN,yBAAoB,GAAG,OAAO,CAAC,2BAA2B,CAAC;QACrE,gBAAgB;QACN,uBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QACjE,gBAAgB;QACN,aAAQ,GAAG,IAAI,CAAC;QAC1B,gBAAgB;QACN,cAAS,GAAG,KAAK,CAAC;QAC5B,gBAAgB;QACT,uBAAkB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5C,gBAAgB;QACT,kDAA6C,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACvE,gBAAgB;QACT,yBAAoB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,4BAAuB,GAAG,KAAK,CAAC;QAChC,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,kBAAa,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,gBAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,mBAAc,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,gBAAgB;QACT,UAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,gBAAgB;QACT,SAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC1B,YAAO,GAAG,GAAG,CAAC;QACd,YAAO,GAAG,GAAG,CAAC;QACd,cAAS,GAAG,CAAC,CAAC;QACd,sBAAiB,GAAG,GAAG,CAAC;QACxB,sBAAiB,GAAG,GAAG,CAAC;QAChC,gBAAgB;QACT,qBAAgB,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC9C,gBAAgB;QACN,2BAAsB,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvD,gBAAgB;QACN,yBAAoB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACxC,mBAAc,GAAG,IAAI,CAAC;QAGtB,eAAU,GAAG,IAAI,CAAC;QAClB,mBAAc,GAAG,KAAK,CAAC;QACvB,oBAAe,GAAG,SAAS,CAAC;QAC1B,wBAAmB,GAAG,CAAC,CAAC;QAG1B,aAAQ,GAAG,KAAK,CAAC;QACjB,kBAAa,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,eAAU,GAAG,CAAC,CAAC;QACf,gBAAW,GAAG,CAAC,CAAC,CAAC;QACjB,iBAAY,GAAG,KAAK,CAAC;QACrB,oBAAe,GAA8B,EAAE,CAAC;QAChD,sBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,4BAAuB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,eAAU,GAAG,IAAI,CAAC;QAClB,mBAAc,GAAG,SAAS,CAAC;QAC3B,uBAAkB,GAAG,SAAS,CAAC;QAC/B,gBAAW,GAAG,KAAK,CAAC;QACtB,cAAS,GAA2B,IAAI,CAAC;QACjD,gBAAgB;QACN,mBAAc,GAAG,KAAK,CAAC;QAKjC;;WAEG;QACI,oCAA+B,GAAG,IAAI,UAAU,EAAW,CAAC;QAEnE,gBAAgB;QACT,gBAAW,GAAQ,EAAE,CAAC;QAE7B,gBAAgB;QACT,eAAU,GAAG,KAAK,CAAC;QAE1B,gBAAgB;QACT,mBAAc,GAAG,KAAK,CAAC;QA6B9B;;WAEG;QAEI,aAAQ,GAAQ,IAAI,CAAC;QAE5B,sFAAsF;QAE/E,qBAAgB,GAAG,IAAI,CAAC;QAC/B;;;;;;WAMG;QAEI,qBAAgB,GAAG,KAAK,CAAC;QAChC,wEAAwE;QAEjE,qBAAgB,GAAG,KAAK,CAAC;QAEtB,kBAAa,GAAG,IAAI,CAAC;QAcrB,iBAAY,GAAG,IAAI,CAAC;QAc9B;;WAEG;QAEI,mBAAc,GAAG,KAAK,CAAC;QAItB,mBAAc,GAAG,CAAC,CAAC;QAgBnB,mBAAc,GAAG,CAAC,CAAC;QAgBnB,gBAAW,GAAG,CAAC,CAAC;QAChB,wBAAmB,GAAG,CAAC,CAAC;QAkBxB,iBAAY,GAAG,OAAO,CAAC;QAgB/B,iEAAiE;QAE1D,gBAAW,GAAG,EAAE,CAAC;QAExB,gBAAgB;QACN,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,gBAAgB;QACN,iBAAY,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QA8BnC,sBAAiB,GAAgC,IAAI,CAAC;QAEhE;;WAEG;QACI,wCAAmC,GAAG,IAAI,UAAU,EAA+B,CAAC;QAE3F;;WAEG;QACI,sBAAiB,GAAG,IAAI,UAAU,EAAW,CAAC;QACrD;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE3D;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE1D;;WAEG;QACI,4BAAuB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEnE;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEjE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAmB,CAAC;QAEpE;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE5D;;WAEG;QACI,sBAAiB,GAAG,IAAI,UAAU,EAAW,CAAC;QAErD;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAW,CAAC;QAE1D;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAW,CAAC;QAEzD;;WAEG;QACI,wBAAmB,GAAG,IAAI,UAAU,EAAW,CAAC;QAEvD;;WAEG;QACI,iCAA4B,GAAG,IAAI,UAAU,EAAW,CAAC;QAkEhE;;WAEG;QAEI,mBAAc,GAAY,IAAI,CAAC;QAgJ9B,gBAAW,GAAG,CAAC,CAAC;QAqBhB,6BAAwB,GAAG,IAAI,CAAC;QA+pBxC;;WAEG;QACH,eAAU,GAA0B,IAAI,CAAC;QAkvBjC,iBAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAvuB5C,CAAC;IAEJ,gBAAgB;IACN,YAAY;QAClB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAC,SAAiB;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,SAAS,EAAE;YAC1C,OAAO,IAAI,CAAC,MAAM,CAAC;SACtB;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,KAAK,GAAG,KAAK;QAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,cAAc;QACjB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB;IACT,eAAe;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,SAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACd,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE;YAC3B,OAAO,IAAI,CAAC;SACf;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAC,iBAA0B;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAEzD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,wBAAwB,CAAC,iBAA0B,EAAE,MAAe;QACvE,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3D,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,iBAA0B;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE9B,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAChE,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAE/D,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,aAAa,CAAC,QAAiB,EAAE,KAAY;QAChD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC1D,KAAK,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;YACtF,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAExD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACvD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,kBAAkB,EAAE,EAAE,cAAc,CAAC,CAAC;QAEzH,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QAEjD,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE;YACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO;SACV;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;;;;OAKG;IACI,mBAAmB,CAAC,OAAkB,EAAE,wBAAiC,KAAK,EAAE,SAAyC;QAC5H,wBAAwB;IAC5B,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,qBAA+B,EAAE,SAAyC;QAC5F,MAAM,OAAO,GAAc,EAAE,CAAC;QAE9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAEpE,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,IAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;YAC3E,IAAI,IAAI,EAAE;gBACN,KAAK,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;aACtF;YACD,OAAO;SACV;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE;gBACP,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aAC/C;YACD,OAAO;SACV;aAAM,IAAI,CAAC,IAAI,EAAE;YACd,OAAO;SACV;QAED,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC;QAC7D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACI,UAAU,CAAC,UAA2B,EAAE,YAA8B,EAAE,aAA+B,EAAE,WAA6B;QACzI,MAAM,GAAG,GAAG,UAAU,CAAC;QACvB,MAAM,KAAK,GAAG,YAAY,IAAI,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,IAAI,GAAG,CAAC;QACpC,MAAM,IAAI,GAAG,WAAW,IAAI,KAAK,CAAC;QAElC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;;;;;;OAOG;IACI,kBAAkB,CAAC,UAAkB,EAAE,YAAqB,EAAE,aAAsB,EAAE,WAAoB;QAC7G,MAAM,GAAG,GAAG,UAAU,CAAC;QACvB,MAAM,KAAK,GAAG,YAAY,IAAI,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,IAAI,GAAG,CAAC;QACpC,MAAM,IAAI,GAAG,WAAW,IAAI,KAAK,CAAC;QAElC,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;QACpC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACI,wBAAwB,CAAC,iBAA0B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;QACnD,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;SACjE;QAED,IAAI,OAAO,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5G,IAAI,MAAM,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAE5G,MAAM,+BAA+B,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAC5G,IAAI,+BAA+B,EAAE;YACjC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,EAAE;gBACnC,OAAO,GAAG,OAAO,CAAC;aACrB;YAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE;gBACjC,MAAM,GAAG,MAAM,CAAC;aACnB;SACJ;QAED,IAAI,CAAC,+BAA+B,IAAI,OAAO,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE;YAC9E,OAAO;SACV;QAED,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,MAAc;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,MAAc;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,MAAM,CAAC;IACvC,CAAC;IAED,gBAAgB;IACT,kBAAkB;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,gBAAgB;IACT,6BAA6B;QAChC,WAAW;IACf,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,IAAa,EAAE,OAAiC;QACnE,mGAAmG;QACnG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;YACvD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;YACtD,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YACzE,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YACxE,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACN,yBAAyB;QAC/B,OAAO,CAAC,CAAC;IACb,CAAC;IAED,gBAAgB;IACN,yBAAyB;QAC/B,OAAO,CAAC,CAAC;IACb,CAAC;IAED,gBAAgB;IAChB,gEAAgE;IACzD,cAAc;QACjB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACtD,qEAAqE;YACrE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9E,wGAAwG;YACxG,+EAA+E;YAC/E,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,6CAA6C,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAE/G,+BAA+B;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAEvE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAEpF,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;YAEjD,IAAI,CAAC,IAAI,CAAC,cAAc,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,gBAAgB,GAAG,OAAO,CAAC,EAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,eAAe,GAAG,OAAO,CAAC,EAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,iBAAiB,GAAG,OAAO,CAAC,EACzF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,GAAG,OAAO,CAAC,CAC7F,CAAC;SACL;IACL,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,KAAK,GAAG,KAAK;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE;YAC5B,OAAO;SACV;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,6BAA6B;QAC7B,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SAC5B;IACL,CAAC;IAED,gBAAgB;IACT,eAAe;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAA4B;QACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAG,CAAC,WAAW,EAAE,CAAC;SACxD;IACL,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,OAAiC;QAClD,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE;YAC1F,OAAO;SACV;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAChG,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAChG,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEpC,SAAS;YACT,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAE/B,QAAQ;YACR,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,eAAe;YACf,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;SACzC;QACD,2BAA2B;QAC3B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,EAAE;YAC3F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAErC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEhK,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC/D,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;SACtF;IACL,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,OAAgC;QACpD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACrB,OAAO;SACV;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC;QAC3C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAE7C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACI,wBAAwB,CAAC,OAAgC;QAC5D,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACrI,CAAC;IAES,SAAS,CAAC,OAAgC;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACjF,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,OAAgC;QACnD,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;SAC7B;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC9B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;SAC/C;QAED,IAAI,OAAO,CAAC,qBAAqB,EAAE;YAC/B,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;SACtC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE;YACvB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;SACjI;IACL,CAAC;IAED;;OAEG;IACI,OAAO,CAAC,aAAsB,EAAE,OAAgC;QACnE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE;YAC1D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YACvE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAE5B,IAAI,CAAC,eAAe,CAAC,oBAAoB,CACrC,IAAI,CAAC,gBAAgB,EACrB,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAC9B,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,EAC7B,IAAI,CAAC,qBAAqB,GAAG,CAAC,EAC9B,IAAI,CAAC,sBAAsB,GAAG,CAAC,EAC/B,IAAI,CAAC,6CAA6C,CACrD,CAAC;YAEF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAE3B,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,GAAG;gBACC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBAC9C,YAAY,EAAE,CAAC;aAClB,QAAQ,IAAI,CAAC,cAAc,IAAI,YAAY,GAAG,CAAC,EAAE;YAElD,IAAI,YAAY,IAAI,CAAC,EAAE;gBACnB,MAAM,CAAC,KAAK,CAAC,8CAA8C,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;aACvG;YAED,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;SAC9C;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,aAAsB,EAAE,OAAgC;QAC/E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAEjD,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YACnD,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACjE,IAAI,CAAC,mBAAmB,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC/D,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YACrG,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;SACzG;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAExD,iDAAiD;QACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,kDAAkD;QAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE1D,wBAAwB;QACxB,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAE9D,iCAAiC;QACjC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAE9D,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE;YACvC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAChD;IACL,CAAC;IAES,sBAAsB,CAAC,aAAsB;QACnD,0EAA0E;QAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACzC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACzF,aAAa;YACb,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE;gBACtG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;gBAChG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE;gBACrG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;YAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE;gBAC/F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;aACV;SACJ;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,gBAAgB;IACT,QAAQ;QACX,iBAAiB;QACjB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACjE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClE;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpE;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE;YACxB,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;aAC/E;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;aAC/E;SACJ;IACL,CAAC;IAED;;OAEG;IACO,iBAAiB,CAAC,aAAsB,EAAE,OAAgC;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAE3C,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC;QACxC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC;QAE1C,aAAa;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,QAAQ,IAAI,CAAC,mBAAmB,EAAE;YAC9B,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,CAAC,CAAC;gBACN,MAAM;YACV,KAAK,OAAO,CAAC,0BAA0B;gBACnC,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC;gBACxB,MAAM;YACV,KAAK,OAAO,CAAC,2BAA2B;gBACpC,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM;SACb;QAED,QAAQ,IAAI,CAAC,iBAAiB,EAAE;YAC5B,KAAK,OAAO,CAAC,sBAAsB;gBAC/B,CAAC,GAAG,CAAC,CAAC;gBACN,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,YAAY,GAAG,MAAM,CAAC;gBAC1B,MAAM;YACV,KAAK,OAAO,CAAC,yBAAyB;gBAClC,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM;SACb;QAED,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;gBAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClF,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtF;YAED,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACvF;YAED,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClE,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACxE;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjF,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACvF;YAED,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC3E;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1F;SACJ;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAChE;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9E;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9D;aAAM;YACH,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7E;QAED,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACO,WAAW,CAAC,aAAsB,EAAE,OAAgC;QAC1E,aAAa;IACjB,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,aAAsB,EAAE,OAAgC;QAC3E,aAAa;IACjB,CAAC;IAED;;OAEG;IACO,qBAAqB,CAAC,aAAsB,EAAE,OAAgC;QACpF,aAAa;IACjB,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,OAAgC;QACvD,aAAa;IACjB,CAAC;IAIO,KAAK,CAAC,OAAgC,EAAE,oBAAwC;QACpF,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,oBAAoB,EAAE;YACtB,uDAAuD;YACvD,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAEpF,4EAA4E;YAC5E,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAChF,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC7E,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;YAC5J,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;YAC5J,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;SAC/C;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;YAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAEpF,OAAO,CAAC,IAAI,CACR,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG,gBAAgB,EAC5C,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,eAAe,EAC1C,OAAO,CAAC,YAAY,CAAC,KAAK,GAAG,iBAAiB,GAAG,gBAAgB,EACjE,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,kBAAkB,GAAG,eAAe,CACrE,CAAC;SACL;aAAM;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;SAC9H;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,OAAO,CAAC,OAAgC,EAAE,oBAAwC;QACrF,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,EAAE;YAC1D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5B,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAE3B,YAAY;QACZ,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzB,OAAO;QACP,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;SAC7C;QAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,EAAE;YAC5C,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACrD;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YAC3D,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;SAC9F;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;SAC7C;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE;YACvC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACxJ;QAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,EAAE;YAC3C,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACpD;QAED,OAAO,CAAC,OAAO,EAAE,CAAC;QAElB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAgC,EAAE,oBAAwC;QACnF,aAAa;IACjB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,CAAS,EAAE,CAAS;QAChC,mBAAmB;QACnB,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAElF,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChC,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEhC,QAAQ;QACR,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;YAC/B,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;YAC5D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE;YAC9B,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAC5D,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACzC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,EAA6B,EAAE,IAAY,EAAE,SAAiB,EAAE,WAAmB,EAAE,MAAe,EAAE,MAAe;QAC9J,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE;YAChE,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAEjF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,EAA6B;QACzG,MAAM,SAAS,GAAY,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAE3G,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;SAClE;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,MAAe,EAAE,EAA6B;QACjE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACtB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE;YACzB,uEAAuE;YACvE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;SACxB;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,SAAS,GAAY,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAErG,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC3C;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,MAAe,EAAE,EAA6B,EAAE,KAAK,GAAG,KAAK;QAC9E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE;YACjD,OAAO;SACV;QACD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAErB,IAAI,SAAS,GAAY,IAAI,CAAC;QAE9B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YAC3B,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SACvF;QAED,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SAChD;IACL,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,WAAmB,EAAE,EAA6B;QAC9H,8CAA8C;QAC9C,mDAAmD;QACnD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YACvB,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAEvC,MAAM,SAAS,GAAY,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAE7I,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;SAC/E;QAED,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3D,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAE,EAAE,CAAC,KAAuB,CAAC,SAAS,CAAC,CAAC;SAC7E;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAe,EAAE,WAAoB,EAAE,SAAiB,EAAE,WAAmB,EAAE,WAAoB,EAAE,EAA8B;QACnJ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,cAAc,GAAY,WAAW,CAAC;QAC1C,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;YAClE,cAAc,GAAG,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SACvI;QACD,MAAM,SAAS,GAAY,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAE3I,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;SAC7F;QAED,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3D,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAE,EAAE,CAAC,KAAuB,CAAC,SAAS,CAAC,CAAC;SAChF;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,YAA8B,IAAI;QACrD,IAAI,SAAS,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SAC/D;aAAM;YACH,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE;gBACpC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAa,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;aACpE;SACJ;IACL,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,MAAe,EAAE,MAAe;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO;SACV;QACD,MAAM,SAAS,GAAY,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAE/F,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC9C;IACL,CAAC;IAED,gBAAgB;IACT,aAAa,KAAU,CAAC;IAE/B;;OAEG;IACI,mBAAmB,CACtB,IAAY,EACZ,CAAS,EACT,CAAS,EACT,EAA6B,EAC7B,SAAiB,EACjB,WAAmB,EACnB,MAAe,EACf,MAAe;QAEf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,KAAK,CAAC;SAChB;QACD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,iBAAiB,CAAC,WAAW,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAE7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,mBAAmB,IAAI,mBAAmB,KAAK,IAAI,EAAE;gBACrD,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aAC/C;YAED,IAAI,mBAAmB,KAAK,IAAI,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aAClC;YAED,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAC9C,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,WAAW,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACrC,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,SAAS,EAAE;YACtC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;gBACxC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;aACnH;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,YAAY,EAAE;YACzC,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;gBACxC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;aACf;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iBAAiB,CAAC,QAAmD,EAAE,YAAoB;QAC/F,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;SAChE;aAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACrB,OAAO,YAAY,CAAC;SACvB;aAAM;YACH,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/B,OAAO;SACV;QAED,IAAI,CAAC,KAAK;YACN,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvC,GAAG;gBACH,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,CAAC;gBACxC,GAAG;gBACH,IAAI,CAAC,gBAAgB;gBACrB,KAAK;gBACL,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1F,+BAA+B;QAC/B,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;;;OAKG;IACI,uBAAuB,CAAC,GAAuB;QAClD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,GAAuB;QACvC,IAAI,GAAG,KAAK,OAAO,EAAE;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC;SACtB;aAAM;YACH,OAAO,IAAI,CAAC,OAAO,CAAC;SACvB;IACL,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAA6B;QACtC,MAAM,aAAa,GAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,gBAAqB,EAAE,IAA6B,EAAE,WAAqC;QACpG,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,mBAAwB,EAAE,QAAiB,KAAK,EAAE,cAAuB,IAAI;QAC1F,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE;YAChC,OAAO;SACV;QACD,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACzD,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpD,4EAA4E;QAC5E,IAAI,WAAW,EAAE;YACb,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;SACrD;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChD;QACD,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;SACpD;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;SAClD;QAED,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,mBAAmB,CAAC,QAAQ,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;SAC1D;QAED,aAAa;QACb,mBAAmB,CAAC,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,gBAAqB,EAAE,IAA4B,EAAE,WAAqC;QAC/G,IAAI,gBAAgB,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;SACjD;QAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE;YAC3B,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;SAC7C;QAED,IAAI,gBAAgB,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;SACjD;QAED,IAAI,gBAAgB,CAAC,SAAS,EAAE;YAC5B,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;SAC/C;QAED,WAAW;QACX,IAAI,gBAAgB,CAAC,QAAQ,EAAE;YAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;SACpD;QAED,aAAa;QACb,IAAI,gBAAgB,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE;gBAChG,MAAM,eAAe,GAAG,gBAAgB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBACpE,MAAM,aAAa,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACpD,IAAI,aAAa,EAAE;oBACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;iBAC9D;aACJ;YAED,IAAI,gBAAgB,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;gBACrE,IAAI,CAAC,KAAK;qBACL,QAAQ,EAAG;qBACX,cAAc,CACX,IAAI,EACJ,gBAAgB,CAAC,eAAe,EAChC,gBAAgB,CAAC,aAAa,EAC9B,gBAAgB,CAAC,eAAe,EAChC,gBAAgB,CAAC,gBAAgB,IAAI,GAAG,CAC3C,CAAC;aACT;SACJ;QAED,IAAI,CAAC,uBAAuB,GAAG,gBAAgB,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,CAAC;IAC5G,CAAC;IAED,oCAAoC;IAC7B,OAAO;QACV,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACtB;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAC3B;SACJ;QAED,WAAW;QACX,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAWD,gCAAgC;IACzB,MAAM,KAAK,yBAAyB;QACvC,OAAO,OAAO,CAAC,0BAA0B,CAAC;IAC9C,CAAC;IAED,iCAAiC;IAC1B,MAAM,KAAK,0BAA0B;QACxC,OAAO,OAAO,CAAC,2BAA2B,CAAC;IAC/C,CAAC;IAED,kCAAkC;IAC3B,MAAM,KAAK,2BAA2B;QACzC,OAAO,OAAO,CAAC,4BAA4B,CAAC;IAChD,CAAC;IAED,6BAA6B;IACtB,MAAM,KAAK,sBAAsB;QACpC,OAAO,OAAO,CAAC,uBAAuB,CAAC;IAC3C,CAAC;IAED,gCAAgC;IACzB,MAAM,KAAK,yBAAyB;QACvC,OAAO,OAAO,CAAC,0BAA0B,CAAC;IAC9C,CAAC;IAED,gCAAgC;IACzB,MAAM,KAAK,yBAAyB;QACvC,OAAO,OAAO,CAAC,0BAA0B,CAAC;IAC9C,CAAC;IAID;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,IAAY,EAAE,WAA4B;QACnE,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;SACzC;QAED,MAAM,MAAM,GAAG,WAAW,IAAI,WAAW,CAAC,iBAAiB,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;SACjE;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAExC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,gBAAqB,EAAE,IAA4B,EAAE,WAAqC;QAC1G,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CACrC,GAAG,EAAE;YACD,MAAM,UAAU,GAAG,IAAI,WAAW,EAAa,CAAC;YAChD,UAAU,CAAC,YAAY,GAAG,WAAW,CAAC;YACtC,OAAO,UAAU,CAAC;QACtB,CAAC,EACD,gBAAgB,EAChB,IAAI,CACP,CAAC;QAEF,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAErC,OAAO,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAE/D,OAAO,OAAO,CAAC;IACnB,CAAC;IAID;;OAEG;IACO,MAAM,CAAC,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc,EAAE,OAAgC;QAC9G,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE7B,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,SAAS,EAAE,CAAC;QAEpB,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,sFAAsF;QACtF,OAAO,IAAI,CAAC;IAChB,CAAC;;AA5oFD;;GAEG;AACW,6BAAqB,GAAG,KAAK,AAAR,CAAS;AAk+D7B,oBAAY,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,AAA1B,CAA2B;AAyjBtD,UAAU;AACK,kCAA0B,GAAG,CAAC,AAAJ,CAAK;AAC/B,mCAA2B,GAAG,CAAC,AAAJ,CAAK;AAChC,oCAA4B,GAAG,CAAC,AAAJ,CAAK;AAEjC,+BAAuB,GAAG,CAAC,AAAJ,CAAK;AAC5B,kCAA0B,GAAG,CAAC,AAAJ,CAAK;AAC/B,kCAA0B,GAAG,CAAC,AAAJ,CAAK;AAgC/B,wBAAgB,GAA2E,EAAE,AAA7E,CAA8E;AA+C/F,iBAAS,GAA8H,GAAG,EAAE,GAAE,CAAC,AAAtI,CAAuI;AA3+EvJ;IADN,SAAS,EAAE;yCACgB;AAIrB;IADN,SAAS,EAAE;iDACmB;AASxB;IADN,SAAS,EAAE;iDACoB;AAGzB;IADN,SAAS,EAAE;iDACoB;AAYhC;IADC,SAAS,EAAE;2CAGX;AAYD;IADC,SAAS,EAAE;0CAGX;AAMM;IADN,SAAS,EAAE;+CACkB;AAO9B;IADC,SAAS,EAAE;4CAGX;AAcD;IADC,SAAS,EAAE;4CAGX;AAeD;IADC,SAAS,EAAE;yCAGX;AAgBD;IADC,SAAS,EAAE;0CAGX;AAaM;IADN,SAAS,EAAE;4CACY;AA8GxB;IADC,SAAS,EAAE;yCAGX;AAQD;IADC,SAAS,EAAE;oCAGX;AA+CM;IADN,SAAS,EAAE;+CAC0B;AAsBtC;IADC,SAAS,EAAE;qCAGX;AAgBD;IADC,SAAS,EAAE;qCAGX;AAgBD;IADC,SAAS,EAAE;uCAGX;AAgBD;IADC,SAAS,EAAE;+CAGX;AAgBD;IADC,SAAS,EAAE;+CAGX;AAiBD;IADC,SAAS,EAAE;kDAGX;AAgBD;IADC,SAAS,EAAE;gDAGX;AA4BD;IADC,SAAS,EAAE;yCAGX;AAgBD;IADC,SAAS,EAAE;sDAGX;AAOD;IADC,SAAS,EAAE;oCAGX;AAmCD;IADC,SAAS,EAAE;qCAGX;AA6ED;IADC,SAAS,EAAE;oCAGX;AA8DD;IADC,SAAS,EAAE;oCAGX;AAaD;IADC,SAAS,EAAE;uCAGX;AAaD;IADC,SAAS,EAAE;qCAGX;AAgBD;IADC,SAAS,EAAE;4CAGX;AAaD;IADC,SAAS,EAAE;wCAGX;AA8BD;IADC,SAAS,EAAE;qDAGX;AAgBD;IADC,SAAS,EAAE;0CAGX;AAqCD;IADC,SAAS,EAAE;2CAGX;AAqCD;IADC,SAAS,EAAE;yCAGX;AAqCD;IADC,SAAS,EAAE;4CAGX;AAqCD;IADC,SAAS,EAAE;mCAGX;AA4BD;IADC,SAAS,EAAE;kCAGX;AA4BD;IADC,SAAS,EAAE;0CAGX;AA4BD;IADC,SAAS,EAAE;0CAGX;AAmCD;IADC,SAAS,EAAE;wCAGX;AA6BD;IADC,SAAS,EAAE;4CAGX;AAYD;IADC,SAAS,EAAE;gDAGX;AAkBM;IADN,SAAS,EAAE;6CACiB;AAKtB;IADN,SAAS,EAAE;uDAC2B;AA+5C3C,aAAa,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport type { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport type { Container } from \"./container\";\r\nimport type { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport type { Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { GetClass, RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport type { ICanvasGradient, ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { IAccessibilityTag } from \"core/IAccessibilityTag\";\r\nimport type { IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport type { Animation } from \"core/Animations/animation\";\r\nimport type { BaseGradient } from \"./gradient/BaseGradient\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#controls\r\n */\r\nexport class Control implements IAnimatable {\r\n /**\r\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\r\n */\r\n public static AllowAlphaInheritance = false;\r\n\r\n private _alpha = 1;\r\n private _alphaSet = false;\r\n private _zIndex = 0;\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @internal */\r\n public _currentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _font: string;\r\n /** @internal */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n protected _fontOffset: { ascent: number; height: number; descent: number };\r\n private _color = \"\";\r\n private _style: Nullable<Style> = null;\r\n private _styleObserver: Nullable<Observer<Style>>;\r\n /** @internal */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _isDirty = true;\r\n /** @internal */\r\n protected _wasDirty = false;\r\n /** @internal */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @internal */\r\n public _cachedParentMeasure = Measure.Empty();\r\n private _descendantsOnlyPadding = false;\r\n private _paddingLeft = new ValueAndUnit(0);\r\n private _paddingRight = new ValueAndUnit(0);\r\n private _paddingTop = new ValueAndUnit(0);\r\n private _paddingBottom = new ValueAndUnit(0);\r\n /** @internal */\r\n public _left = new ValueAndUnit(0);\r\n /** @internal */\r\n public _top = new ValueAndUnit(0);\r\n private _scaleX = 1.0;\r\n private _scaleY = 1.0;\r\n private _rotation = 0;\r\n private _transformCenterX = 0.5;\r\n private _transformCenterY = 0.5;\r\n /** @internal */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _transformedPosition = Vector2.Zero();\r\n private _isMatrixDirty = true;\r\n private _cachedOffsetX: number;\r\n private _cachedOffsetY: number;\r\n private _isVisible = true;\r\n private _isHighlighted = false;\r\n private _highlightColor = \"#4affff\";\r\n protected _highlightLineWidth = 2;\r\n /** @internal */\r\n public _linkedMesh: Nullable<TransformNode>;\r\n private _fontSet = false;\r\n private _dummyVector2 = Vector2.Zero();\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _doNotRender = false;\r\n private _downPointerIds: { [id: number]: boolean } = {};\r\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\r\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\r\n protected _isEnabled = true;\r\n protected _disabledColor = \"#9a9a9a\";\r\n protected _disabledColorItem = \"#6a6a6a\";\r\n protected _isReadOnly = false;\r\n private _gradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _rebuildLayout = false;\r\n\r\n /** @internal */\r\n protected _urlRewriter?: (url: string) => string;\r\n\r\n /**\r\n * Observable that fires when the control's enabled state changes\r\n */\r\n public onEnabledStateChangedObservable = new Observable<boolean>();\r\n\r\n /** @internal */\r\n public _customData: any = {};\r\n\r\n /** @internal */\r\n public _isClipped = false;\r\n\r\n /** @internal */\r\n public _automaticSize = false;\r\n\r\n /** @internal */\r\n public _tag: any;\r\n\r\n /**\r\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the control is readonly (default: false).\r\n * A readonly control will still raise pointer events but will not react to them\r\n */\r\n public get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n }\r\n\r\n /**\r\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\r\n */\r\n public get transformedMeasure(): Measure {\r\n return this._evaluatedMeasure;\r\n }\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\r\n @serialize()\r\n public isHitTestVisible = true;\r\n /** Gets or sets a boolean indicating if the control can block pointer events. False by default except on the following controls:\r\n * * Button controls (Button, RadioButton, ToggleButton)\r\n * * Checkbox\r\n * * ColorPicker\r\n * * InputText\r\n * * Slider\r\n */\r\n @serialize()\r\n public isPointerBlocker = false;\r\n /** Gets or sets a boolean indicating if the control can be focusable */\r\n @serialize()\r\n public isFocusInvisible = false;\r\n\r\n protected _clipChildren = true;\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n }\r\n\r\n @serialize()\r\n public get clipChildren() {\r\n return this._clipChildren;\r\n }\r\n\r\n protected _clipContent = true;\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n }\r\n\r\n @serialize()\r\n public get clipContent() {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\r\n */\r\n @serialize()\r\n public useBitmapCache = false;\r\n\r\n private _cacheData: Nullable<ImageData>;\r\n\r\n private _shadowOffsetX = 0;\r\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetX() {\r\n return this._shadowOffsetX;\r\n }\r\n\r\n public set shadowOffsetX(value: number) {\r\n if (this._shadowOffsetX === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetX = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowOffsetY = 0;\r\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetY() {\r\n return this._shadowOffsetY;\r\n }\r\n\r\n public set shadowOffsetY(value: number) {\r\n if (this._shadowOffsetY === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetY = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowBlur = 0;\r\n private _previousShadowBlur = 0;\r\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\r\n @serialize()\r\n public get shadowBlur() {\r\n return this._shadowBlur;\r\n }\r\n\r\n public set shadowBlur(value: number) {\r\n if (this._shadowBlur === value) {\r\n return;\r\n }\r\n\r\n this._previousShadowBlur = this._shadowBlur;\r\n\r\n this._shadowBlur = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowColor = \"black\";\r\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\r\n @serialize()\r\n public get shadowColor() {\r\n return this._shadowColor;\r\n }\r\n\r\n public set shadowColor(value: string) {\r\n if (this._shadowColor === value) {\r\n return;\r\n }\r\n\r\n this._shadowColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the cursor to use when the control is hovered */\r\n @serialize()\r\n public hoverCursor = \"\";\r\n\r\n /** @internal */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @internal */\r\n protected _linkOffsetY = new ValueAndUnit(0);\r\n\r\n // Properties\r\n\r\n /** Gets the control type name */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the control for accessibility purpose.\r\n * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.\r\n */\r\n public set accessibilityTag(value: Nullable<IAccessibilityTag>) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable<IAccessibilityTag> = null;\r\n\r\n /**\r\n * Observable that fires whenever the accessibility event of the control has changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable<Nullable<IAccessibilityTag>>();\r\n\r\n /**\r\n * An event triggered when pointer wheel is scrolled\r\n */\r\n public onWheelObservable = new Observable<Vector2>();\r\n /**\r\n * An event triggered when the pointer moves over the control.\r\n */\r\n public onPointerMoveObservable = new Observable<Vector2>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control.\r\n */\r\n public onPointerOutObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer up\r\n */\r\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on\r\n */\r\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control is marked as dirty\r\n */\r\n public onDirtyObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered before drawing the control\r\n */\r\n public onBeforeDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered after the control was drawn\r\n */\r\n public onAfterDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control has been disposed\r\n */\r\n public onDisposeObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control isVisible is changed\r\n */\r\n public onIsVisibleChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Get the hosting AdvancedDynamicTexture\r\n */\r\n public get host(): AdvancedDynamicTexture {\r\n return this._host;\r\n }\r\n\r\n /** Gets or set information about font offsets (used to render and align text) */\r\n @serialize()\r\n public get fontOffset(): { ascent: number; height: number; descent: number } {\r\n return this._fontOffset;\r\n }\r\n\r\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\r\n this._fontOffset = offset;\r\n }\r\n\r\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\r\n @serialize()\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n this._alphaSet = true;\r\n this._alpha = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\r\n */\r\n public get highlightLineWidth(): number {\r\n return this._highlightLineWidth;\r\n }\r\n\r\n public set highlightLineWidth(value: number) {\r\n if (this._highlightLineWidth === value) {\r\n return;\r\n }\r\n\r\n this._highlightLineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\r\n */\r\n public get isHighlighted(): boolean {\r\n return this._isHighlighted;\r\n }\r\n\r\n public set isHighlighted(value: boolean) {\r\n if (this._isHighlighted === value) {\r\n return;\r\n }\r\n\r\n this._isHighlighted = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Indicates if the control should be serialized. Defaults to true.\r\n */\r\n @serialize()\r\n public isSerializable: boolean = true;\r\n\r\n /**\r\n * Gets or sets a string defining the color to use for highlighting this control\r\n */\r\n public get highlightColor(): string {\r\n return this._highlightColor;\r\n }\r\n\r\n public set highlightColor(value: string) {\r\n if (this._highlightColor === value) {\r\n return;\r\n }\r\n\r\n this._highlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleX(): number {\r\n return this._scaleX;\r\n }\r\n\r\n public set scaleX(value: number) {\r\n if (this._scaleX === value) {\r\n return;\r\n }\r\n\r\n this._scaleX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleY(): number {\r\n return this._scaleY;\r\n }\r\n\r\n public set scaleY(value: number) {\r\n if (this._scaleY === value) {\r\n return;\r\n }\r\n\r\n this._scaleY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the rotation angle (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get rotation(): number {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(value: number) {\r\n if (this._rotation === value) {\r\n return;\r\n }\r\n\r\n this._rotation = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on Y axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterY(): number {\r\n return this._transformCenterY;\r\n }\r\n\r\n public set transformCenterY(value: number) {\r\n if (this._transformCenterY === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on X axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterX(): number {\r\n return this._transformCenterX;\r\n }\r\n\r\n public set transformCenterX(value: number) {\r\n if (this._transformCenterX === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get horizontalAlignment(): number {\r\n return this._horizontalAlignment;\r\n }\r\n\r\n public set horizontalAlignment(value: number) {\r\n if (this._horizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._horizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the vertical alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get verticalAlignment(): number {\r\n return this._verticalAlignment;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n if (this._verticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._verticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _fixedRatio = 0;\r\n public set fixedRatio(value: number) {\r\n if (this._fixedRatio === value) {\r\n return;\r\n }\r\n\r\n this._fixedRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a fixed ratio for this control.\r\n * When different from 0, the ratio is used to compute the \"second\" dimension.\r\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\r\n * second dimension is computed as first dimension * fixedRatio\r\n */\r\n @serialize()\r\n public get fixedRatio(): number {\r\n return this._fixedRatio;\r\n }\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n set fixedRatioMasterIsWidth(value: boolean) {\r\n if (this._fixedRatioMasterIsWidth === value) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.\r\n * When the height of a control is set, this property is changed to false.\r\n */\r\n @serialize()\r\n get fixedRatioMasterIsWidth(): boolean {\r\n return this._fixedRatioMasterIsWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public set width(value: string | number) {\r\n this._fixedRatioMasterIsWidth = true;\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the control width in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get widthInPixels(): number {\r\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set widthInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = true;\r\n this.width = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n public set height(value: string | number) {\r\n this._fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get heightInPixels(): number {\r\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set heightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = false;\r\n this.height = value + \"px\";\r\n }\r\n\r\n /** Gets or set font family */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font style */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /**\r\n * Gets or sets style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n @serialize()\r\n public get style(): Nullable<Style> {\r\n return this._style;\r\n }\r\n\r\n public set style(value: Nullable<Style>) {\r\n if (this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n this._style = value;\r\n\r\n if (this._style) {\r\n this._styleObserver = this._style.onChangedObservable.add(() => {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n\r\n /** @internal */\r\n public get _isFontSizeInPercentage(): boolean {\r\n return this._fontSize.isPercentage;\r\n }\r\n\r\n /** Gets or sets font size in pixels */\r\n public get fontSizeInPixels(): number {\r\n const fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\r\n\r\n if (fontSizeToUse.isPixel) {\r\n return fontSizeToUse.getValue(this._host);\r\n }\r\n\r\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\r\n }\r\n\r\n public set fontSizeInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.fontSize = value + \"px\";\r\n }\r\n\r\n /** Gets or sets font size */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n }\r\n\r\n /** Gets or sets foreground color */\r\n @serialize()\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n public set color(value: string) {\r\n if (this._color === value) {\r\n return;\r\n }\r\n\r\n this._color = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets gradient. Setting a gradient will override the color */\r\n @serialize()\r\n public get gradient(): Nullable<BaseGradient> {\r\n return this._gradient;\r\n }\r\n\r\n public set gradient(value: Nullable<BaseGradient>) {\r\n if (this._gradient === value) {\r\n return;\r\n }\r\n\r\n this._gradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets z index which is used to reorder controls on the z axis */\r\n @serialize()\r\n public get zIndex(): number {\r\n return this._zIndex;\r\n }\r\n\r\n public set zIndex(value: number) {\r\n if (this.zIndex === value) {\r\n return;\r\n }\r\n\r\n this._zIndex = value;\r\n\r\n if (this.parent) {\r\n this.parent._reOrderControl(this);\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can be rendered */\r\n @serialize()\r\n public get notRenderable(): boolean {\r\n return this._doNotRender;\r\n }\r\n\r\n public set notRenderable(value: boolean) {\r\n if (this._doNotRender === value) {\r\n return;\r\n }\r\n\r\n this._doNotRender = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n @serialize()\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n this._markAsDirty(true);\r\n\r\n this.onIsVisibleChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /** Gets a boolean indicating that the control needs to update its rendering */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Gets the current linked mesh (or null if none)\r\n */\r\n public get linkedMesh(): Nullable<TransformNode> {\r\n return this._linkedMesh;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding should work like in CSS.\r\n * Basically, it will add the padding amount on each side of the parent control for its children.\r\n */\r\n @serialize()\r\n public get descendantsOnlyPadding(): boolean {\r\n return this._descendantsOnlyPadding;\r\n }\r\n\r\n public set descendantsOnlyPadding(value: boolean) {\r\n if (this._descendantsOnlyPadding === value) {\r\n return;\r\n }\r\n\r\n this._descendantsOnlyPadding = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingLeft(): string | number {\r\n return this._paddingLeft.toString(this._host);\r\n }\r\n\r\n public set paddingLeft(value: string | number) {\r\n if (this._paddingLeft.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingLeftInPixels(): number {\r\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingLeftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingLeft = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingLeftInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingLeftInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingRight(): string | number {\r\n return this._paddingRight.toString(this._host);\r\n }\r\n\r\n public set paddingRight(value: string | number) {\r\n if (this._paddingRight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingRightInPixels(): number {\r\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingRightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingRight = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingRightInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingRightInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingTop(): string | number {\r\n return this._paddingTop.toString(this._host);\r\n }\r\n\r\n public set paddingTop(value: string | number) {\r\n if (this._paddingTop.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingTopInPixels(): number {\r\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingTopInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingTop = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingTopInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingTopInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingBottom(): string | number {\r\n return this._paddingBottom.toString(this._host);\r\n }\r\n\r\n public set paddingBottom(value: string | number) {\r\n if (this._paddingBottom.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingBottomInPixels(): number {\r\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingBottomInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingBottom = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingBottomInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingBottomInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get left(): string | number {\r\n return this._left.toString(this._host);\r\n }\r\n\r\n public set left(value: string | number) {\r\n if (this._left.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get leftInPixels(): number {\r\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set leftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.left = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get top(): string | number {\r\n return this._top.toString(this._host);\r\n }\r\n\r\n public set top(value: string | number) {\r\n if (this._top.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get topInPixels(): number {\r\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set topInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.top = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetX(): string | number {\r\n return this._linkOffsetX.toString(this._host);\r\n }\r\n\r\n public set linkOffsetX(value: string | number) {\r\n if (this._linkOffsetX.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetXInPixels(): number {\r\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set linkOffsetXInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetX = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetY(): string | number {\r\n return this._linkOffsetY.toString(this._host);\r\n }\r\n\r\n public set linkOffsetY(value: string | number) {\r\n if (this._linkOffsetY.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetYInPixels(): number {\r\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set linkOffsetYInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetY = value + \"px\";\r\n }\r\n\r\n /** Gets the center coordinate on X axis */\r\n public get centerX(): number {\r\n return this._currentMeasure.left + this._currentMeasure.width / 2;\r\n }\r\n\r\n /** Gets the center coordinate on Y axis */\r\n public get centerY(): number {\r\n return this._currentMeasure.top + this._currentMeasure.height / 2;\r\n }\r\n\r\n /** Gets or sets if control is Enabled */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._markAsDirty();\r\n // if this control or any of it's descendants are under a pointer, we need to fire a pointerOut event\r\n const recursivelyFirePointerOut = (control: Control) => {\r\n if (!control.host) {\r\n return;\r\n }\r\n for (const pointer in control.host._lastControlOver) {\r\n if (control === this.host._lastControlOver[pointer]) {\r\n control._onPointerOut(control, null, true);\r\n delete control.host._lastControlOver[pointer];\r\n }\r\n }\r\n if ((control as Container).children !== undefined) {\r\n (control as Container).children.forEach(recursivelyFirePointerOut);\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\r\n this.onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n /** Gets or sets background color of control if it's disabled. Only applies to Button class. */\r\n @serialize()\r\n public get disabledColor(): string {\r\n return this._disabledColor;\r\n }\r\n\r\n public set disabledColor(value: string) {\r\n if (this._disabledColor === value) {\r\n return;\r\n }\r\n\r\n this._disabledColor = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */\r\n @serialize()\r\n public get disabledColorItem(): string {\r\n return this._disabledColorItem;\r\n }\r\n\r\n public set disabledColorItem(value: string) {\r\n if (this._disabledColorItem === value) {\r\n return;\r\n }\r\n\r\n this._disabledColorItem = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets/sets the overlap group of the control.\r\n * Controls with overlapGroup set to a number can be deoverlapped.\r\n * Controls with overlapGroup set to undefined are not deoverlapped.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#deoverlapping\r\n */\r\n @serialize()\r\n public overlapGroup?: number;\r\n /**\r\n * Gets/sets the deoverlap movement multiplier\r\n */\r\n @serialize()\r\n public overlapDeltaMultiplier?: number;\r\n\r\n /**\r\n * Array of animations\r\n */\r\n animations: Nullable<Animation[]> = null;\r\n\r\n // Functions\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the name of the control\r\n */\r\n constructor(\r\n /** defines the name of the control */\r\n public name?: string\r\n ) {}\r\n\r\n /** @internal */\r\n protected _getTypeName(): string {\r\n return \"Control\";\r\n }\r\n\r\n /**\r\n * Gets the first ascendant in the hierarchy of the given type\r\n * @param className defines the required type\r\n * @returns the ascendant or null if not found\r\n */\r\n public getAscendantOfClass(className: string): Nullable<Control> {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n if (this.parent.getClassName() === className) {\r\n return this.parent;\r\n }\r\n\r\n return this.parent.getAscendantOfClass(className);\r\n }\r\n\r\n /**\r\n * Mark control element as dirty\r\n * @param force force non visible elements to be marked too\r\n */\r\n public markAsDirty(force = false): void {\r\n this._markAsDirty(force);\r\n }\r\n\r\n /**\r\n * Mark the element and its children as dirty\r\n */\r\n public markAllAsDirty(): void {\r\n this._markAllAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public _resetFontCache(): void {\r\n this._fontSet = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Determines if a container is an ascendant of the current control\r\n * @param container defines the container to look for\r\n * @returns true if the container is one of the ascendant of the control\r\n */\r\n public isAscendant(container: Control): boolean {\r\n if (!this.parent) {\r\n return false;\r\n }\r\n\r\n if (this.parent === container) {\r\n return true;\r\n }\r\n\r\n return this.parent.isAscendant(container);\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in local space\r\n */\r\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n this.getLocalCoordinatesToRef(globalCoordinates, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @param result defines the target vector2 where to store the result\r\n * @returns the current control\r\n */\r\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\r\n result.x = globalCoordinates.x - this._currentMeasure.left;\r\n result.y = globalCoordinates.y - this._currentMeasure.top;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets coordinates in parent local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in parent local space\r\n */\r\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\r\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Move the current control to a vector3 position projected onto the screen.\r\n * @param position defines the target position\r\n * @param scene defines the hosting scene\r\n */\r\n public moveToVector3(position: Vector3, scene: Scene): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Will store all controls that have this control as ascendant in a given array\r\n * @param results defines the array where to store the descendants\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n */\r\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * Will return all controls that have this control as ascendant\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results: Control[] = [];\r\n\r\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Link current control with a target mesh\r\n * @param mesh defines the mesh to link with\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\r\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\r\n if (mesh) {\r\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\r\n }\r\n return;\r\n }\r\n\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index !== -1) {\r\n this._linkedMesh = mesh;\r\n if (!mesh) {\r\n this._host._linkedControls.splice(index, 1);\r\n }\r\n return;\r\n } else if (!mesh) {\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._linkedMesh = mesh;\r\n this._host._linkedControls.push(this);\r\n }\r\n\r\n /**\r\n * Shorthand function to set the top, right, bottom, and left padding values on the control.\r\n * @param { string | number} paddingTop - The value of the top padding.\r\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\r\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\r\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTop = top;\r\n this.paddingRight = right;\r\n this.paddingBottom = bottom;\r\n this.paddingLeft = left;\r\n }\r\n\r\n /**\r\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\r\n * @param { number} paddingTop - The value in pixels of the top padding.\r\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\r\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\r\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTopInPixels = top;\r\n this.paddingRightInPixels = right;\r\n this.paddingBottomInPixels = bottom;\r\n this.paddingLeftInPixels = left;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\r\n const oldLeft = this._left.getValue(this._host);\r\n const oldTop = this._top.getValue(this._host);\r\n\r\n const parentMeasure = this.parent?._currentMeasure;\r\n if (parentMeasure) {\r\n this._processMeasures(parentMeasure, this._host.getContext());\r\n }\r\n\r\n let newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\r\n let newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\r\n\r\n const leftAndTopIgnoreAdaptiveScaling = this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling;\r\n if (leftAndTopIgnoreAdaptiveScaling) {\r\n if (Math.abs(newLeft - oldLeft) < 0.5) {\r\n newLeft = oldLeft;\r\n }\r\n\r\n if (Math.abs(newTop - oldTop) < 0.5) {\r\n newTop = oldTop;\r\n }\r\n }\r\n\r\n if (!leftAndTopIgnoreAdaptiveScaling && oldLeft === newLeft && oldTop === newTop) {\r\n return;\r\n }\r\n\r\n this.left = newLeft + \"px\";\r\n this.top = newTop + \"px\";\r\n\r\n this._left.ignoreAdaptiveScaling = true;\r\n this._top.ignoreAdaptiveScaling = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetLeft(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.left += offset;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetTop(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.top += offset;\r\n }\r\n\r\n /** @internal */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @internal */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _intersectsRect(rect: Measure, context?: ICanvasRenderingContext) {\r\n // make sure we are transformed correctly before checking intersections. no-op if nothing is dirty.\r\n this._transform(context);\r\n if (this._evaluatedMeasure.left >= rect.left + rect.width) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top >= rect.top + rect.height) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width <= rect.left) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height <= rect.top) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public invalidateRect() {\r\n this._transform();\r\n if (this.host && this.host.useInvalidateRectOptimization) {\r\n // Rotate by transform to get the measure transformed to global space\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\r\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\r\n // the previous measure is used to properly clear a control that is scaled down\r\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\r\n\r\n // Expand rect based on shadows\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n const offsetX = this._computeAdditionalOffsetX();\r\n const offsetY = this._computeAdditionalOffsetY();\r\n\r\n this.host.invalidateRect(\r\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\r\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\r\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\r\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markAsDirty(force = false): void {\r\n if (!this._isVisible && !force) {\r\n return;\r\n }\r\n\r\n this._isDirty = true;\r\n this._markMatrixAsDirty();\r\n\r\n // Redraw only this rectangle\r\n if (this._host) {\r\n this._host.markAsDirty();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _markAllAsDirty(): void {\r\n this._markAsDirty();\r\n\r\n if (this._font) {\r\n this._prepareFont();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _link(host: AdvancedDynamicTexture): void {\r\n this._host = host;\r\n if (this._host) {\r\n this.uniqueId = this._host.getScene()!.getUniqueId();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _transform(context?: ICanvasRenderingContext): void {\r\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\r\n return;\r\n }\r\n\r\n // postTranslate\r\n const offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\r\n const offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\r\n if (context) {\r\n context.translate(offsetX, offsetY);\r\n\r\n // rotate\r\n context.rotate(this._rotation);\r\n\r\n // scale\r\n context.scale(this._scaleX, this._scaleY);\r\n\r\n // preTranslate\r\n context.translate(-offsetX, -offsetY);\r\n }\r\n // Need to update matrices?\r\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\r\n this._cachedOffsetX = offsetX;\r\n this._cachedOffsetY = offsetY;\r\n this._isMatrixDirty = false;\r\n this._flagDescendantsAsMatrixDirty();\r\n\r\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\r\n\r\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlight(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n context.save();\r\n context.strokeStyle = this._highlightColor;\r\n context.lineWidth = this._highlightLineWidth;\r\n\r\n this._renderHighlightSpecific(context);\r\n context.restore();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n protected _getColor(context: ICanvasRenderingContext): string | ICanvasGradient {\r\n return this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n if (this._isFontSizeInPercentage) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._host && this._host.useSmallestIdeal && !this._font) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._fontSet) {\r\n this._prepareFont();\r\n this._fontSet = false;\r\n }\r\n\r\n if (this._font) {\r\n context.font = this._font;\r\n }\r\n\r\n if (this._color || this.gradient) {\r\n context.fillStyle = this._getColor(context);\r\n }\r\n\r\n if (Control.AllowAlphaInheritance) {\r\n context.globalAlpha *= this._alpha;\r\n } else if (this._alphaSet) {\r\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n this.host._numLayoutCalls++;\r\n\r\n this._currentMeasure.addAndTransformToRef(\r\n this._transformMatrix,\r\n -this._paddingLeftInPixels | 0,\r\n -this._paddingTopInPixels | 0,\r\n this._paddingRightInPixels | 0,\r\n this._paddingBottomInPixels | 0,\r\n this._prevCurrentMeasureTransformedIntoGlobalSpace\r\n );\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n let rebuildCount = 0;\r\n do {\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < 3);\r\n\r\n if (rebuildCount >= 3) {\r\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n this.invalidateRect();\r\n this._evaluateClippingState(parentMeasure);\r\n }\r\n\r\n this._wasDirty = this._isDirty;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n this._tempPaddingMeasure.copyFrom(parentMeasure);\r\n\r\n // Apply padding if in correct mode\r\n if (this.parent && this.parent.descendantsOnlyPadding) {\r\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\r\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\r\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\r\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\r\n }\r\n\r\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n // Let children take some pre-measurement actions\r\n this._preMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._measure();\r\n\r\n // Let children take some post-measurement actions\r\n this._postMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Convert to int values\r\n this._currentMeasure.left = this._currentMeasure.left | 0;\r\n this._currentMeasure.top = this._currentMeasure.top | 0;\r\n this._currentMeasure.width = this._currentMeasure.width | 0;\r\n this._currentMeasure.height = this._currentMeasure.height | 0;\r\n\r\n // Let children add more features\r\n this._additionalProcessing(this._tempPaddingMeasure, context);\r\n\r\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.onDirtyObservable.hasObservers()) {\r\n this.onDirtyObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _evaluateClippingState(parentMeasure: Measure) {\r\n // Since transformMatrix is used here, we need to have it freshly computed\r\n this._transform();\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.parent && this.parent.clipChildren) {\r\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\r\n // Early clip\r\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n }\r\n\r\n this._isClipped = false;\r\n }\r\n\r\n /** @internal */\r\n public _measure(): void {\r\n // Width / Height\r\n if (this._width.isPixel) {\r\n this._currentMeasure.width = this._width.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width *= this._width.getValue(this._host);\r\n }\r\n\r\n if (this._height.isPixel) {\r\n this._currentMeasure.height = this._height.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height *= this._height.getValue(this._host);\r\n }\r\n\r\n if (this._fixedRatio !== 0) {\r\n if (this._fixedRatioMasterIsWidth) {\r\n this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio;\r\n } else {\r\n this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n const parentWidth = parentMeasure.width;\r\n const parentHeight = parentMeasure.height;\r\n\r\n // Left / top\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (this.horizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = parentWidth - width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (parentWidth - width) / 2;\r\n break;\r\n }\r\n\r\n switch (this.verticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n y = 0;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n y = parentHeight - height;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n y = (parentHeight - height) / 2;\r\n break;\r\n }\r\n\r\n if (!this.descendantsOnlyPadding) {\r\n if (this._paddingLeft.isPixel) {\r\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\r\n }\r\n\r\n if (this._paddingRight.isPixel) {\r\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\r\n }\r\n\r\n if (this._paddingTop.isPixel) {\r\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\r\n }\r\n\r\n if (this._paddingBottom.isPixel) {\r\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\r\n }\r\n }\r\n\r\n if (this._left.isPixel) {\r\n this._currentMeasure.left += this._left.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\r\n }\r\n\r\n if (this._top.isPixel) {\r\n this._currentMeasure.top += this._top.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\r\n }\r\n\r\n this._currentMeasure.left += x;\r\n this._currentMeasure.top += y;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _postMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _clipForChildren(context: ICanvasRenderingContext): void {\r\n // DO nothing\r\n }\r\n\r\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\r\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\r\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\r\n context.beginPath();\r\n Control._ClipMeasure.copyFrom(this._currentMeasure);\r\n if (invalidatedRectangle) {\r\n // Rotate the invalidated rect into the control's space\r\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\r\n\r\n // Get the intersection of the rect in context space and the current context\r\n const intersection = new Measure(0, 0, 0, 0);\r\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\r\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\r\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\r\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\r\n Control._ClipMeasure.copyFrom(intersection);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = this.shadowBlur;\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n context.rect(\r\n Control._ClipMeasure.left + leftShadowOffset,\r\n Control._ClipMeasure.top + topShadowOffset,\r\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\r\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\r\n );\r\n } else {\r\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\r\n }\r\n\r\n context.clip();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\r\n if (!this.isVisible || this.notRenderable || this._isClipped) {\r\n this._isDirty = false;\r\n return false;\r\n }\r\n\r\n this.host._numRenderCalls++;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Transform\r\n this._transform(context);\r\n\r\n // Clip\r\n if (this.clipContent) {\r\n this._clip(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.onBeforeDrawObservable.hasObservers()) {\r\n this.onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\r\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\r\n } else {\r\n this._draw(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.useBitmapCache && this._wasDirty) {\r\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n this._renderHighlight(context);\r\n\r\n if (this.onAfterDrawObservable.hasObservers()) {\r\n this.onAfterDrawObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public contains(x: number, y: number): boolean {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n // Check\r\n if (x < this._currentMeasure.left) {\r\n return false;\r\n }\r\n\r\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\r\n return false;\r\n }\r\n\r\n if (y < this._currentMeasure.top) {\r\n return false;\r\n }\r\n\r\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\r\n return false;\r\n }\r\n\r\n if (this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\r\n return false;\r\n }\r\n\r\n if (!this.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: Nullable<PointerInfoBase>): void {\r\n const canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (this._enterCount > 0) {\r\n return false;\r\n }\r\n\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n this._enterCount++;\r\n\r\n const canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && (!this._isEnabled || target === this)) {\r\n return;\r\n }\r\n this._enterCount = 0;\r\n\r\n let canNotify: boolean = true;\r\n\r\n if (!target.isAscendant(this)) {\r\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\r\n }\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: Nullable<PointerInfoBase>): boolean {\r\n // Prevent pointerout to lose control context.\r\n // Event redundancy is checked inside the function.\r\n this._onPointerEnter(this, pi);\r\n\r\n if (this._downCount !== 0) {\r\n return false;\r\n }\r\n\r\n this._downCount++;\r\n\r\n this._downPointerIds[pointerId] = true;\r\n\r\n const canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.add((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: Nullable<PointerInfoBase>): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._downCount = 0;\r\n\r\n delete this._downPointerIds[pointerId];\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.delete((pi.event as IPointerEvent).pointerId);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n const canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\r\n\r\n if (canNotify && this.parent != null) {\r\n this.parent._onWheelScroll(deltaX, deltaY);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(\r\n type: number,\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._dummyVector2.copyFromFloats(x, y);\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this, pi);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this, pi);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\r\n this._host._registerLastControlDown(this, pointerId);\r\n this._host._lastPickedControl = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERUP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERWHEEL) {\r\n if (this._host._lastControlOver[pointerId]) {\r\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getStyleProperty(propName: \"fontStyle\" | \"fontWeight\" | \"fontFamily\", defaultValue: string): string {\r\n const prop = (this._style && this._style[propName]) ?? this[propName];\r\n if (!prop && this.parent) {\r\n return this.parent._getStyleProperty(propName, defaultValue);\r\n } else if (!this.parent) {\r\n return defaultValue;\r\n } else {\r\n return prop;\r\n }\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n this._font =\r\n this._getStyleProperty(\"fontStyle\", \"\") +\r\n \" \" +\r\n this._getStyleProperty(\"fontWeight\", \"\") +\r\n \" \" +\r\n this.fontSizeInPixels +\r\n \"px \" +\r\n this._getStyleProperty(\"fontFamily\", \"Arial\");\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font, this._host.getScene()?.getEngine());\r\n\r\n //children need to be refreshed\r\n this.getDescendants().forEach((child) => child._markAllAsDirty());\r\n }\r\n\r\n /**\r\n * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.\r\n * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.\r\n * @param dim the dimension to check (width or height)\r\n * @returns if the dimension is fully defined\r\n */\r\n public isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n return this.getDimension(dim).isPixel;\r\n }\r\n\r\n /**\r\n * Gets the dimension of the control along a specified axis\r\n * @param dim the dimension to retrieve (width or height)\r\n * @returns the dimension value along the specified axis\r\n */\r\n public getDimension(dim: \"width\" | \"height\"): ValueAndUnit {\r\n if (dim === \"width\") {\r\n return this._width;\r\n } else {\r\n return this._height;\r\n }\r\n }\r\n\r\n /**\r\n * Clones a control and its descendants\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @returns the cloned control\r\n */\r\n public clone(host?: AdvancedDynamicTexture): Control {\r\n const serialization: any = {};\r\n this.serialize(serialization, true);\r\n\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serialization.className);\r\n const cloned = new controlType();\r\n cloned.parse(serialization, host);\r\n\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Parses a serialized object into this control\r\n * @param serializedObject the object with the serialized properties\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns this control\r\n */\r\n public parse(serializedObject: any, host?: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n this._urlRewriter = urlRewriter;\r\n SerializationHelper.Parse(() => this, serializedObject, null);\r\n\r\n this.name = serializedObject.name;\r\n\r\n this._parseFromContent(serializedObject, host ?? this._host);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n // Call prepareFont to guarantee the font is properly set before serializing\r\n if (allowCanvas) {\r\n this._prepareFont();\r\n }\r\n if (this._fontFamily) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n }\r\n if (this.fontSize) {\r\n serializationObject.fontSize = this.fontSize;\r\n }\r\n if (this.fontWeight) {\r\n serializationObject.fontWeight = this.fontWeight;\r\n }\r\n if (this.fontStyle) {\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n\r\n if (this._gradient) {\r\n serializationObject.gradient = {};\r\n this._gradient.serialize(serializationObject.gradient);\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n if (serializedObject.fontFamily) {\r\n this.fontFamily = serializedObject.fontFamily;\r\n }\r\n\r\n if (serializedObject.fontSize) {\r\n this.fontSize = serializedObject.fontSize;\r\n }\r\n\r\n if (serializedObject.fontWeight) {\r\n this.fontWeight = serializedObject.fontWeight;\r\n }\r\n\r\n if (serializedObject.fontStyle) {\r\n this.fontStyle = serializedObject.fontStyle;\r\n }\r\n\r\n // Gradient\r\n if (serializedObject.gradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.gradient.className);\r\n this._gradient = new className();\r\n this._gradient?.parse(serializedObject.gradient);\r\n }\r\n\r\n // Animations\r\n if (serializedObject.animations) {\r\n this.animations = [];\r\n for (let animationIndex = 0; animationIndex < serializedObject.animations.length; animationIndex++) {\r\n const parsedAnimation = serializedObject.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n this.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n\r\n if (serializedObject.autoAnimate && this._host && this._host.getScene()) {\r\n this._host\r\n .getScene()!\r\n .beginAnimation(\r\n this,\r\n serializedObject.autoAnimateFrom,\r\n serializedObject.autoAnimateTo,\r\n serializedObject.autoAnimateLoop,\r\n serializedObject.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n\r\n this.fixedRatioMasterIsWidth = serializedObject.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;\r\n }\r\n\r\n /** Releases associated resources */\r\n public dispose() {\r\n this.onDirtyObservable.clear();\r\n this.onBeforeDrawObservable.clear();\r\n this.onAfterDrawObservable.clear();\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n this.onWheelObservable.clear();\r\n\r\n if (this._styleObserver && this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n if (this.parent) {\r\n this.parent.removeControl(this);\r\n this.parent = null;\r\n }\r\n\r\n if (this._host) {\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index > -1) {\r\n this.linkWithMesh(null);\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n // Statics\r\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\r\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\r\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\r\n\r\n private static _VERTICAL_ALIGNMENT_TOP = 0;\r\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\r\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\r\n\r\n /** HORIZONTAL_ALIGNMENT_LEFT */\r\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_RIGHT */\r\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_CENTER */\r\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_TOP */\r\n public static get VERTICAL_ALIGNMENT_TOP(): number {\r\n return Control._VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_BOTTOM */\r\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\r\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_CENTER */\r\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\r\n return Control._VERTICAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetFontOffset(font: string, engineToUse?: AbstractEngine): { ascent: number; height: number; descent: number } {\r\n if (Control._FontHeightSizes[font]) {\r\n return Control._FontHeightSizes[font];\r\n }\r\n\r\n const engine = engineToUse || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n\r\n const result = engine.getFontOffset(font);\r\n Control._FontHeightSizes[font] = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a Control from parsed data\r\n * @param serializedObject defines parsed data\r\n * @param host defines the hosting AdvancedDynamicTexture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(\r\n () => {\r\n const newControl = new controlType() as Control;\r\n newControl._urlRewriter = urlRewriter;\r\n return newControl;\r\n },\r\n serializedObject,\r\n null\r\n );\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host, urlRewriter);\r\n\r\n return control;\r\n }\r\n\r\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => {};\r\n\r\n /**\r\n * @internal\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: number, context: ICanvasRenderingContext): void {\r\n context.translate(x, y);\r\n context.scale(width, height);\r\n\r\n context.beginPath();\r\n context.arc(0, 0, 1, 0, 2 * Math.PI);\r\n context.closePath();\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n\r\n /**\r\n * Returns true if the control is ready to be used\r\n * @returns\r\n */\r\n public isReady(): boolean {\r\n // Most controls are ready by default, so the default implementation is to return true\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n"]}
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/control.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport type { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport type { Container } from \"./container\";\r\nimport type { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport type { Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { GetClass, RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport type { ICanvasGradient, ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { IAccessibilityTag } from \"core/IAccessibilityTag\";\r\nimport type { IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport type { Animation } from \"core/Animations/animation\";\r\nimport type { BaseGradient } from \"./gradient/BaseGradient\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#controls\r\n */\r\nexport class Control implements IAnimatable {\r\n /**\r\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\r\n */\r\n public static AllowAlphaInheritance = false;\r\n\r\n private _alpha = 1;\r\n private _alphaSet = false;\r\n private _zIndex = 0;\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @internal */\r\n public _currentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _font: string;\r\n /** @internal */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n protected _fontOffset: { ascent: number; height: number; descent: number };\r\n private _color = \"\";\r\n private _style: Nullable<Style> = null;\r\n private _styleObserver: Nullable<Observer<Style>>;\r\n /** @internal */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _isDirty = true;\r\n /** @internal */\r\n protected _wasDirty = false;\r\n /** @internal */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @internal */\r\n public _cachedParentMeasure = Measure.Empty();\r\n private _descendantsOnlyPadding = false;\r\n private _paddingLeft = new ValueAndUnit(0);\r\n private _paddingRight = new ValueAndUnit(0);\r\n private _paddingTop = new ValueAndUnit(0);\r\n private _paddingBottom = new ValueAndUnit(0);\r\n /** @internal */\r\n public _left = new ValueAndUnit(0);\r\n /** @internal */\r\n public _top = new ValueAndUnit(0);\r\n private _scaleX = 1.0;\r\n private _scaleY = 1.0;\r\n private _rotation = 0;\r\n private _transformCenterX = 0.5;\r\n private _transformCenterY = 0.5;\r\n /** @internal */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _transformedPosition = Vector2.Zero();\r\n private _isMatrixDirty = true;\r\n private _cachedOffsetX: number;\r\n private _cachedOffsetY: number;\r\n private _isVisible = true;\r\n private _isHighlighted = false;\r\n private _highlightColor = \"#4affff\";\r\n protected _highlightLineWidth = 2;\r\n /** @internal */\r\n public _linkedMesh: Nullable<TransformNode>;\r\n private _fontSet = false;\r\n private _dummyVector2 = Vector2.Zero();\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _doNotRender = false;\r\n private _downPointerIds: { [id: number]: boolean } = {};\r\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\r\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\r\n protected _isEnabled = true;\r\n protected _disabledColor = \"#9a9a9a\";\r\n protected _disabledColorItem = \"#6a6a6a\";\r\n protected _isReadOnly = false;\r\n private _gradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _rebuildLayout = false;\r\n\r\n /** @internal */\r\n protected _urlRewriter?: (url: string) => string;\r\n\r\n /**\r\n * Observable that fires when the control's enabled state changes\r\n */\r\n public onEnabledStateChangedObservable = new Observable<boolean>();\r\n\r\n /** @internal */\r\n public _customData: any = {};\r\n\r\n /** @internal */\r\n public _isClipped = false;\r\n\r\n /** @internal */\r\n public _automaticSize = false;\r\n\r\n /** @internal */\r\n public _tag: any;\r\n\r\n /**\r\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the control is readonly (default: false).\r\n * A readonly control will still raise pointer events but will not react to them\r\n */\r\n public get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n }\r\n\r\n /**\r\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\r\n */\r\n public get transformedMeasure(): Measure {\r\n return this._evaluatedMeasure;\r\n }\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\r\n @serialize()\r\n public isHitTestVisible = true;\r\n /** Gets or sets a boolean indicating if the control can block pointer events. False by default except on the following controls:\r\n * * Button controls (Button, RadioButton, ToggleButton)\r\n * * Checkbox\r\n * * ColorPicker\r\n * * InputText\r\n * * Slider\r\n */\r\n @serialize()\r\n public isPointerBlocker = false;\r\n /** Gets or sets a boolean indicating if the control can be focusable */\r\n @serialize()\r\n public isFocusInvisible = false;\r\n\r\n protected _clipChildren = true;\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n }\r\n\r\n @serialize()\r\n public get clipChildren() {\r\n return this._clipChildren;\r\n }\r\n\r\n protected _clipContent = true;\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n }\r\n\r\n @serialize()\r\n public get clipContent() {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\r\n */\r\n @serialize()\r\n public useBitmapCache = false;\r\n\r\n private _cacheData: Nullable<ImageData>;\r\n\r\n private _shadowOffsetX = 0;\r\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetX() {\r\n return this._shadowOffsetX;\r\n }\r\n\r\n public set shadowOffsetX(value: number) {\r\n if (this._shadowOffsetX === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetX = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowOffsetY = 0;\r\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetY() {\r\n return this._shadowOffsetY;\r\n }\r\n\r\n public set shadowOffsetY(value: number) {\r\n if (this._shadowOffsetY === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetY = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowBlur = 0;\r\n private _previousShadowBlur = 0;\r\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\r\n @serialize()\r\n public get shadowBlur() {\r\n return this._shadowBlur;\r\n }\r\n\r\n public set shadowBlur(value: number) {\r\n if (this._shadowBlur === value) {\r\n return;\r\n }\r\n\r\n this._previousShadowBlur = this._shadowBlur;\r\n\r\n this._shadowBlur = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowColor = \"black\";\r\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\r\n @serialize()\r\n public get shadowColor() {\r\n return this._shadowColor;\r\n }\r\n\r\n public set shadowColor(value: string) {\r\n if (this._shadowColor === value) {\r\n return;\r\n }\r\n\r\n this._shadowColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the cursor to use when the control is hovered */\r\n @serialize()\r\n public hoverCursor = \"\";\r\n\r\n /** @internal */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @internal */\r\n protected _linkOffsetY = new ValueAndUnit(0);\r\n\r\n // Properties\r\n\r\n /** Gets the control type name */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the control for accessibility purpose.\r\n * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.\r\n */\r\n public set accessibilityTag(value: Nullable<IAccessibilityTag>) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable<IAccessibilityTag> = null;\r\n\r\n /**\r\n * Observable that fires whenever the accessibility event of the control has changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable<Nullable<IAccessibilityTag>>();\r\n\r\n /**\r\n * An event triggered when pointer wheel is scrolled\r\n */\r\n public onWheelObservable = new Observable<Vector2>();\r\n /**\r\n * An event triggered when the pointer moves over the control.\r\n */\r\n public onPointerMoveObservable = new Observable<Vector2>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control.\r\n */\r\n public onPointerOutObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer up\r\n */\r\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on\r\n */\r\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control is marked as dirty\r\n */\r\n public onDirtyObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered before drawing the control\r\n */\r\n public onBeforeDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered after the control was drawn\r\n */\r\n public onAfterDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control has been disposed\r\n */\r\n public onDisposeObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control isVisible is changed\r\n */\r\n public onIsVisibleChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Get the hosting AdvancedDynamicTexture\r\n */\r\n public get host(): AdvancedDynamicTexture {\r\n return this._host;\r\n }\r\n\r\n /** Gets or set information about font offsets (used to render and align text) */\r\n @serialize()\r\n public get fontOffset(): { ascent: number; height: number; descent: number } {\r\n return this._fontOffset;\r\n }\r\n\r\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\r\n this._fontOffset = offset;\r\n }\r\n\r\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\r\n @serialize()\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n this._alphaSet = true;\r\n this._alpha = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\r\n */\r\n public get highlightLineWidth(): number {\r\n return this._highlightLineWidth;\r\n }\r\n\r\n public set highlightLineWidth(value: number) {\r\n if (this._highlightLineWidth === value) {\r\n return;\r\n }\r\n\r\n this._highlightLineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\r\n */\r\n public get isHighlighted(): boolean {\r\n return this._isHighlighted;\r\n }\r\n\r\n public set isHighlighted(value: boolean) {\r\n if (this._isHighlighted === value) {\r\n return;\r\n }\r\n\r\n this._isHighlighted = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Indicates if the control should be serialized. Defaults to true.\r\n */\r\n @serialize()\r\n public isSerializable: boolean = true;\r\n\r\n /**\r\n * Gets or sets a string defining the color to use for highlighting this control\r\n */\r\n public get highlightColor(): string {\r\n return this._highlightColor;\r\n }\r\n\r\n public set highlightColor(value: string) {\r\n if (this._highlightColor === value) {\r\n return;\r\n }\r\n\r\n this._highlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleX(): number {\r\n return this._scaleX;\r\n }\r\n\r\n public set scaleX(value: number) {\r\n if (this._scaleX === value) {\r\n return;\r\n }\r\n\r\n this._scaleX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleY(): number {\r\n return this._scaleY;\r\n }\r\n\r\n public set scaleY(value: number) {\r\n if (this._scaleY === value) {\r\n return;\r\n }\r\n\r\n this._scaleY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the rotation angle (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get rotation(): number {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(value: number) {\r\n if (this._rotation === value) {\r\n return;\r\n }\r\n\r\n this._rotation = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on Y axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterY(): number {\r\n return this._transformCenterY;\r\n }\r\n\r\n public set transformCenterY(value: number) {\r\n if (this._transformCenterY === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on X axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterX(): number {\r\n return this._transformCenterX;\r\n }\r\n\r\n public set transformCenterX(value: number) {\r\n if (this._transformCenterX === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get horizontalAlignment(): number {\r\n return this._horizontalAlignment;\r\n }\r\n\r\n public set horizontalAlignment(value: number) {\r\n if (this._horizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._horizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the vertical alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get verticalAlignment(): number {\r\n return this._verticalAlignment;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n if (this._verticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._verticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _fixedRatio = 0;\r\n public set fixedRatio(value: number) {\r\n if (this._fixedRatio === value) {\r\n return;\r\n }\r\n\r\n this._fixedRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a fixed ratio for this control.\r\n * When different from 0, the ratio is used to compute the \"second\" dimension.\r\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\r\n * second dimension is computed as first dimension * fixedRatio\r\n */\r\n @serialize()\r\n public get fixedRatio(): number {\r\n return this._fixedRatio;\r\n }\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n set fixedRatioMasterIsWidth(value: boolean) {\r\n if (this._fixedRatioMasterIsWidth === value) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.\r\n * When the height of a control is set, this property is changed to false.\r\n */\r\n @serialize()\r\n get fixedRatioMasterIsWidth(): boolean {\r\n return this._fixedRatioMasterIsWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public set width(value: string | number) {\r\n this._fixedRatioMasterIsWidth = true;\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the control width in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get widthInPixels(): number {\r\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set widthInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = true;\r\n this.width = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n public set height(value: string | number) {\r\n this._fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get heightInPixels(): number {\r\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set heightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = false;\r\n this.height = value + \"px\";\r\n }\r\n\r\n /** Gets or set font family */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font style */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /**\r\n * Gets or sets style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n @serialize()\r\n public get style(): Nullable<Style> {\r\n return this._style;\r\n }\r\n\r\n public set style(value: Nullable<Style>) {\r\n if (this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n this._style = value;\r\n\r\n if (this._style) {\r\n this._styleObserver = this._style.onChangedObservable.add(() => {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n\r\n /** @internal */\r\n public get _isFontSizeInPercentage(): boolean {\r\n return this._fontSize.isPercentage;\r\n }\r\n\r\n /** Gets or sets font size in pixels */\r\n public get fontSizeInPixels(): number {\r\n const fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\r\n\r\n if (fontSizeToUse.isPixel) {\r\n return fontSizeToUse.getValue(this._host);\r\n }\r\n\r\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\r\n }\r\n\r\n public set fontSizeInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.fontSize = value + \"px\";\r\n }\r\n\r\n /** Gets or sets font size */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n }\r\n\r\n /** Gets or sets foreground color */\r\n @serialize()\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n public set color(value: string) {\r\n if (this._color === value) {\r\n return;\r\n }\r\n\r\n this._color = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets gradient. Setting a gradient will override the color */\r\n @serialize()\r\n public get gradient(): Nullable<BaseGradient> {\r\n return this._gradient;\r\n }\r\n\r\n public set gradient(value: Nullable<BaseGradient>) {\r\n if (this._gradient === value) {\r\n return;\r\n }\r\n\r\n this._gradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets z index which is used to reorder controls on the z axis */\r\n @serialize()\r\n public get zIndex(): number {\r\n return this._zIndex;\r\n }\r\n\r\n public set zIndex(value: number) {\r\n if (this.zIndex === value) {\r\n return;\r\n }\r\n\r\n this._zIndex = value;\r\n\r\n if (this.parent) {\r\n this.parent._reOrderControl(this);\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can be rendered */\r\n @serialize()\r\n public get notRenderable(): boolean {\r\n return this._doNotRender;\r\n }\r\n\r\n public set notRenderable(value: boolean) {\r\n if (this._doNotRender === value) {\r\n return;\r\n }\r\n\r\n this._doNotRender = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n @serialize()\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n this._markAsDirty(true);\r\n\r\n this.onIsVisibleChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /** Gets a boolean indicating that the control needs to update its rendering */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Gets the current linked mesh (or null if none)\r\n */\r\n public get linkedMesh(): Nullable<TransformNode> {\r\n return this._linkedMesh;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding should work like in CSS.\r\n * Basically, it will add the padding amount on each side of the parent control for its children.\r\n */\r\n @serialize()\r\n public get descendantsOnlyPadding(): boolean {\r\n return this._descendantsOnlyPadding;\r\n }\r\n\r\n public set descendantsOnlyPadding(value: boolean) {\r\n if (this._descendantsOnlyPadding === value) {\r\n return;\r\n }\r\n\r\n this._descendantsOnlyPadding = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingLeft(): string | number {\r\n return this._paddingLeft.toString(this._host);\r\n }\r\n\r\n public set paddingLeft(value: string | number) {\r\n if (this._paddingLeft.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingLeftInPixels(): number {\r\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingLeftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingLeft = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingLeftInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingLeftInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingRight(): string | number {\r\n return this._paddingRight.toString(this._host);\r\n }\r\n\r\n public set paddingRight(value: string | number) {\r\n if (this._paddingRight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingRightInPixels(): number {\r\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingRightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingRight = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingRightInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingRightInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingTop(): string | number {\r\n return this._paddingTop.toString(this._host);\r\n }\r\n\r\n public set paddingTop(value: string | number) {\r\n if (this._paddingTop.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingTopInPixels(): number {\r\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingTopInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingTop = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingTopInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingTopInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingBottom(): string | number {\r\n return this._paddingBottom.toString(this._host);\r\n }\r\n\r\n public set paddingBottom(value: string | number) {\r\n if (this._paddingBottom.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingBottomInPixels(): number {\r\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingBottomInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingBottom = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingBottomInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingBottomInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get left(): string | number {\r\n return this._left.toString(this._host);\r\n }\r\n\r\n public set left(value: string | number) {\r\n if (this._left.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get leftInPixels(): number {\r\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set leftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.left = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get top(): string | number {\r\n return this._top.toString(this._host);\r\n }\r\n\r\n public set top(value: string | number) {\r\n if (this._top.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get topInPixels(): number {\r\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set topInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.top = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetX(): string | number {\r\n return this._linkOffsetX.toString(this._host);\r\n }\r\n\r\n public set linkOffsetX(value: string | number) {\r\n if (this._linkOffsetX.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetXInPixels(): number {\r\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set linkOffsetXInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetX = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetY(): string | number {\r\n return this._linkOffsetY.toString(this._host);\r\n }\r\n\r\n public set linkOffsetY(value: string | number) {\r\n if (this._linkOffsetY.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetYInPixels(): number {\r\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set linkOffsetYInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetY = value + \"px\";\r\n }\r\n\r\n /** Gets the center coordinate on X axis */\r\n public get centerX(): number {\r\n return this._currentMeasure.left + this._currentMeasure.width / 2;\r\n }\r\n\r\n /** Gets the center coordinate on Y axis */\r\n public get centerY(): number {\r\n return this._currentMeasure.top + this._currentMeasure.height / 2;\r\n }\r\n\r\n /** Gets or sets if control is Enabled */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._markAsDirty();\r\n // if this control or any of it's descendants are under a pointer, we need to fire a pointerOut event\r\n const recursivelyFirePointerOut = (control: Control) => {\r\n if (!control.host) {\r\n return;\r\n }\r\n for (const pointer in control.host._lastControlOver) {\r\n if (control === this.host._lastControlOver[pointer]) {\r\n control._onPointerOut(control, null, true);\r\n delete control.host._lastControlOver[pointer];\r\n }\r\n }\r\n if ((control as Container).children !== undefined) {\r\n (control as Container).children.forEach(recursivelyFirePointerOut);\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\r\n this.onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n /** Gets or sets background color of control if it's disabled. Only applies to Button class. */\r\n @serialize()\r\n public get disabledColor(): string {\r\n return this._disabledColor;\r\n }\r\n\r\n public set disabledColor(value: string) {\r\n if (this._disabledColor === value) {\r\n return;\r\n }\r\n\r\n this._disabledColor = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */\r\n @serialize()\r\n public get disabledColorItem(): string {\r\n return this._disabledColorItem;\r\n }\r\n\r\n public set disabledColorItem(value: string) {\r\n if (this._disabledColorItem === value) {\r\n return;\r\n }\r\n\r\n this._disabledColorItem = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets/sets the overlap group of the control.\r\n * Controls with overlapGroup set to a number can be deoverlapped.\r\n * Controls with overlapGroup set to undefined are not deoverlapped.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#deoverlapping\r\n */\r\n @serialize()\r\n public overlapGroup?: number;\r\n /**\r\n * Gets/sets the deoverlap movement multiplier\r\n */\r\n @serialize()\r\n public overlapDeltaMultiplier?: number;\r\n\r\n /**\r\n * Array of animations\r\n */\r\n animations: Nullable<Animation[]> = null;\r\n\r\n // Functions\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the name of the control\r\n */\r\n constructor(\r\n /** defines the name of the control */\r\n public name?: string\r\n ) {}\r\n\r\n /** @internal */\r\n protected _getTypeName(): string {\r\n return \"Control\";\r\n }\r\n\r\n /**\r\n * Gets the first ascendant in the hierarchy of the given type\r\n * @param className defines the required type\r\n * @returns the ascendant or null if not found\r\n */\r\n public getAscendantOfClass(className: string): Nullable<Control> {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n if (this.parent.getClassName() === className) {\r\n return this.parent;\r\n }\r\n\r\n return this.parent.getAscendantOfClass(className);\r\n }\r\n\r\n /**\r\n * Mark control element as dirty\r\n * @param force force non visible elements to be marked too\r\n */\r\n public markAsDirty(force = false): void {\r\n this._markAsDirty(force);\r\n }\r\n\r\n /**\r\n * Mark the element and its children as dirty\r\n */\r\n public markAllAsDirty(): void {\r\n this._markAllAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public _resetFontCache(): void {\r\n this._fontSet = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Determines if a container is an ascendant of the current control\r\n * @param container defines the container to look for\r\n * @returns true if the container is one of the ascendant of the control\r\n */\r\n public isAscendant(container: Control): boolean {\r\n if (!this.parent) {\r\n return false;\r\n }\r\n\r\n if (this.parent === container) {\r\n return true;\r\n }\r\n\r\n return this.parent.isAscendant(container);\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in local space\r\n */\r\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n this.getLocalCoordinatesToRef(globalCoordinates, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @param result defines the target vector2 where to store the result\r\n * @returns the current control\r\n */\r\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\r\n result.x = globalCoordinates.x - this._currentMeasure.left;\r\n result.y = globalCoordinates.y - this._currentMeasure.top;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets coordinates in parent local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in parent local space\r\n */\r\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\r\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Move the current control to a vector3 position projected onto the screen.\r\n * @param position defines the target position\r\n * @param scene defines the hosting scene\r\n */\r\n public moveToVector3(position: Vector3, scene: Scene): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Will store all controls that have this control as ascendant in a given array\r\n * @param results defines the array where to store the descendants\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n */\r\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * Will return all controls that have this control as ascendant\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results: Control[] = [];\r\n\r\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Link current control with a target mesh\r\n * @param mesh defines the mesh to link with\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\r\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\r\n if (mesh) {\r\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\r\n }\r\n return;\r\n }\r\n\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index !== -1) {\r\n this._linkedMesh = mesh;\r\n if (!mesh) {\r\n this._host._linkedControls.splice(index, 1);\r\n }\r\n return;\r\n } else if (!mesh) {\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._linkedMesh = mesh;\r\n this._host._linkedControls.push(this);\r\n }\r\n\r\n /**\r\n * Shorthand function to set the top, right, bottom, and left padding values on the control.\r\n * @param { string | number} paddingTop - The value of the top padding.\r\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\r\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\r\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTop = top;\r\n this.paddingRight = right;\r\n this.paddingBottom = bottom;\r\n this.paddingLeft = left;\r\n }\r\n\r\n /**\r\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\r\n * @param { number} paddingTop - The value in pixels of the top padding.\r\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\r\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\r\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTopInPixels = top;\r\n this.paddingRightInPixels = right;\r\n this.paddingBottomInPixels = bottom;\r\n this.paddingLeftInPixels = left;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\r\n const oldLeft = this._left.getValue(this._host);\r\n const oldTop = this._top.getValue(this._host);\r\n\r\n const parentMeasure = this.parent?._currentMeasure;\r\n if (parentMeasure) {\r\n this._processMeasures(parentMeasure, this._host.getContext());\r\n }\r\n\r\n let newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\r\n let newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\r\n\r\n const leftAndTopIgnoreAdaptiveScaling = this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling;\r\n if (leftAndTopIgnoreAdaptiveScaling) {\r\n if (Math.abs(newLeft - oldLeft) < 0.5) {\r\n newLeft = oldLeft;\r\n }\r\n\r\n if (Math.abs(newTop - oldTop) < 0.5) {\r\n newTop = oldTop;\r\n }\r\n }\r\n\r\n if (!leftAndTopIgnoreAdaptiveScaling && oldLeft === newLeft && oldTop === newTop) {\r\n return;\r\n }\r\n\r\n this.left = newLeft + \"px\";\r\n this.top = newTop + \"px\";\r\n\r\n this._left.ignoreAdaptiveScaling = true;\r\n this._top.ignoreAdaptiveScaling = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetLeft(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.left += offset;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetTop(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.top += offset;\r\n }\r\n\r\n /** @internal */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @internal */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _intersectsRect(rect: Measure, context?: ICanvasRenderingContext) {\r\n // make sure we are transformed correctly before checking intersections. no-op if nothing is dirty.\r\n this._transform(context);\r\n if (this._evaluatedMeasure.left >= rect.left + rect.width) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top >= rect.top + rect.height) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width <= rect.left) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height <= rect.top) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public invalidateRect() {\r\n this._transform();\r\n if (this.host && this.host.useInvalidateRectOptimization) {\r\n // Rotate by transform to get the measure transformed to global space\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\r\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\r\n // the previous measure is used to properly clear a control that is scaled down\r\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\r\n\r\n // Expand rect based on shadows\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n const offsetX = this._computeAdditionalOffsetX();\r\n const offsetY = this._computeAdditionalOffsetY();\r\n\r\n this.host.invalidateRect(\r\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\r\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\r\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\r\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markAsDirty(force = false): void {\r\n if (!this._isVisible && !force) {\r\n return;\r\n }\r\n\r\n this._isDirty = true;\r\n this._markMatrixAsDirty();\r\n\r\n // Redraw only this rectangle\r\n if (this._host) {\r\n this._host.markAsDirty();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _markAllAsDirty(): void {\r\n this._markAsDirty();\r\n\r\n if (this._font) {\r\n this._prepareFont();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _link(host: AdvancedDynamicTexture): void {\r\n this._host = host;\r\n if (this._host) {\r\n this.uniqueId = this._host.getScene()!.getUniqueId();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _transform(context?: ICanvasRenderingContext): void {\r\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\r\n return;\r\n }\r\n\r\n // postTranslate\r\n const offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\r\n const offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\r\n if (context) {\r\n context.translate(offsetX, offsetY);\r\n\r\n // rotate\r\n context.rotate(this._rotation);\r\n\r\n // scale\r\n context.scale(this._scaleX, this._scaleY);\r\n\r\n // preTranslate\r\n context.translate(-offsetX, -offsetY);\r\n }\r\n // Need to update matrices?\r\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\r\n this._cachedOffsetX = offsetX;\r\n this._cachedOffsetY = offsetY;\r\n this._isMatrixDirty = false;\r\n this._flagDescendantsAsMatrixDirty();\r\n\r\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\r\n\r\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlight(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n context.save();\r\n context.strokeStyle = this._highlightColor;\r\n context.lineWidth = this._highlightLineWidth;\r\n\r\n this._renderHighlightSpecific(context);\r\n context.restore();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n protected _getColor(context: ICanvasRenderingContext): string | ICanvasGradient {\r\n return this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n if (this._isFontSizeInPercentage) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._host && this._host.useSmallestIdeal && !this._font) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._fontSet) {\r\n this._prepareFont();\r\n this._fontSet = false;\r\n }\r\n\r\n if (this._font) {\r\n context.font = this._font;\r\n }\r\n\r\n if (this._color || this.gradient) {\r\n context.fillStyle = this._getColor(context);\r\n }\r\n\r\n if (Control.AllowAlphaInheritance) {\r\n context.globalAlpha *= this._alpha;\r\n } else if (this._alphaSet) {\r\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n this.host._numLayoutCalls++;\r\n\r\n this._currentMeasure.addAndTransformToRef(\r\n this._transformMatrix,\r\n -this._paddingLeftInPixels | 0,\r\n -this._paddingTopInPixels | 0,\r\n this._paddingRightInPixels | 0,\r\n this._paddingBottomInPixels | 0,\r\n this._prevCurrentMeasureTransformedIntoGlobalSpace\r\n );\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n let rebuildCount = 0;\r\n do {\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < 3);\r\n\r\n if (rebuildCount >= 3) {\r\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n this.invalidateRect();\r\n this._evaluateClippingState(parentMeasure);\r\n }\r\n\r\n this._wasDirty = this._isDirty;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n this._tempPaddingMeasure.copyFrom(parentMeasure);\r\n\r\n // Apply padding if in correct mode\r\n if (this.parent && this.parent.descendantsOnlyPadding) {\r\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\r\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\r\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\r\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\r\n }\r\n\r\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n // Let children take some pre-measurement actions\r\n this._preMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._measure();\r\n\r\n // Let children take some post-measurement actions\r\n this._postMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Convert to int values\r\n this._currentMeasure.left = this._currentMeasure.left | 0;\r\n this._currentMeasure.top = this._currentMeasure.top | 0;\r\n this._currentMeasure.width = this._currentMeasure.width | 0;\r\n this._currentMeasure.height = this._currentMeasure.height | 0;\r\n\r\n // Let children add more features\r\n this._additionalProcessing(this._tempPaddingMeasure, context);\r\n\r\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.onDirtyObservable.hasObservers()) {\r\n this.onDirtyObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _evaluateClippingState(parentMeasure: Measure) {\r\n // Since transformMatrix is used here, we need to have it freshly computed\r\n this._transform();\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.parent && this.parent.clipChildren) {\r\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\r\n // Early clip\r\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n }\r\n\r\n this._isClipped = false;\r\n }\r\n\r\n /** @internal */\r\n public _measure(): void {\r\n // Width / Height\r\n if (this._width.isPixel) {\r\n this._currentMeasure.width = this._width.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width *= this._width.getValue(this._host);\r\n }\r\n\r\n if (this._height.isPixel) {\r\n this._currentMeasure.height = this._height.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height *= this._height.getValue(this._host);\r\n }\r\n\r\n if (this._fixedRatio !== 0) {\r\n if (this._fixedRatioMasterIsWidth) {\r\n this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio;\r\n } else {\r\n this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n const parentWidth = parentMeasure.width;\r\n const parentHeight = parentMeasure.height;\r\n\r\n // Left / top\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (this.horizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = parentWidth - width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (parentWidth - width) / 2;\r\n break;\r\n }\r\n\r\n switch (this.verticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n y = 0;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n y = parentHeight - height;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n y = (parentHeight - height) / 2;\r\n break;\r\n }\r\n\r\n if (!this.descendantsOnlyPadding) {\r\n if (this._paddingLeft.isPixel) {\r\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\r\n }\r\n\r\n if (this._paddingRight.isPixel) {\r\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\r\n }\r\n\r\n if (this._paddingTop.isPixel) {\r\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\r\n }\r\n\r\n if (this._paddingBottom.isPixel) {\r\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\r\n }\r\n }\r\n\r\n if (this._left.isPixel) {\r\n this._currentMeasure.left += this._left.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\r\n }\r\n\r\n if (this._top.isPixel) {\r\n this._currentMeasure.top += this._top.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\r\n }\r\n\r\n this._currentMeasure.left += x;\r\n this._currentMeasure.top += y;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _postMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _clipForChildren(context: ICanvasRenderingContext): void {\r\n // DO nothing\r\n }\r\n\r\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\r\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\r\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\r\n context.beginPath();\r\n Control._ClipMeasure.copyFrom(this._currentMeasure);\r\n if (invalidatedRectangle) {\r\n // Rotate the invalidated rect into the control's space\r\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\r\n\r\n // Get the intersection of the rect in context space and the current context\r\n const intersection = new Measure(0, 0, 0, 0);\r\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\r\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\r\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\r\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\r\n Control._ClipMeasure.copyFrom(intersection);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = this.shadowBlur;\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n context.rect(\r\n Control._ClipMeasure.left + leftShadowOffset,\r\n Control._ClipMeasure.top + topShadowOffset,\r\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\r\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\r\n );\r\n } else {\r\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\r\n }\r\n\r\n context.clip();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\r\n if (!this.isVisible || this.notRenderable || this._isClipped) {\r\n this._isDirty = false;\r\n return false;\r\n }\r\n\r\n this.host._numRenderCalls++;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Transform\r\n this._transform(context);\r\n\r\n // Clip\r\n if (this.clipContent) {\r\n this._clip(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.onBeforeDrawObservable.hasObservers()) {\r\n this.onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\r\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\r\n } else {\r\n this._draw(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.useBitmapCache && this._wasDirty) {\r\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n this._renderHighlight(context);\r\n\r\n if (this.onAfterDrawObservable.hasObservers()) {\r\n this.onAfterDrawObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public contains(x: number, y: number): boolean {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n // Check\r\n if (x < this._currentMeasure.left) {\r\n return false;\r\n }\r\n\r\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\r\n return false;\r\n }\r\n\r\n if (y < this._currentMeasure.top) {\r\n return false;\r\n }\r\n\r\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\r\n return false;\r\n }\r\n\r\n if (this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\r\n return false;\r\n }\r\n\r\n if (!this.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: Nullable<PointerInfoBase>): void {\r\n const canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (this._enterCount > 0) {\r\n return false;\r\n }\r\n\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n this._enterCount++;\r\n\r\n const canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && (!this._isEnabled || target === this)) {\r\n return;\r\n }\r\n this._enterCount = 0;\r\n\r\n let canNotify: boolean = true;\r\n\r\n if (!target.isAscendant(this)) {\r\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\r\n }\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: Nullable<PointerInfoBase>): boolean {\r\n // Prevent pointerout to lose control context.\r\n // Event redundancy is checked inside the function.\r\n this._onPointerEnter(this, pi);\r\n\r\n if (this._downCount !== 0) {\r\n return false;\r\n }\r\n\r\n this._downCount++;\r\n\r\n this._downPointerIds[pointerId] = true;\r\n\r\n const canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.add((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: Nullable<PointerInfoBase>): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._downCount = 0;\r\n\r\n delete this._downPointerIds[pointerId];\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.delete((pi.event as IPointerEvent).pointerId);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n const canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\r\n\r\n if (canNotify && this.parent != null) {\r\n this.parent._onWheelScroll(deltaX, deltaY);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(\r\n type: number,\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._dummyVector2.copyFromFloats(x, y);\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this, pi);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this, pi);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\r\n this._host._registerLastControlDown(this, pointerId);\r\n this._host._lastPickedControl = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERUP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERWHEEL) {\r\n if (this._host._lastControlOver[pointerId]) {\r\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getStyleProperty(propName: \"fontStyle\" | \"fontWeight\" | \"fontFamily\", defaultValue: string): string {\r\n const prop = (this._style && this._style[propName]) ?? this[propName];\r\n if (!prop && this.parent) {\r\n return this.parent._getStyleProperty(propName, defaultValue);\r\n } else if (!this.parent) {\r\n return defaultValue;\r\n } else {\r\n return prop;\r\n }\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n this._font =\r\n this._getStyleProperty(\"fontStyle\", \"\") +\r\n \" \" +\r\n this._getStyleProperty(\"fontWeight\", \"\") +\r\n \" \" +\r\n this.fontSizeInPixels +\r\n \"px \" +\r\n this._getStyleProperty(\"fontFamily\", \"Arial\");\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font, this._host?.getScene()?.getEngine());\r\n\r\n //children need to be refreshed\r\n this.getDescendants().forEach((child) => child._markAllAsDirty());\r\n }\r\n\r\n /**\r\n * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.\r\n * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.\r\n * @param dim the dimension to check (width or height)\r\n * @returns if the dimension is fully defined\r\n */\r\n public isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n return this.getDimension(dim).isPixel;\r\n }\r\n\r\n /**\r\n * Gets the dimension of the control along a specified axis\r\n * @param dim the dimension to retrieve (width or height)\r\n * @returns the dimension value along the specified axis\r\n */\r\n public getDimension(dim: \"width\" | \"height\"): ValueAndUnit {\r\n if (dim === \"width\") {\r\n return this._width;\r\n } else {\r\n return this._height;\r\n }\r\n }\r\n\r\n /**\r\n * Clones a control and its descendants\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @returns the cloned control\r\n */\r\n public clone(host?: AdvancedDynamicTexture): Control {\r\n const serialization: any = {};\r\n this.serialize(serialization, true);\r\n\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serialization.className);\r\n const cloned = new controlType();\r\n cloned.parse(serialization, host);\r\n\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Parses a serialized object into this control\r\n * @param serializedObject the object with the serialized properties\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns this control\r\n */\r\n public parse(serializedObject: any, host?: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n this._urlRewriter = urlRewriter;\r\n SerializationHelper.Parse(() => this, serializedObject, null);\r\n\r\n this.name = serializedObject.name;\r\n\r\n this._parseFromContent(serializedObject, host ?? this._host);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n // Call prepareFont to guarantee the font is properly set before serializing\r\n if (allowCanvas) {\r\n this._prepareFont();\r\n }\r\n if (this._fontFamily) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n }\r\n if (this.fontSize) {\r\n serializationObject.fontSize = this.fontSize;\r\n }\r\n if (this.fontWeight) {\r\n serializationObject.fontWeight = this.fontWeight;\r\n }\r\n if (this.fontStyle) {\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n\r\n if (this._gradient) {\r\n serializationObject.gradient = {};\r\n this._gradient.serialize(serializationObject.gradient);\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n if (serializedObject.fontFamily) {\r\n this.fontFamily = serializedObject.fontFamily;\r\n }\r\n\r\n if (serializedObject.fontSize) {\r\n this.fontSize = serializedObject.fontSize;\r\n }\r\n\r\n if (serializedObject.fontWeight) {\r\n this.fontWeight = serializedObject.fontWeight;\r\n }\r\n\r\n if (serializedObject.fontStyle) {\r\n this.fontStyle = serializedObject.fontStyle;\r\n }\r\n\r\n // Gradient\r\n if (serializedObject.gradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.gradient.className);\r\n this._gradient = new className();\r\n this._gradient?.parse(serializedObject.gradient);\r\n }\r\n\r\n // Animations\r\n if (serializedObject.animations) {\r\n this.animations = [];\r\n for (let animationIndex = 0; animationIndex < serializedObject.animations.length; animationIndex++) {\r\n const parsedAnimation = serializedObject.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n this.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n\r\n if (serializedObject.autoAnimate && this._host && this._host.getScene()) {\r\n this._host\r\n .getScene()!\r\n .beginAnimation(\r\n this,\r\n serializedObject.autoAnimateFrom,\r\n serializedObject.autoAnimateTo,\r\n serializedObject.autoAnimateLoop,\r\n serializedObject.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n\r\n this.fixedRatioMasterIsWidth = serializedObject.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;\r\n }\r\n\r\n /** Releases associated resources */\r\n public dispose() {\r\n this.onDirtyObservable.clear();\r\n this.onBeforeDrawObservable.clear();\r\n this.onAfterDrawObservable.clear();\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n this.onWheelObservable.clear();\r\n\r\n if (this._styleObserver && this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n if (this.parent) {\r\n this.parent.removeControl(this);\r\n this.parent = null;\r\n }\r\n\r\n if (this._host) {\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index > -1) {\r\n this.linkWithMesh(null);\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n // Statics\r\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\r\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\r\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\r\n\r\n private static _VERTICAL_ALIGNMENT_TOP = 0;\r\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\r\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\r\n\r\n /** HORIZONTAL_ALIGNMENT_LEFT */\r\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_RIGHT */\r\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_CENTER */\r\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_TOP */\r\n public static get VERTICAL_ALIGNMENT_TOP(): number {\r\n return Control._VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_BOTTOM */\r\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\r\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_CENTER */\r\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\r\n return Control._VERTICAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetFontOffset(font: string, engineToUse?: AbstractEngine): { ascent: number; height: number; descent: number } {\r\n if (Control._FontHeightSizes[font]) {\r\n return Control._FontHeightSizes[font];\r\n }\r\n\r\n const engine = engineToUse || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n\r\n const result = engine.getFontOffset(font);\r\n Control._FontHeightSizes[font] = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a Control from parsed data\r\n * @param serializedObject defines parsed data\r\n * @param host defines the hosting AdvancedDynamicTexture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(\r\n () => {\r\n const newControl = new controlType() as Control;\r\n newControl._urlRewriter = urlRewriter;\r\n return newControl;\r\n },\r\n serializedObject,\r\n null\r\n );\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host, urlRewriter);\r\n\r\n return control;\r\n }\r\n\r\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => {};\r\n\r\n /**\r\n * @internal\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: number, context: ICanvasRenderingContext): void {\r\n context.translate(x, y);\r\n context.scale(width, height);\r\n\r\n context.beginPath();\r\n context.arc(0, 0, 1, 0, 2 * Math.PI);\r\n context.closePath();\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n\r\n /**\r\n * Returns true if the control is ready to be used\r\n * @returns\r\n */\r\n public isReady(): boolean {\r\n // Most controls are ready by default, so the default implementation is to return true\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n"]}
|
package/2D/controls/image.js
CHANGED
@@ -741,36 +741,45 @@ export class Image extends Control {
|
|
741
741
|
context.restore();
|
742
742
|
}
|
743
743
|
_renderNinePatch(context, sx, sy, sw, sh) {
|
744
|
+
const idealRatio = this.host.idealWidth
|
745
|
+
? this._width.getValue(this.host) / this.host.idealWidth
|
746
|
+
: this.host.idealHeight
|
747
|
+
? this._height.getValue(this.host) / this.host.idealHeight
|
748
|
+
: 1;
|
744
749
|
const leftWidth = this._sliceLeft;
|
745
750
|
const topHeight = this._sliceTop;
|
746
751
|
const bottomHeight = sh - this._sliceBottom;
|
747
752
|
const rightWidth = sw - this._sliceRight;
|
748
753
|
const centerWidth = this._sliceRight - this._sliceLeft;
|
749
754
|
const centerHeight = this._sliceBottom - this._sliceTop;
|
750
|
-
const
|
751
|
-
const
|
752
|
-
const
|
753
|
-
const
|
754
|
-
const
|
755
|
-
const
|
755
|
+
const leftWidthAdjusted = Math.round(leftWidth * idealRatio);
|
756
|
+
const topHeightAdjusted = Math.round(topHeight * idealRatio);
|
757
|
+
const bottomHeightAdjusted = Math.round(bottomHeight * idealRatio);
|
758
|
+
const rightWidthAdjusted = Math.round(rightWidth * idealRatio);
|
759
|
+
const targetCenterWidth = Math.round(this._currentMeasure.width) - rightWidthAdjusted - leftWidthAdjusted + 2;
|
760
|
+
const targetCenterHeight = Math.round(this._currentMeasure.height) - bottomHeightAdjusted - topHeightAdjusted + 2;
|
761
|
+
const centerLeftOffset = Math.round(this._currentMeasure.left) + leftWidthAdjusted - 1;
|
762
|
+
const centerTopOffset = Math.round(this._currentMeasure.top) + topHeightAdjusted - 1;
|
763
|
+
const rightOffset = Math.round(this._currentMeasure.left + this._currentMeasure.width) - rightWidthAdjusted;
|
764
|
+
const bottomOffset = Math.round(this._currentMeasure.top + this._currentMeasure.height) - bottomHeightAdjusted;
|
756
765
|
//Top Left
|
757
|
-
this._drawImage(context, sx, sy, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top,
|
766
|
+
this._drawImage(context, sx, sy, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top, leftWidthAdjusted, topHeightAdjusted);
|
758
767
|
//Top
|
759
|
-
this._drawImage(context, sx + this._sliceLeft, sy, centerWidth, topHeight, centerLeftOffset + 1, this._currentMeasure.top, targetCenterWidth - 2,
|
768
|
+
this._drawImage(context, sx + this._sliceLeft, sy, centerWidth, topHeight, centerLeftOffset + 1, this._currentMeasure.top, targetCenterWidth - 2, topHeightAdjusted);
|
760
769
|
//Top Right
|
761
|
-
this._drawImage(context, sx + this._sliceRight, sy, rightWidth, topHeight, rightOffset, this._currentMeasure.top,
|
770
|
+
this._drawImage(context, sx + this._sliceRight, sy, rightWidth, topHeight, rightOffset, this._currentMeasure.top, rightWidthAdjusted, topHeightAdjusted);
|
762
771
|
//Left
|
763
|
-
this._drawImage(context, sx, sy + this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset + 1,
|
772
|
+
this._drawImage(context, sx, sy + this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset + 1, leftWidthAdjusted, targetCenterHeight - 2);
|
764
773
|
// Center
|
765
|
-
this._drawImage(context, sx + this._sliceLeft, sy + this._sliceTop, centerWidth, centerHeight, centerLeftOffset, centerTopOffset, targetCenterWidth, targetCenterHeight);
|
774
|
+
this._drawImage(context, sx + this._sliceLeft, sy + this._sliceTop, centerWidth, centerHeight, centerLeftOffset + 1, centerTopOffset + 1, targetCenterWidth - 2, targetCenterHeight - 2);
|
766
775
|
//Right
|
767
|
-
this._drawImage(context, sx + this._sliceRight, sy + this._sliceTop, rightWidth, centerHeight, rightOffset, centerTopOffset + 1,
|
776
|
+
this._drawImage(context, sx + this._sliceRight, sy + this._sliceTop, rightWidth, centerHeight, rightOffset, centerTopOffset + 1, rightWidthAdjusted, targetCenterHeight - 2);
|
768
777
|
//Bottom Left
|
769
|
-
this._drawImage(context, sx, sy + this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset,
|
778
|
+
this._drawImage(context, sx, sy + this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset, leftWidthAdjusted, bottomHeightAdjusted);
|
770
779
|
//Bottom
|
771
|
-
this._drawImage(context, sx + this.sliceLeft, sy + this._sliceBottom, centerWidth, bottomHeight, centerLeftOffset + 1, bottomOffset, targetCenterWidth - 2,
|
780
|
+
this._drawImage(context, sx + this.sliceLeft, sy + this._sliceBottom, centerWidth, bottomHeight, centerLeftOffset + 1, bottomOffset, targetCenterWidth - 2, bottomHeightAdjusted);
|
772
781
|
//Bottom Right
|
773
|
-
this._drawImage(context, sx + this._sliceRight, sy + this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset,
|
782
|
+
this._drawImage(context, sx + this._sliceRight, sy + this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset, rightWidthAdjusted, bottomHeightAdjusted);
|
774
783
|
}
|
775
784
|
dispose() {
|
776
785
|
super.dispose();
|
package/2D/controls/image.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/image.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nimport { Control } from \"./control\";\r\nimport type { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport type { ICanvas, ICanvasRenderingContext, IImage } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/**\r\n * Class used to create 2D images\r\n */\r\nexport class Image extends Control {\r\n /**\r\n * Specifies an alternate text for the image, if the image for some reason cannot be displayed.\r\n */\r\n public alt?: string;\r\n\r\n private _workingCanvas: Nullable<ICanvas> = null;\r\n\r\n private _domImage: IImage;\r\n private _imageWidth: number;\r\n private _imageHeight: number;\r\n private _loaded = false;\r\n private _stretch = Image.STRETCH_FILL;\r\n private _source: Nullable<string>;\r\n private _autoScale = false;\r\n\r\n private _sourceLeft = 0;\r\n private _sourceTop = 0;\r\n private _sourceWidth = 0;\r\n private _sourceHeight = 0;\r\n private _svgAttributesComputationCompleted: boolean = false;\r\n private _isSVG: boolean = false;\r\n\r\n private _cellWidth: number = 0;\r\n private _cellHeight: number = 0;\r\n private _cellId: number = -1;\r\n\r\n private _sliceLeft: number;\r\n private _sliceRight: number;\r\n private _sliceTop: number;\r\n private _sliceBottom: number;\r\n\r\n private _populateNinePatchSlicesFromImage = false;\r\n\r\n private _detectPointerOnOpaqueOnly: boolean;\r\n\r\n private _imageDataCache: {\r\n data: Uint8ClampedArray | null;\r\n key: string;\r\n } = { data: null, key: \"\" };\r\n\r\n /**\r\n * Cache of images to avoid loading the same image multiple times\r\n */\r\n public static SourceImgCache = new Map<string, { img: IImage; timesUsed: number; loaded: boolean; waitingForLoadCallback: Array<() => void> }>();\r\n\r\n /**\r\n * Observable notified when the content is loaded\r\n */\r\n public onImageLoadedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Observable notified when _sourceLeft, _sourceTop, _sourceWidth and _sourceHeight are computed\r\n */\r\n public onSVGAttributesComputedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Gets or sets the referrer policy to apply on the img element load request.\r\n * You should set referrerPolicy before set the source of the image if you want to ensure the header will be present on the xhr loading request\r\n */\r\n public referrerPolicy: Nullable<ReferrerPolicy>;\r\n\r\n /**\r\n * Gets a boolean indicating that the content is loaded\r\n */\r\n public get isLoaded(): boolean {\r\n return this._loaded;\r\n }\r\n\r\n public override isReady(): boolean {\r\n return this.isLoaded;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if pointers should only be validated on pixels with alpha > 0.\r\n * Beware using this as this will consume more memory as the image has to be stored twice\r\n */\r\n @serialize()\r\n public get detectPointerOnOpaqueOnly(): boolean {\r\n return this._detectPointerOnOpaqueOnly;\r\n }\r\n\r\n public set detectPointerOnOpaqueOnly(value: boolean) {\r\n if (this._detectPointerOnOpaqueOnly === value) {\r\n return;\r\n }\r\n\r\n this._detectPointerOnOpaqueOnly = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the left value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceLeft(): number {\r\n return this._sliceLeft;\r\n }\r\n\r\n public set sliceLeft(value: number) {\r\n if (this._sliceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sliceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the right value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceRight(): number {\r\n return this._sliceRight;\r\n }\r\n\r\n public set sliceRight(value: number) {\r\n if (this._sliceRight === value) {\r\n return;\r\n }\r\n\r\n this._sliceRight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceTop(): number {\r\n return this._sliceTop;\r\n }\r\n\r\n public set sliceTop(value: number) {\r\n if (this._sliceTop === value) {\r\n return;\r\n }\r\n\r\n this._sliceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the bottom value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceBottom(): number {\r\n return this._sliceBottom;\r\n }\r\n\r\n public set sliceBottom(value: number) {\r\n if (this._sliceBottom === value) {\r\n return;\r\n }\r\n\r\n this._sliceBottom = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the left coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceLeft(): number {\r\n return this._sourceLeft;\r\n }\r\n\r\n public set sourceLeft(value: number) {\r\n if (this._sourceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sourceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceTop(): number {\r\n return this._sourceTop;\r\n }\r\n\r\n public set sourceTop(value: number) {\r\n if (this._sourceTop === value) {\r\n return;\r\n }\r\n\r\n this._sourceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the width to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceWidth(): number {\r\n return this._sourceWidth;\r\n }\r\n\r\n public set sourceWidth(value: number) {\r\n if (this._sourceWidth === value) {\r\n return;\r\n }\r\n\r\n this._sourceWidth = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the height to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceHeight(): number {\r\n return this._sourceHeight;\r\n }\r\n\r\n public set sourceHeight(value: number) {\r\n if (this._sourceHeight === value) {\r\n return;\r\n }\r\n\r\n this._sourceHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image width\r\n */\r\n public get imageWidth(): number {\r\n return this._imageWidth;\r\n }\r\n\r\n /**\r\n * Gets the image height\r\n */\r\n public get imageHeight(): number {\r\n return this._imageHeight;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if nine patch slices (left, top, right, bottom) should be read from image data\r\n */\r\n @serialize()\r\n public get populateNinePatchSlicesFromImage(): boolean {\r\n return this._populateNinePatchSlicesFromImage;\r\n }\r\n\r\n public set populateNinePatchSlicesFromImage(value: boolean) {\r\n if (this._populateNinePatchSlicesFromImage === value) {\r\n return;\r\n }\r\n\r\n this._populateNinePatchSlicesFromImage = value;\r\n\r\n if (this._populateNinePatchSlicesFromImage && this._loaded) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n }\r\n\r\n /** Indicates if the format of the image is SVG */\r\n public get isSVG(): boolean {\r\n return this._isSVG;\r\n }\r\n\r\n /** Gets the status of the SVG attributes computation (sourceLeft, sourceTop, sourceWidth, sourceHeight) */\r\n public get svgAttributesComputationCompleted(): boolean {\r\n return this._svgAttributesComputationCompleted;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the image can force its container to adapt its size\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n public get autoScale(): boolean {\r\n return this._autoScale;\r\n }\r\n\r\n public set autoScale(value: boolean) {\r\n if (this._autoScale === value) {\r\n return;\r\n }\r\n\r\n this._autoScale = value;\r\n\r\n if (value && this._loaded) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n }\r\n\r\n /** Gets or sets the stretching mode used by the image */\r\n @serialize()\r\n public get stretch(): number {\r\n return this._stretch;\r\n }\r\n\r\n public set stretch(value: number) {\r\n if (this._stretch === value) {\r\n return;\r\n }\r\n\r\n this._stretch = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rotate90(n: number, preserveProperties: boolean = false): Image {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n const canvas = engine.createCanvas(height, width);\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.translate(canvas.width / 2, canvas.height / 2);\r\n context.rotate((n * Math.PI) / 2);\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height, -width / 2, -height / 2, width, height);\r\n\r\n const dataUrl: string = canvas.toDataURL(\"image/jpg\");\r\n const rotatedImage = new Image(this.name + \"rotated\", dataUrl);\r\n\r\n if (preserveProperties) {\r\n rotatedImage._stretch = this._stretch;\r\n rotatedImage._autoScale = this._autoScale;\r\n rotatedImage._cellId = this._cellId;\r\n rotatedImage._cellWidth = n % 1 ? this._cellHeight : this._cellWidth;\r\n rotatedImage._cellHeight = n % 1 ? this._cellWidth : this._cellHeight;\r\n }\r\n\r\n this._handleRotationForSVGImage(this, rotatedImage, n);\r\n\r\n this._imageDataCache.data = null;\r\n\r\n return rotatedImage;\r\n }\r\n\r\n private _handleRotationForSVGImage(srcImage: Image, dstImage: Image, n: number): void {\r\n if (!srcImage._isSVG) {\r\n return;\r\n }\r\n\r\n if (srcImage._svgAttributesComputationCompleted) {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n } else {\r\n srcImage.onSVGAttributesComputedObservable.addOnce(() => {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n });\r\n }\r\n }\r\n\r\n private _rotate90SourceProperties(srcImage: Image, dstImage: Image, n: number): void {\r\n let srcLeft = srcImage.sourceLeft,\r\n srcTop = srcImage.sourceTop,\r\n srcWidth = srcImage.domImage.width,\r\n srcHeight = srcImage.domImage.height;\r\n\r\n let dstLeft = srcLeft,\r\n dstTop = srcTop,\r\n dstWidth = srcImage.sourceWidth,\r\n dstHeight = srcImage.sourceHeight;\r\n\r\n if (n != 0) {\r\n const mult = n < 0 ? -1 : 1;\r\n n = n % 4;\r\n for (let i = 0; i < Math.abs(n); ++i) {\r\n dstLeft = -(srcTop - srcHeight / 2) * mult + srcHeight / 2;\r\n dstTop = (srcLeft - srcWidth / 2) * mult + srcWidth / 2;\r\n [dstWidth, dstHeight] = [dstHeight, dstWidth];\r\n if (n < 0) {\r\n dstTop -= dstHeight;\r\n } else {\r\n dstLeft -= dstWidth;\r\n }\r\n srcLeft = dstLeft;\r\n srcTop = dstTop;\r\n [srcWidth, srcHeight] = [srcHeight, srcWidth];\r\n }\r\n }\r\n\r\n dstImage.sourceLeft = dstLeft;\r\n dstImage.sourceTop = dstTop;\r\n dstImage.sourceWidth = dstWidth;\r\n dstImage.sourceHeight = dstHeight;\r\n }\r\n\r\n private _extractNinePatchSliceDataFromImage() {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height);\r\n const imageData = context.getImageData(0, 0, width, height);\r\n\r\n // Left and right\r\n this._sliceLeft = -1;\r\n this._sliceRight = -1;\r\n for (let x = 0; x < width; x++) {\r\n const alpha = imageData.data[x * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceLeft === -1) {\r\n this._sliceLeft = x;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceLeft > -1) {\r\n this._sliceRight = x;\r\n break;\r\n }\r\n }\r\n\r\n // top and bottom\r\n this._sliceTop = -1;\r\n this._sliceBottom = -1;\r\n for (let y = 0; y < height; y++) {\r\n const alpha = imageData.data[y * width * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceTop === -1) {\r\n this._sliceTop = y;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceTop > -1) {\r\n this._sliceBottom = y;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the internal DOM image used to render the control\r\n */\r\n public set domImage(value: IImage) {\r\n this._domImage = value;\r\n this._loaded = false;\r\n this._imageDataCache.data = null;\r\n\r\n if (this._domImage.width) {\r\n this._onImageLoaded();\r\n } else {\r\n this._domImage.onload = () => {\r\n this._onImageLoaded();\r\n };\r\n }\r\n }\r\n\r\n public get domImage(): IImage {\r\n return this._domImage;\r\n }\r\n\r\n private _onImageLoaded(): void {\r\n this._imageDataCache.data = null;\r\n this._imageWidth = this._domImage.width;\r\n this._imageHeight = this._domImage.height;\r\n this._loaded = true;\r\n\r\n if (this._populateNinePatchSlicesFromImage) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n\r\n this.onImageLoadedObservable.notifyObservers(this);\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image source url\r\n */\r\n @serialize()\r\n public get source() {\r\n return this._source;\r\n }\r\n\r\n /**\r\n * Resets the internal Image Element cache. Can reduce memory usage.\r\n */\r\n public static ResetImageCache() {\r\n Image.SourceImgCache.clear();\r\n }\r\n\r\n private _removeCacheUsage(source: Nullable<string>) {\r\n const value = source && Image.SourceImgCache.get(source);\r\n if (value) {\r\n value.timesUsed -= 1;\r\n // Since the image isn't being used anymore, we can clean it from the cache\r\n if (value.timesUsed === 0) {\r\n Image.SourceImgCache.delete(source);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets image source url\r\n */\r\n public set source(value: Nullable<string>) {\r\n if (this._urlRewriter && value) {\r\n value = this._urlRewriter(value);\r\n }\r\n\r\n if (this._source === value) {\r\n return;\r\n }\r\n\r\n this._removeCacheUsage(this._source);\r\n\r\n this._loaded = false;\r\n this._source = value;\r\n this._imageDataCache.data = null;\r\n\r\n if (value) {\r\n value = this._svgCheck(value);\r\n }\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n if (value && Image.SourceImgCache.has(value)) {\r\n const cachedData = Image.SourceImgCache.get(value)!;\r\n this._domImage = cachedData.img;\r\n cachedData.timesUsed += 1;\r\n if (cachedData.loaded) {\r\n this._onImageLoaded();\r\n } else {\r\n cachedData.waitingForLoadCallback.push(this._onImageLoaded.bind(this));\r\n }\r\n return;\r\n }\r\n this._domImage = engine.createCanvasImage();\r\n if (value) {\r\n Image.SourceImgCache.set(value, { img: this._domImage, timesUsed: 1, loaded: false, waitingForLoadCallback: [this._onImageLoaded.bind(this)] });\r\n }\r\n\r\n this._domImage.onload = () => {\r\n if (value) {\r\n const cachedData = Image.SourceImgCache.get(value);\r\n if (cachedData) {\r\n cachedData.loaded = true;\r\n for (const waitingCallback of cachedData.waitingForLoadCallback) {\r\n waitingCallback();\r\n }\r\n cachedData.waitingForLoadCallback.length = 0;\r\n return;\r\n }\r\n }\r\n this._onImageLoaded();\r\n };\r\n if (value) {\r\n Tools.SetCorsBehavior(value, this._domImage);\r\n Tools.SetReferrerPolicyBehavior(this.referrerPolicy, this._domImage);\r\n this._domImage.src = value;\r\n }\r\n }\r\n\r\n /**\r\n * Checks for svg document with icon id present\r\n * @param value the source svg\r\n * @returns the svg\r\n */\r\n private _svgCheck(value: string): string {\r\n if (window.SVGSVGElement && value.search(/.svg#/gi) !== -1 && value.indexOf(\"#\") === value.lastIndexOf(\"#\")) {\r\n this._isSVG = true;\r\n const svgsrc = value.split(\"#\")[0];\r\n const elemid = value.split(\"#\")[1];\r\n // check if object alr exist in document\r\n const svgExist = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgExist) {\r\n const svgDoc = svgExist.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n const elem = <SVGGraphicsElement>(<unknown>svgDoc.getElementById(elemid));\r\n if (elem && vb && docwidth && docheight) {\r\n this._getSVGAttribs(svgExist, elemid);\r\n return value;\r\n }\r\n }\r\n\r\n // wait for object to load\r\n svgExist.addEventListener(\"load\", () => {\r\n this._getSVGAttribs(svgExist, elemid);\r\n });\r\n } else {\r\n // create document object\r\n const svgImage = document.createElement(\"object\");\r\n svgImage.data = svgsrc;\r\n svgImage.type = \"image/svg+xml\";\r\n svgImage.width = \"0%\";\r\n svgImage.height = \"0%\";\r\n document.body.appendChild(svgImage);\r\n // when the object has loaded, get the element attribs\r\n svgImage.onload = () => {\r\n const svgobj = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgobj) {\r\n this._getSVGAttribs(svgobj, elemid);\r\n }\r\n };\r\n }\r\n return svgsrc;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets sourceLeft, sourceTop, sourceWidth, sourceHeight automatically\r\n * given external svg file and icon id\r\n * @param svgsrc\r\n * @param elemid\r\n */\r\n private _getSVGAttribs(svgsrc: HTMLObjectElement, elemid: string) {\r\n const svgDoc = svgsrc.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n // get element bbox and matrix transform\r\n const elem = svgDoc.getElementById(elemid) as Nullable<SVGGraphicsElement>;\r\n if (vb && docwidth && docheight && elem) {\r\n const vb_width = Number(vb.split(\" \")[2]);\r\n const vb_height = Number(vb.split(\" \")[3]);\r\n const elem_bbox = elem.getBBox();\r\n let elem_matrix_a = 1;\r\n let elem_matrix_d = 1;\r\n let elem_matrix_e = 0;\r\n let elem_matrix_f = 0;\r\n const mainMatrix = elem.transform.baseVal.consolidate()!.matrix;\r\n if (elem.transform && elem.transform.baseVal.consolidate()) {\r\n elem_matrix_a = mainMatrix.a;\r\n elem_matrix_d = mainMatrix.d;\r\n elem_matrix_e = mainMatrix.e;\r\n elem_matrix_f = mainMatrix.f;\r\n }\r\n\r\n // compute source coordinates and dimensions\r\n this.sourceLeft = ((elem_matrix_a * elem_bbox.x + elem_matrix_e) * docwidth) / vb_width;\r\n this.sourceTop = ((elem_matrix_d * elem_bbox.y + elem_matrix_f) * docheight) / vb_height;\r\n this.sourceWidth = elem_bbox.width * elem_matrix_a * (docwidth / vb_width);\r\n this.sourceHeight = elem_bbox.height * elem_matrix_d * (docheight / vb_height);\r\n this._svgAttributesComputationCompleted = true;\r\n this.onSVGAttributesComputedObservable.notifyObservers(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the cell width to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellWidth(): number {\r\n return this._cellWidth;\r\n }\r\n set cellWidth(value: number) {\r\n if (this._cellWidth === value) {\r\n return;\r\n }\r\n\r\n this._cellWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell height to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellHeight(): number {\r\n return this._cellHeight;\r\n }\r\n set cellHeight(value: number) {\r\n if (this._cellHeight === value) {\r\n return;\r\n }\r\n\r\n this._cellHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell id to use (this will turn on the animation sheet mode)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellId(): number {\r\n return this._cellId;\r\n }\r\n set cellId(value: number) {\r\n if (this._cellId === value) {\r\n return;\r\n }\r\n\r\n this._cellId = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new Image\r\n * @param name defines the control name\r\n * @param url defines the image url\r\n */\r\n constructor(\r\n public override name?: string,\r\n url: Nullable<string> = null\r\n ) {\r\n super(name);\r\n this.source = url;\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public override contains(x: number, y: number): boolean {\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (!this._detectPointerOnOpaqueOnly || !this._workingCanvas) {\r\n return true;\r\n }\r\n\r\n const width = this._currentMeasure.width | 0;\r\n const height = this._currentMeasure.height | 0;\r\n const key = width + \"_\" + height;\r\n\r\n let imageData = this._imageDataCache.data;\r\n\r\n if (!imageData || this._imageDataCache.key !== key) {\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n this._imageDataCache.data = imageData = context.getImageData(0, 0, width, height).data;\r\n this._imageDataCache.key = key;\r\n }\r\n\r\n x = (x - this._currentMeasure.left) | 0;\r\n y = (y - this._currentMeasure.top) | 0;\r\n\r\n const pickedPixel = imageData[(x + y * width) * 4 + 3];\r\n\r\n return pickedPixel > 0;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Image\";\r\n }\r\n\r\n /** Force the control to synchronize with its content */\r\n public synchronizeSizeWithContent() {\r\n if (!this._loaded) {\r\n return;\r\n }\r\n\r\n this.width = this._domImage.width + \"px\";\r\n this.height = this._domImage.height + \"px\";\r\n }\r\n\r\n protected override _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n break;\r\n case Image.STRETCH_FILL:\r\n break;\r\n case Image.STRETCH_UNIFORM:\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n break;\r\n case Image.STRETCH_EXTEND:\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n if (this.parent && this.parent.parent) {\r\n // Will update root size if root is not the top root\r\n this.parent.adaptWidthToChildren = true;\r\n this.parent.adaptHeightToChildren = true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n super._processMeasures(parentMeasure, context);\r\n }\r\n\r\n private _prepareWorkingCanvasForOpaqueDetection() {\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.clearRect(0, 0, width, height);\r\n }\r\n\r\n private _drawImage(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number, tx: number, ty: number, tw: number, th: number) {\r\n context.drawImage(this._domImage, sx, sy, sw, sh, tx, ty, tw, th);\r\n\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const transform = context.getTransform();\r\n\r\n const canvas = this._workingCanvas!;\r\n const workingCanvasContext = canvas.getContext(\"2d\")!;\r\n workingCanvasContext.save();\r\n const ttx = tx - this._currentMeasure.left;\r\n const tty = ty - this._currentMeasure.top;\r\n workingCanvasContext.setTransform(transform.a, transform.b, transform.c, transform.d, (ttx + tw) / 2, (tty + th) / 2);\r\n workingCanvasContext.translate(-(ttx + tw) / 2, -(tty + th) / 2);\r\n\r\n workingCanvasContext.drawImage(this._domImage, sx, sy, sw, sh, ttx, tty, tw, th);\r\n workingCanvasContext.restore();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n let x, y, width, height;\r\n if (this.cellId == -1) {\r\n x = this._sourceLeft;\r\n y = this._sourceTop;\r\n\r\n width = this._sourceWidth ? this._sourceWidth : this._imageWidth;\r\n height = this._sourceHeight ? this._sourceHeight : this._imageHeight;\r\n } else {\r\n const rowCount = this._domImage.naturalWidth / this.cellWidth;\r\n const column = (this.cellId / rowCount) >> 0;\r\n const row = this.cellId % rowCount;\r\n\r\n x = this.cellWidth * row;\r\n y = this.cellHeight * column;\r\n width = this.cellWidth;\r\n height = this.cellHeight;\r\n }\r\n\r\n this._prepareWorkingCanvasForOpaqueDetection();\r\n\r\n this._applyStates(context);\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_FILL:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_UNIFORM: {\r\n const hRatio = this._currentMeasure.width / width;\r\n const vRatio = this._currentMeasure.height / height;\r\n const ratio = Math.min(hRatio, vRatio);\r\n const centerX = (this._currentMeasure.width - width * ratio) / 2;\r\n const centerY = (this._currentMeasure.height - height * ratio) / 2;\r\n\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left + centerX, this._currentMeasure.top + centerY, width * ratio, height * ratio);\r\n break;\r\n }\r\n case Image.STRETCH_EXTEND:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n this._renderNinePatch(context, x, y, width, height);\r\n break;\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n private _renderNinePatch(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number): void {\r\n const leftWidth = this._sliceLeft;\r\n const topHeight = this._sliceTop;\r\n const bottomHeight = sh - this._sliceBottom;\r\n const rightWidth = sw - this._sliceRight;\r\n const centerWidth = this._sliceRight - this._sliceLeft;\r\n const centerHeight = this._sliceBottom - this._sliceTop;\r\n const targetCenterWidth = this._currentMeasure.width - rightWidth - leftWidth + 2;\r\n const targetCenterHeight = this._currentMeasure.height - bottomHeight - topHeight + 2;\r\n const centerLeftOffset = this._currentMeasure.left + leftWidth - 1;\r\n const centerTopOffset = this._currentMeasure.top + topHeight - 1;\r\n const rightOffset = this._currentMeasure.left + this._currentMeasure.width - rightWidth;\r\n const bottomOffset = this._currentMeasure.top + this._currentMeasure.height - bottomHeight;\r\n\r\n //Top Left\r\n this._drawImage(context, sx, sy, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top, leftWidth, topHeight);\r\n //Top\r\n this._drawImage(context, sx + this._sliceLeft, sy, centerWidth, topHeight, centerLeftOffset + 1, this._currentMeasure.top, targetCenterWidth - 2, topHeight);\r\n //Top Right\r\n this._drawImage(context, sx + this._sliceRight, sy, rightWidth, topHeight, rightOffset, this._currentMeasure.top, rightWidth, topHeight);\r\n //Left\r\n this._drawImage(context, sx, sy + this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset + 1, leftWidth, targetCenterHeight - 2);\r\n // Center\r\n this._drawImage(context, sx + this._sliceLeft, sy + this._sliceTop, centerWidth, centerHeight, centerLeftOffset, centerTopOffset, targetCenterWidth, targetCenterHeight);\r\n //Right\r\n this._drawImage(context, sx + this._sliceRight, sy + this._sliceTop, rightWidth, centerHeight, rightOffset, centerTopOffset + 1, rightWidth, targetCenterHeight - 2);\r\n //Bottom Left\r\n this._drawImage(context, sx, sy + this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset, leftWidth, bottomHeight);\r\n //Bottom\r\n this._drawImage(context, sx + this.sliceLeft, sy + this._sliceBottom, centerWidth, bottomHeight, centerLeftOffset + 1, bottomOffset, targetCenterWidth - 2, bottomHeight);\r\n //Bottom Right\r\n this._drawImage(context, sx + this._sliceRight, sy + this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset, rightWidth, bottomHeight);\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n this.onImageLoadedObservable.clear();\r\n this.onSVGAttributesComputedObservable.clear();\r\n this._removeCacheUsage(this._source);\r\n }\r\n\r\n // Static\r\n /** STRETCH_NONE */\r\n public static readonly STRETCH_NONE = 0;\r\n /** STRETCH_FILL */\r\n public static readonly STRETCH_FILL = 1;\r\n /** STRETCH_UNIFORM */\r\n public static readonly STRETCH_UNIFORM = 2;\r\n /** STRETCH_EXTEND */\r\n public static readonly STRETCH_EXTEND = 3;\r\n /** NINE_PATCH */\r\n public static readonly STRETCH_NINE_PATCH = 4;\r\n}\r\nRegisterClass(\"BABYLON.GUI.Image\", Image);\r\n"]}
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/image.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nimport { Control } from \"./control\";\r\nimport type { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport type { ICanvas, ICanvasRenderingContext, IImage } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/**\r\n * Class used to create 2D images\r\n */\r\nexport class Image extends Control {\r\n /**\r\n * Specifies an alternate text for the image, if the image for some reason cannot be displayed.\r\n */\r\n public alt?: string;\r\n\r\n private _workingCanvas: Nullable<ICanvas> = null;\r\n\r\n private _domImage: IImage;\r\n private _imageWidth: number;\r\n private _imageHeight: number;\r\n private _loaded = false;\r\n private _stretch = Image.STRETCH_FILL;\r\n private _source: Nullable<string>;\r\n private _autoScale = false;\r\n\r\n private _sourceLeft = 0;\r\n private _sourceTop = 0;\r\n private _sourceWidth = 0;\r\n private _sourceHeight = 0;\r\n private _svgAttributesComputationCompleted: boolean = false;\r\n private _isSVG: boolean = false;\r\n\r\n private _cellWidth: number = 0;\r\n private _cellHeight: number = 0;\r\n private _cellId: number = -1;\r\n\r\n private _sliceLeft: number;\r\n private _sliceRight: number;\r\n private _sliceTop: number;\r\n private _sliceBottom: number;\r\n\r\n private _populateNinePatchSlicesFromImage = false;\r\n\r\n private _detectPointerOnOpaqueOnly: boolean;\r\n\r\n private _imageDataCache: {\r\n data: Uint8ClampedArray | null;\r\n key: string;\r\n } = { data: null, key: \"\" };\r\n\r\n /**\r\n * Cache of images to avoid loading the same image multiple times\r\n */\r\n public static SourceImgCache = new Map<string, { img: IImage; timesUsed: number; loaded: boolean; waitingForLoadCallback: Array<() => void> }>();\r\n\r\n /**\r\n * Observable notified when the content is loaded\r\n */\r\n public onImageLoadedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Observable notified when _sourceLeft, _sourceTop, _sourceWidth and _sourceHeight are computed\r\n */\r\n public onSVGAttributesComputedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Gets or sets the referrer policy to apply on the img element load request.\r\n * You should set referrerPolicy before set the source of the image if you want to ensure the header will be present on the xhr loading request\r\n */\r\n public referrerPolicy: Nullable<ReferrerPolicy>;\r\n\r\n /**\r\n * Gets a boolean indicating that the content is loaded\r\n */\r\n public get isLoaded(): boolean {\r\n return this._loaded;\r\n }\r\n\r\n public override isReady(): boolean {\r\n return this.isLoaded;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if pointers should only be validated on pixels with alpha > 0.\r\n * Beware using this as this will consume more memory as the image has to be stored twice\r\n */\r\n @serialize()\r\n public get detectPointerOnOpaqueOnly(): boolean {\r\n return this._detectPointerOnOpaqueOnly;\r\n }\r\n\r\n public set detectPointerOnOpaqueOnly(value: boolean) {\r\n if (this._detectPointerOnOpaqueOnly === value) {\r\n return;\r\n }\r\n\r\n this._detectPointerOnOpaqueOnly = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the left value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceLeft(): number {\r\n return this._sliceLeft;\r\n }\r\n\r\n public set sliceLeft(value: number) {\r\n if (this._sliceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sliceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the right value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceRight(): number {\r\n return this._sliceRight;\r\n }\r\n\r\n public set sliceRight(value: number) {\r\n if (this._sliceRight === value) {\r\n return;\r\n }\r\n\r\n this._sliceRight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceTop(): number {\r\n return this._sliceTop;\r\n }\r\n\r\n public set sliceTop(value: number) {\r\n if (this._sliceTop === value) {\r\n return;\r\n }\r\n\r\n this._sliceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the bottom value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceBottom(): number {\r\n return this._sliceBottom;\r\n }\r\n\r\n public set sliceBottom(value: number) {\r\n if (this._sliceBottom === value) {\r\n return;\r\n }\r\n\r\n this._sliceBottom = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the left coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceLeft(): number {\r\n return this._sourceLeft;\r\n }\r\n\r\n public set sourceLeft(value: number) {\r\n if (this._sourceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sourceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceTop(): number {\r\n return this._sourceTop;\r\n }\r\n\r\n public set sourceTop(value: number) {\r\n if (this._sourceTop === value) {\r\n return;\r\n }\r\n\r\n this._sourceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the width to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceWidth(): number {\r\n return this._sourceWidth;\r\n }\r\n\r\n public set sourceWidth(value: number) {\r\n if (this._sourceWidth === value) {\r\n return;\r\n }\r\n\r\n this._sourceWidth = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the height to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceHeight(): number {\r\n return this._sourceHeight;\r\n }\r\n\r\n public set sourceHeight(value: number) {\r\n if (this._sourceHeight === value) {\r\n return;\r\n }\r\n\r\n this._sourceHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image width\r\n */\r\n public get imageWidth(): number {\r\n return this._imageWidth;\r\n }\r\n\r\n /**\r\n * Gets the image height\r\n */\r\n public get imageHeight(): number {\r\n return this._imageHeight;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if nine patch slices (left, top, right, bottom) should be read from image data\r\n */\r\n @serialize()\r\n public get populateNinePatchSlicesFromImage(): boolean {\r\n return this._populateNinePatchSlicesFromImage;\r\n }\r\n\r\n public set populateNinePatchSlicesFromImage(value: boolean) {\r\n if (this._populateNinePatchSlicesFromImage === value) {\r\n return;\r\n }\r\n\r\n this._populateNinePatchSlicesFromImage = value;\r\n\r\n if (this._populateNinePatchSlicesFromImage && this._loaded) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n }\r\n\r\n /** Indicates if the format of the image is SVG */\r\n public get isSVG(): boolean {\r\n return this._isSVG;\r\n }\r\n\r\n /** Gets the status of the SVG attributes computation (sourceLeft, sourceTop, sourceWidth, sourceHeight) */\r\n public get svgAttributesComputationCompleted(): boolean {\r\n return this._svgAttributesComputationCompleted;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the image can force its container to adapt its size\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n public get autoScale(): boolean {\r\n return this._autoScale;\r\n }\r\n\r\n public set autoScale(value: boolean) {\r\n if (this._autoScale === value) {\r\n return;\r\n }\r\n\r\n this._autoScale = value;\r\n\r\n if (value && this._loaded) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n }\r\n\r\n /** Gets or sets the stretching mode used by the image */\r\n @serialize()\r\n public get stretch(): number {\r\n return this._stretch;\r\n }\r\n\r\n public set stretch(value: number) {\r\n if (this._stretch === value) {\r\n return;\r\n }\r\n\r\n this._stretch = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rotate90(n: number, preserveProperties: boolean = false): Image {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n const canvas = engine.createCanvas(height, width);\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.translate(canvas.width / 2, canvas.height / 2);\r\n context.rotate((n * Math.PI) / 2);\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height, -width / 2, -height / 2, width, height);\r\n\r\n const dataUrl: string = canvas.toDataURL(\"image/jpg\");\r\n const rotatedImage = new Image(this.name + \"rotated\", dataUrl);\r\n\r\n if (preserveProperties) {\r\n rotatedImage._stretch = this._stretch;\r\n rotatedImage._autoScale = this._autoScale;\r\n rotatedImage._cellId = this._cellId;\r\n rotatedImage._cellWidth = n % 1 ? this._cellHeight : this._cellWidth;\r\n rotatedImage._cellHeight = n % 1 ? this._cellWidth : this._cellHeight;\r\n }\r\n\r\n this._handleRotationForSVGImage(this, rotatedImage, n);\r\n\r\n this._imageDataCache.data = null;\r\n\r\n return rotatedImage;\r\n }\r\n\r\n private _handleRotationForSVGImage(srcImage: Image, dstImage: Image, n: number): void {\r\n if (!srcImage._isSVG) {\r\n return;\r\n }\r\n\r\n if (srcImage._svgAttributesComputationCompleted) {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n } else {\r\n srcImage.onSVGAttributesComputedObservable.addOnce(() => {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n });\r\n }\r\n }\r\n\r\n private _rotate90SourceProperties(srcImage: Image, dstImage: Image, n: number): void {\r\n let srcLeft = srcImage.sourceLeft,\r\n srcTop = srcImage.sourceTop,\r\n srcWidth = srcImage.domImage.width,\r\n srcHeight = srcImage.domImage.height;\r\n\r\n let dstLeft = srcLeft,\r\n dstTop = srcTop,\r\n dstWidth = srcImage.sourceWidth,\r\n dstHeight = srcImage.sourceHeight;\r\n\r\n if (n != 0) {\r\n const mult = n < 0 ? -1 : 1;\r\n n = n % 4;\r\n for (let i = 0; i < Math.abs(n); ++i) {\r\n dstLeft = -(srcTop - srcHeight / 2) * mult + srcHeight / 2;\r\n dstTop = (srcLeft - srcWidth / 2) * mult + srcWidth / 2;\r\n [dstWidth, dstHeight] = [dstHeight, dstWidth];\r\n if (n < 0) {\r\n dstTop -= dstHeight;\r\n } else {\r\n dstLeft -= dstWidth;\r\n }\r\n srcLeft = dstLeft;\r\n srcTop = dstTop;\r\n [srcWidth, srcHeight] = [srcHeight, srcWidth];\r\n }\r\n }\r\n\r\n dstImage.sourceLeft = dstLeft;\r\n dstImage.sourceTop = dstTop;\r\n dstImage.sourceWidth = dstWidth;\r\n dstImage.sourceHeight = dstHeight;\r\n }\r\n\r\n private _extractNinePatchSliceDataFromImage() {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height);\r\n const imageData = context.getImageData(0, 0, width, height);\r\n\r\n // Left and right\r\n this._sliceLeft = -1;\r\n this._sliceRight = -1;\r\n for (let x = 0; x < width; x++) {\r\n const alpha = imageData.data[x * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceLeft === -1) {\r\n this._sliceLeft = x;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceLeft > -1) {\r\n this._sliceRight = x;\r\n break;\r\n }\r\n }\r\n\r\n // top and bottom\r\n this._sliceTop = -1;\r\n this._sliceBottom = -1;\r\n for (let y = 0; y < height; y++) {\r\n const alpha = imageData.data[y * width * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceTop === -1) {\r\n this._sliceTop = y;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceTop > -1) {\r\n this._sliceBottom = y;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the internal DOM image used to render the control\r\n */\r\n public set domImage(value: IImage) {\r\n this._domImage = value;\r\n this._loaded = false;\r\n this._imageDataCache.data = null;\r\n\r\n if (this._domImage.width) {\r\n this._onImageLoaded();\r\n } else {\r\n this._domImage.onload = () => {\r\n this._onImageLoaded();\r\n };\r\n }\r\n }\r\n\r\n public get domImage(): IImage {\r\n return this._domImage;\r\n }\r\n\r\n private _onImageLoaded(): void {\r\n this._imageDataCache.data = null;\r\n this._imageWidth = this._domImage.width;\r\n this._imageHeight = this._domImage.height;\r\n this._loaded = true;\r\n\r\n if (this._populateNinePatchSlicesFromImage) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n\r\n this.onImageLoadedObservable.notifyObservers(this);\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image source url\r\n */\r\n @serialize()\r\n public get source() {\r\n return this._source;\r\n }\r\n\r\n /**\r\n * Resets the internal Image Element cache. Can reduce memory usage.\r\n */\r\n public static ResetImageCache() {\r\n Image.SourceImgCache.clear();\r\n }\r\n\r\n private _removeCacheUsage(source: Nullable<string>) {\r\n const value = source && Image.SourceImgCache.get(source);\r\n if (value) {\r\n value.timesUsed -= 1;\r\n // Since the image isn't being used anymore, we can clean it from the cache\r\n if (value.timesUsed === 0) {\r\n Image.SourceImgCache.delete(source);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets image source url\r\n */\r\n public set source(value: Nullable<string>) {\r\n if (this._urlRewriter && value) {\r\n value = this._urlRewriter(value);\r\n }\r\n\r\n if (this._source === value) {\r\n return;\r\n }\r\n\r\n this._removeCacheUsage(this._source);\r\n\r\n this._loaded = false;\r\n this._source = value;\r\n this._imageDataCache.data = null;\r\n\r\n if (value) {\r\n value = this._svgCheck(value);\r\n }\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n if (value && Image.SourceImgCache.has(value)) {\r\n const cachedData = Image.SourceImgCache.get(value)!;\r\n this._domImage = cachedData.img;\r\n cachedData.timesUsed += 1;\r\n if (cachedData.loaded) {\r\n this._onImageLoaded();\r\n } else {\r\n cachedData.waitingForLoadCallback.push(this._onImageLoaded.bind(this));\r\n }\r\n return;\r\n }\r\n this._domImage = engine.createCanvasImage();\r\n if (value) {\r\n Image.SourceImgCache.set(value, { img: this._domImage, timesUsed: 1, loaded: false, waitingForLoadCallback: [this._onImageLoaded.bind(this)] });\r\n }\r\n\r\n this._domImage.onload = () => {\r\n if (value) {\r\n const cachedData = Image.SourceImgCache.get(value);\r\n if (cachedData) {\r\n cachedData.loaded = true;\r\n for (const waitingCallback of cachedData.waitingForLoadCallback) {\r\n waitingCallback();\r\n }\r\n cachedData.waitingForLoadCallback.length = 0;\r\n return;\r\n }\r\n }\r\n this._onImageLoaded();\r\n };\r\n if (value) {\r\n Tools.SetCorsBehavior(value, this._domImage);\r\n Tools.SetReferrerPolicyBehavior(this.referrerPolicy, this._domImage);\r\n this._domImage.src = value;\r\n }\r\n }\r\n\r\n /**\r\n * Checks for svg document with icon id present\r\n * @param value the source svg\r\n * @returns the svg\r\n */\r\n private _svgCheck(value: string): string {\r\n if (window.SVGSVGElement && value.search(/.svg#/gi) !== -1 && value.indexOf(\"#\") === value.lastIndexOf(\"#\")) {\r\n this._isSVG = true;\r\n const svgsrc = value.split(\"#\")[0];\r\n const elemid = value.split(\"#\")[1];\r\n // check if object alr exist in document\r\n const svgExist = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgExist) {\r\n const svgDoc = svgExist.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n const elem = <SVGGraphicsElement>(<unknown>svgDoc.getElementById(elemid));\r\n if (elem && vb && docwidth && docheight) {\r\n this._getSVGAttribs(svgExist, elemid);\r\n return value;\r\n }\r\n }\r\n\r\n // wait for object to load\r\n svgExist.addEventListener(\"load\", () => {\r\n this._getSVGAttribs(svgExist, elemid);\r\n });\r\n } else {\r\n // create document object\r\n const svgImage = document.createElement(\"object\");\r\n svgImage.data = svgsrc;\r\n svgImage.type = \"image/svg+xml\";\r\n svgImage.width = \"0%\";\r\n svgImage.height = \"0%\";\r\n document.body.appendChild(svgImage);\r\n // when the object has loaded, get the element attribs\r\n svgImage.onload = () => {\r\n const svgobj = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgobj) {\r\n this._getSVGAttribs(svgobj, elemid);\r\n }\r\n };\r\n }\r\n return svgsrc;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets sourceLeft, sourceTop, sourceWidth, sourceHeight automatically\r\n * given external svg file and icon id\r\n * @param svgsrc\r\n * @param elemid\r\n */\r\n private _getSVGAttribs(svgsrc: HTMLObjectElement, elemid: string) {\r\n const svgDoc = svgsrc.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n // get element bbox and matrix transform\r\n const elem = svgDoc.getElementById(elemid) as Nullable<SVGGraphicsElement>;\r\n if (vb && docwidth && docheight && elem) {\r\n const vb_width = Number(vb.split(\" \")[2]);\r\n const vb_height = Number(vb.split(\" \")[3]);\r\n const elem_bbox = elem.getBBox();\r\n let elem_matrix_a = 1;\r\n let elem_matrix_d = 1;\r\n let elem_matrix_e = 0;\r\n let elem_matrix_f = 0;\r\n const mainMatrix = elem.transform.baseVal.consolidate()!.matrix;\r\n if (elem.transform && elem.transform.baseVal.consolidate()) {\r\n elem_matrix_a = mainMatrix.a;\r\n elem_matrix_d = mainMatrix.d;\r\n elem_matrix_e = mainMatrix.e;\r\n elem_matrix_f = mainMatrix.f;\r\n }\r\n\r\n // compute source coordinates and dimensions\r\n this.sourceLeft = ((elem_matrix_a * elem_bbox.x + elem_matrix_e) * docwidth) / vb_width;\r\n this.sourceTop = ((elem_matrix_d * elem_bbox.y + elem_matrix_f) * docheight) / vb_height;\r\n this.sourceWidth = elem_bbox.width * elem_matrix_a * (docwidth / vb_width);\r\n this.sourceHeight = elem_bbox.height * elem_matrix_d * (docheight / vb_height);\r\n this._svgAttributesComputationCompleted = true;\r\n this.onSVGAttributesComputedObservable.notifyObservers(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the cell width to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellWidth(): number {\r\n return this._cellWidth;\r\n }\r\n set cellWidth(value: number) {\r\n if (this._cellWidth === value) {\r\n return;\r\n }\r\n\r\n this._cellWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell height to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellHeight(): number {\r\n return this._cellHeight;\r\n }\r\n set cellHeight(value: number) {\r\n if (this._cellHeight === value) {\r\n return;\r\n }\r\n\r\n this._cellHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell id to use (this will turn on the animation sheet mode)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellId(): number {\r\n return this._cellId;\r\n }\r\n set cellId(value: number) {\r\n if (this._cellId === value) {\r\n return;\r\n }\r\n\r\n this._cellId = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new Image\r\n * @param name defines the control name\r\n * @param url defines the image url\r\n */\r\n constructor(\r\n public override name?: string,\r\n url: Nullable<string> = null\r\n ) {\r\n super(name);\r\n this.source = url;\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public override contains(x: number, y: number): boolean {\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (!this._detectPointerOnOpaqueOnly || !this._workingCanvas) {\r\n return true;\r\n }\r\n\r\n const width = this._currentMeasure.width | 0;\r\n const height = this._currentMeasure.height | 0;\r\n const key = width + \"_\" + height;\r\n\r\n let imageData = this._imageDataCache.data;\r\n\r\n if (!imageData || this._imageDataCache.key !== key) {\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n this._imageDataCache.data = imageData = context.getImageData(0, 0, width, height).data;\r\n this._imageDataCache.key = key;\r\n }\r\n\r\n x = (x - this._currentMeasure.left) | 0;\r\n y = (y - this._currentMeasure.top) | 0;\r\n\r\n const pickedPixel = imageData[(x + y * width) * 4 + 3];\r\n\r\n return pickedPixel > 0;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Image\";\r\n }\r\n\r\n /** Force the control to synchronize with its content */\r\n public synchronizeSizeWithContent() {\r\n if (!this._loaded) {\r\n return;\r\n }\r\n\r\n this.width = this._domImage.width + \"px\";\r\n this.height = this._domImage.height + \"px\";\r\n }\r\n\r\n protected override _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n break;\r\n case Image.STRETCH_FILL:\r\n break;\r\n case Image.STRETCH_UNIFORM:\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n break;\r\n case Image.STRETCH_EXTEND:\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n if (this.parent && this.parent.parent) {\r\n // Will update root size if root is not the top root\r\n this.parent.adaptWidthToChildren = true;\r\n this.parent.adaptHeightToChildren = true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n super._processMeasures(parentMeasure, context);\r\n }\r\n\r\n private _prepareWorkingCanvasForOpaqueDetection() {\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n\r\n context.clearRect(0, 0, width, height);\r\n }\r\n\r\n private _drawImage(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number, tx: number, ty: number, tw: number, th: number) {\r\n context.drawImage(this._domImage, sx, sy, sw, sh, tx, ty, tw, th);\r\n\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const transform = context.getTransform();\r\n\r\n const canvas = this._workingCanvas!;\r\n const workingCanvasContext = canvas.getContext(\"2d\")!;\r\n workingCanvasContext.save();\r\n const ttx = tx - this._currentMeasure.left;\r\n const tty = ty - this._currentMeasure.top;\r\n workingCanvasContext.setTransform(transform.a, transform.b, transform.c, transform.d, (ttx + tw) / 2, (tty + th) / 2);\r\n workingCanvasContext.translate(-(ttx + tw) / 2, -(tty + th) / 2);\r\n\r\n workingCanvasContext.drawImage(this._domImage, sx, sy, sw, sh, ttx, tty, tw, th);\r\n workingCanvasContext.restore();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n let x, y, width, height;\r\n if (this.cellId == -1) {\r\n x = this._sourceLeft;\r\n y = this._sourceTop;\r\n\r\n width = this._sourceWidth ? this._sourceWidth : this._imageWidth;\r\n height = this._sourceHeight ? this._sourceHeight : this._imageHeight;\r\n } else {\r\n const rowCount = this._domImage.naturalWidth / this.cellWidth;\r\n const column = (this.cellId / rowCount) >> 0;\r\n const row = this.cellId % rowCount;\r\n\r\n x = this.cellWidth * row;\r\n y = this.cellHeight * column;\r\n width = this.cellWidth;\r\n height = this.cellHeight;\r\n }\r\n\r\n this._prepareWorkingCanvasForOpaqueDetection();\r\n\r\n this._applyStates(context);\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_FILL:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_UNIFORM: {\r\n const hRatio = this._currentMeasure.width / width;\r\n const vRatio = this._currentMeasure.height / height;\r\n const ratio = Math.min(hRatio, vRatio);\r\n const centerX = (this._currentMeasure.width - width * ratio) / 2;\r\n const centerY = (this._currentMeasure.height - height * ratio) / 2;\r\n\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left + centerX, this._currentMeasure.top + centerY, width * ratio, height * ratio);\r\n break;\r\n }\r\n case Image.STRETCH_EXTEND:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n this._renderNinePatch(context, x, y, width, height);\r\n break;\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n private _renderNinePatch(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number): void {\r\n const idealRatio = this.host.idealWidth\r\n ? this._width.getValue(this.host) / this.host.idealWidth\r\n : this.host.idealHeight\r\n ? this._height.getValue(this.host) / this.host.idealHeight\r\n : 1;\r\n const leftWidth = this._sliceLeft;\r\n const topHeight = this._sliceTop;\r\n const bottomHeight = sh - this._sliceBottom;\r\n const rightWidth = sw - this._sliceRight;\r\n const centerWidth = this._sliceRight - this._sliceLeft;\r\n const centerHeight = this._sliceBottom - this._sliceTop;\r\n const leftWidthAdjusted = Math.round(leftWidth * idealRatio);\r\n const topHeightAdjusted = Math.round(topHeight * idealRatio);\r\n const bottomHeightAdjusted = Math.round(bottomHeight * idealRatio);\r\n const rightWidthAdjusted = Math.round(rightWidth * idealRatio);\r\n const targetCenterWidth = Math.round(this._currentMeasure.width) - rightWidthAdjusted - leftWidthAdjusted + 2;\r\n const targetCenterHeight = Math.round(this._currentMeasure.height) - bottomHeightAdjusted - topHeightAdjusted + 2;\r\n const centerLeftOffset = Math.round(this._currentMeasure.left) + leftWidthAdjusted - 1;\r\n const centerTopOffset = Math.round(this._currentMeasure.top) + topHeightAdjusted - 1;\r\n const rightOffset = Math.round(this._currentMeasure.left + this._currentMeasure.width) - rightWidthAdjusted;\r\n const bottomOffset = Math.round(this._currentMeasure.top + this._currentMeasure.height) - bottomHeightAdjusted;\r\n\r\n //Top Left\r\n this._drawImage(context, sx, sy, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top, leftWidthAdjusted, topHeightAdjusted);\r\n //Top\r\n this._drawImage(context, sx + this._sliceLeft, sy, centerWidth, topHeight, centerLeftOffset + 1, this._currentMeasure.top, targetCenterWidth - 2, topHeightAdjusted);\r\n //Top Right\r\n this._drawImage(context, sx + this._sliceRight, sy, rightWidth, topHeight, rightOffset, this._currentMeasure.top, rightWidthAdjusted, topHeightAdjusted);\r\n //Left\r\n this._drawImage(context, sx, sy + this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset + 1, leftWidthAdjusted, targetCenterHeight - 2);\r\n // Center\r\n this._drawImage(\r\n context,\r\n sx + this._sliceLeft,\r\n sy + this._sliceTop,\r\n centerWidth,\r\n centerHeight,\r\n centerLeftOffset + 1,\r\n centerTopOffset + 1,\r\n targetCenterWidth - 2,\r\n targetCenterHeight - 2\r\n );\r\n //Right\r\n this._drawImage(\r\n context,\r\n sx + this._sliceRight,\r\n sy + this._sliceTop,\r\n rightWidth,\r\n centerHeight,\r\n rightOffset,\r\n centerTopOffset + 1,\r\n rightWidthAdjusted,\r\n targetCenterHeight - 2\r\n );\r\n //Bottom Left\r\n this._drawImage(context, sx, sy + this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset, leftWidthAdjusted, bottomHeightAdjusted);\r\n //Bottom\r\n this._drawImage(\r\n context,\r\n sx + this.sliceLeft,\r\n sy + this._sliceBottom,\r\n centerWidth,\r\n bottomHeight,\r\n centerLeftOffset + 1,\r\n bottomOffset,\r\n targetCenterWidth - 2,\r\n bottomHeightAdjusted\r\n );\r\n //Bottom Right\r\n this._drawImage(context, sx + this._sliceRight, sy + this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset, rightWidthAdjusted, bottomHeightAdjusted);\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n this.onImageLoadedObservable.clear();\r\n this.onSVGAttributesComputedObservable.clear();\r\n this._removeCacheUsage(this._source);\r\n }\r\n\r\n // Static\r\n /** STRETCH_NONE */\r\n public static readonly STRETCH_NONE = 0;\r\n /** STRETCH_FILL */\r\n public static readonly STRETCH_FILL = 1;\r\n /** STRETCH_UNIFORM */\r\n public static readonly STRETCH_UNIFORM = 2;\r\n /** STRETCH_EXTEND */\r\n public static readonly STRETCH_EXTEND = 3;\r\n /** NINE_PATCH */\r\n public static readonly STRETCH_NINE_PATCH = 4;\r\n}\r\nRegisterClass(\"BABYLON.GUI.Image\", Image);\r\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@babylonjs/gui",
|
3
|
-
"version": "7.7.
|
3
|
+
"version": "7.7.1",
|
4
4
|
"main": "index.js",
|
5
5
|
"module": "index.js",
|
6
6
|
"types": "index.d.ts",
|
@@ -18,7 +18,7 @@
|
|
18
18
|
"postcompile": "build-tools -c add-js-to-es6"
|
19
19
|
},
|
20
20
|
"devDependencies": {
|
21
|
-
"@babylonjs/core": "^7.7.
|
21
|
+
"@babylonjs/core": "^7.7.1",
|
22
22
|
"@dev/build-tools": "^1.0.0",
|
23
23
|
"@lts/gui": "1.0.0"
|
24
24
|
},
|