@flighthq/font 0.5.0-next.1944.cd6b6e7 → 0.5.1-edge.638.d4dbd4e

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 CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/font`. The `@flighth
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/font@0.5.0-next.1944.cd6b6e7](https://github.com/flighthq/flight/tree/cd6b6e71eb472b3a4249830a7743333f019fa7b7/packages/font)
17
- - [License](https://github.com/flighthq/flight/blob/cd6b6e71eb472b3a4249830a7743333f019fa7b7/LICENSE.md)
16
+ - [Source for @flighthq/font@0.5.1-edge.638.d4dbd4e](https://github.com/flighthq/flight/tree/d4dbd4e347dc8be10b180c85a766ab50333dcb51/packages/font)
17
+ - [License](https://github.com/flighthq/flight/blob/d4dbd4e347dc8be10b180c85a766ab50333dcb51/LICENSE.md)
@@ -1 +1 @@
1
- {"version":3,"file":"_fontFaceLoad.d.ts","sourceRoot":"","sources":["../src/_fontFaceLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAKxD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQpG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE1E"}
1
+ {"version":3,"file":"_fontFaceLoad.d.ts","sourceRoot":"","sources":["../src/_fontFaceLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAMxD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEnF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQpG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE1E"}
@@ -1,4 +1,5 @@
1
1
  import { inferFontFormatFromUrl } from './fontFormat';
2
+ import { getFontLoadingBackend } from './fontLoading';
2
3
  import { getFontShorthand } from './fontShorthand';
3
4
  export async function _loadFontFaceFromBytes(family, bytes) {
4
5
  const source = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
@@ -17,12 +18,12 @@ export function _loadFontFaceFromUrls(family, sources) {
17
18
  return loadAndRegisterFontFace(family, source);
18
19
  }
19
20
  export function _loadFontFacesFromName(family) {
20
- return document.fonts.load(getFontShorthand(family));
21
+ return getFontLoadingBackend().loadFontFaces(getFontShorthand(family));
21
22
  }
22
23
  async function loadAndRegisterFontFace(family, source) {
23
24
  const face = new FontFace(family, source);
24
25
  await face.load();
25
- document.fonts.add(face);
26
+ getFontLoadingBackend().addFontFace(face);
26
27
  return face;
27
28
  }
28
29
  //# sourceMappingURL=_fontFaceLoad.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_fontFaceLoad.js","sourceRoot":"","sources":["../src/_fontFaceLoad.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc,EAAE,KAAiB;IAC5E,MAAM,MAAM,GAAI,KAAK,CAAC,MAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1G,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,GAAW;IAC9D,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,OAA2B;IAC/E,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACvB,MAAM,cAAc,GAAG,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,cAAc,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC;IAC7F,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAA4B;IACjF,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"_fontFaceLoad.js","sourceRoot":"","sources":["../src/_fontFaceLoad.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc,EAAE,KAAiB;IAC5E,MAAM,MAAM,GAAI,KAAK,CAAC,MAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1G,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,GAAW;IAC9D,OAAO,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,OAA2B;IAC/E,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACvB,MAAM,cAAc,GAAG,MAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,aAAa,cAAc,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC;IAC7F,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,qBAAqB,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAA4B;IACjF,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAClB,qBAAqB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export * from './font';
2
2
  export * from './fontFormat';
3
3
  export * from './fontFrom';
4
+ export * from './fontLoading';
4
5
  export * from './fontResource';
5
6
  export * from './fontResourceFrom';
6
7
  export * from './fontShorthand';
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
package/dist/contract.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './font';
2
2
  export * from './fontFormat';
3
3
  export * from './fontFrom';
4
+ export * from './fontLoading';
4
5
  export * from './fontResource';
5
6
  export * from './fontResourceFrom';
6
7
  export * from './fontShorthand';
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { BackendExplanation, FontLoadingBackend } from '@flighthq/types/contract';
2
+ export declare function explainFontLoadingBackend(): BackendExplanation;
3
+ export declare function getFontLoadingBackend(): FontLoadingBackend;
4
+ export declare function hasFontLoadingHostBackend(): boolean;
5
+ export declare function installFontLoadingHostBackend(backend: FontLoadingBackend): void;
6
+ export declare function resetFontLoadingBackendForTest(): void;
7
+ export declare function setFontLoadingBackend(backend: FontLoadingBackend | null): void;
8
+ //# sourceMappingURL=fontLoading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontLoading.d.ts","sourceRoot":"","sources":["../src/fontLoading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,wBAAgB,yBAAyB,IAAI,kBAAkB,CAQ9D;AAED,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAM/E;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAIrD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE9E"}
@@ -0,0 +1,47 @@
1
+ export function explainFontLoadingBackend() {
2
+ if (_custom !== null) {
3
+ return { conflict: _hostConflict, layer: 'custom', operation: null, viability: 'unobserved' };
4
+ }
5
+ if (_host !== null) {
6
+ return { conflict: _hostConflict, layer: 'host', operation: null, viability: 'unobserved' };
7
+ }
8
+ return { conflict: false, layer: 'host-not-enabled', operation: null, viability: 'unobserved' };
9
+ }
10
+ export function getFontLoadingBackend() {
11
+ return _custom ?? _host ?? _sentinel;
12
+ }
13
+ export function hasFontLoadingHostBackend() {
14
+ return _host !== null;
15
+ }
16
+ export function installFontLoadingHostBackend(backend) {
17
+ if (_host !== null) {
18
+ if (_host !== backend)
19
+ _hostConflict = true;
20
+ return;
21
+ }
22
+ _host = backend;
23
+ }
24
+ export function resetFontLoadingBackendForTest() {
25
+ _custom = null;
26
+ _host = null;
27
+ _hostConflict = false;
28
+ }
29
+ export function setFontLoadingBackend(backend) {
30
+ _custom = backend;
31
+ }
32
+ let _custom = null;
33
+ let _host = null;
34
+ let _hostConflict = false;
35
+ const _sentinel = {
36
+ addFontFace() { },
37
+ checkFontFace() {
38
+ return false;
39
+ },
40
+ loadFontFaces() {
41
+ return Promise.resolve([]);
42
+ },
43
+ whenReady() {
44
+ return Promise.resolve();
45
+ },
46
+ };
47
+ //# sourceMappingURL=fontLoading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontLoading.js","sourceRoot":"","sources":["../src/fontLoading.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB;IACvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,KAAK,KAAK,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,OAA2B;IACvE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,KAAK,KAAK,OAAO;YAAE,aAAa,GAAG,IAAI,CAAC;QAC5C,OAAO;IACT,CAAC;IACD,KAAK,GAAG,OAAO,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,GAAG,IAAI,CAAC;IACf,KAAK,GAAG,IAAI,CAAC;IACb,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAkC;IACtE,OAAO,GAAG,OAAO,CAAC;AACpB,CAAC;AAED,IAAI,OAAO,GAA8B,IAAI,CAAC;AAC9C,IAAI,KAAK,GAA8B,IAAI,CAAC;AAC5C,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,MAAM,SAAS,GAAuB;IACpC,WAAW,KAAU,CAAC;IACtB,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,aAAa;QACX,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS;QACP,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fontStatus.d.ts","sourceRoot":"","sources":["../src/fontStatus.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD"}
1
+ {"version":3,"file":"fontStatus.d.ts","sourceRoot":"","sources":["../src/fontStatus.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD"}
@@ -1,8 +1,9 @@
1
+ import { getFontLoadingBackend } from './fontLoading';
1
2
  import { getFontShorthand } from './fontShorthand';
2
3
  export function isFontLoaded(family, style) {
3
- return document.fonts.check(getFontShorthand(family, style));
4
+ return getFontLoadingBackend().checkFontFace(getFontShorthand(family, style));
4
5
  }
5
6
  export async function whenFontsReady() {
6
- await document.fonts.ready;
7
+ await getFontLoadingBackend().whenReady();
7
8
  }
8
9
  //# sourceMappingURL=fontStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fontStatus.js","sourceRoot":"","sources":["../src/fontStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAc;IACzD,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"fontStatus.js","sourceRoot":"","sources":["../src/fontStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAc;IACzD,OAAO,qBAAqB,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,qBAAqB,EAAE,CAAC,SAAS,EAAE,CAAC;AAC5C,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { GlyphOutlineSource, GlyphRasterizerBackend } from '@flighthq/types/contract';
2
- export declare function createGlyphRasterizerBackendFromGlyphOutlineSource(source: GlyphOutlineSource): GlyphRasterizerBackend;
1
+ import type { Entity, GlyphOutlineSource, GlyphRasterizerBackend } from '@flighthq/types/contract';
2
+ export declare function createGlyphRasterizerBackendFromGlyphOutlineSource(source: GlyphOutlineSource): GlyphRasterizerBackend & Entity;
3
3
  //# sourceMappingURL=glyphOutlineSource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"glyphOutlineSource.d.ts","sourceRoot":"","sources":["../src/glyphOutlineSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,kBAAkB,EAGlB,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAOlC,wBAAgB,kDAAkD,CAAC,MAAM,EAAE,kBAAkB,GAAG,sBAAsB,CAgBrH"}
1
+ {"version":3,"file":"glyphOutlineSource.d.ts","sourceRoot":"","sources":["../src/glyphOutlineSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,MAAM,EAEN,kBAAkB,EAGlB,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAOlC,wBAAgB,kDAAkD,CAChE,MAAM,EAAE,kBAAkB,GACzB,sBAAsB,GAAG,MAAM,CAgBjC"}
@@ -1,3 +1,4 @@
1
+ import { createEntity } from '@flighthq/entity/contract';
1
2
  import { createPath, flattenPath, getPathBounds } from '@flighthq/path/contract';
2
3
  // Adapts an index-keyed vector font into the codepoint-keyed rasterizer consumed by glyphatlas. The
3
4
  // adapter is bound to one source, so callers can install it on one GlyphAtlas through
@@ -5,7 +6,7 @@ import { createPath, flattenPath, getPathBounds } from '@flighthq/path/contract'
5
6
  // portable 4x4 coverage scan over flattened contours: it needs no DOM/canvas and therefore works for
6
7
  // imported fonts in browser, worker, native-host, and headless environments alike.
7
8
  export function createGlyphRasterizerBackendFromGlyphOutlineSource(source) {
8
- return {
9
+ return createEntity({
9
10
  measureMetrics(options) {
10
11
  const metrics = source.getGlyphOutlineMetrics();
11
12
  const scale = resolveGlyphOutlineScale(metrics.unitsPerEm, options.fontSize);
@@ -20,7 +21,7 @@ export function createGlyphRasterizerBackendFromGlyphOutlineSource(source) {
20
21
  rasterize(codePoint, options) {
21
22
  return rasterizeGlyphOutlineSource(source, codePoint, options);
22
23
  },
23
- };
24
+ });
24
25
  }
25
26
  function rasterizeGlyphOutlineSource(source, codePoint, options) {
26
27
  const glyphIndex = source.getGlyphOutlineIndexForCodePoint(codePoint);
@@ -1 +1 @@
1
- {"version":3,"file":"glyphOutlineSource.js","sourceRoot":"","sources":["../src/glyphOutlineSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"glyphOutlineSource.js","sourceRoot":"","sources":["../src/glyphOutlineSource.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/font",
3
- "version": "0.5.0-next.1944.cd6b6e7",
3
+ "version": "0.5.1-edge.638.d4dbd4e",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,9 +38,9 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.5.0-next.1944.cd6b6e7",
42
- "@flighthq/path": "0.5.0-next.1944.cd6b6e7",
43
- "@flighthq/types": "0.5.0-next.1944.cd6b6e7"
41
+ "@flighthq/entity": "0.5.1-edge.638.d4dbd4e",
42
+ "@flighthq/path": "0.5.1-edge.638.d4dbd4e",
43
+ "@flighthq/types": "0.5.1-edge.638.d4dbd4e"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "^5.3.0"
@@ -1,9 +1,12 @@
1
+ import type { FontLoadingBackend } from '@flighthq/types/contract';
2
+
1
3
  import {
2
4
  _loadFontFaceFromBytes,
3
5
  _loadFontFaceFromUrl,
4
6
  _loadFontFaceFromUrls,
5
7
  _loadFontFacesFromName,
6
8
  } from './_fontFaceLoad';
9
+ import { resetFontLoadingBackendForTest, setFontLoadingBackend } from './fontLoading';
7
10
 
8
11
  interface FontFaceConstruction {
9
12
  family: string;
@@ -12,8 +15,8 @@ interface FontFaceConstruction {
12
15
  }
13
16
 
14
17
  let constructions: FontFaceConstruction[];
15
- let addMock: ReturnType<typeof vi.fn>;
16
- let loadMock: ReturnType<typeof vi.fn>;
18
+ let addMock = vi.fn<(face: FontFace) => void>();
19
+ let loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>();
17
20
 
18
21
  class MockFontFace {
19
22
  load = vi.fn().mockResolvedValue(undefined);
@@ -22,25 +25,22 @@ class MockFontFace {
22
25
  }
23
26
  }
24
27
 
25
- let originalFonts: PropertyDescriptor | undefined;
26
28
  beforeEach(() => {
27
29
  constructions = [];
28
- addMock = vi.fn();
29
- loadMock = vi.fn().mockResolvedValue([]);
30
+ addMock = vi.fn<(face: FontFace) => void>();
31
+ loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>().mockResolvedValue([]);
30
32
  vi.stubGlobal('FontFace', MockFontFace);
31
- originalFonts = Object.getOwnPropertyDescriptor(document, 'fonts');
32
- Object.defineProperty(document, 'fonts', {
33
- value: { add: addMock, load: loadMock },
34
- configurable: true,
35
- });
33
+ const backend: FontLoadingBackend = {
34
+ addFontFace: addMock,
35
+ checkFontFace: vi.fn<(shorthand: string) => boolean>().mockReturnValue(false),
36
+ loadFontFaces: loadMock,
37
+ whenReady: vi.fn<() => Promise<void>>().mockResolvedValue(undefined),
38
+ };
39
+ setFontLoadingBackend(backend);
36
40
  });
37
41
 
38
42
  afterEach(() => {
39
- if (originalFonts) {
40
- Object.defineProperty(document, 'fonts', originalFonts);
41
- } else {
42
- delete (document as unknown as { fonts?: unknown }).fonts;
43
- }
43
+ resetFontLoadingBackendForTest();
44
44
  vi.unstubAllGlobals();
45
45
  vi.restoreAllMocks();
46
46
  });
@@ -1,4 +1,7 @@
1
+ import type { FontLoadingBackend } from '@flighthq/types/contract';
2
+
1
3
  import { loadFontFromBytes, loadFontFromName, loadFontFromUrl, loadFontFromUrls } from './fontFrom';
4
+ import { resetFontLoadingBackendForTest, setFontLoadingBackend } from './fontLoading';
2
5
 
3
6
  interface FontFaceConstruction {
4
7
  family: string;
@@ -7,38 +10,34 @@ interface FontFaceConstruction {
7
10
  }
8
11
 
9
12
  let constructions: FontFaceConstruction[];
10
- let addMock: ReturnType<typeof vi.fn>;
11
- let loadMock: ReturnType<typeof vi.fn>;
13
+ let addMock = vi.fn<(face: FontFace) => void>();
14
+ let loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>();
12
15
 
13
16
  class MockFontFace {
14
17
  load = vi.fn().mockResolvedValue(undefined);
15
18
  constructor(family: string, source: string | ArrayBuffer) {
16
- const construction = { family, source, instance: this };
17
- constructions.push(construction);
19
+ constructions.push({ family, source, instance: this });
18
20
  }
19
21
  }
20
22
 
21
- // Re-applied per test (not once) and torn down, so under a shared (isolate:false) worker with
22
- // unstubGlobals the FontFace stub survives every test and the document.fonts patch never leaks out.
23
- let originalFonts: PropertyDescriptor | undefined;
24
23
  beforeEach(() => {
25
24
  constructions = [];
26
- addMock = vi.fn();
27
- loadMock = vi.fn().mockResolvedValue([]);
25
+ addMock = vi.fn<(face: FontFace) => void>();
26
+ loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>().mockResolvedValue([]);
28
27
  vi.stubGlobal('FontFace', MockFontFace);
29
- originalFonts = Object.getOwnPropertyDescriptor(document, 'fonts');
30
- Object.defineProperty(document, 'fonts', {
31
- value: { add: addMock, load: loadMock },
32
- configurable: true,
33
- });
28
+ const backend: FontLoadingBackend = {
29
+ addFontFace: addMock,
30
+ checkFontFace: vi.fn<(shorthand: string) => boolean>().mockReturnValue(false),
31
+ loadFontFaces: loadMock,
32
+ whenReady: vi.fn<() => Promise<void>>().mockResolvedValue(undefined),
33
+ };
34
+ setFontLoadingBackend(backend);
34
35
  });
35
36
 
36
37
  afterEach(() => {
37
- if (originalFonts) {
38
- Object.defineProperty(document, 'fonts', originalFonts);
39
- } else {
40
- delete (document as unknown as { fonts?: unknown }).fonts;
41
- }
38
+ resetFontLoadingBackendForTest();
39
+ vi.unstubAllGlobals();
40
+ vi.restoreAllMocks();
42
41
  });
43
42
 
44
43
  describe('loadFontFromBytes', () => {
@@ -47,7 +46,7 @@ describe('loadFontFromBytes', () => {
47
46
  expect(font.name).toBe('TestFont');
48
47
  });
49
48
 
50
- it('loads the face and registers it with document.fonts', async () => {
49
+ it('loads the face and registers it via the backend', async () => {
51
50
  await loadFontFromBytes(new Uint8Array(8), 'TestFont');
52
51
  expect(constructions).toHaveLength(1);
53
52
  expect(constructions[0].family).toBe('TestFont');
@@ -0,0 +1,165 @@
1
+ import type { FontLoadingBackend } from '@flighthq/types/contract';
2
+
3
+ import {
4
+ explainFontLoadingBackend,
5
+ getFontLoadingBackend,
6
+ hasFontLoadingHostBackend,
7
+ installFontLoadingHostBackend,
8
+ resetFontLoadingBackendForTest,
9
+ setFontLoadingBackend,
10
+ } from './fontLoading';
11
+
12
+ afterEach(() => {
13
+ resetFontLoadingBackendForTest();
14
+ });
15
+
16
+ function createMockBackend(overrides: Partial<FontLoadingBackend> = {}): FontLoadingBackend {
17
+ return {
18
+ addFontFace: vi.fn(),
19
+ checkFontFace: vi.fn().mockReturnValue(true),
20
+ loadFontFaces: vi.fn().mockResolvedValue([]),
21
+ whenReady: vi.fn().mockResolvedValue(undefined),
22
+ ...overrides,
23
+ };
24
+ }
25
+
26
+ describe('explainFontLoadingBackend', () => {
27
+ it('reports host-not-enabled when no backend is installed', () => {
28
+ expect(explainFontLoadingBackend()).toEqual({
29
+ conflict: false,
30
+ layer: 'host-not-enabled',
31
+ operation: null,
32
+ viability: 'unobserved',
33
+ });
34
+ });
35
+
36
+ it('reports host when a host backend is installed', () => {
37
+ installFontLoadingHostBackend(createMockBackend());
38
+ expect(explainFontLoadingBackend()).toEqual({
39
+ conflict: false,
40
+ layer: 'host',
41
+ operation: null,
42
+ viability: 'unobserved',
43
+ });
44
+ });
45
+
46
+ it('reports custom when a custom backend is set', () => {
47
+ setFontLoadingBackend(createMockBackend());
48
+ expect(explainFontLoadingBackend()).toEqual({
49
+ conflict: false,
50
+ layer: 'custom',
51
+ operation: null,
52
+ viability: 'unobserved',
53
+ });
54
+ });
55
+
56
+ it('reports custom over host when both are installed', () => {
57
+ installFontLoadingHostBackend(createMockBackend());
58
+ setFontLoadingBackend(createMockBackend());
59
+ expect(explainFontLoadingBackend().layer).toBe('custom');
60
+ });
61
+
62
+ it('reports conflict when a different host backend is installed twice', () => {
63
+ installFontLoadingHostBackend(createMockBackend());
64
+ installFontLoadingHostBackend(createMockBackend());
65
+ expect(explainFontLoadingBackend().conflict).toBe(true);
66
+ });
67
+ });
68
+
69
+ describe('getFontLoadingBackend', () => {
70
+ it('returns the sentinel when no backend is installed', () => {
71
+ const backend = getFontLoadingBackend();
72
+ expect(backend.checkFontFace('1em serif')).toBe(false);
73
+ });
74
+
75
+ it('returns the host backend when installed', () => {
76
+ const host = createMockBackend();
77
+ installFontLoadingHostBackend(host);
78
+ expect(getFontLoadingBackend()).toBe(host);
79
+ });
80
+
81
+ it('returns the custom backend when set', () => {
82
+ const custom = createMockBackend();
83
+ setFontLoadingBackend(custom);
84
+ expect(getFontLoadingBackend()).toBe(custom);
85
+ });
86
+
87
+ it('prefers custom over host', () => {
88
+ const host = createMockBackend();
89
+ const custom = createMockBackend();
90
+ installFontLoadingHostBackend(host);
91
+ setFontLoadingBackend(custom);
92
+ expect(getFontLoadingBackend()).toBe(custom);
93
+ });
94
+
95
+ it('reveals host when custom is cleared', () => {
96
+ const host = createMockBackend();
97
+ installFontLoadingHostBackend(host);
98
+ setFontLoadingBackend(createMockBackend());
99
+ setFontLoadingBackend(null);
100
+ expect(getFontLoadingBackend()).toBe(host);
101
+ });
102
+ });
103
+
104
+ describe('hasFontLoadingHostBackend', () => {
105
+ it('returns false when no host is installed', () => {
106
+ expect(hasFontLoadingHostBackend()).toBe(false);
107
+ });
108
+
109
+ it('returns true after installing a host backend', () => {
110
+ installFontLoadingHostBackend(createMockBackend());
111
+ expect(hasFontLoadingHostBackend()).toBe(true);
112
+ });
113
+ });
114
+
115
+ describe('installFontLoadingHostBackend', () => {
116
+ it('ignores a second install of the same instance', () => {
117
+ const host = createMockBackend();
118
+ installFontLoadingHostBackend(host);
119
+ installFontLoadingHostBackend(host);
120
+ expect(explainFontLoadingBackend().conflict).toBe(false);
121
+ });
122
+ });
123
+
124
+ describe('resetFontLoadingBackendForTest', () => {
125
+ it('clears all backend state', () => {
126
+ installFontLoadingHostBackend(createMockBackend());
127
+ setFontLoadingBackend(createMockBackend());
128
+ resetFontLoadingBackendForTest();
129
+ expect(hasFontLoadingHostBackend()).toBe(false);
130
+ expect(explainFontLoadingBackend().layer).toBe('host-not-enabled');
131
+ });
132
+ });
133
+
134
+ describe('sentinel', () => {
135
+ it('addFontFace is a no-op', () => {
136
+ const backend = getFontLoadingBackend();
137
+ expect(() => backend.addFontFace({} as FontFace)).not.toThrow();
138
+ });
139
+
140
+ it('checkFontFace returns false', () => {
141
+ expect(getFontLoadingBackend().checkFontFace('1em serif')).toBe(false);
142
+ });
143
+
144
+ it('loadFontFaces resolves to an empty array', async () => {
145
+ await expect(getFontLoadingBackend().loadFontFaces('1em serif')).resolves.toEqual([]);
146
+ });
147
+
148
+ it('whenReady resolves', async () => {
149
+ await expect(getFontLoadingBackend().whenReady()).resolves.toBeUndefined();
150
+ });
151
+ });
152
+
153
+ describe('setFontLoadingBackend', () => {
154
+ it('sets a custom backend', () => {
155
+ const custom = createMockBackend();
156
+ setFontLoadingBackend(custom);
157
+ expect(getFontLoadingBackend()).toBe(custom);
158
+ });
159
+
160
+ it('clears the custom backend with null', () => {
161
+ setFontLoadingBackend(createMockBackend());
162
+ setFontLoadingBackend(null);
163
+ expect(getFontLoadingBackend().checkFontFace('1em serif')).toBe(false);
164
+ });
165
+ });
@@ -1,3 +1,6 @@
1
+ import type { FontLoadingBackend } from '@flighthq/types/contract';
2
+
3
+ import { resetFontLoadingBackendForTest, setFontLoadingBackend } from './fontLoading';
1
4
  import { createFontResource } from './fontResource';
2
5
  import {
3
6
  loadFontResourceFromBytes,
@@ -13,8 +16,8 @@ interface FontFaceConstruction {
13
16
  }
14
17
 
15
18
  let constructions: FontFaceConstruction[];
16
- let addMock: ReturnType<typeof vi.fn>;
17
- let loadMock: ReturnType<typeof vi.fn>;
19
+ let addMock = vi.fn<(face: FontFace) => void>();
20
+ let loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>();
18
21
 
19
22
  class MockFontFace {
20
23
  load = vi.fn().mockResolvedValue(undefined);
@@ -23,28 +26,22 @@ class MockFontFace {
23
26
  }
24
27
  }
25
28
 
26
- // Mirrors the harness in fontFrom.test.ts, including its restore discipline: the document.fonts
27
- // descriptor is saved and put back per test rather than left overwritten, so under a shared
28
- // (isolate:false) worker the patch cannot leak into a sibling file.
29
- let originalFonts: PropertyDescriptor | undefined;
30
29
  beforeEach(() => {
31
30
  constructions = [];
32
- addMock = vi.fn();
33
- loadMock = vi.fn().mockResolvedValue([]);
31
+ addMock = vi.fn<(face: FontFace) => void>();
32
+ loadMock = vi.fn<(shorthand: string) => Promise<FontFace[]>>().mockResolvedValue([]);
34
33
  vi.stubGlobal('FontFace', MockFontFace);
35
- originalFonts = Object.getOwnPropertyDescriptor(document, 'fonts');
36
- Object.defineProperty(document, 'fonts', {
37
- value: { add: addMock, load: loadMock },
38
- configurable: true,
39
- });
34
+ const backend: FontLoadingBackend = {
35
+ addFontFace: addMock,
36
+ checkFontFace: vi.fn<(shorthand: string) => boolean>().mockReturnValue(false),
37
+ loadFontFaces: loadMock,
38
+ whenReady: vi.fn<() => Promise<void>>().mockResolvedValue(undefined),
39
+ };
40
+ setFontLoadingBackend(backend);
40
41
  });
41
42
 
42
43
  afterEach(() => {
43
- if (originalFonts) {
44
- Object.defineProperty(document, 'fonts', originalFonts);
45
- } else {
46
- delete (document as unknown as { fonts?: unknown }).fonts;
47
- }
44
+ resetFontLoadingBackendForTest();
48
45
  vi.unstubAllGlobals();
49
46
  vi.restoreAllMocks();
50
47
  });
@@ -62,8 +59,6 @@ describe('loadFontResourceFromBytes', () => {
62
59
  });
63
60
 
64
61
  it('slices only the view bytes out of a larger backing buffer', async () => {
65
- // This integration assertion pins that the resource wrapper forwards its view to the canonical
66
- // byte loader rather than widening it back to the whole buffer.
67
62
  const backing = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
68
63
  await loadFontResourceFromBytes(createFontResource('TestFont'), backing.subarray(2, 6));
69
64
  expect(new Uint8Array(constructions[0].source as ArrayBuffer)).toEqual(new Uint8Array([3, 4, 5, 6]));
@@ -85,9 +80,6 @@ describe('loadFontResourceFromBytes', () => {
85
80
  });
86
81
 
87
82
  it('leaves a previously loaded face attached when a reload fails', async () => {
88
- // The contract this pins: `face` is assigned only after the load resolves, so a failed reload
89
- // rejects and leaves the resource on the font it already had rather than blanking it. A caller
90
- // that ignores the rejection keeps rendering with a working font instead of losing one.
91
83
  const resource = createFontResource('TestFont');
92
84
  await loadFontResourceFromBytes(resource, new Uint8Array(4));
93
85
  const loaded = resource.face;
@@ -118,7 +110,7 @@ describe('loadFontResourceFromName', () => {
118
110
  expect(loadMock).toHaveBeenCalledWith("1em 'Josh\\'s Font'");
119
111
  });
120
112
 
121
- it('attaches the first face when the document returns several', async () => {
113
+ it('attaches the first face when the backend returns several', async () => {
122
114
  const first = { family: 'first' } as unknown as FontFace;
123
115
  const second = { family: 'second' } as unknown as FontFace;
124
116
  loadMock.mockResolvedValue([first, second]);
@@ -181,9 +173,6 @@ describe('loadFontResourceFromUrl', () => {
181
173
 
182
174
  describe('loadFontResourceFromUrls', () => {
183
175
  it('composes a comma-joined src with explicit and inferred format() hints', async () => {
184
- // The block this replaces was titled "builds a multi-source src string" and asserted nothing
185
- // about the string — only that a face was attached. The composed src is the whole point of this
186
- // function, and it was the one thing not checked.
187
176
  const resource = createFontResource('MyFont');
188
177
  const result = await loadFontResourceFromUrls(resource, [
189
178
  { url: 'font.woff2', format: 'woff2' },
@@ -1,27 +1,29 @@
1
+ import type { FontLoadingBackend } from '@flighthq/types/contract';
2
+
3
+ import { resetFontLoadingBackendForTest, setFontLoadingBackend } from './fontLoading';
1
4
  import { isFontLoaded, whenFontsReady } from './fontStatus';
2
5
 
3
- let originalFonts: PropertyDescriptor | undefined;
4
- let checkMock: ReturnType<typeof vi.fn>;
6
+ let checkMock = vi.fn<(shorthand: string) => boolean>();
7
+ let whenReadyMock = vi.fn<() => Promise<void>>();
5
8
 
6
9
  beforeEach(() => {
7
- checkMock = vi.fn().mockReturnValue(true);
8
- originalFonts = Object.getOwnPropertyDescriptor(document, 'fonts');
9
- Object.defineProperty(document, 'fonts', {
10
- value: { check: checkMock, ready: Promise.resolve() },
11
- configurable: true,
12
- });
10
+ checkMock = vi.fn<(shorthand: string) => boolean>().mockReturnValue(true);
11
+ whenReadyMock = vi.fn<() => Promise<void>>().mockResolvedValue(undefined);
12
+ const backend: FontLoadingBackend = {
13
+ addFontFace: vi.fn<(face: FontFace) => void>(),
14
+ checkFontFace: checkMock,
15
+ loadFontFaces: vi.fn<(shorthand: string) => Promise<FontFace[]>>().mockResolvedValue([]),
16
+ whenReady: whenReadyMock,
17
+ };
18
+ setFontLoadingBackend(backend);
13
19
  });
14
20
 
15
21
  afterEach(() => {
16
- if (originalFonts) {
17
- Object.defineProperty(document, 'fonts', originalFonts);
18
- } else {
19
- delete (document as unknown as { fonts?: unknown }).fonts;
20
- }
22
+ resetFontLoadingBackendForTest();
21
23
  });
22
24
 
23
25
  describe('isFontLoaded', () => {
24
- it('queries document.fonts.check with the family shorthand', () => {
26
+ it('queries the backend with the family shorthand', () => {
25
27
  expect(isFontLoaded('MyFont')).toBe(true);
26
28
  expect(checkMock).toHaveBeenCalledWith("1em 'MyFont'");
27
29
  });
@@ -43,7 +45,8 @@ describe('isFontLoaded', () => {
43
45
  });
44
46
 
45
47
  describe('whenFontsReady', () => {
46
- it('resolves once document.fonts.ready resolves', async () => {
48
+ it('resolves once the backend reports ready', async () => {
47
49
  await expect(whenFontsReady()).resolves.toBeUndefined();
50
+ expect(whenReadyMock).toHaveBeenCalledOnce();
48
51
  });
49
52
  });
@@ -1,10 +1,17 @@
1
1
  import { appendPathClose, appendPathLineTo, appendPathMoveTo } from '@flighthq/path/contract';
2
2
  import type { GlyphOutlineSource, Path } from '@flighthq/types/contract';
3
+ import { EntityRuntimeKey } from '@flighthq/types/contract';
3
4
  import { describe, expect, it } from 'vitest';
4
5
 
5
6
  import { createGlyphRasterizerBackendFromGlyphOutlineSource } from './glyphOutlineSource';
6
7
 
7
8
  describe('createGlyphRasterizerBackendFromGlyphOutlineSource', () => {
9
+ it('returns an Entity', () => {
10
+ expect(EntityRuntimeKey in createGlyphRasterizerBackendFromGlyphOutlineSource(createTestGlyphOutlineSource())).toBe(
11
+ true,
12
+ );
13
+ });
14
+
8
15
  it('maps codepoints to glyph indices and rasterizes design-unit outlines at the requested em size', () => {
9
16
  const backend = createGlyphRasterizerBackendFromGlyphOutlineSource(createTestGlyphOutlineSource());
10
17
  const raster = backend.rasterize(0x41, { fontFamily: 'embedded', fontSize: 20 });