@zephyr3d/scene 0.9.3 → 0.9.5
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/dist/animation/animationmask.js +224 -0
- package/dist/animation/animationmask.js.map +1 -0
- package/dist/animation/animationset.js +268 -67
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +3 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +7 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +6 -4
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +390 -43
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +4 -3
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +2 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/morphtarget.js +3 -72
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -0
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +3 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/proptrack.js +3 -0
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +3 -0
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +3 -0
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +254 -79
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/animation/translationtrack.js +3 -0
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/engine.js +129 -17
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +251 -80
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +133 -102
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +18 -14
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +1 -6
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
- package/dist/asset/model.js +1052 -183
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +474 -0
- package/dist/avatar/wardrobe.js.map +1 -0
- package/dist/index.d.ts +1810 -233
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +21 -6
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +54 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/sky.js +9 -0
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +18 -8
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +16 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +164 -102
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +2 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +437 -230
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +146 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +50 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +188 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/pmrem.js +34 -8
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/serialization/manager.js +340 -283
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +702 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +66 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +189 -8
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/textures/sheenlut.js +138 -0
- package/dist/utility/textures/sheenlut.js.map +1 -0
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font_asset.js","sources":["../../../src/text/font/font_asset.ts"],"sourcesContent":["import type { FontAssetFetchOptions } from '../../asset/assetmanager';\r\nimport { SFNTReader } from './sfnt_reader';\r\nimport type { FontMetrics, GlyphContour, GlyphData, GlyphPoint } from './types';\r\n\r\n/**\r\n * MSDF atlas settings associated with a font asset.\r\n * @public\r\n */\r\nexport type FontAssetMSDFAtlasSettings = Readonly<{\r\n pageSize: number;\r\n glyphSize: number;\r\n}>;\r\n\r\ntype TableRecord = {\r\n offset: number;\r\n length: number;\r\n};\r\n\r\ntype GlyphHeader = {\r\n numberOfContours: number;\r\n xMin: number;\r\n yMin: number;\r\n xMax: number;\r\n yMax: number;\r\n};\r\n\r\ntype CompositeComponent = {\r\n glyphIndex: number;\r\n dx: number;\r\n dy: number;\r\n xx: number;\r\n xy: number;\r\n yx: number;\r\n yy: number;\r\n};\r\n\r\ntype CoverageTable =\r\n | { format: 1; glyphs: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; startIndex: number }[] };\r\n\r\ntype ClassDefTable =\r\n | { format: 1; startGlyphId: number; classes: Uint16Array<ArrayBuffer> }\r\n | { format: 2; ranges: { start: number; end: number; classId: number }[] };\r\n\r\ntype GPOSPairSubtable =\r\n | {\r\n kind: 'format1';\r\n coverage: CoverageTable;\r\n pairs: Map<number, Map<number, PairAdjustment>>;\r\n }\r\n | {\r\n kind: 'format2';\r\n coverage: CoverageTable;\r\n classDef1: ClassDefTable;\r\n classDef2: ClassDefTable;\r\n class1Count: number;\r\n class2Count: number;\r\n values: PairAdjustment[];\r\n };\r\n\r\n/**\r\n * Minimal horizontal pair adjustment extracted from GPOS.\r\n *\r\n * @public\r\n */\r\nexport type PairAdjustment = {\r\n firstXPlacement: number;\r\n firstXAdvance: number;\r\n secondXPlacement: number;\r\n secondXAdvance: number;\r\n};\r\n\r\nconst ARG_1_AND_2_ARE_WORDS = 1 << 0;\r\nconst ARGS_ARE_XY_VALUES = 1 << 1;\r\nconst WE_HAVE_A_SCALE = 1 << 3;\r\nconst MORE_COMPONENTS = 1 << 5;\r\nconst WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\r\nconst WE_HAVE_A_TWO_BY_TWO = 1 << 7;\r\nconst DEFAULT_MSDF_ATLAS_PAGE_SIZE = 1024;\r\nconst DEFAULT_MSDF_GLYPH_SIZE = 32;\r\n\r\n/**\r\n * Minimal runtime font asset for TrueType outlines.\r\n *\r\n * @public\r\n */\r\nexport class FontAsset {\r\n private readonly _reader: SFNTReader;\r\n private readonly _tables: Map<string, TableRecord>;\r\n private readonly _glyphOffsets: Uint32Array<ArrayBuffer>;\r\n private readonly _advanceWidths: Uint16Array<ArrayBuffer>;\r\n private readonly _leftSideBearings: Int16Array<ArrayBuffer>;\r\n private readonly _glyphCache: Map<number, GlyphData | null>;\r\n private readonly _cmapFormat4: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _cmapFormat12: { offset: number; platformId: number; encodingId: number } | null;\r\n private readonly _kernPairs: Map<number, number>;\r\n private readonly _gposPairs: GPOSPairSubtable[];\r\n private readonly _metrics: FontMetrics;\r\n private readonly _numberOfHMetrics: number;\r\n private readonly _msdfAtlasSettings: FontAssetMSDFAtlasSettings;\r\n private constructor(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n this._reader = new SFNTReader(buffer);\r\n this._tables = parseTableDirectory(this._reader);\r\n const head = this.requireTable('head');\r\n const maxp = this.requireTable('maxp');\r\n const hhea = this.requireTable('hhea');\r\n const hmtx = this.requireTable('hmtx');\r\n const loca = this.requireTable('loca');\r\n this.requireTable('glyf');\r\n this.requireTable('cmap');\r\n this._numberOfHMetrics = this._reader.uint16(hhea.offset + 34);\r\n this._metrics = {\r\n unitsPerEm: this._reader.uint16(head.offset + 18),\r\n ascent: this._reader.int16(hhea.offset + 4),\r\n descent: this._reader.int16(hhea.offset + 6),\r\n lineGap: this._reader.int16(hhea.offset + 8),\r\n glyphCount: this._reader.uint16(maxp.offset + 4)\r\n };\r\n this._glyphOffsets = parseGlyphOffsets(\r\n this._reader,\r\n loca.offset,\r\n this._metrics.glyphCount,\r\n this._reader.int16(head.offset + 50)\r\n );\r\n const metrics = parseHorizontalMetrics(\r\n this._reader,\r\n hmtx.offset,\r\n this._metrics.glyphCount,\r\n this._numberOfHMetrics\r\n );\r\n this._advanceWidths = metrics.advanceWidths;\r\n this._leftSideBearings = metrics.leftSideBearings;\r\n const cmap = parseBestCMap(this._reader, this.requireTable('cmap').offset);\r\n this._cmapFormat4 = cmap.format4;\r\n this._cmapFormat12 = cmap.format12;\r\n this._kernPairs = parseKernPairs(this._reader, this.getTable('kern'));\r\n this._gposPairs = parseGPOSPairs(this._reader, this.getTable('GPOS'));\r\n this._glyphCache = new Map();\r\n this._msdfAtlasSettings = Object.freeze({\r\n pageSize: normalizeMSDFAtlasPageSize(options?.pageSize),\r\n glyphSize: normalizeMSDFGlyphSize(options?.glyphSize)\r\n });\r\n }\r\n static fromBuffer(buffer: ArrayBuffer, options?: FontAssetFetchOptions) {\r\n return new FontAsset(buffer, options);\r\n }\r\n get metrics(): FontMetrics {\r\n return this._metrics;\r\n }\r\n get msdfAtlasSettings(): FontAssetMSDFAtlasSettings {\r\n return this._msdfAtlasSettings;\r\n }\r\n get msdfAtlasPageSize() {\r\n return this._msdfAtlasSettings.pageSize;\r\n }\r\n get msdfGlyphSize() {\r\n return this._msdfAtlasSettings.glyphSize;\r\n }\r\n getGlyphIndex(codePoint: number) {\r\n if (this._cmapFormat12) {\r\n const glyphIndex = lookupCMapFormat12(this._reader, this._cmapFormat12.offset, codePoint);\r\n if (glyphIndex !== 0) {\r\n return glyphIndex;\r\n }\r\n }\r\n if (this._cmapFormat4 && codePoint <= 0xffff) {\r\n return lookupCMapFormat4(this._reader, this._cmapFormat4.offset, codePoint);\r\n }\r\n return 0;\r\n }\r\n getKerning(leftGlyphIndex: number, rightGlyphIndex: number) {\r\n const gpos = this.getPairAdjustment(leftGlyphIndex, rightGlyphIndex);\r\n if (gpos) {\r\n return gpos.firstXAdvance + gpos.secondXAdvance;\r\n }\r\n return this._kernPairs.get((leftGlyphIndex << 16) | rightGlyphIndex) ?? 0;\r\n }\r\n getPairAdjustment(leftGlyphIndex: number, rightGlyphIndex: number): PairAdjustment | null {\r\n return lookupGPOSPair(this._gposPairs, leftGlyphIndex, rightGlyphIndex);\r\n }\r\n getGlyph(glyphIndex: number): GlyphData | null {\r\n if (glyphIndex < 0 || glyphIndex >= this._metrics.glyphCount) {\r\n return null;\r\n }\r\n if (this._glyphCache.has(glyphIndex)) {\r\n return this._glyphCache.get(glyphIndex)!;\r\n }\r\n const glyph = this.loadGlyph(glyphIndex, 0);\r\n this._glyphCache.set(glyphIndex, glyph);\r\n return glyph;\r\n }\r\n private getTable(tag: string) {\r\n return this._tables.get(tag) ?? null;\r\n }\r\n private requireTable(tag: string) {\r\n const table = this.getTable(tag);\r\n if (!table) {\r\n throw new Error(`Font table not found: ${tag}`);\r\n }\r\n return table;\r\n }\r\n private loadGlyph(glyphIndex: number, depth: number): GlyphData | null {\r\n if (depth > 16) {\r\n throw new Error(`Composite glyph nesting too deep: ${glyphIndex}`);\r\n }\r\n const glyf = this.requireTable('glyf');\r\n const offset = this._glyphOffsets[glyphIndex];\r\n const nextOffset = this._glyphOffsets[glyphIndex + 1];\r\n if (offset === nextOffset) {\r\n return buildGlyphData(glyphIndex, this._advanceWidths, this._leftSideBearings, [], 0, 0, 0, 0);\r\n }\r\n const glyphOffset = glyf.offset + offset;\r\n const header = parseGlyphHeader(this._reader, glyphOffset);\r\n if (header.numberOfContours >= 0) {\r\n const contours = parseSimpleGlyph(this._reader, glyphOffset, header.numberOfContours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n header.xMin,\r\n header.yMin,\r\n header.xMax,\r\n header.yMax\r\n );\r\n }\r\n const contours = parseCompositeGlyph(this._reader, glyphOffset, (childIndex) =>\r\n this.loadGlyph(childIndex, depth + 1)\r\n );\r\n const bounds = computeBounds(contours);\r\n return buildGlyphData(\r\n glyphIndex,\r\n this._advanceWidths,\r\n this._leftSideBearings,\r\n contours,\r\n bounds.xMin,\r\n bounds.yMin,\r\n bounds.xMax,\r\n bounds.yMax\r\n );\r\n }\r\n}\r\n\r\nfunction parseTableDirectory(reader: SFNTReader) {\r\n const numTables = reader.uint16(4);\r\n const tables = new Map<string, TableRecord>();\r\n let offset = 12;\r\n for (let i = 0; i < numTables; i++) {\r\n const tag = reader.tag(offset);\r\n tables.set(tag, {\r\n offset: reader.uint32(offset + 8),\r\n length: reader.uint32(offset + 12)\r\n });\r\n offset += 16;\r\n }\r\n return tables;\r\n}\r\n\r\nfunction parseGlyphOffsets(reader: SFNTReader, offset: number, glyphCount: number, indexToLocFormat: number) {\r\n const result = new Uint32Array(glyphCount + 1);\r\n if (indexToLocFormat === 0) {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint16(offset + i * 2) * 2;\r\n }\r\n } else {\r\n for (let i = 0; i <= glyphCount; i++) {\r\n result[i] = reader.uint32(offset + i * 4);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseHorizontalMetrics(\r\n reader: SFNTReader,\r\n offset: number,\r\n glyphCount: number,\r\n numberOfHMetrics: number\r\n) {\r\n const advanceWidths = new Uint16Array(glyphCount);\r\n const leftSideBearings = new Int16Array(glyphCount);\r\n let cursor = offset;\r\n let lastAdvanceWidth = 0;\r\n for (let i = 0; i < glyphCount; i++) {\r\n if (i < numberOfHMetrics) {\r\n lastAdvanceWidth = reader.uint16(cursor);\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n advanceWidths[i] = lastAdvanceWidth;\r\n leftSideBearings[i] = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n }\r\n return { advanceWidths, leftSideBearings };\r\n}\r\n\r\nfunction parseBestCMap(reader: SFNTReader, offset: number) {\r\n const numTables = reader.uint16(offset + 2);\r\n let format4: { offset: number; platformId: number; encodingId: number } | null = null;\r\n let format12: { offset: number; platformId: number; encodingId: number } | null = null;\r\n for (let i = 0; i < numTables; i++) {\r\n const recordOffset = offset + 4 + i * 8;\r\n const platformId = reader.uint16(recordOffset);\r\n const encodingId = reader.uint16(recordOffset + 2);\r\n const subtableOffset = offset + reader.uint32(recordOffset + 4);\r\n const format = reader.uint16(subtableOffset);\r\n if (format === 12) {\r\n if (!format12 || isPreferredCMap(platformId, encodingId, format12.platformId, format12.encodingId)) {\r\n format12 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n } else if (format === 4) {\r\n if (!format4 || isPreferredCMap(platformId, encodingId, format4.platformId, format4.encodingId)) {\r\n format4 = { offset: subtableOffset, platformId, encodingId };\r\n }\r\n }\r\n }\r\n return { format4, format12 };\r\n}\r\n\r\nfunction isPreferredCMap(\r\n platformId: number,\r\n encodingId: number,\r\n currentPlatformId: number,\r\n currentEncodingId: number\r\n) {\r\n const nextScore = getCMapScore(platformId, encodingId);\r\n const currentScore = getCMapScore(currentPlatformId, currentEncodingId);\r\n return nextScore > currentScore;\r\n}\r\n\r\nfunction getCMapScore(platformId: number, encodingId: number) {\r\n if (platformId === 3 && encodingId === 10) {\r\n return 5;\r\n }\r\n if (platformId === 0 && encodingId <= 6) {\r\n return 4;\r\n }\r\n if (platformId === 3 && encodingId === 1) {\r\n return 3;\r\n }\r\n if (platformId === 0) {\r\n return 2;\r\n }\r\n return 1;\r\n}\r\n\r\nfunction lookupCMapFormat12(reader: SFNTReader, offset: number, codePoint: number) {\r\n const nGroups = reader.uint32(offset + 12);\r\n let low = 0;\r\n let high = nGroups - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const groupOffset = offset + 16 + mid * 12;\r\n const startCharCode = reader.uint32(groupOffset);\r\n const endCharCode = reader.uint32(groupOffset + 4);\r\n if (codePoint < startCharCode) {\r\n high = mid - 1;\r\n } else if (codePoint > endCharCode) {\r\n low = mid + 1;\r\n } else {\r\n return reader.uint32(groupOffset + 8) + (codePoint - startCharCode);\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction lookupCMapFormat4(reader: SFNTReader, offset: number, codePoint: number) {\r\n const segCount = reader.uint16(offset + 6) >> 1;\r\n const endCodeOffset = offset + 14;\r\n const startCodeOffset = endCodeOffset + segCount * 2 + 2;\r\n const idDeltaOffset = startCodeOffset + segCount * 2;\r\n const idRangeOffsetOffset = idDeltaOffset + segCount * 2;\r\n for (let i = 0; i < segCount; i++) {\r\n const endCode = reader.uint16(endCodeOffset + i * 2);\r\n if (codePoint > endCode) {\r\n continue;\r\n }\r\n const startCode = reader.uint16(startCodeOffset + i * 2);\r\n if (codePoint < startCode) {\r\n return 0;\r\n }\r\n const idDelta = reader.int16(idDeltaOffset + i * 2);\r\n const idRangeOffset = reader.uint16(idRangeOffsetOffset + i * 2);\r\n if (idRangeOffset === 0) {\r\n return (codePoint + idDelta) & 0xffff;\r\n }\r\n const glyphIndexAddress = idRangeOffsetOffset + i * 2 + idRangeOffset + (codePoint - startCode) * 2;\r\n const glyphIndex = reader.uint16(glyphIndexAddress);\r\n return glyphIndex === 0 ? 0 : (glyphIndex + idDelta) & 0xffff;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction parseKernPairs(reader: SFNTReader, table: TableRecord | null) {\r\n const result = new Map<number, number>();\r\n if (!table || table.length < 4) {\r\n return result;\r\n }\r\n const version = reader.uint16(table.offset);\r\n if (version !== 0) {\r\n return result;\r\n }\r\n const nTables = reader.uint16(table.offset + 2);\r\n let cursor = table.offset + 4;\r\n for (let i = 0; i < nTables; i++) {\r\n const length = reader.uint16(cursor + 2);\r\n const coverage = reader.uint16(cursor + 4);\r\n const format = coverage >> 8;\r\n if (format === 0) {\r\n const nPairs = reader.uint16(cursor + 6);\r\n let pairOffset = cursor + 14;\r\n for (let j = 0; j < nPairs; j++) {\r\n const left = reader.uint16(pairOffset);\r\n const right = reader.uint16(pairOffset + 2);\r\n const value = reader.int16(pairOffset + 4);\r\n result.set((left << 16) | right, value);\r\n pairOffset += 6;\r\n }\r\n }\r\n cursor += length;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseGPOSPairs(reader: SFNTReader, table: TableRecord | null) {\r\n if (!table || table.length < 10) {\r\n return [];\r\n }\r\n const majorVersion = reader.uint16(table.offset);\r\n if (majorVersion !== 1) {\r\n return [];\r\n }\r\n const featureListOffset = reader.uint16(table.offset + 6);\r\n const lookupListOffset = reader.uint16(table.offset + 8);\r\n if (!featureListOffset || !lookupListOffset) {\r\n return [];\r\n }\r\n const featureLookupIndices = collectGPOSFeatureLookupIndices(reader, table.offset + featureListOffset);\r\n if (featureLookupIndices.length === 0) {\r\n return [];\r\n }\r\n return parseGPOSLookupSubtables(\r\n reader,\r\n table.offset + lookupListOffset,\r\n table.offset,\r\n featureLookupIndices\r\n );\r\n}\r\n\r\nfunction collectGPOSFeatureLookupIndices(reader: SFNTReader, featureListOffset: number) {\r\n const featureCount = reader.uint16(featureListOffset);\r\n const featureTags = new Set(['kern']);\r\n const lookupIndices = new Set<number>();\r\n for (let i = 0; i < featureCount; i++) {\r\n const recordOffset = featureListOffset + 2 + i * 6;\r\n const tag = reader.tag(recordOffset);\r\n if (!featureTags.has(tag)) {\r\n continue;\r\n }\r\n const featureOffset = featureListOffset + reader.uint16(recordOffset + 4);\r\n const lookupIndexCount = reader.uint16(featureOffset + 2);\r\n for (let j = 0; j < lookupIndexCount; j++) {\r\n lookupIndices.add(reader.uint16(featureOffset + 4 + j * 2));\r\n }\r\n }\r\n return [...lookupIndices].sort((a, b) => a - b);\r\n}\r\n\r\nfunction parseGPOSLookupSubtables(\r\n reader: SFNTReader,\r\n lookupListOffset: number,\r\n gposOffset: number,\r\n lookupIndices: number[]\r\n) {\r\n const lookupCount = reader.uint16(lookupListOffset);\r\n const result: GPOSPairSubtable[] = [];\r\n for (const lookupIndex of lookupIndices) {\r\n if (lookupIndex >= lookupCount) {\r\n continue;\r\n }\r\n const lookupOffset = lookupListOffset + reader.uint16(lookupListOffset + 2 + lookupIndex * 2);\r\n const lookupType = reader.uint16(lookupOffset);\r\n const subtableCount = reader.uint16(lookupOffset + 4);\r\n for (let i = 0; i < subtableCount; i++) {\r\n const subtableOffset = lookupOffset + reader.uint16(lookupOffset + 6 + i * 2);\r\n if (lookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n } else if (lookupType === 9) {\r\n const extensionLookupType = reader.uint16(subtableOffset + 2);\r\n const extensionOffset = reader.uint32(subtableOffset + 4);\r\n if (extensionLookupType === 2) {\r\n const parsed = parsePairPosSubtable(reader, subtableOffset + extensionOffset);\r\n if (parsed) {\r\n result.push(parsed);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction parsePairPosSubtable(reader: SFNTReader, offset: number): GPOSPairSubtable | null {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n return parsePairPosFormat1(reader, offset);\r\n }\r\n if (format === 2) {\r\n return parsePairPosFormat2(reader, offset);\r\n }\r\n return null;\r\n}\r\n\r\nfunction parsePairPosFormat1(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const pairSetCount = reader.uint16(offset + 8);\r\n const pairs = new Map<number, Map<number, PairAdjustment>>();\r\n for (let i = 0; i < pairSetCount; i++) {\r\n const firstGlyph = getCoverageGlyph(coverage, i);\r\n if (firstGlyph < 0) {\r\n continue;\r\n }\r\n const pairSetOffset = offset + reader.uint16(offset + 10 + i * 2);\r\n const pairValueCount = reader.uint16(pairSetOffset);\r\n let cursor = pairSetOffset + 2;\r\n const secondMap = new Map<number, PairAdjustment>();\r\n for (let j = 0; j < pairValueCount; j++) {\r\n const secondGlyph = reader.uint16(cursor);\r\n cursor += 2;\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n const adjustment = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n } satisfies PairAdjustment;\r\n if (\r\n adjustment.firstXPlacement !== 0 ||\r\n adjustment.firstXAdvance !== 0 ||\r\n adjustment.secondXPlacement !== 0 ||\r\n adjustment.secondXAdvance !== 0\r\n ) {\r\n secondMap.set(secondGlyph, adjustment);\r\n }\r\n }\r\n pairs.set(firstGlyph, secondMap);\r\n }\r\n return { kind: 'format1', coverage, pairs };\r\n}\r\n\r\nfunction parsePairPosFormat2(reader: SFNTReader, offset: number): GPOSPairSubtable {\r\n const coverage = parseCoverageTable(reader, offset + reader.uint16(offset + 2));\r\n const valueFormat1 = reader.uint16(offset + 4);\r\n const valueFormat2 = reader.uint16(offset + 6);\r\n const classDef1 = parseClassDefTable(reader, offset + reader.uint16(offset + 8));\r\n const classDef2 = parseClassDefTable(reader, offset + reader.uint16(offset + 10));\r\n const class1Count = reader.uint16(offset + 12);\r\n const class2Count = reader.uint16(offset + 14);\r\n const values: PairAdjustment[] = new Array(class1Count * class2Count);\r\n let cursor = offset + 16;\r\n for (let c1 = 0; c1 < class1Count; c1++) {\r\n for (let c2 = 0; c2 < class2Count; c2++) {\r\n const value1 = readValueRecordX(reader, cursor, valueFormat1);\r\n cursor += getValueRecordSize(valueFormat1);\r\n const value2 = readValueRecordX(reader, cursor, valueFormat2);\r\n cursor += getValueRecordSize(valueFormat2);\r\n values[c1 * class2Count + c2] = {\r\n firstXPlacement: value1.xPlacement,\r\n firstXAdvance: value1.xAdvance,\r\n secondXPlacement: value2.xPlacement,\r\n secondXAdvance: value2.xAdvance\r\n };\r\n }\r\n }\r\n return { kind: 'format2', coverage, classDef1, classDef2, class1Count, class2Count, values };\r\n}\r\n\r\nfunction parseCoverageTable(reader: SFNTReader, offset: number): CoverageTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const glyphCount = reader.uint16(offset + 2);\r\n const glyphs = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n glyphs[i] = reader.uint16(offset + 4 + i * 2);\r\n }\r\n return { format: 1, glyphs };\r\n }\r\n const rangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; startIndex: number }[] = [];\r\n for (let i = 0; i < rangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n startIndex: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getCoverageGlyph(coverage: CoverageTable, index: number) {\r\n if (coverage.format === 1) {\r\n return coverage.glyphs[index] ?? -1;\r\n }\r\n for (const range of coverage.ranges) {\r\n const rangeLength = range.end - range.start + 1;\r\n if (index >= range.startIndex && index < range.startIndex + rangeLength) {\r\n return range.start + (index - range.startIndex);\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction coverageContains(coverage: CoverageTable, glyphIndex: number) {\r\n if (coverage.format === 1) {\r\n return binarySearchU16(coverage.glyphs, glyphIndex) >= 0;\r\n }\r\n for (const range of coverage.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction parseClassDefTable(reader: SFNTReader, offset: number): ClassDefTable {\r\n const format = reader.uint16(offset);\r\n if (format === 1) {\r\n const startGlyphId = reader.uint16(offset + 2);\r\n const glyphCount = reader.uint16(offset + 4);\r\n const classes = new Uint16Array(glyphCount);\r\n for (let i = 0; i < glyphCount; i++) {\r\n classes[i] = reader.uint16(offset + 6 + i * 2);\r\n }\r\n return { format: 1, startGlyphId, classes };\r\n }\r\n const classRangeCount = reader.uint16(offset + 2);\r\n const ranges: { start: number; end: number; classId: number }[] = [];\r\n for (let i = 0; i < classRangeCount; i++) {\r\n const rangeOffset = offset + 4 + i * 6;\r\n ranges.push({\r\n start: reader.uint16(rangeOffset),\r\n end: reader.uint16(rangeOffset + 2),\r\n classId: reader.uint16(rangeOffset + 4)\r\n });\r\n }\r\n return { format: 2, ranges };\r\n}\r\n\r\nfunction getGlyphClass(classDef: ClassDefTable, glyphIndex: number) {\r\n if (classDef.format === 1) {\r\n const index = glyphIndex - classDef.startGlyphId;\r\n return index >= 0 && index < classDef.classes.length ? classDef.classes[index] : 0;\r\n }\r\n for (const range of classDef.ranges) {\r\n if (glyphIndex >= range.start && glyphIndex <= range.end) {\r\n return range.classId;\r\n }\r\n }\r\n return 0;\r\n}\r\n\r\nfunction readValueRecordX(reader: SFNTReader, offset: number, valueFormat: number) {\r\n let cursor = offset;\r\n let xPlacement = 0;\r\n let xAdvance = 0;\r\n if (valueFormat & 0x0001) {\r\n xPlacement = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0002) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0004) {\r\n xAdvance = reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0008) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0010) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0020) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0040) {\r\n cursor += 2;\r\n }\r\n if (valueFormat & 0x0080) {\r\n cursor += 2;\r\n }\r\n return { xPlacement, xAdvance };\r\n}\r\n\r\nfunction getValueRecordSize(valueFormat: number) {\r\n let size = 0;\r\n for (let bit = 0; bit < 8; bit++) {\r\n if (valueFormat & (1 << bit)) {\r\n size += 2;\r\n }\r\n }\r\n return size;\r\n}\r\n\r\nfunction lookupGPOSPair(subtables: GPOSPairSubtable[], leftGlyphIndex: number, rightGlyphIndex: number) {\r\n let merged: PairAdjustment | null = null;\r\n for (const subtable of subtables) {\r\n if (!coverageContains(subtable.coverage, leftGlyphIndex)) {\r\n continue;\r\n }\r\n if (subtable.kind === 'format1') {\r\n const secondMap = subtable.pairs.get(leftGlyphIndex);\r\n if (secondMap) {\r\n const adjustment = secondMap.get(rightGlyphIndex);\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n } else {\r\n const class1 = getGlyphClass(subtable.classDef1, leftGlyphIndex);\r\n const class2 = getGlyphClass(subtable.classDef2, rightGlyphIndex);\r\n if (class1 < subtable.class1Count && class2 < subtable.class2Count) {\r\n const adjustment = subtable.values[class1 * subtable.class2Count + class2];\r\n if (adjustment) {\r\n merged = mergePairAdjustment(merged, adjustment);\r\n }\r\n }\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction binarySearchU16(values: Uint16Array<ArrayBuffer>, target: number) {\r\n let low = 0;\r\n let high = values.length - 1;\r\n while (low <= high) {\r\n const mid = (low + high) >> 1;\r\n const value = values[mid];\r\n if (value < target) {\r\n low = mid + 1;\r\n } else if (value > target) {\r\n high = mid - 1;\r\n } else {\r\n return mid;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction mergePairAdjustment(base: PairAdjustment | null, next: PairAdjustment): PairAdjustment {\r\n if (!base) {\r\n return { ...next };\r\n }\r\n return {\r\n firstXPlacement: base.firstXPlacement + next.firstXPlacement,\r\n firstXAdvance: base.firstXAdvance + next.firstXAdvance,\r\n secondXPlacement: base.secondXPlacement + next.secondXPlacement,\r\n secondXAdvance: base.secondXAdvance + next.secondXAdvance\r\n };\r\n}\r\n\r\nfunction parseGlyphHeader(reader: SFNTReader, offset: number): GlyphHeader {\r\n return {\r\n numberOfContours: reader.int16(offset),\r\n xMin: reader.int16(offset + 2),\r\n yMin: reader.int16(offset + 4),\r\n xMax: reader.int16(offset + 6),\r\n yMax: reader.int16(offset + 8)\r\n };\r\n}\r\n\r\nfunction parseSimpleGlyph(reader: SFNTReader, offset: number, numberOfContours: number): GlyphContour[] {\r\n const endPts: number[] = [];\r\n let cursor = offset + 10;\r\n for (let i = 0; i < numberOfContours; i++) {\r\n endPts.push(reader.uint16(cursor));\r\n cursor += 2;\r\n }\r\n const pointCount = endPts[numberOfContours - 1] + 1;\r\n const instructionLength = reader.uint16(cursor);\r\n cursor += 2 + instructionLength;\r\n const flags = new Uint8Array(pointCount);\r\n for (let i = 0; i < pointCount; ) {\r\n const flag = reader.uint8(cursor++);\r\n flags[i++] = flag;\r\n if (flag & 0x08) {\r\n const repeatCount = reader.uint8(cursor++);\r\n for (let j = 0; j < repeatCount; j++) {\r\n flags[i++] = flag;\r\n }\r\n }\r\n }\r\n const xs = new Int16Array(pointCount);\r\n const ys = new Int16Array(pointCount);\r\n let currentX = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x02) {\r\n const dx = reader.uint8(cursor++);\r\n currentX += flag & 0x10 ? dx : -dx;\r\n } else if (!(flag & 0x10)) {\r\n currentX += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n xs[i] = currentX;\r\n }\r\n let currentY = 0;\r\n for (let i = 0; i < pointCount; i++) {\r\n const flag = flags[i];\r\n if (flag & 0x04) {\r\n const dy = reader.uint8(cursor++);\r\n currentY += flag & 0x20 ? dy : -dy;\r\n } else if (!(flag & 0x20)) {\r\n currentY += reader.int16(cursor);\r\n cursor += 2;\r\n }\r\n ys[i] = currentY;\r\n }\r\n const points: GlyphPoint[] = [];\r\n for (let i = 0; i < pointCount; i++) {\r\n points.push({\r\n x: xs[i],\r\n y: ys[i],\r\n onCurve: !!(flags[i] & 0x01)\r\n });\r\n }\r\n const contours: GlyphContour[] = [];\r\n let start = 0;\r\n for (const end of endPts) {\r\n contours.push(expandImplicitPoints(points.slice(start, end + 1)));\r\n start = end + 1;\r\n }\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeGlyph(\r\n reader: SFNTReader,\r\n offset: number,\r\n loadGlyph: (glyphIndex: number) => GlyphData | null\r\n): GlyphContour[] {\r\n let cursor = offset + 10;\r\n const contours: GlyphContour[] = [];\r\n let flags = 0;\r\n do {\r\n flags = reader.uint16(cursor);\r\n const glyphIndex = reader.uint16(cursor + 2);\r\n cursor += 4;\r\n const component = parseCompositeComponent(reader, cursor, flags, glyphIndex);\r\n cursor = component.cursor;\r\n const child = loadGlyph(component.data.glyphIndex);\r\n if (child) {\r\n for (const contour of child.contours) {\r\n contours.push(\r\n contour.map((point) => ({\r\n x: point.x * component.data.xx + point.y * component.data.xy + component.data.dx,\r\n y: point.x * component.data.yx + point.y * component.data.yy + component.data.dy,\r\n onCurve: point.onCurve\r\n }))\r\n );\r\n }\r\n }\r\n } while (flags & MORE_COMPONENTS);\r\n return contours;\r\n}\r\n\r\nfunction parseCompositeComponent(reader: SFNTReader, offset: number, flags: number, glyphIndex: number) {\r\n let cursor = offset;\r\n let arg1 = 0;\r\n let arg2 = 0;\r\n if (flags & ARG_1_AND_2_ARE_WORDS) {\r\n arg1 = reader.int16(cursor);\r\n arg2 = reader.int16(cursor + 2);\r\n cursor += 4;\r\n } else {\r\n arg1 = reader.int8(cursor);\r\n arg2 = reader.int8(cursor + 1);\r\n cursor += 2;\r\n }\r\n let dx = 0;\r\n let dy = 0;\r\n if (flags & ARGS_ARE_XY_VALUES) {\r\n dx = arg1;\r\n dy = arg2;\r\n }\r\n let xx = 1;\r\n let xy = 0;\r\n let yx = 0;\r\n let yy = 1;\r\n if (flags & WE_HAVE_A_SCALE) {\r\n const scale = readF2Dot14(reader, cursor);\r\n cursor += 2;\r\n xx = scale;\r\n yy = scale;\r\n } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\r\n xx = readF2Dot14(reader, cursor);\r\n yy = readF2Dot14(reader, cursor + 2);\r\n cursor += 4;\r\n } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\r\n xx = readF2Dot14(reader, cursor);\r\n xy = readF2Dot14(reader, cursor + 2);\r\n yx = readF2Dot14(reader, cursor + 4);\r\n yy = readF2Dot14(reader, cursor + 6);\r\n cursor += 8;\r\n }\r\n return {\r\n data: { glyphIndex, dx, dy, xx, xy, yx, yy } satisfies CompositeComponent,\r\n cursor\r\n };\r\n}\r\n\r\nfunction readF2Dot14(reader: SFNTReader, offset: number) {\r\n return reader.int16(offset) / 16384;\r\n}\r\n\r\nfunction expandImplicitPoints(points: GlyphPoint[]) {\r\n if (points.length === 0) {\r\n return points;\r\n }\r\n const result: GlyphPoint[] = [];\r\n for (let i = 0; i < points.length; i++) {\r\n const current = points[i];\r\n const next = points[(i + 1) % points.length];\r\n result.push(current);\r\n if (!current.onCurve && !next.onCurve) {\r\n result.push({\r\n x: (current.x + next.x) * 0.5,\r\n y: (current.y + next.y) * 0.5,\r\n onCurve: true\r\n });\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction computeBounds(contours: GlyphContour[]) {\r\n if (contours.length === 0) {\r\n return { xMin: 0, yMin: 0, xMax: 0, yMax: 0 };\r\n }\r\n let xMin = Number.POSITIVE_INFINITY;\r\n let yMin = Number.POSITIVE_INFINITY;\r\n let xMax = Number.NEGATIVE_INFINITY;\r\n let yMax = Number.NEGATIVE_INFINITY;\r\n for (const contour of contours) {\r\n for (const point of contour) {\r\n xMin = Math.min(xMin, point.x);\r\n yMin = Math.min(yMin, point.y);\r\n xMax = Math.max(xMax, point.x);\r\n yMax = Math.max(yMax, point.y);\r\n }\r\n }\r\n return { xMin, yMin, xMax, yMax };\r\n}\r\n\r\nfunction buildGlyphData(\r\n glyphIndex: number,\r\n advanceWidths: Uint16Array<ArrayBuffer>,\r\n leftSideBearings: Int16Array<ArrayBuffer>,\r\n contours: GlyphContour[],\r\n xMin: number,\r\n yMin: number,\r\n xMax: number,\r\n yMax: number\r\n): GlyphData {\r\n return {\r\n glyphIndex,\r\n advanceWidth: advanceWidths[glyphIndex] ?? 0,\r\n leftSideBearing: leftSideBearings[glyphIndex] ?? 0,\r\n xMin,\r\n yMin,\r\n xMax,\r\n yMax,\r\n contours\r\n };\r\n}\r\n\r\nfunction normalizeMSDFAtlasPageSize(value: number | undefined) {\r\n return Math.max(32, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_ATLAS_PAGE_SIZE));\r\n}\r\n\r\nfunction normalizeMSDFGlyphSize(value: number | undefined) {\r\n return Math.max(8, Math.round(Number.isFinite(value) ? value! : DEFAULT_MSDF_GLYPH_SIZE));\r\n}\r\n"],"names":["ARG_1_AND_2_ARE_WORDS","ARGS_ARE_XY_VALUES","WE_HAVE_A_SCALE","MORE_COMPONENTS","WE_HAVE_AN_X_AND_Y_SCALE","WE_HAVE_A_TWO_BY_TWO","DEFAULT_MSDF_ATLAS_PAGE_SIZE","DEFAULT_MSDF_GLYPH_SIZE","FontAsset","_reader","_tables","_glyphOffsets","_advanceWidths","_leftSideBearings","_glyphCache","_cmapFormat4","_cmapFormat12","_kernPairs","_gposPairs","_metrics","_numberOfHMetrics","_msdfAtlasSettings","buffer","options","SFNTReader","parseTableDirectory","head","requireTable","maxp","hhea","hmtx","loca","uint16","offset","unitsPerEm","ascent","int16","descent","lineGap","glyphCount","parseGlyphOffsets","metrics","parseHorizontalMetrics","advanceWidths","leftSideBearings","cmap","parseBestCMap","format4","format12","parseKernPairs","getTable","parseGPOSPairs","Map","Object","freeze","pageSize","normalizeMSDFAtlasPageSize","glyphSize","normalizeMSDFGlyphSize","fromBuffer","msdfAtlasSettings","msdfAtlasPageSize","msdfGlyphSize","getGlyphIndex","codePoint","glyphIndex","lookupCMapFormat12","lookupCMapFormat4","getKerning","leftGlyphIndex","rightGlyphIndex","gpos","getPairAdjustment","firstXAdvance","secondXAdvance","get","lookupGPOSPair","getGlyph","has","glyph","loadGlyph","set","tag","table","Error","depth","glyf","nextOffset","buildGlyphData","glyphOffset","header","parseGlyphHeader","numberOfContours","contours","parseSimpleGlyph","xMin","yMin","xMax","yMax","parseCompositeGlyph","childIndex","bounds","computeBounds","reader","numTables","tables","i","uint32","length","indexToLocFormat","result","Uint32Array","numberOfHMetrics","Uint16Array","Int16Array","cursor","lastAdvanceWidth","recordOffset","platformId","encodingId","subtableOffset","format","isPreferredCMap","currentPlatformId","currentEncodingId","nextScore","getCMapScore","currentScore","nGroups","low","high","mid","groupOffset","startCharCode","endCharCode","segCount","endCodeOffset","startCodeOffset","idDeltaOffset","idRangeOffsetOffset","endCode","startCode","idDelta","idRangeOffset","glyphIndexAddress","version","nTables","coverage","nPairs","pairOffset","j","left","right","value","majorVersion","featureListOffset","lookupListOffset","featureLookupIndices","collectGPOSFeatureLookupIndices","parseGPOSLookupSubtables","featureCount","featureTags","Set","lookupIndices","featureOffset","lookupIndexCount","add","sort","a","b","gposOffset","lookupCount","lookupIndex","lookupOffset","lookupType","subtableCount","parsed","parsePairPosSubtable","push","extensionLookupType","extensionOffset","parsePairPosFormat1","parsePairPosFormat2","parseCoverageTable","valueFormat1","valueFormat2","pairSetCount","pairs","firstGlyph","getCoverageGlyph","pairSetOffset","pairValueCount","secondMap","secondGlyph","value1","readValueRecordX","getValueRecordSize","value2","adjustment","firstXPlacement","xPlacement","xAdvance","secondXPlacement","kind","classDef1","parseClassDefTable","classDef2","class1Count","class2Count","values","Array","c1","c2","glyphs","rangeCount","ranges","rangeOffset","start","end","startIndex","index","range","rangeLength","coverageContains","binarySearchU16","startGlyphId","classes","classRangeCount","classId","getGlyphClass","classDef","valueFormat","size","bit","subtables","merged","subtable","mergePairAdjustment","class1","class2","target","base","next","endPts","pointCount","instructionLength","flags","Uint8Array","flag","uint8","repeatCount","xs","ys","currentX","dx","currentY","dy","points","x","y","onCurve","expandImplicitPoints","slice","component","parseCompositeComponent","child","data","contour","map","point","xx","xy","yx","yy","arg1","arg2","int8","scale","readF2Dot14","current","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","Math","min","max","advanceWidth","leftSideBearing","round","isFinite"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class SFNTReader {
|
|
2
|
+
_buffer;
|
|
3
|
+
_byteOffset;
|
|
4
|
+
_view;
|
|
5
|
+
constructor(_buffer, _byteOffset = 0){
|
|
6
|
+
this._buffer = _buffer;
|
|
7
|
+
this._byteOffset = _byteOffset;
|
|
8
|
+
this._view = new DataView(_buffer);
|
|
9
|
+
}
|
|
10
|
+
get buffer() {
|
|
11
|
+
return this._buffer;
|
|
12
|
+
}
|
|
13
|
+
uint8(offset) {
|
|
14
|
+
return this._view.getUint8(this._byteOffset + offset);
|
|
15
|
+
}
|
|
16
|
+
int8(offset) {
|
|
17
|
+
return this._view.getInt8(this._byteOffset + offset);
|
|
18
|
+
}
|
|
19
|
+
uint16(offset) {
|
|
20
|
+
return this._view.getUint16(this._byteOffset + offset, false);
|
|
21
|
+
}
|
|
22
|
+
int16(offset) {
|
|
23
|
+
return this._view.getInt16(this._byteOffset + offset, false);
|
|
24
|
+
}
|
|
25
|
+
uint32(offset) {
|
|
26
|
+
return this._view.getUint32(this._byteOffset + offset, false);
|
|
27
|
+
}
|
|
28
|
+
int32(offset) {
|
|
29
|
+
return this._view.getInt32(this._byteOffset + offset, false);
|
|
30
|
+
}
|
|
31
|
+
fixed(offset) {
|
|
32
|
+
return this.int32(offset) / 65536;
|
|
33
|
+
}
|
|
34
|
+
tag(offset) {
|
|
35
|
+
return String.fromCharCode(this.uint8(offset), this.uint8(offset + 1), this.uint8(offset + 2), this.uint8(offset + 3));
|
|
36
|
+
}
|
|
37
|
+
slice(offset, length) {
|
|
38
|
+
return new DataView(this._buffer, this._byteOffset + offset, length);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { SFNTReader };
|
|
43
|
+
//# sourceMappingURL=sfnt_reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfnt_reader.js","sources":["../../../src/text/font/sfnt_reader.ts"],"sourcesContent":["export class SFNTReader {\r\n private readonly _view: DataView;\r\n constructor(\r\n private readonly _buffer: ArrayBuffer,\r\n private readonly _byteOffset = 0\r\n ) {\r\n this._view = new DataView(_buffer);\r\n }\r\n get buffer() {\r\n return this._buffer;\r\n }\r\n uint8(offset: number) {\r\n return this._view.getUint8(this._byteOffset + offset);\r\n }\r\n int8(offset: number) {\r\n return this._view.getInt8(this._byteOffset + offset);\r\n }\r\n uint16(offset: number) {\r\n return this._view.getUint16(this._byteOffset + offset, false);\r\n }\r\n int16(offset: number) {\r\n return this._view.getInt16(this._byteOffset + offset, false);\r\n }\r\n uint32(offset: number) {\r\n return this._view.getUint32(this._byteOffset + offset, false);\r\n }\r\n int32(offset: number) {\r\n return this._view.getInt32(this._byteOffset + offset, false);\r\n }\r\n fixed(offset: number) {\r\n return this.int32(offset) / 65536;\r\n }\r\n tag(offset: number) {\r\n return String.fromCharCode(\r\n this.uint8(offset),\r\n this.uint8(offset + 1),\r\n this.uint8(offset + 2),\r\n this.uint8(offset + 3)\r\n );\r\n }\r\n slice(offset: number, length: number) {\r\n return new DataView(this._buffer, this._byteOffset + offset, length);\r\n }\r\n}\r\n"],"names":["SFNTReader","_view","_byteOffset","_buffer","DataView","buffer","uint8","offset","getUint8","int8","getInt8","uint16","getUint16","int16","getInt16","uint32","getUint32","int32","getInt32","fixed","tag","String","fromCharCode","slice","length"],"mappings":"AAAO,MAAMA,UAAAA,CAAAA;;;IACMC,KAAgB;AACjC,IAAA,WAAA,CACE,OAAqC,EACrC,WAAiBC,GAAc,CAAC,CAChC;aAFiBC,OAAAA,GAAAA,OAAAA;aACAD,WAAAA,GAAAA,WAAAA;AAEjB,QAAA,IAAI,CAACD,KAAK,GAAG,IAAIG,QAASD,CAAAA,OAAAA,CAAAA;AAC5B;AACA,IAAA,IAAIE,MAAS,GAAA;QACX,OAAO,IAAI,CAACF,OAAO;AACrB;AACAG,IAAAA,KAAAA,CAAMC,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACO,QAAQ,CAAC,IAAI,CAACN,WAAW,GAAGK,MAAAA,CAAAA;AAChD;AACAE,IAAAA,IAAAA,CAAKF,MAAc,EAAE;QACnB,OAAO,IAAI,CAACN,KAAK,CAACS,OAAO,CAAC,IAAI,CAACR,WAAW,GAAGK,MAAAA,CAAAA;AAC/C;AACAI,IAAAA,MAAAA,CAAOJ,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACW,SAAS,CAAC,IAAI,CAACV,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAM,IAAAA,KAAAA,CAAMN,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACa,QAAQ,CAAC,IAAI,CAACZ,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAQ,IAAAA,MAAAA,CAAOR,MAAc,EAAE;QACrB,OAAO,IAAI,CAACN,KAAK,CAACe,SAAS,CAAC,IAAI,CAACd,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACzD;AACAU,IAAAA,KAAAA,CAAMV,MAAc,EAAE;QACpB,OAAO,IAAI,CAACN,KAAK,CAACiB,QAAQ,CAAC,IAAI,CAAChB,WAAW,GAAGK,MAAQ,EAAA,KAAA,CAAA;AACxD;AACAY,IAAAA,KAAAA,CAAMZ,MAAc,EAAE;AACpB,QAAA,OAAO,IAAI,CAACU,KAAK,CAACV,MAAU,CAAA,GAAA,KAAA;AAC9B;AACAa,IAAAA,GAAAA,CAAIb,MAAc,EAAE;QAClB,OAAOc,MAAAA,CAAOC,YAAY,CACxB,IAAI,CAAChB,KAAK,CAACC,MAAAA,CAAAA,EACX,IAAI,CAACD,KAAK,CAACC,SAAS,CACpB,CAAA,EAAA,IAAI,CAACD,KAAK,CAACC,MAAAA,GAAS,IACpB,IAAI,CAACD,KAAK,CAACC,MAAS,GAAA,CAAA,CAAA,CAAA;AAExB;IACAgB,KAAMhB,CAAAA,MAAc,EAAEiB,MAAc,EAAE;QACpC,OAAO,IAAIpB,QAAS,CAAA,IAAI,CAACD,OAAO,EAAE,IAAI,CAACD,WAAW,GAAGK,MAAQiB,EAAAA,MAAAA,CAAAA;AAC/D;AACF;;;;"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { clamp } from '@zephyr3d/base';
|
|
2
|
+
import { buildMSDFShape } from './shape.js';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_PADDING = 1;
|
|
5
|
+
const CHANNEL_MASKS = [
|
|
6
|
+
1,
|
|
7
|
+
2,
|
|
8
|
+
4
|
|
9
|
+
];
|
|
10
|
+
const EPSILON = 1e-8;
|
|
11
|
+
const CONTOUR_PROBE_DISTANCES = [
|
|
12
|
+
1,
|
|
13
|
+
4,
|
|
14
|
+
16
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Generate a runtime RGB(A) distance field bitmap from a parsed glyph.
|
|
18
|
+
*
|
|
19
|
+
* Distances are encoded in output texel units, which matches the shader-side
|
|
20
|
+
* `distanceRange` logic and keeps the field scale-invariant across font sizes.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/ function generateMSDF(glyph, options) {
|
|
24
|
+
const shape = buildMSDFShape(glyph.contours);
|
|
25
|
+
const width = Math.max(1, options.width | 0);
|
|
26
|
+
const height = Math.max(1, options.height | 0);
|
|
27
|
+
const padding = options.padding ?? DEFAULT_PADDING;
|
|
28
|
+
const boundsWidth = Math.max(1, glyph.xMax - glyph.xMin);
|
|
29
|
+
const boundsHeight = Math.max(1, glyph.yMax - glyph.yMin);
|
|
30
|
+
const drawableWidth = Math.max(1, width - padding * 2);
|
|
31
|
+
const drawableHeight = Math.max(1, height - padding * 2);
|
|
32
|
+
const scale = Math.min(drawableWidth / boundsWidth, drawableHeight / boundsHeight);
|
|
33
|
+
const placedWidth = boundsWidth * scale;
|
|
34
|
+
const placedHeight = boundsHeight * scale;
|
|
35
|
+
const translateX = padding + (drawableWidth - placedWidth) * 0.5 - glyph.xMin * scale;
|
|
36
|
+
const translateY = padding + (drawableHeight - placedHeight) * 0.5 + glyph.yMax * scale;
|
|
37
|
+
const contourInsideSigns = shape.contours.map((contour)=>determineContourInsideSign(contour, shape.contours));
|
|
38
|
+
const fields = new Float32Array(width * height * 4);
|
|
39
|
+
for(let y = 0; y < height; y++){
|
|
40
|
+
for(let x = 0; x < width; x++){
|
|
41
|
+
const sourceX = (x + 0.5 - translateX) / scale;
|
|
42
|
+
const sourceY = -(y + 0.5 - translateY) / scale;
|
|
43
|
+
const inside = pointInShape(sourceX, sourceY, shape.contours);
|
|
44
|
+
let minDistance = Number.POSITIVE_INFINITY;
|
|
45
|
+
const channelSamples = [
|
|
46
|
+
null,
|
|
47
|
+
null,
|
|
48
|
+
null
|
|
49
|
+
];
|
|
50
|
+
for(let contourIndex = 0; contourIndex < shape.contours.length; contourIndex++){
|
|
51
|
+
const contour = shape.contours[contourIndex];
|
|
52
|
+
const insideSign = contourInsideSigns[contourIndex];
|
|
53
|
+
for (const edge of contour){
|
|
54
|
+
const sample = sampleEdge(edge, sourceX, sourceY, insideSign);
|
|
55
|
+
if (sample.absDistance < minDistance) {
|
|
56
|
+
minDistance = sample.absDistance;
|
|
57
|
+
}
|
|
58
|
+
for(let channelIndex = 0; channelIndex < CHANNEL_MASKS.length; channelIndex++){
|
|
59
|
+
if ((edge.color & CHANNEL_MASKS[channelIndex]) !== 0 && betterSample(sample, channelSamples[channelIndex])) {
|
|
60
|
+
channelSamples[channelIndex] = sample;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!Number.isFinite(minDistance)) {
|
|
66
|
+
minDistance = 0;
|
|
67
|
+
}
|
|
68
|
+
const sdfDistance = (inside ? minDistance : -minDistance) * scale;
|
|
69
|
+
const base = (y * width + x) * 4;
|
|
70
|
+
fields[base + 0] = (channelSamples[0]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
71
|
+
fields[base + 1] = (channelSamples[1]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
72
|
+
fields[base + 2] = (channelSamples[2]?.distance ?? (inside ? minDistance : -minDistance)) * scale;
|
|
73
|
+
fields[base + 3] = sdfDistance;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
applyMedianCorrection(fields, width, height, options.range);
|
|
77
|
+
const pixels = new Uint8Array(width * height * 4);
|
|
78
|
+
for(let i = 0; i < width * height; i++){
|
|
79
|
+
const base = i * 4;
|
|
80
|
+
pixels[base + 0] = encodeDistance(fields[base + 0], options.range);
|
|
81
|
+
pixels[base + 1] = encodeDistance(fields[base + 1], options.range);
|
|
82
|
+
pixels[base + 2] = encodeDistance(fields[base + 2], options.range);
|
|
83
|
+
pixels[base + 3] = encodeDistance(fields[base + 3], options.range);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
width,
|
|
87
|
+
height,
|
|
88
|
+
pixels,
|
|
89
|
+
scale,
|
|
90
|
+
translateX,
|
|
91
|
+
translateY
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function encodeDistance(distance, range) {
|
|
95
|
+
return Math.round(clamp(0.5 + distance / (2 * Math.max(range, 1e-6)), 0, 1) * 255);
|
|
96
|
+
}
|
|
97
|
+
function betterSample(next, current) {
|
|
98
|
+
return !current || next.absDistance < current.absDistance - 1e-6 || Math.abs(next.absDistance - current.absDistance) <= 1e-6 && next.dot < current.dot;
|
|
99
|
+
}
|
|
100
|
+
function sampleEdge(edge, x, y, insideSign) {
|
|
101
|
+
return edge.kind === 'line' ? sampleLineEdge(edge, x, y, insideSign) : sampleQuadraticEdge(edge, x, y, insideSign);
|
|
102
|
+
}
|
|
103
|
+
function sampleLineEdge(edge, x, y, insideSign) {
|
|
104
|
+
const dx = edge.p1.x - edge.p0.x;
|
|
105
|
+
const dy = edge.p1.y - edge.p0.y;
|
|
106
|
+
const lenSq = dx * dx + dy * dy;
|
|
107
|
+
if (lenSq <= EPSILON) {
|
|
108
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, 1, 0, x, y, insideSign);
|
|
109
|
+
}
|
|
110
|
+
const qx = x - edge.p0.x;
|
|
111
|
+
const qy = y - edge.p0.y;
|
|
112
|
+
const t = (qx * dx + qy * dy) / lenSq;
|
|
113
|
+
if (t <= 0) {
|
|
114
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, dx, dy, x, y, insideSign);
|
|
115
|
+
}
|
|
116
|
+
if (t >= 1) {
|
|
117
|
+
return sampleEndpoint(edge.p1.x, edge.p1.y, dx, dy, x, y, insideSign);
|
|
118
|
+
}
|
|
119
|
+
const cx = edge.p0.x + dx * t;
|
|
120
|
+
const cy = edge.p0.y + dy * t;
|
|
121
|
+
const deltaX = x - cx;
|
|
122
|
+
const deltaY = y - cy;
|
|
123
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
124
|
+
return {
|
|
125
|
+
distance: signedPerpendicularDistance(dx, dy, deltaX, deltaY, insideSign),
|
|
126
|
+
absDistance,
|
|
127
|
+
dot: directionDot(deltaX, deltaY, dx, dy, absDistance)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function sampleQuadraticEdge(edge, x, y, insideSign) {
|
|
131
|
+
const t = findNearestQuadraticParameter(edge, x, y);
|
|
132
|
+
if (t <= EPSILON) {
|
|
133
|
+
const tangent = quadraticEndpointTangent(edge, true);
|
|
134
|
+
return sampleEndpoint(edge.p0.x, edge.p0.y, tangent.x, tangent.y, x, y, insideSign);
|
|
135
|
+
}
|
|
136
|
+
if (t >= 1 - EPSILON) {
|
|
137
|
+
const tangent = quadraticEndpointTangent(edge, false);
|
|
138
|
+
return sampleEndpoint(edge.p2.x, edge.p2.y, tangent.x, tangent.y, x, y, insideSign);
|
|
139
|
+
}
|
|
140
|
+
const point = evaluateQuadratic(edge, t);
|
|
141
|
+
const tangent = quadraticTangent(edge, t);
|
|
142
|
+
const deltaX = x - point.x;
|
|
143
|
+
const deltaY = y - point.y;
|
|
144
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
145
|
+
return {
|
|
146
|
+
distance: signedPerpendicularDistance(tangent.x, tangent.y, deltaX, deltaY, insideSign),
|
|
147
|
+
absDistance,
|
|
148
|
+
dot: directionDot(deltaX, deltaY, tangent.x, tangent.y, absDistance)
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function sampleEndpoint(px, py, tx, ty, x, y, insideSign) {
|
|
152
|
+
const deltaX = x - px;
|
|
153
|
+
const deltaY = y - py;
|
|
154
|
+
const absDistance = Math.hypot(deltaX, deltaY);
|
|
155
|
+
return {
|
|
156
|
+
distance: signedPerpendicularDistance(tx, ty, deltaX, deltaY, insideSign),
|
|
157
|
+
absDistance,
|
|
158
|
+
dot: directionDot(deltaX, deltaY, tx, ty, absDistance)
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function signedPerpendicularDistance(tx, ty, dx, dy, insideSign) {
|
|
162
|
+
const tangentLength = Math.hypot(tx, ty);
|
|
163
|
+
if (tangentLength <= EPSILON) {
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
return insideSign * cross(tx, ty, dx, dy) / tangentLength;
|
|
167
|
+
}
|
|
168
|
+
function directionDot(dx, dy, tx, ty, absDistance) {
|
|
169
|
+
const tangentLength = Math.hypot(tx, ty);
|
|
170
|
+
if (absDistance <= EPSILON || tangentLength <= EPSILON) {
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
return Math.abs((dx * tx + dy * ty) / (absDistance * tangentLength));
|
|
174
|
+
}
|
|
175
|
+
function findNearestQuadraticParameter(edge, x, y) {
|
|
176
|
+
const ax = edge.p0.x - 2 * edge.p1.x + edge.p2.x;
|
|
177
|
+
const ay = edge.p0.y - 2 * edge.p1.y + edge.p2.y;
|
|
178
|
+
const bx = 2 * (edge.p1.x - edge.p0.x);
|
|
179
|
+
const by = 2 * (edge.p1.y - edge.p0.y);
|
|
180
|
+
const cx = edge.p0.x - x;
|
|
181
|
+
const cy = edge.p0.y - y;
|
|
182
|
+
const roots = solveCubic(2 * dot(ax, ay, ax, ay), 3 * dot(ax, ay, bx, by), dot(bx, by, bx, by) + 2 * dot(ax, ay, cx, cy), dot(bx, by, cx, cy));
|
|
183
|
+
let nearestT = 0;
|
|
184
|
+
let minDistanceSq = Number.POSITIVE_INFINITY;
|
|
185
|
+
for (const candidate of [
|
|
186
|
+
0,
|
|
187
|
+
...roots,
|
|
188
|
+
1
|
|
189
|
+
]){
|
|
190
|
+
const t = clamp(candidate, 0, 1);
|
|
191
|
+
const point = evaluateQuadratic(edge, t);
|
|
192
|
+
const distX = x - point.x;
|
|
193
|
+
const distY = y - point.y;
|
|
194
|
+
const distanceSq = distX * distX + distY * distY;
|
|
195
|
+
if (distanceSq < minDistanceSq - 1e-6) {
|
|
196
|
+
minDistanceSq = distanceSq;
|
|
197
|
+
nearestT = t;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return nearestT;
|
|
201
|
+
}
|
|
202
|
+
function evaluateQuadratic(edge, t) {
|
|
203
|
+
const mt = 1 - t;
|
|
204
|
+
return {
|
|
205
|
+
x: mt * mt * edge.p0.x + 2 * mt * t * edge.p1.x + t * t * edge.p2.x,
|
|
206
|
+
y: mt * mt * edge.p0.y + 2 * mt * t * edge.p1.y + t * t * edge.p2.y
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function quadraticTangent(edge, t) {
|
|
210
|
+
const x = 2 * ((1 - t) * (edge.p1.x - edge.p0.x) + t * (edge.p2.x - edge.p1.x));
|
|
211
|
+
const y = 2 * ((1 - t) * (edge.p1.y - edge.p0.y) + t * (edge.p2.y - edge.p1.y));
|
|
212
|
+
if (Math.hypot(x, y) > EPSILON) {
|
|
213
|
+
return {
|
|
214
|
+
x,
|
|
215
|
+
y
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return quadraticEndpointTangent(edge, t < 0.5);
|
|
219
|
+
}
|
|
220
|
+
function quadraticEndpointTangent(edge, atStart) {
|
|
221
|
+
const tx = atStart ? edge.p1.x - edge.p0.x : edge.p2.x - edge.p1.x;
|
|
222
|
+
const ty = atStart ? edge.p1.y - edge.p0.y : edge.p2.y - edge.p1.y;
|
|
223
|
+
if (Math.hypot(tx, ty) > EPSILON) {
|
|
224
|
+
return {
|
|
225
|
+
x: tx,
|
|
226
|
+
y: ty
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const fallbackX = edge.p2.x - edge.p0.x;
|
|
230
|
+
const fallbackY = edge.p2.y - edge.p0.y;
|
|
231
|
+
if (Math.hypot(fallbackX, fallbackY) > EPSILON) {
|
|
232
|
+
return {
|
|
233
|
+
x: fallbackX,
|
|
234
|
+
y: fallbackY
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
x: 1,
|
|
239
|
+
y: 0
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function solveCubic(a, b, c, d) {
|
|
243
|
+
if (Math.abs(a) <= EPSILON) {
|
|
244
|
+
return solveQuadratic(b, c, d);
|
|
245
|
+
}
|
|
246
|
+
const invA = 1 / a;
|
|
247
|
+
const B = b * invA;
|
|
248
|
+
const C = c * invA;
|
|
249
|
+
const D = d * invA;
|
|
250
|
+
const p = C - B * B / 3;
|
|
251
|
+
const q = 2 * B * B * B / 27 - B * C / 3 + D;
|
|
252
|
+
const disc = q * q / 4 + p * p * p / 27;
|
|
253
|
+
const shift = -B / 3;
|
|
254
|
+
if (disc > EPSILON) {
|
|
255
|
+
const sqrtDisc = Math.sqrt(disc);
|
|
256
|
+
return [
|
|
257
|
+
Math.cbrt(-q / 2 + sqrtDisc) + Math.cbrt(-q / 2 - sqrtDisc) + shift
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
if (disc < -1e-8) {
|
|
261
|
+
const acosArg = clamp(-q / 2 / Math.sqrt(-p * p * p / 27), -1, 1);
|
|
262
|
+
const theta = Math.acos(acosArg);
|
|
263
|
+
const rho = 2 * Math.sqrt(-p / 3);
|
|
264
|
+
return dedupeRoots([
|
|
265
|
+
rho * Math.cos(theta / 3) + shift,
|
|
266
|
+
rho * Math.cos((theta + 2 * Math.PI) / 3) + shift,
|
|
267
|
+
rho * Math.cos((theta + 4 * Math.PI) / 3) + shift
|
|
268
|
+
]);
|
|
269
|
+
}
|
|
270
|
+
const u = Math.cbrt(-q / 2);
|
|
271
|
+
return dedupeRoots([
|
|
272
|
+
2 * u + shift,
|
|
273
|
+
-u + shift
|
|
274
|
+
]);
|
|
275
|
+
}
|
|
276
|
+
function solveQuadratic(a, b, c) {
|
|
277
|
+
if (Math.abs(a) <= EPSILON) {
|
|
278
|
+
return Math.abs(b) <= EPSILON ? [] : [
|
|
279
|
+
-c / b
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
const disc = b * b - 4 * a * c;
|
|
283
|
+
if (disc < -1e-8) {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
if (Math.abs(disc) <= EPSILON) {
|
|
287
|
+
return [
|
|
288
|
+
-b / (2 * a)
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
const sqrtDisc = Math.sqrt(Math.max(disc, 0));
|
|
292
|
+
return dedupeRoots([
|
|
293
|
+
(-b - sqrtDisc) / (2 * a),
|
|
294
|
+
(-b + sqrtDisc) / (2 * a)
|
|
295
|
+
]);
|
|
296
|
+
}
|
|
297
|
+
function dedupeRoots(values) {
|
|
298
|
+
const roots = [];
|
|
299
|
+
for (const value of values){
|
|
300
|
+
if (!roots.some((root)=>Math.abs(root - value) <= 1e-7)) {
|
|
301
|
+
roots.push(value);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return roots;
|
|
305
|
+
}
|
|
306
|
+
function determineContourInsideSign(contour, allContours) {
|
|
307
|
+
for (const edge of contour){
|
|
308
|
+
const probe = edgeProbe(edge);
|
|
309
|
+
const tangentLength = Math.hypot(probe.tangent.x, probe.tangent.y);
|
|
310
|
+
if (tangentLength <= EPSILON) {
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const normalX = -probe.tangent.y / tangentLength;
|
|
314
|
+
const normalY = probe.tangent.x / tangentLength;
|
|
315
|
+
for (const distance of CONTOUR_PROBE_DISTANCES){
|
|
316
|
+
const leftInside = pointInShape(probe.point.x + normalX * distance, probe.point.y + normalY * distance, allContours);
|
|
317
|
+
const rightInside = pointInShape(probe.point.x - normalX * distance, probe.point.y - normalY * distance, allContours);
|
|
318
|
+
if (leftInside !== rightInside) {
|
|
319
|
+
return leftInside ? 1 : -1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return approximateContourSign(contour);
|
|
324
|
+
}
|
|
325
|
+
function edgeProbe(edge) {
|
|
326
|
+
if (edge.kind === 'line') {
|
|
327
|
+
return {
|
|
328
|
+
point: {
|
|
329
|
+
x: (edge.p0.x + edge.p1.x) * 0.5,
|
|
330
|
+
y: (edge.p0.y + edge.p1.y) * 0.5
|
|
331
|
+
},
|
|
332
|
+
tangent: {
|
|
333
|
+
x: edge.p1.x - edge.p0.x,
|
|
334
|
+
y: edge.p1.y - edge.p0.y
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
point: evaluateQuadratic(edge, 0.5),
|
|
340
|
+
tangent: quadraticTangent(edge, 0.5)
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function approximateContourSign(contour) {
|
|
344
|
+
let area = 0;
|
|
345
|
+
for (const edge of contour){
|
|
346
|
+
if (edge.kind === 'line') {
|
|
347
|
+
area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
348
|
+
} else {
|
|
349
|
+
area += cross(edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
350
|
+
area += cross(edge.p1.x, edge.p1.y, edge.p2.x, edge.p2.y);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return area >= 0 ? 1 : -1;
|
|
354
|
+
}
|
|
355
|
+
function applyMedianCorrection(fields, width, height, range) {
|
|
356
|
+
const correctionThreshold = 1;
|
|
357
|
+
const edgeThreshold = Math.max(range + 1, 1);
|
|
358
|
+
for(let i = 0; i < width * height; i++){
|
|
359
|
+
const base = i * 4;
|
|
360
|
+
const median = median3(fields[base + 0], fields[base + 1], fields[base + 2]);
|
|
361
|
+
const sdf = fields[base + 3];
|
|
362
|
+
if (Math.abs(sdf) <= edgeThreshold && Math.abs(median - sdf) > correctionThreshold) {
|
|
363
|
+
fields[base + 0] = sdf;
|
|
364
|
+
fields[base + 1] = sdf;
|
|
365
|
+
fields[base + 2] = sdf;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function pointInShape(x, y, contours) {
|
|
370
|
+
let winding = 0;
|
|
371
|
+
for (const contour of contours){
|
|
372
|
+
winding += contourWinding(x, y, contour);
|
|
373
|
+
}
|
|
374
|
+
return winding !== 0;
|
|
375
|
+
}
|
|
376
|
+
function contourWinding(x, y, contour) {
|
|
377
|
+
let winding = 0;
|
|
378
|
+
for (const edge of contour){
|
|
379
|
+
if (edge.kind === 'line') {
|
|
380
|
+
winding += windingContribution(x, y, edge.p0.x, edge.p0.y, edge.p1.x, edge.p1.y);
|
|
381
|
+
} else {
|
|
382
|
+
let prevX = edge.p0.x;
|
|
383
|
+
let prevY = edge.p0.y;
|
|
384
|
+
const steps = 16;
|
|
385
|
+
for(let i = 1; i <= steps; i++){
|
|
386
|
+
const t = i / steps;
|
|
387
|
+
const point = evaluateQuadratic(edge, t);
|
|
388
|
+
winding += windingContribution(x, y, prevX, prevY, point.x, point.y);
|
|
389
|
+
prevX = point.x;
|
|
390
|
+
prevY = point.y;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return winding;
|
|
395
|
+
}
|
|
396
|
+
function windingContribution(px, py, x0, y0, x1, y1) {
|
|
397
|
+
if (y0 <= py) {
|
|
398
|
+
if (y1 > py && cross(x1 - x0, y1 - y0, px - x0, py - y0) > 0) {
|
|
399
|
+
return 1;
|
|
400
|
+
}
|
|
401
|
+
} else if (y1 <= py && cross(x1 - x0, y1 - y0, px - x0, py - y0) < 0) {
|
|
402
|
+
return -1;
|
|
403
|
+
}
|
|
404
|
+
return 0;
|
|
405
|
+
}
|
|
406
|
+
function median3(a, b, c) {
|
|
407
|
+
return a + b + c - Math.min(a, b, c) - Math.max(a, b, c);
|
|
408
|
+
}
|
|
409
|
+
function cross(ax, ay, bx, by) {
|
|
410
|
+
return ax * by - ay * bx;
|
|
411
|
+
}
|
|
412
|
+
function dot(ax, ay, bx, by) {
|
|
413
|
+
return ax * bx + ay * by;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
export { generateMSDF };
|
|
417
|
+
//# sourceMappingURL=generator.js.map
|