@empty-sekai/sekai-custom-profile-sdk 0.3.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.
- package/LICENSE +235 -0
- package/LICENSE-EXCEPTION +32 -0
- package/NOTICE +11 -0
- package/README.en.md +456 -0
- package/README.md +458 -0
- package/dist/allium_renderer_wasm.js +14 -0
- package/dist/allium_renderer_wasm.wasm +0 -0
- package/dist/authoring.d.ts +14 -0
- package/dist/authoring.js +34 -0
- package/dist/cache/glyphPersistentCache.d.ts +145 -0
- package/dist/cache/glyphPersistentCache.js +346 -0
- package/dist/cache/indexedDbGlyphRecordStore.d.ts +26 -0
- package/dist/cache/indexedDbGlyphRecordStore.js +214 -0
- package/dist/cache/sessionImageResourceCache.d.ts +39 -0
- package/dist/cache/sessionImageResourceCache.js +156 -0
- package/dist/emscripten.d.ts +11 -0
- package/dist/emscripten.js +1 -0
- package/dist/fontProvider.d.ts +36 -0
- package/dist/fontProvider.js +84 -0
- package/dist/fontSdfAtlas.d.ts +92 -0
- package/dist/fontSdfAtlas.js +296 -0
- package/dist/gpu/browserSemanticResources.d.ts +64 -0
- package/dist/gpu/browserSemanticResources.js +232 -0
- package/dist/gpu/generalTextRenderPlacement.d.ts +8 -0
- package/dist/gpu/generalTextRenderPlacement.js +131 -0
- package/dist/gpu/previewTransformTextureLayout.d.ts +1 -0
- package/dist/gpu/previewTransformTextureLayout.js +12 -0
- package/dist/gpu/semanticCommandGeometry.d.ts +21 -0
- package/dist/gpu/semanticCommandGeometry.js +226 -0
- package/dist/gpu/semanticCommandPlanner.d.ts +131 -0
- package/dist/gpu/semanticCommandPlanner.js +203 -0
- package/dist/gpu/semanticTextGlyphBridge.d.ts +3 -0
- package/dist/gpu/semanticTextGlyphBridge.js +22 -0
- package/dist/gpu/semanticWebglSceneRenderer.d.ts +70 -0
- package/dist/gpu/semanticWebglSceneRenderer.js +211 -0
- package/dist/gpu/slotRanges.d.ts +5 -0
- package/dist/gpu/slotRanges.js +14 -0
- package/dist/gpu/webglSdfAtlasTexture.d.ts +17 -0
- package/dist/gpu/webglSdfAtlasTexture.js +72 -0
- package/dist/gpu/webglSdfGlyphPipeline.d.ts +26 -0
- package/dist/gpu/webglSdfGlyphPipeline.js +267 -0
- package/dist/gpu/webglSemanticCommandExecutor.d.ts +79 -0
- package/dist/gpu/webglSemanticCommandExecutor.js +686 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +8 -0
- package/dist/interaction/numericTextRegions.d.ts +46 -0
- package/dist/interaction/numericTextRegions.js +44 -0
- package/dist/localizationProvider.d.ts +33 -0
- package/dist/localizationProvider.js +74 -0
- package/dist/originPrebuiltSdfAtlasPackage.d.ts +39 -0
- package/dist/originPrebuiltSdfAtlasPackage.js +316 -0
- package/dist/prebuiltSdfAtlas.d.ts +36 -0
- package/dist/prebuiltSdfAtlas.js +261 -0
- package/dist/protocol.d.ts +456 -0
- package/dist/protocol.js +1 -0
- package/dist/renderer.d.ts +218 -0
- package/dist/renderer.js +641 -0
- package/dist/resourceProvider.d.ts +24 -0
- package/dist/resourceProvider.js +41 -0
- package/dist/telemetry/rendererTelemetry.d.ts +158 -0
- package/dist/telemetry/rendererTelemetry.js +232 -0
- package/dist/third-party/freetype/FTL.txt +169 -0
- package/dist/types/atlas.d.ts +90 -0
- package/dist/types/atlas.js +1 -0
- package/dist/types/authoring.d.ts +81 -0
- package/dist/types/authoring.js +1 -0
- package/dist/types/core.d.ts +128 -0
- package/dist/types/core.js +1 -0
- package/dist/types/freeType.d.ts +54 -0
- package/dist/types/freeType.js +13 -0
- package/dist/types/glyph.d.ts +33 -0
- package/dist/types/glyph.js +1 -0
- package/dist/types/layout.d.ts +25 -0
- package/dist/types/layout.js +1 -0
- package/dist/types/text.d.ts +28 -0
- package/dist/types/text.js +1 -0
- package/dist/worker/glyphWorkScheduler.d.ts +29 -0
- package/dist/worker/glyphWorkScheduler.js +107 -0
- package/dist/worker-client.d.ts +114 -0
- package/dist/worker-client.js +413 -0
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +708 -0
- package/package.json +46 -0
- package/src/atlas.rs +652 -0
- package/src/authoring.ts +42 -0
- package/src/authoring_runtime.rs +303 -0
- package/src/cache/glyphPersistentCache.ts +463 -0
- package/src/cache/indexedDbGlyphRecordStore.ts +238 -0
- package/src/cache/sessionImageResourceCache.ts +186 -0
- package/src/edt.rs +97 -0
- package/src/emscripten.ts +17 -0
- package/src/fontProvider.ts +127 -0
- package/src/fontSdfAtlas.ts +431 -0
- package/src/geometry.rs +149 -0
- package/src/glyph_plan.rs +226 -0
- package/src/gpu/browserSemanticResources.ts +294 -0
- package/src/gpu/generalTextRenderPlacement.ts +175 -0
- package/src/gpu/previewTransformTextureLayout.ts +12 -0
- package/src/gpu/semanticCommandGeometry.ts +260 -0
- package/src/gpu/semanticCommandPlanner.ts +280 -0
- package/src/gpu/semanticTextGlyphBridge.ts +35 -0
- package/src/gpu/semanticWebglSceneRenderer.ts +261 -0
- package/src/gpu/slotRanges.ts +15 -0
- package/src/gpu/webglSdfAtlasTexture.ts +69 -0
- package/src/gpu/webglSdfGlyphPipeline.ts +299 -0
- package/src/gpu/webglSemanticCommandExecutor.ts +739 -0
- package/src/index.ts +84 -0
- package/src/interaction/numericTextRegions.ts +80 -0
- package/src/layout.rs +1882 -0
- package/src/lib.rs +1443 -0
- package/src/localizationProvider.ts +113 -0
- package/src/main.rs +55 -0
- package/src/masterdata_runtime.rs +496 -0
- package/src/originPrebuiltSdfAtlasPackage.ts +403 -0
- package/src/prebuiltSdfAtlas.ts +306 -0
- package/src/protocol.ts +150 -0
- package/src/renderer.ts +792 -0
- package/src/resourceProvider.ts +69 -0
- package/src/scene.rs +665 -0
- package/src/telemetry/rendererTelemetry.ts +358 -0
- package/src/types/atlas.ts +80 -0
- package/src/types/authoring.ts +85 -0
- package/src/types/core.ts +110 -0
- package/src/types/freeType.ts +63 -0
- package/src/types/glyph.ts +33 -0
- package/src/types/layout.ts +28 -0
- package/src/types/text.ts +28 -0
- package/src/worker/glyphWorkScheduler.ts +130 -0
- package/src/worker-client.ts +484 -0
- package/src/worker.ts +895 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** A glyph instance produced by the shared Rust layout engine. */
|
|
2
|
+
export type GlyphInstance = {
|
|
3
|
+
layerId: string;
|
|
4
|
+
plainTextIndex: number;
|
|
5
|
+
char: string;
|
|
6
|
+
drawable: boolean;
|
|
7
|
+
glyphKey: string;
|
|
8
|
+
atlasPage: number;
|
|
9
|
+
z: number;
|
|
10
|
+
quad: Array<[number, number, number, number, number]>;
|
|
11
|
+
charPosition: [string, number, number, number, number, number];
|
|
12
|
+
charOp: [string, number, number, number, number, number, number];
|
|
13
|
+
charQuad: [string, Array<[number, number]>];
|
|
14
|
+
deviceCharPosition: [string, number, number];
|
|
15
|
+
deviceCharQuad: [string, Array<[number, number]>];
|
|
16
|
+
deviceGlyphQuad: [string, Array<[number, number]>];
|
|
17
|
+
layoutMetrics: {
|
|
18
|
+
lineWidths: number[];
|
|
19
|
+
rectWidths: number[];
|
|
20
|
+
boxW: number;
|
|
21
|
+
anchorBase: number;
|
|
22
|
+
lineOffsets: number[];
|
|
23
|
+
};
|
|
24
|
+
fill: [number, number, number, number];
|
|
25
|
+
outline: [number, number, number, number];
|
|
26
|
+
outlineWidth: number;
|
|
27
|
+
shaderFontSize: number;
|
|
28
|
+
shaderFaceScale: number;
|
|
29
|
+
shaderFaceBias: number;
|
|
30
|
+
shaderUnderlayScale: number;
|
|
31
|
+
shaderUnderlayBias: number;
|
|
32
|
+
shaderVertexAlpha: number;
|
|
33
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GlyphInstance } from "./glyph.js";
|
|
2
|
+
|
|
3
|
+
export type CoreDynamicProgramDescriptor = {
|
|
4
|
+
layerId: string;
|
|
5
|
+
percent: number;
|
|
6
|
+
lineAdvancesTmp: number[][];
|
|
7
|
+
rotationDeg: number;
|
|
8
|
+
scaleX: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type WasmLayoutBatch = {
|
|
12
|
+
version: number;
|
|
13
|
+
source: string;
|
|
14
|
+
instances: GlyphInstance[];
|
|
15
|
+
dynamicPrograms: CoreDynamicProgramDescriptor[];
|
|
16
|
+
error?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type WasmGlyphDemandBatch = {
|
|
20
|
+
version: number;
|
|
21
|
+
source: "wasm-tmp-glyph-demand";
|
|
22
|
+
requests: Array<{
|
|
23
|
+
region: string;
|
|
24
|
+
family: string;
|
|
25
|
+
font_source_hash: string;
|
|
26
|
+
char: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Text command input consumed by the shared Rust TMP layout engine. */
|
|
2
|
+
export type TextLayer = {
|
|
3
|
+
id: string;
|
|
4
|
+
parentId?: string | null;
|
|
5
|
+
documentKey: string;
|
|
6
|
+
z: number;
|
|
7
|
+
text: string;
|
|
8
|
+
authoredVisible: boolean;
|
|
9
|
+
region: string;
|
|
10
|
+
fontId: number;
|
|
11
|
+
fontFamily: string;
|
|
12
|
+
fontSourceHash: string;
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
rotationDeg: number;
|
|
16
|
+
scaleX: number;
|
|
17
|
+
scaleY: number;
|
|
18
|
+
skewX: number;
|
|
19
|
+
fontSize: number;
|
|
20
|
+
color: [number, number, number, number];
|
|
21
|
+
outlineColor: [number, number, number, number];
|
|
22
|
+
colorRgb: [number, number, number];
|
|
23
|
+
colorId: number;
|
|
24
|
+
outlineColorId: number;
|
|
25
|
+
outlineWidth: number;
|
|
26
|
+
lineSpacing: number;
|
|
27
|
+
textType: number;
|
|
28
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export type KeyedGlyphJob = { key: string };
|
|
2
|
+
export type KeyedGlyphResult = { key: string };
|
|
3
|
+
|
|
4
|
+
export type GlyphWorkSchedulerStats = {
|
|
5
|
+
dispatches: number;
|
|
6
|
+
dispatchedJobs: number;
|
|
7
|
+
cacheHits: number;
|
|
8
|
+
coalesced: number;
|
|
9
|
+
failures: number;
|
|
10
|
+
pending: number;
|
|
11
|
+
cached: number;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
type Deferred<T> = {
|
|
15
|
+
promise: Promise<T>;
|
|
16
|
+
resolve: (value: T) => void;
|
|
17
|
+
reject: (reason?: unknown) => void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export class GlyphWorkScheduler<Job extends KeyedGlyphJob, Result extends KeyedGlyphResult> {
|
|
21
|
+
private readonly dispatch: (jobs: readonly Job[]) => Promise<readonly Result[]>;
|
|
22
|
+
private readonly cache = new Map<string, Result>();
|
|
23
|
+
private readonly pending = new Map<string, Deferred<Result>>();
|
|
24
|
+
private readonly counters = {
|
|
25
|
+
dispatches: 0,
|
|
26
|
+
dispatchedJobs: 0,
|
|
27
|
+
cacheHits: 0,
|
|
28
|
+
coalesced: 0,
|
|
29
|
+
failures: 0,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
constructor(dispatch: (jobs: readonly Job[]) => Promise<readonly Result[]>) {
|
|
33
|
+
this.dispatch = dispatch;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
run(jobs: readonly Job[]): Promise<Result[]> {
|
|
37
|
+
const ordered: Array<Promise<Result>> = [];
|
|
38
|
+
const fresh: Job[] = [];
|
|
39
|
+
const freshKeys = new Set<string>();
|
|
40
|
+
for (const job of jobs) {
|
|
41
|
+
const cached = this.cache.get(job.key);
|
|
42
|
+
if (cached) {
|
|
43
|
+
this.counters.cacheHits += 1;
|
|
44
|
+
ordered.push(Promise.resolve(cached));
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const inFlight = this.pending.get(job.key);
|
|
48
|
+
if (inFlight) {
|
|
49
|
+
this.counters.coalesced += 1;
|
|
50
|
+
ordered.push(inFlight.promise);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const deferred = createDeferred<Result>();
|
|
54
|
+
this.pending.set(job.key, deferred);
|
|
55
|
+
ordered.push(deferred.promise);
|
|
56
|
+
if (!freshKeys.has(job.key)) {
|
|
57
|
+
freshKeys.add(job.key);
|
|
58
|
+
fresh.push(job);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (fresh.length > 0) void this.dispatchFresh(fresh);
|
|
62
|
+
return Promise.all(ordered);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get(key: string): Result | undefined {
|
|
66
|
+
const value = this.cache.get(key);
|
|
67
|
+
if (value) this.counters.cacheHits += 1;
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
prime(results: readonly Result[]): void {
|
|
72
|
+
for (const result of results) {
|
|
73
|
+
if (!this.pending.has(result.key)) this.cache.set(result.key, result);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
delete(key: string): boolean {
|
|
78
|
+
return this.cache.delete(key);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
clear(): void {
|
|
82
|
+
this.cache.clear();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
stats(): GlyphWorkSchedulerStats {
|
|
86
|
+
return {
|
|
87
|
+
...this.counters,
|
|
88
|
+
pending: this.pending.size,
|
|
89
|
+
cached: this.cache.size,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private async dispatchFresh(jobs: readonly Job[]): Promise<void> {
|
|
94
|
+
this.counters.dispatches += 1;
|
|
95
|
+
this.counters.dispatchedJobs += jobs.length;
|
|
96
|
+
try {
|
|
97
|
+
const results = await this.dispatch(jobs);
|
|
98
|
+
const byKey = new Map(results.map((result) => [result.key, result]));
|
|
99
|
+
for (const job of jobs) {
|
|
100
|
+
const deferred = this.pending.get(job.key);
|
|
101
|
+
if (!deferred) continue;
|
|
102
|
+
const result = byKey.get(job.key);
|
|
103
|
+
this.pending.delete(job.key);
|
|
104
|
+
if (!result) {
|
|
105
|
+
deferred.reject(new Error(`glyph worker omitted result for ${job.key}`));
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
this.cache.set(job.key, result);
|
|
109
|
+
deferred.resolve(result);
|
|
110
|
+
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
this.counters.failures += 1;
|
|
113
|
+
for (const job of jobs) {
|
|
114
|
+
const deferred = this.pending.get(job.key);
|
|
115
|
+
this.pending.delete(job.key);
|
|
116
|
+
deferred?.reject(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function createDeferred<T>(): Deferred<T> {
|
|
123
|
+
let resolve!: (value: T) => void;
|
|
124
|
+
let reject!: (reason?: unknown) => void;
|
|
125
|
+
const promise = new Promise<T>((resolvePromise, rejectPromise) => {
|
|
126
|
+
resolve = resolvePromise;
|
|
127
|
+
reject = rejectPromise;
|
|
128
|
+
});
|
|
129
|
+
return { promise, resolve, reject };
|
|
130
|
+
}
|