three-text 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE_THIRD_PARTY +15 -0
  2. package/README.md +73 -42
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +1 -1
  6. package/dist/index.min.cjs +1 -1
  7. package/dist/index.min.js +1 -1
  8. package/dist/index.umd.js +1 -1
  9. package/dist/index.umd.min.js +1 -1
  10. package/dist/three/react.d.ts +2 -0
  11. package/dist/types/core/types.d.ts +2 -33
  12. package/dist/types/vector/{core.d.ts → core/index.d.ts} +8 -7
  13. package/dist/types/vector/index.d.ts +22 -25
  14. package/dist/types/vector/react.d.ts +4 -3
  15. package/dist/types/vector/slug/SlugPacker.d.ts +2 -0
  16. package/dist/types/vector/slug/curveUtils.d.ts +6 -0
  17. package/dist/types/vector/slug/index.d.ts +8 -0
  18. package/dist/types/vector/slug/shaderStrings.d.ts +4 -0
  19. package/dist/types/vector/slug/slugGLSL.d.ts +21 -0
  20. package/dist/types/vector/slug/slugTSL.d.ts +13 -0
  21. package/dist/types/vector/slug/types.d.ts +30 -0
  22. package/dist/types/vector/slug/unpackVertices.d.ts +11 -0
  23. package/dist/types/vector/webgl/index.d.ts +7 -3
  24. package/dist/types/vector/webgpu/index.d.ts +4 -4
  25. package/dist/vector/core/index.cjs +856 -0
  26. package/dist/vector/core/index.d.ts +63 -0
  27. package/dist/vector/core/index.js +854 -0
  28. package/dist/vector/core.cjs +4419 -240
  29. package/dist/vector/core.d.ts +361 -71
  30. package/dist/vector/core.js +4406 -226
  31. package/dist/vector/index.cjs +5 -229
  32. package/dist/vector/index.d.ts +45 -396
  33. package/dist/vector/index.js +3 -223
  34. package/dist/vector/index2.cjs +287 -0
  35. package/dist/vector/index2.js +264 -0
  36. package/dist/vector/react.cjs +37 -8
  37. package/dist/vector/react.d.ts +6 -3
  38. package/dist/vector/react.js +18 -8
  39. package/dist/vector/slugTSL.cjs +252 -0
  40. package/dist/vector/slugTSL.js +231 -0
  41. package/dist/vector/webgl/index.cjs +131 -201
  42. package/dist/vector/webgl/index.d.ts +19 -44
  43. package/dist/vector/webgl/index.js +131 -201
  44. package/dist/vector/webgpu/index.cjs +100 -283
  45. package/dist/vector/webgpu/index.d.ts +16 -45
  46. package/dist/vector/webgpu/index.js +100 -283
  47. package/package.json +6 -1
  48. package/dist/types/vector/GlyphVectorGeometryBuilder.d.ts +0 -26
  49. package/dist/types/vector/LoopBlinnGeometry.d.ts +0 -68
  50. package/dist/types/vector/loopBlinnTSL.d.ts +0 -22
  51. package/dist/vector/loopBlinnTSL.cjs +0 -229
  52. package/dist/vector/loopBlinnTSL.js +0 -207
@@ -1,7 +1,31 @@
1
- import { Text as Text$1 } from '../core/Text';
2
- import { VectorGlyphInfo, TextQueryOptions, TextRange, LoadedFont, TextOptions } from '../core/types';
3
- export { LoadedFont, TextOptions, VectorGlyphInfo } from '../core/types';
1
+ interface HyphenationTrieNode {
2
+ patterns: number[] | null;
3
+ children: {
4
+ [char: string]: HyphenationTrieNode;
5
+ };
6
+ }
4
7
 
8
+ declare class Vec3 {
9
+ x: number;
10
+ y: number;
11
+ z: number;
12
+ constructor(x?: number, y?: number, z?: number);
13
+ set(x: number, y: number, z: number): Vec3;
14
+ clone(): Vec3;
15
+ copy(v: Vec3): Vec3;
16
+ add(v: Vec3): Vec3;
17
+ sub(v: Vec3): Vec3;
18
+ multiply(scalar: number): Vec3;
19
+ divide(scalar: number): Vec3;
20
+ length(): number;
21
+ lengthSq(): number;
22
+ normalize(): Vec3;
23
+ dot(v: Vec3): number;
24
+ cross(v: Vec3): Vec3;
25
+ distanceTo(v: Vec3): number;
26
+ distanceToSquared(v: Vec3): number;
27
+ equals(v: Vec3): boolean;
28
+ }
5
29
  interface BoundingBox {
6
30
  min: {
7
31
  x: number;
@@ -15,87 +39,353 @@ interface BoundingBox {
15
39
  };
16
40
  }
17
41
 
18
- interface QuadraticSegment {
19
- p0x: number;
20
- p0y: number;
21
- p1x: number;
22
- p1y: number;
23
- p2x: number;
24
- p2y: number;
25
- }
26
- interface ContourVertex {
27
- x: number;
28
- y: number;
42
+ interface HarfBuzzGlyph {
43
+ g: number;
44
+ cl: number;
45
+ ax: number;
46
+ ay: number;
47
+ dx: number;
48
+ dy: number;
49
+ x?: number;
50
+ y?: number;
51
+ lineIndex: number;
52
+ absoluteTextIndex: number;
29
53
  }
30
- interface VectorContour {
31
- vertices: ContourVertex[];
32
- segments: QuadraticSegment[];
33
- }
34
- interface VectorGlyphAttributes {
35
- glyphCenter: Float32Array;
36
- glyphIndex: Float32Array;
37
- glyphProgress: Float32Array;
38
- glyphLineIndex: Float32Array;
39
- glyphBaselineY: Float32Array;
40
- }
41
- interface GlyphRange {
42
- interiorIndexStart: number;
43
- interiorIndexCount: number;
44
- curveVertexStart: number;
45
- curveVertexCount: number;
46
- }
47
- interface VectorGeometryData {
48
- interiorPositions: Float32Array;
49
- interiorIndices: Uint32Array;
50
- curvePositions: Float32Array;
51
- fillPositions: Float32Array;
52
- fillIndices: Uint32Array;
53
- glyphRanges: GlyphRange[];
54
- interiorGlyphAttrs?: VectorGlyphAttributes;
55
- curveGlyphAttrs?: VectorGlyphAttributes;
56
- fillGlyphAttrs?: VectorGlyphAttributes;
57
- planeBounds: BoundingBox;
58
- stats: {
59
- glyphCount: number;
60
- contourCount: number;
61
- interiorTriangleCount: number;
62
- curveTriangleCount: number;
54
+ interface GlyphCluster {
55
+ text: string;
56
+ glyphs: HarfBuzzGlyph[];
57
+ position: Vec3;
58
+ }
59
+ type TextAlign = 'left' | 'center' | 'right' | 'justify';
60
+ type TextDirection = 'ltr' | 'rtl';
61
+ interface LineInfo {
62
+ text: string;
63
+ originalStart: number;
64
+ originalEnd: number;
65
+ xOffset: number;
66
+ adjustmentRatio?: number;
67
+ isLastLine?: boolean;
68
+ naturalWidth?: number;
69
+ endedWithHyphen?: boolean;
70
+ }
71
+ interface LoadedFont {
72
+ hb: HarfBuzzAPI;
73
+ fontBlob: HarfBuzzBlob;
74
+ face: HarfBuzzFace;
75
+ font: HarfBuzzFont;
76
+ module: HarfBuzzModule;
77
+ upem: number;
78
+ metrics: ExtractedMetrics;
79
+ fontVariations?: {
80
+ [key: string]: number;
81
+ };
82
+ fontFeatures?: {
83
+ [tag: string]: boolean | number;
63
84
  };
85
+ isVariable?: boolean;
86
+ variationAxes?: {
87
+ [key: string]: VariationAxis;
88
+ };
89
+ availableFeatures?: string[];
90
+ featureNames?: {
91
+ [tag: string]: string;
92
+ };
93
+ _buffer?: ArrayBuffer;
64
94
  }
65
- interface LoopBlinnGlyphInput {
66
- offsetX: number;
67
- offsetY: number;
68
- segments: QuadraticSegment[];
69
- bounds: {
70
- minX: number;
71
- minY: number;
72
- maxX: number;
73
- maxY: number;
95
+ interface HarfBuzzModule {
96
+ addFunction: (func: Function, signature: string) => number;
97
+ exports: any;
98
+ removeFunction: (ptr: number) => void;
99
+ }
100
+ interface VariationAxis {
101
+ min: number;
102
+ default: number;
103
+ max: number;
104
+ name?: string;
105
+ }
106
+ interface HarfBuzzAPI {
107
+ createBlob: (data: Uint8Array) => HarfBuzzBlob;
108
+ createFace: (blob: HarfBuzzBlob, index: number) => HarfBuzzFace;
109
+ createFont: (face: HarfBuzzFace) => HarfBuzzFont;
110
+ createBuffer: () => HarfBuzzBuffer;
111
+ shape: (font: HarfBuzzFont, buffer: HarfBuzzBuffer, features?: string) => void;
112
+ }
113
+ interface HarfBuzzBlob {
114
+ destroy: () => void;
115
+ }
116
+ interface HarfBuzzFace {
117
+ destroy: () => void;
118
+ getAxisInfos: () => {
119
+ [tag: string]: VariationAxis;
74
120
  };
121
+ }
122
+ interface HarfBuzzFont {
123
+ ptr: number;
124
+ destroy: () => void;
125
+ setScale: (xScale: number, yScale: number) => void;
126
+ setVariations: (variations: {
127
+ [key: string]: number;
128
+ }) => void;
129
+ }
130
+ interface HarfBuzzBuffer {
131
+ addText: (text: string) => void;
132
+ guessSegmentProperties: () => void;
133
+ setDirection: (direction: string) => void;
134
+ json: (font: HarfBuzzFont) => any[];
135
+ destroy: () => void;
136
+ }
137
+ interface HarfBuzzInstance {
138
+ hb: HarfBuzzAPI;
139
+ module: HarfBuzzModule;
140
+ }
141
+ interface ExtractedMetrics {
142
+ isCFF: boolean;
143
+ unitsPerEm: number;
144
+ hheaAscender: number | null;
145
+ hheaDescender: number | null;
146
+ hheaLineGap: number | null;
147
+ typoAscender: number | null;
148
+ typoDescender: number | null;
149
+ typoLineGap: number | null;
150
+ winAscent: number | null;
151
+ winDescent: number | null;
152
+ axisNames: {
153
+ [tag: string]: string;
154
+ } | null;
155
+ }
156
+ interface FontMetrics {
157
+ ascender: number;
158
+ descender: number;
159
+ lineGap: number;
160
+ unitsPerEm: number;
161
+ naturalLineHeight: number;
162
+ }
163
+ interface PathInfo {
164
+ start: number;
165
+ count: number;
166
+ }
167
+ interface GlyphGeometryInfo {
168
+ textIndex: number;
75
169
  lineIndex: number;
76
- baselineY: number;
170
+ vertexStart: number;
171
+ vertexCount: number;
172
+ bounds: {
173
+ min: {
174
+ x: number;
175
+ y: number;
176
+ z: number;
177
+ };
178
+ max: {
179
+ x: number;
180
+ y: number;
181
+ z: number;
182
+ };
183
+ };
184
+ paths?: PathInfo[];
77
185
  }
78
- interface LoopBlinnInput {
79
- glyphs: LoopBlinnGlyphInput[];
80
- planeBounds: BoundingBox;
186
+ interface TextRange {
187
+ start: number;
188
+ end: number;
189
+ originalText: string;
190
+ bounds: {
191
+ min: {
192
+ x: number;
193
+ y: number;
194
+ z: number;
195
+ };
196
+ max: {
197
+ x: number;
198
+ y: number;
199
+ z: number;
200
+ };
201
+ }[];
202
+ glyphs: GlyphGeometryInfo[];
203
+ lineIndices: number[];
204
+ }
205
+ interface TextQueryOptions {
206
+ byText?: string[];
207
+ byCharRange?: {
208
+ start: number;
209
+ end: number;
210
+ }[];
211
+ }
212
+ interface VectorGlyphInfo extends GlyphGeometryInfo {
213
+ segmentStart: number;
214
+ segmentCount: number;
215
+ }
216
+ interface TextLayoutData {
217
+ lines: LineInfo[];
218
+ scaledLineHeight: number;
219
+ letterSpacing: number;
220
+ align: string;
221
+ direction: TextDirection;
222
+ depth: number;
223
+ size: number;
224
+ pixelsPerFontUnit: number;
225
+ }
226
+ interface TextLayoutResult {
227
+ clustersByLine: GlyphCluster[][];
228
+ layoutData: TextLayoutData;
229
+ options: TextOptions;
230
+ loadedFont: LoadedFont;
231
+ fontId: string;
232
+ }
233
+ interface TextLayoutHandle extends TextLayoutResult {
234
+ getLoadedFont(): LoadedFont | undefined;
235
+ measureTextWidth(text: string, letterSpacing?: number): number;
236
+ update(options: Partial<TextOptions>): Promise<TextLayoutHandle>;
237
+ dispose(): void;
238
+ }
239
+ interface ColorByRange {
240
+ start: number;
241
+ end: number;
242
+ color: [number, number, number];
243
+ }
244
+ interface ColorOptions {
245
+ default?: [number, number, number];
246
+ byText?: {
247
+ [text: string]: [number, number, number];
248
+ };
249
+ byCharRange?: ColorByRange[];
250
+ }
251
+ interface TextOptions {
252
+ text: string;
253
+ font: string | ArrayBuffer;
254
+ size?: number;
255
+ depth?: number;
256
+ lineHeight?: number;
257
+ letterSpacing?: number;
258
+ perGlyphAttributes?: boolean;
259
+ fontVariations?: {
260
+ [key: string]: number;
261
+ };
262
+ fontFeatures?: {
263
+ [tag: string]: boolean | number;
264
+ };
265
+ maxTextLength?: number;
266
+ removeOverlaps?: boolean;
267
+ curveSteps?: number;
268
+ curveFidelity?: CurveFidelityConfig;
269
+ geometryOptimization?: GeometryOptimizationOptions;
270
+ layout?: LayoutOptions;
271
+ color?: [number, number, number] | ColorOptions;
272
+ }
273
+ interface HyphenationPatternsMap {
274
+ [language: string]: HyphenationTrieNode;
275
+ }
276
+ interface CurveFidelityConfig {
277
+ distanceTolerance?: number;
278
+ angleTolerance?: number;
279
+ cuspLimit?: number;
280
+ collinearityEpsilon?: number;
281
+ recursionLimit?: number;
282
+ }
283
+ interface GeometryOptimizationOptions {
284
+ enabled?: boolean;
285
+ areaThreshold?: number;
286
+ }
287
+ interface LayoutOptions {
288
+ width?: number;
289
+ align?: TextAlign;
290
+ direction?: TextDirection;
291
+ respectExistingBreaks?: boolean;
292
+ hyphenate?: boolean;
293
+ language?: string;
294
+ patternsPath?: string;
295
+ tolerance?: number;
296
+ pretolerance?: number;
297
+ emergencyStretch?: number;
298
+ autoEmergencyStretch?: number;
299
+ hyphenationPatterns?: HyphenationPatternsMap;
300
+ lefthyphenmin?: number;
301
+ righthyphenmin?: number;
302
+ linepenalty?: number;
303
+ adjdemerits?: number;
304
+ hyphenpenalty?: number;
305
+ exhyphenpenalty?: number;
306
+ doublehyphendemerits?: number;
81
307
  }
82
- declare function extractContours(segments: QuadraticSegment[]): VectorContour[];
83
- declare function buildVectorGeometry(input: LoopBlinnInput): VectorGeometryData;
84
308
 
85
- interface HyphenationTrieNode {
86
- patterns: number[] | null;
87
- children: {
88
- [char: string]: HyphenationTrieNode;
309
+ declare global {
310
+ interface Window {
311
+ hbjs?: any;
312
+ createHarfBuzz?: () => Promise<any>;
313
+ }
314
+ }
315
+ declare class Text$1 {
316
+ private static patternCache;
317
+ private static hbInitPromise;
318
+ private static fontCache;
319
+ private static fontLoadPromises;
320
+ private static fontRefCounts;
321
+ private static fontCacheMemoryBytes;
322
+ private static maxFontCacheMemoryBytes;
323
+ private static fontIdCounter;
324
+ static enableWoff2(decoder: (data: ArrayBuffer | Uint8Array) => Uint8Array | Promise<Uint8Array>): void;
325
+ private static stableStringify;
326
+ private fontLoader;
327
+ private loadedFont?;
328
+ private currentFontId;
329
+ private currentFontCacheKey?;
330
+ private textShaper?;
331
+ private textLayout?;
332
+ private constructor();
333
+ static setHarfBuzzPath(path: string): void;
334
+ static setHarfBuzzBuffer(wasmBuffer: ArrayBuffer): void;
335
+ static init(): Promise<HarfBuzzInstance>;
336
+ static create(options: TextOptions): Promise<TextLayoutHandle>;
337
+ private static retainFont;
338
+ private static releaseFont;
339
+ private static resolveFont;
340
+ private static loadAndCacheFont;
341
+ private static trackFontCacheAdd;
342
+ private static trackFontCacheRemove;
343
+ private static enforceFontCacheMemoryLimit;
344
+ private static generateFontContentHash;
345
+ private setLoadedFont;
346
+ private releaseCurrentFont;
347
+ private loadFont;
348
+ private createLayout;
349
+ private prepareHyphenation;
350
+ private validateOptions;
351
+ private updateFontVariations;
352
+ private prepareLayout;
353
+ getFontMetrics(): FontMetrics;
354
+ static preloadPatterns(languages: string[], patternsPath?: string): Promise<void>;
355
+ static registerPattern(language: string, pattern: HyphenationTrieNode): void;
356
+ static setMaxFontCacheMemoryMB(limitMB: number): void;
357
+ getLoadedFont(): LoadedFont | undefined;
358
+ measureTextWidth(text: string, letterSpacing?: number): number;
359
+ private resetHelpers;
360
+ destroy(): void;
361
+ }
362
+
363
+ interface SlugPackedTexture {
364
+ data: Float32Array | Uint32Array;
365
+ width: number;
366
+ height: number;
367
+ }
368
+ interface SlugGPUData {
369
+ curveTexture: SlugPackedTexture & {
370
+ data: Float32Array;
89
371
  };
372
+ bandTexture: SlugPackedTexture & {
373
+ data: Uint32Array;
374
+ };
375
+ /** 5 attribs x 4 components x 4 verts per shape, tightly packed per-shape */
376
+ vertices: Float32Array;
377
+ indices: Uint16Array;
378
+ shapeCount: number;
90
379
  }
91
380
 
92
- interface VectorTextResult {
381
+ interface VectorCoreResult {
382
+ gpuData: SlugGPUData;
93
383
  glyphs: VectorGlyphInfo[];
94
- geometryData: VectorGeometryData;
384
+ planeBounds: BoundingBox;
95
385
  query(options: TextQueryOptions): TextRange[];
96
386
  getLoadedFont(): LoadedFont | undefined;
97
387
  measureTextWidth(text: string, letterSpacing?: number): number;
98
- update(options: Partial<TextOptions>): Promise<VectorTextResult>;
388
+ update(options: Partial<TextOptions>): Promise<VectorCoreResult>;
99
389
  dispose(): void;
100
390
  }
101
391
  declare class Text {
@@ -106,7 +396,7 @@ declare class Text {
106
396
  static preloadPatterns: typeof Text$1.preloadPatterns;
107
397
  static setMaxFontCacheMemoryMB: typeof Text$1.setMaxFontCacheMemoryMB;
108
398
  static enableWoff2: typeof Text$1.enableWoff2;
109
- static create(options: TextOptions): Promise<VectorTextResult>;
399
+ static create(options: TextOptions): Promise<VectorCoreResult>;
110
400
  }
111
401
 
112
- export { GlyphRange, HyphenationTrieNode, LoopBlinnGlyphInput, LoopBlinnInput, QuadraticSegment, Text, VectorTextResult as TextGeometryInfo, VectorContour, VectorGeometryData, VectorGlyphAttributes, VectorTextResult, buildVectorGeometry, extractContours };
402
+ export { HyphenationTrieNode, LoadedFont, SlugGPUData, Text, VectorCoreResult as TextGeometryInfo, TextOptions, VectorCoreResult, VectorGlyphInfo };