summit/frontend/node_modules/three-stdlib/loaders/FontLoader.cjs.map

1 line
7.6 KiB
Plaintext
Raw Normal View History

2025-12-08 16:31:30 +00:00
{"version":3,"file":"FontLoader.cjs","sources":["../../src/loaders/FontLoader.ts"],"sourcesContent":["import { Loader, FileLoader, ShapePath } from 'three'\n\nimport type { LoadingManager, Shape } from 'three'\n\ntype Options = {\n lineHeight: number\n letterSpacing: number\n}\n\nexport class FontLoader extends Loader {\n constructor(manager?: LoadingManager) {\n super(manager)\n }\n\n public load(\n url: string,\n onLoad?: (responseFont: Font) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (event: ErrorEvent) => void,\n ): void {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n (response) => {\n if (typeof response !== 'string') throw new Error('unsupported data type')\n\n const json = JSON.parse(response)\n\n const font = this.parse(json)\n\n if (onLoad) onLoad(font)\n },\n onProgress,\n onError as (event: unknown) => void,\n )\n }\n\n loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<Font> {\n // @ts-ignore\n return super.loadAsync(url, onProgress)\n }\n\n public parse(json: FontData): Font {\n return new Font(json)\n }\n}\n\ntype Glyph = {\n _cachedOutline: string[]\n ha: number\n o: string\n}\n\ntype FontData = {\n boundingBox: { yMax: number; yMin: number }\n familyName: string\n glyphs: { [k: string]: Glyph }\n resolution: number\n underlineThickness: number\n}\n\nexport class Font {\n public data: FontData\n public isFont = true\n public type = 'Font'\n\n constructor(data: FontData) {\n this.data = data\n }\n\n public generateShapes(text: string, size = 100, _options?: Partial<Options>): Shape[] {\n const shapes: Shape[] = []\n const options = { letterSpacing: 0, lineHeight: 1, ..._options }\n const paths = createPaths(text, size, this.data, options)\n for (let p = 0, pl = paths.length; p < pl; p++) {\n Array.prototype.push.apply(shapes, paths[p].toShapes(false))\n }\n return shapes\n }\n}\n\nfunction createPaths(text: string, size: number, data: FontData, options: Options): ShapePath[] {\n const chars = Array.from(text)\n const scale = size / data.resolution\n const line_height = (data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness) * scale\n\n const paths: ShapePath[] = []\n\n let offsetX = 0,\n offsetY = 0\n\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]\n\n if (char === '\\n') {\n offsetX = 0\n offsetY -= line_height * options.lineHeight\n } else {\n const ret = createPath(char, scale, offsetX, offsetY, data)\n if (ret) {\n offsetX += ret.offsetX + options.letterSpacing\n paths.push(ret.path)\n }\n }\n }\n\n return paths\n}\n\nfunction createPath(\n char: string,\n scale: number,\n offsetX: number,\n offsetY: number,\n data: FontData,\n): { offsetX: number; path: ShapePath } | undefined {\n const glyph = data.glyphs[char] || data.glyphs['?']\n\n if (!glyph) {\n console.error('THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.')\n return\n }\n\n const path = new ShapePath()\n\n let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2\n\n if (glyph.o) {\n const outline = glyph._cachedOutline || (glyph._cachedOutline = glyph.o.split(' '))\n\n for (let i = 0, l = outline.length; i < l; ) {\n const action = outline[i++]\n\n switch (action) {\n case 'm': // moveTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.moveTo(x, y)\n\n break\n\n case 'l': // lineTo\n x = parseInt(outline[i++]) * scale + offsetX\n y = parseInt(outline[i++]) * scale + offsetY\n\n path.lineTo(x, y)\n\n break\n\n case 'q': // quadraticCurveTo\n cpx = parseInt(outline[i++]) * scale + offset