@glassly/miniapp 0.3.7-dev.905 → 0.3.7-dev.909

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@
8
8
  * miniapp that wraps text with them gets the rows the glasses will draw.
9
9
  */
10
10
  export type { DisplayProfile, FontMetrics, UniformScriptWidths, FallbackConfig, DisplayConstraints, ScriptType, } from "./profiles";
11
- export { G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX, G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX, Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX, NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX, RAYNEO_IO_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./profiles";
11
+ export { G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX, G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX, Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX, NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX, RAYNEO_IO_PROFILE, RAYNEO_IO_CFW_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./profiles";
12
12
  export { TextMeasurer } from "./measurer";
13
13
  export type { CharMeasurement, TextMeasurement } from "./measurer";
14
14
  export { detectScript, isCJKCharacter, isKoreanCharacter, isUniformWidthScript, isUnsupportedScript, needsHyphenForBreak, SCRIPT_RANGES, } from "./measurer";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAA;AACvC,YAAY,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,YAAY,CAAA;AAChE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAA;AACjF,YAAY,EAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,2BAA2B,EAAC,MAAM,WAAW,CAAA;AAE3G,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AACjF,YAAY,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAA;AAExC,YAAY,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAClH,YAAY,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EACV,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAA;AACvC,YAAY,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,YAAY,CAAA;AAChE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAA;AACjF,YAAY,EAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,2BAA2B,EAAC,MAAM,WAAW,CAAA;AAE3G,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AACjF,YAAY,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAA;AAExC,YAAY,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,WAAW,EACX,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAClH,YAAY,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,oBAAoB,CAAA"}
@@ -7,7 +7,7 @@
7
7
  * the engine's scene pipeline (`processScene`) uses these same modules, so a
8
8
  * miniapp that wraps text with them gets the rows the glasses will draw.
9
9
  */
10
- export { G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX, G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX, Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX, NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX, RAYNEO_IO_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./profiles";
10
+ export { G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX, G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX, Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX, NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX, RAYNEO_IO_PROFILE, RAYNEO_IO_CFW_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./profiles";
11
11
  export { TextMeasurer } from "./measurer";
12
12
  export { detectScript, isCJKCharacter, isKoreanCharacter, isUniformWidthScript, isUnsupportedScript, needsHyphenForBreak, SCRIPT_RANGES, } from "./measurer";
13
13
  export { TextWrapper, DEFAULT_WRAP_OPTIONS, normalizeDisplayText } from "./wrapper";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAA;AAEvC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAA;AAGjF,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AAwBjF,OAAO,EACL,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAA;AAEvC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,WAAW,CAAA;AAGjF,OAAO,EAAC,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AAwBjF,OAAO,EACL,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAA"}
@@ -9,5 +9,5 @@ export { G1_PROFILE, G1_PROFILE_LEGACY, G1_HYPHEN_WIDTH_PX, G1_SPACE_WIDTH_PX }
9
9
  export { Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX } from "./z100";
10
10
  export { G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX } from "./g2";
11
11
  export { NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX } from "./nex";
12
- export { RAYNEO_IO_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX } from "./rayneo-io";
12
+ export { RAYNEO_IO_PROFILE, RAYNEO_IO_CFW_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./rayneo-io";
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAGzF,OAAO,EAAC,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,QAAQ,CAAA;AAG9E,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAGtE,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,OAAO,CAAA;AAG1E,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAGzF,OAAO,EAAC,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,QAAQ,CAAA;AAG9E,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAGtE,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,OAAO,CAAA;AAG1E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,aAAa,CAAA"}
@@ -12,6 +12,6 @@ export { Z100_PROFILE, Z100_HYPHEN_WIDTH_PX, Z100_SPACE_WIDTH_PX } from "./z100"
12
12
  export { G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX } from "./g2";
13
13
  // Mentra Nex Profile (a.k.a. Mentra Display)
14
14
  export { NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX } from "./nex";
15
- // RayNeo iO Profile (stock subtitle page)
16
- export { RAYNEO_IO_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX } from "./rayneo-io";
15
+ // RayNeo iO Profiles (stock subtitle page, Glassly CFW scene page)
16
+ export { RAYNEO_IO_PROFILE, RAYNEO_IO_CFW_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX, } from "./rayneo-io";
17
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/display/profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,cAAc;AACd,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAEzF,eAAe;AACf,OAAO,EAAC,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,QAAQ,CAAA;AAE9E,aAAa;AACb,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAEtE,6CAA6C;AAC7C,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,OAAO,CAAA;AAE1E,0CAA0C;AAC1C,OAAO,EAAC,iBAAiB,EAAE,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/display/profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,cAAc;AACd,OAAO,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAEzF,eAAe;AACf,OAAO,EAAC,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAC,MAAM,QAAQ,CAAA;AAE9E,aAAa;AACb,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAA;AAEtE,6CAA6C;AAC7C,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,OAAO,CAAA;AAE1E,mEAAmE;AACnE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,aAAa,CAAA"}
@@ -14,9 +14,19 @@ import { DisplayProfile } from "./types";
14
14
  * - Max payload: 96 characters per subtitle update
15
15
  *
16
16
  * With the Glassly CFW the engine renders scene frames onto the 540×180
17
- * page instead and wraps against that canvas.
17
+ * page instead and wraps them with `RAYNEO_IO_CFW_PROFILE`.
18
18
  */
19
19
  export declare const RAYNEO_IO_PROFILE: DisplayProfile;
20
+ /**
21
+ * RayNeo iO with the Glassly CFW: scene text on the 540×180 page.
22
+ *
23
+ * The glasses draw text with their own SF Pro font, one line every 25 px, 2 px
24
+ * in from the box edge, and do not clip it, so the phone cuts any line that is
25
+ * still too wide. Text the font has no glyphs for (CJK, Cyrillic, ...) is
26
+ * rasterized on the phone with the 20 px system font; those widths are
27
+ * estimates.
28
+ */
29
+ export declare const RAYNEO_IO_CFW_PROFILE: DisplayProfile;
20
30
  /**
21
31
  * Get the hyphen width for RayNeo iO in pixels.
22
32
  * Used for line breaking calculations.
@@ -1 +1 @@
1
- {"version":3,"file":"rayneo-io.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/rayneo-io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AA0HtC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAyC/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAA"}
1
+ {"version":3,"file":"rayneo-io.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/rayneo-io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAA;AA0HtC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAyC/B,CAAA;AAmCD;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAgCnC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAA"}
@@ -4,8 +4,8 @@
4
4
  * The stock firmware renders subtitle text itself (business 19, font_size 2)
5
5
  * with a near-uniform sans face; these widths are estimates that keep the
6
6
  * phone-side wrapper slightly conservative so a line never overflows on the
7
- * glasses. On the Glassly CFW the engine wraps against the 540×180 scene
8
- * canvas instead and this profile is not used.
7
+ * glasses. Scene text on the Glassly CFW is wrapped with
8
+ * `RAYNEO_IO_CFW_PROFILE` instead.
9
9
  */
10
10
  const RAYNEO_IO_GLYPH_WIDTHS = {
11
11
  // Space and punctuation
@@ -126,7 +126,7 @@ const RAYNEO_IO_GLYPH_WIDTHS = {
126
126
  * - Max payload: 96 characters per subtitle update
127
127
  *
128
128
  * With the Glassly CFW the engine renders scene frames onto the 540×180
129
- * page instead and wraps against that canvas.
129
+ * page instead and wraps them with `RAYNEO_IO_CFW_PROFILE`.
130
130
  */
131
131
  export const RAYNEO_IO_PROFILE = {
132
132
  id: "rayneo-io",
@@ -164,6 +164,76 @@ export const RAYNEO_IO_PROFILE = {
164
164
  noEndChars: ["(", "[", "{", "(", "【", "「"],
165
165
  },
166
166
  };
167
+ /**
168
+ * Advance in px of each glyph of the Glassly CFW's builtin font (SF Pro 20 px,
169
+ * revision 8+, kerning ignored): printable Latin-1 0x20..0xFF, then
170
+ * `RAYNEO_IO_CFW_EXTRA_GLYPHS`. 0 = no glyph. Same table as the Bluetooth SDK's
171
+ * `RayNeoIOCfwText`, which cuts every line wider than its box to these widths.
172
+ */
173
+ const RAYNEO_IO_CFW_ADVANCES = [
174
+ 4, 5, 8, 12, 12, 16, 13, 5, 6, 6, 8, 12, 4, 9, 4, 6, 12, 9, 11, 12, 12, 12, 12, 11, 12, 12, 4, 4, 12, 12, 12, 10, 17,
175
+ 13, 12, 14, 14, 11, 11, 14, 14, 4, 10, 12, 10, 17, 14, 15, 12, 15, 12, 12, 12, 14, 13, 18, 13, 12, 12, 6, 6, 6, 12,
176
+ 11, 10, 10, 11, 10, 11, 10, 6, 11, 11, 4, 4, 10, 4, 16, 11, 11, 11, 11, 6, 9, 6, 11, 10, 14, 9, 10, 9, 6, 4, 6, 12, 0,
177
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 12, 12, 12, 12,
178
+ 4, 11, 10, 17, 7, 12, 12, 1, 12, 10, 8, 12, 6, 6, 10, 12, 11, 4, 10, 5, 7, 12, 14, 14, 15, 10, 13, 13, 13, 13, 13, 13,
179
+ 19, 14, 11, 11, 11, 11, 4, 4, 4, 4, 14, 14, 15, 15, 15, 15, 15, 12, 15, 14, 14, 14, 14, 12, 12, 11, 10, 10, 10, 10,
180
+ 10, 10, 17, 10, 10, 10, 10, 10, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 10, 11, 10, 4, 4, 4,
181
+ 7, 7, 7, 11, 17, 12, 9, 12, 15, 18, 18, 16, 16, 17,
182
+ ];
183
+ /** Code points the revision 9 font carries beyond Latin-1, in firmware table order. */
184
+ const RAYNEO_IO_CFW_EXTRA_GLYPHS = [
185
+ 0x2018, 0x2019, 0x201a, 0x201c, 0x201d, 0x201e, 0x2013, 0x2014, 0x2026, 0x2022, 0x20ac, 0x2122, 0x2190, 0x2192,
186
+ 0x2191, 0x2193, 0x2713,
187
+ ];
188
+ function cfwGlyphWidths() {
189
+ const widths = new Map();
190
+ RAYNEO_IO_CFW_ADVANCES.forEach((advance, index) => {
191
+ if (advance === 0)
192
+ return;
193
+ const code = index < 224 ? 0x20 + index : RAYNEO_IO_CFW_EXTRA_GLYPHS[index - 224];
194
+ widths.set(String.fromCodePoint(code), advance);
195
+ });
196
+ return widths;
197
+ }
198
+ /**
199
+ * RayNeo iO with the Glassly CFW: scene text on the 540×180 page.
200
+ *
201
+ * The glasses draw text with their own SF Pro font, one line every 25 px, 2 px
202
+ * in from the box edge, and do not clip it, so the phone cuts any line that is
203
+ * still too wide. Text the font has no glyphs for (CJK, Cyrillic, ...) is
204
+ * rasterized on the phone with the 20 px system font; those widths are
205
+ * estimates.
206
+ */
207
+ export const RAYNEO_IO_CFW_PROFILE = {
208
+ ...RAYNEO_IO_PROFILE,
209
+ id: "rayneo-io-cfw",
210
+ name: "RayNeo iO (Glassly CFW)",
211
+ displayWidthPx: 540,
212
+ displayHeightPx: 180,
213
+ maxLines: 7,
214
+ // The pitch the firmware reports in IDENT.
215
+ lineHeightPx: 25,
216
+ textInsetPx: 2,
217
+ // Each line goes out as its own inline record of at most 128 bytes; this
218
+ // only has to outlast seven full lines.
219
+ maxPayloadBytes: 1024,
220
+ fontMetrics: {
221
+ glyphWidths: cfwGlyphWidths(),
222
+ defaultGlyphWidth: 11,
223
+ renderFormula: (glyphWidth) => glyphWidth,
224
+ uniformScripts: {
225
+ cjk: 20,
226
+ hiragana: 20,
227
+ katakana: 20,
228
+ korean: 20,
229
+ cyrillic: 13,
230
+ },
231
+ fallback: {
232
+ latinMaxWidth: 19, // 'Æ'
233
+ unknownBehavior: "useLatinMax",
234
+ },
235
+ },
236
+ };
167
237
  /**
168
238
  * Get the hyphen width for RayNeo iO in pixels.
169
239
  * Used for line breaking calculations.
@@ -1 +1 @@
1
- {"version":3,"file":"rayneo-io.js","sourceRoot":"","sources":["../../../src/display/profiles/rayneo-io.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rayneo-io.js","sourceRoot":"","sources":["../../../src/display/profiles/rayneo-io.ts"],"names":[],"mappings":"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AE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAClH,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACrH,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACpH,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACrH,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAClH,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;CACnD,CAAA;AAED,uFAAuF;AACvF,MAAM,0BAA0B,GAAG;IACjC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC9G,MAAM,EAAE,MAAM,EAAE,MAAM;CACvB,CAAA;AAED,SAAS,cAAc;IACrB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,sBAAsB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,OAAO,KAAK,CAAC;YAAE,OAAM;QACzB,MAAM,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA;QACjF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,GAAG,iBAAiB;IACpB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,yBAAyB;IAE/B,cAAc,EAAE,GAAG;IACnB,eAAe,EAAE,GAAG;IACpB,QAAQ,EAAE,CAAC;IACX,2CAA2C;IAC3C,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,CAAC;IAEd,yEAAyE;IACzE,wCAAwC;IACxC,eAAe,EAAE,IAAI;IAErB,WAAW,EAAE;QACX,WAAW,EAAE,cAAc,EAAE;QAC7B,iBAAiB,EAAE,EAAE;QACrB,aAAa,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,UAAU;QACjD,cAAc,EAAE;YACd,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb;QACD,QAAQ,EAAE;YACR,aAAa,EAAE,EAAE,EAAE,MAAM;YACzB,eAAe,EAAE,aAAa;SAC/B;KACF;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA"}
@@ -21,6 +21,11 @@ export interface DisplayProfile {
21
21
  * proved wrong on hardware (see profileLineHeightPx in scene/process.ts).
22
22
  */
23
23
  lineHeightPx?: number;
24
+ /**
25
+ * Inset in px the device keeps on each side when it draws a text box; the
26
+ * scene pipeline wraps to the box width minus twice this. Absent = 0.
27
+ */
28
+ textInsetPx?: number;
24
29
  /** Maximum safe payload size in bytes (for BLE transmission) */
25
30
  maxPayloadBytes: number;
26
31
  /** BLE chunk size for transmission */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAA;IAEV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IAEZ,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAA;IAEtB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAA;IAEvB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAA;IAEpB,wCAAwC;IACxC,WAAW,EAAE,WAAW,CAAA;IAExB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;OAGG;IACH,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IAE7C;;;OAGG;IACH,cAAc,EAAE,mBAAmB,CAAA;IAEnC;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB,oDAAoD;IACpD,eAAe,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAA;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,KAAK,GACL,UAAU,GACV,UAAU,GACV,QAAQ,GACR,UAAU,GACV,SAAS,GACT,aAAa,GACb,aAAa,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/display/profiles/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAA;IAEV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IAEZ,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAA;IAEtB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,gEAAgE;IAChE,eAAe,EAAE,MAAM,CAAA;IAEvB,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAA;IAEpB,wCAAwC;IACxC,WAAW,EAAE,WAAW,CAAA;IAExB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAA;IAEzB;;;OAGG;IACH,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAA;IAE7C;;;OAGG;IACH,cAAc,EAAE,mBAAmB,CAAA;IAEnC;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB,oDAAoD;IACpD,eAAe,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAA;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAE7B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,KAAK,GACL,UAAU,GACV,UAAU,GACV,QAAQ,GACR,UAAU,GACV,SAAS,GACT,aAAa,GACb,aAAa,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassly/miniapp",
3
- "version": "0.3.7-dev.905",
3
+ "version": "0.3.7-dev.909",
4
4
  "description": "SDK for building Glassly local miniapps (browser/WebView)",
5
5
  "author": "Glassly Labs",
6
6
  "license": "MIT",
@@ -73,7 +73,7 @@
73
73
  }
74
74
  },
75
75
  "dependencies": {
76
- "@glassly/cloud-protocol": "0.3.7-dev.905",
76
+ "@glassly/cloud-protocol": "0.3.7-dev.909",
77
77
  "eventemitter3": "^5.0.1"
78
78
  },
79
79
  "devDependencies": {
@@ -31,6 +31,7 @@ export {
31
31
  NEX_HYPHEN_WIDTH_PX,
32
32
  NEX_SPACE_WIDTH_PX,
33
33
  RAYNEO_IO_PROFILE,
34
+ RAYNEO_IO_CFW_PROFILE,
34
35
  RAYNEO_IO_HYPHEN_WIDTH_PX,
35
36
  RAYNEO_IO_SPACE_WIDTH_PX,
36
37
  } from "./profiles"
@@ -27,5 +27,10 @@ export {G2_PROFILE, G2_HYPHEN_WIDTH_PX, G2_SPACE_WIDTH_PX} from "./g2"
27
27
  // Mentra Nex Profile (a.k.a. Mentra Display)
28
28
  export {NEX_PROFILE, NEX_HYPHEN_WIDTH_PX, NEX_SPACE_WIDTH_PX} from "./nex"
29
29
 
30
- // RayNeo iO Profile (stock subtitle page)
31
- export {RAYNEO_IO_PROFILE, RAYNEO_IO_HYPHEN_WIDTH_PX, RAYNEO_IO_SPACE_WIDTH_PX} from "./rayneo-io"
30
+ // RayNeo iO Profiles (stock subtitle page, Glassly CFW scene page)
31
+ export {
32
+ RAYNEO_IO_PROFILE,
33
+ RAYNEO_IO_CFW_PROFILE,
34
+ RAYNEO_IO_HYPHEN_WIDTH_PX,
35
+ RAYNEO_IO_SPACE_WIDTH_PX,
36
+ } from "./rayneo-io"
@@ -6,8 +6,8 @@ import {DisplayProfile} from "./types"
6
6
  * The stock firmware renders subtitle text itself (business 19, font_size 2)
7
7
  * with a near-uniform sans face; these widths are estimates that keep the
8
8
  * phone-side wrapper slightly conservative so a line never overflows on the
9
- * glasses. On the Glassly CFW the engine wraps against the 540×180 scene
10
- * canvas instead and this profile is not used.
9
+ * glasses. Scene text on the Glassly CFW is wrapped with
10
+ * `RAYNEO_IO_CFW_PROFILE` instead.
11
11
  */
12
12
  const RAYNEO_IO_GLYPH_WIDTHS: Record<string, number> = {
13
13
  // Space and punctuation
@@ -135,7 +135,7 @@ const RAYNEO_IO_GLYPH_WIDTHS: Record<string, number> = {
135
135
  * - Max payload: 96 characters per subtitle update
136
136
  *
137
137
  * With the Glassly CFW the engine renders scene frames onto the 540×180
138
- * page instead and wraps against that canvas.
138
+ * page instead and wraps them with `RAYNEO_IO_CFW_PROFILE`.
139
139
  */
140
140
  export const RAYNEO_IO_PROFILE: DisplayProfile = {
141
141
  id: "rayneo-io",
@@ -180,6 +180,82 @@ export const RAYNEO_IO_PROFILE: DisplayProfile = {
180
180
  },
181
181
  }
182
182
 
183
+ /**
184
+ * Advance in px of each glyph of the Glassly CFW's builtin font (SF Pro 20 px,
185
+ * revision 8+, kerning ignored): printable Latin-1 0x20..0xFF, then
186
+ * `RAYNEO_IO_CFW_EXTRA_GLYPHS`. 0 = no glyph. Same table as the Bluetooth SDK's
187
+ * `RayNeoIOCfwText`, which cuts every line wider than its box to these widths.
188
+ */
189
+ const RAYNEO_IO_CFW_ADVANCES = [
190
+ 4, 5, 8, 12, 12, 16, 13, 5, 6, 6, 8, 12, 4, 9, 4, 6, 12, 9, 11, 12, 12, 12, 12, 11, 12, 12, 4, 4, 12, 12, 12, 10, 17,
191
+ 13, 12, 14, 14, 11, 11, 14, 14, 4, 10, 12, 10, 17, 14, 15, 12, 15, 12, 12, 12, 14, 13, 18, 13, 12, 12, 6, 6, 6, 12,
192
+ 11, 10, 10, 11, 10, 11, 10, 6, 11, 11, 4, 4, 10, 4, 16, 11, 11, 11, 11, 6, 9, 6, 11, 10, 14, 9, 10, 9, 6, 4, 6, 12, 0,
193
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 12, 12, 12, 12,
194
+ 4, 11, 10, 17, 7, 12, 12, 1, 12, 10, 8, 12, 6, 6, 10, 12, 11, 4, 10, 5, 7, 12, 14, 14, 15, 10, 13, 13, 13, 13, 13, 13,
195
+ 19, 14, 11, 11, 11, 11, 4, 4, 4, 4, 14, 14, 15, 15, 15, 15, 15, 12, 15, 14, 14, 14, 14, 12, 12, 11, 10, 10, 10, 10,
196
+ 10, 10, 17, 10, 10, 10, 10, 10, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 10, 11, 10, 4, 4, 4,
197
+ 7, 7, 7, 11, 17, 12, 9, 12, 15, 18, 18, 16, 16, 17,
198
+ ]
199
+
200
+ /** Code points the revision 9 font carries beyond Latin-1, in firmware table order. */
201
+ const RAYNEO_IO_CFW_EXTRA_GLYPHS = [
202
+ 0x2018, 0x2019, 0x201a, 0x201c, 0x201d, 0x201e, 0x2013, 0x2014, 0x2026, 0x2022, 0x20ac, 0x2122, 0x2190, 0x2192,
203
+ 0x2191, 0x2193, 0x2713,
204
+ ]
205
+
206
+ function cfwGlyphWidths(): Map<string, number> {
207
+ const widths = new Map<string, number>()
208
+ RAYNEO_IO_CFW_ADVANCES.forEach((advance, index) => {
209
+ if (advance === 0) return
210
+ const code = index < 224 ? 0x20 + index : RAYNEO_IO_CFW_EXTRA_GLYPHS[index - 224]
211
+ widths.set(String.fromCodePoint(code), advance)
212
+ })
213
+ return widths
214
+ }
215
+
216
+ /**
217
+ * RayNeo iO with the Glassly CFW: scene text on the 540×180 page.
218
+ *
219
+ * The glasses draw text with their own SF Pro font, one line every 25 px, 2 px
220
+ * in from the box edge, and do not clip it, so the phone cuts any line that is
221
+ * still too wide. Text the font has no glyphs for (CJK, Cyrillic, ...) is
222
+ * rasterized on the phone with the 20 px system font; those widths are
223
+ * estimates.
224
+ */
225
+ export const RAYNEO_IO_CFW_PROFILE: DisplayProfile = {
226
+ ...RAYNEO_IO_PROFILE,
227
+ id: "rayneo-io-cfw",
228
+ name: "RayNeo iO (Glassly CFW)",
229
+
230
+ displayWidthPx: 540,
231
+ displayHeightPx: 180,
232
+ maxLines: 7,
233
+ // The pitch the firmware reports in IDENT.
234
+ lineHeightPx: 25,
235
+ textInsetPx: 2,
236
+
237
+ // Each line goes out as its own inline record of at most 128 bytes; this
238
+ // only has to outlast seven full lines.
239
+ maxPayloadBytes: 1024,
240
+
241
+ fontMetrics: {
242
+ glyphWidths: cfwGlyphWidths(),
243
+ defaultGlyphWidth: 11,
244
+ renderFormula: (glyphWidth: number) => glyphWidth,
245
+ uniformScripts: {
246
+ cjk: 20,
247
+ hiragana: 20,
248
+ katakana: 20,
249
+ korean: 20,
250
+ cyrillic: 13,
251
+ },
252
+ fallback: {
253
+ latinMaxWidth: 19, // 'Æ'
254
+ unknownBehavior: "useLatinMax",
255
+ },
256
+ },
257
+ }
258
+
183
259
  /**
184
260
  * Get the hyphen width for RayNeo iO in pixels.
185
261
  * Used for line breaking calculations.
@@ -27,6 +27,12 @@ export interface DisplayProfile {
27
27
  */
28
28
  lineHeightPx?: number
29
29
 
30
+ /**
31
+ * Inset in px the device keeps on each side when it draws a text box; the
32
+ * scene pipeline wraps to the box width minus twice this. Absent = 0.
33
+ */
34
+ textInsetPx?: number
35
+
30
36
  /** Maximum safe payload size in bytes (for BLE transmission) */
31
37
  maxPayloadBytes: number
32
38