@flighthq/textshaper 0.5.1-next.1069.554a2ac → 0.5.1-next.1201.9b49dee
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.
- package/README.md +2 -2
- package/dist/_textShaperHooks.d.ts +3 -3
- package/dist/_textShaperHooks.d.ts.map +1 -1
- package/dist/_textShaperHooks.js.map +1 -1
- package/dist/textShaper.d.ts +8 -8
- package/dist/textShaper.d.ts.map +1 -1
- package/dist/textShaper.js +11 -11
- package/dist/textShaper.js.map +1 -1
- package/dist/textShaperCache.d.ts +2 -2
- package/dist/textShaperCache.d.ts.map +1 -1
- package/dist/textShaperCache.js +3 -3
- package/dist/textShaperCache.js.map +1 -1
- package/dist/textShaperItemize.d.ts +2 -2
- package/dist/textShaperItemize.d.ts.map +1 -1
- package/dist/textShaperItemize.js +2 -2
- package/dist/textShaperItemize.js.map +1 -1
- package/dist/textShaperRun.d.ts +12 -12
- package/dist/textShaperRun.d.ts.map +1 -1
- package/dist/textShaperRun.js +22 -22
- package/dist/textShaperRun.js.map +1 -1
- package/dist/textShaperSignals.d.ts.map +1 -1
- package/dist/textShaperSignals.js.map +1 -1
- package/package.json +5 -5
- package/src/_textShaperHooks.test.ts +4 -4
- package/src/textShaper.test.ts +18 -18
- package/src/textShaperCache.test.ts +6 -6
- package/src/textShaperItemize.test.ts +5 -3
- package/src/textShaperRun.test.ts +6 -4
- package/src/textShaperSignals.test.ts +5 -5
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/textshaper`. The `@f
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/textshaper@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/textshaper@0.5.1-next.1201.9b49dee](https://github.com/flighthq/flight/tree/9b49dee3f22f6b2838c3d237edcc77bca65734f2/packages/textshaper)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/9b49dee3f22f6b2838c3d237edcc77bca65734f2/LICENSE.md)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare let _textShaperBackendHook: ((backend:
|
|
3
|
-
export declare function _setTextShaperBackendHook(hook: ((backend:
|
|
1
|
+
import type { HostTextShaperProvider } from '@flighthq/types/contract';
|
|
2
|
+
export declare let _textShaperBackendHook: ((backend: HostTextShaperProvider | null) => void) | null;
|
|
3
|
+
export declare function _setTextShaperBackendHook(hook: ((backend: HostTextShaperProvider | null) => void) | null): void;
|
|
4
4
|
//# sourceMappingURL=_textShaperHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_textShaperHooks.d.ts","sourceRoot":"","sources":["../src/_textShaperHooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"_textShaperHooks.d.ts","sourceRoot":"","sources":["../src/_textShaperHooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,eAAO,IAAI,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAW,CAAC;AAEpG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAE/G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_textShaperHooks.js","sourceRoot":"","sources":["../src/_textShaperHooks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAI,sBAAsB,
|
|
1
|
+
{"version":3,"file":"_textShaperHooks.js","sourceRoot":"","sources":["../src/_textShaperHooks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,IAAI,sBAAsB,GAA8D,IAAI,CAAC;AAEpG,MAAM,UAAU,yBAAyB,CAAC,IAA+D;IACvG,sBAAsB,GAAG,IAAI,CAAC;AAChC,CAAC"}
|
package/dist/textShaper.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { BackendOperationExplanation,
|
|
2
|
-
export declare function explainTextShaperOperation(operation: TextShaperOperation,
|
|
3
|
-
export declare function getTextShaperBackend(
|
|
4
|
-
export declare function hasTextShaperOperation(operation: TextShaperOperation,
|
|
5
|
-
export declare function measureText(text: string, format: Readonly<TextFormat>,
|
|
1
|
+
import type { BackendOperationExplanation, HostTextShaperProvider, TextFormat, TextShaperOperation } from '@flighthq/types/contract';
|
|
2
|
+
export declare function explainTextShaperOperation(operation: TextShaperOperation, hostTextShaper?: Readonly<HostTextShaperProvider>): BackendOperationExplanation;
|
|
3
|
+
export declare function getTextShaperBackend(hostTextShaper?: Readonly<HostTextShaperProvider>): HostTextShaperProvider | null;
|
|
4
|
+
export declare function hasTextShaperOperation(operation: TextShaperOperation, hostTextShaper?: Readonly<HostTextShaperProvider>): boolean;
|
|
5
|
+
export declare function measureText(text: string, format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): number;
|
|
6
6
|
/**
|
|
7
7
|
* Installs the backend used by calls that omit an explicit host; pass null to clear it. Last write
|
|
8
8
|
* wins and re-registration never throws.
|
|
9
9
|
*
|
|
10
|
-
* @deprecated Pass a
|
|
11
|
-
* until the legacy global path is removed.
|
|
10
|
+
* @deprecated Pass a HostTextShaperProvider to the text-shaping operation. Retained for source
|
|
11
|
+
* compatibility until the legacy global path is removed.
|
|
12
12
|
*/
|
|
13
|
-
export declare function setTextShaperBackend(backend:
|
|
13
|
+
export declare function setTextShaperBackend(backend: HostTextShaperProvider | null): void;
|
|
14
14
|
//# sourceMappingURL=textShaper.d.ts.map
|
package/dist/textShaper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaper.d.ts","sourceRoot":"","sources":["../src/textShaper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"textShaper.d.ts","sourceRoot":"","sources":["../src/textShaper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,UAAU,EACV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAMlC,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,2BAA2B,CAM7B;AAKD,wBAAgB,oBAAoB,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAErH;AAID,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,mBAAmB,EAC9B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,OAAO,CAET;AAKD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAIR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAGjF"}
|
package/dist/textShaper.js
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { _textShaperBackendHook } from './_textShaperHooks';
|
|
2
2
|
// Which layer implements `operation`. An explicit host provider wins over the legacy installed
|
|
3
3
|
// backend. There is no sentinel because this package has no light bundled shaper implementation.
|
|
4
|
-
export function explainTextShaperOperation(operation,
|
|
5
|
-
const backend = getTextShaperBackend(
|
|
4
|
+
export function explainTextShaperOperation(operation, hostTextShaper) {
|
|
5
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
6
6
|
if (backend !== null && typeof backend[operation] === 'function') {
|
|
7
|
-
return { implemented: true, layer:
|
|
7
|
+
return { implemented: true, layer: hostTextShaper === undefined ? 'custom' : 'host', operation };
|
|
8
8
|
}
|
|
9
9
|
return { implemented: false, layer: 'none', operation };
|
|
10
10
|
}
|
|
11
11
|
// Returns the explicit host's shaper when supplied, otherwise the legacy installed backend. Unlike
|
|
12
12
|
// text segmentation, shaping has no light bundled default: the canvas provider needs DOM and font
|
|
13
13
|
// string computation, so callers must compose it into a host or install it through the legacy path.
|
|
14
|
-
export function getTextShaperBackend(
|
|
15
|
-
return
|
|
14
|
+
export function getTextShaperBackend(hostTextShaper) {
|
|
15
|
+
return hostTextShaper ?? _backend;
|
|
16
16
|
}
|
|
17
17
|
// Whether the selected backend implements `operation`. False when neither an explicit nor legacy
|
|
18
18
|
// provider supplies it.
|
|
19
|
-
export function hasTextShaperOperation(operation,
|
|
20
|
-
return explainTextShaperOperation(operation,
|
|
19
|
+
export function hasTextShaperOperation(operation, hostTextShaper) {
|
|
20
|
+
return explainTextShaperOperation(operation, hostTextShaper).implemented;
|
|
21
21
|
}
|
|
22
22
|
// Measures `text` in `format` to its horizontal advance, in pixels, via the explicit host or legacy
|
|
23
23
|
// fallback. Returns the sentinel -1 when neither is available, distinguishing "unmeasurable" from a
|
|
24
24
|
// real zero-width advance.
|
|
25
|
-
export function measureText(text, format,
|
|
26
|
-
const backend = getTextShaperBackend(
|
|
25
|
+
export function measureText(text, format, hostTextShaper) {
|
|
26
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
27
27
|
if (backend === null)
|
|
28
28
|
return -1;
|
|
29
29
|
return backend.measureText(text, format);
|
|
@@ -32,8 +32,8 @@ export function measureText(text, format, host) {
|
|
|
32
32
|
* Installs the backend used by calls that omit an explicit host; pass null to clear it. Last write
|
|
33
33
|
* wins and re-registration never throws.
|
|
34
34
|
*
|
|
35
|
-
* @deprecated Pass a
|
|
36
|
-
* until the legacy global path is removed.
|
|
35
|
+
* @deprecated Pass a HostTextShaperProvider to the text-shaping operation. Retained for source
|
|
36
|
+
* compatibility until the legacy global path is removed.
|
|
37
37
|
*/
|
|
38
38
|
export function setTextShaperBackend(backend) {
|
|
39
39
|
_backend = backend;
|
package/dist/textShaper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaper.js","sourceRoot":"","sources":["../src/textShaper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"textShaper.js","sourceRoot":"","sources":["../src/textShaper.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,+FAA+F;AAC/F,iGAAiG;AACjG,MAAM,UAAU,0BAA0B,CACxC,SAA8B,EAC9B,cAAiD;IAEjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU,EAAE,CAAC;QACjE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IACnG,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAAC,cAAiD;IACpF,OAAO,cAAc,IAAI,QAAQ,CAAC;AACpC,CAAC;AAED,iGAAiG;AACjG,wBAAwB;AACxB,MAAM,UAAU,sBAAsB,CACpC,SAA8B,EAC9B,cAAiD;IAEjD,OAAO,0BAA0B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,WAAW,CAAC;AAC3E,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,2BAA2B;AAC3B,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,MAA4B,EAC5B,cAAiD;IAEjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsC;IACzE,QAAQ,GAAG,OAAO,CAAC;IACnB,sBAAsB,EAAE,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,QAAQ,GAAkC,IAAI,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { EntityConstruction,
|
|
1
|
+
import type { EntityConstruction, HostTextShaperProvider, ShapeRunOptions, ShapedRun, TextFormat, TextShaperCache } from '@flighthq/types/contract';
|
|
2
2
|
export declare function clearTextShaperCache(cache: TextShaperCache): void;
|
|
3
3
|
export declare function createTextShaperCache(): TextShaperCache;
|
|
4
4
|
export declare function disposeTextShaperCache(cache: TextShaperCache): void;
|
|
5
5
|
export declare function initializeTextShaperCache(out: EntityConstruction<TextShaperCache>): void;
|
|
6
|
-
export declare function shapeTextRunCached(cache: TextShaperCache, text: string, format: Readonly<TextFormat>, options?: Readonly<ShapeRunOptions>,
|
|
6
|
+
export declare function shapeTextRunCached(cache: TextShaperCache, text: string, format: Readonly<TextFormat>, options?: Readonly<ShapeRunOptions>, hostTextShaper?: Readonly<HostTextShaperProvider>): ShapedRun | null;
|
|
7
7
|
//# sourceMappingURL=textShaperCache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperCache.d.ts","sourceRoot":"","sources":["../src/textShaperCache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAElB,
|
|
1
|
+
{"version":3,"file":"textShaperCache.d.ts","sourceRoot":"","sources":["../src/textShaperCache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAElB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,UAAU,EACV,eAAe,EAChB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEjE;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAIvD;AAKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAKnE;AAGD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,kBAAkB,CAAC,eAAe,CAAC,GAAG,IAAI,CAGxF;AAOD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,OAAO,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,EACnC,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,SAAS,GAAG,IAAI,CAWlB"}
|
package/dist/textShaperCache.js
CHANGED
|
@@ -33,18 +33,18 @@ export function initializeTextShaperCache(out) {
|
|
|
33
33
|
// Returns null when no backend is registered or the backend is advances-only (same as
|
|
34
34
|
// `shapeTextRun`); null results are NOT cached so a later backend registration can succeed. Cache
|
|
35
35
|
// keys include provider identity so callers can safely share a cache while interleaving hosts.
|
|
36
|
-
export function shapeTextRunCached(cache, text, format, options,
|
|
36
|
+
export function shapeTextRunCached(cache, text, format, options, hostTextShaper) {
|
|
37
37
|
const runtime = _getTextShaperCacheRuntime(cache);
|
|
38
38
|
if (runtime === null)
|
|
39
39
|
return null;
|
|
40
|
-
const backend = getTextShaperBackend(
|
|
40
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
41
41
|
if (backend === null)
|
|
42
42
|
return null;
|
|
43
43
|
const key = `${_getBackendCacheId(backend)}\x00${_makeCacheKey(text, format, options)}`;
|
|
44
44
|
const existing = runtime.entries.get(key);
|
|
45
45
|
if (existing !== undefined)
|
|
46
46
|
return existing;
|
|
47
|
-
const result = shapeTextRun(text, format, options,
|
|
47
|
+
const result = shapeTextRun(text, format, options, hostTextShaper);
|
|
48
48
|
if (result !== null)
|
|
49
49
|
runtime.entries.set(key, result);
|
|
50
50
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperCache.js","sourceRoot":"","sources":["../src/textShaperCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"textShaperCache.js","sourceRoot":"","sources":["../src/textShaperCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider, ShapedRun, TextFormat, TextItem, TextShaperOptions } from '@flighthq/types/contract';
|
|
2
2
|
export declare function itemizeText(text: string, _format: Readonly<TextFormat>, options?: Readonly<TextShaperOptions>): readonly TextItem[];
|
|
3
|
-
export declare function shapeTextRuns(text: string, format: Readonly<TextFormat>, options?: Readonly<TextShaperOptions>,
|
|
3
|
+
export declare function shapeTextRuns(text: string, format: Readonly<TextFormat>, options?: Readonly<TextShaperOptions>, hostTextShaper?: Readonly<HostTextShaperProvider>): readonly ShapedRun[];
|
|
4
4
|
//# sourceMappingURL=textShaperItemize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperItemize.d.ts","sourceRoot":"","sources":["../src/textShaperItemize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"textShaperItemize.d.ts","sourceRoot":"","sources":["../src/textShaperItemize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EAGZ,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GACpC,SAAS,QAAQ,EAAE,CAgDrB;AAQD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,SAAS,SAAS,EAAE,CAiBtB"}
|
|
@@ -70,7 +70,7 @@ _format, options) {
|
|
|
70
70
|
//
|
|
71
71
|
// This is the primary convenience entry point for multi-script strings: `itemizeText` handles the
|
|
72
72
|
// script/direction split, then `shapeTextRun` produces glyph ids and positions for each sub-run.
|
|
73
|
-
export function shapeTextRuns(text, format, options,
|
|
73
|
+
export function shapeTextRuns(text, format, options, hostTextShaper) {
|
|
74
74
|
if (text.length === 0)
|
|
75
75
|
return [];
|
|
76
76
|
const items = itemizeText(text, format, options);
|
|
@@ -84,7 +84,7 @@ export function shapeTextRuns(text, format, options, host) {
|
|
|
84
84
|
direction: item.direction === 'TopToBottom' ? undefined : item.direction,
|
|
85
85
|
script: item.script,
|
|
86
86
|
};
|
|
87
|
-
const run = shapeTextRun(sub, format, runOptions,
|
|
87
|
+
const run = shapeTextRun(sub, format, runOptions, hostTextShaper);
|
|
88
88
|
if (run !== null)
|
|
89
89
|
result.push(run);
|
|
90
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperItemize.js","sourceRoot":"","sources":["../src/textShaperItemize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"textShaperItemize.js","sourceRoot":"","sources":["../src/textShaperItemize.ts"],"names":[],"mappings":"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"}
|
package/dist/textShaperRun.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { Entity, EntityConstruction, FontMetrics, GlyphExtents,
|
|
1
|
+
import type { Entity, EntityConstruction, FontMetrics, GlyphExtents, HostTextShaperProvider, ShapeRunOptions, ShapedRun, TextFormat } from '@flighthq/types/contract';
|
|
2
2
|
export declare function clearShapedRun(run: ShapedRun): ShapedRun;
|
|
3
3
|
export declare function createShapedRun(): ShapedRun & Entity;
|
|
4
|
-
export declare function getCodePointForGlyph(glyphId: number, _format: Readonly<TextFormat>,
|
|
5
|
-
export declare function getFontMetrics(format: Readonly<TextFormat>,
|
|
6
|
-
export declare function getFontMetricsInto(format: Readonly<TextFormat>, out: FontMetrics,
|
|
7
|
-
export declare function getFontUnitScale(format: Readonly<TextFormat>,
|
|
8
|
-
export declare function getGlyphExtents(glyphId: number, _format: Readonly<TextFormat>,
|
|
9
|
-
export declare function getGlyphExtentsBatch(glyphIds: ReadonlyArray<number>, _format: Readonly<TextFormat>, out: GlyphExtents[],
|
|
10
|
-
export declare function getGlyphExtentsInto(glyphId: number, _format: Readonly<TextFormat>, out: GlyphExtents,
|
|
11
|
-
export declare function getGlyphIndexForCodePoint(codePoint: number, _format: Readonly<TextFormat>,
|
|
12
|
-
export declare function getGlyphName(glyphId: number, _format: Readonly<TextFormat>,
|
|
4
|
+
export declare function getCodePointForGlyph(glyphId: number, _format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): number;
|
|
5
|
+
export declare function getFontMetrics(format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): FontMetrics | null;
|
|
6
|
+
export declare function getFontMetricsInto(format: Readonly<TextFormat>, out: FontMetrics, hostTextShaper?: Readonly<HostTextShaperProvider>): boolean;
|
|
7
|
+
export declare function getFontUnitScale(format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): number;
|
|
8
|
+
export declare function getGlyphExtents(glyphId: number, _format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): GlyphExtents | null;
|
|
9
|
+
export declare function getGlyphExtentsBatch(glyphIds: ReadonlyArray<number>, _format: Readonly<TextFormat>, out: GlyphExtents[], hostTextShaper?: Readonly<HostTextShaperProvider>): number;
|
|
10
|
+
export declare function getGlyphExtentsInto(glyphId: number, _format: Readonly<TextFormat>, out: GlyphExtents, hostTextShaper?: Readonly<HostTextShaperProvider>): boolean;
|
|
11
|
+
export declare function getGlyphIndexForCodePoint(codePoint: number, _format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): number;
|
|
12
|
+
export declare function getGlyphName(glyphId: number, _format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>): string;
|
|
13
13
|
export declare function initializeShapedRun(out: EntityConstruction<ShapedRun & Entity>): void;
|
|
14
|
-
export declare function shapeTextRun(text: string, format: Readonly<TextFormat>, options?: ShapeRunOptions,
|
|
15
|
-
export declare function shapeTextRunInto(text: string, format: Readonly<TextFormat>, out: ShapedRun, options?: ShapeRunOptions,
|
|
14
|
+
export declare function shapeTextRun(text: string, format: Readonly<TextFormat>, options?: ShapeRunOptions, hostTextShaper?: Readonly<HostTextShaperProvider>): ShapedRun | null;
|
|
15
|
+
export declare function shapeTextRunInto(text: string, format: Readonly<TextFormat>, out: ShapedRun, options?: ShapeRunOptions, hostTextShaper?: Readonly<HostTextShaperProvider>): boolean;
|
|
16
16
|
//# sourceMappingURL=textShaperRun.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperRun.d.ts","sourceRoot":"","sources":["../src/textShaperRun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"textShaperRun.d.ts","sourceRoot":"","sources":["../src/textShaperRun.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,UAAU,EACX,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,CAQxD;AAED,wBAAgB,eAAe,IAAI,SAAS,GAAG,MAAM,CAIpD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAIR;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,WAAW,GAAG,IAAI,CAIpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,OAAO,CAYT;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAKR;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,YAAY,GAAG,IAAI,CAIrB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,GAAG,EAAE,YAAY,EAAE,EACnB,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,GAAG,EAAE,YAAY,EACjB,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,OAAO,CAQT;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAIR;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,MAAM,CAIR;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,IAAI,CAOrF;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,OAAO,CAAC,EAAE,eAAe,EACzB,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,SAAS,GAAG,IAAI,CAIlB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,eAAe,EACzB,cAAc,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAChD,OAAO,CAgBT"}
|
package/dist/textShaperRun.js
CHANGED
|
@@ -14,20 +14,20 @@ export function createShapedRun() {
|
|
|
14
14
|
initializeShapedRun(out);
|
|
15
15
|
return finishEntity(out);
|
|
16
16
|
}
|
|
17
|
-
export function getCodePointForGlyph(glyphId, _format,
|
|
18
|
-
const backend = getTextShaperBackend(
|
|
17
|
+
export function getCodePointForGlyph(glyphId, _format, hostTextShaper) {
|
|
18
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
19
19
|
if (backend === null || !backend.getCodePointForGlyph)
|
|
20
20
|
return -1;
|
|
21
21
|
return backend.getCodePointForGlyph(glyphId);
|
|
22
22
|
}
|
|
23
|
-
export function getFontMetrics(format,
|
|
24
|
-
const backend = getTextShaperBackend(
|
|
23
|
+
export function getFontMetrics(format, hostTextShaper) {
|
|
24
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
25
25
|
if (backend === null || !backend.getFontMetrics)
|
|
26
26
|
return null;
|
|
27
27
|
return backend.getFontMetrics(format);
|
|
28
28
|
}
|
|
29
|
-
export function getFontMetricsInto(format, out,
|
|
30
|
-
const metrics = getFontMetrics(format,
|
|
29
|
+
export function getFontMetricsInto(format, out, hostTextShaper) {
|
|
30
|
+
const metrics = getFontMetrics(format, hostTextShaper);
|
|
31
31
|
if (metrics === null)
|
|
32
32
|
return false;
|
|
33
33
|
out.ascent = metrics.ascent;
|
|
@@ -40,21 +40,21 @@ export function getFontMetricsInto(format, out, host) {
|
|
|
40
40
|
out.xHeight = metrics.xHeight;
|
|
41
41
|
return true;
|
|
42
42
|
}
|
|
43
|
-
export function getFontUnitScale(format,
|
|
44
|
-
const metrics = getFontMetrics(format,
|
|
43
|
+
export function getFontUnitScale(format, hostTextShaper) {
|
|
44
|
+
const metrics = getFontMetrics(format, hostTextShaper);
|
|
45
45
|
if (metrics === null)
|
|
46
46
|
return -1;
|
|
47
47
|
const size = format.size ?? 12;
|
|
48
48
|
return size / metrics.unitsPerEm;
|
|
49
49
|
}
|
|
50
|
-
export function getGlyphExtents(glyphId, _format,
|
|
51
|
-
const backend = getTextShaperBackend(
|
|
50
|
+
export function getGlyphExtents(glyphId, _format, hostTextShaper) {
|
|
51
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
52
52
|
if (backend === null || !backend.getGlyphExtents)
|
|
53
53
|
return null;
|
|
54
54
|
return backend.getGlyphExtents(glyphId);
|
|
55
55
|
}
|
|
56
|
-
export function getGlyphExtentsBatch(glyphIds, _format, out,
|
|
57
|
-
const backend = getTextShaperBackend(
|
|
56
|
+
export function getGlyphExtentsBatch(glyphIds, _format, out, hostTextShaper) {
|
|
57
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
58
58
|
if (backend === null || !backend.getGlyphExtents)
|
|
59
59
|
return 0;
|
|
60
60
|
let resolved = 0;
|
|
@@ -70,8 +70,8 @@ export function getGlyphExtentsBatch(glyphIds, _format, out, host) {
|
|
|
70
70
|
}
|
|
71
71
|
return resolved;
|
|
72
72
|
}
|
|
73
|
-
export function getGlyphExtentsInto(glyphId, _format, out,
|
|
74
|
-
const extents = getGlyphExtents(glyphId, _format,
|
|
73
|
+
export function getGlyphExtentsInto(glyphId, _format, out, hostTextShaper) {
|
|
74
|
+
const extents = getGlyphExtents(glyphId, _format, hostTextShaper);
|
|
75
75
|
if (extents === null)
|
|
76
76
|
return false;
|
|
77
77
|
out.height = extents.height;
|
|
@@ -80,14 +80,14 @@ export function getGlyphExtentsInto(glyphId, _format, out, host) {
|
|
|
80
80
|
out.yBearing = extents.yBearing;
|
|
81
81
|
return true;
|
|
82
82
|
}
|
|
83
|
-
export function getGlyphIndexForCodePoint(codePoint, _format,
|
|
84
|
-
const backend = getTextShaperBackend(
|
|
83
|
+
export function getGlyphIndexForCodePoint(codePoint, _format, hostTextShaper) {
|
|
84
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
85
85
|
if (backend === null || !backend.getGlyphIndexForCodePoint)
|
|
86
86
|
return -1;
|
|
87
87
|
return backend.getGlyphIndexForCodePoint(codePoint);
|
|
88
88
|
}
|
|
89
|
-
export function getGlyphName(glyphId, _format,
|
|
90
|
-
const backend = getTextShaperBackend(
|
|
89
|
+
export function getGlyphName(glyphId, _format, hostTextShaper) {
|
|
90
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
91
91
|
if (backend === null || !backend.getGlyphName)
|
|
92
92
|
return '';
|
|
93
93
|
return backend.getGlyphName(glyphId);
|
|
@@ -100,14 +100,14 @@ export function initializeShapedRun(out) {
|
|
|
100
100
|
out.glyphs = [];
|
|
101
101
|
out.script = '';
|
|
102
102
|
}
|
|
103
|
-
export function shapeTextRun(text, format, options,
|
|
104
|
-
const backend = getTextShaperBackend(
|
|
103
|
+
export function shapeTextRun(text, format, options, hostTextShaper) {
|
|
104
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
105
105
|
if (backend === null || !backend.shapeRun)
|
|
106
106
|
return null;
|
|
107
107
|
return backend.shapeRun(text, format, options);
|
|
108
108
|
}
|
|
109
|
-
export function shapeTextRunInto(text, format, out, options,
|
|
110
|
-
const backend = getTextShaperBackend(
|
|
109
|
+
export function shapeTextRunInto(text, format, out, options, hostTextShaper) {
|
|
110
|
+
const backend = getTextShaperBackend(hostTextShaper);
|
|
111
111
|
if (backend === null || !backend.shapeRun)
|
|
112
112
|
return false;
|
|
113
113
|
const result = backend.shapeRun(text, format, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperRun.js","sourceRoot":"","sources":["../src/textShaperRun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAYzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,UAAU,cAAc,CAAC,GAAc;IAC3C,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;IACrB,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC;IAC9B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;IACnB,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,cAAc,EAAsB,CAAC;IACjD,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,
|
|
1
|
+
{"version":3,"file":"textShaperRun.js","sourceRoot":"","sources":["../src/textShaperRun.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperSignals.d.ts","sourceRoot":"","sources":["../src/textShaperSignals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"textShaperSignals.d.ts","sourceRoot":"","sources":["../src/textShaperSignals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAA0B,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI9G,wBAAgB,wBAAwB,IAAI,IAAI,CAK/C;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAa3D;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAE/D;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAE5F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textShaperSignals.js","sourceRoot":"","sources":["../src/textShaperSignals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,UAAU,wBAAwB;IACtC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO;IAC9B,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,CAAC;IAChB,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvC,QAAQ,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,cAAc,EAAqB,CAAC;QAChD,2BAA2B,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC;IACL,yBAAyB,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAA0C;IACpF,GAAG,CAAC,gBAAgB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"textShaperSignals.js","sourceRoot":"","sources":["../src/textShaperSignals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,UAAU,wBAAwB;IACtC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO;IAC9B,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACvC,QAAQ,GAAG,IAAI,CAAC;IAChB,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvC,QAAQ,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,cAAc,EAAqB,CAAC;QAChD,2BAA2B,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC;IACL,yBAAyB,CAAC,CAAC,OAAO,EAAE,EAAE;QACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAA0C;IACpF,GAAG,CAAC,gBAAgB,GAAG,YAAY,EAAoD,CAAC;AAC1F,CAAC;AAED,IAAI,QAAQ,GAA6B,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/textshaper",
|
|
3
|
-
"version": "0.5.1-next.
|
|
3
|
+
"version": "0.5.1-next.1201.9b49dee",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.5.1-next.
|
|
42
|
-
"@flighthq/log": "0.5.1-next.
|
|
43
|
-
"@flighthq/signals": "0.5.1-next.
|
|
44
|
-
"@flighthq/types": "0.5.1-next.
|
|
41
|
+
"@flighthq/entity": "0.5.1-next.1201.9b49dee",
|
|
42
|
+
"@flighthq/log": "0.5.1-next.1201.9b49dee",
|
|
43
|
+
"@flighthq/signals": "0.5.1-next.1201.9b49dee",
|
|
44
|
+
"@flighthq/types": "0.5.1-next.1201.9b49dee"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"typescript": "^5.3.0"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { _setTextShaperBackendHook, _textShaperBackendHook } from './_textShaperHooks';
|
|
4
4
|
import { setTextShaperBackend } from './textShaper';
|
|
5
5
|
|
|
6
|
-
const _testBackend:
|
|
6
|
+
const _testBackend: HostTextShaperProvider = {
|
|
7
7
|
measureText: (text) => text.length,
|
|
8
8
|
};
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ afterEach(() => {
|
|
|
15
15
|
|
|
16
16
|
describe('_setTextShaperBackendHook', () => {
|
|
17
17
|
it('installs the hook so setTextShaperBackend invokes it with the new backend', () => {
|
|
18
|
-
let received:
|
|
18
|
+
let received: HostTextShaperProvider | null = _testBackend;
|
|
19
19
|
let calls = 0;
|
|
20
20
|
_setTextShaperBackendHook((backend) => {
|
|
21
21
|
received = backend;
|
|
@@ -27,7 +27,7 @@ describe('_setTextShaperBackendHook', () => {
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('passes null through to the hook when the backend is cleared', () => {
|
|
30
|
-
let received:
|
|
30
|
+
let received: HostTextShaperProvider | null = _testBackend;
|
|
31
31
|
_setTextShaperBackendHook((backend) => {
|
|
32
32
|
received = backend;
|
|
33
33
|
});
|
package/src/textShaper.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider, TextFormat, TextShaperOperation } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
explainTextShaperOperation,
|
|
@@ -36,15 +36,15 @@ describe('explainTextShaperOperation', () => {
|
|
|
36
36
|
|
|
37
37
|
it('reports an operation the backend does provide', () => {
|
|
38
38
|
const operation = OPTIONAL_OPERATIONS[0];
|
|
39
|
-
setTextShaperBackend({ ...partialBackend(), [operation]: () => undefined } as
|
|
39
|
+
setTextShaperBackend({ ...partialBackend(), [operation]: () => undefined } as HostTextShaperProvider);
|
|
40
40
|
expect(explainTextShaperOperation(operation)).toEqual({ implemented: true, layer: 'custom', operation });
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
it('reports an explicitly supplied provider as the host layer', () => {
|
|
44
44
|
const operation = OPTIONAL_OPERATIONS[0];
|
|
45
|
-
const backend = { ...partialBackend(), [operation]: () => undefined } as
|
|
45
|
+
const backend = { ...partialBackend(), [operation]: () => undefined } as HostTextShaperProvider;
|
|
46
46
|
setTextShaperBackend(partialBackend());
|
|
47
|
-
expect(explainTextShaperOperation(operation, shaperHost(backend))).toEqual({
|
|
47
|
+
expect(explainTextShaperOperation(operation, shaperHost(backend).text.shaper)).toEqual({
|
|
48
48
|
implemented: true,
|
|
49
49
|
layer: 'host',
|
|
50
50
|
operation,
|
|
@@ -54,10 +54,10 @@ describe('explainTextShaperOperation', () => {
|
|
|
54
54
|
|
|
55
55
|
describe('getTextShaperBackend', () => {
|
|
56
56
|
it('returns an explicit host provider ahead of the legacy backend', () => {
|
|
57
|
-
const legacy:
|
|
58
|
-
const explicit:
|
|
57
|
+
const legacy: HostTextShaperProvider = { measureText: () => 1 };
|
|
58
|
+
const explicit: HostTextShaperProvider = { measureText: () => 2 };
|
|
59
59
|
setTextShaperBackend(legacy);
|
|
60
|
-
expect(getTextShaperBackend(shaperHost(explicit))).toBe(explicit);
|
|
60
|
+
expect(getTextShaperBackend(shaperHost(explicit).text.shaper)).toBe(explicit);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
it('returns null before a backend is set', () => {
|
|
@@ -93,21 +93,21 @@ const OPTIONAL_OPERATIONS: readonly TextShaperOperation[] = [
|
|
|
93
93
|
describe('measureText', () => {
|
|
94
94
|
it('accepts an optional explicit shaper host without breaking the existing signature', () => {
|
|
95
95
|
expectTypeOf(measureText).toEqualTypeOf<
|
|
96
|
-
(text: string, format: Readonly<TextFormat>,
|
|
96
|
+
(text: string, format: Readonly<TextFormat>, hostTextShaper?: Readonly<HostTextShaperProvider>) => number
|
|
97
97
|
>();
|
|
98
98
|
});
|
|
99
99
|
|
|
100
100
|
it('gives an explicit host precedence over the legacy installed backend', () => {
|
|
101
101
|
setTextShaperBackend({ measureText: () => 99 });
|
|
102
|
-
expect(measureText('abc', {}, shaperHost({ measureText: (text) => text.length }))).toBe(3);
|
|
102
|
+
expect(measureText('abc', {}, shaperHost({ measureText: (text) => text.length }).text.shaper)).toBe(3);
|
|
103
103
|
});
|
|
104
104
|
|
|
105
105
|
it('isolates callers that interleave different explicit hosts', () => {
|
|
106
106
|
const first = shaperHost({ measureText: () => 1 });
|
|
107
107
|
const second = shaperHost({ measureText: () => 2 });
|
|
108
|
-
expect(measureText('x', {}, first)).toBe(1);
|
|
109
|
-
expect(measureText('x', {}, second)).toBe(2);
|
|
110
|
-
expect(measureText('x', {}, first)).toBe(1);
|
|
108
|
+
expect(measureText('x', {}, first.text.shaper)).toBe(1);
|
|
109
|
+
expect(measureText('x', {}, second.text.shaper)).toBe(2);
|
|
110
|
+
expect(measureText('x', {}, first.text.shaper)).toBe(1);
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
it('returns -1 when no backend is registered', () => {
|
|
@@ -122,7 +122,7 @@ describe('measureText', () => {
|
|
|
122
122
|
|
|
123
123
|
describe('setTextShaperBackend', () => {
|
|
124
124
|
it('stores the backend and clears it with null', () => {
|
|
125
|
-
const backend:
|
|
125
|
+
const backend: HostTextShaperProvider = { measureText: (text) => text.length };
|
|
126
126
|
setTextShaperBackend(backend);
|
|
127
127
|
expect(getTextShaperBackend()).toBe(backend);
|
|
128
128
|
setTextShaperBackend(null);
|
|
@@ -130,8 +130,8 @@ describe('setTextShaperBackend', () => {
|
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
it('replaces an existing backend (last write wins, no throw)', () => {
|
|
133
|
-
const first:
|
|
134
|
-
const second:
|
|
133
|
+
const first: HostTextShaperProvider = { measureText: () => 1 };
|
|
134
|
+
const second: HostTextShaperProvider = { measureText: () => 2 };
|
|
135
135
|
setTextShaperBackend(first);
|
|
136
136
|
setTextShaperBackend(second);
|
|
137
137
|
expect(getTextShaperBackend()).toBe(second);
|
|
@@ -139,12 +139,12 @@ describe('setTextShaperBackend', () => {
|
|
|
139
139
|
});
|
|
140
140
|
|
|
141
141
|
// A host implementing only the REQUIRED members — partial support declared by absence.
|
|
142
|
-
function partialBackend():
|
|
142
|
+
function partialBackend(): HostTextShaperProvider {
|
|
143
143
|
return {
|
|
144
144
|
measureText: (() => undefined) as never,
|
|
145
|
-
} as
|
|
145
|
+
} as HostTextShaperProvider;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
function shaperHost(shaper:
|
|
148
|
+
function shaperHost(shaper: HostTextShaperProvider): { readonly text: { readonly shaper: HostTextShaperProvider } } {
|
|
149
149
|
return { text: { shaper } };
|
|
150
150
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider, ShapedRun } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { setTextShaperBackend } from './textShaper';
|
|
4
4
|
import {
|
|
@@ -18,7 +18,7 @@ const _stubRun: ShapedRun = {
|
|
|
18
18
|
script: 'Latn',
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
function _makeCountingBackend(): { backend:
|
|
21
|
+
function _makeCountingBackend(): { backend: HostTextShaperProvider; readonly calls: number } {
|
|
22
22
|
let calls = 0;
|
|
23
23
|
return {
|
|
24
24
|
backend: {
|
|
@@ -91,7 +91,7 @@ describe('initializeTextShaperCache', () => {
|
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
function _hostWithAdvance(advanceWidth: number):
|
|
94
|
+
function _hostWithAdvance(advanceWidth: number): { readonly text: { readonly shaper: HostTextShaperProvider } } {
|
|
95
95
|
return {
|
|
96
96
|
text: {
|
|
97
97
|
shaper: {
|
|
@@ -106,9 +106,9 @@ describe('shapeTextRunCached', () => {
|
|
|
106
106
|
const cache = createTextShaperCache();
|
|
107
107
|
const first = _hostWithAdvance(1);
|
|
108
108
|
const second = _hostWithAdvance(2);
|
|
109
|
-
expect(shapeTextRunCached(cache, 'hi', {}, undefined, first)?.advanceWidth).toBe(1);
|
|
110
|
-
expect(shapeTextRunCached(cache, 'hi', {}, undefined, second)?.advanceWidth).toBe(2);
|
|
111
|
-
expect(shapeTextRunCached(cache, 'hi', {}, undefined, first)?.advanceWidth).toBe(1);
|
|
109
|
+
expect(shapeTextRunCached(cache, 'hi', {}, undefined, first.text.shaper)?.advanceWidth).toBe(1);
|
|
110
|
+
expect(shapeTextRunCached(cache, 'hi', {}, undefined, second.text.shaper)?.advanceWidth).toBe(2);
|
|
111
|
+
expect(shapeTextRunCached(cache, 'hi', {}, undefined, first.text.shaper)?.advanceWidth).toBe(1);
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
it('returns null when no backend is set', () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider, ShapedRun, ShapeRunOptions, TextFormat } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { setTextShaperBackend } from './textShaper';
|
|
4
4
|
import { itemizeText, shapeTextRuns } from './textShaperItemize';
|
|
@@ -79,9 +79,11 @@ describe('itemizeText', () => {
|
|
|
79
79
|
|
|
80
80
|
describe('shapeTextRuns', () => {
|
|
81
81
|
it('threads an explicit host to every shaped item', () => {
|
|
82
|
-
const host:
|
|
82
|
+
const host: { readonly text: { readonly shaper: HostTextShaperProvider } } = {
|
|
83
|
+
text: { shaper: _makeShapingBackend() },
|
|
84
|
+
};
|
|
83
85
|
setTextShaperBackend({ measureText: () => 0 });
|
|
84
|
-
expect(shapeTextRuns('ABسلام', {}, undefined, host)).toHaveLength(2);
|
|
86
|
+
expect(shapeTextRuns('ABسلام', {}, undefined, host.text.shaper)).toHaveLength(2);
|
|
85
87
|
});
|
|
86
88
|
|
|
87
89
|
it('returns empty array for empty string', () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FontMetrics, GlyphExtents,
|
|
1
|
+
import type { FontMetrics, GlyphExtents, HostTextShaperProvider, ShapedRun } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { setTextShaperBackend } from './textShaper';
|
|
4
4
|
import {
|
|
@@ -45,7 +45,7 @@ const _testMetrics: FontMetrics = {
|
|
|
45
45
|
|
|
46
46
|
const _testExtents: GlyphExtents = { height: 10, width: 6, xBearing: 0, yBearing: -8 };
|
|
47
47
|
|
|
48
|
-
function _makeFullBackend():
|
|
48
|
+
function _makeFullBackend(): HostTextShaperProvider {
|
|
49
49
|
return {
|
|
50
50
|
// Code point 65 ('A') maps to glyph 10 and back; everything else is unknown.
|
|
51
51
|
getCodePointForGlyph: (id) => (id === 10 ? 65 : -1),
|
|
@@ -299,8 +299,10 @@ describe('initializeShapedRun', () => {
|
|
|
299
299
|
describe('shapeTextRun', () => {
|
|
300
300
|
it('uses the explicitly supplied host instead of the legacy installed backend', () => {
|
|
301
301
|
setTextShaperBackend({ measureText: () => 0 });
|
|
302
|
-
const host:
|
|
303
|
-
|
|
302
|
+
const host: { readonly text: { readonly shaper: HostTextShaperProvider } } = {
|
|
303
|
+
text: { shaper: _makeFullBackend() },
|
|
304
|
+
};
|
|
305
|
+
expect(shapeTextRun('ab', {}, undefined, host.text.shaper)?.glyphCount).toBe(2);
|
|
304
306
|
});
|
|
305
307
|
|
|
306
308
|
it('returns null when no backend is set', () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HostTextShaperProvider } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { setTextShaperBackend } from './textShaper';
|
|
4
4
|
import {
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
initializeTextShaperSignals,
|
|
9
9
|
} from './textShaperSignals';
|
|
10
10
|
|
|
11
|
-
const _stubBackend:
|
|
12
|
-
const _stubBackend2:
|
|
11
|
+
const _stubBackend: HostTextShaperProvider = { measureText: () => 0 };
|
|
12
|
+
const _stubBackend2: HostTextShaperProvider = { measureText: () => 1 };
|
|
13
13
|
|
|
14
14
|
afterEach(() => {
|
|
15
15
|
disposeTextShaperSignals();
|
|
@@ -69,14 +69,14 @@ describe('initializeTextShaperSignals', () => {
|
|
|
69
69
|
describe('setTextShaperBackend', () => {
|
|
70
70
|
it('emits onBackendChanged with the new backend when signals are enabled', () => {
|
|
71
71
|
const sigs = enableTextShaperSignals();
|
|
72
|
-
const received: (
|
|
72
|
+
const received: (HostTextShaperProvider | null)[] = [];
|
|
73
73
|
sigs.onBackendChanged.emit = (b) => received.push(b);
|
|
74
74
|
setTextShaperBackend(_stubBackend);
|
|
75
75
|
expect(received).toEqual([_stubBackend]);
|
|
76
76
|
});
|
|
77
77
|
it('emits onBackendChanged with null when cleared', () => {
|
|
78
78
|
const sigs = enableTextShaperSignals();
|
|
79
|
-
const received: (
|
|
79
|
+
const received: (HostTextShaperProvider | null)[] = [];
|
|
80
80
|
sigs.onBackendChanged.emit = (b) => received.push(b);
|
|
81
81
|
setTextShaperBackend(_stubBackend);
|
|
82
82
|
setTextShaperBackend(null);
|