@flyfish-dev/cad-viewer 0.6.5 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"cad-viewer.umd.cjs","sources":["../src/core/format.ts","../src/loaders/CadLoaderRegistry.ts","../src/loaders/dwg/DwgWorkerClient.ts","../src/loaders/dwg/DwgLoader.ts","../src/core/entity.ts","../src/core/geometry.ts","../src/loaders/dxf/DxfLoader.ts","../src/loaders/dwf/DwfLoader.ts","../src/loaders/index.ts","../src/core/types.ts","../src/core/color.ts","../src/core/linetype.ts","../src/core/transform.ts","../src/core/scene.ts","../src/viewer/CadCanvasRenderer.ts","../src/viewer/CadWebGLRenderer.ts","../src/viewer/CadViewer.ts","../src/loaders/dwg/DwgParser.ts"],"sourcesContent":["import type { CadFormat, CadLoadInput } from './types';\n\nexport async function readInputBytes(input: CadLoadInput): Promise<Uint8Array> {\n if (input.buffer instanceof Uint8Array) return input.buffer;\n if (input.buffer instanceof ArrayBuffer) return new Uint8Array(input.buffer);\n if (input.file) return new Uint8Array(await input.file.arrayBuffer());\n throw new Error('CadLoadInput requires a File, ArrayBuffer, or Uint8Array.');\n}\n\nexport function exactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n if (bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength) return bytes.buffer as ArrayBuffer;\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nexport function extensionOf(input: CadLoadInput): string {\n const name = input.fileName ?? input.file?.name ?? '';\n const index = name.lastIndexOf('.');\n return index >= 0 ? name.slice(index + 1).toLowerCase() : '';\n}\n\nexport function detectCadFormat(input: CadLoadInput, bytes?: Uint8Array): CadFormat {\n const ext = extensionOf(input);\n if (ext === 'dwg') return 'dwg';\n if (ext === 'dxf') return 'dxf';\n if (ext === 'dwfx') return 'dwfx';\n if (ext === 'xps') return 'xps';\n if (ext === 'dwf') return 'dwf';\n\n if (bytes && bytes.byteLength >= 6) {\n const sig = ascii(bytes.slice(0, 6));\n if (/^AC10/.test(sig)) return 'dwg';\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) return 'dwfx';\n const head = ascii(bytes.slice(0, Math.min(bytes.byteLength, 2048))).toUpperCase();\n if (head.includes('SECTION') && head.includes('ENTITIES')) return 'dxf';\n if (head.includes('DWF')) return 'dwf';\n }\n return 'unknown';\n}\n\nexport function ascii(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b >= 32 && b <= 126 ? String.fromCharCode(b) : ' ').join('');\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder('utf-8').decode(bytes);\n}\n","import { detectCadFormat, readInputBytes } from '../core/format';\nimport type { CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader } from '../core/types';\n\nexport class CadLoaderRegistry {\n private readonly loaders: CadLoader[] = [];\n\n constructor(loaders: CadLoader[] = []) {\n for (const loader of loaders) this.register(loader);\n }\n\n register(loader: CadLoader): this {\n const index = this.loaders.findIndex((item) => item.id === loader.id);\n if (index >= 0) this.loaders.splice(index, 1, loader);\n else this.loaders.push(loader);\n return this;\n }\n\n unregister(loaderId: string): this {\n const index = this.loaders.findIndex((item) => item.id === loaderId);\n if (index >= 0) this.loaders.splice(index, 1);\n return this;\n }\n\n list(): CadLoader[] {\n return [...this.loaders];\n }\n\n async detect(input: CadLoadInput): Promise<{ loader: CadLoader; bytes: Uint8Array; format: CadFormat }> {\n const bytes = await readInputBytes(input);\n const format = detectCadFormat(input, bytes);\n const direct = this.loaders.find((loader) => loader.formats.includes(format) && loader.accepts(input, bytes));\n if (direct) return { loader: direct, bytes, format };\n const fallback = this.loaders.find((loader) => loader.accepts(input, bytes));\n if (fallback) return { loader: fallback, bytes, format };\n throw new Error(`No CAD loader registered for ${format === 'unknown' ? 'this file' : format.toUpperCase()}.`);\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const { loader, bytes } = await this.detect(input);\n return loader.load({ ...input, buffer: bytes }, options);\n }\n}\n","import { exactArrayBuffer } from '../../core/format';\nimport type { CadLoadInput, CadLoadOptions, CadLoadProgress, CadLoadResult } from '../../core/types';\n\nexport interface DwgWorkerLoadOptions extends CadLoadOptions {\n fileName?: string;\n}\n\ntype DwgWorkerProgressMessage = {\n type: 'progress';\n requestId: number;\n progress: CadLoadProgress;\n};\n\ntype DwgWorkerResultMessage = {\n type: 'result';\n requestId: number;\n result: CadLoadResult;\n};\n\ntype DwgWorkerWarmupResultMessage = {\n type: 'warmup-result';\n requestId: number;\n elapsedMs: number;\n};\n\ntype DwgWorkerErrorMessage = {\n type: 'error';\n requestId: number;\n error: {\n name?: string;\n message: string;\n stack?: string;\n };\n};\n\ntype DwgWorkerReadyMessage = {\n type: 'ready';\n};\n\ntype DwgWorkerMessage = DwgWorkerProgressMessage | DwgWorkerResultMessage | DwgWorkerWarmupResultMessage | DwgWorkerErrorMessage | DwgWorkerReadyMessage;\n\ntype PendingRequest = {\n resolve: (result: any) => void;\n reject: (error: Error) => void;\n onProgress?: (progress: CadLoadProgress) => void;\n timer?: ReturnType<typeof setTimeout>;\n abortHandler?: () => void;\n signal?: AbortSignal;\n};\n\nconst DEFAULT_DWG_WORKER_URL = 'wasm/dwg-worker.js';\n\nexport class DwgWorkerClient {\n private worker?: Worker;\n private sequence = 0;\n private readonly pending = new Map<number, PendingRequest>();\n\n load(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions = {}): Promise<CadLoadResult> {\n if (!supportsDwgWorker()) throw new Error('Web Worker is not available in this runtime.');\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n const fileName = options.fileName ?? input.fileName ?? input.file?.name;\n const transferBuffer = prepareTransferBuffer(bytes, input, options);\n\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Dispatching DWG parse to worker…', total: bytes.byteLength });\n\n return new Promise<CadLoadResult>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = { resolve, reject, onProgress: options.onProgress, signal: options.signal };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({\n type: 'load',\n requestId,\n bytes: transferBuffer,\n fileName,\n options: serializeOptions(options)\n }, [transferBuffer]);\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n preload(options: DwgWorkerLoadOptions = {}): Promise<void> {\n if (!supportsDwgWorker()) return Promise.reject(new Error('Web Worker is not available in this runtime.'));\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Starting DWG worker warmup…' });\n\n return new Promise<void>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = {\n resolve: () => resolve(),\n reject,\n onProgress: options.onProgress,\n signal: options.signal\n };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker warmup timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({ type: 'warmup', requestId, options: serializeOptions(options) });\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n terminate(): void {\n this.resetWorker();\n }\n\n private ensureWorker(options: DwgWorkerLoadOptions): Worker {\n if (!this.worker) {\n this.worker = createWorker(options);\n this.worker.onmessage = (event: MessageEvent<DwgWorkerMessage>) => this.handleMessage(event.data);\n this.worker.onerror = (event) => {\n const message = event.message || 'DWG worker failed.';\n this.rejectAll(new Error(message));\n this.resetWorker(false);\n };\n this.worker.onmessageerror = () => {\n this.rejectAll(new Error('DWG worker returned a message that could not be cloned.'));\n this.resetWorker(false);\n };\n }\n return this.worker;\n }\n\n private handleMessage(message: DwgWorkerMessage): void {\n if (message.type === 'ready') return;\n const pending = this.pending.get(message.requestId);\n if (!pending) return;\n\n if (message.type === 'progress') {\n pending.onProgress?.(message.progress);\n return;\n }\n\n this.pending.delete(message.requestId);\n cleanupPending(pending);\n\n if (message.type === 'result') {\n pending.resolve(message.result);\n return;\n }\n\n if (message.type === 'warmup-result') {\n pending.onProgress?.({ phase: 'worker-ready', format: 'dwg', message: 'DWG worker warmup complete.', percent: 100, elapsedMs: message.elapsedMs });\n pending.resolve(undefined);\n return;\n }\n\n const error = new Error(message.error.message);\n error.name = message.error.name || 'DwgWorkerError';\n if (message.error.stack) error.stack = message.error.stack;\n pending.reject(error);\n }\n\n private rejectAll(error: Error): void {\n for (const [, pending] of this.pending) {\n cleanupPending(pending);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private resetWorker(reject = true): void {\n if (reject) this.rejectAll(new Error('DWG worker was terminated.'));\n this.worker?.terminate();\n this.worker = undefined;\n }\n}\n\nexport function supportsDwgWorker(): boolean {\n return typeof Worker !== 'undefined' && typeof URL !== 'undefined';\n}\n\nfunction createWorker(options: DwgWorkerLoadOptions): Worker {\n if (options.workerFactory) return options.workerFactory();\n return new Worker(resolveWorkerUrl(options.workerUrl), { type: 'module', name: 'lightweight-cad-dwg-loader' });\n}\n\nfunction serializeOptions(options: DwgWorkerLoadOptions): Record<string, unknown> {\n return {\n // Resolve the asset directory on the UI thread. Relative paths such as\n // './wasm' must be relative to the document URL, not to the generated\n // worker chunk URL. Otherwise the worker may request /assets/wasm/... and\n // receive the app's HTML fallback instead of libredwg-web.wasm.\n wasmPath: resolveWasmPathForWorker(options.wasmPath),\n includePaperSpace: options.includePaperSpace,\n maxInsertDepth: options.maxInsertDepth,\n keepRaw: Boolean(options.keepRaw)\n };\n}\n\nfunction prepareTransferBuffer(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions): ArrayBuffer {\n const canTransferWithoutSurprise = Boolean(input.file) || options.transferInputBuffer === true;\n if (canTransferWithoutSurprise) return exactArrayBuffer(bytes);\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nfunction cleanupPending(pending: PendingRequest): void {\n if (pending.timer) clearTimeout(pending.timer);\n if (pending.signal && pending.abortHandler) pending.signal.removeEventListener('abort', pending.abortHandler);\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException !== 'undefined') return new DOMException('DWG loading was aborted.', 'AbortError');\n const error = new Error('DWG loading was aborted.');\n error.name = 'AbortError';\n return error;\n}\n\nfunction resolveWasmPathForWorker(wasmPath: string | undefined): string {\n const candidate = (wasmPath?.trim() || '/wasm').replace(/\\/+$/, '');\n if (candidate === '') return getPageOrigin();\n if (isAbsoluteUrl(candidate)) return candidate;\n if (candidate.startsWith('/')) return `${getPageOrigin()}${candidate}`;\n return new URL(candidate, getPageBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction resolveWorkerUrl(workerUrl: string | URL | undefined): string | URL {\n if (workerUrl instanceof URL) return workerUrl;\n const candidate = workerUrl?.trim() || DEFAULT_DWG_WORKER_URL;\n if (isAbsoluteUrl(candidate)) return candidate;\n return new URL(candidate, getPageBaseUrl()).href;\n}\n\nfunction getPageBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getPageOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getPageBaseUrl()).origin;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n","import { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader } from '../../core/types';\nimport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nexport class DwgLoader implements CadLoader {\n readonly id = 'dwg';\n readonly label = 'DWG / LibreDWG WebAssembly';\n readonly formats = ['dwg'] as const;\n private readonly defaults: CadLoadOptions;\n private readonly workerClient = new DwgWorkerClient();\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = { useWorker: true, ...defaults };\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n if (extensionOf(input) === 'dwg') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwg';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n merged.onProgress?.({ phase: 'read', format: 'dwg', message: 'Reading DWG bytes…' });\n const bytes = await readInputBytes(input);\n const sourceName = input.fileName ?? input.file?.name;\n\n if (merged.useWorker === false) {\n throw new Error('DWG main-thread parsing is intentionally not bundled by the default viewer. Keep useWorker enabled, or register a custom DWG loader for non-browser runtimes.');\n }\n\n if (!supportsDwgWorker()) {\n throw new Error('DWG loading requires Web Worker support in this build. Provide a custom loader for this runtime.');\n }\n\n try {\n return await this.workerClient.load(bytes, input, { ...merged, fileName: sourceName });\n } catch (error) {\n if (isAbortError(error)) throw error;\n throw normalizeWorkerError(error);\n }\n }\n\n terminateWorker(): void {\n this.workerClient.terminate();\n }\n\n preload(options: CadLoadOptions = {}): Promise<void> {\n const merged = { ...this.defaults, ...options };\n if (merged.useWorker === false) {\n return Promise.reject(new Error('DWG preload requires worker mode in the default viewer.'));\n }\n return this.workerClient.preload(merged);\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nexport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nfunction normalizeWorkerError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n return new Error(`${message} If the worker asset cannot be resolved by your bundler/CDN, pass workerUrl or workerFactory to CadViewer.`);\n}\n","import type { CadBlock, CadDocument, CadEntity, CadEntityKind, CadLayer, CadLineType, CadPage, CadPoint3D } from './types';\n\nexport interface NormalizeCadEntityOptions {\n /** Preserve the parser-owned raw object on entity.raw. This can be very large and may not be structured-clone safe. */\n keepRaw?: boolean;\n /** Copy unknown parser properties onto the normalized entity. Disable inside workers for predictable cloneable payloads. */\n includeUnknownProperties?: boolean;\n /** How to interpret a numeric raw `color` property when the source parser is ambiguous. */\n numericColorMode?: 'auto' | 'aci' | 'rgb';\n}\n\nexport function createCadDocument(init: Partial<CadDocument> & Pick<CadDocument, 'format'>): CadDocument {\n return {\n format: init.format,\n sourceName: init.sourceName,\n units: init.units,\n header: init.header ?? {},\n layers: init.layers ?? {},\n lineTypes: init.lineTypes ?? {},\n blocks: init.blocks ?? {},\n entities: init.entities ?? [],\n pages: init.pages,\n savedView: init.savedView,\n metadata: init.metadata ?? {},\n warnings: init.warnings ?? [],\n raw: init.raw\n };\n}\n\nexport function inferEntityKind(type: unknown): CadEntityKind {\n const upper = String(type ?? '').toUpperCase();\n switch (upper) {\n case 'LINE': return 'line';\n case 'CIRCLE': return 'circle';\n case 'ARC': return 'arc';\n case 'LWPOLYLINE':\n case 'POLYLINE':\n case 'POLYLINE_2D':\n case 'POLYLINE2D':\n case 'POLYLINE_3D':\n case 'POLYLINE3D':\n case 'LEADER':\n case 'MULTILEADER': return 'polyline';\n case 'ELLIPSE': return 'ellipse';\n case 'TEXT':\n case 'MTEXT':\n case 'ATTRIB':\n case 'ATTDEF':\n case 'DIMENSION': return 'text';\n case 'POINT': return 'point';\n case 'INSERT': return 'insert';\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': return 'solid';\n case 'HATCH': return 'hatch';\n case 'SPLINE': return 'spline';\n case 'PATH':\n case 'XPS_PATH':\n case 'DWF_PATH': return 'path';\n case 'IMAGE':\n case 'RASTER_IMAGE':\n case 'DWF_IMAGE': return 'image';\n case 'VIEWPORT': return 'viewport';\n default: return 'unsupported';\n }\n}\n\nexport function normalizeCadEntity(raw: Record<string, unknown>, forcedType?: string, options: NormalizeCadEntityOptions = {}): CadEntity {\n const type = forcedType ?? String(raw.type ?? raw.entityType ?? raw.objectName ?? 'UNKNOWN').toUpperCase();\n const entity: CadEntity = options.includeUnknownProperties === false\n ? { type, kind: inferEntityKind(type) }\n : { ...raw, type, kind: inferEntityKind(type) } as CadEntity;\n if (options.keepRaw) entity.raw = raw;\n entity.handle = stringOrUndefined(raw.handle ?? raw.id);\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName);\n entity.lineType = stringOrUndefined(raw.lineType ?? raw.linetype);\n entity.lineTypeScale = numberOrUndefined(raw.lineTypeScale ?? raw.linetypeScale ?? raw.ltscale) ?? entity.lineTypeScale;\n entity.flag = numberOrUndefined(raw.flag ?? raw.flags) ?? entity.flag;\n const explicitClosed = raw.isClosed === true || raw.closed === true || raw.shape === true;\n const typeUsesClassicPolylineFlag = /^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D|SPLINE)$/.test(type);\n const typeUsesLwPolylineFlag = type === 'LWPOLYLINE';\n if (explicitClosed\n || (typeUsesClassicPolylineFlag && (Number(entity.flag ?? 0) & 1) === 1)\n || (typeUsesLwPolylineFlag && (Number(entity.flag ?? 0) & 0x200) === 0x200)) {\n entity.isClosed = true;\n }\n\n const numericColorMode = options.numericColorMode ?? 'auto';\n const rawColorNumber = numberOrUndefined(raw.color);\n const explicitAci = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci ?? raw.aciColor ?? raw.color_index);\n entity.colorIndex = explicitAci ?? (numericColorMode !== 'rgb' && rawColorNumber !== undefined && Math.abs(rawColorNumber) <= 257 ? rawColorNumber : undefined);\n\n const explicitTrueColor = raw.trueColor ?? raw.true_color ?? raw.truecolor ?? raw.colorRGB ?? raw.colorRgb ?? raw.rgbColor ?? raw.rgb;\n const rawColorLooksRgb = rawColorNumber !== undefined && rawColorNumber >= 0 && rawColorNumber <= 0xffffff && (numericColorMode === 'rgb' || (numericColorMode === 'auto' && Math.abs(rawColorNumber) > 257));\n entity.trueColor = (explicitTrueColor ?? (rawColorLooksRgb ? rawColorNumber : undefined)) as CadEntity['trueColor'];\n if (typeof raw.color === 'string' || typeof raw.color === 'number') entity.color = raw.color as string | number;\n entity.colorNumber = numberOrUndefined(raw.colorNumber) ?? entity.colorNumber;\n entity.colorName = stringOrUndefined(raw.colorName ?? raw.color_name) ?? entity.colorName;\n entity.fillColor = (raw.fillColor ?? raw.fill_color) as CadEntity['fillColor'];\n entity.fillColorIndex = numberOrUndefined(raw.fillColorIndex ?? raw.fill_color_index ?? raw.fillColorNumber) ?? entity.fillColorIndex;\n entity.opacity = numberOrUndefined(raw.opacity ?? raw.alpha) ?? entity.opacity;\n entity.lineweight = numberOrUndefined(raw.lineweight ?? raw.lineWeight);\n entity.isVisible = raw.isVisible === false || raw.visible === false ? false : true;\n entity.startPoint = pointFromUnknown(raw.startPoint ?? raw.start ?? raw.p0 ?? raw.from) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? raw.end ?? raw.p1 ?? raw.to) ?? entity.endPoint;\n entity.center = pointFromUnknown(raw.center ?? raw.centerPoint) ?? entity.center;\n entity.insertionPoint = pointFromUnknown(raw.insertionPoint ?? raw.position ?? raw.location ?? raw.point ?? raw.basePoint) ?? entity.insertionPoint;\n entity.radius = numberOrUndefined(raw.radius) ?? entity.radius;\n entity.startAngle = numberOrUndefined(raw.startAngle ?? raw.start_angle) ?? entity.startAngle;\n entity.endAngle = numberOrUndefined(raw.endAngle ?? raw.end_angle) ?? entity.endAngle;\n entity.majorAxisEndPoint = pointFromUnknown(raw.majorAxisEndPoint ?? raw.majorAxis ?? raw.major) ?? entity.majorAxisEndPoint;\n entity.axisRatio = numberOrUndefined(raw.axisRatio ?? raw.ratio) ?? entity.axisRatio;\n entity.height = numberOrUndefined(raw.height ?? raw.textHeight) ?? entity.height;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = numberOrUndefined(raw.rotation ?? raw.angle) ?? entity.rotation;\n entity.text = stringOrUndefined(raw.text ?? raw.value ?? raw.string ?? raw.contents) ?? entity.text;\n entity.name = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.name;\n entity.blockName = stringOrUndefined(raw.blockName ?? raw.name) ?? entity.blockName;\n\n const vertices = normalizePoints(raw.vertices ?? raw.points);\n if (vertices.length > 0) entity.vertices = vertices;\n const controlPoints = normalizePoints(raw.controlPoints ?? raw.control_points);\n if (controlPoints.length > 0) entity.controlPoints = controlPoints;\n const fitPoints = normalizePoints(raw.fitPoints ?? raw.fit_points);\n if (fitPoints.length > 0) entity.fitPoints = fitPoints;\n const rawAttribs = raw.attribs ?? raw.attributes;\n if (Array.isArray(rawAttribs)) {\n entity.attribs = rawAttribs\n .filter((attribute): attribute is Record<string, unknown> => !!attribute && typeof attribute === 'object')\n .map((attribute) => normalizeCadEntity(attribute, undefined, options));\n }\n return entity;\n}\n\nexport function pointFromUnknown(value: unknown): CadPoint3D | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const record = value as Record<string, unknown>;\n const x = Number(record.x ?? record.X ?? record[0]);\n const y = Number(record.y ?? record.Y ?? record[1]);\n const zCandidate = record.z ?? record.Z ?? record[2];\n const z = zCandidate === undefined ? undefined : Number(zCandidate);\n if (!Number.isFinite(x) || !Number.isFinite(y)) return undefined;\n return Number.isFinite(z) ? { x, y, z } : { x, y };\n}\n\nexport function normalizePoints(value: unknown): Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> {\n if (!Array.isArray(value)) return [];\n const out: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> = [];\n for (const item of value) {\n const p = pointFromUnknown(item);\n if (!p) continue;\n const rec = item as Record<string, unknown>;\n const vertex = p as CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number };\n const bulge = numberOrUndefined(rec.bulge);\n if (bulge !== undefined) vertex.bulge = bulge;\n const startWidth = numberOrUndefined(rec.startWidth ?? rec.start_width);\n if (startWidth !== undefined) vertex.startWidth = startWidth;\n const endWidth = numberOrUndefined(rec.endWidth ?? rec.end_width);\n if (endWidth !== undefined) vertex.endWidth = endWidth;\n out.push(vertex);\n }\n return out;\n}\n\nexport function summarizeCadDocument(document: CadDocument) {\n const byType: Record<string, number> = {};\n for (const entity of document.entities) {\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n byType[type] = (byType[type] ?? 0) + 1;\n }\n return {\n format: document.format,\n sourceName: document.sourceName,\n entityCount: document.entities.length,\n layerCount: Object.keys(document.layers).length,\n blockCount: Object.keys(document.blocks).length,\n pageCount: document.pages?.length ?? 0,\n byType,\n warnings: [...document.warnings]\n };\n}\n\nexport function isCadPolylineClosed(entity: CadEntity): boolean {\n if (entity.isClosed === true) return true;\n const type = String(entity.type ?? '').toUpperCase();\n const flag = Number(entity.flag ?? 0);\n if (type === 'LWPOLYLINE') return (flag & 0x200) === 0x200;\n if (/^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D)$/.test(type)) return (flag & 1) === 1;\n return false;\n}\n\nexport function addLayer(target: Record<string, CadLayer>, layer: CadLayer): void {\n if (!layer.name) return;\n target[layer.name] = layer;\n target[layer.name.toLowerCase()] = layer;\n}\n\nexport function addBlock(target: Record<string, CadBlock>, block: CadBlock): void {\n if (!block.name) return;\n target[block.name] = block;\n target[block.name.toLowerCase()] = block;\n}\n\nexport function addLineType(target: Record<string, CadLineType>, lineType: CadLineType): void {\n if (!lineType.name) return;\n target[lineType.name] = lineType;\n target[lineType.name.toLowerCase()] = lineType;\n if (lineType.handle) {\n target[lineType.handle] = lineType;\n target[lineType.handle.toLowerCase()] = lineType;\n }\n}\n\nexport function flattenPages(pages: CadPage[] | undefined): CadEntity[] {\n if (!pages?.length) return [];\n return pages.flatMap((page) => page.entities.map((entity) => ({ ...entity, pageIndex: page.index })));\n}\n\nexport function numberOrUndefined(value: unknown): number | undefined {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function stringOrUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string' && typeof value !== 'number') return undefined;\n const out = String(value);\n return out.length > 0 ? out : undefined;\n}\n","import type { CadBounds, CadPoint2D, CadPoint3D } from './types';\n\nexport function emptyBounds(): CadBounds {\n return { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n}\n\nexport function boundsValid(bounds: CadBounds): boolean {\n return Number.isFinite(bounds.minX) && Number.isFinite(bounds.minY) && Number.isFinite(bounds.maxX) && Number.isFinite(bounds.maxY)\n && bounds.maxX >= bounds.minX && bounds.maxY >= bounds.minY;\n}\n\nexport function includePoint(bounds: CadBounds, point: CadPoint2D | CadPoint3D): void {\n if (!isFinitePoint(point)) return;\n bounds.minX = Math.min(bounds.minX, point.x);\n bounds.minY = Math.min(bounds.minY, point.y);\n bounds.maxX = Math.max(bounds.maxX, point.x);\n bounds.maxY = Math.max(bounds.maxY, point.y);\n}\n\nexport function includeCircle(bounds: CadBounds, center: CadPoint2D, radius: number): void {\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return;\n const r = Math.abs(radius);\n includePoint(bounds, { x: center.x - r, y: center.y - r });\n includePoint(bounds, { x: center.x + r, y: center.y + r });\n}\n\nexport function mergeBounds(target: CadBounds, source: CadBounds): void {\n if (!boundsValid(source)) return;\n includePoint(target, { x: source.minX, y: source.minY });\n includePoint(target, { x: source.maxX, y: source.maxY });\n}\n\nexport function paddedBounds(bounds: CadBounds, ratio = 0.02, minimum = 1e-6): CadBounds {\n if (!boundsValid(bounds)) return { minX: -10, minY: -10, maxX: 10, maxY: 10 };\n const padX = Math.max((bounds.maxX - bounds.minX) * ratio, minimum);\n const padY = Math.max((bounds.maxY - bounds.minY) * ratio, minimum);\n return { minX: bounds.minX - padX, minY: bounds.minY - padY, maxX: bounds.maxX + padX, maxY: bounds.maxY + padY };\n}\n\nexport function isFinitePoint(p: unknown): p is CadPoint3D {\n return !!p && typeof p === 'object'\n && Number.isFinite((p as CadPoint2D).x)\n && Number.isFinite((p as CadPoint2D).y);\n}\n\nexport function xy(p: CadPoint2D | CadPoint3D): CadPoint2D {\n return { x: p.x, y: p.y };\n}\n\nexport function normalizeAngleRadians(value: number): number {\n let out = value;\n while (out < 0) out += Math.PI * 2;\n while (out >= Math.PI * 2) out -= Math.PI * 2;\n return out;\n}\n\nexport function degreesToRadians(value: number): number {\n return value * Math.PI / 180;\n}\n\nexport function arcPoints(center: CadPoint2D, radius: number, startAngle: number, endAngle: number, ccw = true, segments = 64): CadPoint2D[] {\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return [];\n let start = startAngle;\n let end = endAngle;\n if (!Number.isFinite(start) || !Number.isFinite(end)) return [];\n\n if (Math.abs(start) > Math.PI * 2 + 1e-6 || Math.abs(end) > Math.PI * 2 + 1e-6) {\n start = degreesToRadians(start);\n end = degreesToRadians(end);\n }\n\n if (ccw && end < start) end += Math.PI * 2;\n if (!ccw && start < end) start += Math.PI * 2;\n const sweep = end - start;\n const count = Math.max(8, Math.min(256, Math.ceil(Math.abs(sweep) / (Math.PI * 2) * segments)));\n const pts: CadPoint2D[] = [];\n for (let i = 0; i <= count; i++) {\n const t = start + sweep * (i / count);\n pts.push({ x: center.x + Math.cos(t) * radius, y: center.y + Math.sin(t) * radius });\n }\n return pts;\n}\n\nexport function ellipsePoints(center: CadPoint2D, majorAxisEndPoint: CadPoint2D, ratio = 1, startAngle = 0, endAngle = Math.PI * 2, segments = 96): CadPoint2D[] {\n if (!isFinitePoint(center) || !isFinitePoint(majorAxisEndPoint)) return [];\n const major = Math.hypot(majorAxisEndPoint.x, majorAxisEndPoint.y);\n if (!Number.isFinite(major) || major <= 0) return [];\n const minor = major * (Number.isFinite(ratio) && ratio > 0 ? ratio : 1);\n const rotation = Math.atan2(majorAxisEndPoint.y, majorAxisEndPoint.x);\n let start = Number.isFinite(startAngle) ? startAngle : 0;\n let end = Number.isFinite(endAngle) ? endAngle : Math.PI * 2;\n if (Math.abs(start) > Math.PI * 2 + 1e-6 || Math.abs(end) > Math.PI * 2 + 1e-6) {\n start = degreesToRadians(start);\n end = degreesToRadians(end);\n }\n if (end < start) end += Math.PI * 2;\n const count = Math.max(12, Math.min(256, Math.ceil(Math.abs(end - start) / (Math.PI * 2) * segments)));\n const pts: CadPoint2D[] = [];\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n for (let i = 0; i <= count; i++) {\n const t = start + (end - start) * (i / count);\n const x = Math.cos(t) * major;\n const y = Math.sin(t) * minor;\n pts.push({ x: center.x + x * cosR - y * sinR, y: center.y + x * sinR + y * cosR });\n }\n return pts;\n}\n\nexport function bulgeToPolylinePoints(p1: CadPoint2D, p2: CadPoint2D, bulge = 0, segments = 16): CadPoint2D[] {\n if (!Number.isFinite(bulge) || Math.abs(bulge) < 1e-12) return [xy(p1), xy(p2)];\n const chord = Math.hypot(p2.x - p1.x, p2.y - p1.y);\n if (chord <= 1e-12) return [xy(p1), xy(p2)];\n const theta = 4 * Math.atan(bulge);\n const radius = Math.abs(chord / (2 * Math.sin(theta / 2)));\n const mid = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n const dx = (p2.x - p1.x) / chord;\n const dy = (p2.y - p1.y) / chord;\n const sagittaDirection = bulge >= 0 ? 1 : -1;\n const h = Math.sqrt(Math.max(radius * radius - (chord / 2) ** 2, 0));\n const center = { x: mid.x - sagittaDirection * dy * h, y: mid.y + sagittaDirection * dx * h };\n const a1 = Math.atan2(p1.y - center.y, p1.x - center.x);\n const a2 = Math.atan2(p2.y - center.y, p2.x - center.x);\n return arcPoints(center, radius, a1, a2, bulge >= 0, segments);\n}\n\nexport function stripMTextFormatting(text: string): string {\n return text\n .replace(/\\\\P/g, '\\n')\n .replace(/\\\\~|\\\\ /g, ' ')\n .replace(/\\\\[A-Za-z][^;]*;/g, '')\n .replace(/[{}]/g, '')\n .replace(/\\\\[A-Za-z]/g, '')\n .trim();\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n","import { addBlock, addLayer, createCadDocument, normalizeCadEntity, numberOrUndefined, pointFromUnknown, stringOrUndefined } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport { degreesToRadians } from '../../core/geometry';\nimport type { CadBlock, CadDocument, CadEntity, CadLayer, CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader, CadPoint3D } from '../../core/types';\n\nexport class DxfLoader implements CadLoader {\n readonly id = 'dxf';\n readonly label = 'DXF / JavaScript parser';\n readonly formats = ['dxf'] as const;\n private readonly defaults: CadLoadOptions;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n return extensionOf(input) === 'dxf' || detectCadFormat(input, bytes) === 'dxf';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const mergedOptions = { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const text = decodeDxfText(bytes, mergedOptions.dxfEncoding);\n const warnings: string[] = [];\n let parsed: unknown;\n try {\n parsed = await parseWithDxfParser(text);\n } catch (error) {\n warnings.push(`dxf-parser failed, using built-in fallback parser: ${error instanceof Error ? error.message : String(error)}`);\n parsed = parseDxfFallback(text);\n }\n const document = normalizeDxfDatabase(parsed, input.fileName ?? input.file?.name, warnings);\n const elapsedMs = performance.now() - started;\n return { document, raw: parsed, bytes: bytes.byteLength, elapsedMs, format: 'dxf', warnings: document.warnings };\n }\n}\n\nasync function parseWithDxfParser(text: string): Promise<unknown> {\n const module = await import('dxf-parser') as { default?: new () => { parseSync(text: string): unknown }; DxfParser?: new () => { parseSync(text: string): unknown } };\n const Parser = module.default ?? module.DxfParser;\n if (!Parser) throw new Error('dxf-parser did not expose a parser constructor.');\n return new Parser().parseSync(text);\n}\n\nexport function normalizeDxfDatabase(parsed: unknown, sourceName?: string, warnings: string[] = []): CadDocument {\n const record = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};\n const layers = extractDxfLayers(record);\n const blocks = extractDxfBlocks(record);\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n\n const document = createCadDocument({\n format: 'dxf',\n sourceName,\n header: record.header && typeof record.header === 'object' ? record.header as Record<string, unknown> : {},\n layers,\n blocks,\n entities,\n metadata: { parser: 'dxf-parser + cad-viewer normalizer' },\n warnings,\n raw: parsed\n });\n if (entities.length === 0) document.warnings.push('DXF file did not expose any ENTITIES.');\n return document;\n}\n\nfunction normalizeDxfEntity(raw: Record<string, unknown>): CadEntity {\n const type = String(raw.type ?? raw.entityType ?? 'UNKNOWN').toUpperCase();\n const entity = normalizeCadEntity(raw, type);\n const rawColorNumber = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci);\n const rawColor = numberOrUndefined(raw.color);\n entity.colorIndex = rawColorNumber ?? (rawColor !== undefined && Math.abs(rawColor) <= 257 ? rawColor : undefined);\n entity.trueColor = (raw.trueColor ?? raw.true_color ?? raw.colorRGB ?? raw.trueColorValue ?? (rawColor !== undefined && Math.abs(rawColor) > 257 ? rawColor : undefined)) as CadEntity['trueColor'];\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName) ?? '0';\n entity.isClosed = Boolean(raw.shape ?? raw.closed ?? raw.isClosed) || ((Number(raw.flag ?? raw.flags ?? 0) & 1) === 1);\n\n if (type === 'LINE') {\n entity.startPoint = pointFromUnknown(raw.startPoint ?? { x: raw.x1 ?? raw.x, y: raw.y1 ?? raw.y, z: raw.z1 ?? raw.z }) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? { x: raw.x2, y: raw.y2, z: raw.z2 }) ?? entity.endPoint;\n }\n if (type === 'TEXT' || type === 'MTEXT' || type === 'ATTRIB' || type === 'ATTDEF') {\n entity.insertionPoint = pointFromUnknown(raw.startPoint ?? raw.position ?? raw.insertionPoint) ?? entity.insertionPoint;\n entity.text = normalizeDxfText(raw.text ?? raw.string ?? raw.value) ?? entity.text;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'ARC' || type === 'ELLIPSE') {\n entity.startAngle = normalizeAngle(raw.startAngle ?? raw.start_angle);\n entity.endAngle = normalizeAngle(raw.endAngle ?? raw.end_angle);\n }\n if (type === 'INSERT') {\n entity.blockName = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.blockName;\n entity.insertionPoint = pointFromUnknown(raw.position ?? raw.insertionPoint ?? raw.point) ?? entity.insertionPoint;\n const sx = numberOrUndefined(raw.xScale ?? raw.scaleX ?? raw.xscale);\n const sy = numberOrUndefined(raw.yScale ?? raw.scaleY ?? raw.yscale);\n const sz = numberOrUndefined(raw.zScale ?? raw.scaleZ ?? raw.zscale);\n if (sx !== undefined || sy !== undefined || sz !== undefined) entity.scale = { x: sx ?? 1, y: sy ?? sx ?? 1, z: sz ?? 1 };\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'SPLINE') {\n const control = normalizeControlPoints(raw.controlPoints ?? raw.control_points ?? raw.points);\n if (control.length) entity.controlPoints = control;\n const fit = normalizeControlPoints(raw.fitPoints ?? raw.fit_points);\n if (fit.length) entity.fitPoints = fit;\n }\n if (type === 'HATCH') {\n entity.loops = normalizeHatchLoops(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n if (type === 'SOLID' || type === 'TRACE' || type === '3DFACE') {\n entity.vertices = normalizeSolidVertices(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n return entity;\n}\n\nfunction extractDxfLayers(raw: Record<string, unknown>): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const tables = raw.tables as Record<string, unknown> | undefined;\n const layerTable = raw.layers ?? tables?.layer ?? tables?.LAYER ?? tables?.layers;\n const candidates = expandRecords(layerTable);\n for (const item of candidates) {\n const rec = item as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.layerName);\n if (!name) continue;\n addLayer(result, {\n name,\n color: (rec.color ?? rec.colorNumber ?? rec.colorIndex) as string | number | undefined,\n colorIndex: numberOrUndefined(rec.colorNumber ?? rec.colorIndex ?? rec.color),\n lineType: stringOrUndefined(rec.lineType ?? rec.linetype),\n isVisible: Number(rec.colorNumber ?? rec.colorIndex ?? rec.color ?? 1) >= 0,\n isFrozen: Boolean(rec.frozen),\n isLocked: Boolean(rec.locked),\n raw: rec\n });\n }\n if (!result['0']) addLayer(result, { name: '0', colorIndex: 7, isVisible: true });\n return result;\n}\n\nfunction extractDxfBlocks(raw: Record<string, unknown>): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const blocks = raw.blocks;\n if (!blocks || typeof blocks !== 'object') return result;\n if (Array.isArray(blocks)) {\n for (const block of blocks) addDxfBlock(result, block);\n } else {\n for (const [name, block] of Object.entries(blocks as Record<string, unknown>)) addDxfBlock(result, block, name);\n }\n return result;\n}\n\nfunction addDxfBlock(target: Record<string, CadBlock>, blockValue: unknown, fallbackName?: string): void {\n if (!blockValue || typeof blockValue !== 'object') return;\n const rec = blockValue as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.blockName ?? fallbackName);\n if (!name) return;\n const rawEntities = Array.isArray(rec.entities) ? rec.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n addBlock(target, { name, basePoint: pointFromUnknown(rec.basePoint ?? rec.position) ?? { x: 0, y: 0 }, entities, raw: rec });\n}\n\nfunction expandRecords(value: unknown): unknown[] {\n if (!value) return [];\n if (Array.isArray(value)) return value;\n if (typeof value !== 'object') return [];\n const rec = value as Record<string, unknown>;\n if (Array.isArray(rec.entries)) return rec.entries;\n if (Array.isArray(rec.records)) return rec.records;\n if (Array.isArray(rec.layers)) return rec.layers;\n return Object.values(rec).filter((x) => x && typeof x === 'object');\n}\n\nfunction normalizeControlPoints(value: unknown): CadPoint3D[] {\n if (!Array.isArray(value)) return [];\n return value.map(pointFromUnknown).filter((p): p is CadPoint3D => !!p);\n}\n\nfunction normalizeSolidVertices(raw: Record<string, unknown>): CadPoint3D[] {\n const direct = normalizeControlPoints(raw.vertices ?? raw.points);\n if (direct.length) return direct;\n const out: CadPoint3D[] = [];\n for (let i = 0; i < 4; i++) {\n const point = pointFromUnknown({ x: raw[`x${i}`] ?? raw[`x${i + 1}`], y: raw[`y${i}`] ?? raw[`y${i + 1}`], z: raw[`z${i}`] ?? raw[`z${i + 1}`] });\n if (point) out.push(point);\n }\n return out;\n}\n\nfunction normalizeHatchLoops(raw: Record<string, unknown>): CadEntity['loops'] {\n const loops = raw.boundaryLoops ?? raw.loops ?? raw.paths;\n if (!Array.isArray(loops)) return undefined;\n return loops.map((loop) => {\n const rec = loop as Record<string, unknown>;\n const vertices = normalizeControlPoints(rec.vertices ?? rec.points);\n return { vertices, isClosed: true };\n }).filter((loop) => loop.vertices && loop.vertices.length > 0);\n}\n\nfunction normalizeRotation(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nfunction normalizeAngle(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nexport function decodeDxfText(bytes: Uint8Array, preferredEncoding?: string): string {\n const explicitEncoding = normalizeDxfEncoding(preferredEncoding);\n if (explicitEncoding) return decodeBytes(bytes, explicitEncoding);\n\n const bomEncoding = detectBomEncoding(bytes);\n if (bomEncoding) return decodeBytes(bytes, bomEncoding);\n\n const declaredEncoding = normalizeDxfEncoding(detectDxfCodePage(bytes));\n if (declaredEncoding) return decodeBytes(bytes, declaredEncoding);\n\n const utf8 = decodeBytes(bytes, 'utf-8');\n if (!utf8.includes('\\uFFFD')) return utf8;\n\n return chooseBestLegacyDxfDecode(bytes);\n}\n\nconst DXF_CODEPAGE_ENCODING: Record<string, string> = {\n ANSI_874: 'windows-874',\n ANSI_932: 'shift_jis',\n ANSI_936: 'gb18030',\n ANSI_949: 'euc-kr',\n ANSI_950: 'big5',\n ANSI_1250: 'windows-1250',\n ANSI_1251: 'windows-1251',\n ANSI_1252: 'windows-1252',\n ANSI_1253: 'windows-1253',\n ANSI_1254: 'windows-1254',\n ANSI_1255: 'windows-1255',\n ANSI_1256: 'windows-1256',\n ANSI_1257: 'windows-1257',\n ANSI_1258: 'windows-1258',\n BIG5: 'big5',\n CP874: 'windows-874',\n CP932: 'shift_jis',\n CP936: 'gb18030',\n CP949: 'euc-kr',\n CP950: 'big5',\n CP1250: 'windows-1250',\n CP1251: 'windows-1251',\n CP1252: 'windows-1252',\n CP1253: 'windows-1253',\n CP1254: 'windows-1254',\n CP1255: 'windows-1255',\n CP1256: 'windows-1256',\n CP1257: 'windows-1257',\n CP1258: 'windows-1258',\n GB18030: 'gb18030',\n GB2312: 'gb18030',\n GBK: 'gb18030',\n SHIFT_JIS: 'shift_jis',\n SHIFTJIS: 'shift_jis',\n SJIS: 'shift_jis',\n UTF8: 'utf-8',\n UTF_8: 'utf-8',\n UTF16: 'utf-16le',\n UTF_16: 'utf-16le',\n UTF16LE: 'utf-16le',\n UTF_16LE: 'utf-16le',\n UTF16BE: 'utf-16be',\n UTF_16BE: 'utf-16be'\n};\n\nfunction detectBomEncoding(bytes: Uint8Array): string | undefined {\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) return 'utf-8';\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) return 'utf-16le';\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) return 'utf-16be';\n return undefined;\n}\n\nfunction detectDxfCodePage(bytes: Uint8Array): string | undefined {\n const header = decodeBytes(bytes.subarray(0, Math.min(bytes.byteLength, 128 * 1024)), 'iso-8859-1');\n const lines = header.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n for (let index = 0; index < lines.length - 3; index++) {\n if (lines[index]?.trim() !== '9' || lines[index + 1]?.trim().toUpperCase() !== '$DWGCODEPAGE') continue;\n for (let cursor = index + 2; cursor < Math.min(index + 10, lines.length - 1); cursor += 2) {\n const code = lines[cursor]?.trim();\n const value = lines[cursor + 1]?.trim();\n if (code === '3' && value) return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeDxfEncoding(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n const key = trimmed.replace(/[-\\s]+/g, '_').toUpperCase();\n if (DXF_CODEPAGE_ENCODING[key]) return DXF_CODEPAGE_ENCODING[key];\n const ansi = /^ANSI_(\\d{3,4})$/.exec(key);\n if (ansi) return normalizeDxfEncoding(`cp${ansi[1]}`);\n const cp = /^CP(\\d{3,4})$/.exec(key);\n if (cp) {\n if (cp[1] === '936') return 'gb18030';\n if (cp[1] === '950') return 'big5';\n if (cp[1] === '932') return 'shift_jis';\n if (cp[1] === '949') return 'euc-kr';\n return `windows-${cp[1]}`;\n }\n return trimmed;\n}\n\nfunction decodeBytes(bytes: Uint8Array, encoding: string): string {\n try {\n return new TextDecoder(encoding, { fatal: false }).decode(bytes);\n } catch {\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n }\n}\n\nfunction chooseBestLegacyDxfDecode(bytes: Uint8Array): string {\n const candidates = ['windows-1252', 'gb18030', 'big5', 'shift_jis', 'euc-kr', 'iso-8859-1'];\n let bestText = '';\n let bestScore = Number.POSITIVE_INFINITY;\n for (const encoding of candidates) {\n const text = decodeBytes(bytes, encoding);\n const score = scoreDxfDecode(text, encoding);\n if (score < bestScore) {\n bestScore = score;\n bestText = text;\n }\n }\n return bestText || decodeBytes(bytes, 'utf-8');\n}\n\nfunction scoreDxfDecode(text: string, encoding: string): number {\n const replacements = countMatches(text, /\\uFFFD/g);\n const controls = countMatches(text, /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g);\n const cjk = countMatches(text, /[\\u3400-\\u9FFF\\uF900-\\uFAFF]/g);\n const hasDxfStructure = text.includes('SECTION') && (text.includes('ENTITIES') || text.includes('HEADER'));\n let score = replacements * 10000 + controls * 1000;\n if (hasDxfStructure) score -= 500;\n if (encoding === 'windows-1252') score -= 2;\n if (encoding === 'gb18030' && cjk >= 2) score -= 50 + Math.min(cjk, 200) * 2;\n return score;\n}\n\nfunction countMatches(text: string, pattern: RegExp): number {\n return text.match(pattern)?.length ?? 0;\n}\n\nfunction normalizeDxfText(value: unknown): string | undefined {\n const text = stringOrUndefined(value);\n if (text === undefined) return undefined;\n return text\n .replace(/\\\\U\\+([0-9a-fA-F]{4,6})/g, (match, code: string) => {\n const point = Number.parseInt(code, 16);\n return Number.isFinite(point) && point >= 0 && point <= 0x10ffff ? String.fromCodePoint(point) : match;\n })\n .replace(/%%[cC]/g, '\\u2205')\n .replace(/%%[dD]/g, '\\u00b0')\n .replace(/%%[pP]/g, '\\u00b1')\n .replace(/\\\\P/g, '\\n');\n}\n\ninterface DxfPair { code: number; value: string }\n\nfunction parseDxfFallback(text: string): { header: Record<string, unknown>; tables: Record<string, unknown>; entities: CadEntity[]; blocks: Record<string, unknown> } {\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n const pairs: DxfPair[] = [];\n for (let i = 0; i < lines.length - 1; i += 2) {\n const code = Number(lines[i]?.trim());\n const value = lines[i + 1] ?? '';\n if (Number.isFinite(code)) pairs.push({ code, value: value.trimEnd() });\n }\n const entities: CadEntity[] = [];\n const blocks: Record<string, unknown> = {};\n let section = '';\n let current: DxfPair[] = [];\n let polyline: CadEntity | undefined;\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n if (pair.code === 0 && pair.value === 'SECTION') {\n section = pairs[i + 1]?.code === 2 ? pairs[i + 1].value.toUpperCase() : '';\n i++;\n continue;\n }\n if (pair.code === 0 && pair.value === 'ENDSEC') {\n flushEntity();\n section = '';\n continue;\n }\n if (section !== 'ENTITIES') continue;\n if (pair.code === 0) {\n flushEntity();\n current = [pair];\n } else current.push(pair);\n }\n flushEntity();\n return { header: {}, tables: {}, entities, blocks };\n\n function flushEntity(): void {\n if (!current.length) return;\n const type = current[0]?.value.toUpperCase();\n if (type === 'VERTEX' && polyline) {\n const v = readPoint(current, 10, 20, 30);\n if (v) (polyline.vertices ??= []).push({ ...v, bulge: readNumber(current, 42) });\n current = [];\n return;\n }\n if (type === 'SEQEND') {\n if (polyline) entities.push(polyline);\n polyline = undefined;\n current = [];\n return;\n }\n if (polyline) {\n entities.push(polyline);\n polyline = undefined;\n }\n if (!type || type === 'EOF') { current = []; return; }\n const e = entityFromPairs(type, current);\n if (type === 'POLYLINE') polyline = e;\n else entities.push(e);\n current = [];\n }\n}\n\nfunction entityFromPairs(type: string, pairs: DxfPair[]): CadEntity {\n const common: Record<string, unknown> = {\n type,\n handle: readString(pairs, 5),\n layer: readString(pairs, 8) ?? '0',\n colorIndex: readNumber(pairs, 62),\n trueColor: readNumber(pairs, 420),\n lineType: readString(pairs, 6),\n lineweight: readNumber(pairs, 370)\n };\n switch (type) {\n case 'LINE': Object.assign(common, { startPoint: readPoint(pairs, 10, 20, 30), endPoint: readPoint(pairs, 11, 21, 31) }); break;\n case 'CIRCLE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40) }); break;\n case 'ARC': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40), startAngle: degreesToRadiansSafe(readNumber(pairs, 50)), endAngle: degreesToRadiansSafe(readNumber(pairs, 51)) }); break;\n case 'POINT': Object.assign(common, { point: readPoint(pairs, 10, 20, 30) }); break;\n case 'TEXT':\n case 'MTEXT': Object.assign(common, { insertionPoint: readPoint(pairs, 10, 20, 30), text: readJoinedText(pairs), textHeight: readNumber(pairs, 40), rotation: degreesToRadiansSafe(readNumber(pairs, 50)) }); break;\n case 'LWPOLYLINE': Object.assign(common, { vertices: readLwPolylineVertices(pairs), flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'POLYLINE': Object.assign(common, { vertices: [], flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'ELLIPSE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), majorAxisEndPoint: readPoint(pairs, 11, 21, 31), axisRatio: readNumber(pairs, 40), startAngle: readNumber(pairs, 41), endAngle: readNumber(pairs, 42) }); break;\n case 'SPLINE': Object.assign(common, { controlPoints: readRepeatedPoints(pairs, 10, 20, 30), degree: readNumber(pairs, 71), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'INSERT': Object.assign(common, { name: readString(pairs, 2), blockName: readString(pairs, 2), insertionPoint: readPoint(pairs, 10, 20, 30), rotation: degreesToRadiansSafe(readNumber(pairs, 50)), scale: { x: readNumber(pairs, 41) ?? 1, y: readNumber(pairs, 42) ?? readNumber(pairs, 41) ?? 1, z: readNumber(pairs, 43) ?? 1 } }); break;\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': Object.assign(common, { vertices: [readPoint(pairs, 10, 20, 30), readPoint(pairs, 11, 21, 31), readPoint(pairs, 12, 22, 32), readPoint(pairs, 13, 23, 33)].filter(Boolean) }); break;\n }\n return normalizeDxfEntity(common);\n}\n\nfunction readNumber(pairs: DxfPair[], code: number): number | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n const n = Number(found);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction readString(pairs: DxfPair[], code: number): string | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n return found && found.length > 0 ? found : undefined;\n}\nfunction readPoint(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D | undefined {\n const x = readNumber(pairs, xCode);\n const y = readNumber(pairs, yCode);\n const z = readNumber(pairs, zCode);\n if (x === undefined || y === undefined) return undefined;\n return z === undefined ? { x, y } : { x, y, z };\n}\nfunction readRepeatedPoints(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== xCode) continue;\n const x = Number(pairs[i].value);\n const yPair = pairs.slice(i + 1).find((pair) => pair.code === yCode);\n const zPair = pairs.slice(i + 1).find((pair) => pair.code === zCode);\n const y = Number(yPair?.value);\n const z = Number(zPair?.value);\n if (Number.isFinite(x) && Number.isFinite(y)) out.push(Number.isFinite(z) ? { x, y, z } : { x, y });\n }\n return out;\n}\nfunction readLwPolylineVertices(pairs: DxfPair[]): Array<CadPoint3D & { bulge?: number }> {\n const out: Array<CadPoint3D & { bulge?: number }> = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== 10) continue;\n const x = Number(pairs[i].value);\n let y: number | undefined;\n let bulge: number | undefined;\n for (let j = i + 1; j < pairs.length; j++) {\n if (pairs[j].code === 10) break;\n if (pairs[j].code === 20) y = Number(pairs[j].value);\n if (pairs[j].code === 42) bulge = Number(pairs[j].value);\n }\n if (Number.isFinite(x) && Number.isFinite(y)) out.push({ x, y: y as number, bulge: Number.isFinite(bulge) ? bulge : undefined });\n }\n return out;\n}\nfunction readJoinedText(pairs: DxfPair[]): string | undefined {\n const chunks = pairs.filter((pair) => pair.code === 1 || pair.code === 3).map((pair) => pair.value);\n return chunks.length ? chunks.join('') : undefined;\n}\n\nfunction degreesToRadiansSafe(value: number | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? degreesToRadians(value) : undefined;\n}\n","import { DwfViewer, openDwfDocument, type DwfViewerOptions, type LoadedDwfDocument, type LoadOptions as DwfLoadOptions, type PageData, type RenderStats as DwfRenderStats, type W2dPrimitive } from 'dwf-viewer';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadDocument, CadEntity, CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadNativeRenderableLoader, CadPage, CadPathCommand, CadPoint3D } from '../../core/types';\n\nexport class DwfLoader implements CadNativeRenderableLoader {\n readonly id = 'dwf';\n readonly label = 'DWF/DWFx native viewer powered by dwf-viewer';\n readonly formats = ['dwf', 'dwfx', 'xps'] as const;\n readonly nativeRenderer = true as const;\n private readonly defaults: CadLoadOptions;\n private native?: DwfViewer;\n private host?: HTMLElement;\n private lastStats?: DwfRenderStats;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n const ext = extensionOf(input);\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwf' || format === 'dwfx' || format === 'xps';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Opening DWF/DWFx with dwf-viewer…', percent: 48 });\n const loaded = await openDwfDocument(bytes, { fileName: sourceName });\n merged.onProgress?.({ phase: 'normalize', format, message: 'Reading DWF pages, sheets and model metadata…', percent: 76 });\n\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx document ready.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n async mount(input: CadLoadInput, host: HTMLElement, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n const wasmUrl = resolveDwfWasmUrl(merged);\n const background = resolveDwfBackground(merged);\n const viewerOptions = buildDwfViewerOptions(merged, wasmUrl, background);\n const loadOptions = buildDwfLoadOptions(merged, wasmUrl, background);\n\n merged.onProgress?.({ phase: 'native-render', format, message: 'Mounting native DWF renderer…', percent: 28 });\n this.unmount();\n this.host = host;\n host.replaceChildren();\n this.native = new DwfViewer(host, viewerOptions);\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Parsing DWF package and page streams…', percent: 58 });\n await this.native.load(bytes, {\n fileName: sourceName,\n ...loadOptions\n });\n\n merged.onProgress?.({ phase: 'render', format, message: 'Rendering DWF/DWFx with dwf-viewer…', percent: 88 });\n this.lastStats = await this.native.render();\n const loaded = this.native.getDocument();\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n document.metadata.loaderMode = 'Native DWF';\n document.metadata.nativeRenderer = 'dwf-viewer';\n document.metadata.nativeRenderStats = this.lastStats ? { ...this.lastStats, warnings: this.lastStats.warnings.length } : undefined;\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx rendered.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n unmount(): void {\n this.native?.dispose();\n this.native = undefined;\n this.lastStats = undefined;\n if (this.host) this.host.replaceChildren();\n }\n\n fit(): void {\n this.native?.fit();\n }\n\n zoomIn(): void {\n const button = (this.native as unknown as { zoomInButton?: HTMLButtonElement } | undefined)?.zoomInButton;\n button?.click();\n }\n\n zoomOut(): void {\n const button = (this.native as unknown as { zoomOutButton?: HTMLButtonElement } | undefined)?.zoomOutButton;\n button?.click();\n }\n\n resize(): void {\n void this.native?.render();\n }\n\n setNativeOptions(options: CadLoadOptions): void {\n const native = this.native as unknown as {\n background?: string;\n setPreferWebgl?: (value: boolean) => void;\n setPreferWasm?: (value: boolean) => void;\n setLineWeightMode?: (value: NonNullable<CadLoadOptions['dwfLineWeightMode']>) => void;\n minStrokeCssPx?: number;\n maxOverviewStrokeCssPx?: number;\n minTextCssPx?: number;\n minFilledAreaCssPx?: number;\n render?: () => Promise<unknown>;\n } | undefined;\n if (!native) return;\n if (typeof options.dwfBackground === 'string') native.background = options.dwfBackground;\n else {\n const background = resolveDwfBackground(options);\n if (background) native.background = background;\n }\n if (typeof options.dwfPreferWebgl === 'boolean') native.setPreferWebgl?.(options.dwfPreferWebgl);\n if (typeof options.dwfPreferWasm === 'boolean') native.setPreferWasm?.(options.dwfPreferWasm);\n if (options.dwfLineWeightMode) native.setLineWeightMode?.(options.dwfLineWeightMode);\n setOptionalNumber(native, 'minStrokeCssPx', options.dwfMinStrokeCssPx);\n setOptionalNumber(native, 'maxOverviewStrokeCssPx', options.dwfMaxOverviewStrokeCssPx);\n setOptionalNumber(native, 'minTextCssPx', options.dwfMinTextCssPx);\n setOptionalNumber(native, 'minFilledAreaCssPx', options.dwfMinFilledAreaCssPx);\n void native.render?.();\n }\n\n getLastNativeStats(): DwfRenderStats | undefined {\n return this.lastStats;\n }\n}\n\nfunction cadDocumentFromDwf(loaded: LoadedDwfDocument | undefined, sourceName: string | undefined, format: CadFormat, keepRaw: boolean): CadDocument {\n const warnings = diagnosticsToWarnings(loaded?.diagnostics ?? []);\n const pages = (loaded?.pageData ?? []).map((page, index) => pageToCadPage(page, index));\n for (const page of loaded?.pageData ?? []) warnings.push(...diagnosticsToWarnings(page.diagnostics));\n const metadata = {\n parser: 'dwf-viewer',\n nativeRenderer: 'dwf-viewer',\n dwfKind: loaded?.kind,\n packageEntries: loaded?.packageEntries?.length ?? 0,\n resources: loaded?.resources?.length ?? 0,\n pageKinds: countBy((loaded?.pageData ?? []).map((page) => page.kind)),\n pageNames: (loaded?.pages ?? []).map((page) => page.name)\n };\n return createCadDocument({\n format,\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata,\n warnings: unique(warnings),\n raw: keepRaw ? loaded : undefined\n });\n}\n\nfunction pageToCadPage(page: PageData, index: number): CadPage {\n const entities = pageEntities(page, index);\n return {\n index,\n name: page.name || page.sourcePath || `${index + 1}`,\n width: page.width || 1000,\n height: page.height || 1000,\n entities\n };\n}\n\nfunction pageEntities(page: PageData, pageIndex: number): CadEntity[] {\n if (page.kind === 'w2d-text') return page.primitives.flatMap((primitive, index) => primitiveToEntity(primitive, pageIndex, index));\n if (page.kind === 'image') {\n return [{ type: 'DWF_IMAGE_PAGE', kind: 'image', pageIndex, width: page.width, height: page.height, imageSource: page.sourcePath }];\n }\n if (page.kind === 'w3d-model') {\n return page.model.meshes.map((mesh, index) => ({\n id: mesh.id,\n type: 'W3D_MESH',\n kind: 'solid',\n pageIndex,\n color: mesh.color ? rgbToHex(mesh.color) : undefined,\n name: mesh.name || `mesh-${index + 1}`,\n raw: { vertexCount: mesh.vertexCount, triangleCount: mesh.triangleCount, materialId: mesh.materialId }\n }));\n }\n if (page.kind === 'xps-fixed-page') {\n return [{ type: 'XPS_FIXED_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n }\n return [{ type: 'DWF_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n}\n\nfunction primitiveToEntity(primitive: W2dPrimitive, pageIndex: number, index: number): CadEntity[] {\n const base = {\n id: `dwf-${pageIndex}-${index}`,\n pageIndex,\n color: primitive.stroke,\n fillColor: primitive.fill,\n lineweight: primitive.lineWidth,\n raw: { matrix: primitive.matrix }\n } satisfies Partial<CadEntity>;\n if (primitive.type === 'polyline' || primitive.type === 'polygon') {\n return [{\n ...base,\n type: primitive.type === 'polygon' ? 'DWF_POLYGON' : 'DWF_POLYLINE',\n kind: 'polyline',\n vertices: pointsArrayToCadPoints(primitive.points),\n isClosed: primitive.type === 'polygon'\n }];\n }\n if (primitive.type === 'path') {\n return [{ ...base, type: 'DWF_PATH', kind: 'path', commands: primitive.commands as unknown as CadPathCommand[] }];\n }\n if (primitive.type === 'text') {\n return [{\n ...base,\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: { x: primitive.x, y: primitive.y, z: 0 },\n text: primitive.text,\n textHeight: primitive.size\n }];\n }\n if (primitive.type === 'rect') {\n const x = primitive.x;\n const y = primitive.y;\n const w = primitive.width;\n const h = primitive.height;\n return [{\n ...base,\n type: 'DWF_RECT',\n kind: 'polyline',\n isClosed: true,\n vertices: [\n { x, y, z: 0 },\n { x: x + w, y, z: 0 },\n { x: x + w, y: y + h, z: 0 },\n { x, y: y + h, z: 0 }\n ]\n }];\n }\n return [];\n}\n\nfunction pointsArrayToCadPoints(points: number[]): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) out.push({ x: points[i], y: points[i + 1], z: 0 });\n return out;\n}\n\nfunction diagnosticsToWarnings(diagnostics: readonly { level: string; code: string; message: string; source?: string }[]): string[] {\n return diagnostics\n .filter((item) => item.level !== 'info')\n .map((item) => `${item.code}: ${item.message}${item.source ? ` (${item.source})` : ''}`);\n}\n\nfunction normalizeFormat(detected: CadFormat, ext: string): CadFormat {\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return ext;\n if (detected === 'dwf' || detected === 'dwfx' || detected === 'xps') return detected;\n return 'dwf';\n}\n\nfunction resolveDwfWasmUrl(options: CadLoadOptions): string | undefined {\n if (options.dwfWasmUrl) return options.dwfWasmUrl;\n if (typeof document === 'undefined') return undefined;\n const base = options.wasmPath\n ? new URL(ensureTrailingSlash(options.wasmPath), document.baseURI).href\n : new URL('wasm/', document.baseURI).href;\n return new URL('dwfv-render.wasm', base).href;\n}\n\nfunction resolveDwfBackground(options: CadLoadOptions): string {\n if (options.dwfBackground) return options.dwfBackground;\n const canvasOptions = (options as CadLoadOptions & { canvasOptions?: { background?: string } }).canvasOptions;\n return canvasOptions?.background ?? '#05070d';\n}\n\nfunction buildDwfViewerOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfViewerOptions {\n return {\n ...buildDwfLoadOptions(options, wasmUrl, background),\n maxDevicePixelRatio: options.dwfMaxDevicePixelRatio ?? 2,\n maxCanvasPixels: options.dwfMaxCanvasPixels ?? 16_777_216\n };\n}\n\nfunction buildDwfLoadOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfLoadOptions {\n return {\n wasmUrl,\n preferWebgl: options.dwfPreferWebgl ?? true,\n preferWasm: options.dwfPreferWasm ?? true,\n background,\n maxGpuCacheBytes: options.dwfMaxGpuCacheBytes ?? 160 * 1024 * 1024,\n maxCachedScenes: options.dwfMaxCachedScenes ?? 2,\n lineWeightMode: options.dwfLineWeightMode ?? 'adaptive',\n minStrokeCssPx: options.dwfMinStrokeCssPx,\n maxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,\n minTextCssPx: options.dwfMinTextCssPx,\n minFilledAreaCssPx: options.dwfMinFilledAreaCssPx\n };\n}\n\nfunction setOptionalNumber<T extends object, K extends keyof T>(target: T, key: K, value: number | undefined): void {\n if (typeof value === 'number' && Number.isFinite(value)) target[key] = value as T[K];\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction rgbToHex(rgb: [number, number, number]): string {\n const [r, g, b] = rgb.map((value) => Math.max(0, Math.min(255, Math.round(value * 255))));\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return value.toString(16).padStart(2, '0');\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const value of values) out[value] = (out[value] ?? 0) + 1;\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { CadLoaderRegistry } from './CadLoaderRegistry';\nimport { DwgLoader } from './dwg/DwgLoader';\nimport { DxfLoader } from './dxf/DxfLoader';\nimport { DwfLoader } from './dwf/DwfLoader';\nimport type { CadLoadOptions } from '../core/types';\n\nexport function createDefaultLoaderRegistry(options: CadLoadOptions = {}): CadLoaderRegistry {\n return new CadLoaderRegistry([\n new DwgLoader(options),\n new DxfLoader(options),\n new DwfLoader(options)\n ]);\n}\n\nexport { CadLoaderRegistry } from './CadLoaderRegistry';\nexport { DwgLoader, DwgWorkerClient, supportsDwgWorker } from './dwg/DwgLoader';\nexport { DxfLoader } from './dxf/DxfLoader';\nexport { DwfLoader } from './dwf/DwfLoader';\n","export type CadFormat = 'dwg' | 'dxf' | 'dwf' | 'dwfx' | 'xps' | 'unknown';\nexport type CadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';\n\nexport interface CadPoint2D {\n x: number;\n y: number;\n}\n\nexport interface CadPoint3D extends CadPoint2D {\n z?: number;\n}\n\nexport type CadPoint = CadPoint2D | CadPoint3D;\n\nexport interface CadBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface CadLayer {\n name: string;\n color?: string | number;\n colorIndex?: number;\n trueColor?: number;\n lineType?: string;\n lineweight?: number;\n isVisible?: boolean;\n isLocked?: boolean;\n isFrozen?: boolean;\n raw?: unknown;\n}\n\nexport interface CadLineTypeElement {\n /** Signed AutoCAD pattern length: positive=dash, negative=gap, zero=dot/shape. */\n length: number;\n elementTypeFlag?: number;\n shapeNumber?: number;\n scale?: number;\n rotation?: number;\n offsetX?: number;\n offsetY?: number;\n text?: string;\n}\n\nexport interface CadLineType {\n name: string;\n handle?: string;\n description?: string;\n totalPatternLength?: number;\n pattern: CadLineTypeElement[];\n raw?: unknown;\n}\n\nexport interface CadSceneTransform2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface CadSavedView {\n source: 'vport' | 'header-ucs';\n name?: string;\n handle?: string;\n center?: CadPoint2D;\n target?: CadPoint3D;\n direction?: CadPoint3D;\n viewHeight?: number;\n aspectRatio?: number;\n twistAngle: number;\n ucsOrigin?: CadPoint3D;\n ucsXAxis?: CadPoint3D;\n ucsYAxis?: CadPoint3D;\n sceneTransformApplied: boolean;\n /** WCS-to-normalized-scene transform used by render, bounds and interaction. */\n sceneTransform: CadSceneTransform2D;\n}\n\nexport interface CadPathCommand {\n cmd: 'M' | 'L' | 'C' | 'Q' | 'Z';\n points: CadPoint2D[];\n}\n\nexport type CadEntityKind =\n | 'line'\n | 'circle'\n | 'arc'\n | 'polyline'\n | 'ellipse'\n | 'text'\n | 'point'\n | 'insert'\n | 'solid'\n | 'hatch'\n | 'spline'\n | 'path'\n | 'image'\n | 'viewport'\n | 'unsupported';\n\nexport interface CadEntity {\n id?: string;\n type: string;\n kind?: CadEntityKind;\n handle?: string;\n layer?: string;\n color?: string | number;\n trueColor?: number | string | { r: number; g: number; b: number; a?: number };\n colorIndex?: number;\n colorNumber?: number;\n colorName?: string;\n fillColor?: string | number;\n fillColorIndex?: number;\n opacity?: number;\n lineweight?: number;\n lineType?: string;\n linetype?: string;\n lineTypeScale?: number;\n isVisible?: boolean;\n isInPaperSpace?: boolean;\n\n startPoint?: CadPoint3D;\n endPoint?: CadPoint3D;\n center?: CadPoint3D;\n radius?: number;\n startAngle?: number;\n endAngle?: number;\n majorAxisEndPoint?: CadPoint3D;\n axisRatio?: number;\n vertices?: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }>;\n points?: CadPoint3D[];\n controlPoints?: CadPoint3D[];\n fitPoints?: CadPoint3D[];\n degree?: number;\n knots?: number[];\n isClosed?: boolean;\n flag?: number;\n\n insertionPoint?: CadPoint3D;\n text?: string;\n value?: string;\n height?: number;\n textHeight?: number;\n rotation?: number;\n scale?: CadPoint3D;\n name?: string;\n blockName?: string;\n attribs?: CadEntity[];\n\n loops?: Array<{ vertices?: CadPoint3D[]; commands?: CadPathCommand[]; isClosed?: boolean }>;\n commands?: CadPathCommand[];\n imageSource?: string;\n imageDataUrl?: string;\n width?: number;\n pageIndex?: number;\n\n raw?: unknown;\n [key: string]: unknown;\n}\n\nexport interface CadBlock {\n name: string;\n basePoint?: CadPoint3D;\n entities: CadEntity[];\n raw?: unknown;\n}\n\nexport interface CadPage {\n index: number;\n name?: string;\n width: number;\n height: number;\n entities: CadEntity[];\n}\n\nexport interface CadDocument {\n format: CadFormat;\n sourceName?: string;\n units?: string;\n header?: Record<string, unknown>;\n layers: Record<string, CadLayer>;\n lineTypes?: Record<string, CadLineType>;\n blocks: Record<string, CadBlock>;\n entities: CadEntity[];\n pages?: CadPage[];\n savedView?: CadSavedView;\n metadata: Record<string, unknown>;\n warnings: string[];\n raw?: unknown;\n}\n\nexport interface CadLoadInput {\n file?: File;\n fileName?: string;\n buffer?: ArrayBuffer | Uint8Array;\n}\n\nexport type CadLoadProgressPhase =\n | 'read'\n | 'detect'\n | 'worker-start'\n | 'worker-ready'\n | 'wasm-init'\n | 'parse'\n | 'normalize'\n | 'render'\n | 'native-render'\n | 'done';\n\nexport interface CadLoadProgress {\n phase: CadLoadProgressPhase;\n message: string;\n format?: CadFormat;\n loaded?: number;\n total?: number;\n percent?: number;\n elapsedMs?: number;\n}\n\nexport interface CadLoadOptions {\n wasmPath?: string;\n /**\n * Explicit text encoding for DXF sources. DXF files normally declare this in\n * `$DWGCODEPAGE`; use this only when legacy files are missing or lying about\n * their code page, for example `gb18030`, `big5`, `shift_jis` or `windows-1252`.\n */\n dxfEncoding?: string;\n preferDwgWasm?: boolean;\n maxInsertDepth?: number;\n includePaperSpace?: boolean;\n /**\n * Parse heavy formats in a Web Worker where available. DWG defaults to true\n * because LibreDWG WebAssembly initialization and decoding can block the UI.\n */\n useWorker?: boolean;\n /** Custom worker URL for bundlers/CDNs that cannot resolve the packaged worker URL. */\n workerUrl?: string | URL;\n /** Custom worker factory for applications that manage workers themselves. */\n workerFactory?: () => Worker;\n /** Milliseconds before an in-flight worker load is rejected. 0 disables timeout. */\n workerTimeoutMs?: number;\n /**\n * Transfer the input ArrayBuffer to the worker when it is safe to do so. This\n * avoids an extra copy for File inputs. ArrayBuffer inputs are copied by\n * default to avoid detaching caller-owned buffers.\n */\n transferInputBuffer?: boolean;\n /** Keep parser raw objects on the normalized document. Disabled by default for memory and worker cloning safety. */\n keepRaw?: boolean;\n /** Abort a pending load. For native parsers this terminates and recreates the worker. */\n signal?: AbortSignal;\n\n /** URL to dwf-viewer's optional 2D raster fallback WASM asset, usually /wasm/dwfv-render.wasm. */\n dwfWasmUrl?: string;\n /** Prefer dwf-viewer's WebGL paths for W2D/W3D rendering. */\n dwfPreferWebgl?: boolean;\n /** Allow dwf-viewer's WASM raster backend for complex 2D vector pages. */\n dwfPreferWasm?: boolean;\n /** Background passed to the native DWF renderer. Defaults to the active CAD canvas background. */\n dwfBackground?: string;\n /** DWF renderer device-pixel-ratio cap. */\n dwfMaxDevicePixelRatio?: number;\n /** DWF renderer maximum backing-store pixels per canvas. */\n dwfMaxCanvasPixels?: number;\n /** DWF WebGL GPU cache budget in bytes. */\n dwfMaxGpuCacheBytes?: number;\n /** Number of DWF pages/scenes kept in the native renderer cache. */\n dwfMaxCachedScenes?: number;\n /** DWF/XPS CAD line-weight rendering mode. Defaults to dwf-viewer's adaptive mode. */\n dwfLineWeightMode?: CadDwfLineWeightMode;\n /** Minimum CSS-pixel stroke used by the DWF/XPS adaptive line-weight renderer. */\n dwfMinStrokeCssPx?: number;\n /** Maximum overview stroke width before zoom restores physical line weights. */\n dwfMaxOverviewStrokeCssPx?: number;\n /** Minimum CSS-pixel text size shown in dense adaptive DWF/XPS overviews. */\n dwfMinTextCssPx?: number;\n /** Minimum filled area, in CSS pixels, shown in dense adaptive DWF/XPS overviews. */\n dwfMinFilledAreaCssPx?: number;\n /** Receives coarse loader progress events. */\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nexport interface CadLoadResult {\n document: CadDocument;\n raw?: unknown;\n bytes: number;\n elapsedMs: number;\n format: CadFormat;\n warnings: string[];\n}\n\nexport interface CadLoader {\n readonly id: string;\n readonly label: string;\n readonly formats: readonly CadFormat[];\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean;\n load(input: CadLoadInput, options?: CadLoadOptions): Promise<CadLoadResult>;\n}\n\n\n\nexport interface CadNativeRenderableLoader extends CadLoader {\n readonly nativeRenderer: true;\n mount(input: CadLoadInput, host: HTMLElement, options?: CadLoadOptions): Promise<CadLoadResult>;\n unmount(): void;\n fit?(): void;\n zoomIn?(): void;\n zoomOut?(): void;\n resize?(): void;\n setNativeOptions?(options: CadLoadOptions): void;\n}\n\nexport function isCadNativeRenderableLoader(loader: CadLoader): loader is CadNativeRenderableLoader {\n const candidate = loader as Partial<CadNativeRenderableLoader>;\n return candidate.nativeRenderer === true && typeof candidate.mount === 'function';\n}\n\nexport interface CadSummary {\n format: CadFormat;\n sourceName?: string;\n entityCount: number;\n layerCount: number;\n blockCount: number;\n pageCount: number;\n byType: Record<string, number>;\n warnings: string[];\n}\n","import type { CadDocument, CadEntity, CadLayer } from './types';\n\nconst BASE_ACI: Record<number, string> = {\n 1: '#ff0000', 2: '#ffff00', 3: '#00ff00', 4: '#00ffff', 5: '#0000ff', 6: '#ff00ff',\n 8: '#808080', 9: '#c0c0c0',\n 10: '#ff0000', 11: '#ff7f7f', 12: '#a50000', 13: '#a55252', 14: '#7f0000', 15: '#7f3f3f', 16: '#4c0000', 17: '#4c2626', 18: '#260000', 19: '#261313',\n 20: '#ff3f00', 21: '#ff9f7f', 22: '#a52900', 23: '#a56752', 24: '#7f1f00', 25: '#7f4f3f', 26: '#4c1300', 27: '#4c2f26', 28: '#260900', 29: '#261713',\n 30: '#ff7f00', 31: '#ffbf7f', 32: '#a55200', 33: '#a57c52', 34: '#7f3f00', 35: '#7f5f3f', 36: '#4c2600', 37: '#4c3926', 38: '#261300', 39: '#261c13',\n 40: '#ffbf00', 41: '#ffdf7f', 42: '#a57c00', 43: '#a59152', 44: '#7f5f00', 45: '#7f6f3f', 46: '#4c3900', 47: '#4c4226', 48: '#261c00', 49: '#262113',\n 50: '#ffff00', 51: '#ffff7f', 52: '#a5a500', 53: '#a5a552', 54: '#7f7f00', 55: '#7f7f3f', 56: '#4c4c00', 57: '#4c4c26', 58: '#262600', 59: '#262613',\n 60: '#bfff00', 61: '#dfff7f', 62: '#7ca500', 63: '#91a552', 64: '#5f7f00', 65: '#6f7f3f', 66: '#394c00', 67: '#424c26', 68: '#1c2600', 69: '#212613',\n 70: '#7fff00', 71: '#bfff7f', 72: '#52a500', 73: '#7ca552', 74: '#3f7f00', 75: '#5f7f3f', 76: '#264c00', 77: '#394c26', 78: '#132600', 79: '#1c2613',\n 80: '#3fff00', 81: '#9fff7f', 82: '#29a500', 83: '#67a552', 84: '#1f7f00', 85: '#4f7f3f', 86: '#134c00', 87: '#2f4c26', 88: '#092600', 89: '#172613',\n 90: '#00ff00', 91: '#7fff7f', 92: '#00a500', 93: '#52a552', 94: '#007f00', 95: '#3f7f3f', 96: '#004c00', 97: '#264c26', 98: '#002600', 99: '#132613',\n 100: '#00ff3f', 101: '#7fff9f', 102: '#00a529', 103: '#52a567', 104: '#007f1f', 105: '#3f7f4f', 106: '#004c13', 107: '#264c2f', 108: '#002609', 109: '#132617',\n 110: '#00ff7f', 111: '#7fffbf', 112: '#00a552', 113: '#52a57c', 114: '#007f3f', 115: '#3f7f5f', 116: '#004c26', 117: '#264c39', 118: '#002613', 119: '#13261c',\n 120: '#00ffbf', 121: '#7fffdf', 122: '#00a57c', 123: '#52a591', 124: '#007f5f', 125: '#3f7f6f', 126: '#004c39', 127: '#264c42', 128: '#00261c', 129: '#132621',\n 130: '#00ffff', 131: '#7fffff', 132: '#00a5a5', 133: '#52a5a5', 134: '#007f7f', 135: '#3f7f7f', 136: '#004c4c', 137: '#264c4c', 138: '#002626', 139: '#132626',\n 140: '#00bfff', 141: '#7fdfff', 142: '#007ca5', 143: '#5291a5', 144: '#005f7f', 145: '#3f6f7f', 146: '#00394c', 147: '#26424c', 148: '#001c26', 149: '#132126',\n 150: '#007fff', 151: '#7fbfff', 152: '#0052a5', 153: '#527ca5', 154: '#003f7f', 155: '#3f5f7f', 156: '#00264c', 157: '#26394c', 158: '#001326', 159: '#131c26',\n 160: '#003fff', 161: '#7f9fff', 162: '#0029a5', 163: '#5267a5', 164: '#001f7f', 165: '#3f4f7f', 166: '#00134c', 167: '#262f4c', 168: '#000926', 169: '#131726',\n 170: '#0000ff', 171: '#7f7fff', 172: '#0000a5', 173: '#5252a5', 174: '#00007f', 175: '#3f3f7f', 176: '#00004c', 177: '#26264c', 178: '#000026', 179: '#131326',\n 180: '#3f00ff', 181: '#9f7fff', 182: '#2900a5', 183: '#6752a5', 184: '#1f007f', 185: '#4f3f7f', 186: '#13004c', 187: '#2f264c', 188: '#090026', 189: '#171326',\n 190: '#7f00ff', 191: '#bf7fff', 192: '#5200a5', 193: '#7c52a5', 194: '#3f007f', 195: '#5f3f7f', 196: '#26004c', 197: '#39264c', 198: '#130026', 199: '#1c1326',\n 200: '#bf00ff', 201: '#df7fff', 202: '#7c00a5', 203: '#9152a5', 204: '#5f007f', 205: '#6f3f7f', 206: '#39004c', 207: '#42264c', 208: '#1c0026', 209: '#211326',\n 210: '#ff00ff', 211: '#ff7fff', 212: '#a500a5', 213: '#a552a5', 214: '#7f007f', 215: '#7f3f7f', 216: '#4c004c', 217: '#4c264c', 218: '#260026', 219: '#261326',\n 220: '#ff00bf', 221: '#ff7fdf', 222: '#a5007c', 223: '#a55291', 224: '#7f005f', 225: '#7f3f6f', 226: '#4c0039', 227: '#4c2642', 228: '#26001c', 229: '#261321',\n 230: '#ff007f', 231: '#ff7fbf', 232: '#a50052', 233: '#a5527c', 234: '#7f003f', 235: '#7f3f5f', 236: '#4c0026', 237: '#4c2639', 238: '#260013', 239: '#26131c',\n 240: '#ff003f', 241: '#ff7f9f', 242: '#a50029', 243: '#a55267', 244: '#7f001f', 245: '#7f3f4f', 246: '#4c0013', 247: '#4c262f', 248: '#260009', 249: '#261317',\n 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#bebebe', 255: '#ffffff'\n};\n\n\nexport type CadColorContrastMode = 'preserve' | 'adaptive';\n\nexport interface ColorResolveOptions {\n foreground?: string;\n background?: string;\n trueColorByteOrder?: 'rgb' | 'bgr';\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport function colorFromAci(index: number | undefined, fallback = '#ffffff', foreground = fallback): string {\n if (typeof index !== 'number' || Number.isNaN(index)) return fallback;\n const normalized = Math.abs(Math.trunc(index));\n if (normalized === 0 || normalized === 256 || normalized === 257) return fallback;\n // ACI 7 is intentionally foreground-dependent in CAD viewers: it should be\n // black on a light canvas and white on a dark canvas.\n if (normalized === 7) return foreground;\n return BASE_ACI[normalized] ?? fallback;\n}\n\nexport function colorFromTrueColor(value: number, byteOrder: 'rgb' | 'bgr' = 'rgb'): string {\n const int = Math.max(0, Math.trunc(value)) & 0xffffff;\n const a = (int >> 16) & 0xff;\n const b = (int >> 8) & 0xff;\n const c = int & 0xff;\n const red = byteOrder === 'rgb' ? a : c;\n const green = b;\n const blue = byteOrder === 'rgb' ? c : a;\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport function parseCssColor(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n if (!v) return undefined;\n if (/^(#|rgb\\(|rgba\\(|hsl\\(|hsla\\()/i.test(v)) return normalizeXpsColor(v) ?? v;\n const named: Record<string, string> = {\n red: '#ff0000',\n yellow: '#ffff00',\n green: '#00ff00',\n cyan: '#00ffff',\n blue: '#0000ff',\n magenta: '#ff00ff',\n white: '#ffffff',\n black: '#000000',\n grey: '#808080',\n gray: '#808080'\n };\n return named[v.toLowerCase()];\n }\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const r = Number(obj.r ?? obj.red);\n const g = Number(obj.g ?? obj.green);\n const b = Number(obj.b ?? obj.blue);\n const a = Number(obj.a ?? obj.alpha ?? 1);\n if ([r, g, b].every(Number.isFinite)) {\n return Number.isFinite(a) && a >= 0 && a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n }\n }\n return undefined;\n}\n\nexport function normalizeXpsColor(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^#[0-9a-f]{8}$/i.test(trimmed)) {\n const a = parseInt(trimmed.slice(1, 3), 16) / 255;\n const r = parseInt(trimmed.slice(3, 5), 16);\n const g = parseInt(trimmed.slice(5, 7), 16);\n const b = parseInt(trimmed.slice(7, 9), 16);\n return a >= 0.999 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${roundAlpha(a)})`;\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed) || /^#[0-9a-f]{3}$/i.test(trimmed)) return trimmed;\n if (/^sc#/i.test(trimmed)) {\n const parts = trimmed.slice(3).split(',').map((x) => Number(x.trim()));\n const [a, r, g, b] = parts.length === 4 ? parts : [1, ...parts];\n if ([a, r, g, b].every(Number.isFinite)) return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${roundAlpha(a)})`;\n }\n return undefined;\n}\n\nexport function resolveCadColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string {\n const foreground = options.foreground ?? '#ffffff';\n const fallback = foreground;\n let color: string | undefined;\n\n const explicit = parseCssColor(entity.trueColor) ?? parseCssColor(entity.color) ?? parseCssColor(entity.colorName);\n if (explicit) color = explicit;\n\n if (!color) {\n const trueColorCandidate = numberFromKeys(entity, ['trueColor', 'true_color', 'truecolor', 'colorRGB', 'colorRgb', 'rgbColor', 'rgb']);\n if (typeof trueColorCandidate === 'number' && trueColorCandidate >= 0 && trueColorCandidate <= 0xffffff) {\n color = colorFromTrueColor(trueColorCandidate, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (typeof aci === 'number' && Math.abs(aci) <= 257 && aci !== 256 && aci !== 0 && aci !== 257) color = colorFromAci(aci, fallback, foreground);\n }\n\n if (!color && typeof entity.color === 'number') {\n const c = Number(entity.color);\n // Most DWG/DXF JavaScript parsers expose `color` as ACI for values 1..257.\n // Treating those values as RGB is the common cause of nearly black drawings.\n if (Math.abs(c) <= 257) {\n if (c !== 0 && c !== 256 && c !== 257) color = colorFromAci(c, fallback, foreground);\n } else {\n color = colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const layer = lookupLayer(document, entity.layer);\n color = resolveLayerColor(layer, options);\n }\n\n return adaptColorForCanvas(color ?? fallback, options);\n}\n\nexport function resolveFillColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string | undefined {\n let color: string | undefined;\n const explicit = parseCssColor(entity.fillColor);\n if (explicit) color = explicit;\n if (!color && typeof entity.fillColor === 'number') {\n const n = entity.fillColor;\n color = Math.abs(n) <= 257 ? colorFromAci(n, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff') : colorFromTrueColor(n, options.trueColorByteOrder ?? 'rgb');\n }\n if (!color && typeof entity.fillColorIndex === 'number') color = colorFromAci(entity.fillColorIndex, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff');\n return color ? adaptColorForCanvas(color, options) : undefined;\n}\n\nexport function adaptColorForCanvas(color: string, options: ColorResolveOptions = {}): string {\n if (options.contrastMode !== 'adaptive') return color;\n const background = options.background ?? '#0b1020';\n const foreground = options.foreground ?? '#ffffff';\n return ensureContrast(color, background, foreground, options.minColorContrast ?? 2.4);\n}\n\nexport function ensureContrast(color: string, background: string, foreground: string, minRatio = 2.4): string {\n const fg = parseRgba(foreground) ?? { r: 255, g: 255, b: 255, a: 1 };\n const bg = parseRgba(background) ?? { r: 11, g: 16, b: 32, a: 1 };\n const raw = parseRgba(color);\n if (!raw) return color;\n\n const effective = alphaComposite(raw, bg);\n if (contrastRatio(effective, bg) >= minRatio) return color;\n\n const bgLum = relativeLuminance(bg);\n const target = bgLum < 0.5 ? { r: 255, g: 255, b: 255, a: raw.a } : { r: 0, g: 0, b: 0, a: raw.a };\n for (const amount of [0.25, 0.4, 0.55, 0.7, 0.85, 1]) {\n const mixed = mix(raw, target, amount);\n if (contrastRatio(alphaComposite(mixed, bg), bg) >= minRatio) return toCssColor(mixed);\n }\n\n if (contrastRatio(fg, bg) >= minRatio) return toCssColor(fg);\n return bgLum < 0.5 ? '#ffffff' : '#000000';\n}\n\nexport function layerVisible(layer: CadLayer | undefined): boolean {\n if (!layer) return true;\n return layer.isVisible !== false && layer.isFrozen !== true;\n}\n\nfunction resolveLayerColor(layer: CadLayer | undefined, options: ColorResolveOptions): string | undefined {\n if (!layer) return undefined;\n const foreground = options.foreground ?? '#ffffff';\n\n const trueColorText = parseCssColor(layer.trueColor);\n if (trueColorText) return trueColorText;\n if (typeof layer.trueColor === 'number' && layer.trueColor >= 0 && layer.trueColor <= 0xffffff) return colorFromTrueColor(layer.trueColor, options.trueColorByteOrder ?? 'rgb');\n\n const explicitColorText = parseCssColor(layer.color);\n if (explicitColorText) return explicitColorText;\n\n // Prefer a valid ACI index over a numeric `layer.color` when both are\n // present. LibreDWG's JS converter uses `color: 0xffffff` as a placeholder\n // for many indexed-color layers; using that value first turns drawings\n // monochrome white. The ACI index is the authoritative layer color in that\n // case.\n if (isRenderableAci(layer.colorIndex)) return colorFromAci(layer.colorIndex, foreground, foreground);\n\n if (typeof layer.color === 'number') {\n const c = Number(layer.color);\n return Math.abs(c) <= 257 ? colorFromAci(c, foreground, foreground) : colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n if (typeof layer.colorIndex === 'number') return colorFromAci(layer.colorIndex, foreground, foreground);\n return undefined;\n}\n\n\nexport function isByBlockColor(entity: CadEntity): boolean {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (aci === 0) return true;\n return entity.trueColor === undefined && entity.color === 0;\n}\n\nexport function applyByBlockColorInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): CadEntity {\n if (!isByBlockColor(entity)) return entity;\n const inheritedColor = resolveCadColor(parent, document, options);\n const clone: CadEntity = { ...entity, color: inheritedColor, trueColor: undefined, colorIndex: undefined, colorNumber: undefined };\n return clone;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name] ?? document.layers[name.toLowerCase()] ?? Object.values(document.layers).find((x) => x.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction numberFromKeys(entity: CadEntity, keys: string[]): number | undefined {\n const record = entity as Record<string, unknown>;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction parseRgba(value: string): RgbaColor | undefined {\n const input = value.trim().toLowerCase();\n if (/^#[0-9a-f]{3}$/i.test(input)) {\n return {\n r: parseInt(input[1] + input[1], 16),\n g: parseInt(input[2] + input[2], 16),\n b: parseInt(input[3] + input[3], 16),\n a: 1\n };\n }\n if (/^#[0-9a-f]{6}$/i.test(input)) {\n return {\n r: parseInt(input.slice(1, 3), 16),\n g: parseInt(input.slice(3, 5), 16),\n b: parseInt(input.slice(5, 7), 16),\n a: 1\n };\n }\n const rgba = input.match(/^rgba?\\(([^)]+)\\)$/i);\n if (rgba) {\n const parts = rgba[1].split(/[,\\s/]+/).filter(Boolean).map((part) => Number(part.replace('%', '')));\n if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n const hasPercent = /%/.test(rgba[1]);\n return {\n r: clampByte(hasPercent ? parts[0] * 2.55 : parts[0]),\n g: clampByte(hasPercent ? parts[1] * 2.55 : parts[1]),\n b: clampByte(hasPercent ? parts[2] * 2.55 : parts[2]),\n a: Number.isFinite(parts[3]) ? Math.max(0, Math.min(1, parts[3])) : 1\n };\n }\n }\n return undefined;\n}\n\nfunction alphaComposite(color: RgbaColor, background: RgbaColor): RgbaColor {\n const a = color.a + background.a * (1 - color.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (color.r * color.a + background.r * background.a * (1 - color.a)) / a,\n g: (color.g * color.a + background.g * background.a * (1 - color.a)) / a,\n b: (color.b * color.a + background.b * background.a * (1 - color.a)) / a,\n a\n };\n}\n\nfunction mix(a: RgbaColor, b: RgbaColor, amount: number): RgbaColor {\n const t = Math.max(0, Math.min(1, amount));\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a\n };\n}\n\nfunction relativeLuminance(color: RgbaColor): number {\n const channels = [color.r, color.g, color.b].map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\nfunction contrastRatio(a: RgbaColor, b: RgbaColor): number {\n const l1 = relativeLuminance(a);\n const l2 = relativeLuminance(b);\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction toCssColor(color: RgbaColor): string {\n const r = clampByte(color.r);\n const g = clampByte(color.g);\n const b = clampByte(color.b);\n return color.a < 0.999 ? `rgba(${r}, ${g}, ${b}, ${roundAlpha(color.a)})` : `rgb(${r}, ${g}, ${b})`;\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction roundAlpha(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n","import type { CadDocument, CadEntity, CadLayer, CadLineType, CadPoint2D } from './types';\n\nexport interface ResolvedCadLinePattern {\n name: string;\n /** Alternating world-unit draw/gap lengths, always starting with draw. */\n segments: number[];\n /** Exact signed-pattern semantics used by the renderers. Zero-length runs are marker events. */\n runs: ResolvedCadLinePatternRun[];\n period: number;\n}\n\nexport interface ResolvedCadLinePatternRun {\n draw: boolean;\n /** World-unit phase advance. A zero-length run does not change the pattern period. */\n length: number;\n /** Render a screen-space dot as a fallback for a DXF dot or unavailable SHX glyph. */\n marker: boolean;\n}\n\nexport interface CadDashedPrimitives {\n segments: Array<readonly [CadPoint2D, CadPoint2D]>;\n dots: CadPoint2D[];\n}\n\nconst DEFAULT_MAX_DASH_PRIMITIVES = 100_000;\n\nconst BY_LAYER = new Set(['', 'bylayer', '15']);\nconst BY_BLOCK = new Set(['byblock', '14']);\nconst CONTINUOUS = new Set(['continuous', '16']);\n\nconst refKey = (value: unknown) => String(value ?? '').trim().toLowerCase();\n\nexport function isByBlockLineType(value: unknown): boolean {\n return BY_BLOCK.has(refKey(value));\n}\n\nexport function applyByBlockLineTypeInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument): CadEntity {\n if (!isByBlockLineType(entity.lineType)) return entity;\n const parentRef = resolveCadLineTypeReference(parent, document);\n return {\n ...entity,\n lineType: parentRef || 'Continuous',\n lineTypeScale: finitePositive(entity.lineTypeScale, 1) * finitePositive(parent.lineTypeScale, 1)\n };\n}\n\nexport function resolveCadLineTypeReference(entity: CadEntity, document?: CadDocument): string {\n let reference = String(entity.lineType ?? '').trim();\n const key = refKey(reference);\n if (BY_LAYER.has(key)) {\n reference = lookupLayer(document, entity.layer)?.lineType ?? 'Continuous';\n } else if (BY_BLOCK.has(key)) {\n reference = 'Continuous';\n }\n return reference || 'Continuous';\n}\n\nexport function resolveCadLinePattern(entity: CadEntity, document?: CadDocument): ResolvedCadLinePattern | undefined {\n if (!document) return undefined;\n const reference = resolveCadLineTypeReference(entity, document);\n const key = refKey(reference);\n if (CONTINUOUS.has(key) || BY_LAYER.has(key) || BY_BLOCK.has(key)) return undefined;\n const definition = lookupLineType(document, reference);\n if (!definition?.pattern.length) return undefined;\n\n // CELTSCALE is the authoring default for new entities. Once an entity has a\n // stored lineTypeScale it replaces (rather than multiplies) that default.\n const entityScale = finitePositive(entity.lineTypeScale, finitePositive(document.header?.CELTSCALE, 1));\n const globalScale = finitePositive(document.header?.LTSCALE, 1) * entityScale;\n const runs = patternRuns(definition, globalScale);\n const period = runs.reduce((sum, run) => sum + run.length, 0);\n if (!Number.isFinite(period) || period <= 1e-9) return undefined;\n const hasGap = runs.some((run) => !run.draw && run.length > 1e-12);\n const hasMarker = runs.some((run) => run.marker);\n if (!hasGap && !hasMarker) return undefined;\n return { name: definition.name, segments: canvasDashSegments(runs, hasGap), runs, period };\n}\n\nexport function createDashedCadSegments(\n points: CadPoint2D[],\n closed: boolean,\n pattern: ResolvedCadLinePattern\n): Array<readonly [CadPoint2D, CadPoint2D]> {\n return createDashedCadPrimitives(points, closed, pattern).segments;\n}\n\n/**\n * Expands one CAD path while keeping the LTYPE phase continuous across every\n * polyline edge. DXF zero-length dots and unavailable complex SHX glyphs are\n * returned as screen-space marker points instead of sub-pixel GL_LINES.\n */\nexport function createDashedCadPrimitives(\n points: CadPoint2D[],\n closed: boolean,\n pattern: ResolvedCadLinePattern,\n maxPrimitives = DEFAULT_MAX_DASH_PRIMITIVES\n): CadDashedPrimitives {\n const valid = points.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n if (valid.length < 2 || pattern.runs.length === 0) return { segments: [], dots: [] };\n const edges: Array<readonly [CadPoint2D, CadPoint2D]> = [];\n for (let index = 0; index < valid.length - 1; index++) edges.push([valid[index], valid[index + 1]]);\n if (closed) edges.push([valid[valid.length - 1], valid[0]]);\n\n const finiteLimit = Number.isFinite(maxPrimitives) ? Math.max(1, Math.floor(maxPrimitives)) : DEFAULT_MAX_DASH_PRIMITIVES;\n const totalLength = edges.reduce((sum, [start, end]) => sum + Math.hypot(end.x - start.x, end.y - start.y), 0);\n const estimatedCycles = pattern.period > 1e-12 ? totalLength / pattern.period : Number.POSITIVE_INFINITY;\n const estimatedPrimitives = estimatedCycles * Math.max(1, pattern.runs.length);\n if (!Number.isFinite(estimatedPrimitives) || estimatedPrimitives > finiteLimit) {\n // A corrupt or microscopic pattern can otherwise expand one entity into\n // millions of allocations. Keeping the source edges visible is a safer\n // degradation than freezing the viewer or dropping the entity entirely.\n return { segments: edges, dots: [] };\n }\n\n const output: CadDashedPrimitives = { segments: [], dots: [] };\n let runIndex = 0;\n let remaining = pattern.runs[0].length;\n let markerPending = true;\n const addDot = (point: CadPoint2D) => {\n const previous = output.dots[output.dots.length - 1];\n if (previous && Math.hypot(previous.x - point.x, previous.y - point.y) <= 1e-10) return;\n output.dots.push(point);\n };\n const advance = () => {\n runIndex = (runIndex + 1) % pattern.runs.length;\n remaining = pattern.runs[runIndex].length;\n markerPending = true;\n };\n for (const [start, end] of edges) {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const length = Math.hypot(dx, dy);\n if (length <= 1e-14) continue;\n let offset = 0;\n while (offset < length - 1e-12) {\n let zeroRunCount = 0;\n while (remaining <= 1e-12 && zeroRunCount < pattern.runs.length) {\n const run = pattern.runs[runIndex];\n if (markerPending && run.marker) {\n const ratio = offset / length;\n addDot({ x: start.x + dx * ratio, y: start.y + dy * ratio });\n }\n advance();\n zeroRunCount++;\n }\n if (remaining <= 1e-12) break;\n const run = pattern.runs[runIndex];\n if (markerPending) {\n if (run.marker) {\n const ratio = offset / length;\n addDot({ x: start.x + dx * ratio, y: start.y + dy * ratio });\n }\n markerPending = false;\n }\n const take = Math.min(remaining, length - offset);\n if (run.draw && take > 1e-12) {\n const from = offset / length;\n const to = (offset + take) / length;\n output.segments.push([\n { x: start.x + dx * from, y: start.y + dy * from },\n { x: start.x + dx * to, y: start.y + dy * to }\n ]);\n }\n offset += take;\n remaining -= take;\n if (remaining <= 1e-12) {\n advance();\n }\n }\n }\n return output;\n}\n\nfunction patternRuns(definition: CadLineType, scale: number): ResolvedCadLinePatternRun[] {\n const out: ResolvedCadLinePatternRun[] = [];\n for (const element of definition.pattern) {\n const length = Number(element.length);\n const complex = Number(element.elementTypeFlag ?? 0) !== 0;\n if (!Number.isFinite(length)) continue;\n // Group 49 keeps its sign semantics even when group 74 attaches a shape\n // or text glyph: positive is a baseline dash, negative is a gap and zero\n // is a dot. The glyph is an additional marker, not a replacement dash.\n out.push({ draw: length >= 0, length: Math.abs(length) * scale, marker: length >= 0 && (length === 0 || complex) });\n }\n return out;\n}\n\nfunction canvasDashSegments(runs: ResolvedCadLinePatternRun[], hasGap: boolean): number[] {\n if (!hasGap) return [];\n const merged: Array<{ draw: boolean; length: number }> = [];\n for (const run of runs) {\n if (run.length <= 1e-12) continue;\n const previous = merged[merged.length - 1];\n if (previous?.draw === run.draw) previous.length += run.length;\n else merged.push({ draw: run.draw, length: run.length });\n }\n const segments: number[] = [];\n for (const run of merged) {\n const expectedDraw = segments.length % 2 === 0;\n if (run.draw !== expectedDraw) segments.push(1e-9);\n segments.push(run.length);\n }\n if (segments.length % 2 === 1) segments.push(1e-9);\n return segments;\n}\n\nfunction lookupLineType(document: CadDocument, reference: string): CadLineType | undefined {\n const key = refKey(reference);\n const lineTypes = document.lineTypes ?? {};\n return lineTypes[reference]\n ?? lineTypes[key]\n ?? Object.values(lineTypes).find((lineType) => refKey(lineType.name) === key || refKey(lineType.handle) === key);\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name]\n ?? document.layers[name.toLowerCase()]\n ?? Object.values(document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction finitePositive(value: unknown, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? number : fallback;\n}\n","import type { CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from './types';\n\nexport interface Matrix2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport const IDENTITY_MATRIX: Matrix2D = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n\nexport function multiplyMatrix(left: Matrix2D, right: Matrix2D): Matrix2D {\n return {\n a: left.a * right.a + left.c * right.b,\n b: left.b * right.a + left.d * right.b,\n c: left.a * right.c + left.c * right.d,\n d: left.b * right.c + left.d * right.d,\n e: left.a * right.e + left.c * right.f + left.e,\n f: left.b * right.e + left.d * right.f + left.f\n };\n}\n\nexport function translationMatrix(x: number, y: number): Matrix2D {\n return { a: 1, b: 0, c: 0, d: 1, e: x, f: y };\n}\n\nexport function rotationMatrix(angle: number): Matrix2D {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { a: c, b: s, c: -s, d: c, e: 0, f: 0 };\n}\n\nexport function scaleMatrix(x: number, y = x): Matrix2D {\n return { a: x, b: 0, c: 0, d: y, e: 0, f: 0 };\n}\n\nexport function transformPoint(point: CadPoint2D | CadPoint3D, matrix: Matrix2D): CadPoint3D {\n return {\n x: point.x * matrix.a + point.y * matrix.c + matrix.e,\n y: point.x * matrix.b + point.y * matrix.d + matrix.f,\n z: 'z' in point ? point.z : undefined\n };\n}\n\nexport function transformPathCommands(commands: CadPathCommand[] | undefined, matrix: Matrix2D): CadPathCommand[] | undefined {\n if (!commands) return undefined;\n return commands.map((command) => ({ cmd: command.cmd, points: command.points.map((p) => transformPoint(p, matrix)) }));\n}\n\nexport function matrixFromInsert(entity: CadEntity, basePoint: CadPoint3D = { x: 0, y: 0 }): Matrix2D {\n const insertion = entity.insertionPoint ?? { x: 0, y: 0 };\n const scaleValue = entity.scale;\n const sx = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.x ?? 1) : Number((entity as Record<string, unknown>).scaleX ?? 1);\n const sy = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.y ?? sx) : Number((entity as Record<string, unknown>).scaleY ?? sx);\n const rotation = Number(entity.rotation ?? 0);\n let matrix = translationMatrix(insertion.x, insertion.y);\n matrix = multiplyMatrix(matrix, rotationMatrix(Number.isFinite(rotation) ? rotation : 0));\n matrix = multiplyMatrix(matrix, scaleMatrix(Number.isFinite(sx) ? sx : 1, Number.isFinite(sy) ? sy : 1));\n matrix = multiplyMatrix(matrix, translationMatrix(-basePoint.x, -basePoint.y));\n return matrix;\n}\n\nexport function transformEntity(entity: CadEntity, matrix: Matrix2D): CadEntity {\n const clone: CadEntity = { ...entity };\n if (entity.startPoint) clone.startPoint = transformPoint(entity.startPoint, matrix);\n if (entity.endPoint) clone.endPoint = transformPoint(entity.endPoint, matrix);\n if (entity.center) clone.center = transformPoint(entity.center, matrix);\n if (entity.insertionPoint) clone.insertionPoint = transformPoint(entity.insertionPoint, matrix);\n if (entity.majorAxisEndPoint) {\n const origin = transformPoint({ x: 0, y: 0 }, matrix);\n const major = transformPoint(entity.majorAxisEndPoint, matrix);\n clone.majorAxisEndPoint = { x: major.x - origin.x, y: major.y - origin.y, z: major.z };\n }\n if (entity.vertices) clone.vertices = entity.vertices.map((p) => ({ ...transformPoint(p, matrix), bulge: p.bulge, startWidth: p.startWidth, endWidth: p.endWidth }));\n if (entity.points) clone.points = entity.points.map((p) => transformPoint(p, matrix));\n if (entity.controlPoints) clone.controlPoints = entity.controlPoints.map((p) => transformPoint(p, matrix));\n if (entity.fitPoints) clone.fitPoints = entity.fitPoints.map((p) => transformPoint(p, matrix));\n if (entity.attribs) clone.attribs = entity.attribs.map((attribute) => transformEntity(attribute, matrix));\n if (entity.commands) clone.commands = transformPathCommands(entity.commands, matrix);\n if (entity.loops) {\n clone.loops = entity.loops.map((loop) => ({\n ...loop,\n vertices: loop.vertices?.map((p) => transformPoint(p, matrix)),\n commands: transformPathCommands(loop.commands, matrix)\n }));\n }\n\n const scaleApprox = Math.sqrt(Math.abs(matrix.a * matrix.d - matrix.b * matrix.c));\n if (typeof entity.radius === 'number' && Number.isFinite(scaleApprox)) clone.radius = entity.radius * scaleApprox;\n const rotation = Math.atan2(matrix.b, matrix.a);\n const ellipseAnglesAreRelative = entity.kind === 'ellipse' || String(entity.type ?? '').toUpperCase() === 'ELLIPSE';\n if (Number.isFinite(rotation) && Math.abs(rotation) > 1e-14) {\n if (typeof entity.rotation === 'number' || entity.kind === 'text' || entity.kind === 'insert') {\n clone.rotation = Number(entity.rotation ?? 0) + rotation;\n }\n // ARC angles are WCS angles and rotate with the scene. ELLIPSE start/end\n // parameters are relative to majorAxisEndPoint, which was already rotated.\n if (!ellipseAnglesAreRelative && typeof entity.startAngle === 'number') clone.startAngle = entity.startAngle + rotation;\n if (!ellipseAnglesAreRelative && typeof entity.endAngle === 'number') clone.endAngle = entity.endAngle + rotation;\n }\n if (matrix.a * matrix.d - matrix.b * matrix.c < 0 && clone.vertices) {\n clone.vertices = clone.vertices.map((point) => ({ ...point, bulge: typeof point.bulge === 'number' ? -point.bulge : undefined }));\n }\n return clone;\n}\n\nexport function parseMatrix(value: string | null | undefined): Matrix2D | undefined {\n if (!value) return undefined;\n const numbers = value.match(/-?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?/g)?.map(Number) ?? [];\n if (numbers.length < 6) return undefined;\n const [a, b, c, d, e, f] = numbers;\n return { a, b, c, d, e, f };\n}\n","import type { CadDocument, CadSceneTransform2D } from './types';\nimport { IDENTITY_MATRIX, transformEntity } from './transform';\n\nconst isIdentity = (matrix: CadSceneTransform2D) => {\n return Math.abs(matrix.a - 1) < 1e-12\n && Math.abs(matrix.b) < 1e-12\n && Math.abs(matrix.c) < 1e-12\n && Math.abs(matrix.d - 1) < 1e-12\n && Math.abs(matrix.e) < 1e-9\n && Math.abs(matrix.f) < 1e-9;\n};\n\n/**\n * Produces the one normalized coordinate space consumed by bounds, both\n * renderers, overlay text and future hit testing. The parser-owned document is\n * left untouched so callers can still inspect original WCS coordinates.\n */\nexport function createCadSceneDocument(document: CadDocument): CadDocument {\n if (document.metadata.sceneTransformApplied === true) return document;\n if (document.savedView?.sceneTransformApplied === false) return document;\n const matrix = document.savedView?.sceneTransform ?? IDENTITY_MATRIX;\n if (isIdentity(matrix)) return document;\n return {\n ...document,\n entities: document.entities.map((entity) => transformEntity(entity, matrix)),\n pages: document.pages?.map((page) => ({\n ...page,\n entities: page.entities.map((entity) => transformEntity(entity, matrix))\n })),\n metadata: {\n ...document.metadata,\n sceneTransformApplied: true\n }\n };\n}\n","import { applyByBlockColorInheritance, layerVisible, resolveCadColor, resolveFillColor, type CadColorContrastMode } from '../core/color';\nimport { arcPoints, boundsValid, bulgeToPolylinePoints, clamp, ellipsePoints, emptyBounds, includeCircle, includePoint, isFinitePoint, paddedBounds, stripMTextFormatting, xy } from '../core/geometry';\nimport { inferEntityKind, isCadPolylineClosed } from '../core/entity';\nimport { applyByBlockLineTypeInheritance, createDashedCadPrimitives, resolveCadLinePattern } from '../core/linetype';\nimport { createCadSceneDocument } from '../core/scene';\nimport { matrixFromInsert, transformEntity } from '../core/transform';\nimport type { CadBlock, CadBounds, CadDocument, CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from '../core/types';\n\nexport interface CanvasViewerOptions {\n background?: string;\n foreground?: string;\n showUnsupportedMarkers?: boolean;\n showImagePlaceholders?: boolean;\n showPageBounds?: boolean;\n minScale?: number;\n maxScale?: number;\n wheelZoomFactor?: number;\n trueColorByteOrder?: 'rgb' | 'bgr';\n maxInsertDepth?: number;\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n\n /** WebGL renderer: approximate curve tessellation cap for circles/arcs/ellipses. */\n maxCurveSegments?: number;\n /** WebGL renderer: target number of spatial cells across the longest drawing axis. */\n spatialIndexCellCount?: number;\n /** WebGL renderer: maximum vertices per GPU batch. Smaller values improve culling granularity. */\n maxVerticesPerBatch?: number;\n /** WebGL renderer: hide labels below this screen-space height. */\n textMinPixelHeight?: number;\n /** WebGL renderer: cap the number of labels drawn into the 2D overlay per frame. */\n maxVisibleTextLabels?: number;\n /** WebGL renderer: WebGL context power preference. */\n powerPreference?: WebGLPowerPreference;\n /** WebGL renderer: request antialiasing from the WebGL context. */\n antialias?: boolean;\n /** WebGL renderer: keep WebGL framebuffer pixels after rendering. Usually false for speed. */\n preserveDrawingBuffer?: boolean;\n /** WebGL renderer: use retained, spatially culled GPU batches. */\n enableSpatialIndex?: boolean;\n}\n\nexport interface ViewState {\n centerX: number;\n centerY: number;\n scale: number;\n}\n\nexport interface RenderStats {\n total: number;\n drawn: number;\n skipped: number;\n byType: Record<string, number>;\n unsupported: Record<string, number>;\n renderElapsedMs: number;\n /** Active renderer backend. */\n backend?: 'canvas2d' | 'webgl';\n /** Total retained GPU/CPU primitives after scene normalization. */\n primitiveCount?: number;\n /** Primitives submitted in the latest frame after viewport culling. */\n visiblePrimitiveCount?: number;\n /** Primitives skipped by viewport culling in the latest frame. */\n culledPrimitiveCount?: number;\n /** Estimated GPU buffer memory in bytes. */\n gpuMemoryBytes?: number;\n /** One-time retained scene build/upload time in milliseconds. */\n buildElapsedMs?: number;\n}\n\nexport interface ViewChangeEvent {\n view: ViewState;\n fitScale: number;\n zoomRatio: number;\n zoomPercent: number;\n bounds: CadBounds;\n}\n\nconst DEFAULT_OPTIONS: Required<CanvasViewerOptions> = {\n background: '#0b1020',\n foreground: '#ffffff',\n showUnsupportedMarkers: false,\n showImagePlaceholders: true,\n showPageBounds: true,\n minScale: 1e-9,\n maxScale: 1e9,\n wheelZoomFactor: 1.14,\n trueColorByteOrder: 'rgb',\n maxInsertDepth: 16,\n contrastMode: 'adaptive',\n minColorContrast: 2.4,\n maxCurveSegments: 96,\n spatialIndexCellCount: 72,\n maxVerticesPerBatch: 65536,\n textMinPixelHeight: 4,\n maxVisibleTextLabels: 2500,\n powerPreference: 'high-performance',\n antialias: true,\n preserveDrawingBuffer: false,\n enableSpatialIndex: true\n};\n\nexport class CadCanvasRenderer {\n readonly canvas: HTMLCanvasElement;\n private readonly ctx: CanvasRenderingContext2D;\n private readonly opts: Required<CanvasViewerOptions>;\n private sourceDocument?: CadDocument;\n private document?: CadDocument;\n private bounds: CadBounds = emptyBounds();\n private view: ViewState = { centerX: 0, centerY: 0, scale: 1 };\n private fitScale = 1;\n private dpr = 1;\n private isDragging = false;\n private lastPointer?: { x: number; y: number };\n private resizeObserver?: ResizeObserver;\n private imageCache = new Map<string, HTMLImageElement>();\n private stats: RenderStats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'canvas2d' };\n\n onStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n\n constructor(canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}) {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context is not available.');\n this.canvas = canvas;\n this.ctx = ctx;\n this.opts = { ...DEFAULT_OPTIONS, ...options };\n this.canvas.classList.add('cad-viewer-canvas');\n this.bindEvents();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(canvas);\n }\n this.resize();\n }\n\n destroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n clear(): void {\n this.sourceDocument = undefined;\n this.document = undefined;\n this.bounds = emptyBounds();\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n }\n\n setDocument(document: CadDocument): void {\n this.sourceDocument = document;\n this.document = createCadSceneDocument(document);\n this.bounds = this.computeBounds(this.document);\n this.fitToView();\n }\n\n getDocument(): CadDocument | undefined {\n return this.document;\n }\n\n getSourceDocument(): CadDocument | undefined { return this.sourceDocument; }\n\n setOptions(options: CanvasViewerOptions): void {\n Object.assign(this.opts, options);\n this.render();\n this.emitViewChange();\n }\n\n getOptions(): Required<CanvasViewerOptions> {\n return { ...this.opts };\n }\n\n fitToView(padding = 0.92): void {\n if (!boundsValid(this.bounds)) {\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n return;\n }\n const w = Math.max(1, this.cssWidth);\n const h = Math.max(1, this.cssHeight);\n const bw = Math.max(this.bounds.maxX - this.bounds.minX, 1e-9);\n const bh = Math.max(this.bounds.maxY - this.bounds.minY, 1e-9);\n const scale = this.clampScale(Math.min(w / bw, h / bh) * padding);\n this.fitScale = scale;\n this.view = {\n centerX: (this.bounds.minX + this.bounds.maxX) / 2,\n centerY: (this.bounds.minY + this.bounds.maxY) / 2,\n scale\n };\n this.render();\n this.emitViewChange();\n }\n\n resize(): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n const w = Math.max(1, Math.floor(this.cssWidth * this.dpr));\n const h = Math.max(1, Math.floor(this.cssHeight * this.dpr));\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w;\n this.canvas.height = h;\n }\n this.render();\n this.emitViewChange();\n }\n\n zoom(factor: number, anchor?: CadPoint2D): void {\n if (!Number.isFinite(factor) || factor <= 0) return;\n const point = anchor ?? { x: this.cssWidth / 2, y: this.cssHeight / 2 };\n const before = this.screenToWorld(point);\n this.view.scale = this.clampScale(this.view.scale * factor);\n const after = this.screenToWorld(point);\n this.view.centerX += before.x - after.x;\n this.view.centerY += before.y - after.y;\n this.render();\n this.emitViewChange();\n }\n\n zoomIn(): void { this.zoom(this.opts.wheelZoomFactor); }\n zoomOut(): void { this.zoom(1 / this.opts.wheelZoomFactor); }\n\n panByScreenDelta(dx: number, dy: number): void {\n if (!Number.isFinite(dx) || !Number.isFinite(dy)) return;\n this.view.centerX -= dx / this.view.scale;\n this.view.centerY += dy / this.view.scale;\n this.render();\n this.emitViewChange();\n }\n\n setViewState(view: ViewState): void {\n if (![view.centerX, view.centerY, view.scale].every(Number.isFinite)) throw new Error('Invalid view state.');\n this.view = { ...view, scale: this.clampScale(view.scale) };\n this.render();\n this.emitViewChange();\n }\n\n getViewState(): ViewState { return { ...this.view }; }\n getBounds(): CadBounds { return { ...this.bounds }; }\n getStats(): RenderStats { return cloneStats(this.stats); }\n getZoomRatio(): number { return Math.abs(this.fitScale) < 1e-12 ? 1 : this.view.scale / this.fitScale; }\n getZoomPercent(): number { return this.getZoomRatio() * 100; }\n\n worldToScreen(p: CadPoint2D): CadPoint2D {\n return {\n x: this.cssWidth / 2 + (p.x - this.view.centerX) * this.view.scale,\n y: this.cssHeight / 2 - (p.y - this.view.centerY) * this.view.scale\n };\n }\n\n screenToWorld(p: CadPoint2D): CadPoint2D {\n return {\n x: this.view.centerX + (p.x - this.cssWidth / 2) / this.view.scale,\n y: this.view.centerY - (p.y - this.cssHeight / 2) / this.view.scale\n };\n }\n\n render(): RenderStats {\n const started = performance.now();\n this.stats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'canvas2d' };\n this.clearCanvas();\n if (this.document) {\n if (this.opts.showPageBounds && this.document.pages?.length) this.drawPageBounds(this.document);\n for (const entity of this.document.entities) this.drawEntityTracked(entity, 0);\n }\n this.stats.renderElapsedMs = performance.now() - started;\n this.onStats?.(this.getStats());\n return this.getStats();\n }\n\n private get cssWidth(): number { return this.canvas.clientWidth || 1; }\n private get cssHeight(): number { return this.canvas.clientHeight || 1; }\n\n private bindEvents(): void {\n this.canvas.addEventListener('wheel', (ev) => {\n ev.preventDefault();\n const factor = ev.deltaY < 0 ? this.opts.wheelZoomFactor : 1 / this.opts.wheelZoomFactor;\n this.zoom(factor, { x: ev.offsetX, y: ev.offsetY });\n }, { passive: false });\n\n this.canvas.addEventListener('pointerdown', (ev) => {\n this.canvas.setPointerCapture(ev.pointerId);\n this.isDragging = true;\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n this.canvas.classList.add('is-dragging');\n });\n this.canvas.addEventListener('pointermove', (ev) => {\n if (!this.isDragging || !this.lastPointer) return;\n this.panByScreenDelta(ev.clientX - this.lastPointer.x, ev.clientY - this.lastPointer.y);\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n });\n const stopDrag = (ev?: PointerEvent) => {\n if (ev && this.canvas.hasPointerCapture(ev.pointerId)) this.canvas.releasePointerCapture(ev.pointerId);\n this.isDragging = false;\n this.lastPointer = undefined;\n this.canvas.classList.remove('is-dragging');\n };\n this.canvas.addEventListener('pointerup', stopDrag);\n this.canvas.addEventListener('pointercancel', () => stopDrag());\n }\n\n private clearCanvas(): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.clearRect(0, 0, this.cssWidth, this.cssHeight);\n ctx.fillStyle = this.opts.background;\n ctx.fillRect(0, 0, this.cssWidth, this.cssHeight);\n ctx.restore();\n }\n\n private drawPageBounds(document: CadDocument): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.strokeStyle = 'rgba(148, 163, 184, 0.35)';\n ctx.lineWidth = 1;\n ctx.setLineDash([8, 6]);\n for (const page of document.pages ?? []) {\n const a = this.worldToScreen({ x: 0, y: 0 });\n const b = this.worldToScreen({ x: page.width, y: page.height });\n ctx.strokeRect(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n }\n ctx.restore();\n }\n\n private drawEntityTracked(entity: CadEntity, depth: number): void {\n this.stats.total++;\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n this.stats.byType[type] = (this.stats.byType[type] ?? 0) + 1;\n const layer = this.lookupLayer(entity.layer);\n if (entity.isVisible === false || !layerVisible(layer)) {\n this.stats.skipped++;\n return;\n }\n this.drawEntity(entity, type, depth);\n }\n\n private drawEntity(entity: CadEntity, type: string, depth: number): void {\n const kind = entity.kind ?? inferEntityKind(type);\n switch (kind) {\n case 'line': return this.drawLine(entity);\n case 'circle': return this.drawCircle(entity);\n case 'arc': return this.drawArc(entity);\n case 'polyline': return this.drawPolyline(entity);\n case 'ellipse': return this.drawEllipse(entity);\n case 'text': return this.drawText(entity);\n case 'point': return this.drawPoint(entity);\n case 'insert': return this.drawInsert(entity, depth);\n case 'solid': return this.drawSolid(entity);\n case 'hatch': return this.drawHatch(entity);\n case 'spline': return this.drawSpline(entity);\n case 'path': return this.drawPath(entity);\n case 'image': return this.drawImage(entity);\n case 'viewport': return this.markSkipped(type);\n default:\n this.stats.unsupported[type] = (this.stats.unsupported[type] ?? 0) + 1;\n this.stats.skipped++;\n if (this.opts.showUnsupportedMarkers) this.drawUnsupportedMarker(entity);\n }\n }\n\n private beginStyledPath(entity: CadEntity, fill = false, applyLinePattern = true): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n const color = resolveCadColor(entity, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n const fillColor = resolveFillColor(entity, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast }) ?? color;\n ctx.strokeStyle = color;\n ctx.fillStyle = fill ? fillColor : color;\n ctx.globalAlpha = clamp(Number(entity.opacity ?? 1), 0, 1);\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n const lw = typeof entity.lineweight === 'number' && entity.lineweight > 0 ? entity.lineweight : 0;\n ctx.lineWidth = Math.max(1, Math.min(12, lw > 0 ? lw / 30 : 1));\n const linePattern = applyLinePattern ? resolveCadLinePattern(entity, this.document) : undefined;\n ctx.setLineDash(linePattern\n ? linePattern.segments.map((length) => Math.max(0.05, length * this.view.scale))\n : []);\n ctx.beginPath();\n }\n\n private finishStroke(): void { this.ctx.stroke(); this.ctx.restore(); this.stats.drawn++; }\n private finishFillStroke(fill = false): void { if (fill) this.ctx.fill(); this.ctx.stroke(); this.ctx.restore(); this.stats.drawn++; }\n\n private drawLine(e: CadEntity): void {\n const start = e.startPoint;\n const end = e.endPoint;\n if (!isFinitePoint(start) || !isFinitePoint(end)) return this.markSkipped('LINE');\n this.strokeWorldPolyline(e, [start, end], false);\n }\n\n private drawCircle(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return this.markSkipped('CIRCLE');\n this.strokeWorldPolyline(e, arcPoints(xy(center), radius, 0, Math.PI * 2, true), true);\n }\n\n private drawArc(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n const startAngle = Number(e.startAngle);\n const endAngle = Number(e.endAngle);\n if (!isFinitePoint(center) || !Number.isFinite(radius) || !Number.isFinite(startAngle) || !Number.isFinite(endAngle)) return this.markSkipped('ARC');\n this.strokeWorldPolyline(e, arcPoints(xy(center), radius, startAngle, endAngle, true), false);\n }\n\n private drawPolyline(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as Array<CadPoint3D & { bulge?: number }> | undefined;\n if (!Array.isArray(vertices) || vertices.length < 2) return this.markSkipped(String(e.type));\n const closed = isCadPolylineClosed(e);\n const pts: CadPoint2D[] = [];\n const pairs = closed ? vertices.length : vertices.length - 1;\n for (let i = 0; i < pairs; i++) {\n const p1 = vertices[i];\n const p2 = vertices[(i + 1) % vertices.length];\n if (!isFinitePoint(p1) || !isFinitePoint(p2)) continue;\n const segment = bulgeToPolylinePoints(p1, p2, Number(p1.bulge ?? 0));\n if (pts.length > 0) segment.shift();\n pts.push(...segment);\n }\n this.strokeWorldPolyline(e, pts, closed);\n }\n\n private drawEllipse(e: CadEntity): void {\n const center = e.center;\n const major = e.majorAxisEndPoint;\n const ratio = Number(e.axisRatio ?? 1);\n if (!isFinitePoint(center) || !isFinitePoint(major)) return this.markSkipped('ELLIPSE');\n const pts = ellipsePoints(center, major, ratio, Number(e.startAngle ?? 0), Number(e.endAngle ?? Math.PI * 2));\n const closed = Math.abs(Number(e.endAngle ?? Math.PI * 2) - Number(e.startAngle ?? 0)) >= Math.PI * 2 - 1e-6;\n this.strokeWorldPolyline(e, pts, closed);\n }\n\n private drawPoint(e: CadEntity): void {\n const p = (e.point ?? e.location ?? e.center ?? e.insertionPoint) as CadPoint3D | undefined;\n if (!isFinitePoint(p)) return this.markSkipped('POINT');\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n this.ctx.moveTo(s.x - 3, s.y);\n this.ctx.lineTo(s.x + 3, s.y);\n this.ctx.moveTo(s.x, s.y - 3);\n this.ctx.lineTo(s.x, s.y + 3);\n this.finishStroke();\n }\n\n private drawText(e: CadEntity): void {\n const p = (e.insertionPoint ?? e.startPoint ?? e.center) as CadPoint3D | undefined;\n const text = stripMTextFormatting(String(e.text ?? e.value ?? ''));\n const height = Number(e.textHeight ?? e.height ?? 1);\n if (!isFinitePoint(p) || !text) return this.markSkipped(String(e.type));\n this.drawTextAt(e, p, text, height, Number(e.rotation ?? 0));\n }\n\n private drawInsert(e: CadEntity, depth: number): void {\n const block = this.lookupBlock(e.blockName ?? e.name);\n if (block && depth < this.opts.maxInsertDepth) {\n const matrix = matrixFromInsert(e, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) {\n const inheritedColor = applyByBlockColorInheritance(child, e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n const inherited = applyByBlockLineTypeInheritance(inheritedColor, e, this.document);\n this.drawEntityTracked(transformEntity(inherited, matrix), depth + 1);\n }\n return;\n }\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped('INSERT');\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n const r = 5;\n this.ctx.rect(s.x - r, s.y - r, r * 2, r * 2);\n this.finishStroke();\n if (Array.isArray(e.attribs)) for (const attr of e.attribs) this.drawText(attr);\n }\n\n private drawSolid(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as CadPoint3D[] | undefined;\n if (!Array.isArray(vertices) || vertices.length < 3) return this.markSkipped(String(e.type));\n this.beginStyledPath(e, true);\n const first = this.worldToScreen(vertices[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const vertex of vertices.slice(1)) {\n if (!isFinitePoint(vertex)) continue;\n const s = this.worldToScreen(vertex);\n this.ctx.lineTo(s.x, s.y);\n }\n this.ctx.closePath();\n this.finishFillStroke(true);\n }\n\n private drawHatch(e: CadEntity): void {\n const loops = e.loops;\n if (!Array.isArray(loops) || loops.length === 0) return this.markSkipped('HATCH');\n this.beginStyledPath(e, true);\n for (const loop of loops) {\n if (loop.commands?.length) this.addPathCommands(loop.commands);\n else if (loop.vertices?.length) {\n const first = this.worldToScreen(loop.vertices[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const p of loop.vertices.slice(1)) {\n const s = this.worldToScreen(p);\n this.ctx.lineTo(s.x, s.y);\n }\n this.ctx.closePath();\n }\n }\n this.finishFillStroke(Boolean(resolveFillColor(e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast })));\n }\n\n private drawSpline(e: CadEntity): void {\n const points = e.fitPoints?.length ? e.fitPoints : e.controlPoints;\n if (!points || points.length < 2) return this.markSkipped('SPLINE');\n // Lightweight preview: draw fit/control polygon. A full NURBS evaluator can be added behind this normalized entity.\n this.strokeWorldPolyline(e, points, Boolean(e.isClosed));\n }\n\n private drawPath(e: CadEntity): void {\n if (!e.commands?.length) return this.markSkipped(String(e.type));\n this.beginStyledPath(e, Boolean(e.fillColor));\n this.addPathCommands(e.commands);\n this.finishFillStroke(Boolean(e.fillColor));\n }\n\n private addPathCommands(commands: CadPathCommand[]): void {\n for (const command of commands) {\n if (command.cmd === 'M') {\n const p = this.worldToScreen(command.points[0]);\n this.ctx.moveTo(p.x, p.y);\n } else if (command.cmd === 'L') {\n const p = this.worldToScreen(command.points[0]);\n this.ctx.lineTo(p.x, p.y);\n } else if (command.cmd === 'C') {\n const [p1, p2, p3] = command.points.map((p) => this.worldToScreen(p));\n this.ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);\n } else if (command.cmd === 'Q') {\n const [p1, p2] = command.points.map((p) => this.worldToScreen(p));\n this.ctx.quadraticCurveTo(p1.x, p1.y, p2.x, p2.y);\n } else if (command.cmd === 'Z') this.ctx.closePath();\n }\n }\n\n private drawImage(e: CadEntity): void {\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped(String(e.type));\n const w = Number(e.width ?? 32);\n const h = Number(e.height ?? 32);\n const a = this.worldToScreen(p);\n const b = this.worldToScreen({ x: p.x + w, y: p.y - h });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.abs(b.x - a.x);\n const height = Math.abs(b.y - a.y);\n const src = e.imageDataUrl;\n if (src) {\n const image = this.getImage(src);\n if (image.complete && image.naturalWidth > 0) {\n this.ctx.save();\n this.ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.ctx.drawImage(image, x, y, width, height);\n this.ctx.restore();\n this.stats.drawn++;\n return;\n }\n image.onload = () => this.render();\n }\n if (!this.opts.showImagePlaceholders) return this.markSkipped(String(e.type));\n this.beginStyledPath(e);\n this.ctx.rect(x, y, width, height);\n this.ctx.moveTo(x, y); this.ctx.lineTo(x + width, y + height);\n this.ctx.moveTo(x + width, y); this.ctx.lineTo(x, y + height);\n this.finishStroke();\n }\n\n private getImage(src: string): HTMLImageElement {\n let image = this.imageCache.get(src);\n if (!image) {\n image = new Image();\n image.src = src;\n this.imageCache.set(src, image);\n }\n return image;\n }\n\n private drawUnsupportedMarker(e: CadEntity): void {\n const p = this.entityAnchor(e);\n if (!p) return;\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n this.ctx.moveTo(s.x - 4, s.y - 4);\n this.ctx.lineTo(s.x + 4, s.y + 4);\n this.ctx.moveTo(s.x + 4, s.y - 4);\n this.ctx.lineTo(s.x - 4, s.y + 4);\n this.finishStroke();\n }\n\n private drawTextAt(e: CadEntity, p: CadPoint2D, text: string, height: number, rotation: number): void {\n const ctx = this.ctx;\n const s = this.worldToScreen(p);\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.translate(s.x, s.y);\n ctx.rotate(-rotation);\n const pixelHeight = Math.max(4, Math.min(256, Math.abs(height) * this.view.scale));\n ctx.font = `${pixelHeight}px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.fillStyle = resolveCadColor(e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n ctx.globalAlpha = clamp(Number(e.opacity ?? 1), 0, 1);\n ctx.textBaseline = 'alphabetic';\n for (const [index, line] of text.split(/\\r?\\n/g).entries()) ctx.fillText(line, 0, index * pixelHeight * 1.22);\n ctx.restore();\n this.stats.drawn++;\n }\n\n private strokeWorldPolyline(e: CadEntity, points: CadPoint2D[], closed: boolean): void {\n const valid = points.filter(isFinitePoint);\n if (valid.length < 2) return this.markSkipped(String(e.type));\n const pattern = resolveCadLinePattern(e, this.document);\n if (pattern) {\n const primitives = createDashedCadPrimitives(valid, closed, pattern);\n this.beginStyledPath(e, false, false);\n for (const [start, end] of primitives.segments) {\n const a = this.worldToScreen(start);\n const b = this.worldToScreen(end);\n this.ctx.moveTo(a.x, a.y);\n this.ctx.lineTo(b.x, b.y);\n }\n this.ctx.stroke();\n if (primitives.dots.length > 0) {\n this.ctx.setLineDash([]);\n this.ctx.beginPath();\n const radius = Math.max(0.5, this.ctx.lineWidth / 2);\n for (const point of primitives.dots) {\n const screen = this.worldToScreen(point);\n this.ctx.moveTo(screen.x + radius, screen.y);\n this.ctx.arc(screen.x, screen.y, radius, 0, Math.PI * 2);\n }\n this.ctx.fillStyle = this.ctx.strokeStyle;\n this.ctx.fill();\n }\n this.ctx.restore();\n this.stats.drawn++;\n return;\n }\n this.beginStyledPath(e);\n const first = this.worldToScreen(valid[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const point of valid.slice(1)) {\n const s = this.worldToScreen(point);\n this.ctx.lineTo(s.x, s.y);\n }\n if (closed) this.ctx.closePath();\n this.finishStroke();\n }\n\n private markSkipped(type: string): void {\n this.stats.skipped++;\n this.stats.unsupported[type] = this.stats.unsupported[type] ?? 0;\n }\n\n private entityAnchor(e: CadEntity): CadPoint2D | undefined {\n for (const key of ['startPoint', 'insertionPoint', 'center', 'point', 'location']) {\n const p = e[key];\n if (isFinitePoint(p)) return xy(p);\n }\n if (Array.isArray(e.vertices) && isFinitePoint(e.vertices[0])) return xy(e.vertices[0]);\n if (Array.isArray(e.commands) && e.commands.length) {\n const cmd = e.commands.find((item) => item.points.length > 0);\n if (cmd) return xy(cmd.points[0]);\n }\n return undefined;\n }\n\n private computeBounds(document: CadDocument): CadBounds {\n const bounds = emptyBounds();\n if (document.pages?.length) {\n for (const page of document.pages) {\n includePoint(bounds, { x: 0, y: 0 });\n includePoint(bounds, { x: page.width, y: page.height });\n }\n }\n for (const entity of document.entities) this.includeEntityBounds(bounds, entity, 0);\n return paddedBounds(bounds);\n }\n\n private includeEntityBounds(bounds: CadBounds, entity: CadEntity, depth: number): void {\n const type = String(entity.type ?? '').toUpperCase();\n const kind = entity.kind ?? inferEntityKind(type);\n if (kind === 'insert') {\n const block = this.lookupBlock(entity.blockName ?? entity.name);\n if (block && depth < this.opts.maxInsertDepth) {\n const matrix = matrixFromInsert(entity, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) this.includeEntityBounds(bounds, transformEntity(child, matrix), depth + 1);\n return;\n }\n }\n if (kind === 'line') {\n if (isFinitePoint(entity.startPoint)) includePoint(bounds, entity.startPoint);\n if (isFinitePoint(entity.endPoint)) includePoint(bounds, entity.endPoint);\n } else if (kind === 'circle' || kind === 'arc') {\n if (isFinitePoint(entity.center) && Number.isFinite(entity.radius)) includeCircle(bounds, entity.center, Number(entity.radius));\n } else if (kind === 'polyline' || kind === 'solid' || kind === 'spline') {\n for (const p of [...(entity.vertices ?? []), ...(entity.points ?? []), ...(entity.controlPoints ?? []), ...(entity.fitPoints ?? [])]) if (isFinitePoint(p)) includePoint(bounds, p);\n } else if (kind === 'ellipse') {\n if (isFinitePoint(entity.center) && isFinitePoint(entity.majorAxisEndPoint)) ellipsePoints(entity.center, entity.majorAxisEndPoint, Number(entity.axisRatio ?? 1), Number(entity.startAngle ?? 0), Number(entity.endAngle ?? Math.PI * 2)).forEach((p) => includePoint(bounds, p));\n } else if (kind === 'path') {\n for (const command of entity.commands ?? []) for (const p of command.points) includePoint(bounds, p);\n } else if (kind === 'hatch') {\n for (const loop of entity.loops ?? []) {\n for (const p of loop.vertices ?? []) includePoint(bounds, p);\n for (const command of loop.commands ?? []) for (const p of command.points) includePoint(bounds, p);\n }\n } else {\n const anchor = this.entityAnchor(entity);\n if (anchor) includePoint(bounds, anchor);\n }\n }\n\n private lookupLayer(name: string | undefined) {\n if (!this.document || !name) return undefined;\n return this.document.layers[name] ?? this.document.layers[name.toLowerCase()] ?? Object.values(this.document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n }\n\n private lookupBlock(name: string | undefined): CadBlock | undefined {\n if (!this.document || !name) return undefined;\n return this.document.blocks[name] ?? this.document.blocks[name.toLowerCase()] ?? Object.values(this.document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n }\n\n private clampScale(value: number): number {\n return Math.min(this.opts.maxScale, Math.max(this.opts.minScale, value));\n }\n\n private emitViewChange(): void {\n this.onViewChange?.({\n view: this.getViewState(),\n fitScale: this.fitScale,\n zoomRatio: this.getZoomRatio(),\n zoomPercent: this.getZoomPercent(),\n bounds: this.getBounds()\n });\n }\n}\n\nfunction cloneStats(stats: RenderStats): RenderStats {\n return {\n total: stats.total,\n drawn: stats.drawn,\n skipped: stats.skipped,\n byType: { ...stats.byType },\n unsupported: { ...stats.unsupported },\n renderElapsedMs: stats.renderElapsedMs,\n backend: stats.backend,\n primitiveCount: stats.primitiveCount,\n visiblePrimitiveCount: stats.visiblePrimitiveCount,\n culledPrimitiveCount: stats.culledPrimitiveCount,\n gpuMemoryBytes: stats.gpuMemoryBytes,\n buildElapsedMs: stats.buildElapsedMs\n };\n}\n","import { applyByBlockColorInheritance, layerVisible, resolveCadColor, resolveFillColor } from '../core/color';\nimport { arcPoints, boundsValid, bulgeToPolylinePoints, clamp, ellipsePoints, emptyBounds, includeCircle, includePoint, isFinitePoint, paddedBounds, stripMTextFormatting, xy } from '../core/geometry';\nimport { inferEntityKind, isCadPolylineClosed } from '../core/entity';\nimport { applyByBlockLineTypeInheritance, createDashedCadPrimitives, resolveCadLinePattern } from '../core/linetype';\nimport { createCadSceneDocument } from '../core/scene';\nimport { matrixFromInsert, transformEntity } from '../core/transform';\nimport type { CadBlock, CadBounds, CadDocument, CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from '../core/types';\nimport type { CanvasViewerOptions, RenderStats, ViewChangeEvent, ViewState } from './CadCanvasRenderer';\n\ntype GL = WebGLRenderingContext | WebGL2RenderingContext;\ntype GlMode = WebGLRenderingContext['LINES'] | WebGLRenderingContext['TRIANGLES'] | WebGLRenderingContext['POINTS'];\n\ntype RgbaBytes = [number, number, number, number];\n\ninterface CpuBatch {\n positions: Float32Array;\n colors: Uint8Array;\n bounds: CadBounds;\n primitiveCount: number;\n}\n\ninterface GpuBatch {\n positionBuffer: WebGLBuffer;\n colorBuffer: WebGLBuffer;\n vertexCount: number;\n primitiveCount: number;\n bounds: CadBounds;\n gpuBytes: number;\n}\n\ninterface TextItem {\n point: CadPoint2D;\n text: string;\n height: number;\n rotation: number;\n color: string;\n opacity: number;\n bounds: CadBounds;\n}\n\ninterface ImageItem {\n point: CadPoint2D;\n width: number;\n height: number;\n source?: string;\n color: string;\n opacity: number;\n bounds: CadBounds;\n}\n\ninterface CpuScene {\n origin: CadPoint2D;\n lineBatches: CpuBatch[];\n triangleBatches: CpuBatch[];\n lineTypePointBatches: CpuBatch[];\n pointBatches: CpuBatch[];\n textItems: TextItem[];\n imageItems: ImageItem[];\n stats: Omit<RenderStats, 'renderElapsedMs'>;\n primitiveCount: number;\n buildElapsedMs: number;\n}\n\ninterface GpuScene {\n origin: CadPoint2D;\n lineBatches: GpuBatch[];\n triangleBatches: GpuBatch[];\n lineTypePointBatches: GpuBatch[];\n pointBatches: GpuBatch[];\n textItems: TextItem[];\n imageItems: ImageItem[];\n stats: Omit<RenderStats, 'renderElapsedMs'>;\n primitiveCount: number;\n gpuMemoryBytes: number;\n buildElapsedMs: number;\n}\n\ninterface ProgramInfo {\n program: WebGLProgram;\n aPosition: number;\n aColor: number;\n uViewCenter: WebGLUniformLocation;\n uScale: WebGLUniformLocation;\n uViewport: WebGLUniformLocation;\n uPointSize: WebGLUniformLocation;\n}\n\nconst DEFAULT_WEBGL_OPTIONS: Required<CanvasViewerOptions> = {\n background: '#0b1020',\n foreground: '#ffffff',\n showUnsupportedMarkers: false,\n showImagePlaceholders: true,\n showPageBounds: true,\n minScale: 1e-9,\n maxScale: 1e9,\n wheelZoomFactor: 1.14,\n trueColorByteOrder: 'rgb',\n maxInsertDepth: 16,\n contrastMode: 'adaptive',\n minColorContrast: 2.4,\n maxCurveSegments: 96,\n spatialIndexCellCount: 72,\n maxVerticesPerBatch: 65536,\n textMinPixelHeight: 4,\n maxVisibleTextLabels: 2500,\n powerPreference: 'high-performance',\n antialias: true,\n preserveDrawingBuffer: false,\n enableSpatialIndex: true\n};\n\nexport class CadWebGLRenderer {\n readonly canvas: HTMLCanvasElement;\n readonly backend = 'webgl' as const;\n private readonly gl: GL;\n private readonly program: ProgramInfo;\n private readonly eventController = new AbortController();\n private readonly imageCache = new Map<string, HTMLImageElement>();\n private opts: Required<CanvasViewerOptions>;\n private sourceDocument?: CadDocument;\n private document?: CadDocument;\n private bounds: CadBounds = emptyBounds();\n private view: ViewState = { centerX: 0, centerY: 0, scale: 1 };\n private fitScale = 1;\n private dpr = 1;\n private isDragging = false;\n private lastPointer?: { x: number; y: number };\n private resizeObserver?: ResizeObserver;\n private overlayCanvas?: HTMLCanvasElement;\n private overlayCtx?: CanvasRenderingContext2D;\n private scene?: GpuScene;\n private stats: RenderStats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n private rafHandle = 0;\n\n onStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n\n constructor(canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}) {\n const gl = createWebGLContext(canvas, options);\n if (!gl) throw new Error('WebGL is not available. Use renderer: \"canvas2d\" to force the Canvas2D fallback.');\n this.canvas = canvas;\n this.gl = gl;\n this.program = createProgramInfo(gl);\n this.opts = { ...DEFAULT_WEBGL_OPTIONS, ...options };\n this.canvas.classList.add('cad-viewer-canvas', 'cad-viewer-webgl-canvas');\n this.createOverlayCanvas();\n this.bindEvents();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(canvas);\n }\n this.resize();\n }\n\n static isSupported(): boolean {\n return isWebGLAvailable();\n }\n\n destroy(): void {\n this.eventController.abort();\n this.resizeObserver?.disconnect();\n this.cancelScheduledRender();\n this.disposeScene();\n this.overlayCanvas?.remove();\n }\n\n clear(): void {\n this.sourceDocument = undefined;\n this.document = undefined;\n this.bounds = emptyBounds();\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.disposeScene();\n this.render();\n this.emitViewChange();\n }\n\n setDocument(document: CadDocument): void {\n this.sourceDocument = document;\n this.document = createCadSceneDocument(document);\n this.bounds = computeBounds(this.document, this.opts);\n this.disposeScene();\n const cpuScene = buildCpuScene(this.document, this.opts, this.bounds);\n this.scene = uploadScene(this.gl, cpuScene);\n this.stats = createStatsFromScene(this.scene, 0);\n this.fitToView();\n }\n\n getDocument(): CadDocument | undefined {\n return this.document;\n }\n\n getSourceDocument(): CadDocument | undefined { return this.sourceDocument; }\n\n setOptions(options: CanvasViewerOptions): void {\n const rebuildRequired = requiresSceneRebuild(this.opts, options);\n this.opts = { ...this.opts, ...options };\n if (rebuildRequired && (this.sourceDocument ?? this.document)) {\n this.setDocument(this.sourceDocument ?? this.document!);\n return;\n }\n this.render();\n this.emitViewChange();\n }\n\n getOptions(): Required<CanvasViewerOptions> {\n return { ...this.opts };\n }\n\n fitToView(padding = 0.92): void {\n if (!boundsValid(this.bounds)) {\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n return;\n }\n const w = Math.max(1, this.cssWidth);\n const h = Math.max(1, this.cssHeight);\n const bw = Math.max(this.bounds.maxX - this.bounds.minX, 1e-9);\n const bh = Math.max(this.bounds.maxY - this.bounds.minY, 1e-9);\n const scale = this.clampScale(Math.min(w / bw, h / bh) * padding);\n this.fitScale = scale;\n this.view = {\n centerX: (this.bounds.minX + this.bounds.maxX) / 2,\n centerY: (this.bounds.minY + this.bounds.maxY) / 2,\n scale\n };\n this.render();\n this.emitViewChange();\n }\n\n resize(): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n const w = Math.max(1, Math.floor(this.cssWidth * this.dpr));\n const h = Math.max(1, Math.floor(this.cssHeight * this.dpr));\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w;\n this.canvas.height = h;\n }\n this.resizeOverlay(w, h);\n this.render();\n this.emitViewChange();\n }\n\n zoom(factor: number, anchor?: CadPoint2D): void {\n if (!Number.isFinite(factor) || factor <= 0) return;\n const point = anchor ?? { x: this.cssWidth / 2, y: this.cssHeight / 2 };\n const before = this.screenToWorld(point);\n this.view.scale = this.clampScale(this.view.scale * factor);\n const after = this.screenToWorld(point);\n this.view.centerX += before.x - after.x;\n this.view.centerY += before.y - after.y;\n this.scheduleRender();\n this.emitViewChange();\n }\n\n zoomIn(): void { this.zoom(this.opts.wheelZoomFactor); }\n zoomOut(): void { this.zoom(1 / this.opts.wheelZoomFactor); }\n\n panByScreenDelta(dx: number, dy: number): void {\n if (!Number.isFinite(dx) || !Number.isFinite(dy)) return;\n this.view.centerX -= dx / this.view.scale;\n this.view.centerY += dy / this.view.scale;\n this.scheduleRender();\n this.emitViewChange();\n }\n\n setViewState(view: ViewState): void {\n if (![view.centerX, view.centerY, view.scale].every(Number.isFinite)) throw new Error('Invalid view state.');\n this.view = { ...view, scale: this.clampScale(view.scale) };\n this.render();\n this.emitViewChange();\n }\n\n getViewState(): ViewState { return { ...this.view }; }\n getBounds(): CadBounds { return { ...this.bounds }; }\n getStats(): RenderStats { return cloneStats(this.stats); }\n getZoomRatio(): number { return Math.abs(this.fitScale) < 1e-12 ? 1 : this.view.scale / this.fitScale; }\n getZoomPercent(): number { return this.getZoomRatio() * 100; }\n\n worldToScreen(p: CadPoint2D): CadPoint2D {\n return {\n x: this.cssWidth / 2 + (p.x - this.view.centerX) * this.view.scale,\n y: this.cssHeight / 2 - (p.y - this.view.centerY) * this.view.scale\n };\n }\n\n screenToWorld(p: CadPoint2D): CadPoint2D {\n return {\n x: this.view.centerX + (p.x - this.cssWidth / 2) / this.view.scale,\n y: this.view.centerY - (p.y - this.cssHeight / 2) / this.view.scale\n };\n }\n\n render(): RenderStats {\n this.cancelScheduledRender();\n return this.renderNow();\n }\n\n private renderNow(): RenderStats {\n const started = performance.now();\n const gl = this.gl;\n gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n const bg = cssToRgbaBytes(this.opts.background, [11, 16, 32, 255]);\n gl.clearColor(bg[0] / 255, bg[1] / 255, bg[2] / 255, bg[3] / 255);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n let visiblePrimitiveCount = 0;\n let culledPrimitiveCount = 0;\n const scene = this.scene;\n const visibleBounds = this.visibleWorldBounds();\n if (scene) {\n gl.useProgram(this.program.program);\n gl.uniform2f(this.program.uViewCenter, this.view.centerX - scene.origin.x, this.view.centerY - scene.origin.y);\n gl.uniform1f(this.program.uScale, this.view.scale * this.dpr);\n gl.uniform2f(this.program.uViewport, this.canvas.width, this.canvas.height);\n gl.uniform1f(this.program.uPointSize, Math.max(1, this.dpr));\n const lineCounts = this.drawBatches(scene.lineBatches, gl.LINES, visibleBounds);\n visiblePrimitiveCount += lineCounts.visible;\n culledPrimitiveCount += lineCounts.culled;\n const triangleCounts = this.drawBatches(scene.triangleBatches, gl.TRIANGLES, visibleBounds);\n visiblePrimitiveCount += triangleCounts.visible;\n culledPrimitiveCount += triangleCounts.culled;\n const lineTypePointCounts = this.drawBatches(scene.lineTypePointBatches, gl.POINTS, visibleBounds);\n visiblePrimitiveCount += lineTypePointCounts.visible;\n culledPrimitiveCount += lineTypePointCounts.culled;\n gl.uniform1f(this.program.uPointSize, Math.max(2, Math.min(12, 4 * this.dpr)));\n const pointCounts = this.drawBatches(scene.pointBatches, gl.POINTS, visibleBounds);\n visiblePrimitiveCount += pointCounts.visible;\n culledPrimitiveCount += pointCounts.culled;\n }\n\n this.renderOverlay(visibleBounds);\n const renderElapsedMs = performance.now() - started;\n this.stats = scene\n ? { ...scene.stats, renderElapsedMs, backend: 'webgl', primitiveCount: scene.primitiveCount, visiblePrimitiveCount, culledPrimitiveCount, gpuMemoryBytes: scene.gpuMemoryBytes, buildElapsedMs: scene.buildElapsedMs }\n : { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n this.onStats?.(this.getStats());\n return this.getStats();\n }\n\n private drawBatches(batches: GpuBatch[], mode: GlMode, visibleBounds: CadBounds): { visible: number; culled: number } {\n const gl = this.gl;\n let visible = 0;\n let culled = 0;\n for (const batch of batches) {\n if (!boundsIntersects(batch.bounds, visibleBounds)) {\n culled += batch.primitiveCount;\n continue;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, batch.positionBuffer);\n gl.enableVertexAttribArray(this.program.aPosition);\n gl.vertexAttribPointer(this.program.aPosition, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, batch.colorBuffer);\n gl.enableVertexAttribArray(this.program.aColor);\n gl.vertexAttribPointer(this.program.aColor, 4, gl.UNSIGNED_BYTE, true, 0, 0);\n gl.drawArrays(mode, 0, batch.vertexCount);\n visible += batch.primitiveCount;\n }\n return { visible, culled };\n }\n\n private scheduleRender(): void {\n if (this.rafHandle) return;\n this.rafHandle = window.requestAnimationFrame(() => {\n this.rafHandle = 0;\n this.renderNow();\n });\n }\n\n private cancelScheduledRender(): void {\n if (!this.rafHandle) return;\n window.cancelAnimationFrame(this.rafHandle);\n this.rafHandle = 0;\n }\n\n private renderOverlay(visibleBounds: CadBounds): void {\n const ctx = this.overlayCtx;\n const canvas = this.overlayCanvas;\n if (!ctx || !canvas) return;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.clearRect(0, 0, this.cssWidth, this.cssHeight);\n if (this.opts.showPageBounds && this.document?.pages?.length) this.drawPageBoundsOverlay(ctx);\n if (this.scene) {\n this.drawImagesOverlay(ctx, this.scene.imageItems, visibleBounds);\n this.drawTextOverlay(ctx, this.scene.textItems, visibleBounds);\n }\n ctx.restore();\n }\n\n private drawPageBoundsOverlay(ctx: CanvasRenderingContext2D): void {\n if (!this.document?.pages?.length) return;\n ctx.save();\n ctx.strokeStyle = 'rgba(148, 163, 184, 0.34)';\n ctx.lineWidth = 1;\n ctx.setLineDash([8, 6]);\n for (const page of this.document.pages) {\n const a = this.worldToScreen({ x: 0, y: 0 });\n const b = this.worldToScreen({ x: page.width, y: page.height });\n ctx.strokeRect(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n }\n ctx.restore();\n }\n\n private drawTextOverlay(ctx: CanvasRenderingContext2D, items: TextItem[], visibleBounds: CadBounds): void {\n const maxLabels = this.opts.maxVisibleTextLabels;\n let drawn = 0;\n for (const item of items) {\n if (drawn >= maxLabels) break;\n if (!boundsIntersects(item.bounds, visibleBounds)) continue;\n const pixelHeight = Math.abs(item.height) * this.view.scale;\n if (pixelHeight < this.opts.textMinPixelHeight) continue;\n const s = this.worldToScreen(item.point);\n if (s.x < -512 || s.y < -512 || s.x > this.cssWidth + 512 || s.y > this.cssHeight + 512) continue;\n ctx.save();\n ctx.translate(s.x, s.y);\n ctx.rotate(-item.rotation);\n const fontSize = Math.max(4, Math.min(256, pixelHeight));\n ctx.font = `${fontSize}px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.fillStyle = item.color;\n ctx.globalAlpha = item.opacity;\n ctx.textBaseline = 'alphabetic';\n for (const [index, line] of item.text.split(/\\r?\\n/g).entries()) ctx.fillText(line, 0, index * fontSize * 1.22);\n ctx.restore();\n drawn++;\n }\n }\n\n private drawImagesOverlay(ctx: CanvasRenderingContext2D, items: ImageItem[], visibleBounds: CadBounds): void {\n for (const item of items) {\n if (!boundsIntersects(item.bounds, visibleBounds)) continue;\n const a = this.worldToScreen(item.point);\n const b = this.worldToScreen({ x: item.point.x + item.width, y: item.point.y - item.height });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.abs(b.x - a.x);\n const height = Math.abs(b.y - a.y);\n if (width < 1 || height < 1) continue;\n if (item.source) {\n const image = this.getImage(item.source);\n if (image.complete && image.naturalWidth > 0) {\n ctx.save();\n ctx.globalAlpha = item.opacity;\n ctx.drawImage(image, x, y, width, height);\n ctx.restore();\n continue;\n }\n image.onload = () => this.scheduleRender();\n }\n if (!this.opts.showImagePlaceholders) continue;\n ctx.save();\n ctx.strokeStyle = item.color;\n ctx.globalAlpha = item.opacity;\n ctx.lineWidth = 1;\n ctx.strokeRect(x, y, width, height);\n ctx.beginPath();\n ctx.moveTo(x, y); ctx.lineTo(x + width, y + height);\n ctx.moveTo(x + width, y); ctx.lineTo(x, y + height);\n ctx.stroke();\n ctx.restore();\n }\n }\n\n private getImage(src: string): HTMLImageElement {\n let image = this.imageCache.get(src);\n if (!image) {\n image = new Image();\n image.src = src;\n this.imageCache.set(src, image);\n }\n return image;\n }\n\n private createOverlayCanvas(): void {\n const parent = this.canvas.parentElement;\n if (!parent || typeof document === 'undefined') return;\n const style = window.getComputedStyle(parent);\n if (style.position === 'static') parent.style.position = 'relative';\n const overlay = document.createElement('canvas');\n overlay.className = 'cad-viewer-text-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n overlay.style.position = 'absolute';\n overlay.style.inset = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.pointerEvents = 'none';\n overlay.style.zIndex = '1';\n const ctx = overlay.getContext('2d');\n if (!ctx) return;\n parent.appendChild(overlay);\n this.overlayCanvas = overlay;\n this.overlayCtx = ctx;\n }\n\n private resizeOverlay(width: number, height: number): void {\n if (!this.overlayCanvas) return;\n if (this.overlayCanvas.width !== width || this.overlayCanvas.height !== height) {\n this.overlayCanvas.width = width;\n this.overlayCanvas.height = height;\n }\n }\n\n private bindEvents(): void {\n const signal = this.eventController.signal;\n this.canvas.addEventListener('wheel', (ev) => {\n ev.preventDefault();\n const factor = ev.deltaY < 0 ? this.opts.wheelZoomFactor : 1 / this.opts.wheelZoomFactor;\n this.zoom(factor, { x: ev.offsetX, y: ev.offsetY });\n }, { passive: false, signal });\n\n this.canvas.addEventListener('pointerdown', (ev) => {\n this.canvas.setPointerCapture(ev.pointerId);\n this.isDragging = true;\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n this.canvas.classList.add('is-dragging');\n }, { signal });\n\n this.canvas.addEventListener('pointermove', (ev) => {\n if (!this.isDragging || !this.lastPointer) return;\n this.panByScreenDelta(ev.clientX - this.lastPointer.x, ev.clientY - this.lastPointer.y);\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n }, { signal });\n\n const stopDrag = (ev?: PointerEvent) => {\n if (ev && this.canvas.hasPointerCapture(ev.pointerId)) this.canvas.releasePointerCapture(ev.pointerId);\n this.isDragging = false;\n this.lastPointer = undefined;\n this.canvas.classList.remove('is-dragging');\n };\n this.canvas.addEventListener('pointerup', stopDrag, { signal });\n this.canvas.addEventListener('pointercancel', () => stopDrag(), { signal });\n this.canvas.addEventListener('webglcontextlost', (ev) => {\n ev.preventDefault();\n this.cancelScheduledRender();\n }, { signal });\n }\n\n private visibleWorldBounds(): CadBounds {\n const halfW = this.cssWidth / Math.max(this.view.scale, 1e-12) / 2;\n const halfH = this.cssHeight / Math.max(this.view.scale, 1e-12) / 2;\n return {\n minX: this.view.centerX - halfW,\n maxX: this.view.centerX + halfW,\n minY: this.view.centerY - halfH,\n maxY: this.view.centerY + halfH\n };\n }\n\n private get cssWidth(): number { return this.canvas.clientWidth || 1; }\n private get cssHeight(): number { return this.canvas.clientHeight || 1; }\n\n private clampScale(value: number): number {\n return Math.min(this.opts.maxScale, Math.max(this.opts.minScale, value));\n }\n\n private disposeScene(): void {\n if (!this.scene) return;\n const gl = this.gl;\n for (const batch of [...this.scene.lineBatches, ...this.scene.triangleBatches, ...this.scene.lineTypePointBatches, ...this.scene.pointBatches]) {\n gl.deleteBuffer(batch.positionBuffer);\n gl.deleteBuffer(batch.colorBuffer);\n }\n this.scene = undefined;\n }\n\n private emitViewChange(): void {\n this.onViewChange?.({\n view: this.getViewState(),\n fitScale: this.fitScale,\n zoomRatio: this.getZoomRatio(),\n zoomPercent: this.getZoomPercent(),\n bounds: this.getBounds()\n });\n }\n}\n\nexport function isWebGLAvailable(): boolean {\n if (typeof document === 'undefined') return false;\n const canvas = document.createElement('canvas');\n return Boolean(canvas.getContext('webgl2') ?? canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl'));\n}\n\nfunction createWebGLContext(canvas: HTMLCanvasElement, options: CanvasViewerOptions): GL | undefined {\n const attributes: WebGLContextAttributes = {\n alpha: false,\n antialias: options.antialias ?? true,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: options.preserveDrawingBuffer ?? false,\n powerPreference: options.powerPreference ?? 'high-performance'\n };\n return (canvas.getContext('webgl2', attributes) as GL | null)\n ?? (canvas.getContext('webgl', attributes) as GL | null)\n ?? (canvas.getContext('experimental-webgl', attributes) as GL | null)\n ?? undefined;\n}\n\nfunction createProgramInfo(gl: GL): ProgramInfo {\n const vertexSource = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n uniform vec2 u_viewCenter;\n uniform float u_scale;\n uniform vec2 u_viewport;\n uniform float u_pointSize;\n varying vec4 v_color;\n void main() {\n vec2 screen = vec2(\n u_viewport.x * 0.5 + (a_position.x - u_viewCenter.x) * u_scale,\n u_viewport.y * 0.5 - (a_position.y - u_viewCenter.y) * u_scale\n );\n vec2 clip = vec2(screen.x / u_viewport.x * 2.0 - 1.0, 1.0 - screen.y / u_viewport.y * 2.0);\n gl_Position = vec4(clip, 0.0, 1.0);\n gl_PointSize = u_pointSize;\n v_color = a_color;\n }\n `;\n const fragmentSource = `\n precision mediump float;\n varying vec4 v_color;\n void main() {\n gl_FragColor = v_color;\n }\n `;\n const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) throw new Error('Failed to create WebGL program.');\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const message = gl.getProgramInfoLog(program) ?? 'Unknown WebGL program link error.';\n gl.deleteProgram(program);\n throw new Error(message);\n }\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n const uViewCenter = gl.getUniformLocation(program, 'u_viewCenter');\n const uScale = gl.getUniformLocation(program, 'u_scale');\n const uViewport = gl.getUniformLocation(program, 'u_viewport');\n const uPointSize = gl.getUniformLocation(program, 'u_pointSize');\n if (!uViewCenter || !uScale || !uViewport || !uPointSize) throw new Error('Failed to resolve WebGL shader uniforms.');\n return {\n program,\n aPosition: gl.getAttribLocation(program, 'a_position'),\n aColor: gl.getAttribLocation(program, 'a_color'),\n uViewCenter,\n uScale,\n uViewport,\n uPointSize\n };\n}\n\nfunction compileShader(gl: GL, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Failed to create WebGL shader.');\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const message = gl.getShaderInfoLog(shader) ?? 'Unknown WebGL shader compile error.';\n gl.deleteShader(shader);\n throw new Error(message);\n }\n return shader;\n}\n\nfunction uploadScene(gl: GL, cpu: CpuScene): GpuScene {\n let gpuMemoryBytes = 0;\n const upload = (items: CpuBatch[]): GpuBatch[] => items.map((item) => {\n const positionBuffer = createBuffer(gl, item.positions);\n const colorBuffer = createBuffer(gl, item.colors);\n const gpuBytes = item.positions.byteLength + item.colors.byteLength;\n gpuMemoryBytes += gpuBytes;\n return {\n positionBuffer,\n colorBuffer,\n vertexCount: item.positions.length / 2,\n primitiveCount: item.primitiveCount,\n bounds: item.bounds,\n gpuBytes\n };\n });\n const lineBatches = upload(cpu.lineBatches);\n const triangleBatches = upload(cpu.triangleBatches);\n const lineTypePointBatches = upload(cpu.lineTypePointBatches);\n const pointBatches = upload(cpu.pointBatches);\n return {\n origin: cpu.origin,\n lineBatches,\n triangleBatches,\n lineTypePointBatches,\n pointBatches,\n textItems: cpu.textItems,\n imageItems: cpu.imageItems,\n stats: cpu.stats,\n primitiveCount: cpu.primitiveCount,\n gpuMemoryBytes,\n buildElapsedMs: cpu.buildElapsedMs\n };\n}\n\nfunction createBuffer(gl: GL, data: Float32Array | Uint8Array): WebGLBuffer {\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error('Failed to create WebGL buffer.');\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data as unknown as BufferSource, gl.STATIC_DRAW);\n return buffer;\n}\n\nfunction buildCpuScene(document: CadDocument, opts: Required<CanvasViewerOptions>, bounds: CadBounds): CpuScene {\n const started = performance.now();\n const origin = boundsValid(bounds)\n ? { x: (bounds.minX + bounds.maxX) / 2, y: (bounds.minY + bounds.maxY) / 2 }\n : { x: 0, y: 0 };\n const builder = new CpuSceneBuilder(document, opts, bounds, origin);\n for (const entity of document.entities) builder.addEntityTracked(entity, 0);\n const scene = builder.finalize();\n scene.buildElapsedMs = performance.now() - started;\n return scene;\n}\n\nclass CpuSceneBuilder {\n private readonly lineBuckets = new Map<string, MutableBatch>();\n private readonly triangleBuckets = new Map<string, MutableBatch>();\n private readonly lineTypePointBuckets = new Map<string, MutableBatch>();\n private readonly pointBuckets = new Map<string, MutableBatch>();\n private readonly textItems: TextItem[] = [];\n private readonly imageItems: ImageItem[] = [];\n private readonly stats: Omit<RenderStats, 'renderElapsedMs'> = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n private readonly tileSize: number;\n private readonly maxVerticesPerBatch: number;\n private primitiveCount = 0;\n\n constructor(private readonly document: CadDocument, private readonly opts: Required<CanvasViewerOptions>, private readonly bounds: CadBounds, private readonly origin: CadPoint2D) {\n const width = boundsValid(bounds) ? Math.max(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY, 1e-9) : 1;\n this.tileSize = opts.enableSpatialIndex ? width / Math.max(8, opts.spatialIndexCellCount) : Number.POSITIVE_INFINITY;\n this.maxVerticesPerBatch = Math.max(4096, Math.floor(opts.maxVerticesPerBatch));\n }\n\n addEntityTracked(entity: CadEntity, depth: number): void {\n this.stats.total++;\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n this.stats.byType[type] = (this.stats.byType[type] ?? 0) + 1;\n const layer = this.lookupLayer(entity.layer);\n if (entity.isVisible === false || !layerVisible(layer)) {\n this.stats.skipped++;\n return;\n }\n this.addEntity(entity, type, depth);\n }\n\n finalize(): CpuScene {\n const lineBatches = finalizeMutableBatches(this.lineBuckets, this.maxVerticesPerBatch);\n const triangleBatches = finalizeMutableBatches(this.triangleBuckets, this.maxVerticesPerBatch);\n const lineTypePointBatches = finalizeMutableBatches(this.lineTypePointBuckets, this.maxVerticesPerBatch);\n const pointBatches = finalizeMutableBatches(this.pointBuckets, this.maxVerticesPerBatch);\n this.stats.primitiveCount = this.primitiveCount;\n return {\n origin: this.origin,\n lineBatches,\n triangleBatches,\n lineTypePointBatches,\n pointBatches,\n textItems: this.textItems,\n imageItems: this.imageItems,\n stats: this.stats,\n primitiveCount: this.primitiveCount,\n buildElapsedMs: 0\n };\n }\n\n private addEntity(entity: CadEntity, type: string, depth: number): void {\n const kind = entity.kind ?? inferEntityKind(type);\n switch (kind) {\n case 'line': return this.addLineEntity(entity);\n case 'circle': return this.addCircleEntity(entity);\n case 'arc': return this.addArcEntity(entity);\n case 'polyline': return this.addPolylineEntity(entity);\n case 'ellipse': return this.addEllipseEntity(entity);\n case 'text': return this.addTextEntity(entity);\n case 'point': return this.addPointEntity(entity);\n case 'insert': return this.addInsertEntity(entity, depth);\n case 'solid': return this.addSolidEntity(entity);\n case 'hatch': return this.addHatchEntity(entity);\n case 'spline': return this.addSplineEntity(entity);\n case 'path': return this.addPathEntity(entity);\n case 'image': return this.addImageEntity(entity);\n case 'viewport': return this.markSkipped(type);\n default:\n this.stats.unsupported[type] = (this.stats.unsupported[type] ?? 0) + 1;\n this.stats.skipped++;\n if (this.opts.showUnsupportedMarkers) this.addUnsupportedMarker(entity);\n }\n }\n\n private addLineEntity(e: CadEntity): void {\n if (!isFinitePoint(e.startPoint) || !isFinitePoint(e.endPoint)) return this.markSkipped('LINE');\n this.addPolyline([e.startPoint, e.endPoint], false, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addCircleEntity(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return this.markSkipped('CIRCLE');\n const segments = Math.max(16, Math.min(this.opts.maxCurveSegments, Math.ceil(Math.sqrt(Math.abs(radius)) * 12)));\n const pts = arcPoints(center, radius, 0, Math.PI * 2, true, segments);\n this.addPolyline(pts, true, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addArcEntity(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n const startAngle = Number(e.startAngle);\n const endAngle = Number(e.endAngle);\n if (!isFinitePoint(center) || !Number.isFinite(radius) || !Number.isFinite(startAngle) || !Number.isFinite(endAngle)) return this.markSkipped('ARC');\n this.addPolyline(arcPoints(center, radius, startAngle, endAngle, true, this.opts.maxCurveSegments), false, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addPolylineEntity(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as Array<CadPoint3D & { bulge?: number }> | undefined;\n if (!Array.isArray(vertices) || vertices.length < 2) return this.markSkipped(String(e.type));\n const closed = isCadPolylineClosed(e);\n const pts: CadPoint2D[] = [];\n const pairs = closed ? vertices.length : vertices.length - 1;\n for (let i = 0; i < pairs; i++) {\n const p1 = vertices[i];\n const p2 = vertices[(i + 1) % vertices.length];\n if (!isFinitePoint(p1) || !isFinitePoint(p2)) continue;\n const segment = bulgeToPolylinePoints(p1, p2, Number(p1.bulge ?? 0), Math.max(4, Math.min(24, this.opts.maxCurveSegments / 4)));\n if (pts.length > 0) segment.shift();\n pts.push(...segment);\n }\n if (pts.length < 2) return this.markSkipped(String(e.type));\n this.addPolyline(pts, closed, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addEllipseEntity(e: CadEntity): void {\n if (!isFinitePoint(e.center) || !isFinitePoint(e.majorAxisEndPoint)) return this.markSkipped('ELLIPSE');\n const pts = ellipsePoints(e.center, e.majorAxisEndPoint, Number(e.axisRatio ?? 1), Number(e.startAngle ?? 0), Number(e.endAngle ?? Math.PI * 2), this.opts.maxCurveSegments);\n const closed = Math.abs(Number(e.endAngle ?? Math.PI * 2) - Number(e.startAngle ?? 0)) >= Math.PI * 2 - 1e-6;\n this.addPolyline(pts, closed, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addTextEntity(e: CadEntity): void {\n const p = (e.insertionPoint ?? e.startPoint ?? e.center) as CadPoint3D | undefined;\n const text = stripMTextFormatting(String(e.text ?? e.value ?? ''));\n const height = Number(e.textHeight ?? e.height ?? 1);\n if (!isFinitePoint(p) || !text || !Number.isFinite(height)) return this.markSkipped(String(e.type));\n const point = xy(p);\n const approxWidth = Math.max(1, text.split(/\\r?\\n/g).reduce((max, line) => Math.max(max, line.length), 0)) * Math.abs(height) * 0.62;\n const approxHeight = Math.max(1, text.split(/\\r?\\n/g).length) * Math.abs(height) * 1.22;\n this.textItems.push({\n point,\n text,\n height,\n rotation: Number(e.rotation ?? 0),\n color: resolveCadColor(e, this.document, this.colorOptions()),\n opacity: clamp(Number(e.opacity ?? 1), 0, 1),\n bounds: { minX: point.x - approxWidth * 0.1, minY: point.y - approxHeight, maxX: point.x + approxWidth, maxY: point.y + approxHeight }\n });\n this.stats.drawn++;\n }\n\n private addPointEntity(e: CadEntity): void {\n const p = (e.point ?? e.location ?? e.center ?? e.insertionPoint) as CadPoint3D | undefined;\n if (!isFinitePoint(p)) return this.markSkipped('POINT');\n this.addPoint(p, this.strokeBytes(e));\n this.stats.drawn++;\n }\n\n private addInsertEntity(e: CadEntity, depth: number): void {\n const block = this.lookupBlock(e.blockName ?? e.name);\n if (block && depth < this.opts.maxInsertDepth) {\n const matrix = matrixFromInsert(e, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) {\n const inheritedColor = applyByBlockColorInheritance(child, e, this.document, this.colorOptions());\n const inherited = applyByBlockLineTypeInheritance(inheritedColor, e, this.document);\n this.addEntityTracked(transformEntity(inherited, matrix), depth + 1);\n }\n return;\n }\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped('INSERT');\n this.addPoint(p, this.strokeBytes(e));\n if (Array.isArray(e.attribs)) for (const attr of e.attribs) this.addTextEntity(attr);\n this.stats.drawn++;\n }\n\n private addSolidEntity(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as CadPoint3D[] | undefined;\n if (!Array.isArray(vertices) || vertices.length < 3) return this.markSkipped(String(e.type));\n const points = vertices.filter(isFinitePoint).map(xy);\n if (points.length < 3) return this.markSkipped(String(e.type));\n const fill = this.fillBytes(e) ?? this.strokeBytes(e);\n this.addTriangleFan(points, fill);\n this.addPolyline(points, true, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addHatchEntity(e: CadEntity): void {\n const loops = e.loops;\n if (!Array.isArray(loops) || loops.length === 0) return this.markSkipped('HATCH');\n const stroke = this.strokeBytes(e);\n const fill = this.fillBytes(e);\n let added = false;\n for (const loop of loops) {\n const points = loop.commands?.length ? flattenPathCommands(loop.commands, this.opts.maxCurveSegments) : (loop.vertices ?? []).filter(isFinitePoint).map(xy);\n if (points.length < 2) continue;\n this.addPolyline(points, true, stroke, e);\n if (fill && points.length >= 3) this.addTriangleFan(points, fill);\n added = true;\n }\n if (!added) return this.markSkipped('HATCH');\n this.stats.drawn++;\n }\n\n private addSplineEntity(e: CadEntity): void {\n const points = e.fitPoints?.length ? e.fitPoints : e.controlPoints;\n if (!points || points.length < 2) return this.markSkipped('SPLINE');\n this.addPolyline(points.filter(isFinitePoint).map(xy), Boolean(e.isClosed), this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addPathEntity(e: CadEntity): void {\n if (!e.commands?.length) return this.markSkipped(String(e.type));\n const points = flattenPathCommands(e.commands, this.opts.maxCurveSegments);\n if (points.length < 2) return this.markSkipped(String(e.type));\n this.addPolyline(points, false, this.strokeBytes(e), e);\n const fill = this.fillBytes(e);\n if (fill && points.length >= 3) this.addTriangleFan(points, fill);\n this.stats.drawn++;\n }\n\n private addImageEntity(e: CadEntity): void {\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped(String(e.type));\n const width = Number(e.width ?? 32);\n const height = Number(e.height ?? 32);\n if (!Number.isFinite(width) || !Number.isFinite(height)) return this.markSkipped(String(e.type));\n const point = xy(p);\n const bounds = boundsFromPoints([point, { x: point.x + width, y: point.y - height }]);\n this.imageItems.push({ point, width, height, source: e.imageDataUrl ?? e.imageSource, color: resolveCadColor(e, this.document, this.colorOptions()), opacity: clamp(Number(e.opacity ?? 1), 0, 1), bounds });\n this.stats.drawn++;\n }\n\n private addUnsupportedMarker(e: CadEntity): void {\n const p = entityAnchor(e);\n if (!p) return;\n this.addPoint(p, this.strokeBytes(e));\n }\n\n private addPolyline(points: CadPoint2D[], closed: boolean, color: RgbaBytes, entity?: CadEntity): void {\n const valid = points.filter(isFinitePoint).map(xy);\n if (valid.length < 2) return;\n const pattern = entity ? resolveCadLinePattern(entity, this.document) : undefined;\n if (pattern) {\n const primitives = createDashedCadPrimitives(valid, closed, pattern);\n for (const [start, end] of primitives.segments) this.addSegment(start, end, color);\n for (const point of primitives.dots) this.addLineTypePoint(point, color);\n return;\n }\n for (let i = 0; i < valid.length - 1; i++) this.addSegment(valid[i], valid[i + 1], color);\n if (closed) this.addSegment(valid[valid.length - 1], valid[0], color);\n }\n\n private addSegment(a: CadPoint2D, b: CadPoint2D, color: RgbaBytes): void {\n if (!isFinitePoint(a) || !isFinitePoint(b)) return;\n if (Math.hypot(a.x - b.x, a.y - b.y) <= 1e-14) return;\n const bucket = this.batchFor(this.lineBuckets, boundsFromPoints([a, b]));\n pushVertex(bucket, a, color, this.origin);\n pushVertex(bucket, b, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private addPoint(p: CadPoint2D, color: RgbaBytes): void {\n const bucket = this.batchFor(this.pointBuckets, pointBounds(p));\n pushVertex(bucket, p, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private addLineTypePoint(p: CadPoint2D, color: RgbaBytes): void {\n const bucket = this.batchFor(this.lineTypePointBuckets, pointBounds(p));\n pushVertex(bucket, p, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private addTriangleFan(points: CadPoint2D[], color: RgbaBytes): void {\n const valid = points.filter(isFinitePoint).map(xy);\n if (valid.length < 3) return;\n const bounds = boundsFromPoints(valid);\n const bucket = this.batchFor(this.triangleBuckets, bounds);\n for (let i = 1; i < valid.length - 1; i++) {\n pushVertex(bucket, valid[0], color, this.origin);\n pushVertex(bucket, valid[i], color, this.origin);\n pushVertex(bucket, valid[i + 1], color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n }\n\n private batchFor(buckets: Map<string, MutableBatch>, bounds: CadBounds): MutableBatch {\n const key = this.bucketKey(bounds);\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = createMutableBatch();\n buckets.set(key, bucket);\n }\n includePoint(bucket.bounds, { x: bounds.minX, y: bounds.minY });\n includePoint(bucket.bounds, { x: bounds.maxX, y: bounds.maxY });\n return bucket;\n }\n\n private bucketKey(bounds: CadBounds): string {\n if (!Number.isFinite(this.tileSize)) return 'all';\n const cx = (bounds.minX + bounds.maxX) / 2;\n const cy = (bounds.minY + bounds.maxY) / 2;\n const ix = Math.floor((cx - this.bounds.minX) / this.tileSize);\n const iy = Math.floor((cy - this.bounds.minY) / this.tileSize);\n return `${ix}:${iy}`;\n }\n\n private strokeBytes(e: CadEntity): RgbaBytes {\n return cssToRgbaBytes(resolveCadColor(e, this.document, this.colorOptions()), [255, 255, 255, 255], clamp(Number(e.opacity ?? 1), 0, 1));\n }\n\n private fillBytes(e: CadEntity): RgbaBytes | undefined {\n const color = resolveFillColor(e, this.document, this.colorOptions());\n return color ? cssToRgbaBytes(color, [255, 255, 255, 255], clamp(Number(e.opacity ?? 1), 0, 1)) : undefined;\n }\n\n private colorOptions() {\n return { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast };\n }\n\n private markSkipped(type: string): void {\n this.stats.skipped++;\n this.stats.unsupported[type] = this.stats.unsupported[type] ?? 0;\n }\n\n private lookupLayer(name: string | undefined) {\n if (!name) return undefined;\n return this.document.layers[name] ?? this.document.layers[name.toLowerCase()] ?? Object.values(this.document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n }\n\n private lookupBlock(name: string | undefined): CadBlock | undefined {\n if (!name) return undefined;\n return this.document.blocks[name] ?? this.document.blocks[name.toLowerCase()] ?? Object.values(this.document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n }\n}\n\ninterface MutableBatch {\n positions: number[];\n colors: number[];\n bounds: CadBounds;\n primitiveCount: number;\n}\n\nfunction createMutableBatch(): MutableBatch {\n return { positions: [], colors: [], bounds: emptyBounds(), primitiveCount: 0 };\n}\n\nfunction pushVertex(batch: MutableBatch, point: CadPoint2D, color: RgbaBytes, origin: CadPoint2D): void {\n batch.positions.push(point.x - origin.x, point.y - origin.y);\n batch.colors.push(color[0], color[1], color[2], color[3]);\n}\n\nfunction finalizeMutableBatches(map: Map<string, MutableBatch>, maxVerticesPerBatch: number): CpuBatch[] {\n const out: CpuBatch[] = [];\n for (const batch of map.values()) {\n const vertexCount = batch.positions.length / 2;\n if (vertexCount <= 0 || !boundsValid(batch.bounds)) continue;\n if (vertexCount <= maxVerticesPerBatch) {\n out.push({ positions: new Float32Array(batch.positions), colors: new Uint8Array(batch.colors), bounds: { ...batch.bounds }, primitiveCount: batch.primitiveCount });\n continue;\n }\n const primitiveSize = inferPrimitiveSize(batch);\n const verticesPerChunk = Math.max(primitiveSize, Math.floor(maxVerticesPerBatch / primitiveSize) * primitiveSize);\n for (let startVertex = 0; startVertex < vertexCount; startVertex += verticesPerChunk) {\n const endVertex = Math.min(vertexCount, startVertex + verticesPerChunk);\n const p = batch.positions.slice(startVertex * 2, endVertex * 2);\n const c = batch.colors.slice(startVertex * 4, endVertex * 4);\n const bounds = emptyBounds();\n for (let i = 0; i < p.length; i += 2) includePoint(bounds, { x: p[i], y: p[i + 1] });\n // Chunk bounds are local here; widen to parent batch bounds to avoid culling errors for split primitives.\n out.push({ positions: new Float32Array(p), colors: new Uint8Array(c), bounds: { ...batch.bounds }, primitiveCount: Math.floor((endVertex - startVertex) / primitiveSize) });\n }\n }\n return out;\n}\n\nfunction inferPrimitiveSize(batch: MutableBatch): 1 | 2 | 3 {\n const vertices = batch.positions.length / 2;\n if (vertices === batch.primitiveCount) return 1;\n if (vertices === batch.primitiveCount * 3) return 3;\n return 2;\n}\n\nfunction computeBounds(document: CadDocument, opts: Required<CanvasViewerOptions>): CadBounds {\n const bounds = emptyBounds();\n if (document.pages?.length) {\n for (const page of document.pages) {\n includePoint(bounds, { x: 0, y: 0 });\n includePoint(bounds, { x: page.width, y: page.height });\n }\n }\n const lookupBlock = (name: string | undefined): CadBlock | undefined => {\n if (!name) return undefined;\n return document.blocks[name] ?? document.blocks[name.toLowerCase()] ?? Object.values(document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n };\n const includeEntityBounds = (entity: CadEntity, depth: number): void => {\n const type = String(entity.type ?? '').toUpperCase();\n const kind = entity.kind ?? inferEntityKind(type);\n if (kind === 'insert') {\n const block = lookupBlock(entity.blockName ?? entity.name);\n if (block && depth < opts.maxInsertDepth) {\n const matrix = matrixFromInsert(entity, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) includeEntityBounds(transformEntity(child, matrix), depth + 1);\n return;\n }\n }\n if (kind === 'line') {\n if (isFinitePoint(entity.startPoint)) includePoint(bounds, entity.startPoint);\n if (isFinitePoint(entity.endPoint)) includePoint(bounds, entity.endPoint);\n } else if (kind === 'circle' || kind === 'arc') {\n if (isFinitePoint(entity.center) && Number.isFinite(entity.radius)) includeCircle(bounds, entity.center, Number(entity.radius));\n } else if (kind === 'polyline' || kind === 'solid' || kind === 'spline') {\n for (const p of [...(entity.vertices ?? []), ...(entity.points ?? []), ...(entity.controlPoints ?? []), ...(entity.fitPoints ?? [])]) if (isFinitePoint(p)) includePoint(bounds, p);\n } else if (kind === 'ellipse') {\n if (isFinitePoint(entity.center) && isFinitePoint(entity.majorAxisEndPoint)) ellipsePoints(entity.center, entity.majorAxisEndPoint, Number(entity.axisRatio ?? 1), Number(entity.startAngle ?? 0), Number(entity.endAngle ?? Math.PI * 2), opts.maxCurveSegments).forEach((p) => includePoint(bounds, p));\n } else if (kind === 'path') {\n for (const command of entity.commands ?? []) for (const p of command.points) includePoint(bounds, p);\n } else if (kind === 'hatch') {\n for (const loop of entity.loops ?? []) {\n for (const p of loop.vertices ?? []) includePoint(bounds, p);\n for (const command of loop.commands ?? []) for (const p of command.points) includePoint(bounds, p);\n }\n } else {\n const anchor = entityAnchor(entity);\n if (anchor) includePoint(bounds, anchor);\n }\n };\n for (const entity of document.entities) includeEntityBounds(entity, 0);\n return paddedBounds(bounds);\n}\n\nfunction flattenPathCommands(commands: CadPathCommand[], segments: number): CadPoint2D[] {\n const points: CadPoint2D[] = [];\n let current: CadPoint2D | undefined;\n let start: CadPoint2D | undefined;\n const push = (point: CadPoint2D) => {\n if (!points.length || Math.hypot(points[points.length - 1].x - point.x, points[points.length - 1].y - point.y) > 1e-12) points.push(xy(point));\n current = xy(point);\n };\n for (const command of commands) {\n if (command.cmd === 'M') {\n current = xy(command.points[0]);\n start = current;\n push(current);\n } else if (command.cmd === 'L') {\n push(command.points[0]);\n } else if (command.cmd === 'Q' && current && command.points.length >= 2) {\n const p0 = current;\n const [c, end] = command.points;\n const n = Math.max(4, Math.min(segments, 24));\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const mt = 1 - t;\n push({ x: mt * mt * p0.x + 2 * mt * t * c.x + t * t * end.x, y: mt * mt * p0.y + 2 * mt * t * c.y + t * t * end.y });\n }\n } else if (command.cmd === 'C' && current && command.points.length >= 3) {\n const p0 = current;\n const [c1, c2, end] = command.points;\n const n = Math.max(6, Math.min(segments, 32));\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const mt = 1 - t;\n push({\n x: mt ** 3 * p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t ** 3 * end.x,\n y: mt ** 3 * p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t ** 3 * end.y\n });\n }\n } else if (command.cmd === 'Z' && start) {\n push(start);\n }\n }\n return points;\n}\n\nfunction entityAnchor(e: CadEntity): CadPoint2D | undefined {\n for (const key of ['startPoint', 'insertionPoint', 'center', 'point', 'location']) {\n const p = e[key];\n if (isFinitePoint(p)) return xy(p);\n }\n if (Array.isArray(e.vertices) && isFinitePoint(e.vertices[0])) return xy(e.vertices[0]);\n if (Array.isArray(e.commands) && e.commands.length) {\n const cmd = e.commands.find((item) => item.points.length > 0);\n if (cmd) return xy(cmd.points[0]);\n }\n return undefined;\n}\n\nfunction boundsFromPoints(points: CadPoint2D[]): CadBounds {\n const bounds = emptyBounds();\n for (const point of points) includePoint(bounds, point);\n return bounds;\n}\n\nfunction pointBounds(point: CadPoint2D): CadBounds {\n return { minX: point.x, minY: point.y, maxX: point.x, maxY: point.y };\n}\n\nfunction boundsIntersects(a: CadBounds, b: CadBounds): boolean {\n return a.minX <= b.maxX && a.maxX >= b.minX && a.minY <= b.maxY && a.maxY >= b.minY;\n}\n\nfunction requiresSceneRebuild(current: Required<CanvasViewerOptions>, next: CanvasViewerOptions): boolean {\n return next.trueColorByteOrder !== undefined && next.trueColorByteOrder !== current.trueColorByteOrder\n || next.contrastMode !== undefined && next.contrastMode !== current.contrastMode\n || next.minColorContrast !== undefined && next.minColorContrast !== current.minColorContrast\n || next.foreground !== undefined && next.foreground !== current.foreground\n || next.background !== undefined && next.background !== current.background\n || next.maxInsertDepth !== undefined && next.maxInsertDepth !== current.maxInsertDepth\n || next.maxCurveSegments !== undefined && next.maxCurveSegments !== current.maxCurveSegments\n || next.spatialIndexCellCount !== undefined && next.spatialIndexCellCount !== current.spatialIndexCellCount\n || next.maxVerticesPerBatch !== undefined && next.maxVerticesPerBatch !== current.maxVerticesPerBatch\n || next.enableSpatialIndex !== undefined && next.enableSpatialIndex !== current.enableSpatialIndex;\n}\n\nfunction createStatsFromScene(scene: GpuScene, renderElapsedMs: number): RenderStats {\n return { ...scene.stats, renderElapsedMs, backend: 'webgl', primitiveCount: scene.primitiveCount, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: scene.gpuMemoryBytes, buildElapsedMs: scene.buildElapsedMs };\n}\n\nfunction cloneStats(stats: RenderStats): RenderStats {\n return {\n total: stats.total,\n drawn: stats.drawn,\n skipped: stats.skipped,\n byType: { ...stats.byType },\n unsupported: { ...stats.unsupported },\n renderElapsedMs: stats.renderElapsedMs,\n backend: stats.backend,\n primitiveCount: stats.primitiveCount,\n visiblePrimitiveCount: stats.visiblePrimitiveCount,\n culledPrimitiveCount: stats.culledPrimitiveCount,\n gpuMemoryBytes: stats.gpuMemoryBytes,\n buildElapsedMs: stats.buildElapsedMs\n };\n}\n\nfunction cssToRgbaBytes(value: string, fallback: RgbaBytes, opacity = 1): RgbaBytes {\n const text = value.trim().toLowerCase();\n let rgba: RgbaBytes | undefined;\n if (/^#[0-9a-f]{3}$/i.test(text)) {\n rgba = [parseInt(text[1] + text[1], 16), parseInt(text[2] + text[2], 16), parseInt(text[3] + text[3], 16), 255];\n } else if (/^#[0-9a-f]{6}$/i.test(text)) {\n rgba = [parseInt(text.slice(1, 3), 16), parseInt(text.slice(3, 5), 16), parseInt(text.slice(5, 7), 16), 255];\n } else {\n const match = text.match(/^rgba?\\(([^)]+)\\)$/i);\n if (match) {\n const raw = match[1].split(/[\\s,\\/]+/).filter(Boolean);\n const percent = raw.slice(0, 3).some((part) => part.includes('%'));\n const nums = raw.map((part) => Number(part.replace('%', '')));\n if (nums.length >= 3 && nums.slice(0, 3).every(Number.isFinite)) {\n rgba = [clampByte(percent ? nums[0] * 2.55 : nums[0]), clampByte(percent ? nums[1] * 2.55 : nums[1]), clampByte(percent ? nums[2] * 2.55 : nums[2]), clampByte((Number.isFinite(nums[3]) ? nums[3] : 1) * 255)];\n }\n }\n }\n const out = rgba ?? fallback;\n return [out[0], out[1], out[2], clampByte(out[3] * opacity)];\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n","import { createDefaultLoaderRegistry } from '../loaders';\nimport type { CadLoaderRegistry } from '../loaders/CadLoaderRegistry';\nimport { summarizeCadDocument } from '../core/entity';\nimport { isCadNativeRenderableLoader, type CadDocument, type CadLoadInput, type CadLoadOptions, type CadLoadProgress, type CadLoadResult, type CadLoader, type CadNativeRenderableLoader } from '../core/types';\nimport { CadCanvasRenderer, type CanvasViewerOptions, type RenderStats, type ViewChangeEvent } from './CadCanvasRenderer';\nimport { CadWebGLRenderer, isWebGLAvailable } from './CadWebGLRenderer';\n\nexport type CadViewerRendererBackend = 'auto' | 'webgl' | 'canvas2d';\nexport type CadRenderer = CadCanvasRenderer | CadWebGLRenderer;\n\nexport interface CadViewerOptions extends CadLoadOptions {\n container?: HTMLElement;\n canvas?: HTMLCanvasElement;\n /** Optional DOM host used by native format viewers such as dwf-viewer. */\n nativeHost?: HTMLElement;\n /** Rendering backend for normalized DWG/DXF scenes. `auto` uses WebGL when available and falls back to Canvas2D. */\n renderer?: CadViewerRendererBackend;\n canvasOptions?: CanvasViewerOptions;\n loaders?: CadLoader[];\n registry?: CadLoaderRegistry;\n autoFit?: boolean;\n onLoadStart?: (source: File | ArrayBuffer | Uint8Array | CadLoadInput) => void;\n onLoadProgress?: (progress: CadLoadProgress) => void;\n onLoad?: (result: CadViewerLoadResult) => void;\n onError?: (error: Error) => void;\n onRenderStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n}\n\nexport interface CadViewerLoadResult extends CadLoadResult {\n summary: ReturnType<typeof summarizeCadDocument>;\n fileName?: string;\n}\n\nexport class CadViewer {\n readonly canvas: HTMLCanvasElement;\n readonly renderer: CadRenderer;\n readonly registry: CadLoaderRegistry;\n readonly nativeHost?: HTMLElement;\n private readonly options: Required<Pick<CadViewerOptions, 'autoFit'>> & CadViewerOptions;\n private lastResult?: CadViewerLoadResult;\n private activeNativeLoader?: CadNativeRenderableLoader;\n\n constructor(options: CadViewerOptions = {}) {\n this.options = { autoFit: true, ...options };\n this.registry = options.registry ?? createDefaultLoaderRegistry(options);\n if (options.loaders) for (const loader of options.loaders) this.registry.register(loader);\n\n this.canvas = options.canvas ?? document.createElement('canvas');\n this.canvas.classList.add('cad-viewer-canvas');\n\n if (options.container) {\n options.container.classList.add('cad-viewer-container');\n if (!options.canvas) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.display = 'block';\n options.container.appendChild(this.canvas);\n }\n this.nativeHost = options.nativeHost ?? document.createElement('div');\n this.nativeHost.classList.add('cad-viewer-native-host');\n if (!options.nativeHost) options.container.appendChild(this.nativeHost);\n } else if (options.nativeHost) {\n this.nativeHost = options.nativeHost;\n this.nativeHost.classList.add('cad-viewer-native-host');\n } else if (options.canvas?.parentElement) {\n options.canvas.parentElement.classList.add('cad-viewer-container');\n const host = document.createElement('div');\n host.classList.add('cad-viewer-native-host');\n options.canvas.parentElement.appendChild(host);\n this.nativeHost = host;\n }\n\n this.renderer = createRenderer(options.renderer ?? 'auto', this.canvas, options.canvasOptions);\n this.renderer.onStats = (stats) => this.options.onRenderStats?.(stats);\n this.renderer.onViewChange = (event) => this.options.onViewChange?.(event);\n }\n\n registerLoader(loader: CadLoader): this {\n this.registry.register(loader);\n return this;\n }\n\n async loadFile(file: File, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(file);\n return this.loadThroughRegistry({ file, fileName: file.name }, options, file.name);\n }\n\n async loadBuffer(buffer: ArrayBuffer | Uint8Array, fileName?: string, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(buffer);\n return this.loadThroughRegistry({ buffer, fileName }, options, fileName);\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(input);\n return this.loadThroughRegistry(input, options, input.fileName ?? input.file?.name);\n }\n\n setDocument(document: CadDocument, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n const result: CadViewerLoadResult = {\n document,\n raw: document.raw,\n bytes: 0,\n elapsedMs: 0,\n format: document.format,\n warnings: document.warnings,\n summary: summarizeCadDocument(document),\n fileName\n };\n this.renderer.setDocument(document);\n if (!this.options.autoFit) this.renderer.render();\n this.lastResult = result;\n this.options.onLoad?.(result);\n return result;\n }\n\n fit(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.fit?.();\n else this.renderer.fitToView();\n }\n\n zoomIn(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomIn?.();\n else this.renderer.zoomIn();\n }\n\n zoomOut(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomOut?.();\n else this.renderer.zoomOut();\n }\n\n resize(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.resize?.();\n else this.renderer.resize();\n }\n\n setCanvasOptions(options: CanvasViewerOptions): void {\n this.options.canvasOptions = { ...(this.options.canvasOptions ?? {}), ...options };\n this.renderer.setOptions(options);\n if (this.activeNativeLoader) {\n this.activeNativeLoader.setNativeOptions?.({\n ...this.mergeLoadOptions({}),\n dwfBackground: options.background ?? this.options.dwfBackground\n });\n }\n }\n\n async preloadDwg(options: CadLoadOptions = {}): Promise<void> {\n const loader = this.registry.list().find((item) => item.id === 'dwg') as unknown as { preload?: (options?: CadLoadOptions) => Promise<void> } | undefined;\n if (!loader?.preload) throw new Error('The registered DWG loader does not support preload().');\n return loader.preload(this.mergeLoadOptions(options));\n }\n\n clear(): void {\n this.lastResult = undefined;\n this.deactivateNativeRenderer();\n this.renderer.clear();\n }\n\n destroy(): void {\n this.deactivateNativeRenderer();\n for (const loader of this.registry.list()) {\n const maybeDisposable = loader as unknown as { terminateWorker?: () => void; destroy?: () => void; unmount?: () => void };\n maybeDisposable.terminateWorker?.();\n maybeDisposable.unmount?.();\n maybeDisposable.destroy?.();\n }\n this.renderer.destroy();\n }\n\n getLoadResult(): CadViewerLoadResult | undefined { return this.lastResult; }\n getDocument(): CadDocument | undefined { return this.activeNativeLoader ? this.lastResult?.document : this.renderer.getDocument(); }\n getSourceDocument(): CadDocument | undefined { return this.activeNativeLoader ? this.lastResult?.document : this.renderer.getSourceDocument(); }\n getZoomPercent(): number { return this.activeNativeLoader ? 100 : this.renderer.getZoomPercent(); }\n isNativeRendererActive(): boolean { return Boolean(this.activeNativeLoader); }\n\n private async loadThroughRegistry(input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n try {\n const merged = this.mergeLoadOptions(options);\n throwIfAborted(merged.signal);\n const detected = await this.registry.detect(input);\n const normalizedInput: CadLoadInput = { ...input, buffer: detected.bytes };\n if (isCadNativeRenderableLoader(detected.loader)) {\n return await this.applyNativeLoadResult(detected.loader, normalizedInput, merged, fileName);\n }\n const result = await detected.loader.load(normalizedInput, merged);\n return this.applyLoadResult(result, fileName);\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n private applyLoadResult(result: CadLoadResult, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n this.options.onLoadProgress?.({ phase: 'render', format: result.format, message: 'Rendering normalized CAD scene…', percent: 96 });\n this.renderer.setDocument(result.document);\n if (!this.options.autoFit) this.renderer.render();\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.options.onLoad?.(value);\n return value;\n }\n\n private async applyNativeLoadResult(loader: CadNativeRenderableLoader, input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n if (!this.nativeHost) {\n throw new Error('Native DWF rendering requires CadViewerOptions.container, nativeHost, or a canvas parent element.');\n }\n throwIfAborted(options.signal);\n this.renderer.clear();\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = loader;\n this.canvas.style.display = 'none';\n this.nativeHost.classList.add('is-active');\n\n try {\n const result = await loader.mount(input, this.nativeHost, options);\n throwIfAborted(options.signal);\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.emitNativeRenderStats(result);\n this.options.onLoad?.(value);\n return value;\n } catch (error) {\n this.deactivateNativeRenderer();\n throw error;\n }\n }\n\n private deactivateNativeRenderer(): void {\n if (!this.activeNativeLoader && !this.nativeHost?.classList.contains('is-active')) {\n this.canvas.style.display = '';\n return;\n }\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = undefined;\n if (this.nativeHost) {\n this.nativeHost.classList.remove('is-active');\n this.nativeHost.replaceChildren();\n }\n this.canvas.style.display = '';\n }\n\n private emitNativeRenderStats(result: CadLoadResult): void {\n const metadata = result.document.metadata as { nativeRenderStats?: { backend?: string; commands?: number } };\n const commands = Number(metadata.nativeRenderStats?.commands ?? result.document.entities.length ?? 0);\n const backendText = String(metadata.nativeRenderStats?.backend ?? 'webgl');\n const backend: RenderStats['backend'] = backendText.includes('webgl') ? 'webgl' : 'canvas2d';\n this.options.onRenderStats?.({\n total: commands,\n drawn: commands,\n skipped: 0,\n byType: summarizeCadDocument(result.document).byType,\n unsupported: {},\n renderElapsedMs: result.elapsedMs,\n backend,\n primitiveCount: commands,\n visiblePrimitiveCount: commands,\n culledPrimitiveCount: 0,\n gpuMemoryBytes: undefined,\n buildElapsedMs: result.elapsedMs\n });\n }\n\n private mergeLoadOptions(options: CadLoadOptions): CadLoadOptions {\n const baseProgress = this.options.onProgress;\n const overrideProgress = options.onProgress;\n return {\n ...this.options,\n ...options,\n onProgress: (progress) => {\n this.options.onLoadProgress?.(progress);\n baseProgress?.(progress);\n if (overrideProgress && overrideProgress !== baseProgress) overrideProgress(progress);\n }\n };\n }\n}\n\nexport function createCadViewer(options: CadViewerOptions = {}): CadViewer {\n return new CadViewer(options);\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new DOMException('Loading cancelled.', 'AbortError');\n}\n\nfunction createRenderer(backend: CadViewerRendererBackend, canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}): CadRenderer {\n if (backend === 'canvas2d') return new CadCanvasRenderer(canvas, options);\n if (backend === 'webgl') return new CadWebGLRenderer(canvas, options);\n if (isWebGLAvailable()) {\n try {\n return new CadWebGLRenderer(canvas, options);\n } catch {\n // Fall through to Canvas2D. Some browsers report WebGL support but reject the actual context.\n }\n }\n return new CadCanvasRenderer(canvas, options);\n}\n","import { addBlock, addLayer, addLineType, createCadDocument, normalizeCadEntity, numberOrUndefined, pointFromUnknown, stringOrUndefined } from '../../core/entity';\nimport { exactArrayBuffer } from '../../core/format';\nimport { multiplyMatrix, rotationMatrix } from '../../core/transform';\nimport type { CadBlock, CadDocument, CadEntity, CadLayer, CadLineType, CadLoadOptions, CadLoadProgress, CadLoadResult, CadPoint3D, CadSavedView, CadSceneTransform2D } from '../../core/types';\nimport { readDwgVersion } from './dwgVersion';\n\ninterface LibreDwgModule {\n Dwg_File_Type?: Record<string, number>;\n LibreDwg?: {\n create(wasmPath?: string): Promise<any>;\n createByWasmInstance?(wasmInstance: any): any;\n };\n createModule?: (moduleArg?: Record<string, unknown>) => Promise<any>;\n}\n\nexport interface ParseDwgBytesOptions extends CadLoadOptions {\n sourceName?: string;\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nconst instances = new Map<string, Promise<any>>();\n\nexport async function parseDwgBytes(bytes: Uint8Array, options: ParseDwgBytesOptions = {}): Promise<CadLoadResult> {\n const started = performance.now();\n const sourceName = options.sourceName;\n options.onProgress?.({ phase: 'detect', format: 'dwg', message: 'Validating DWG header…', total: bytes.byteLength });\n\n const version = readDwgVersion(bytes);\n if (!version.signature.startsWith('AC')) {\n throw new Error(`Invalid DWG header: ${JSON.stringify(version.signature)}.`);\n }\n\n options.onProgress?.({ phase: 'wasm-init', format: 'dwg', message: 'Initializing LibreDWG WebAssembly…', total: bytes.byteLength });\n const lib = await createLibreDwg(options.wasmPath ?? '/wasm/');\n\n options.onProgress?.({ phase: 'parse', format: 'dwg', message: `Decoding ${version.signature} DWG…`, total: bytes.byteLength, percent: 35 });\n const fileContent = exactArrayBuffer(bytes);\n const fileType = lib.Dwg_File_Type?.DWG ?? 0;\n const dwg = lib.instance.dwg_read_data(fileContent, fileType);\n if (!dwg) throw new Error('LibreDWG returned an empty DWG result.');\n if (typeof dwg.error === 'number' && dwg.error !== 0) throw new Error(`LibreDWG parse error code: ${dwg.error}.`);\n\n options.onProgress?.({ phase: 'normalize', format: 'dwg', message: 'Normalizing DWG database…', total: bytes.byteLength, percent: 72 });\n const rawDb = typeof lib.instance.convert === 'function' ? lib.instance.convert(dwg) : dwg;\n try {\n if (typeof lib.instance.dwg_free === 'function') lib.instance.dwg_free(dwg);\n } catch {\n // Different wrapper versions manage native memory differently.\n }\n\n const document = normalizeDwgDatabase(rawDb, sourceName, version, { keepRaw: Boolean(options.keepRaw) });\n const elapsedMs = performance.now() - started;\n options.onProgress?.({ phase: 'done', format: 'dwg', message: 'DWG loaded.', total: bytes.byteLength, percent: 100, elapsedMs });\n return {\n document,\n raw: options.keepRaw ? rawDb : undefined,\n bytes: bytes.byteLength,\n elapsedMs,\n format: 'dwg',\n warnings: document.warnings\n };\n}\n\nexport async function createLibreDwg(wasmPath = '/wasm/'): Promise<{ module: LibreDwgModule; instance: any; Dwg_File_Type?: Record<string, number> }> {\n const normalizedPath = normalizeWasmPath(wasmPath);\n let promise = instances.get(normalizedPath);\n if (!promise) {\n promise = import('@mlightcad/libredwg-web').then(async (module) => {\n const typed = module as LibreDwgModule;\n const LibreDwg = typed.LibreDwg;\n if (!LibreDwg || typeof LibreDwg.create !== 'function') {\n throw new Error('@mlightcad/libredwg-web did not expose LibreDwg.create().');\n }\n\n try {\n // Load the WASM binary explicitly instead of relying on Emscripten's\n // streaming fetch. This makes deployments robust when a CDN returns\n // application/octet-stream, when the server lacks the application/wasm\n // MIME mapping, and, most importantly, lets us detect SPA fallback HTML\n // before the WebAssembly runtime aborts with a cryptic magic-word error.\n if (typeof typed.createModule === 'function' && typeof LibreDwg.createByWasmInstance === 'function') {\n const wasmUrl = getLibreDwgWasmUrl(normalizedPath);\n const wasmBinary = await fetchWasmBinary(wasmUrl);\n const wasmInstance = await typed.createModule({\n wasmBinary,\n locateFile: (filename: string) => new URL(filename, ensureTrailingSlash(normalizedPath)).href\n });\n return LibreDwg.createByWasmInstance(wasmInstance);\n }\n\n // Important: call the static method on the class object. The upstream\n // implementation uses `this.createByWasmInstance(...)`; extracting\n // `create` into a standalone function loses `this` and causes\n // \"Cannot read properties of undefined (reading 'createByWasmInstance')\".\n return await LibreDwg.create(normalizedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to initialize LibreDWG WebAssembly from ${normalizedPath}. Ensure libredwg-web.wasm is deployed at ${getLibreDwgWasmUrl(normalizedPath)} and wasmPath is resolved relative to the page, not the worker script. Run npm run copy:wasm before dev/build. Original error: ${message}`);\n }\n });\n instances.set(normalizedPath, promise);\n }\n const instance = await promise;\n const module = await import('@mlightcad/libredwg-web') as LibreDwgModule;\n return { module, instance, Dwg_File_Type: module.Dwg_File_Type };\n}\n\nexport function normalizeDwgDatabase(rawDb: unknown, sourceName?: string, version?: unknown, options: { keepRaw?: boolean } = {}): CadDocument {\n const record = rawDb && typeof rawDb === 'object' ? rawDb as Record<string, unknown> : {};\n const layers = extractLayers(record, options);\n const lineTypes = extractLineTypes(record, options);\n const blocks = extractBlocks(record, options);\n const header = normalizeHeader(record.header, version);\n const savedViewResult = extractSavedView(record, header);\n const savedView = savedViewResult.view;\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDwgEntity(item, normalizeOptions));\n\n const document = createCadDocument({\n format: 'dwg',\n sourceName,\n header,\n layers,\n lineTypes,\n blocks,\n entities,\n savedView,\n metadata: {\n parser: '@mlightcad/libredwg-web',\n parserMode: 'wasm',\n version,\n savedView\n },\n warnings: savedViewResult.warning ? [savedViewResult.warning] : [],\n raw: options.keepRaw ? rawDb : undefined\n });\n\n if (entities.length === 0) {\n document.warnings.push('DWG parsed successfully but no model-space entities were exposed by the converter. Check layout/paper-space content or unsupported proxy objects.');\n }\n const uniqueLineTypes = new Set(Object.values(lineTypes));\n if ([...uniqueLineTypes].some((lineType) => lineType.pattern.some((element) => Number(element.elementTypeFlag ?? 0) !== 0))) {\n document.warnings.push('Complex SHX linetype glyphs are preserved in the normalized LTYPE definition and rendered as a dash/dot approximation; embedded shape glyph fidelity is not available yet.');\n }\n return document;\n}\n\n\nfunction normalizeDwgEntity(record: Record<string, unknown>, options: { keepRaw?: boolean; includeUnknownProperties?: boolean }): CadEntity {\n const entity = normalizeCadEntity(record, undefined, { ...options, numericColorMode: 'rgb' });\n const rgb = numberOrUndefined(record.color);\n // @mlightcad/libredwg-web exposes DwgEntity.color as a 24-bit RGB value,\n // while DXF parsers commonly expose `color` as an ACI index. DWG normalization\n // must therefore preserve `color` as trueColor even for low RGB values such as\n // 0x0000ff; otherwise valid DWG colors are interpreted as ACI and many files\n // render as a single foreground color.\n if (rgb !== undefined && rgb >= 0 && rgb <= 0xffffff) {\n entity.color = rgb;\n entity.trueColor = rgb;\n }\n entity.colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber ?? record.aci) ?? entity.colorIndex;\n entity.colorName = stringOrUndefined(record.colorName ?? record.color_name) ?? entity.colorName;\n const flag = numberOrUndefined(record.flag ?? record.flags);\n if (flag !== undefined) entity.flag = flag;\n const type = String(record.type ?? record.entityType ?? '').toUpperCase();\n const classicPolyline = /^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D)$/.test(type);\n if (record.isClosed === true || record.closed === true || (classicPolyline && (Number(flag ?? 0) & 1) === 1)\n || (type === 'LWPOLYLINE' && (Number(flag ?? 0) & 0x200) === 0x200)) {\n entity.isClosed = true;\n }\n return entity;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction normalizeHeader(header: unknown, version: unknown): Record<string, unknown> {\n const result = header && typeof header === 'object' ? { ...(header as Record<string, unknown>) } : {};\n if (version) result.dwgVersion = version;\n return result;\n}\n\nfunction extractLayers(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const candidates: unknown[] = [];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n for (const key of ['LAYER', 'layer', 'layers']) {\n const value = rawDb[key] ?? tables?.[key];\n if (value) candidates.push(value);\n }\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.layerName ?? record.entryName);\n if (!name) continue;\n const colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber);\n const rawRgb = numberOrUndefined(record.trueColor ?? record.true_color ?? record.truecolor ?? record.colorRGB ?? record.colorRgb ?? record.rgbColor ?? record.rgb);\n const convertedRgb = numberOrUndefined(record.color);\n const useIndexedColor = isRenderableAci(colorIndex);\n const trueColor = rawRgb ?? (!useIndexedColor && convertedRgb !== undefined && convertedRgb >= 0 && convertedRgb <= 0xffffff ? convertedRgb : undefined);\n const layer: CadLayer = {\n name,\n color: useIndexedColor ? undefined : (record.color ?? record.colorName) as CadLayer['color'],\n colorIndex: colorIndex ?? (convertedRgb !== undefined && Math.abs(convertedRgb) <= 257 ? convertedRgb : undefined),\n trueColor,\n lineType: stringOrUndefined(record.lineType ?? record.linetype),\n lineweight: numberOrUndefined(record.lineweight ?? record.lineWeight),\n isVisible: record.isVisible === false || record.off === true || Number(colorIndex ?? record.color ?? 1) < 0 ? false : true,\n isFrozen: Boolean(record.isFrozen ?? record.frozen),\n isLocked: Boolean(record.isLocked ?? record.locked),\n raw: options.keepRaw ? record : undefined\n };\n addLayer(result, layer);\n }\n }\n return result;\n}\n\nfunction extractLineTypes(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadLineType> {\n const result: Record<string, CadLineType> = {};\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n const candidates = [rawDb.LTYPE, rawDb.ltype, rawDb.lineTypes, tables?.LTYPE, tables?.ltype, tables?.lineTypes];\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.lineTypeName ?? record.entryName);\n if (!name) continue;\n const rawPattern = Array.isArray(record.pattern)\n ? record.pattern\n : Array.isArray(record.dashes)\n ? record.dashes\n : [];\n const pattern = rawPattern.flatMap((entry) => {\n if (typeof entry === 'number') return [{ length: entry }];\n if (!entry || typeof entry !== 'object') return [];\n const part = entry as Record<string, unknown>;\n const length = numberOrUndefined(part.elementLength ?? part.length ?? part.dashLength);\n if (length === undefined) return [];\n const convertedShapeCode = numberOrUndefined(part.elementTypeFlag);\n const convertedTypeFlag = numberOrUndefined(part.shapeNumber);\n // @mlightcad/libredwg-web 0.7.x maps LibreDWG's internal names in the\n // opposite direction: complex_shapecode is DXF group 75 (shape number)\n // and shape_flag is group 74 (element type). Restore the public DXF\n // semantics here instead of leaking the converter mismatch downstream.\n const hasLibreDwgPair = convertedShapeCode !== undefined && convertedTypeFlag !== undefined;\n return [{\n length,\n elementTypeFlag: hasLibreDwgPair ? convertedTypeFlag : numberOrUndefined(part.typeFlag ?? part.elementTypeFlag),\n shapeNumber: hasLibreDwgPair ? convertedShapeCode : numberOrUndefined(part.shapeCode ?? part.shapeNumber),\n scale: numberOrUndefined(part.scale),\n rotation: numberOrUndefined(part.rotation),\n offsetX: numberOrUndefined(part.offsetX),\n offsetY: numberOrUndefined(part.offsetY),\n text: stringOrUndefined(part.text)\n }];\n });\n addLineType(result, {\n name,\n handle: stringOrUndefined(record.handle ?? record.id),\n description: stringOrUndefined(record.description),\n totalPatternLength: numberOrUndefined(record.totalPatternLength ?? record.patternLength),\n pattern,\n raw: options.keepRaw ? record : undefined\n });\n }\n }\n return result;\n}\n\nfunction extractSavedView(rawDb: Record<string, unknown>, header: Record<string, unknown>): { view?: CadSavedView; warning?: string } {\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n const vports = expandCandidate(rawDb.VPORT ?? rawDb.vports ?? tables?.VPORT ?? tables?.vports)\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object');\n const active = vports.find((record) => String(record.name ?? '').trim().toLowerCase() === '*active');\n const source = active ? 'vport' as const : 'header-ucs' as const;\n const record = active ?? header;\n const ucsOrigin = pointFromUnknown(record.ucsOrigin ?? record.UCSORG ?? header.UCSORG);\n const ucsXAxis = pointFromUnknown(record.ucsXAxis ?? record.UCSXDIR ?? header.UCSXDIR);\n const ucsYAxis = pointFromUnknown(record.ucsYAxis ?? record.UCSYDIR ?? header.UCSYDIR);\n const twistAngle = numberOrUndefined(record.viewTwistAngle ?? record.twistAngle ?? record.VIEWTWIST) ?? 0;\n const direction = pointFromUnknown(record.viewDirectionFromTarget ?? record.viewDirection ?? record.direction ?? record.VIEWDIR);\n const hasNonWorldUcs = !isWorldUcs(ucsOrigin, ucsXAxis, ucsYAxis);\n const hasViewData = Boolean(active)\n || Boolean(direction)\n || hasNonWorldUcs\n || Math.abs(twistAngle) > 1e-12;\n if (!hasViewData) return {};\n const planView = isPlanViewDirection(direction);\n const sceneTransform = planView\n ? createSavedViewTransform(ucsOrigin, ucsXAxis, ucsYAxis, twistAngle)\n : { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n const view: CadSavedView = {\n source,\n name: stringOrUndefined(record.name),\n handle: stringOrUndefined(record.handle),\n center: pointFromUnknown(record.center ?? record.VIEWCTR),\n target: pointFromUnknown(record.viewTarget ?? record.target ?? record.TARGET),\n direction,\n viewHeight: numberOrUndefined(record.viewHeight ?? record.height ?? record.VIEWSIZE),\n aspectRatio: numberOrUndefined(record.aspectRatio),\n twistAngle,\n ucsOrigin,\n ucsXAxis,\n ucsYAxis,\n sceneTransformApplied: planView,\n sceneTransform\n };\n return planView\n ? { view }\n : {\n view,\n warning: 'The saved CAD view has a missing, non-finite, or tilted VIEWDIR. File Viewer kept world coordinates instead of applying an unsafe 2D UCS/PLAN rotation.'\n };\n}\n\nfunction createSavedViewTransform(\n origin: CadPoint3D | undefined,\n rawXAxis: CadPoint3D | undefined,\n rawYAxis: CadPoint3D | undefined,\n twistAngle: number\n): CadSceneTransform2D {\n const xAxis = normalizePlanAxis(rawXAxis) ?? { x: 1, y: 0 };\n const yAxisCandidate = normalizePlanAxis(rawYAxis) ?? { x: -xAxis.y, y: xAxis.x };\n const projection = xAxis.x * yAxisCandidate.x + xAxis.y * yAxisCandidate.y;\n const orthogonalY = normalizePlanAxis({\n x: yAxisCandidate.x - xAxis.x * projection,\n y: yAxisCandidate.y - xAxis.y * projection\n }) ?? { x: -xAxis.y, y: xAxis.x };\n const base: CadSceneTransform2D = {\n a: xAxis.x,\n b: orthogonalY.x,\n c: xAxis.y,\n d: orthogonalY.y,\n e: origin ? -(origin.x * xAxis.x + origin.y * xAxis.y) : 0,\n f: origin ? -(origin.x * orthogonalY.x + origin.y * orthogonalY.y) : 0\n };\n return multiplyMatrix(rotationMatrix(Number.isFinite(twistAngle) ? twistAngle : 0), base);\n}\n\nfunction normalizePlanAxis(axis: CadPoint3D | undefined): { x: number; y: number } | undefined {\n if (!axis || Math.abs(Number(axis.z ?? 0)) > 1e-6) return undefined;\n const length = Math.hypot(axis.x, axis.y);\n if (!Number.isFinite(length) || length < 1e-12) return undefined;\n return { x: axis.x / length, y: axis.y / length };\n}\n\nfunction isPlanViewDirection(direction: CadPoint3D | undefined): boolean {\n if (!direction || !Number.isFinite(direction.x) || !Number.isFinite(direction.y) || !Number.isFinite(direction.z)) return false;\n const length = Math.hypot(direction.x, direction.y, Number(direction.z));\n if (!Number.isFinite(length) || length < 1e-12) return false;\n return Math.hypot(direction.x, direction.y) / length <= 1e-4\n && Math.abs(Number(direction.z)) / length >= 1 - 1e-8;\n}\n\nfunction isWorldUcs(\n origin: CadPoint3D | undefined,\n xAxis: CadPoint3D | undefined,\n yAxis: CadPoint3D | undefined\n): boolean {\n const close = (value: number | undefined, expected: number) => Number.isFinite(value) && Math.abs(Number(value) - expected) <= 1e-10;\n const originWorld = !origin || (close(origin.x, 0) && close(origin.y, 0) && close(origin.z ?? 0, 0));\n const xWorld = !xAxis || (close(xAxis.x, 1) && close(xAxis.y, 0) && close(xAxis.z ?? 0, 0));\n const yWorld = !yAxis || (close(yAxis.x, 0) && close(yAxis.y, 1) && close(yAxis.z ?? 0, 0));\n return originWorld && xWorld && yWorld;\n}\n\nfunction extractBlocks(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const candidates: unknown[] = [rawDb.blocks, rawDb.blockHeaders, rawDb.block_records, rawDb.blockRecords];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n candidates.push(tables?.BLOCK, tables?.BLOCK_RECORD, tables?.blocks);\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.blockName ?? record.name2);\n if (!name) continue;\n const rawEntities = Array.isArray(record.entities) ? record.entities : Array.isArray(record.ownedObjects) ? record.ownedObjects : [];\n const entities: CadEntity[] = rawEntities\n .filter((entry): entry is Record<string, unknown> => !!entry && typeof entry === 'object')\n .map((entry) => normalizeDwgEntity(entry, normalizeOptions));\n addBlock(result, {\n name,\n basePoint: pointFromUnknown(record.basePoint ?? record.origin) ?? { x: 0, y: 0 },\n entities,\n raw: options.keepRaw ? record : undefined\n });\n }\n }\n return result;\n}\n\nfunction expandCandidate(candidate: unknown): unknown[] {\n if (!candidate) return [];\n if (Array.isArray(candidate)) return candidate;\n if (typeof candidate !== 'object') return [];\n const record = candidate as Record<string, unknown>;\n const directValues = Object.values(record).filter((value) => value && typeof value === 'object');\n const arrays = ['entries', 'records', 'items', 'values', 'layers', 'blocks'].flatMap((key) => Array.isArray(record[key]) ? record[key] as unknown[] : []);\n if (arrays.length > 0) return arrays;\n return directValues;\n}\n\nfunction normalizeWasmPath(wasmPath: string): string {\n const trimmed = wasmPath.trim() || '/wasm';\n if (trimmed === '/') return getRuntimeOrigin();\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, '');\n if (isAbsoluteUrl(withoutTrailingSlash)) return withoutTrailingSlash;\n if (withoutTrailingSlash.startsWith('/')) return `${getRuntimeOrigin()}${withoutTrailingSlash}`;\n return new URL(withoutTrailingSlash, getRuntimeBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction getLibreDwgWasmUrl(wasmPath: string): string {\n return new URL('libredwg-web.wasm', ensureTrailingSlash(wasmPath)).href;\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n\nfunction getRuntimeBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getRuntimeOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getRuntimeBaseUrl()).origin;\n}\n\nasync function fetchWasmBinary(url: string): Promise<Uint8Array> {\n if (typeof fetch !== 'function') {\n throw new Error('fetch() is not available, so the LibreDWG WASM binary cannot be loaded.');\n }\n\n const response = await fetch(url, { credentials: 'same-origin', cache: 'force-cache' });\n if (!response.ok) {\n throw new Error(`WASM asset request failed with HTTP ${response.status} for ${url}.`);\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (!hasWasmMagic(bytes)) {\n const preview = decodeAsciiPreview(bytes);\n const contentType = response.headers.get('content-type') ?? 'unknown content-type';\n throw new Error(`Invalid WASM asset at ${url}. Expected bytes 00 61 73 6d, got ${formatFirstBytes(bytes)} (${contentType}). The server probably returned an HTML fallback page instead of libredwg-web.wasm. Response preview: ${preview}`);\n }\n\n return bytes;\n}\n\nfunction hasWasmMagic(bytes: Uint8Array): boolean {\n return bytes.length >= 4 && bytes[0] === 0x00 && bytes[1] === 0x61 && bytes[2] === 0x73 && bytes[3] === 0x6d;\n}\n\nfunction formatFirstBytes(bytes: Uint8Array): string {\n return Array.from(bytes.slice(0, 4)).map((byte) => byte.toString(16).padStart(2, '0')).join(' ');\n}\n\nfunction decodeAsciiPreview(bytes: Uint8Array): string {\n const text = Array.from(bytes.slice(0, 32))\n .map((byte) => byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : '.')\n .join('');\n return JSON.stringify(text);\n}\n"],"names":["readInputBytes","input","exactArrayBuffer","bytes","extensionOf","name","_a","index","detectCadFormat","ext","sig","ascii","head","b","CadLoaderRegistry","loaders","__publicField","loader","item","loaderId","format","direct","fallback","options","DEFAULT_DWG_WORKER_URL","DwgWorkerClient","supportsDwgWorker","worker","requestId","timeout","fileName","transferBuffer","prepareTransferBuffer","_b","resolve","reject","createAbortError","pending","serializeOptions","error","cleanupPending","createWorker","event","message","resolveWorkerUrl","resolveWasmPathForWorker","wasmPath","candidate","getPageOrigin","isAbsoluteUrl","getPageBaseUrl","workerUrl","value","DwgLoader","defaults","merged","sourceName","isAbortError","normalizeWorkerError","createCadDocument","init","inferEntityKind","type","normalizeCadEntity","raw","forcedType","entity","stringOrUndefined","numberOrUndefined","explicitClosed","typeUsesClassicPolylineFlag","typeUsesLwPolylineFlag","numericColorMode","rawColorNumber","explicitAci","explicitTrueColor","rawColorLooksRgb","pointFromUnknown","vertices","normalizePoints","controlPoints","fitPoints","rawAttribs","attribute","record","x","y","zCandidate","z","out","p","rec","vertex","bulge","startWidth","endWidth","summarizeCadDocument","document","byType","isCadPolylineClosed","flag","addLayer","target","layer","addBlock","block","addLineType","lineType","flattenPages","pages","page","n","emptyBounds","boundsValid","bounds","includePoint","point","isFinitePoint","includeCircle","center","radius","paddedBounds","ratio","minimum","padX","padY","xy","degreesToRadians","arcPoints","startAngle","endAngle","ccw","segments","start","end","sweep","count","pts","i","t","ellipsePoints","majorAxisEndPoint","major","minor","rotation","cosR","sinR","bulgeToPolylinePoints","p1","p2","chord","theta","mid","dx","dy","sagittaDirection","a1","a2","stripMTextFormatting","text","clamp","min","max","DxfLoader","mergedOptions","started","decodeDxfText","warnings","parsed","parseWithDxfParser","parseDxfFallback","normalizeDxfDatabase","elapsedMs","module","Parser","layers","extractDxfLayers","blocks","extractDxfBlocks","entities","normalizeDxfEntity","rawColor","normalizeDxfText","normalizeRotation","normalizeAngle","sx","sy","sz","control","normalizeControlPoints","fit","normalizeHatchLoops","normalizeSolidVertices","result","tables","layerTable","candidates","expandRecords","addDxfBlock","blockValue","fallbackName","loops","loop","preferredEncoding","explicitEncoding","normalizeDxfEncoding","decodeBytes","bomEncoding","detectBomEncoding","declaredEncoding","detectDxfCodePage","utf8","chooseBestLegacyDxfDecode","DXF_CODEPAGE_ENCODING","lines","cursor","code","_c","_d","trimmed","key","ansi","cp","encoding","bestText","bestScore","score","scoreDxfDecode","replacements","countMatches","controls","cjk","hasDxfStructure","pattern","match","pairs","section","current","polyline","pair","flushEntity","v","readPoint","readNumber","e","entityFromPairs","common","readString","degreesToRadiansSafe","readJoinedText","readLwPolylineVertices","readRepeatedPoints","found","xCode","yCode","zCode","yPair","zPair","j","chunks","DwfLoader","normalizeFormat","loaded","openDwfDocument","cadDocumentFromDwf","host","wasmUrl","resolveDwfWasmUrl","background","resolveDwfBackground","viewerOptions","buildDwfViewerOptions","loadOptions","buildDwfLoadOptions","DwfViewer","_e","button","native","setOptionalNumber","keepRaw","diagnosticsToWarnings","pageToCadPage","metadata","countBy","unique","pageEntities","pageIndex","primitive","primitiveToEntity","mesh","rgbToHex","base","pointsArrayToCadPoints","w","h","points","diagnostics","detected","ensureTrailingSlash","canvasOptions","rgb","r","g","toHex","values","createDefaultLoaderRegistry","isCadNativeRenderableLoader","BASE_ACI","colorFromAci","foreground","normalized","colorFromTrueColor","byteOrder","int","a","c","parseCssColor","normalizeXpsColor","obj","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","keys","rgba","part","hasPercent","clampByte","channels","s","l1","l2","hi","lo","DEFAULT_MAX_DASH_PRIMITIVES","BY_LAYER","BY_BLOCK","CONTINUOUS","refKey","isByBlockLineType","applyByBlockLineTypeInheritance","parentRef","resolveCadLineTypeReference","finitePositive","reference","resolveCadLinePattern","definition","lookupLineType","entityScale","globalScale","runs","patternRuns","period","sum","run","hasGap","hasMarker","canvasDashSegments","createDashedCadSegments","closed","createDashedCadPrimitives","maxPrimitives","valid","edges","finiteLimit","totalLength","estimatedPrimitives","output","runIndex","remaining","markerPending","addDot","previous","advance","length","offset","zeroRunCount","take","from","to","scale","element","complex","expectedDraw","lineTypes","number","IDENTITY_MATRIX","multiplyMatrix","left","right","translationMatrix","rotationMatrix","angle","scaleMatrix","transformPoint","matrix","transformPathCommands","commands","command","matrixFromInsert","basePoint","insertion","scaleValue","transformEntity","clone","origin","scaleApprox","ellipseAnglesAreRelative","isIdentity","createCadSceneDocument","DEFAULT_OPTIONS","CadCanvasRenderer","canvas","ctx","padding","bw","bh","factor","anchor","before","after","view","cloneStats","ev","stopDrag","depth","fill","applyLinePattern","fillColor","lw","linePattern","segment","height","child","inherited","attr","first","p3","width","src","image","pixelHeight","line","primitives","screen","cmd","kind","stats","DEFAULT_WEBGL_OPTIONS","CadWebGLRenderer","gl","createWebGLContext","createProgramInfo","isWebGLAvailable","computeBounds","cpuScene","buildCpuScene","uploadScene","createStatsFromScene","rebuildRequired","requiresSceneRebuild","cssToRgbaBytes","visiblePrimitiveCount","culledPrimitiveCount","scene","visibleBounds","lineCounts","triangleCounts","lineTypePointCounts","pointCounts","renderElapsedMs","batches","mode","visible","culled","batch","boundsIntersects","items","maxLabels","drawn","fontSize","overlay","signal","halfW","halfH","attributes","vertexSource","fragmentSource","compileShader","fragment","program","uViewCenter","uScale","uViewport","uPointSize","source","shader","cpu","gpuMemoryBytes","upload","positionBuffer","createBuffer","colorBuffer","gpuBytes","lineBatches","triangleBatches","lineTypePointBatches","pointBatches","data","buffer","opts","builder","CpuSceneBuilder","finalizeMutableBatches","approxWidth","approxHeight","stroke","added","flattenPathCommands","boundsFromPoints","entityAnchor","bucket","pushVertex","pointBounds","buckets","createMutableBatch","cx","cy","ix","iy","map","maxVerticesPerBatch","vertexCount","primitiveSize","inferPrimitiveSize","verticesPerChunk","startVertex","endVertex","lookupBlock","includeEntityBounds","push","p0","mt","c1","c2","next","opacity","percent","nums","CadViewer","createRenderer","file","maybeDisposable","throwIfAborted","normalizedInput","normalizeError","backend","baseProgress","overrideProgress","progress","createCadViewer","normalizeDwgDatabase","rawDb","version","extractLayers","extractLineTypes","extractBlocks","header","normalizeHeader","savedViewResult","extractSavedView","savedView","rawEntities","normalizeOptions","normalizeDwgEntity","classicPolyline","expandCandidate","colorIndex","rawRgb","convertedRgb","useIndexedColor","trueColor","entry","convertedShapeCode","convertedTypeFlag","hasLibreDwgPair","active","ucsOrigin","ucsXAxis","ucsYAxis","twistAngle","direction","hasNonWorldUcs","isWorldUcs","planView","isPlanViewDirection","sceneTransform","createSavedViewTransform","rawXAxis","rawYAxis","xAxis","normalizePlanAxis","yAxisCandidate","projection","orthogonalY","axis","yAxis","close","expected","originWorld","xWorld","yWorld","directValues","arrays"],"mappings":"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I,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAC3I,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAC3I,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAAW,GAAI,UAC3I,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,I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"}
1
+ {"version":3,"file":"cad-viewer.umd.cjs","sources":["../src/core/format.ts","../src/loaders/CadLoaderRegistry.ts","../src/loaders/dwg/DwgWorkerClient.ts","../src/loaders/dwg/DwgLoader.ts","../src/core/entity.ts","../src/core/geometry.ts","../src/loaders/dxf/DxfLoader.ts","../src/loaders/dwf/DwfLoader.ts","../src/loaders/index.ts","../node_modules/@mlightcad/shx-parser/dist/index.es.js","../src/core/shx.ts","../src/core/types.ts","../src/core/color.ts","../src/core/transform.ts","../src/core/bounds.ts","../src/core/linetype.ts","../src/core/scene.ts","../src/viewer/CadCanvasRenderer.ts","../src/viewer/CadWebGLRenderer.ts","../src/viewer/CadViewer.ts","../src/loaders/dwg/DwgParser.ts"],"sourcesContent":["import type { CadFormat, CadLoadInput } from './types';\n\nexport async function readInputBytes(input: CadLoadInput): Promise<Uint8Array> {\n if (input.buffer instanceof Uint8Array) return input.buffer;\n if (input.buffer instanceof ArrayBuffer) return new Uint8Array(input.buffer);\n if (input.file) return new Uint8Array(await input.file.arrayBuffer());\n throw new Error('CadLoadInput requires a File, ArrayBuffer, or Uint8Array.');\n}\n\nexport function exactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n if (bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength) return bytes.buffer as ArrayBuffer;\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nexport function extensionOf(input: CadLoadInput): string {\n const name = input.fileName ?? input.file?.name ?? '';\n const index = name.lastIndexOf('.');\n return index >= 0 ? name.slice(index + 1).toLowerCase() : '';\n}\n\nexport function detectCadFormat(input: CadLoadInput, bytes?: Uint8Array): CadFormat {\n const ext = extensionOf(input);\n if (ext === 'dwg') return 'dwg';\n if (ext === 'dxf') return 'dxf';\n if (ext === 'dwfx') return 'dwfx';\n if (ext === 'xps') return 'xps';\n if (ext === 'dwf') return 'dwf';\n\n if (bytes && bytes.byteLength >= 6) {\n const sig = ascii(bytes.slice(0, 6));\n if (/^AC10/.test(sig)) return 'dwg';\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) return 'dwfx';\n const head = ascii(bytes.slice(0, Math.min(bytes.byteLength, 2048))).toUpperCase();\n if (head.includes('SECTION') && head.includes('ENTITIES')) return 'dxf';\n if (head.includes('DWF')) return 'dwf';\n }\n return 'unknown';\n}\n\nexport function ascii(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b >= 32 && b <= 126 ? String.fromCharCode(b) : ' ').join('');\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder('utf-8').decode(bytes);\n}\n","import { detectCadFormat, readInputBytes } from '../core/format';\nimport type { CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader } from '../core/types';\n\nexport class CadLoaderRegistry {\n private readonly loaders: CadLoader[] = [];\n\n constructor(loaders: CadLoader[] = []) {\n for (const loader of loaders) this.register(loader);\n }\n\n register(loader: CadLoader): this {\n const index = this.loaders.findIndex((item) => item.id === loader.id);\n if (index >= 0) this.loaders.splice(index, 1, loader);\n else this.loaders.push(loader);\n return this;\n }\n\n unregister(loaderId: string): this {\n const index = this.loaders.findIndex((item) => item.id === loaderId);\n if (index >= 0) this.loaders.splice(index, 1);\n return this;\n }\n\n list(): CadLoader[] {\n return [...this.loaders];\n }\n\n async detect(input: CadLoadInput): Promise<{ loader: CadLoader; bytes: Uint8Array; format: CadFormat }> {\n const bytes = await readInputBytes(input);\n const format = detectCadFormat(input, bytes);\n const direct = this.loaders.find((loader) => loader.formats.includes(format) && loader.accepts(input, bytes));\n if (direct) return { loader: direct, bytes, format };\n const fallback = this.loaders.find((loader) => loader.accepts(input, bytes));\n if (fallback) return { loader: fallback, bytes, format };\n throw new Error(`No CAD loader registered for ${format === 'unknown' ? 'this file' : format.toUpperCase()}.`);\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const { loader, bytes } = await this.detect(input);\n return loader.load({ ...input, buffer: bytes }, options);\n }\n}\n","import { exactArrayBuffer } from '../../core/format';\nimport type { CadLoadInput, CadLoadOptions, CadLoadProgress, CadLoadResult } from '../../core/types';\n\nexport interface DwgWorkerLoadOptions extends CadLoadOptions {\n fileName?: string;\n}\n\ntype DwgWorkerProgressMessage = {\n type: 'progress';\n requestId: number;\n progress: CadLoadProgress;\n};\n\ntype DwgWorkerResultMessage = {\n type: 'result';\n requestId: number;\n result: CadLoadResult;\n};\n\ntype DwgWorkerWarmupResultMessage = {\n type: 'warmup-result';\n requestId: number;\n elapsedMs: number;\n};\n\ntype DwgWorkerErrorMessage = {\n type: 'error';\n requestId: number;\n error: {\n name?: string;\n message: string;\n stack?: string;\n };\n};\n\ntype DwgWorkerReadyMessage = {\n type: 'ready';\n};\n\ntype DwgWorkerMessage = DwgWorkerProgressMessage | DwgWorkerResultMessage | DwgWorkerWarmupResultMessage | DwgWorkerErrorMessage | DwgWorkerReadyMessage;\n\ntype PendingRequest = {\n resolve: (result: any) => void;\n reject: (error: Error) => void;\n onProgress?: (progress: CadLoadProgress) => void;\n timer?: ReturnType<typeof setTimeout>;\n abortHandler?: () => void;\n signal?: AbortSignal;\n};\n\nconst DEFAULT_DWG_WORKER_URL = 'wasm/dwg-worker.js';\n\nexport class DwgWorkerClient {\n private worker?: Worker;\n private sequence = 0;\n private readonly pending = new Map<number, PendingRequest>();\n\n load(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions = {}): Promise<CadLoadResult> {\n if (!supportsDwgWorker()) throw new Error('Web Worker is not available in this runtime.');\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n const fileName = options.fileName ?? input.fileName ?? input.file?.name;\n const transferBuffer = prepareTransferBuffer(bytes, input, options);\n\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Dispatching DWG parse to worker…', total: bytes.byteLength });\n\n return new Promise<CadLoadResult>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = { resolve, reject, onProgress: options.onProgress, signal: options.signal };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({\n type: 'load',\n requestId,\n bytes: transferBuffer,\n fileName,\n options: serializeOptions(options)\n }, [transferBuffer]);\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n preload(options: DwgWorkerLoadOptions = {}): Promise<void> {\n if (!supportsDwgWorker()) return Promise.reject(new Error('Web Worker is not available in this runtime.'));\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Starting DWG worker warmup…' });\n\n return new Promise<void>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = {\n resolve: () => resolve(),\n reject,\n onProgress: options.onProgress,\n signal: options.signal\n };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker warmup timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({ type: 'warmup', requestId, options: serializeOptions(options) });\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n terminate(): void {\n this.resetWorker();\n }\n\n private ensureWorker(options: DwgWorkerLoadOptions): Worker {\n if (!this.worker) {\n this.worker = createWorker(options);\n this.worker.onmessage = (event: MessageEvent<DwgWorkerMessage>) => this.handleMessage(event.data);\n this.worker.onerror = (event) => {\n const message = event.message || 'DWG worker failed.';\n this.rejectAll(new Error(message));\n this.resetWorker(false);\n };\n this.worker.onmessageerror = () => {\n this.rejectAll(new Error('DWG worker returned a message that could not be cloned.'));\n this.resetWorker(false);\n };\n }\n return this.worker;\n }\n\n private handleMessage(message: DwgWorkerMessage): void {\n if (message.type === 'ready') return;\n const pending = this.pending.get(message.requestId);\n if (!pending) return;\n\n if (message.type === 'progress') {\n pending.onProgress?.(message.progress);\n return;\n }\n\n this.pending.delete(message.requestId);\n cleanupPending(pending);\n\n if (message.type === 'result') {\n pending.resolve(message.result);\n return;\n }\n\n if (message.type === 'warmup-result') {\n pending.onProgress?.({ phase: 'worker-ready', format: 'dwg', message: 'DWG worker warmup complete.', percent: 100, elapsedMs: message.elapsedMs });\n pending.resolve(undefined);\n return;\n }\n\n const error = new Error(message.error.message);\n error.name = message.error.name || 'DwgWorkerError';\n if (message.error.stack) error.stack = message.error.stack;\n pending.reject(error);\n }\n\n private rejectAll(error: Error): void {\n for (const [, pending] of this.pending) {\n cleanupPending(pending);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private resetWorker(reject = true): void {\n if (reject) this.rejectAll(new Error('DWG worker was terminated.'));\n this.worker?.terminate();\n this.worker = undefined;\n }\n}\n\nexport function supportsDwgWorker(): boolean {\n return typeof Worker !== 'undefined' && typeof URL !== 'undefined';\n}\n\nfunction createWorker(options: DwgWorkerLoadOptions): Worker {\n if (options.workerFactory) return options.workerFactory();\n return new Worker(resolveWorkerUrl(options.workerUrl), { type: 'module', name: 'lightweight-cad-dwg-loader' });\n}\n\nfunction serializeOptions(options: DwgWorkerLoadOptions): Record<string, unknown> {\n return {\n // Resolve the asset directory on the UI thread. Relative paths such as\n // './wasm' must be relative to the document URL, not to the generated\n // worker chunk URL. Otherwise the worker may request /assets/wasm/... and\n // receive the app's HTML fallback instead of libredwg-web.wasm.\n wasmPath: resolveWasmPathForWorker(options.wasmPath),\n includePaperSpace: options.includePaperSpace,\n maxInsertDepth: options.maxInsertDepth,\n keepRaw: Boolean(options.keepRaw)\n };\n}\n\nfunction prepareTransferBuffer(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions): ArrayBuffer {\n const canTransferWithoutSurprise = Boolean(input.file) || options.transferInputBuffer === true;\n if (canTransferWithoutSurprise) return exactArrayBuffer(bytes);\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nfunction cleanupPending(pending: PendingRequest): void {\n if (pending.timer) clearTimeout(pending.timer);\n if (pending.signal && pending.abortHandler) pending.signal.removeEventListener('abort', pending.abortHandler);\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException !== 'undefined') return new DOMException('DWG loading was aborted.', 'AbortError');\n const error = new Error('DWG loading was aborted.');\n error.name = 'AbortError';\n return error;\n}\n\nfunction resolveWasmPathForWorker(wasmPath: string | undefined): string {\n const candidate = (wasmPath?.trim() || '/wasm').replace(/\\/+$/, '');\n if (candidate === '') return getPageOrigin();\n if (isAbsoluteUrl(candidate)) return candidate;\n if (candidate.startsWith('/')) return `${getPageOrigin()}${candidate}`;\n return new URL(candidate, getPageBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction resolveWorkerUrl(workerUrl: string | URL | undefined): string | URL {\n if (workerUrl instanceof URL) return workerUrl;\n const candidate = workerUrl?.trim() || DEFAULT_DWG_WORKER_URL;\n if (isAbsoluteUrl(candidate)) return candidate;\n return new URL(candidate, getPageBaseUrl()).href;\n}\n\nfunction getPageBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getPageOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getPageBaseUrl()).origin;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n","import { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader } from '../../core/types';\nimport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nexport class DwgLoader implements CadLoader {\n readonly id = 'dwg';\n readonly label = 'DWG / LibreDWG WebAssembly';\n readonly formats = ['dwg'] as const;\n private readonly defaults: CadLoadOptions;\n private readonly workerClient = new DwgWorkerClient();\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = { useWorker: true, ...defaults };\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n if (extensionOf(input) === 'dwg') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwg';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n merged.onProgress?.({ phase: 'read', format: 'dwg', message: 'Reading DWG bytes…' });\n const bytes = await readInputBytes(input);\n const sourceName = input.fileName ?? input.file?.name;\n\n if (merged.useWorker === false) {\n throw new Error('DWG main-thread parsing is intentionally not bundled by the default viewer. Keep useWorker enabled, or register a custom DWG loader for non-browser runtimes.');\n }\n\n if (!supportsDwgWorker()) {\n throw new Error('DWG loading requires Web Worker support in this build. Provide a custom loader for this runtime.');\n }\n\n try {\n return await this.workerClient.load(bytes, input, { ...merged, fileName: sourceName });\n } catch (error) {\n if (isAbortError(error)) throw error;\n throw normalizeWorkerError(error);\n }\n }\n\n terminateWorker(): void {\n this.workerClient.terminate();\n }\n\n preload(options: CadLoadOptions = {}): Promise<void> {\n const merged = { ...this.defaults, ...options };\n if (merged.useWorker === false) {\n return Promise.reject(new Error('DWG preload requires worker mode in the default viewer.'));\n }\n return this.workerClient.preload(merged);\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nexport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nfunction normalizeWorkerError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n return new Error(`${message} If the worker asset cannot be resolved by your bundler/CDN, pass workerUrl or workerFactory to CadViewer.`);\n}\n","import type { CadBlock, CadDocument, CadEntity, CadEntityKind, CadLayer, CadLineType, CadPage, CadPoint3D } from './types';\n\nexport interface NormalizeCadEntityOptions {\n /** Preserve the parser-owned raw object on entity.raw. This can be very large and may not be structured-clone safe. */\n keepRaw?: boolean;\n /** Copy unknown parser properties onto the normalized entity. Disable inside workers for predictable cloneable payloads. */\n includeUnknownProperties?: boolean;\n /** How to interpret a numeric raw `color` property when the source parser is ambiguous. */\n numericColorMode?: 'auto' | 'aci' | 'rgb';\n}\n\nexport function createCadDocument(init: Partial<CadDocument> & Pick<CadDocument, 'format'>): CadDocument {\n return {\n format: init.format,\n sourceName: init.sourceName,\n units: init.units,\n header: init.header ?? {},\n layers: init.layers ?? {},\n lineTypes: init.lineTypes ?? {},\n blocks: init.blocks ?? {},\n entities: init.entities ?? [],\n pages: init.pages,\n savedView: init.savedView,\n metadata: init.metadata ?? {},\n warnings: init.warnings ?? [],\n raw: init.raw\n };\n}\n\nexport function inferEntityKind(type: unknown): CadEntityKind {\n const upper = String(type ?? '').toUpperCase();\n switch (upper) {\n case 'LINE': return 'line';\n case 'CIRCLE': return 'circle';\n case 'ARC': return 'arc';\n case 'LWPOLYLINE':\n case 'POLYLINE':\n case 'POLYLINE_2D':\n case 'POLYLINE2D':\n case 'POLYLINE_3D':\n case 'POLYLINE3D':\n case 'LEADER':\n case 'MULTILEADER': return 'polyline';\n case 'ELLIPSE': return 'ellipse';\n case 'TEXT':\n case 'MTEXT':\n case 'ATTRIB':\n case 'ATTDEF':\n case 'DIMENSION': return 'text';\n case 'POINT': return 'point';\n case 'INSERT': return 'insert';\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': return 'solid';\n case 'HATCH': return 'hatch';\n case 'SPLINE': return 'spline';\n case 'PATH':\n case 'XPS_PATH':\n case 'DWF_PATH': return 'path';\n case 'IMAGE':\n case 'RASTER_IMAGE':\n case 'DWF_IMAGE': return 'image';\n case 'VIEWPORT': return 'viewport';\n default: return 'unsupported';\n }\n}\n\nexport function normalizeCadEntity(raw: Record<string, unknown>, forcedType?: string, options: NormalizeCadEntityOptions = {}): CadEntity {\n const type = forcedType ?? String(raw.type ?? raw.entityType ?? raw.objectName ?? 'UNKNOWN').toUpperCase();\n const entity: CadEntity = options.includeUnknownProperties === false\n ? { type, kind: inferEntityKind(type) }\n : { ...raw, type, kind: inferEntityKind(type) } as CadEntity;\n if (options.keepRaw) entity.raw = raw;\n entity.handle = stringOrUndefined(raw.handle ?? raw.id);\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName);\n entity.lineType = stringOrUndefined(raw.lineType ?? raw.linetype);\n entity.lineTypeScale = numberOrUndefined(raw.lineTypeScale ?? raw.linetypeScale ?? raw.ltscale) ?? entity.lineTypeScale;\n entity.flag = numberOrUndefined(raw.flag ?? raw.flags) ?? entity.flag;\n entity.constantWidth = numberOrUndefined(raw.constantWidth ?? raw.constWidth ?? raw.const_width) ?? entity.constantWidth;\n entity.thickness = numberOrUndefined(raw.thickness) ?? entity.thickness;\n const explicitClosed = raw.isClosed === true || raw.closed === true || raw.shape === true;\n const typeUsesClassicPolylineFlag = /^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D|SPLINE)$/.test(type);\n const typeUsesLwPolylineFlag = type === 'LWPOLYLINE';\n if (explicitClosed\n || (typeUsesClassicPolylineFlag && (Number(entity.flag ?? 0) & 1) === 1)\n || (typeUsesLwPolylineFlag && (Number(entity.flag ?? 0) & 0x200) === 0x200)) {\n entity.isClosed = true;\n }\n\n const numericColorMode = options.numericColorMode ?? 'auto';\n const rawColorNumber = numberOrUndefined(raw.color);\n const explicitAci = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci ?? raw.aciColor ?? raw.color_index);\n entity.colorIndex = explicitAci ?? (numericColorMode !== 'rgb' && rawColorNumber !== undefined && Math.abs(rawColorNumber) <= 257 ? rawColorNumber : undefined);\n\n const explicitTrueColor = raw.trueColor ?? raw.true_color ?? raw.truecolor ?? raw.colorRGB ?? raw.colorRgb ?? raw.rgbColor ?? raw.rgb;\n const rawColorLooksRgb = rawColorNumber !== undefined && rawColorNumber >= 0 && rawColorNumber <= 0xffffff && (numericColorMode === 'rgb' || (numericColorMode === 'auto' && Math.abs(rawColorNumber) > 257));\n entity.trueColor = (explicitTrueColor ?? (rawColorLooksRgb ? rawColorNumber : undefined)) as CadEntity['trueColor'];\n if (typeof raw.color === 'string' || typeof raw.color === 'number') entity.color = raw.color as string | number;\n entity.colorNumber = numberOrUndefined(raw.colorNumber) ?? entity.colorNumber;\n entity.colorName = stringOrUndefined(raw.colorName ?? raw.color_name) ?? entity.colorName;\n entity.fillColor = (raw.fillColor ?? raw.fill_color) as CadEntity['fillColor'];\n entity.fillColorIndex = numberOrUndefined(raw.fillColorIndex ?? raw.fill_color_index ?? raw.fillColorNumber) ?? entity.fillColorIndex;\n entity.opacity = numberOrUndefined(raw.opacity ?? raw.alpha) ?? entity.opacity;\n entity.lineweight = numberOrUndefined(raw.lineweight ?? raw.lineWeight);\n entity.isVisible = raw.isVisible === false || raw.visible === false ? false : true;\n entity.startPoint = pointFromUnknown(raw.startPoint ?? raw.start ?? raw.p0 ?? raw.from) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? raw.end ?? raw.p1 ?? raw.to) ?? entity.endPoint;\n entity.center = pointFromUnknown(raw.center ?? raw.centerPoint) ?? entity.center;\n entity.insertionPoint = pointFromUnknown(raw.insertionPoint ?? raw.position ?? raw.location ?? raw.point ?? raw.basePoint) ?? entity.insertionPoint;\n entity.radius = numberOrUndefined(raw.radius) ?? entity.radius;\n entity.startAngle = numberOrUndefined(raw.startAngle ?? raw.start_angle) ?? entity.startAngle;\n entity.endAngle = numberOrUndefined(raw.endAngle ?? raw.end_angle) ?? entity.endAngle;\n entity.majorAxisEndPoint = pointFromUnknown(raw.majorAxisEndPoint ?? raw.majorAxis ?? raw.major) ?? entity.majorAxisEndPoint;\n entity.axisRatio = numberOrUndefined(raw.axisRatio ?? raw.ratio) ?? entity.axisRatio;\n entity.height = numberOrUndefined(raw.height ?? raw.textHeight) ?? entity.height;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.xScale = numberOrUndefined(raw.xScale ?? raw.widthFactor) ?? entity.xScale;\n entity.generationFlag = numberOrUndefined(raw.generationFlag ?? raw.textGenerationFlag) ?? entity.generationFlag;\n entity.halign = numberOrUndefined(raw.halign ?? raw.horizontalAlignment) ?? entity.halign;\n entity.valign = numberOrUndefined(raw.valign ?? raw.verticalAlignment) ?? entity.valign;\n entity.extrusionDirection = pointFromUnknown(raw.extrusionDirection ?? raw.extrusion) ?? entity.extrusionDirection;\n entity.rotation = numberOrUndefined(raw.rotation ?? raw.angle) ?? entity.rotation;\n entity.text = stringOrUndefined(raw.text ?? raw.value ?? raw.string ?? raw.contents) ?? entity.text;\n entity.name = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.name;\n entity.blockName = stringOrUndefined(raw.blockName ?? raw.name) ?? entity.blockName;\n if (type === 'INSERT') {\n const scale = pointFromUnknown(raw.scale);\n if (scale) {\n entity.scale = scale;\n } else {\n const scaleX = numberOrUndefined(raw.scaleX ?? raw.xScale);\n const scaleY = numberOrUndefined(raw.scaleY ?? raw.yScale) ?? scaleX;\n const scaleZ = numberOrUndefined(raw.scaleZ ?? raw.zScale);\n if (scaleX !== undefined && scaleY !== undefined) {\n entity.scale = scaleZ === undefined ? { x: scaleX, y: scaleY } : { x: scaleX, y: scaleY, z: scaleZ };\n }\n }\n }\n\n const vertices = normalizePoints(raw.vertices ?? raw.points);\n if (vertices.length > 0) entity.vertices = vertices;\n const controlPoints = normalizePoints(raw.controlPoints ?? raw.control_points);\n if (controlPoints.length > 0) entity.controlPoints = controlPoints;\n const fitPoints = normalizePoints(raw.fitPoints ?? raw.fit_points);\n if (fitPoints.length > 0) entity.fitPoints = fitPoints;\n const rawAttribs = raw.attribs ?? raw.attributes;\n if (Array.isArray(rawAttribs)) {\n entity.attribs = rawAttribs\n .filter((attribute): attribute is Record<string, unknown> => !!attribute && typeof attribute === 'object')\n .map((attribute) => normalizeCadEntity(attribute, undefined, options));\n }\n return entity;\n}\n\nexport function pointFromUnknown(value: unknown): CadPoint3D | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const record = value as Record<string, unknown>;\n const x = Number(record.x ?? record.X ?? record[0]);\n const y = Number(record.y ?? record.Y ?? record[1]);\n const zCandidate = record.z ?? record.Z ?? record[2];\n const z = zCandidate === undefined ? undefined : Number(zCandidate);\n if (!Number.isFinite(x) || !Number.isFinite(y)) return undefined;\n return Number.isFinite(z) ? { x, y, z } : { x, y };\n}\n\nexport function normalizePoints(value: unknown): Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> {\n if (!Array.isArray(value)) return [];\n const out: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> = [];\n for (const item of value) {\n const p = pointFromUnknown(item);\n if (!p) continue;\n const rec = item as Record<string, unknown>;\n const vertex = p as CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number };\n const bulge = numberOrUndefined(rec.bulge);\n if (bulge !== undefined) vertex.bulge = bulge;\n const startWidth = numberOrUndefined(rec.startWidth ?? rec.start_width);\n if (startWidth !== undefined) vertex.startWidth = startWidth;\n const endWidth = numberOrUndefined(rec.endWidth ?? rec.end_width);\n if (endWidth !== undefined) vertex.endWidth = endWidth;\n out.push(vertex);\n }\n return out;\n}\n\nexport function summarizeCadDocument(document: CadDocument) {\n const byType: Record<string, number> = {};\n for (const entity of document.entities) {\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n byType[type] = (byType[type] ?? 0) + 1;\n }\n return {\n format: document.format,\n sourceName: document.sourceName,\n entityCount: document.entities.length,\n layerCount: Object.keys(document.layers).length,\n blockCount: Object.keys(document.blocks).length,\n pageCount: document.pages?.length ?? 0,\n byType,\n warnings: [...document.warnings]\n };\n}\n\nexport function isCadPolylineClosed(entity: CadEntity): boolean {\n if (entity.isClosed === true) return true;\n const type = String(entity.type ?? '').toUpperCase();\n const flag = Number(entity.flag ?? 0);\n const isLightweightPolyline = type === 'LWPOLYLINE';\n const isClassicPolyline = /^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D)$/.test(type);\n if (isLightweightPolyline && (flag & 0x200) === 0x200) return true;\n if (isClassicPolyline && (flag & 1) === 1) return true;\n if (!isLightweightPolyline && !isClassicPolyline) return false;\n const points = entity.vertices ?? entity.points;\n if (!Array.isArray(points) || points.length < 3) return false;\n const first = points[0];\n const last = points[points.length - 1];\n if (!first || !last) return false;\n const extent = points.reduce((max, point) => Math.max(max, Math.abs(point.x), Math.abs(point.y)), 1);\n return Math.hypot(first.x - last.x, first.y - last.y) <= Math.max(1e-9, extent * 1e-12);\n}\n\n/** Returns an entity's authored polyline width in drawing units. */\nexport function cadEntityWorldStrokeWidth(entity: CadEntity): number {\n let width = finiteNonNegative(entity.constantWidth);\n for (const vertex of entity.vertices ?? []) {\n width = Math.max(width, finiteNonNegative(vertex.startWidth), finiteNonNegative(vertex.endWidth));\n }\n return width;\n}\n\nexport function addLayer(target: Record<string, CadLayer>, layer: CadLayer): void {\n if (!layer.name) return;\n target[layer.name] = layer;\n target[layer.name.toLowerCase()] = layer;\n}\n\nexport function addBlock(target: Record<string, CadBlock>, block: CadBlock): void {\n if (!block.name) return;\n target[block.name] = block;\n target[block.name.toLowerCase()] = block;\n}\n\nexport function addLineType(target: Record<string, CadLineType>, lineType: CadLineType): void {\n if (!lineType.name) return;\n target[lineType.name] = lineType;\n target[lineType.name.toLowerCase()] = lineType;\n if (lineType.handle) {\n target[lineType.handle] = lineType;\n target[lineType.handle.toLowerCase()] = lineType;\n }\n}\n\nexport function flattenPages(pages: CadPage[] | undefined): CadEntity[] {\n if (!pages?.length) return [];\n return pages.flatMap((page) => page.entities.map((entity) => ({ ...entity, pageIndex: page.index })));\n}\n\nexport function numberOrUndefined(value: unknown): number | undefined {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function stringOrUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string' && typeof value !== 'number') return undefined;\n const out = String(value);\n return out.length > 0 ? out : undefined;\n}\n\nfunction finiteNonNegative(value: unknown): number {\n const number = Math.abs(Number(value));\n return Number.isFinite(number) ? number : 0;\n}\n","import type { CadBounds, CadPoint2D, CadPoint3D } from './types';\n\nexport function emptyBounds(): CadBounds {\n return { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity };\n}\n\nexport function boundsValid(bounds: CadBounds): boolean {\n return Number.isFinite(bounds.minX) && Number.isFinite(bounds.minY) && Number.isFinite(bounds.maxX) && Number.isFinite(bounds.maxY)\n && bounds.maxX >= bounds.minX && bounds.maxY >= bounds.minY;\n}\n\nexport function includePoint(bounds: CadBounds, point: CadPoint2D | CadPoint3D): void {\n if (!isFinitePoint(point)) return;\n bounds.minX = Math.min(bounds.minX, point.x);\n bounds.minY = Math.min(bounds.minY, point.y);\n bounds.maxX = Math.max(bounds.maxX, point.x);\n bounds.maxY = Math.max(bounds.maxY, point.y);\n}\n\nexport function includeCircle(bounds: CadBounds, center: CadPoint2D, radius: number): void {\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return;\n const r = Math.abs(radius);\n includePoint(bounds, { x: center.x - r, y: center.y - r });\n includePoint(bounds, { x: center.x + r, y: center.y + r });\n}\n\nexport function mergeBounds(target: CadBounds, source: CadBounds): void {\n if (!boundsValid(source)) return;\n includePoint(target, { x: source.minX, y: source.minY });\n includePoint(target, { x: source.maxX, y: source.maxY });\n}\n\nexport function paddedBounds(bounds: CadBounds, ratio = 0.02, minimum = 1e-6): CadBounds {\n if (!boundsValid(bounds)) return { minX: -10, minY: -10, maxX: 10, maxY: 10 };\n const padX = Math.max((bounds.maxX - bounds.minX) * ratio, minimum);\n const padY = Math.max((bounds.maxY - bounds.minY) * ratio, minimum);\n return { minX: bounds.minX - padX, minY: bounds.minY - padY, maxX: bounds.maxX + padX, maxY: bounds.maxY + padY };\n}\n\nexport function isFinitePoint(p: unknown): p is CadPoint3D {\n return !!p && typeof p === 'object'\n && Number.isFinite((p as CadPoint2D).x)\n && Number.isFinite((p as CadPoint2D).y);\n}\n\nexport function xy(p: CadPoint2D | CadPoint3D): CadPoint2D {\n return { x: p.x, y: p.y };\n}\n\nexport function normalizeAngleRadians(value: number): number {\n let out = value;\n while (out < 0) out += Math.PI * 2;\n while (out >= Math.PI * 2) out -= Math.PI * 2;\n return out;\n}\n\nexport function degreesToRadians(value: number): number {\n return value * Math.PI / 180;\n}\n\nexport function arcPoints(center: CadPoint2D, radius: number, startAngle: number, endAngle: number, ccw = true, segments = 64): CadPoint2D[] {\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return [];\n let start = startAngle;\n let end = endAngle;\n if (!Number.isFinite(start) || !Number.isFinite(end)) return [];\n\n if (Math.abs(start) > Math.PI * 2 + 1e-6 || Math.abs(end) > Math.PI * 2 + 1e-6) {\n start = degreesToRadians(start);\n end = degreesToRadians(end);\n }\n\n if (ccw && end < start) end += Math.PI * 2;\n if (!ccw && start < end) start += Math.PI * 2;\n const sweep = end - start;\n const count = Math.max(8, Math.min(256, Math.ceil(Math.abs(sweep) / (Math.PI * 2) * segments)));\n const pts: CadPoint2D[] = [];\n for (let i = 0; i <= count; i++) {\n const t = start + sweep * (i / count);\n pts.push({ x: center.x + Math.cos(t) * radius, y: center.y + Math.sin(t) * radius });\n }\n return pts;\n}\n\nexport function ellipsePoints(center: CadPoint2D, majorAxisEndPoint: CadPoint2D, ratio = 1, startAngle = 0, endAngle = Math.PI * 2, segments = 96): CadPoint2D[] {\n if (!isFinitePoint(center) || !isFinitePoint(majorAxisEndPoint)) return [];\n const major = Math.hypot(majorAxisEndPoint.x, majorAxisEndPoint.y);\n if (!Number.isFinite(major) || major <= 0) return [];\n const minor = major * (Number.isFinite(ratio) && ratio > 0 ? ratio : 1);\n const rotation = Math.atan2(majorAxisEndPoint.y, majorAxisEndPoint.x);\n let start = Number.isFinite(startAngle) ? startAngle : 0;\n let end = Number.isFinite(endAngle) ? endAngle : Math.PI * 2;\n if (Math.abs(start) > Math.PI * 2 + 1e-6 || Math.abs(end) > Math.PI * 2 + 1e-6) {\n start = degreesToRadians(start);\n end = degreesToRadians(end);\n }\n if (end < start) end += Math.PI * 2;\n const count = Math.max(12, Math.min(256, Math.ceil(Math.abs(end - start) / (Math.PI * 2) * segments)));\n const pts: CadPoint2D[] = [];\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n for (let i = 0; i <= count; i++) {\n const t = start + (end - start) * (i / count);\n const x = Math.cos(t) * major;\n const y = Math.sin(t) * minor;\n pts.push({ x: center.x + x * cosR - y * sinR, y: center.y + x * sinR + y * cosR });\n }\n return pts;\n}\n\nexport function bulgeToPolylinePoints(p1: CadPoint2D, p2: CadPoint2D, bulge = 0, segments = 16): CadPoint2D[] {\n if (!Number.isFinite(bulge) || Math.abs(bulge) < 1e-12) return [xy(p1), xy(p2)];\n const chord = Math.hypot(p2.x - p1.x, p2.y - p1.y);\n if (chord <= 1e-12) return [xy(p1), xy(p2)];\n const theta = 4 * Math.atan(bulge);\n const radius = Math.abs(chord / (2 * Math.sin(theta / 2)));\n const mid = { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 };\n const dx = (p2.x - p1.x) / chord;\n const dy = (p2.y - p1.y) / chord;\n const sagittaDirection = bulge >= 0 ? 1 : -1;\n const h = Math.sqrt(Math.max(radius * radius - (chord / 2) ** 2, 0));\n const center = { x: mid.x - sagittaDirection * dy * h, y: mid.y + sagittaDirection * dx * h };\n const a1 = Math.atan2(p1.y - center.y, p1.x - center.x);\n const a2 = Math.atan2(p2.y - center.y, p2.x - center.x);\n return arcPoints(center, radius, a1, a2, bulge >= 0, segments);\n}\n\nexport function stripMTextFormatting(text: string): string {\n return text\n .replace(/\\\\P/g, '\\n')\n .replace(/\\\\~|\\\\ /g, ' ')\n .replace(/\\\\[A-Za-z][^;]*;/g, '')\n .replace(/[{}]/g, '')\n .replace(/\\\\[A-Za-z]/g, '')\n .trim();\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n","import { addBlock, addLayer, createCadDocument, normalizeCadEntity, numberOrUndefined, pointFromUnknown, stringOrUndefined } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport { degreesToRadians } from '../../core/geometry';\nimport type { CadBlock, CadDocument, CadEntity, CadLayer, CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader, CadPoint3D } from '../../core/types';\n\nexport class DxfLoader implements CadLoader {\n readonly id = 'dxf';\n readonly label = 'DXF / JavaScript parser';\n readonly formats = ['dxf'] as const;\n private readonly defaults: CadLoadOptions;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n return extensionOf(input) === 'dxf' || detectCadFormat(input, bytes) === 'dxf';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const mergedOptions = { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const text = decodeDxfText(bytes, mergedOptions.dxfEncoding);\n const warnings: string[] = [];\n let parsed: unknown;\n try {\n parsed = await parseWithDxfParser(text);\n } catch (error) {\n warnings.push(`dxf-parser failed, using built-in fallback parser: ${error instanceof Error ? error.message : String(error)}`);\n parsed = parseDxfFallback(text);\n }\n const document = normalizeDxfDatabase(parsed, input.fileName ?? input.file?.name, warnings);\n const elapsedMs = performance.now() - started;\n return { document, raw: parsed, bytes: bytes.byteLength, elapsedMs, format: 'dxf', warnings: document.warnings };\n }\n}\n\nasync function parseWithDxfParser(text: string): Promise<unknown> {\n const module = await import('dxf-parser') as { default?: new () => { parseSync(text: string): unknown }; DxfParser?: new () => { parseSync(text: string): unknown } };\n const Parser = module.default ?? module.DxfParser;\n if (!Parser) throw new Error('dxf-parser did not expose a parser constructor.');\n return new Parser().parseSync(text);\n}\n\nexport function normalizeDxfDatabase(parsed: unknown, sourceName?: string, warnings: string[] = []): CadDocument {\n const record = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};\n const layers = extractDxfLayers(record);\n const blocks = extractDxfBlocks(record);\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n\n const document = createCadDocument({\n format: 'dxf',\n sourceName,\n header: record.header && typeof record.header === 'object' ? record.header as Record<string, unknown> : {},\n layers,\n blocks,\n entities,\n metadata: { parser: 'dxf-parser + cad-viewer normalizer' },\n warnings,\n raw: parsed\n });\n if (entities.length === 0) document.warnings.push('DXF file did not expose any ENTITIES.');\n return document;\n}\n\nfunction normalizeDxfEntity(raw: Record<string, unknown>): CadEntity {\n const type = String(raw.type ?? raw.entityType ?? 'UNKNOWN').toUpperCase();\n const entity = normalizeCadEntity(raw, type);\n const rawColorNumber = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci);\n const rawColor = numberOrUndefined(raw.color);\n entity.colorIndex = rawColorNumber ?? (rawColor !== undefined && Math.abs(rawColor) <= 257 ? rawColor : undefined);\n entity.trueColor = (raw.trueColor ?? raw.true_color ?? raw.colorRGB ?? raw.trueColorValue ?? (rawColor !== undefined && Math.abs(rawColor) > 257 ? rawColor : undefined)) as CadEntity['trueColor'];\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName) ?? '0';\n entity.isClosed = Boolean(raw.shape ?? raw.closed ?? raw.isClosed) || ((Number(raw.flag ?? raw.flags ?? 0) & 1) === 1);\n\n if (type === 'LINE') {\n entity.startPoint = pointFromUnknown(raw.startPoint ?? { x: raw.x1 ?? raw.x, y: raw.y1 ?? raw.y, z: raw.z1 ?? raw.z }) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? { x: raw.x2, y: raw.y2, z: raw.z2 }) ?? entity.endPoint;\n }\n if (type === 'TEXT' || type === 'MTEXT' || type === 'ATTRIB' || type === 'ATTDEF') {\n entity.insertionPoint = pointFromUnknown(raw.startPoint ?? raw.position ?? raw.insertionPoint) ?? entity.insertionPoint;\n entity.text = normalizeDxfText(raw.text ?? raw.string ?? raw.value) ?? entity.text;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'ARC' || type === 'ELLIPSE') {\n entity.startAngle = normalizeAngle(raw.startAngle ?? raw.start_angle);\n entity.endAngle = normalizeAngle(raw.endAngle ?? raw.end_angle);\n }\n if (type === 'INSERT') {\n entity.blockName = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.blockName;\n entity.insertionPoint = pointFromUnknown(raw.position ?? raw.insertionPoint ?? raw.point) ?? entity.insertionPoint;\n const sx = numberOrUndefined(raw.xScale ?? raw.scaleX ?? raw.xscale);\n const sy = numberOrUndefined(raw.yScale ?? raw.scaleY ?? raw.yscale);\n const sz = numberOrUndefined(raw.zScale ?? raw.scaleZ ?? raw.zscale);\n if (sx !== undefined || sy !== undefined || sz !== undefined) entity.scale = { x: sx ?? 1, y: sy ?? sx ?? 1, z: sz ?? 1 };\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'SPLINE') {\n const control = normalizeControlPoints(raw.controlPoints ?? raw.control_points ?? raw.points);\n if (control.length) entity.controlPoints = control;\n const fit = normalizeControlPoints(raw.fitPoints ?? raw.fit_points);\n if (fit.length) entity.fitPoints = fit;\n }\n if (type === 'HATCH') {\n entity.loops = normalizeHatchLoops(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n if (type === 'SOLID' || type === 'TRACE' || type === '3DFACE') {\n entity.vertices = normalizeSolidVertices(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n return entity;\n}\n\nfunction extractDxfLayers(raw: Record<string, unknown>): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const tables = raw.tables as Record<string, unknown> | undefined;\n const layerTable = raw.layers ?? tables?.layer ?? tables?.LAYER ?? tables?.layers;\n const candidates = expandRecords(layerTable);\n for (const item of candidates) {\n const rec = item as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.layerName);\n if (!name) continue;\n addLayer(result, {\n name,\n color: (rec.color ?? rec.colorNumber ?? rec.colorIndex) as string | number | undefined,\n colorIndex: numberOrUndefined(rec.colorNumber ?? rec.colorIndex ?? rec.color),\n lineType: stringOrUndefined(rec.lineType ?? rec.linetype),\n isVisible: Number(rec.colorNumber ?? rec.colorIndex ?? rec.color ?? 1) >= 0,\n isFrozen: Boolean(rec.frozen),\n isLocked: Boolean(rec.locked),\n raw: rec\n });\n }\n if (!result['0']) addLayer(result, { name: '0', colorIndex: 7, isVisible: true });\n return result;\n}\n\nfunction extractDxfBlocks(raw: Record<string, unknown>): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const blocks = raw.blocks;\n if (!blocks || typeof blocks !== 'object') return result;\n if (Array.isArray(blocks)) {\n for (const block of blocks) addDxfBlock(result, block);\n } else {\n for (const [name, block] of Object.entries(blocks as Record<string, unknown>)) addDxfBlock(result, block, name);\n }\n return result;\n}\n\nfunction addDxfBlock(target: Record<string, CadBlock>, blockValue: unknown, fallbackName?: string): void {\n if (!blockValue || typeof blockValue !== 'object') return;\n const rec = blockValue as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.blockName ?? fallbackName);\n if (!name) return;\n const rawEntities = Array.isArray(rec.entities) ? rec.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n addBlock(target, { name, basePoint: pointFromUnknown(rec.basePoint ?? rec.position) ?? { x: 0, y: 0 }, entities, raw: rec });\n}\n\nfunction expandRecords(value: unknown): unknown[] {\n if (!value) return [];\n if (Array.isArray(value)) return value;\n if (typeof value !== 'object') return [];\n const rec = value as Record<string, unknown>;\n if (Array.isArray(rec.entries)) return rec.entries;\n if (Array.isArray(rec.records)) return rec.records;\n if (Array.isArray(rec.layers)) return rec.layers;\n return Object.values(rec).filter((x) => x && typeof x === 'object');\n}\n\nfunction normalizeControlPoints(value: unknown): CadPoint3D[] {\n if (!Array.isArray(value)) return [];\n return value.map(pointFromUnknown).filter((p): p is CadPoint3D => !!p);\n}\n\nfunction normalizeSolidVertices(raw: Record<string, unknown>): CadPoint3D[] {\n const direct = normalizeControlPoints(raw.vertices ?? raw.points);\n if (direct.length) return direct;\n const out: CadPoint3D[] = [];\n for (let i = 0; i < 4; i++) {\n const point = pointFromUnknown({ x: raw[`x${i}`] ?? raw[`x${i + 1}`], y: raw[`y${i}`] ?? raw[`y${i + 1}`], z: raw[`z${i}`] ?? raw[`z${i + 1}`] });\n if (point) out.push(point);\n }\n return out;\n}\n\nfunction normalizeHatchLoops(raw: Record<string, unknown>): CadEntity['loops'] {\n const loops = raw.boundaryLoops ?? raw.loops ?? raw.paths;\n if (!Array.isArray(loops)) return undefined;\n return loops.map((loop) => {\n const rec = loop as Record<string, unknown>;\n const vertices = normalizeControlPoints(rec.vertices ?? rec.points);\n return { vertices, isClosed: true };\n }).filter((loop) => loop.vertices && loop.vertices.length > 0);\n}\n\nfunction normalizeRotation(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nfunction normalizeAngle(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nexport function decodeDxfText(bytes: Uint8Array, preferredEncoding?: string): string {\n const explicitEncoding = normalizeDxfEncoding(preferredEncoding);\n if (explicitEncoding) return decodeBytes(bytes, explicitEncoding);\n\n const bomEncoding = detectBomEncoding(bytes);\n if (bomEncoding) return decodeBytes(bytes, bomEncoding);\n\n const declaredEncoding = normalizeDxfEncoding(detectDxfCodePage(bytes));\n if (declaredEncoding) return decodeBytes(bytes, declaredEncoding);\n\n const utf8 = decodeBytes(bytes, 'utf-8');\n if (!utf8.includes('\\uFFFD')) return utf8;\n\n return chooseBestLegacyDxfDecode(bytes);\n}\n\nconst DXF_CODEPAGE_ENCODING: Record<string, string> = {\n ANSI_874: 'windows-874',\n ANSI_932: 'shift_jis',\n ANSI_936: 'gb18030',\n ANSI_949: 'euc-kr',\n ANSI_950: 'big5',\n ANSI_1250: 'windows-1250',\n ANSI_1251: 'windows-1251',\n ANSI_1252: 'windows-1252',\n ANSI_1253: 'windows-1253',\n ANSI_1254: 'windows-1254',\n ANSI_1255: 'windows-1255',\n ANSI_1256: 'windows-1256',\n ANSI_1257: 'windows-1257',\n ANSI_1258: 'windows-1258',\n BIG5: 'big5',\n CP874: 'windows-874',\n CP932: 'shift_jis',\n CP936: 'gb18030',\n CP949: 'euc-kr',\n CP950: 'big5',\n CP1250: 'windows-1250',\n CP1251: 'windows-1251',\n CP1252: 'windows-1252',\n CP1253: 'windows-1253',\n CP1254: 'windows-1254',\n CP1255: 'windows-1255',\n CP1256: 'windows-1256',\n CP1257: 'windows-1257',\n CP1258: 'windows-1258',\n GB18030: 'gb18030',\n GB2312: 'gb18030',\n GBK: 'gb18030',\n SHIFT_JIS: 'shift_jis',\n SHIFTJIS: 'shift_jis',\n SJIS: 'shift_jis',\n UTF8: 'utf-8',\n UTF_8: 'utf-8',\n UTF16: 'utf-16le',\n UTF_16: 'utf-16le',\n UTF16LE: 'utf-16le',\n UTF_16LE: 'utf-16le',\n UTF16BE: 'utf-16be',\n UTF_16BE: 'utf-16be'\n};\n\nfunction detectBomEncoding(bytes: Uint8Array): string | undefined {\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) return 'utf-8';\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) return 'utf-16le';\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) return 'utf-16be';\n return undefined;\n}\n\nfunction detectDxfCodePage(bytes: Uint8Array): string | undefined {\n const header = decodeBytes(bytes.subarray(0, Math.min(bytes.byteLength, 128 * 1024)), 'iso-8859-1');\n const lines = header.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n for (let index = 0; index < lines.length - 3; index++) {\n if (lines[index]?.trim() !== '9' || lines[index + 1]?.trim().toUpperCase() !== '$DWGCODEPAGE') continue;\n for (let cursor = index + 2; cursor < Math.min(index + 10, lines.length - 1); cursor += 2) {\n const code = lines[cursor]?.trim();\n const value = lines[cursor + 1]?.trim();\n if (code === '3' && value) return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeDxfEncoding(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n const key = trimmed.replace(/[-\\s]+/g, '_').toUpperCase();\n if (DXF_CODEPAGE_ENCODING[key]) return DXF_CODEPAGE_ENCODING[key];\n const ansi = /^ANSI_(\\d{3,4})$/.exec(key);\n if (ansi) return normalizeDxfEncoding(`cp${ansi[1]}`);\n const cp = /^CP(\\d{3,4})$/.exec(key);\n if (cp) {\n if (cp[1] === '936') return 'gb18030';\n if (cp[1] === '950') return 'big5';\n if (cp[1] === '932') return 'shift_jis';\n if (cp[1] === '949') return 'euc-kr';\n return `windows-${cp[1]}`;\n }\n return trimmed;\n}\n\nfunction decodeBytes(bytes: Uint8Array, encoding: string): string {\n try {\n return new TextDecoder(encoding, { fatal: false }).decode(bytes);\n } catch {\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n }\n}\n\nfunction chooseBestLegacyDxfDecode(bytes: Uint8Array): string {\n const candidates = ['windows-1252', 'gb18030', 'big5', 'shift_jis', 'euc-kr', 'iso-8859-1'];\n let bestText = '';\n let bestScore = Number.POSITIVE_INFINITY;\n for (const encoding of candidates) {\n const text = decodeBytes(bytes, encoding);\n const score = scoreDxfDecode(text, encoding);\n if (score < bestScore) {\n bestScore = score;\n bestText = text;\n }\n }\n return bestText || decodeBytes(bytes, 'utf-8');\n}\n\nfunction scoreDxfDecode(text: string, encoding: string): number {\n const replacements = countMatches(text, /\\uFFFD/g);\n const controls = countMatches(text, /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g);\n const cjk = countMatches(text, /[\\u3400-\\u9FFF\\uF900-\\uFAFF]/g);\n const hasDxfStructure = text.includes('SECTION') && (text.includes('ENTITIES') || text.includes('HEADER'));\n let score = replacements * 10000 + controls * 1000;\n if (hasDxfStructure) score -= 500;\n if (encoding === 'windows-1252') score -= 2;\n if (encoding === 'gb18030' && cjk >= 2) score -= 50 + Math.min(cjk, 200) * 2;\n return score;\n}\n\nfunction countMatches(text: string, pattern: RegExp): number {\n return text.match(pattern)?.length ?? 0;\n}\n\nfunction normalizeDxfText(value: unknown): string | undefined {\n const text = stringOrUndefined(value);\n if (text === undefined) return undefined;\n return text\n .replace(/\\\\U\\+([0-9a-fA-F]{4,6})/g, (match, code: string) => {\n const point = Number.parseInt(code, 16);\n return Number.isFinite(point) && point >= 0 && point <= 0x10ffff ? String.fromCodePoint(point) : match;\n })\n .replace(/%%[cC]/g, '\\u2205')\n .replace(/%%[dD]/g, '\\u00b0')\n .replace(/%%[pP]/g, '\\u00b1')\n .replace(/\\\\P/g, '\\n');\n}\n\ninterface DxfPair { code: number; value: string }\n\nfunction parseDxfFallback(text: string): { header: Record<string, unknown>; tables: Record<string, unknown>; entities: CadEntity[]; blocks: Record<string, unknown> } {\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n const pairs: DxfPair[] = [];\n for (let i = 0; i < lines.length - 1; i += 2) {\n const code = Number(lines[i]?.trim());\n const value = lines[i + 1] ?? '';\n if (Number.isFinite(code)) pairs.push({ code, value: value.trimEnd() });\n }\n const entities: CadEntity[] = [];\n const blocks: Record<string, unknown> = {};\n let section = '';\n let current: DxfPair[] = [];\n let polyline: CadEntity | undefined;\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n if (pair.code === 0 && pair.value === 'SECTION') {\n section = pairs[i + 1]?.code === 2 ? pairs[i + 1].value.toUpperCase() : '';\n i++;\n continue;\n }\n if (pair.code === 0 && pair.value === 'ENDSEC') {\n flushEntity();\n section = '';\n continue;\n }\n if (section !== 'ENTITIES') continue;\n if (pair.code === 0) {\n flushEntity();\n current = [pair];\n } else current.push(pair);\n }\n flushEntity();\n return { header: {}, tables: {}, entities, blocks };\n\n function flushEntity(): void {\n if (!current.length) return;\n const type = current[0]?.value.toUpperCase();\n if (type === 'VERTEX' && polyline) {\n const v = readPoint(current, 10, 20, 30);\n if (v) (polyline.vertices ??= []).push({ ...v, bulge: readNumber(current, 42) });\n current = [];\n return;\n }\n if (type === 'SEQEND') {\n if (polyline) entities.push(polyline);\n polyline = undefined;\n current = [];\n return;\n }\n if (polyline) {\n entities.push(polyline);\n polyline = undefined;\n }\n if (!type || type === 'EOF') { current = []; return; }\n const e = entityFromPairs(type, current);\n if (type === 'POLYLINE') polyline = e;\n else entities.push(e);\n current = [];\n }\n}\n\nfunction entityFromPairs(type: string, pairs: DxfPair[]): CadEntity {\n const common: Record<string, unknown> = {\n type,\n handle: readString(pairs, 5),\n layer: readString(pairs, 8) ?? '0',\n colorIndex: readNumber(pairs, 62),\n trueColor: readNumber(pairs, 420),\n lineType: readString(pairs, 6),\n lineweight: readNumber(pairs, 370)\n };\n switch (type) {\n case 'LINE': Object.assign(common, { startPoint: readPoint(pairs, 10, 20, 30), endPoint: readPoint(pairs, 11, 21, 31) }); break;\n case 'CIRCLE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40) }); break;\n case 'ARC': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40), startAngle: degreesToRadiansSafe(readNumber(pairs, 50)), endAngle: degreesToRadiansSafe(readNumber(pairs, 51)) }); break;\n case 'POINT': Object.assign(common, { point: readPoint(pairs, 10, 20, 30) }); break;\n case 'TEXT':\n case 'MTEXT': Object.assign(common, { insertionPoint: readPoint(pairs, 10, 20, 30), text: readJoinedText(pairs), textHeight: readNumber(pairs, 40), rotation: degreesToRadiansSafe(readNumber(pairs, 50)) }); break;\n case 'LWPOLYLINE': Object.assign(common, { vertices: readLwPolylineVertices(pairs), flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'POLYLINE': Object.assign(common, { vertices: [], flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'ELLIPSE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), majorAxisEndPoint: readPoint(pairs, 11, 21, 31), axisRatio: readNumber(pairs, 40), startAngle: readNumber(pairs, 41), endAngle: readNumber(pairs, 42) }); break;\n case 'SPLINE': Object.assign(common, { controlPoints: readRepeatedPoints(pairs, 10, 20, 30), degree: readNumber(pairs, 71), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'INSERT': Object.assign(common, { name: readString(pairs, 2), blockName: readString(pairs, 2), insertionPoint: readPoint(pairs, 10, 20, 30), rotation: degreesToRadiansSafe(readNumber(pairs, 50)), scale: { x: readNumber(pairs, 41) ?? 1, y: readNumber(pairs, 42) ?? readNumber(pairs, 41) ?? 1, z: readNumber(pairs, 43) ?? 1 } }); break;\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': Object.assign(common, { vertices: [readPoint(pairs, 10, 20, 30), readPoint(pairs, 11, 21, 31), readPoint(pairs, 12, 22, 32), readPoint(pairs, 13, 23, 33)].filter(Boolean) }); break;\n }\n return normalizeDxfEntity(common);\n}\n\nfunction readNumber(pairs: DxfPair[], code: number): number | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n const n = Number(found);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction readString(pairs: DxfPair[], code: number): string | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n return found && found.length > 0 ? found : undefined;\n}\nfunction readPoint(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D | undefined {\n const x = readNumber(pairs, xCode);\n const y = readNumber(pairs, yCode);\n const z = readNumber(pairs, zCode);\n if (x === undefined || y === undefined) return undefined;\n return z === undefined ? { x, y } : { x, y, z };\n}\nfunction readRepeatedPoints(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== xCode) continue;\n const x = Number(pairs[i].value);\n const yPair = pairs.slice(i + 1).find((pair) => pair.code === yCode);\n const zPair = pairs.slice(i + 1).find((pair) => pair.code === zCode);\n const y = Number(yPair?.value);\n const z = Number(zPair?.value);\n if (Number.isFinite(x) && Number.isFinite(y)) out.push(Number.isFinite(z) ? { x, y, z } : { x, y });\n }\n return out;\n}\nfunction readLwPolylineVertices(pairs: DxfPair[]): Array<CadPoint3D & { bulge?: number }> {\n const out: Array<CadPoint3D & { bulge?: number }> = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== 10) continue;\n const x = Number(pairs[i].value);\n let y: number | undefined;\n let bulge: number | undefined;\n for (let j = i + 1; j < pairs.length; j++) {\n if (pairs[j].code === 10) break;\n if (pairs[j].code === 20) y = Number(pairs[j].value);\n if (pairs[j].code === 42) bulge = Number(pairs[j].value);\n }\n if (Number.isFinite(x) && Number.isFinite(y)) out.push({ x, y: y as number, bulge: Number.isFinite(bulge) ? bulge : undefined });\n }\n return out;\n}\nfunction readJoinedText(pairs: DxfPair[]): string | undefined {\n const chunks = pairs.filter((pair) => pair.code === 1 || pair.code === 3).map((pair) => pair.value);\n return chunks.length ? chunks.join('') : undefined;\n}\n\nfunction degreesToRadiansSafe(value: number | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? degreesToRadians(value) : undefined;\n}\n","import { DwfViewer, openDwfDocument, type DwfViewerOptions, type LoadedDwfDocument, type LoadOptions as DwfLoadOptions, type PageData, type RenderStats as DwfRenderStats, type W2dPrimitive } from 'dwf-viewer';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadDocument, CadEntity, CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadNativeRenderableLoader, CadPage, CadPathCommand, CadPoint3D } from '../../core/types';\n\nexport class DwfLoader implements CadNativeRenderableLoader {\n readonly id = 'dwf';\n readonly label = 'DWF/DWFx native viewer powered by dwf-viewer';\n readonly formats = ['dwf', 'dwfx', 'xps'] as const;\n readonly nativeRenderer = true as const;\n private readonly defaults: CadLoadOptions;\n private native?: DwfViewer;\n private host?: HTMLElement;\n private lastStats?: DwfRenderStats;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n const ext = extensionOf(input);\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwf' || format === 'dwfx' || format === 'xps';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Opening DWF/DWFx with dwf-viewer…', percent: 48 });\n const loaded = await openDwfDocument(bytes, { fileName: sourceName });\n merged.onProgress?.({ phase: 'normalize', format, message: 'Reading DWF pages, sheets and model metadata…', percent: 76 });\n\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx document ready.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n async mount(input: CadLoadInput, host: HTMLElement, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n const wasmUrl = resolveDwfWasmUrl(merged);\n const background = resolveDwfBackground(merged);\n const viewerOptions = buildDwfViewerOptions(merged, wasmUrl, background);\n const loadOptions = buildDwfLoadOptions(merged, wasmUrl, background);\n\n merged.onProgress?.({ phase: 'native-render', format, message: 'Mounting native DWF renderer…', percent: 28 });\n this.unmount();\n this.host = host;\n host.replaceChildren();\n this.native = new DwfViewer(host, viewerOptions);\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Parsing DWF package and page streams…', percent: 58 });\n await this.native.load(bytes, {\n fileName: sourceName,\n ...loadOptions\n });\n\n merged.onProgress?.({ phase: 'render', format, message: 'Rendering DWF/DWFx with dwf-viewer…', percent: 88 });\n this.lastStats = await this.native.render();\n const loaded = this.native.getDocument();\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n document.metadata.loaderMode = 'Native DWF';\n document.metadata.nativeRenderer = 'dwf-viewer';\n document.metadata.nativeRenderStats = this.lastStats ? { ...this.lastStats, warnings: this.lastStats.warnings.length } : undefined;\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx rendered.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n unmount(): void {\n this.native?.dispose();\n this.native = undefined;\n this.lastStats = undefined;\n if (this.host) this.host.replaceChildren();\n }\n\n fit(): void {\n this.native?.fit();\n }\n\n zoomIn(): void {\n const button = (this.native as unknown as { zoomInButton?: HTMLButtonElement } | undefined)?.zoomInButton;\n button?.click();\n }\n\n zoomOut(): void {\n const button = (this.native as unknown as { zoomOutButton?: HTMLButtonElement } | undefined)?.zoomOutButton;\n button?.click();\n }\n\n resize(): void {\n void this.native?.render();\n }\n\n setNativeOptions(options: CadLoadOptions): void {\n const native = this.native as unknown as {\n background?: string;\n setPreferWebgl?: (value: boolean) => void;\n setPreferWasm?: (value: boolean) => void;\n setLineWeightMode?: (value: NonNullable<CadLoadOptions['dwfLineWeightMode']>) => void;\n minStrokeCssPx?: number;\n maxOverviewStrokeCssPx?: number;\n minTextCssPx?: number;\n minFilledAreaCssPx?: number;\n render?: () => Promise<unknown>;\n } | undefined;\n if (!native) return;\n if (typeof options.dwfBackground === 'string') native.background = options.dwfBackground;\n else {\n const background = resolveDwfBackground(options);\n if (background) native.background = background;\n }\n if (typeof options.dwfPreferWebgl === 'boolean') native.setPreferWebgl?.(options.dwfPreferWebgl);\n if (typeof options.dwfPreferWasm === 'boolean') native.setPreferWasm?.(options.dwfPreferWasm);\n if (options.dwfLineWeightMode) native.setLineWeightMode?.(options.dwfLineWeightMode);\n setOptionalNumber(native, 'minStrokeCssPx', options.dwfMinStrokeCssPx);\n setOptionalNumber(native, 'maxOverviewStrokeCssPx', options.dwfMaxOverviewStrokeCssPx);\n setOptionalNumber(native, 'minTextCssPx', options.dwfMinTextCssPx);\n setOptionalNumber(native, 'minFilledAreaCssPx', options.dwfMinFilledAreaCssPx);\n void native.render?.();\n }\n\n getLastNativeStats(): DwfRenderStats | undefined {\n return this.lastStats;\n }\n}\n\nfunction cadDocumentFromDwf(loaded: LoadedDwfDocument | undefined, sourceName: string | undefined, format: CadFormat, keepRaw: boolean): CadDocument {\n const warnings = diagnosticsToWarnings(loaded?.diagnostics ?? []);\n const pages = (loaded?.pageData ?? []).map((page, index) => pageToCadPage(page, index));\n for (const page of loaded?.pageData ?? []) warnings.push(...diagnosticsToWarnings(page.diagnostics));\n const metadata = {\n parser: 'dwf-viewer',\n nativeRenderer: 'dwf-viewer',\n dwfKind: loaded?.kind,\n packageEntries: loaded?.packageEntries?.length ?? 0,\n resources: loaded?.resources?.length ?? 0,\n pageKinds: countBy((loaded?.pageData ?? []).map((page) => page.kind)),\n pageNames: (loaded?.pages ?? []).map((page) => page.name)\n };\n return createCadDocument({\n format,\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata,\n warnings: unique(warnings),\n raw: keepRaw ? loaded : undefined\n });\n}\n\nfunction pageToCadPage(page: PageData, index: number): CadPage {\n const entities = pageEntities(page, index);\n return {\n index,\n name: page.name || page.sourcePath || `${index + 1}`,\n width: page.width || 1000,\n height: page.height || 1000,\n entities\n };\n}\n\nfunction pageEntities(page: PageData, pageIndex: number): CadEntity[] {\n if (page.kind === 'w2d-text') return page.primitives.flatMap((primitive, index) => primitiveToEntity(primitive, pageIndex, index));\n if (page.kind === 'image') {\n return [{ type: 'DWF_IMAGE_PAGE', kind: 'image', pageIndex, width: page.width, height: page.height, imageSource: page.sourcePath }];\n }\n if (page.kind === 'w3d-model') {\n return page.model.meshes.map((mesh, index) => ({\n id: mesh.id,\n type: 'W3D_MESH',\n kind: 'solid',\n pageIndex,\n color: mesh.color ? rgbToHex(mesh.color) : undefined,\n name: mesh.name || `mesh-${index + 1}`,\n raw: { vertexCount: mesh.vertexCount, triangleCount: mesh.triangleCount, materialId: mesh.materialId }\n }));\n }\n if (page.kind === 'xps-fixed-page') {\n return [{ type: 'XPS_FIXED_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n }\n return [{ type: 'DWF_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n}\n\nfunction primitiveToEntity(primitive: W2dPrimitive, pageIndex: number, index: number): CadEntity[] {\n const base = {\n id: `dwf-${pageIndex}-${index}`,\n pageIndex,\n color: primitive.stroke,\n fillColor: primitive.fill,\n lineweight: primitive.lineWidth,\n raw: { matrix: primitive.matrix }\n } satisfies Partial<CadEntity>;\n if (primitive.type === 'polyline' || primitive.type === 'polygon') {\n return [{\n ...base,\n type: primitive.type === 'polygon' ? 'DWF_POLYGON' : 'DWF_POLYLINE',\n kind: 'polyline',\n vertices: pointsArrayToCadPoints(primitive.points),\n isClosed: primitive.type === 'polygon'\n }];\n }\n if (primitive.type === 'path') {\n return [{ ...base, type: 'DWF_PATH', kind: 'path', commands: primitive.commands as unknown as CadPathCommand[] }];\n }\n if (primitive.type === 'text') {\n return [{\n ...base,\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: { x: primitive.x, y: primitive.y, z: 0 },\n text: primitive.text,\n textHeight: primitive.size\n }];\n }\n if (primitive.type === 'rect') {\n const x = primitive.x;\n const y = primitive.y;\n const w = primitive.width;\n const h = primitive.height;\n return [{\n ...base,\n type: 'DWF_RECT',\n kind: 'polyline',\n isClosed: true,\n vertices: [\n { x, y, z: 0 },\n { x: x + w, y, z: 0 },\n { x: x + w, y: y + h, z: 0 },\n { x, y: y + h, z: 0 }\n ]\n }];\n }\n return [];\n}\n\nfunction pointsArrayToCadPoints(points: number[]): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) out.push({ x: points[i], y: points[i + 1], z: 0 });\n return out;\n}\n\nfunction diagnosticsToWarnings(diagnostics: readonly { level: string; code: string; message: string; source?: string }[]): string[] {\n return diagnostics\n .filter((item) => item.level !== 'info')\n .map((item) => `${item.code}: ${item.message}${item.source ? ` (${item.source})` : ''}`);\n}\n\nfunction normalizeFormat(detected: CadFormat, ext: string): CadFormat {\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return ext;\n if (detected === 'dwf' || detected === 'dwfx' || detected === 'xps') return detected;\n return 'dwf';\n}\n\nfunction resolveDwfWasmUrl(options: CadLoadOptions): string | undefined {\n if (options.dwfWasmUrl) return options.dwfWasmUrl;\n if (typeof document === 'undefined') return undefined;\n const base = options.wasmPath\n ? new URL(ensureTrailingSlash(options.wasmPath), document.baseURI).href\n : new URL('wasm/', document.baseURI).href;\n return new URL('dwfv-render.wasm', base).href;\n}\n\nfunction resolveDwfBackground(options: CadLoadOptions): string {\n if (options.dwfBackground) return options.dwfBackground;\n const canvasOptions = (options as CadLoadOptions & { canvasOptions?: { background?: string } }).canvasOptions;\n return canvasOptions?.background ?? '#05070d';\n}\n\nfunction buildDwfViewerOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfViewerOptions {\n return {\n ...buildDwfLoadOptions(options, wasmUrl, background),\n maxDevicePixelRatio: options.dwfMaxDevicePixelRatio ?? 2,\n maxCanvasPixels: options.dwfMaxCanvasPixels ?? 16_777_216\n };\n}\n\nfunction buildDwfLoadOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfLoadOptions {\n return {\n wasmUrl,\n preferWebgl: options.dwfPreferWebgl ?? true,\n preferWasm: options.dwfPreferWasm ?? true,\n background,\n maxGpuCacheBytes: options.dwfMaxGpuCacheBytes ?? 160 * 1024 * 1024,\n maxCachedScenes: options.dwfMaxCachedScenes ?? 2,\n lineWeightMode: options.dwfLineWeightMode ?? 'adaptive',\n minStrokeCssPx: options.dwfMinStrokeCssPx,\n maxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,\n minTextCssPx: options.dwfMinTextCssPx,\n minFilledAreaCssPx: options.dwfMinFilledAreaCssPx\n };\n}\n\nfunction setOptionalNumber<T extends object, K extends keyof T>(target: T, key: K, value: number | undefined): void {\n if (typeof value === 'number' && Number.isFinite(value)) target[key] = value as T[K];\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction rgbToHex(rgb: [number, number, number]): string {\n const [r, g, b] = rgb.map((value) => Math.max(0, Math.min(255, Math.round(value * 255))));\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return value.toString(16).padStart(2, '0');\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const value of values) out[value] = (out[value] ?? 0) + 1;\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { CadLoaderRegistry } from './CadLoaderRegistry';\nimport { DwgLoader } from './dwg/DwgLoader';\nimport { DxfLoader } from './dxf/DxfLoader';\nimport { DwfLoader } from './dwf/DwfLoader';\nimport type { CadLoadOptions } from '../core/types';\n\nexport function createDefaultLoaderRegistry(options: CadLoadOptions = {}): CadLoaderRegistry {\n return new CadLoaderRegistry([\n new DwgLoader(options),\n new DxfLoader(options),\n new DwfLoader(options)\n ]);\n}\n\nexport { CadLoaderRegistry } from './CadLoaderRegistry';\nexport { DwgLoader, DwgWorkerClient, supportsDwgWorker } from './dwg/DwgLoader';\nexport { DxfLoader } from './dxf/DxfLoader';\nexport { DwfLoader } from './dwf/DwfLoader';\n","class w {\n /**\n * Converts an unsigned byte to a signed byte as used in SHX format.\n * Values > 127 are converted to their signed equivalent (-128 to -1).\n * @param value - The unsigned byte value to convert\n * @returns The signed byte value\n */\n static byteToSByte(t) {\n return (t & 127) - (t & 128 ? 128 : 0);\n }\n /**\n * Creates a new ShxFileReader instance.\n * @param arraybuffer - The ArrayBuffer to read from\n */\n constructor(t) {\n this.position = 0, this.data = new DataView(t);\n }\n /**\n * Reads a specified number of bytes from the current position.\n * @param length - Number of bytes to read (optional)\n * @returns A Uint8Array containing the read bytes\n * @throws Error if reading beyond buffer bounds\n */\n readBytes(t = 1) {\n this.data.byteLength < this.position + t && this.throwOutOfRangeError(this.position + t);\n const e = new Uint8Array(this.data.buffer, this.position, t);\n return this.position += t, e;\n }\n /**\n * Skips a specified number of bytes from the current position.\n * @param length - Number of bytes to skip\n * @throws Error if skipping beyond buffer bounds\n */\n skip(t) {\n this.data.byteLength < this.position + t && this.throwOutOfRangeError(this.position + t), this.position += t;\n }\n /**\n * Reads an unsigned 8-bit integer.\n * @returns The read uint8 value\n * @throws Error if reading beyond buffer bounds\n */\n readUint8() {\n this.data.byteLength < this.position + 1 && this.throwOutOfRangeError(this.position + 1);\n const t = this.data.getUint8(this.position);\n return this.position += 1, t;\n }\n /**\n * Reads a signed 8-bit integer.\n * @returns The read int8 value\n * @throws Error if reading beyond buffer bounds\n */\n readInt8() {\n this.data.byteLength < this.position + 1 && this.throwOutOfRangeError(this.position + 1);\n const t = this.data.getInt8(this.position);\n return this.position += 1, t;\n }\n /**\n * Reads an unsigned 16-bit integer.\n * @param littleEndian If false, a big-endian value should be read.\n * @returns The read uint16 value\n * @throws Error if reading beyond buffer bounds\n */\n readUint16(t = !0) {\n this.data.byteLength < this.position + 2 && this.throwOutOfRangeError(this.position + 2);\n const e = this.data.getUint16(this.position, t);\n return this.position += 2, e;\n }\n /**\n * Reads a signed 16-bit integer.\n * @returns The read int16 value\n * @throws Error if reading beyond buffer bounds\n */\n readInt16() {\n this.data.byteLength < this.position + 2 && this.throwOutOfRangeError(this.position + 2);\n const t = this.data.getInt16(this.position, !0);\n return this.position += 2, t;\n }\n /**\n * Reads an unsigned 32-bit integer.\n * @returns The read uint32 value\n * @throws Error if reading beyond buffer bounds\n */\n readUint32() {\n this.data.byteLength < this.position + 4 && this.throwOutOfRangeError(this.position + 4);\n const t = this.data.getUint32(this.position, !0);\n return this.position += 4, t;\n }\n /**\n * Reads a signed 32-bit integer.\n * @returns The read int32 value\n * @throws Error if reading beyond buffer bounds\n */\n readInt32() {\n this.data.byteLength < this.position + 4 && this.throwOutOfRangeError(this.position + 4);\n const t = this.data.getInt32(this.position, !0);\n return this.position += 4, t;\n }\n /**\n * Reads a 32-bit floating point number.\n * @returns The read float32 value\n * @throws Error if reading beyond buffer bounds\n */\n readFloat32() {\n this.data.byteLength < this.position + 4 && this.throwOutOfRangeError(this.position + 4);\n const t = this.data.getFloat32(this.position, !0);\n return this.position += 4, t;\n }\n /**\n * Reads a 64-bit floating point number.\n * @returns The read float64 value\n * @throws Error if reading beyond buffer bounds\n */\n readFloat64() {\n this.data.byteLength < this.position + 8 && this.throwOutOfRangeError(this.position + 8);\n const t = this.data.getFloat64(this.position, !0);\n return this.position += 8, t;\n }\n /**\n * Sets the current read position in the buffer.\n * @param position - The new position to set\n */\n setPosition(t) {\n this.data.byteLength < t && this.throwOutOfRangeError(t), this.position = t;\n }\n /**\n * Checks if the current position is at the end of the buffer.\n * @returns True if at the end of the buffer, false otherwise\n */\n isEnd() {\n return this.position === this.data.byteLength - 1;\n }\n /**\n * Gets the current position in the buffer.\n * @returns The current position\n */\n get currentPosition() {\n return this.position;\n }\n /**\n * Gets the total length of the buffer.\n * @returns The buffer length in bytes\n */\n get length() {\n return this.data.byteLength;\n }\n /**\n * Throws an error when attempting to read beyond buffer bounds.\n * @param position - The position that caused the error\n * @throws Error with details about the out of range access\n */\n throwOutOfRangeError(t) {\n throw new Error(\n `Position ${t} is out of range for the data length ${this.data.byteLength}!`\n );\n }\n}\nvar d = /* @__PURE__ */ ((c) => (c.SHAPES = \"shapes\", c.BIGFONT = \"bigfont\", c.UNIFONT = \"unifont\", c))(d || {});\nclass z {\n parse(t) {\n const n = this.parseHeader(t).split(\" \"), i = n[1].toLocaleLowerCase();\n if (!Object.values(d).includes(i))\n throw new Error(`Invalid font type: ${i}`);\n return {\n fileHeader: n[0],\n fontType: i,\n fileVersion: n[2]\n };\n }\n parseHeader(t) {\n let e = \"\", i = 0;\n for (; t.currentPosition < t.length - 2 && i < 1024; ) {\n const s = t.readUint8();\n if (s === 13) {\n const o = t.currentPosition, r = t.readUint8(), h = t.readUint8();\n if (r === 10 && h === 26)\n break;\n t.setPosition(o), e += String.fromCharCode(s);\n } else\n e += String.fromCharCode(s);\n i++;\n }\n return e.trim();\n }\n}\nconst O = 10, j = [13, 10, 0];\nfunction U(c, t) {\n if (t === 0) {\n c.orientation = \"horizontal\";\n return;\n }\n if (t === 2) {\n c.orientation = \"horizontal\", c.dualOrientation = !0;\n return;\n }\n c.orientation = \"vertical\";\n}\nfunction $(c) {\n const t = {};\n for (const [e, n] of Object.entries(c))\n t[n] = e;\n return t;\n}\nfunction H(c) {\n const t = c.indexOf(0);\n return t < 0 ? { name: null, bytecode: c } : { name: t > 0 ? new TextDecoder(\"ascii\").decode(c.subarray(0, t)) : null, bytecode: c.subarray(t + 1) };\n}\nclass K {\n parse(t) {\n try {\n t.readBytes(4);\n const e = t.readInt16();\n if (e <= 0)\n throw new Error(\"Invalid shape count in font file\");\n const n = [];\n for (let h = 0; h < e; h++) {\n const a = t.readUint16(), l = t.readUint16();\n l > 0 && n.push({ code: a, length: l });\n }\n const i = {};\n for (const h of n)\n try {\n const a = t.readBytes(h.length);\n a.length === h.length && (i[h.code] = a);\n } catch {\n console.warn(`Failed to read shape data for code ${h.code}`);\n }\n const s = {}, o = {};\n for (const [h, a] of Object.entries(i)) {\n const l = Number(h);\n if (l === 0) {\n s[l] = a;\n continue;\n }\n const { name: u, bytecode: p } = H(a);\n s[l] = p, u && (o[u] = l);\n }\n const r = {\n data: s,\n names: Object.keys(o).length > 0 ? o : void 0,\n codeToName: Object.keys(o).length > 0 ? $(o) : void 0,\n info: \"\",\n baseUp: 8,\n baseDown: 2,\n height: O,\n width: O,\n orientation: \"horizontal\",\n isExtended: !1\n };\n if (0 in s) {\n const h = s[0];\n try {\n const a = new TextDecoder().decode(h);\n let l = h.findIndex((u) => j.includes(u));\n l >= 0 && (r.info = a.substring(0, l), l + 3 < h.length && (r.baseUp = h[l + 1], r.baseDown = h[l + 2], r.height = r.baseDown + r.baseUp, r.width = r.height, U(r, h[l + 3])));\n } catch {\n console.warn(\"Failed to parse font info block\");\n }\n }\n return r;\n } catch (e) {\n const n = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to parse shape font: ${n}`);\n }\n }\n}\nclass q {\n parse(t) {\n try {\n t.readInt16();\n const e = t.readInt16(), n = t.readInt16();\n if (e <= 0)\n throw new Error(\"Invalid character count in font file\");\n t.skip(n * 4);\n const i = [];\n for (let r = 0; r < e; r++) {\n const h = t.readUint16(), a = t.readUint16(), l = t.readUint32();\n (h !== 0 || a !== 0 || l !== 0) && i.push({ code: h, length: a, offset: l });\n }\n const s = {};\n for (const r of i)\n try {\n t.setPosition(r.offset);\n const h = t.readBytes(r.length);\n h.length === r.length && (s[r.code] = h);\n } catch {\n console.warn(`Failed to read bigfont data for code ${r.code}`);\n }\n const o = {\n data: s,\n info: \"\",\n baseUp: 8,\n baseDown: 2,\n height: O,\n width: O,\n orientation: \"horizontal\",\n isExtended: !1\n };\n if (0 in s) {\n const r = s[0];\n try {\n const h = this.utf8ArrayToStr(r);\n if (h.pos >= 0) {\n let a = h.text;\n for (; a.length > 0 && a.charCodeAt(a.length - 1) === 0; )\n a = a.slice(0, -1);\n o.info = a;\n const l = this.parseBigfontMetrics(r, h.pos + 1);\n l && Object.assign(o, l);\n }\n } catch {\n console.warn(\"Failed to parse bigfont info block\");\n }\n }\n return o;\n } catch (e) {\n const n = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to parse big font: ${n}`);\n }\n }\n parseBigfontMetrics(t, e) {\n let n = e;\n for (; n < t.length && t[n] === 0; )\n n++;\n const i = t.length - n;\n if (i <= 0)\n return null;\n const s = (o) => o === 0 ? \"horizontal\" : \"vertical\";\n if (i >= 5) {\n const o = t[n++];\n n++;\n const r = s(t[n++]), h = t[n++];\n return {\n baseUp: o,\n baseDown: 0,\n height: o,\n width: h,\n orientation: r,\n isExtended: !0\n };\n }\n if (i === 4 && t[n + 1] === 0 && t[n + 3] > 0 && t[n + 3] !== t[n]) {\n const o = t[n++];\n n++;\n const r = s(t[n++]), h = t[n];\n return {\n baseUp: o,\n baseDown: 0,\n height: o,\n width: h,\n orientation: r,\n isExtended: !0\n };\n }\n if (i === 4) {\n const o = t[n++], r = t[n++], h = s(t[n++]);\n return {\n baseUp: o,\n baseDown: r,\n height: o + r,\n width: o + r,\n orientation: h,\n isExtended: !1\n };\n }\n if (i === 3) {\n const o = t[n++], r = t[n++], h = s(r), a = r === 2;\n return {\n baseUp: o,\n baseDown: 0,\n height: o,\n width: o,\n orientation: h,\n // Dual-orientation vertical bigfonts (modes=2) use composite bytecode.\n isExtended: a,\n verticalDualMode: a\n };\n }\n return null;\n }\n utf8ArrayToStr(t) {\n let e = \"\", n = 0;\n for (; n < t.length; ) {\n const i = t[n];\n switch (i >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n e += String.fromCharCode(i);\n break;\n case 12:\n case 13: {\n const s = t[n++];\n e += String.fromCharCode((i & 31) << 6 | s & 63);\n break;\n }\n case 14: {\n const s = t[n++], o = t[n++];\n e += String.fromCharCode(\n (i & 15) << 12 | (s & 63) << 6 | (o & 63) << 0\n );\n break;\n }\n }\n if (e.charCodeAt(e.length - 1) === 0) break;\n n++;\n }\n return { text: e, pos: n };\n }\n}\nclass Z {\n parse(t) {\n try {\n const e = t.readInt32();\n if (e <= 0)\n throw new Error(\"Invalid character count in font file\");\n const n = t.readInt16(), i = t.readBytes(n), s = {\n data: {},\n info: \"\",\n baseUp: 8,\n baseDown: 2,\n height: O,\n width: O,\n orientation: \"horizontal\",\n isExtended: !1\n };\n try {\n const h = new TextDecoder().decode(i);\n let a = h.indexOf(\"\\0\");\n a >= 0 && (s.info = h.substring(0, a), a + 3 < i.length && (s.baseUp = i[a + 1], s.baseDown = i[a + 2], s.height = s.baseUp + s.baseDown, s.width = s.height, U(s, i[a + 3])));\n } catch {\n console.warn(\"Failed to parse unifont info block\");\n }\n const o = {}, r = {};\n for (let h = 0; h < e - 1; h++)\n try {\n const a = t.readUint16(), l = t.readUint16();\n if (l > 0) {\n const u = t.readBytes(l);\n if (u.length === l) {\n const { name: p, bytecode: g } = H(u);\n g.length > 0 && (o[a] = g, p && (r[p] = a));\n }\n }\n } catch {\n console.warn(\"Failed to read unifont character data\");\n break;\n }\n return s.data = o, s.names = Object.keys(r).length > 0 ? r : void 0, s.codeToName = Object.keys(r).length > 0 ? $(r) : void 0, s;\n } catch (e) {\n const n = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to parse unifont: ${n}`);\n }\n }\n}\nclass J {\n static createParser(t) {\n switch (t) {\n case d.SHAPES:\n return new K();\n case d.BIGFONT:\n return new q();\n case d.UNIFONT:\n return new Z();\n default:\n throw new Error(`Unsupported font type: ${t}`);\n }\n }\n}\nconst Q = 1e-6, D = 0.2;\nclass L {\n /**\n * Whether the aligned glyph should store the resolved advance as explicit.\n * When false, {@link ShxShape.hasExplicitAdvance} is preserved from the source glyph.\n */\n markAlignedAdvanceExplicit(t) {\n return !1;\n }\n}\nclass mt extends L {\n resolve(t, e) {\n var s;\n const n = ((s = t.lastPoint) == null ? void 0 : s.x) ?? 0, i = t.polylines.some((o) => o.length >= 2);\n return t.hasExplicitAdvance || !i && Math.abs(n) > Q ? n : e;\n }\n}\nclass M extends L {\n constructor(t = D) {\n super(), this.cellWidthFactor = t;\n }\n /**\n * True when ink extends left of the glyph origin (UNIFONT center-cell encoding).\n */\n static isCenterOriginGlyph(t) {\n return t.bbox.minX < -1e-6;\n }\n /**\n * Resolves ink-based advance for a glyph at a scaled cell width.\n *\n * Left-origin glyphs (`minX >= 0`): `maxX + cellWidth * factor`.\n * Center-origin glyphs (`minX < 0`): advance to the right cell edge\n * (`max(maxX, cellWidth / 2)`) plus padding, so narrow centered punctuation\n * keeps trailing whitespace instead of colliding with the next glyph.\n */\n static computeAdvance(t, e, n = D) {\n if (!t.polylines.some((r) => r.length >= 2))\n return e * n;\n const s = e * n, { maxX: o } = t.bbox;\n return M.isCenterOriginGlyph(t) ? Math.max(o, e / 2) + s : o + s;\n }\n resolve(t, e) {\n var n;\n return t.hasExplicitAdvance ? ((n = t.lastPoint) == null ? void 0 : n.x) ?? 0 : M.computeAdvance(t, e, this.cellWidthFactor);\n }\n markAlignedAdvanceExplicit(t) {\n return !0;\n }\n}\nconst E = new M();\nclass f {\n /**\n * Creates a new Point instance.\n * @param x - The x-coordinate (defaults to 0)\n * @param y - The y-coordinate (defaults to 0)\n */\n constructor(t = 0, e = 0) {\n this.x = t, this.y = e;\n }\n /**\n * Sets the coordinates of the point.\n * @param x - The new x-coordinate\n * @param y - The new y-coordinate\n * @returns The point instance for method chaining\n */\n set(t, e) {\n return this.x = t, this.y = e, this;\n }\n /**\n * Calculates the length (magnitude) of the vector from origin to this point.\n * @returns The length of the vector\n */\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n /**\n * Normalizes the point vector to have a length of 1.\n * @returns The point instance for method chaining\n */\n normalize() {\n const t = this.length();\n return t !== 0 && (this.x /= t, this.y /= t), this;\n }\n /**\n * Creates a new Point instance with the same coordinates.\n * @returns A new Point instance with the same x and y values\n */\n clone() {\n return new f(this.x, this.y);\n }\n /**\n * Adds another point's coordinates to this point.\n * @param point - The point to add\n * @returns The point instance for method chaining\n */\n add(t) {\n return this.x += t.x, this.y += t.y, this;\n }\n /**\n * Subtracts another point's coordinates from this point.\n * @param point - The point to subtract\n * @returns The point instance for method chaining\n */\n subtract(t) {\n return this.x -= t.x, this.y -= t.y, this;\n }\n /**\n * Multiplies both coordinates by a scalar value.\n * @param scalar - The scalar value to multiply by\n * @returns The point instance for method chaining\n */\n multiply(t) {\n return this.x *= t, this.y *= t, this;\n }\n /**\n * Divides both coordinates by a scalar value.\n * @param scalar - The scalar value to divide by\n * @returns The point instance for method chaining\n */\n divide(t) {\n return t !== 0 && (this.x /= t, this.y /= t), this;\n }\n /**\n * Multiplies x and y coordinates by different scalar values.\n * @param xScalar - The scalar value to multiply x-coordinate by\n * @param yScalar - The scalar value to multiply y-coordinate by\n * @returns The point instance for method chaining\n */\n multiplyScalars(t, e) {\n return this.x *= t, this.y *= e, this;\n }\n /**\n * Divides x and y coordinates by different scalar values.\n * @param xScalar - The scalar value to divide x-coordinate by\n * @param yScalar - The scalar value to divide y-coordinate by\n * @returns The point instance for method chaining\n */\n divideScalars(t, e) {\n return t !== 0 && (this.x /= t), e !== 0 && (this.y /= e), this;\n }\n /**\n * Calculates the Euclidean distance to another point.\n * @param point - The point to calculate distance to\n * @returns The distance between the two points\n */\n distanceTo(t) {\n const e = this.x - t.x, n = this.y - t.y;\n return Math.sqrt(e * e + n * n);\n }\n}\nfunction _(c) {\n const { width: t, capHeight: e, descenderHeight: n, origin: i = \"baseline\" } = c, s = e + n;\n return i === \"top\" ? { minX: -t / 2, maxX: t / 2, minY: -s, maxY: 0 } : { minX: 0, maxX: t, minY: -n, maxY: e };\n}\nfunction tt(c) {\n return [c.minX, c.minY, c.maxX, c.maxY].every(Number.isFinite);\n}\nfunction et(c, t, e = 1e-6) {\n return t.minX >= c.minX - e && t.maxX <= c.maxX + e && t.minY >= c.minY - e && t.maxY <= c.maxY + e;\n}\nfunction nt(c, t) {\n return {\n minX: Math.min(c.minX, t.minX),\n minY: Math.min(c.minY, t.minY),\n maxX: Math.max(c.maxX, t.maxX),\n maxY: Math.max(c.maxY, t.maxY)\n };\n}\nfunction it(c, t, e) {\n const n = c.maxX - c.minX, i = c.maxY - c.minY;\n return `<rect x=\"${c.minX}\" y=\"${-c.maxY}\" width=\"${n}\" height=\"${i}\" fill=\"none\" stroke=\"${t}\" stroke-width=\"${e}\"/>`;\n}\nfunction F(c, t) {\n const e = c.maxX - c.minX, n = c.maxY - c.minY;\n return `<rect x=\"${c.minX}\" y=\"${-c.maxY}\" width=\"${e}\" height=\"${n}\" fill=\"${t}\"/>`;\n}\nfunction st(c, t, e, n, i, s, o) {\n const r = ` stroke-dasharray=\"${o}\"`;\n return `<line x1=\"${c}\" y1=\"${-t}\" x2=\"${e}\" y2=\"${-n}\" stroke=\"${i}\" stroke-width=\"${s}\"${r}/>`;\n}\nfunction ot(c, t, e) {\n const { capHeight: n, descenderHeight: i, origin: s = \"baseline\" } = c, o = n + i, r = _(c);\n let h, a, l;\n s === \"top\" ? (n > 0 && (h = { minX: r.minX, maxX: r.maxX, minY: -n, maxY: 0 }), i > 0 && (a = {\n minX: r.minX,\n maxX: r.maxX,\n minY: -o,\n maxY: -n\n }), l = -n) : (n > 0 && (h = { minX: r.minX, maxX: r.maxX, minY: 0, maxY: n }), i > 0 && (a = {\n minX: r.minX,\n maxX: r.maxX,\n minY: -i,\n maxY: 0\n }), l = 0);\n const g = [\n h ? F(h, \"rgba(255, 0, 0, 0.06)\") : \"\",\n a ? F(a, \"rgba(255, 0, 0, 0.14)\") : \"\",\n it(r, t, e)\n ];\n return l !== void 0 && i > 0 && n > 0 && g.push(\n st(\n r.minX,\n l,\n r.maxX,\n l,\n t,\n e,\n \"4 2\"\n )\n ), `<g>${g.join(\"\")}</g>`;\n}\nclass v {\n constructor(t, e = [], n = !1) {\n this.lastPoint = t, this.polylines = e, this.hasExplicitAdvance = n;\n }\n /**\n * Get the bounding box of the shape\n * @returns Bounding box of the shape\n */\n get bbox() {\n if (this._bbox)\n return this._bbox;\n let t = 1 / 0, e = -1 / 0, n = 1 / 0, i = -1 / 0;\n return this.polylines.forEach((s) => {\n s.forEach((o) => {\n t = Math.min(t, o.x), e = Math.max(e, o.x), n = Math.min(n, o.y), i = Math.max(i, o.y);\n });\n }), this._bbox = { minX: t, minY: n, maxX: e, maxY: i }, this._bbox;\n }\n /**\n * Offset the shape by a point\n * @param p The point to offset the shape by\n * @param isNewInstance Whether to return a new instance of the shape or modify the current instance\n * @returns The offset shape\n */\n offset(t, e = !0) {\n var n, i;\n return e ? new v(\n (n = this.lastPoint) == null ? void 0 : n.clone().add(t),\n this.polylines.map((s) => s.map((o) => o.clone().add(t))),\n this.hasExplicitAdvance\n ) : ((i = this.lastPoint) == null || i.add(t), this.polylines.forEach((s) => s.forEach((o) => o.add(t))), this._bbox && (this._bbox.maxX += t.x, this._bbox.minX += t.x, this._bbox.maxY += t.y, this._bbox.minY += t.y), this);\n }\n /**\n * Normalizes a shape so that its bounding box’s bottom-left corner moves to the origin (0,0).\n * It doesn’t change the size or orientation, only repositions the shape.\n * @param isNewInstance Whether to return a new instance of the shape or modify the current instance\n * @returns The offset shape\n */\n normalizeToOrigin(t = !1) {\n const e = this.bbox;\n return this.offset(new f(-e.minX, -e.minY), t);\n }\n /**\n * Converts the shape to an SVG string\n * @param options SVG rendering options\n * @returns SVG string\n */\n toSVG(t = {}) {\n const {\n strokeWidth: e = \"0.5%\",\n strokeColor: n = \"black\",\n isAutoFit: i = !1,\n fontCell: s\n } = t;\n let o, r;\n const h = (a) => this.polylines.map((l) => {\n let u = \"\";\n return l.forEach((p, g) => {\n const { x: y, y: b } = a(p);\n u += g === 0 ? `M ${y} ${b} ` : `L ${y} ${b} `;\n }), `<path d=\"${u}\" stroke=\"${n}\" stroke-width=\"${e}\" fill=\"none\"/>`;\n }).join(\"\");\n if (s) {\n const {\n padding: a = 0.1,\n expandToFit: l = !1,\n showFrame: u = !1,\n frameColor: p = \"red\",\n frameStrokeWidth: g = \"0.5%\"\n } = s, y = _(s), b = this.bbox;\n let m = y;\n l && tt(b) && !et(y, b) && (m = nt(y, b));\n const S = m.maxX - m.minX, x = m.maxY - m.minY, A = S * a, P = x * a, k = m.minX - A, R = m.maxX + A, W = m.minY - P, I = m.maxY + P;\n r = h((C) => ({\n x: C.x,\n y: -C.y\n }));\n const V = u ? ot(s, p, g) : \"\";\n return o = `${k} ${-I} ${R - k} ${I - W}`, `<svg width=\"100%\" height=\"100%\" viewBox=\"${o}\" preserveAspectRatio=\"xMidYMid meet\">${V}${r}</svg>`;\n } else if (i) {\n const a = this.bbox, l = 0.2, u = a.maxX - a.minX, p = a.maxY - a.minY, g = u === 0 ? p : u, y = p === 0 ? u : p, b = a.minX - g * l, m = a.maxX + g * l, S = a.minY - y * l, x = a.maxY + y * l;\n r = h((A) => ({\n x: A.x,\n y: -A.y\n })), o = `${b} ${-x} ${m - b} ${x - S}`;\n } else\n o = \"0 0 20 20\", r = h((a) => ({\n x: a.x + 5,\n y: -a.y + 15\n }));\n return `<svg width=\"100%\" height=\"100%\" viewBox=\"${o}\" preserveAspectRatio=\"xMidYMid meet\">${r}</svg>`;\n }\n}\nconst N = 8, X = 48, rt = 0.4, at = [\n 52164,\n 45795,\n 49829,\n 50150,\n 54992,\n 47610,\n 54754,\n 46532,\n 51906,\n 53947,\n 49332,\n 51706,\n 46532,\n 54224,\n 52946,\n 52714,\n 52219,\n 45755,\n 51403,\n 46532,\n 53947,\n 50410,\n 49332,\n 52219,\n 52141,\n 46532,\n 50150,\n 51120,\n 50150,\n 54992,\n 51663,\n 50119,\n 53186,\n 46532,\n 46525,\n 51365,\n 52149,\n 47016,\n 46532,\n 51889,\n 51706,\n 46025,\n 47037,\n 55031,\n 48122,\n 50935,\n 47531,\n 48122,\n 51965,\n 55e3\n];\nfunction T(c, t) {\n const { height: e, width: n, baseUp: i, baseDown: s } = c, o = e > 0 ? t / e : 1, r = o * i, h = o * s;\n return {\n size: t,\n capHeight: r,\n descenderHeight: h,\n cellWidth: o * n,\n totalHeight: r + h\n };\n}\nfunction ct(c, t, e) {\n if (c.header.fontType !== d.SHAPES || !(0 in c.content.data))\n return !1;\n const n = -(e.descenderHeight + e.capHeight * 0.2);\n return t.bbox.minY < n;\n}\nfunction G(c, t) {\n const e = -(t.descenderHeight + t.capHeight * 0.05);\n return !(c.bbox.minY < e || c.bbox.maxY - c.bbox.minY < t.capHeight * 0.05);\n}\nfunction ht(c, t, e) {\n if (c.header.fontType !== d.BIGFONT || c.content.baseDown > 0)\n return 0;\n const { height: n } = c.content;\n if (n <= 0)\n return 0;\n const i = n * rt, s = [], o = /* @__PURE__ */ new Set(), r = (a) => {\n if (o.has(a) || a <= 255 || !(a in c.content.data))\n return;\n o.add(a);\n const l = t(a);\n if (!l)\n return;\n const u = l.bbox.minY;\n u > 0 && u <= i && s.push(u);\n };\n for (const a of at)\n if (r(a), s.length >= X)\n break;\n if (s.length < N) {\n for (const a of Object.keys(c.content.data))\n if (r(Number(a)), s.length >= X)\n break;\n }\n if (s.length < N)\n return 0;\n s.sort((a, l) => a - l);\n const h = Math.floor(s.length / 2);\n return s.length % 2 === 0 ? (s[h - 1] + s[h]) / 2 : s[h];\n}\nfunction lt(c, t, e) {\n if (c.header.fontType !== d.UNIFONT)\n return !1;\n if (c.content.dualOrientation)\n return !0;\n const n = T(c.content, e);\n for (const i of [48, 65, 78, 49]) {\n if (!(i in c.content.data))\n continue;\n const s = t(i);\n if (s && G(s, n))\n return !0;\n }\n return !1;\n}\nfunction ut(c, t, e, n = E, i = !1, s = 0) {\n var a;\n let o = c;\n if (t.header.fontType === d.BIGFONT && s > 0) {\n const l = t.content.height > 0 ? e.size / t.content.height : 1;\n o = o.offset(new f(0, -s * l), !0);\n }\n if (t.header.fontType === d.UNIFONT || ct(t, c, e)) {\n const l = t.header.fontType === d.UNIFONT && (i || t.content.dualOrientation || G(c, e));\n (t.header.fontType === d.UNIFONT ? !l : !0) && (o = o.offset(new f(0, e.capHeight), !0));\n }\n const r = n.resolve(o, e.cellWidth), h = n.markAlignedAdvanceExplicit(o) ? !0 : o.hasExplicitAdvance;\n return new v(\n new f(r, ((a = o.lastPoint) == null ? void 0 : a.y) ?? 0),\n o.polylines,\n h\n );\n}\nfunction dt(c, t, e, n = E, i = !1, s = 0) {\n const o = T(t.content, e);\n return ut(\n c,\n t,\n o,\n n,\n i,\n s\n );\n}\nconst Y = Math.PI / 4;\nclass B {\n /**\n * Creates a bulge-defined arc\n * @param start Start point\n * @param end End point\n * @param bulge Bulge factor (-1 to 1, where 1 is a semicircle)\n */\n static fromBulge(t, e, n) {\n const i = Math.max(-1, Math.min(1, n));\n return new B({\n start: t,\n end: e,\n bulge: i\n });\n }\n /**\n * Creates an octant-defined arc\n * @param center Center point of the arc\n * @param radius Radius of the arc\n * @param startOctant Starting octant (0-7)\n * @param octantCount Number of octants to span (0-8, where 0 means 8 octants)\n * @param isClockwise Whether the arc goes clockwise\n */\n static fromOctant(t, e, n, i, s) {\n return new B({\n center: t,\n radius: e,\n startOctant: n,\n octantCount: i,\n isClockwise: s\n });\n }\n constructor(t) {\n if (t.start && t.end && t.bulge !== void 0) {\n this.start = t.start.clone(), this.end = t.end.clone(), this.bulge = t.bulge, this.isClockwise = t.bulge < 0;\n const e = this.end.clone().subtract(this.start), n = e.length();\n if (Math.abs(this.bulge) * n / 2 === 0) {\n this.radius = 0, this.center = this.start.clone(), this.startAngle = Math.atan2(e.y, e.x), this.endAngle = this.startAngle;\n return;\n }\n const s = 4 * Math.atan(Math.abs(this.bulge));\n this.radius = n / (2 * Math.sin(s / 2));\n const o = this.start.clone().add(e.clone().divide(2)), r = new f(-e.y, e.x);\n r.normalize(), r.multiply(Math.abs(this.radius * Math.cos(s / 2))), this.center = o.clone(), this.isClockwise ? this.center.subtract(r) : this.center.add(r), this.startAngle = Math.atan2(this.start.y - this.center.y, this.start.x - this.center.x), this.endAngle = Math.atan2(this.end.y - this.center.y, this.end.x - this.center.x), this.isClockwise ? this.endAngle >= this.startAngle && (this.endAngle -= 2 * Math.PI) : this.endAngle <= this.startAngle && (this.endAngle += 2 * Math.PI);\n } else if (t.center && t.radius !== void 0 && t.startOctant !== void 0 && t.octantCount !== void 0 && t.isClockwise !== void 0) {\n this.center = t.center.clone(), this.radius = t.radius, this.isClockwise = t.isClockwise, this.startAngle = t.startOctant * Y;\n const e = (t.octantCount === 0 ? 8 : t.octantCount) * Y;\n this.endAngle = this.startAngle + (this.isClockwise ? -e : e), this.start = this.center.clone().add(\n new f(\n this.radius * Math.cos(this.startAngle),\n this.radius * Math.sin(this.startAngle)\n )\n ), this.end = this.center.clone().add(\n new f(this.radius * Math.cos(this.endAngle), this.radius * Math.sin(this.endAngle))\n );\n } else\n throw new Error(\"Invalid arc parameters\");\n }\n /**\n * Tessellates the arc into a series of points that approximate the arc.\n * @param circleSpan The angle span between tessellated points (default Math.PI / 18)\n * @returns Array of points representing the tessellated arc\n */\n tessellate(t = Math.PI / 18) {\n if (this.radius === 0)\n return [this.start.clone(), this.end.clone()];\n const e = [this.start.clone()], n = Math.abs(this.endAngle - this.startAngle), i = Math.max(1, Math.floor(n / t));\n for (let s = 1; s < i; s++) {\n const o = s / i, r = this.isClockwise ? this.startAngle - o * n : this.startAngle + o * n;\n e.push(\n this.center.clone().add(new f(this.radius * Math.cos(r), this.radius * Math.sin(r)))\n );\n }\n return e.push(\n this.end ? this.end.clone() : this.center.clone().add(\n new f(\n this.radius * Math.cos(this.endAngle),\n this.radius * Math.sin(this.endAngle)\n )\n )\n ), e;\n }\n}\nconst ft = Math.PI / 18, gt = 1e-6;\nclass pt {\n constructor(t) {\n this.shapeCache = /* @__PURE__ */ new Map(), this.subshapeCache = /* @__PURE__ */ new Map(), this.shapeData = /* @__PURE__ */ new Map(), this.fontData = t;\n }\n /**\n * Releases parsed shapes and cached shapes\n */\n release() {\n this.shapeCache.clear(), this.subshapeCache.clear(), this.shapeData.clear();\n }\n /**\n * Parses a character's shape with the given font size.\n * @param code - The character code\n * @param size - The font size\n * @returns The parsed shape or undefined if the character is not found\n */\n getCharShape(t, e) {\n const i = this.fontData.header.fontType === d.SHAPES && !(0 in this.fontData.content.data) ? e : e / this.fontData.content.height;\n return this.parseAndScale(t, { factor: i });\n }\n /**\n * Parses a character's shape with scaling options\n * @param code - The character code\n * @param options - Scaling options (factor or height/width)\n * @returns The parsed shape or undefined if the character is not found\n */\n parseAndScale(t, e) {\n if (t === 0)\n return;\n let n;\n if (this.shapeCache.has(t))\n n = this.shapeCache.get(t);\n else {\n const i = this.fontData.content.data;\n if (i[t]) {\n const s = this.prepareBigfontGlyphBytecode(t, i[t]), o = this.fontData.header.fontType !== d.BIGFONT;\n n = this.parseShape(s, { flushOnEnd: !0, initialPenDown: o }), this.shapeData.set(t, n), this.shapeCache.set(t, n);\n }\n }\n if (n) {\n if (e.factor !== void 0)\n return this.scaleShapeByFactor(n, e.factor);\n if (e.height !== void 0) {\n const i = e.width ?? e.height;\n return this.scaleShapeByHeightAndWidth(n, e.height, i);\n } else\n return n;\n }\n }\n /** Strips the embedded character-code prefix from dual-byte BIGFONT parent glyphs. */\n prepareBigfontGlyphBytecode(t, e) {\n if (this.fontData.header.fontType !== d.BIGFONT || t <= 255)\n return e;\n const n = t >> 8 & 255, i = t & 255;\n if (e.length >= 2 && e[0] === n && e[1] === i) {\n let s = 2;\n return e[s] === 0 && s++, e.slice(s);\n }\n return e;\n }\n /**\n * Dual-orientation vertical BIGFONT files (e.g. gbcbig.shx) use 0x8e/0x8f markers on\n * code 7 instead of real subshapes. Only the marker byte is skipped; following setup\n * commands (push / pen up / xy origin) are executed normally.\n */\n isVerticalDualBigfontMarker(t, e, n) {\n return this.fontData.content.verticalDualMode ? n === \"open\" ? t[e] === 142 : t[e] === 143 : !1;\n }\n /**\n * Scales a shape according to the given scale factor\n * @param shape - The shape to scale\n * @param factor - The scale factor\n * @returns The scaled shape\n */\n scaleShapeByFactor(t, e) {\n var n;\n return new v(\n (n = t.lastPoint) == null ? void 0 : n.clone().multiply(e),\n t.polylines.map((i) => i.map((s) => s.clone().multiply(e))),\n t.hasExplicitAdvance\n );\n }\n /**\n * Scales a shape according to the given height and width\n * @param shape - The shape to scale\n * @param height - The target height\n * @param width - The target width\n * @returns The scaled shape\n */\n scaleShapeByHeightAndWidth(t, e, n) {\n var u;\n const i = t.bbox, s = i.maxY - i.minY, o = i.maxX - i.minX, r = s > 0 ? e / s : 1, h = o > 0 ? n / o : 1, a = (u = t.lastPoint) == null ? void 0 : u.clone();\n a && (a.x *= h, a.y *= r);\n const l = t.polylines.map(\n (p) => p.map((g) => {\n const y = g.clone();\n return y.x *= h, y.y *= r, y;\n })\n );\n return new v(a, l, t.hasExplicitAdvance);\n }\n /**\n * Whether code 14 (0x0E) should skip the following command for the current layout.\n * Defaults to horizontal text layout when no orientation is supplied.\n */\n shouldSkipVerticalFlagCommand(t = !1) {\n const { content: e, header: n } = this.fontData;\n return n.fontType === d.BIGFONT ? !e.verticalDualMode : e.dualOrientation ? !t : e.orientation === \"horizontal\";\n }\n /** Marks that bytecode explicitly defines horizontal advance. */\n markAdvanceDefined(t) {\n t.hasExplicitAdvance = !0;\n }\n /** Records a terminal pen-up XY move (codes 8/9). */\n notePenUpPositioning(t) {\n t.pendingTerminalAdvance = !0;\n }\n /** Clears a pending advance when later bytecode supersedes the prior XY move. */\n clearPendingAdvance(t) {\n t.pendingTerminalAdvance = !1;\n }\n stateHasInk(t) {\n return t.currentPolyline.length > 1 ? !0 : t.polylines.some((e) => e.length >= 2);\n }\n /**\n * Confirms terminal pen-up XY (codes 8/9) as advance definition.\n * Ignores closure moves that return to the origin after drawing (e.g. txt `A`).\n */\n finalizeAdvanceFlag(t) {\n if (!t.pendingTerminalAdvance)\n return;\n const e = t.currentPoint.x;\n if (Math.abs(e) > gt) {\n t.hasExplicitAdvance = !0;\n return;\n }\n this.stateHasInk(t) || (t.hasExplicitAdvance = !0);\n }\n /**\n * Parses the shape of a character.\n * @param data - The data of the character\n * @param options - Optional parse settings\n * @returns The parsed shape\n */\n parseShape(t, e = {}) {\n let n = new f();\n const i = [];\n let s = [];\n const o = [];\n let r = e.initialPenDown ?? !1;\n r && s.push(n.clone());\n const h = {\n currentPoint: n,\n polylines: i,\n currentPolyline: s,\n sp: o,\n isPenDown: r,\n scale: 1,\n // Top-level glyphs flush trailing pen-down strokes at 0x00. Subshape\n // primitives and inherited-pen unifont subshapes (amgdt %%132) opt in\n // via flushOnEnd; bigfont subshape cache keeps flush off to avoid regressions.\n flushEndPolyline: e.flushOnEnd ?? !1,\n hasExplicitAdvance: !1,\n pendingTerminalAdvance: !1\n };\n for (let a = 0; a < t.length; a++) {\n const l = t[a];\n l <= 15 ? a = this.handleSpecialCommand(l, t, a, h) : (this.clearPendingAdvance(h), this.handleVectorCommand(l, h));\n }\n return this.finalizeAdvanceFlag(h), this.buildShapeFromState(h);\n }\n /** Builds a shape result, including any trailing pen-down polyline. */\n buildShapeFromState(t) {\n const e = t.polylines.map((n) => n.map((i) => i.clone()));\n return t.currentPolyline.length > 1 && e.push(t.currentPolyline.map((n) => n.clone())), new v(t.currentPoint.clone(), e, t.hasExplicitAdvance);\n }\n /**\n * Please refer to special codes reference in the following link for more information.\n * https://help.autodesk.com/view/OARX/2023/ENU/?guid=GUID-06832147-16BE-4A66-A6D0-3ADF98DC8228\n * @param command - The command byte\n * @param data - The data of the character\n * @param index - The index of the command byte\n * @param state - The state of the parser\n * @returns The index of the next command byte\n */\n handleSpecialCommand(t, e, n, i) {\n let s = n;\n switch (t) {\n case 0:\n this.finalizeAdvanceFlag(i), i.flushEndPolyline && i.currentPolyline.length > 1 ? (i.polylines.push(i.currentPolyline.slice()), i.currentPolyline = []) : i.flushEndPolyline && (i.currentPolyline = []), i.isPenDown = !1;\n break;\n case 1:\n this.clearPendingAdvance(i), i.isPenDown || i.currentPolyline.push(i.currentPoint.clone()), i.isPenDown = !0;\n break;\n case 2:\n i.isPenDown = !1, i.currentPolyline.length > 1 && i.polylines.push(i.currentPolyline.slice()), i.currentPolyline = [];\n break;\n case 3:\n this.clearPendingAdvance(i), s++, i.scale /= e[s];\n break;\n case 4:\n this.clearPendingAdvance(i), s++, i.scale *= e[s];\n break;\n case 5:\n if (this.clearPendingAdvance(i), i.sp.length === 4)\n throw new Error(\"The position stack is only four locations deep\");\n i.sp.push(i.currentPoint.clone());\n break;\n case 6:\n this.clearPendingAdvance(i), i.currentPoint = i.sp.pop() ?? i.currentPoint, i.currentPolyline.length > 1 && (i.polylines.push(i.currentPolyline.slice()), i.currentPolyline = []), i.isPenDown && i.currentPolyline.push(i.currentPoint.clone());\n break;\n case 7:\n this.clearPendingAdvance(i), s = this.handleSubshapeCommand(e, s, i);\n break;\n case 8:\n s = this.handleXYDisplacement(e, s, i);\n break;\n case 9:\n s = this.handleMultipleXYDisplacements(e, s, i);\n break;\n case 10:\n this.clearPendingAdvance(i), s = this.handleOctantArc(e, s, i);\n break;\n case 11:\n this.clearPendingAdvance(i), s = this.handleFractionalArc(e, s, i);\n break;\n case 12:\n this.clearPendingAdvance(i), s = this.handleBulgeArc(e, s, i);\n break;\n case 13:\n this.clearPendingAdvance(i), s = this.handleMultipleBulgeArcs(e, s, i);\n break;\n case 14:\n this.clearPendingAdvance(i), this.shouldSkipVerticalFlagCommand() && (s = this.skipCode(e, ++s));\n break;\n }\n return s;\n }\n handleVectorCommand(t, e) {\n const n = (t & 240) >> 4, i = t & 15, s = this.getVectorForDirection(i);\n e.currentPoint.add(s.multiply(n * e.scale)), e.isPenDown && e.currentPolyline.push(e.currentPoint.clone());\n }\n /**\n * Get the vector for the given direction code. Please refer to the following link for more information.\n * https://help.autodesk.com/view/OARX/2023/ENU/?guid=GUID-0A8E12A1-F4AB-44AD-8A9B-2140E0D5FD23\n * @param dir - The direction code of the vector\n * @returns Returns the vector for the given direction code\n */\n getVectorForDirection(t) {\n const e = new f();\n switch (t) {\n case 0:\n e.x = 1;\n break;\n case 1:\n e.x = 1, e.y = 0.5;\n break;\n case 2:\n e.x = 1, e.y = 1;\n break;\n case 3:\n e.x = 0.5, e.y = 1;\n break;\n case 4:\n e.y = 1;\n break;\n case 5:\n e.x = -0.5, e.y = 1;\n break;\n case 6:\n e.x = -1, e.y = 1;\n break;\n case 7:\n e.x = -1, e.y = 0.5;\n break;\n case 8:\n e.x = -1;\n break;\n case 9:\n e.x = -1, e.y = -0.5;\n break;\n case 10:\n e.x = -1, e.y = -1;\n break;\n case 11:\n e.x = -0.5, e.y = -1;\n break;\n case 12:\n e.y = -1;\n break;\n case 13:\n e.x = 0.5, e.y = -1;\n break;\n case 14:\n e.x = 1, e.y = -1;\n break;\n case 15:\n e.x = 1, e.y = -0.5;\n break;\n }\n return e;\n }\n handleSubshapeCommand(t, e, n) {\n let i = e, s = 0, o, r = n.scale * this.fontData.content.baseUp, h = r;\n const a = n.currentPoint.clone();\n switch (n.currentPolyline.length > 1 && (n.polylines.push(n.currentPolyline.slice()), n.currentPolyline = []), this.fontData.header.fontType) {\n case d.SHAPES:\n i++, s = t[i];\n break;\n case d.BIGFONT:\n if (i++, this.isVerticalDualBigfontMarker(t, i, \"open\"))\n return i;\n if (this.isVerticalDualBigfontMarker(t, i, \"close\"))\n return i + 1;\n s = t[i], s === 0 && (i++, s = t[i++] << 8 | t[i++], a.x = w.byteToSByte(t[i++]) * n.scale, a.y = w.byteToSByte(t[i++]) * n.scale, this.fontData.content.isExtended ? (h = t[i++] * n.scale, r = t[i] * n.scale) : (r = t[i] * n.scale, h = r));\n break;\n case d.UNIFONT:\n i++, s = t[i++] << 8 | t[i++], i--;\n break;\n }\n if (s !== 0)\n if (this.fontData.header.fontType === d.UNIFONT) {\n const l = n.isPenDown;\n o = this.getScaledSubshapeAtInsertPoint(\n s,\n h,\n r,\n a,\n l\n ), o != null && o.polylines.some((u) => u.length >= 2) && (n.polylines.push(...o.polylines.slice()), o.lastPoint && (n.currentPoint = o.lastPoint.clone()), n.currentPolyline = [], n.isPenDown && n.currentPolyline.push(n.currentPoint.clone()));\n } else if (this.fontData.header.fontType === d.SHAPES)\n o = this.getScaledSubshapeAtInsertPoint(\n s,\n h,\n r,\n a\n ), o && (n.polylines.push(...o.polylines.slice()), o.lastPoint && (n.currentPoint = o.lastPoint.clone(), o.hasExplicitAdvance && this.markAdvanceDefined(n))), n.currentPolyline = [], n.isPenDown && n.currentPolyline.push(n.currentPoint.clone());\n else {\n if (o = this.getScaledSubshapeAtInsertPoint(\n s,\n h,\n r,\n a\n ), o && (n.polylines.push(...o.polylines.slice()), s === 2 && o.lastPoint)) {\n const l = o.lastPoint.x - a.x;\n l > n.currentPoint.x && (n.currentPoint.x = l), this.markAdvanceDefined(n);\n }\n n.currentPolyline = [];\n }\n return i;\n }\n handleXYDisplacement(t, e, n) {\n let i = e;\n const s = new f();\n return s.x = w.byteToSByte(t[++i]), s.y = w.byteToSByte(t[++i]), n.currentPoint.add(s.multiply(n.scale)), n.isPenDown ? n.currentPolyline.push(n.currentPoint.clone()) : this.notePenUpPositioning(n), i;\n }\n handleMultipleXYDisplacements(t, e, n) {\n let i = e;\n for (; !(i + 1 >= t.length); ) {\n const s = new f();\n if (s.x = w.byteToSByte(t[++i]), s.y = w.byteToSByte(t[++i]), s.x === 0 && s.y === 0)\n break;\n n.currentPoint.add(s.multiply(n.scale)), n.isPenDown ? n.currentPolyline.push(n.currentPoint.clone()) : this.notePenUpPositioning(n);\n }\n return i;\n }\n handleOctantArc(t, e, n) {\n let i = e;\n const s = t[++i] * n.scale, o = w.byteToSByte(t[++i]), r = (o & 112) >> 4;\n let h = o & 7;\n const a = o < 0, l = Math.PI / 4 * r, u = n.currentPoint.clone().subtract(new f(Math.cos(l) * s, Math.sin(l) * s)), g = B.fromOctant(u, s, r, h, a).tessellate();\n return n.isPenDown && (n.currentPolyline.pop(), n.currentPolyline.push(...g.slice())), n.currentPoint = g[g.length - 1].clone(), i;\n }\n handleFractionalArc(t, e, n) {\n let i = e;\n const s = t[++i], o = t[++i], r = t[++i], h = t[++i], a = (r * 255 + h) * n.scale, l = w.byteToSByte(t[++i]), u = (l & 112) >> 4;\n let p = l & 7;\n p === 0 && (p = 8), o !== 0 && p--;\n const g = Math.PI / 4;\n let y = g * p, b = ft, m = 1;\n l < 0 && (b = -b, y = -y, m = -1);\n let S = g * u, x = S + y;\n S += g * s / 256 * m, x += g * o / 256 * m;\n const A = n.currentPoint.clone().subtract(new f(a * Math.cos(S), a * Math.sin(S)));\n if (n.currentPoint = A.clone().add(new f(a * Math.cos(x), a * Math.sin(x))), n.isPenDown) {\n let P = S;\n const k = [];\n if (k.push(\n A.clone().add(new f(a * Math.cos(P), a * Math.sin(P)))\n ), b > 0)\n for (; P + b < x; )\n P += b, k.push(\n A.clone().add(new f(a * Math.cos(P), a * Math.sin(P)))\n );\n else\n for (; P + b > x; )\n P += b, k.push(\n A.clone().add(new f(a * Math.cos(P), a * Math.sin(P)))\n );\n k.push(A.clone().add(new f(a * Math.cos(x), a * Math.sin(x)))), n.currentPolyline.push(...k);\n }\n return i;\n }\n handleBulgeArc(t, e, n) {\n let i = e;\n const s = new f();\n s.x = w.byteToSByte(t[++i]), s.y = w.byteToSByte(t[++i]);\n const o = w.byteToSByte(t[++i]);\n return n.currentPoint = this.handleArcSegment(\n n.currentPoint,\n s,\n o,\n n.scale,\n n.isPenDown,\n n.currentPolyline\n ), i;\n }\n handleMultipleBulgeArcs(t, e, n) {\n let i = e;\n for (; !(i + 1 >= t.length); ) {\n const s = new f();\n if (s.x = w.byteToSByte(t[++i]), s.y = w.byteToSByte(t[++i]), s.x === 0 && s.y === 0 || i + 1 >= t.length)\n break;\n const o = w.byteToSByte(t[++i]);\n n.currentPoint = this.handleArcSegment(\n n.currentPoint,\n s,\n o,\n n.scale,\n n.isPenDown,\n n.currentPolyline\n );\n }\n return i;\n }\n skipCode(t, e) {\n switch (t[e]) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n case 4:\n e++;\n break;\n case 5:\n break;\n case 6:\n break;\n case 7:\n switch (this.fontData.header.fontType) {\n case d.SHAPES:\n e++;\n break;\n case d.BIGFONT:\n e++, this.isVerticalDualBigfontMarker(t, e, \"open\") ? e++ : this.isVerticalDualBigfontMarker(t, e, \"close\") ? e += 2 : t[e] === 0 && (e += this.fontData.content.isExtended ? 6 : 5);\n break;\n case d.UNIFONT:\n e += 2;\n break;\n }\n break;\n case 8:\n e += 2;\n break;\n case 9:\n for (; e++, !(e >= t.length); ) {\n const s = t[e];\n if (e++, e >= t.length)\n break;\n const o = t[e];\n if (s === 0 && o === 0)\n break;\n }\n break;\n case 10:\n e += 2;\n break;\n case 11:\n e += 5;\n break;\n case 12:\n e += 3;\n break;\n case 13:\n for (; e++, !(e >= t.length); ) {\n const s = t[e];\n if (e++, e >= t.length)\n break;\n const o = t[e];\n if (s === 0 && o === 0)\n break;\n e++;\n }\n break;\n }\n return e;\n }\n getScaledSubshapeAtInsertPoint(t, e, n, i, s = !1) {\n let o;\n if (s) {\n const l = this.fontData.content.data[t];\n if (!l)\n return;\n o = this.parseShape(l, { initialPenDown: !0, flushOnEnd: !0 });\n } else if (o = this.subshapeCache.get(t), !o) {\n const l = this.fontData.content.data[t];\n if (!l)\n return;\n const u = this.fontData.header.fontType !== d.BIGFONT;\n o = this.parseShape(l, {\n flushOnEnd: !1,\n initialPenDown: u\n }), this.shapeData.set(t, o), this.subshapeCache.set(t, o);\n }\n const r = this.fontData.header.fontType === d.BIGFONT ? void 0 : n / this.fontData.content.baseUp, h = o.polylines.some((l) => l.length > 0);\n return (r !== void 0 ? this.scaleShapeByFactor(o, r) : this.scaleShapeByHeightAndWidth(\n h ? o.normalizeToOrigin(!0) : o,\n n,\n e\n )).offset(i, !1);\n }\n /**\n * Handles drawing an arc segment with the given vector and bulge\n * @param currentPoint The starting point of the arc\n * @param vec The displacement vector\n * @param bulge The bulge value (will be normalized by 127.0)\n * @param scale The current scale factor\n * @param isPenDown Whether the pen is currently down (drawing)\n * @param currentPolyline The current polyline being built\n * @returns The new current point after the arc\n */\n handleArcSegment(t, e, n, i, s, o) {\n e.x *= i, e.y *= i, n < -127 && (n = -127);\n const r = t.clone();\n if (s)\n if (n === 0)\n o.push(r.clone().add(e));\n else {\n const h = r.clone().add(e), l = B.fromBulge(r, h, n / 127).tessellate();\n o.push(...l.slice(1));\n }\n return r.add(e), r;\n }\n}\nclass wt {\n /**\n * Creates a new ShxFont instance.\n * @param data - Either raw binary data of the SHX font file (ArrayBuffer) or pre-parsed font data (ShxFontData)\n * @throws {Error} If the font data is invalid or cannot be parsed\n */\n constructor(t) {\n if (t instanceof ArrayBuffer) {\n const e = new w(t), i = new z().parse(e), o = J.createParser(i.fontType).parse(e);\n this.fontData = {\n header: i,\n content: o\n };\n } else\n this.fontData = t;\n this.shapeParser = new pt(this.fontData);\n }\n /**\n * Return true if this font contains glyph of the specified character. Otherwise, return false.\n * @param char - The character to check\n * @returns True if this font contains glyph of the specified character. Otherwise, return false.\n */\n hasChar(t) {\n return this.fontData.content.data[t] !== void 0;\n }\n /**\n * Return true if this font contains a shape with the specified name. Otherwise, return false.\n * Shape names are matched case-insensitively.\n * @param name - The shape name to check (for example, \"GRS\")\n * @returns True if this font contains the named shape. Otherwise, return false.\n */\n hasShape(t) {\n return this.getShapeCode(t) !== void 0;\n }\n /**\n * Gets the character code for a named shape.\n * @param name - The shape name to look up\n * @returns The character code, or undefined if the shape is not found\n */\n getShapeCode(t) {\n const e = this.fontData.content.names;\n if (e)\n return e[t.toUpperCase()];\n }\n /**\n * Gets the shape name for a character code, if one is defined.\n * @param code - The character code to look up\n * @returns The shape name, or undefined if the code has no name\n */\n getShapeName(t) {\n var i;\n const e = (i = this.fontData.content.codeToName) == null ? void 0 : i[t];\n if (e !== void 0)\n return e;\n const n = this.fontData.content.names;\n if (n) {\n for (const [s, o] of Object.entries(n))\n if (o === t)\n return s;\n }\n }\n /**\n * Returns scaled font metrics for a target render size.\n * @param size - Target font size in drawing units\n */\n getFontMetrics(t) {\n return T(this.fontData.content, t);\n }\n /**\n * Returns a layout-ready glyph: scaled geometry with baseline alignment applied.\n *\n * Prefer this over {@link ShxFont.getCharShape} when placing text for display.\n *\n * @param code - The character code to get the shape for\n * @param size - The desired font size\n */\n getLayoutCharShape(t, e, n = E) {\n const i = this.getCharShape(t, e);\n if (i)\n return dt(\n i,\n this.fontData,\n e,\n n,\n this.usesUnifontBaselineOriginFont(e),\n this.getBigfontBaselineInkPaddingNative()\n );\n }\n /**\n * Returns the cached median baseline ink padding for BIGFONT layout normalization.\n *\n * @returns Padding in native font units from shape #0 height, or 0 when not applicable\n */\n getBigfontBaselineInkPaddingNative() {\n if (this.bigfontBaselineInkPaddingNative === void 0) {\n const t = this.fontData.content.height;\n this.bigfontBaselineInkPaddingNative = ht(\n this.fontData,\n (e) => this.getCharShape(e, t)\n );\n }\n return this.bigfontBaselineInkPaddingNative;\n }\n /**\n * Returns whether this UNIFONT encodes horizontal glyphs with baseline at y = 0.\n *\n * The result is computed once via {@link detectUnifontBaselineOriginFont} and cached,\n * because baseline-origin detection is independent of render size.\n *\n * @param size - Font size used when sampling glyph geometry for detection\n * @returns True when baseline-origin UNIFONT shifting should be skipped during layout\n */\n usesUnifontBaselineOriginFont(t) {\n return this.unifontBaselineOriginFont === void 0 && (this.unifontBaselineOriginFont = lt(\n this.fontData,\n (e) => this.getCharShape(e, t),\n t\n )), this.unifontBaselineOriginFont;\n }\n /**\n * Gets the shape data for a named shape at a given font size.\n * Shape names are matched case-insensitively.\n * @param name - The shape name to get the shape for\n * @param size - The desired font size\n * @returns The shape data for the named shape, or undefined if it is not found in the font\n */\n getShapeByName(t, e) {\n const n = this.getShapeCode(t);\n if (n !== void 0)\n return this.getCharShape(n, e);\n }\n /**\n * Gets the scaled shape geometry for a character code.\n *\n * Returns the glyph as encoded in the SHX file, scaled to `size`. Vertical placement\n * and mixed-font baseline alignment are the responsibility of the text renderer;\n * see the `textLayout` module and {@link ShxFont.getFontMetrics}.\n *\n * @param code - The character code to get the shape for\n * @param size - The desired font size\n * @returns The shape data for the character, or undefined if the character is not found in the font\n */\n getCharShape(t, e) {\n return this.shapeParser.getCharShape(t, e);\n }\n /**\n * Releases resources used by the font.\n * This should be called when the font is no longer needed to free up memory.\n */\n release() {\n this.shapeParser.release();\n }\n}\nfunction Pt(c) {\n if (c.lastPoint)\n return c.lastPoint.x;\n const { minX: t, maxX: e } = c.bbox;\n return e - t;\n}\nfunction yt(c, t, e, n = E) {\n const i = T(t.content, e);\n return n.resolve(c, i.cellWidth);\n}\nfunction bt(c, t, e = 0) {\n return c.offset(new f(t, e), !0);\n}\nfunction xt(c, t = 0, e = {}) {\n const n = e.advance ?? E;\n let i = 0;\n const s = [];\n for (const { font: o, code: r, size: h } of c) {\n const a = o.getLayoutCharShape(r, h, n);\n a && (s.push({\n shape: bt(a, i, t),\n x: i\n }), i += yt(a, o.fontData, h, n));\n }\n return s;\n}\nexport {\n D as DEFAULT_INK_WIDTH_CELL_FACTOR,\n M as InkWidthAdvanceStrategy,\n f as Point,\n L as ShxAdvanceWidthStrategy,\n J as ShxContentParserFactory,\n wt as ShxFont,\n d as ShxFontType,\n mt as ShxNativeAdvanceStrategy,\n v as ShxShape,\n pt as ShxShapeParser,\n dt as alignShxGlyphForLayout,\n T as computeFontMetrics,\n E as defaultAdvanceWidthStrategy,\n ht as detectBigfontBaselineInkPadding,\n lt as detectUnifontBaselineOriginFont,\n Pt as getAdvanceWidth,\n xt as layoutTextRun,\n bt as placeGlyphOnBaseline,\n yt as resolveAdvanceWidth,\n ct as shapeEncodedWithTopOrigin,\n H as splitShapeNameAndBytecode,\n G as unifontUsesBaselineOrigin\n};\n//# sourceMappingURL=index.es.js.map\n","import { layoutTextRun, ShxFont } from '@mlightcad/shx-parser';\nimport type {\n CadLoadedReference,\n CadDocument,\n CadMissingReference,\n CadPoint2D,\n CadReferenceInput,\n CadReferenceState\n} from './types';\n\nexport interface CadShxGlyph {\n polylines: ReadonlyArray<ReadonlyArray<CadPoint2D>>;\n}\n\nexport interface CadShxGlyphResolver {\n resolveShape(shapeNumber: number, fontName?: string): CadShxGlyph | undefined;\n resolveText(text: string, fontName?: string): CadShxGlyph | undefined;\n}\n\nexport const EMPTY_SHX_GLYPH_RESOLVER: CadShxGlyphResolver = Object.freeze({\n resolveShape: () => undefined,\n resolveText: () => undefined\n});\n\ninterface LoadedShxFont {\n key: string;\n font: ShxFont;\n info: CadLoadedReference;\n shapeCache: Map<number, CadShxGlyph | null>;\n textCache: Map<string, CadShxGlyph | null>;\n}\n\ninterface ShxRequirement {\n fileName?: string;\n shapeNumbers: Set<number>;\n texts: Set<string>;\n}\n\nexport const COMPLEX_SHX_WARNING_PREFIX = 'Complex SHX linetype glyphs';\n\nexport class CadShxFontRegistry implements CadShxGlyphResolver {\n private readonly fonts = new Map<string, LoadedShxFont>();\n private requirements: ShxRequirement[] = [];\n\n async add(input: CadReferenceInput): Promise<CadLoadedReference> {\n const fileName = referenceFileName(input.fileName ?? input.file?.name);\n if (!fileName) throw new Error('A fileName is required when adding an SHX reference buffer.');\n if (!/\\.shx$/i.test(fileName)) throw new Error(`${fileName} is not an SHX reference file.`);\n if (!input.file && !input.buffer) throw new Error(`No file content was provided for ${fileName}.`);\n\n const bytes = input.file\n ? new Uint8Array(await input.file.arrayBuffer())\n : copyBytes(input.buffer!);\n if (bytes.byteLength === 0) throw new Error(`${fileName} is empty.`);\n\n let font: ShxFont;\n try {\n font = new ShxFont(exactArrayBuffer(bytes));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to parse SHX reference ${fileName}: ${message}`);\n }\n\n const key = referenceKey(fileName);\n const previous = this.fonts.get(key);\n const info: CadLoadedReference = {\n kind: 'shx',\n fileName,\n bytes: bytes.byteLength,\n fontType: font.fontData.header.fontType,\n glyphCount: Object.keys(font.fontData.content.data).length\n };\n this.fonts.set(key, { key, font, info, shapeCache: new Map(), textCache: new Map() });\n previous?.font.release();\n return { ...info };\n }\n\n setDocument(document: CadDocument | undefined): void {\n if (!document) {\n this.requirements = [];\n return;\n }\n const requirements = new Map<string, ShxRequirement>();\n const add = (fileName?: string) => {\n const normalizedName = referenceFileName(fileName);\n const key = normalizedName ? referenceKey(normalizedName) : '*';\n let requirement = requirements.get(key);\n if (!requirement) {\n requirement = { fileName: normalizedName || undefined, shapeNumbers: new Set(), texts: new Set() };\n requirements.set(key, requirement);\n }\n return requirement;\n };\n\n for (const lineType of new Set(Object.values(document.lineTypes ?? {}))) {\n for (const element of lineType.pattern) {\n const flag = Number(element.elementTypeFlag ?? 0);\n if (flag === 0) continue;\n const requirement = add(element.fontName);\n const shapeNumber = Math.trunc(Number(element.shapeNumber));\n if ((flag & 4) === 4 && Number.isFinite(shapeNumber)) requirement.shapeNumbers.add(shapeNumber);\n if ((flag & 2) === 2 && element.text) requirement.texts.add(element.text);\n }\n }\n const declared = Array.isArray(document.metadata.requiredShxFonts)\n ? document.metadata.requiredShxFonts\n : [];\n for (const fileName of declared) add(String(fileName));\n const unknown = requirements.get('*');\n const named = [...requirements.entries()].filter(([key]) => key !== '*');\n if (unknown && named.length === 1) {\n const target = named[0][1];\n for (const shapeNumber of unknown.shapeNumbers) target.shapeNumbers.add(shapeNumber);\n for (const text of unknown.texts) target.texts.add(text);\n requirements.delete('*');\n }\n this.requirements = [...requirements.values()];\n }\n\n has(fileName: string): boolean {\n return this.fonts.has(referenceKey(fileName));\n }\n\n remove(fileName: string): boolean {\n const key = referenceKey(fileName);\n const existing = this.fonts.get(key);\n if (!existing) return false;\n existing.font.release();\n this.fonts.delete(key);\n return true;\n }\n\n clear(): void {\n for (const entry of this.fonts.values()) entry.font.release();\n this.fonts.clear();\n }\n\n getState(): CadReferenceState {\n const missing: CadMissingReference[] = [];\n for (const requirement of this.requirements) {\n if (requirement.fileName) {\n const entry = this.fonts.get(referenceKey(requirement.fileName));\n if (!entry) {\n missing.push({ kind: 'shx', fileName: requirement.fileName, identified: true, reason: 'not-loaded' });\n } else if (!fontSatisfies(entry.font, requirement)) {\n missing.push({ kind: 'shx', fileName: requirement.fileName, identified: true, reason: 'incompatible' });\n }\n continue;\n }\n const compatible = [...this.fonts.values()].some((entry) => fontSatisfies(entry.font, requirement));\n if (!compatible) {\n missing.push({ kind: 'shx', fileName: 'External SHX font', identified: false, reason: this.fonts.size ? 'incompatible' : 'not-loaded' });\n }\n }\n return {\n missing,\n loaded: [...this.fonts.values()]\n .map(({ info }) => ({ ...info }))\n .sort((left, right) => left.fileName.localeCompare(right.fileName))\n };\n }\n\n resolveShape(shapeNumber: number, fontName?: string): CadShxGlyph | undefined {\n const code = Math.trunc(Number(shapeNumber));\n if (!Number.isFinite(code) || code < 0) return undefined;\n const entry = this.resolveFont(fontName, (font) => font.hasChar(code));\n if (!entry) return undefined;\n const cached = entry.shapeCache.get(code);\n if (cached !== undefined) return cached ?? undefined;\n let glyph: CadShxGlyph | undefined;\n try {\n const shape = entry.font.getCharShape(code, 1);\n glyph = shape ? glyphFromPolylines(shape.polylines) : undefined;\n } catch {\n glyph = undefined;\n }\n entry.shapeCache.set(code, glyph ?? null);\n return glyph;\n }\n\n resolveText(text: string, fontName?: string): CadShxGlyph | undefined {\n if (!text) return undefined;\n const codes = Array.from(text, (character) => character.codePointAt(0) ?? 0);\n const entry = this.resolveFont(fontName, (font) => codes.every((code) => font.hasChar(code)));\n if (!entry) return undefined;\n const cached = entry.textCache.get(text);\n if (cached !== undefined) return cached ?? undefined;\n let glyph: CadShxGlyph | undefined;\n try {\n const placed = layoutTextRun(codes.map((code) => ({ font: entry.font, code, size: 1 })));\n glyph = glyphFromPolylines(placed.flatMap(({ shape }) => shape.polylines));\n } catch {\n glyph = undefined;\n }\n entry.textCache.set(text, glyph ?? null);\n return glyph;\n }\n\n private resolveFont(fontName: string | undefined, predicate: (font: ShxFont) => boolean): LoadedShxFont | undefined {\n if (fontName) {\n const exact = this.fonts.get(referenceKey(fontName));\n return exact && predicate(exact.font) ? exact : undefined;\n }\n\n const requiredMatches = this.requirements\n .map(({ fileName }) => fileName ? this.fonts.get(referenceKey(fileName)) : undefined)\n .filter((entry): entry is LoadedShxFont => entry !== undefined && predicate(entry.font));\n if (requiredMatches.length === 1) return requiredMatches[0];\n\n const matches = [...this.fonts.values()].filter((entry) => predicate(entry.font));\n return matches.length === 1 ? matches[0] : undefined;\n }\n}\n\nexport function synchronizeCadDocumentReferences(document: CadDocument, state: CadReferenceState): void {\n const required = Array.isArray(document.metadata.requiredShxFonts)\n ? document.metadata.requiredShxFonts.map(String)\n : [];\n document.metadata.missingReferences = state.missing.map((reference) => ({ ...reference }));\n document.metadata.loadedReferences = state.loaded.map((reference) => ({ ...reference }));\n document.metadata.loadedShxFonts = required.filter((fileName) => state.loaded.some((loaded) => referenceKey(loaded.fileName) === referenceKey(fileName)));\n\n for (let index = document.warnings.length - 1; index >= 0; index--) {\n if (document.warnings[index].startsWith(COMPLEX_SHX_WARNING_PREFIX)) document.warnings.splice(index, 1);\n }\n if (state.missing.length === 0) return;\n const names = state.missing.map(({ fileName, reason }) => reason === 'incompatible' ? `${fileName} (missing required glyphs)` : fileName);\n document.warnings.push(`${COMPLEX_SHX_WARNING_PREFIX} are using a dash/dot fallback until the missing reference${names.length === 1 ? ' is' : 's are'} supplied: ${names.join(', ')}.`);\n}\n\nexport function referenceFileName(value: string | undefined): string {\n return String(value ?? '').trim().split(/[\\\\/]/).filter(Boolean).pop() ?? '';\n}\n\nexport function referenceKey(value: string): string {\n return referenceFileName(value).toLocaleLowerCase('en-US');\n}\n\nfunction glyphFromPolylines(polylines: ReadonlyArray<ReadonlyArray<CadPoint2D>>): CadShxGlyph | undefined {\n const normalized = polylines\n .map((polyline) => polyline\n .filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y))\n .map((point) => ({ x: point.x, y: point.y })))\n .filter((polyline) => polyline.length >= 2);\n return normalized.length > 0 ? { polylines: normalized } : undefined;\n}\n\nfunction fontSatisfies(font: ShxFont, requirement: ShxRequirement): boolean {\n for (const shapeNumber of requirement.shapeNumbers) if (!font.hasChar(shapeNumber)) return false;\n for (const text of requirement.texts) {\n for (const character of text) if (!font.hasChar(character.codePointAt(0) ?? 0)) return false;\n }\n return true;\n}\n\nfunction copyBytes(buffer: ArrayBuffer | Uint8Array): Uint8Array {\n return buffer instanceof Uint8Array ? buffer.slice() : new Uint8Array(buffer.slice(0));\n}\n\nfunction exactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n","export type CadFormat = 'dwg' | 'dxf' | 'dwf' | 'dwfx' | 'xps' | 'unknown';\nexport type CadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';\n\nexport interface CadPoint2D {\n x: number;\n y: number;\n}\n\nexport interface CadPoint3D extends CadPoint2D {\n z?: number;\n}\n\nexport type CadPoint = CadPoint2D | CadPoint3D;\n\nexport interface CadBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport type CadFitMode = 'auto' | 'saved-view' | 'extents';\n\nexport interface CadLayer {\n name: string;\n color?: string | number;\n colorIndex?: number;\n trueColor?: number;\n lineType?: string;\n lineweight?: number;\n isVisible?: boolean;\n isLocked?: boolean;\n isFrozen?: boolean;\n raw?: unknown;\n}\n\nexport interface CadLineTypeElement {\n /** Signed AutoCAD pattern length: positive=dash, negative=gap, zero=dot/shape. */\n length: number;\n elementTypeFlag?: number;\n shapeNumber?: number;\n scale?: number;\n rotation?: number;\n offsetX?: number;\n offsetY?: number;\n text?: string;\n /** STYLE table handle referenced by DXF group 340 / the DWG LTYPE dash. */\n styleHandle?: string;\n /** Resolved SHX file name from the referenced STYLE table entry. */\n fontName?: string;\n}\n\nexport interface CadLineType {\n name: string;\n handle?: string;\n description?: string;\n totalPatternLength?: number;\n pattern: CadLineTypeElement[];\n raw?: unknown;\n}\n\nexport interface CadSceneTransform2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport interface CadSavedView {\n source: 'vport' | 'header-ucs';\n name?: string;\n handle?: string;\n center?: CadPoint2D;\n target?: CadPoint3D;\n direction?: CadPoint3D;\n viewHeight?: number;\n aspectRatio?: number;\n twistAngle: number;\n ucsOrigin?: CadPoint3D;\n ucsXAxis?: CadPoint3D;\n ucsYAxis?: CadPoint3D;\n sceneTransformApplied: boolean;\n /** WCS-to-normalized-scene transform used by render, bounds and interaction. */\n sceneTransform: CadSceneTransform2D;\n}\n\nexport interface CadPathCommand {\n cmd: 'M' | 'L' | 'C' | 'Q' | 'Z';\n points: CadPoint2D[];\n}\n\nexport type CadEntityKind =\n | 'line'\n | 'circle'\n | 'arc'\n | 'polyline'\n | 'ellipse'\n | 'text'\n | 'point'\n | 'insert'\n | 'solid'\n | 'hatch'\n | 'spline'\n | 'path'\n | 'image'\n | 'viewport'\n | 'unsupported';\n\nexport interface CadEntity {\n id?: string;\n type: string;\n kind?: CadEntityKind;\n handle?: string;\n layer?: string;\n color?: string | number;\n trueColor?: number | string | { r: number; g: number; b: number; a?: number };\n colorIndex?: number;\n colorNumber?: number;\n colorName?: string;\n fillColor?: string | number;\n fillColorIndex?: number;\n opacity?: number;\n lineweight?: number;\n lineType?: string;\n linetype?: string;\n lineTypeScale?: number;\n isVisible?: boolean;\n isInPaperSpace?: boolean;\n\n startPoint?: CadPoint3D;\n endPoint?: CadPoint3D;\n center?: CadPoint3D;\n radius?: number;\n startAngle?: number;\n endAngle?: number;\n majorAxisEndPoint?: CadPoint3D;\n axisRatio?: number;\n vertices?: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }>;\n points?: CadPoint3D[];\n controlPoints?: CadPoint3D[];\n fitPoints?: CadPoint3D[];\n degree?: number;\n knots?: number[];\n isClosed?: boolean;\n flag?: number;\n /** Constant polyline width in drawing units. */\n constantWidth?: number;\n thickness?: number;\n\n insertionPoint?: CadPoint3D;\n text?: string;\n value?: string;\n height?: number;\n textHeight?: number;\n /** TEXT width factor, where 1 is the authored glyph width. */\n xScale?: number;\n generationFlag?: number;\n halign?: number;\n valign?: number;\n extrusionDirection?: CadPoint3D;\n rotation?: number;\n scale?: CadPoint3D;\n name?: string;\n blockName?: string;\n attribs?: CadEntity[];\n\n loops?: Array<{ vertices?: CadPoint3D[]; commands?: CadPathCommand[]; isClosed?: boolean }>;\n commands?: CadPathCommand[];\n imageSource?: string;\n imageDataUrl?: string;\n width?: number;\n pageIndex?: number;\n\n raw?: unknown;\n [key: string]: unknown;\n}\n\nexport interface CadBlock {\n name: string;\n basePoint?: CadPoint3D;\n entities: CadEntity[];\n raw?: unknown;\n}\n\nexport interface CadPage {\n index: number;\n name?: string;\n width: number;\n height: number;\n entities: CadEntity[];\n}\n\nexport interface CadDocument {\n format: CadFormat;\n sourceName?: string;\n units?: string;\n header?: Record<string, unknown>;\n layers: Record<string, CadLayer>;\n lineTypes?: Record<string, CadLineType>;\n blocks: Record<string, CadBlock>;\n entities: CadEntity[];\n pages?: CadPage[];\n savedView?: CadSavedView;\n metadata: Record<string, unknown>;\n warnings: string[];\n raw?: unknown;\n}\n\nexport interface CadLoadInput {\n file?: File;\n fileName?: string;\n buffer?: ArrayBuffer | Uint8Array;\n}\n\nexport interface CadReferenceInput {\n file?: File;\n fileName?: string;\n buffer?: ArrayBuffer | Uint8Array;\n}\n\nexport interface CadMissingReference {\n kind: 'shx';\n fileName: string;\n identified: boolean;\n reason: 'not-loaded' | 'incompatible';\n}\n\nexport interface CadLoadedReference {\n kind: 'shx';\n fileName: string;\n bytes: number;\n fontType: 'shapes' | 'bigfont' | 'unifont';\n glyphCount: number;\n}\n\nexport interface CadReferenceState {\n missing: CadMissingReference[];\n loaded: CadLoadedReference[];\n}\n\nexport type CadLoadProgressPhase =\n | 'read'\n | 'detect'\n | 'worker-start'\n | 'worker-ready'\n | 'wasm-init'\n | 'parse'\n | 'normalize'\n | 'render'\n | 'native-render'\n | 'done';\n\nexport interface CadLoadProgress {\n phase: CadLoadProgressPhase;\n message: string;\n format?: CadFormat;\n loaded?: number;\n total?: number;\n percent?: number;\n elapsedMs?: number;\n}\n\nexport interface CadLoadOptions {\n wasmPath?: string;\n /**\n * Explicit text encoding for DXF sources. DXF files normally declare this in\n * `$DWGCODEPAGE`; use this only when legacy files are missing or lying about\n * their code page, for example `gb18030`, `big5`, `shift_jis` or `windows-1252`.\n */\n dxfEncoding?: string;\n preferDwgWasm?: boolean;\n maxInsertDepth?: number;\n includePaperSpace?: boolean;\n /**\n * Parse heavy formats in a Web Worker where available. DWG defaults to true\n * because LibreDWG WebAssembly initialization and decoding can block the UI.\n */\n useWorker?: boolean;\n /** Custom worker URL for bundlers/CDNs that cannot resolve the packaged worker URL. */\n workerUrl?: string | URL;\n /** Custom worker factory for applications that manage workers themselves. */\n workerFactory?: () => Worker;\n /** Milliseconds before an in-flight worker load is rejected. 0 disables timeout. */\n workerTimeoutMs?: number;\n /**\n * Transfer the input ArrayBuffer to the worker when it is safe to do so. This\n * avoids an extra copy for File inputs. ArrayBuffer inputs are copied by\n * default to avoid detaching caller-owned buffers.\n */\n transferInputBuffer?: boolean;\n /** Keep parser raw objects on the normalized document. Disabled by default for memory and worker cloning safety. */\n keepRaw?: boolean;\n /** Abort a pending load. For native parsers this terminates and recreates the worker. */\n signal?: AbortSignal;\n\n /** URL to dwf-viewer's optional 2D raster fallback WASM asset, usually /wasm/dwfv-render.wasm. */\n dwfWasmUrl?: string;\n /** Prefer dwf-viewer's WebGL paths for W2D/W3D rendering. */\n dwfPreferWebgl?: boolean;\n /** Allow dwf-viewer's WASM raster backend for complex 2D vector pages. */\n dwfPreferWasm?: boolean;\n /** Background passed to the native DWF renderer. Defaults to the active CAD canvas background. */\n dwfBackground?: string;\n /** DWF renderer device-pixel-ratio cap. */\n dwfMaxDevicePixelRatio?: number;\n /** DWF renderer maximum backing-store pixels per canvas. */\n dwfMaxCanvasPixels?: number;\n /** DWF WebGL GPU cache budget in bytes. */\n dwfMaxGpuCacheBytes?: number;\n /** Number of DWF pages/scenes kept in the native renderer cache. */\n dwfMaxCachedScenes?: number;\n /** DWF/XPS CAD line-weight rendering mode. Defaults to dwf-viewer's adaptive mode. */\n dwfLineWeightMode?: CadDwfLineWeightMode;\n /** Minimum CSS-pixel stroke used by the DWF/XPS adaptive line-weight renderer. */\n dwfMinStrokeCssPx?: number;\n /** Maximum overview stroke width before zoom restores physical line weights. */\n dwfMaxOverviewStrokeCssPx?: number;\n /** Minimum CSS-pixel text size shown in dense adaptive DWF/XPS overviews. */\n dwfMinTextCssPx?: number;\n /** Minimum filled area, in CSS pixels, shown in dense adaptive DWF/XPS overviews. */\n dwfMinFilledAreaCssPx?: number;\n /** Receives coarse loader progress events. */\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nexport interface CadLoadResult {\n document: CadDocument;\n raw?: unknown;\n bytes: number;\n elapsedMs: number;\n format: CadFormat;\n warnings: string[];\n}\n\nexport interface CadLoader {\n readonly id: string;\n readonly label: string;\n readonly formats: readonly CadFormat[];\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean;\n load(input: CadLoadInput, options?: CadLoadOptions): Promise<CadLoadResult>;\n}\n\n\n\nexport interface CadNativeRenderableLoader extends CadLoader {\n readonly nativeRenderer: true;\n mount(input: CadLoadInput, host: HTMLElement, options?: CadLoadOptions): Promise<CadLoadResult>;\n unmount(): void;\n fit?(): void;\n zoomIn?(): void;\n zoomOut?(): void;\n resize?(): void;\n setNativeOptions?(options: CadLoadOptions): void;\n}\n\nexport function isCadNativeRenderableLoader(loader: CadLoader): loader is CadNativeRenderableLoader {\n const candidate = loader as Partial<CadNativeRenderableLoader>;\n return candidate.nativeRenderer === true && typeof candidate.mount === 'function';\n}\n\nexport interface CadSummary {\n format: CadFormat;\n sourceName?: string;\n entityCount: number;\n layerCount: number;\n blockCount: number;\n pageCount: number;\n byType: Record<string, number>;\n warnings: string[];\n}\n","import type { CadDocument, CadEntity, CadLayer } from './types';\n\nconst BASE_ACI: Record<number, string> = {\n 1: '#ff0000', 2: '#ffff00', 3: '#00ff00', 4: '#00ffff', 5: '#0000ff', 6: '#ff00ff',\n 8: '#808080', 9: '#c0c0c0',\n 10: '#ff0000', 11: '#ff7f7f', 12: '#a50000', 13: '#a55252', 14: '#7f0000', 15: '#7f3f3f', 16: '#4c0000', 17: '#4c2626', 18: '#260000', 19: '#261313',\n 20: '#ff3f00', 21: '#ff9f7f', 22: '#a52900', 23: '#a56752', 24: '#7f1f00', 25: '#7f4f3f', 26: '#4c1300', 27: '#4c2f26', 28: '#260900', 29: '#261713',\n 30: '#ff7f00', 31: '#ffbf7f', 32: '#a55200', 33: '#a57c52', 34: '#7f3f00', 35: '#7f5f3f', 36: '#4c2600', 37: '#4c3926', 38: '#261300', 39: '#261c13',\n 40: '#ffbf00', 41: '#ffdf7f', 42: '#a57c00', 43: '#a59152', 44: '#7f5f00', 45: '#7f6f3f', 46: '#4c3900', 47: '#4c4226', 48: '#261c00', 49: '#262113',\n 50: '#ffff00', 51: '#ffff7f', 52: '#a5a500', 53: '#a5a552', 54: '#7f7f00', 55: '#7f7f3f', 56: '#4c4c00', 57: '#4c4c26', 58: '#262600', 59: '#262613',\n 60: '#bfff00', 61: '#dfff7f', 62: '#7ca500', 63: '#91a552', 64: '#5f7f00', 65: '#6f7f3f', 66: '#394c00', 67: '#424c26', 68: '#1c2600', 69: '#212613',\n 70: '#7fff00', 71: '#bfff7f', 72: '#52a500', 73: '#7ca552', 74: '#3f7f00', 75: '#5f7f3f', 76: '#264c00', 77: '#394c26', 78: '#132600', 79: '#1c2613',\n 80: '#3fff00', 81: '#9fff7f', 82: '#29a500', 83: '#67a552', 84: '#1f7f00', 85: '#4f7f3f', 86: '#134c00', 87: '#2f4c26', 88: '#092600', 89: '#172613',\n 90: '#00ff00', 91: '#7fff7f', 92: '#00a500', 93: '#52a552', 94: '#007f00', 95: '#3f7f3f', 96: '#004c00', 97: '#264c26', 98: '#002600', 99: '#132613',\n 100: '#00ff3f', 101: '#7fff9f', 102: '#00a529', 103: '#52a567', 104: '#007f1f', 105: '#3f7f4f', 106: '#004c13', 107: '#264c2f', 108: '#002609', 109: '#132617',\n 110: '#00ff7f', 111: '#7fffbf', 112: '#00a552', 113: '#52a57c', 114: '#007f3f', 115: '#3f7f5f', 116: '#004c26', 117: '#264c39', 118: '#002613', 119: '#13261c',\n 120: '#00ffbf', 121: '#7fffdf', 122: '#00a57c', 123: '#52a591', 124: '#007f5f', 125: '#3f7f6f', 126: '#004c39', 127: '#264c42', 128: '#00261c', 129: '#132621',\n 130: '#00ffff', 131: '#7fffff', 132: '#00a5a5', 133: '#52a5a5', 134: '#007f7f', 135: '#3f7f7f', 136: '#004c4c', 137: '#264c4c', 138: '#002626', 139: '#132626',\n 140: '#00bfff', 141: '#7fdfff', 142: '#007ca5', 143: '#5291a5', 144: '#005f7f', 145: '#3f6f7f', 146: '#00394c', 147: '#26424c', 148: '#001c26', 149: '#132126',\n 150: '#007fff', 151: '#7fbfff', 152: '#0052a5', 153: '#527ca5', 154: '#003f7f', 155: '#3f5f7f', 156: '#00264c', 157: '#26394c', 158: '#001326', 159: '#131c26',\n 160: '#003fff', 161: '#7f9fff', 162: '#0029a5', 163: '#5267a5', 164: '#001f7f', 165: '#3f4f7f', 166: '#00134c', 167: '#262f4c', 168: '#000926', 169: '#131726',\n 170: '#0000ff', 171: '#7f7fff', 172: '#0000a5', 173: '#5252a5', 174: '#00007f', 175: '#3f3f7f', 176: '#00004c', 177: '#26264c', 178: '#000026', 179: '#131326',\n 180: '#3f00ff', 181: '#9f7fff', 182: '#2900a5', 183: '#6752a5', 184: '#1f007f', 185: '#4f3f7f', 186: '#13004c', 187: '#2f264c', 188: '#090026', 189: '#171326',\n 190: '#7f00ff', 191: '#bf7fff', 192: '#5200a5', 193: '#7c52a5', 194: '#3f007f', 195: '#5f3f7f', 196: '#26004c', 197: '#39264c', 198: '#130026', 199: '#1c1326',\n 200: '#bf00ff', 201: '#df7fff', 202: '#7c00a5', 203: '#9152a5', 204: '#5f007f', 205: '#6f3f7f', 206: '#39004c', 207: '#42264c', 208: '#1c0026', 209: '#211326',\n 210: '#ff00ff', 211: '#ff7fff', 212: '#a500a5', 213: '#a552a5', 214: '#7f007f', 215: '#7f3f7f', 216: '#4c004c', 217: '#4c264c', 218: '#260026', 219: '#261326',\n 220: '#ff00bf', 221: '#ff7fdf', 222: '#a5007c', 223: '#a55291', 224: '#7f005f', 225: '#7f3f6f', 226: '#4c0039', 227: '#4c2642', 228: '#26001c', 229: '#261321',\n 230: '#ff007f', 231: '#ff7fbf', 232: '#a50052', 233: '#a5527c', 234: '#7f003f', 235: '#7f3f5f', 236: '#4c0026', 237: '#4c2639', 238: '#260013', 239: '#26131c',\n 240: '#ff003f', 241: '#ff7f9f', 242: '#a50029', 243: '#a55267', 244: '#7f001f', 245: '#7f3f4f', 246: '#4c0013', 247: '#4c262f', 248: '#260009', 249: '#261317',\n 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#bebebe', 255: '#ffffff'\n};\n\n\nexport type CadColorContrastMode = 'preserve' | 'adaptive';\n\nexport interface ColorResolveOptions {\n foreground?: string;\n background?: string;\n trueColorByteOrder?: 'rgb' | 'bgr';\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport function colorFromAci(index: number | undefined, fallback = '#ffffff', foreground = fallback): string {\n if (typeof index !== 'number' || Number.isNaN(index)) return fallback;\n const normalized = Math.abs(Math.trunc(index));\n if (normalized === 0 || normalized === 256 || normalized === 257) return fallback;\n // ACI 7 is intentionally foreground-dependent in CAD viewers: it should be\n // black on a light canvas and white on a dark canvas.\n if (normalized === 7) return foreground;\n return BASE_ACI[normalized] ?? fallback;\n}\n\nexport function colorFromTrueColor(value: number, byteOrder: 'rgb' | 'bgr' = 'rgb'): string {\n const int = Math.max(0, Math.trunc(value)) & 0xffffff;\n const a = (int >> 16) & 0xff;\n const b = (int >> 8) & 0xff;\n const c = int & 0xff;\n const red = byteOrder === 'rgb' ? a : c;\n const green = b;\n const blue = byteOrder === 'rgb' ? c : a;\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport function parseCssColor(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n if (!v) return undefined;\n if (/^(#|rgb\\(|rgba\\(|hsl\\(|hsla\\()/i.test(v)) return normalizeXpsColor(v) ?? v;\n const named: Record<string, string> = {\n red: '#ff0000',\n yellow: '#ffff00',\n green: '#00ff00',\n cyan: '#00ffff',\n blue: '#0000ff',\n magenta: '#ff00ff',\n white: '#ffffff',\n black: '#000000',\n grey: '#808080',\n gray: '#808080'\n };\n return named[v.toLowerCase()];\n }\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const r = Number(obj.r ?? obj.red);\n const g = Number(obj.g ?? obj.green);\n const b = Number(obj.b ?? obj.blue);\n const a = Number(obj.a ?? obj.alpha ?? 1);\n if ([r, g, b].every(Number.isFinite)) {\n return Number.isFinite(a) && a >= 0 && a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n }\n }\n return undefined;\n}\n\nexport function normalizeXpsColor(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^#[0-9a-f]{8}$/i.test(trimmed)) {\n const a = parseInt(trimmed.slice(1, 3), 16) / 255;\n const r = parseInt(trimmed.slice(3, 5), 16);\n const g = parseInt(trimmed.slice(5, 7), 16);\n const b = parseInt(trimmed.slice(7, 9), 16);\n return a >= 0.999 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${roundAlpha(a)})`;\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed) || /^#[0-9a-f]{3}$/i.test(trimmed)) return trimmed;\n if (/^sc#/i.test(trimmed)) {\n const parts = trimmed.slice(3).split(',').map((x) => Number(x.trim()));\n const [a, r, g, b] = parts.length === 4 ? parts : [1, ...parts];\n if ([a, r, g, b].every(Number.isFinite)) return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${roundAlpha(a)})`;\n }\n return undefined;\n}\n\nexport function resolveCadColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string {\n const foreground = options.foreground ?? '#ffffff';\n const fallback = foreground;\n let color: string | undefined;\n\n const explicit = parseCssColor(entity.trueColor) ?? parseCssColor(entity.color) ?? parseCssColor(entity.colorName);\n if (explicit) color = explicit;\n\n if (!color) {\n const trueColorCandidate = numberFromKeys(entity, ['trueColor', 'true_color', 'truecolor', 'colorRGB', 'colorRgb', 'rgbColor', 'rgb']);\n if (typeof trueColorCandidate === 'number' && trueColorCandidate >= 0 && trueColorCandidate <= 0xffffff) {\n color = colorFromTrueColor(trueColorCandidate, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (typeof aci === 'number' && Math.abs(aci) <= 257 && aci !== 256 && aci !== 0 && aci !== 257) color = colorFromAci(aci, fallback, foreground);\n }\n\n if (!color && typeof entity.color === 'number') {\n const c = Number(entity.color);\n // Most DWG/DXF JavaScript parsers expose `color` as ACI for values 1..257.\n // Treating those values as RGB is the common cause of nearly black drawings.\n if (Math.abs(c) <= 257) {\n if (c !== 0 && c !== 256 && c !== 257) color = colorFromAci(c, fallback, foreground);\n } else {\n color = colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const layer = lookupLayer(document, entity.layer);\n color = resolveLayerColor(layer, options);\n }\n\n return adaptColorForCanvas(color ?? fallback, options);\n}\n\nexport function resolveFillColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string | undefined {\n let color: string | undefined;\n const explicit = parseCssColor(entity.fillColor);\n if (explicit) color = explicit;\n if (!color && typeof entity.fillColor === 'number') {\n const n = entity.fillColor;\n color = Math.abs(n) <= 257 ? colorFromAci(n, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff') : colorFromTrueColor(n, options.trueColorByteOrder ?? 'rgb');\n }\n if (!color && typeof entity.fillColorIndex === 'number') color = colorFromAci(entity.fillColorIndex, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff');\n return color ? adaptColorForCanvas(color, options) : undefined;\n}\n\nexport function adaptColorForCanvas(color: string, options: ColorResolveOptions = {}): string {\n if (options.contrastMode !== 'adaptive') return color;\n const background = options.background ?? '#0b1020';\n const foreground = options.foreground ?? '#ffffff';\n return ensureContrast(color, background, foreground, options.minColorContrast ?? 2.4);\n}\n\nexport function ensureContrast(color: string, background: string, foreground: string, minRatio = 2.4): string {\n const fg = parseRgba(foreground) ?? { r: 255, g: 255, b: 255, a: 1 };\n const bg = parseRgba(background) ?? { r: 11, g: 16, b: 32, a: 1 };\n const raw = parseRgba(color);\n if (!raw) return color;\n\n const effective = alphaComposite(raw, bg);\n if (contrastRatio(effective, bg) >= minRatio) return color;\n\n const bgLum = relativeLuminance(bg);\n const target = bgLum < 0.5 ? { r: 255, g: 255, b: 255, a: raw.a } : { r: 0, g: 0, b: 0, a: raw.a };\n for (const amount of [0.25, 0.4, 0.55, 0.7, 0.85, 1]) {\n const mixed = mix(raw, target, amount);\n if (contrastRatio(alphaComposite(mixed, bg), bg) >= minRatio) return toCssColor(mixed);\n }\n\n if (contrastRatio(fg, bg) >= minRatio) return toCssColor(fg);\n return bgLum < 0.5 ? '#ffffff' : '#000000';\n}\n\nexport function layerVisible(layer: CadLayer | undefined): boolean {\n if (!layer) return true;\n return layer.isVisible !== false && layer.isFrozen !== true;\n}\n\nfunction resolveLayerColor(layer: CadLayer | undefined, options: ColorResolveOptions): string | undefined {\n if (!layer) return undefined;\n const foreground = options.foreground ?? '#ffffff';\n\n const trueColorText = parseCssColor(layer.trueColor);\n if (trueColorText) return trueColorText;\n if (typeof layer.trueColor === 'number' && layer.trueColor >= 0 && layer.trueColor <= 0xffffff) return colorFromTrueColor(layer.trueColor, options.trueColorByteOrder ?? 'rgb');\n\n const explicitColorText = parseCssColor(layer.color);\n if (explicitColorText) return explicitColorText;\n\n // Prefer a valid ACI index over a numeric `layer.color` when both are\n // present. LibreDWG's JS converter uses `color: 0xffffff` as a placeholder\n // for many indexed-color layers; using that value first turns drawings\n // monochrome white. The ACI index is the authoritative layer color in that\n // case.\n if (isRenderableAci(layer.colorIndex)) return colorFromAci(layer.colorIndex, foreground, foreground);\n\n if (typeof layer.color === 'number') {\n const c = Number(layer.color);\n return Math.abs(c) <= 257 ? colorFromAci(c, foreground, foreground) : colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n if (typeof layer.colorIndex === 'number') return colorFromAci(layer.colorIndex, foreground, foreground);\n return undefined;\n}\n\n\nexport function isByBlockColor(entity: CadEntity): boolean {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (aci === 0) return true;\n return entity.trueColor === undefined && entity.color === 0;\n}\n\nexport function applyByBlockColorInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): CadEntity {\n if (!isByBlockColor(entity)) return entity;\n const inheritedColor = resolveCadColor(parent, document, options);\n const clone: CadEntity = { ...entity, color: inheritedColor, trueColor: undefined, colorIndex: undefined, colorNumber: undefined };\n return clone;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name] ?? document.layers[name.toLowerCase()] ?? Object.values(document.layers).find((x) => x.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction numberFromKeys(entity: CadEntity, keys: string[]): number | undefined {\n const record = entity as Record<string, unknown>;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction parseRgba(value: string): RgbaColor | undefined {\n const input = value.trim().toLowerCase();\n if (/^#[0-9a-f]{3}$/i.test(input)) {\n return {\n r: parseInt(input[1] + input[1], 16),\n g: parseInt(input[2] + input[2], 16),\n b: parseInt(input[3] + input[3], 16),\n a: 1\n };\n }\n if (/^#[0-9a-f]{6}$/i.test(input)) {\n return {\n r: parseInt(input.slice(1, 3), 16),\n g: parseInt(input.slice(3, 5), 16),\n b: parseInt(input.slice(5, 7), 16),\n a: 1\n };\n }\n const rgba = input.match(/^rgba?\\(([^)]+)\\)$/i);\n if (rgba) {\n const parts = rgba[1].split(/[,\\s/]+/).filter(Boolean).map((part) => Number(part.replace('%', '')));\n if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n const hasPercent = /%/.test(rgba[1]);\n return {\n r: clampByte(hasPercent ? parts[0] * 2.55 : parts[0]),\n g: clampByte(hasPercent ? parts[1] * 2.55 : parts[1]),\n b: clampByte(hasPercent ? parts[2] * 2.55 : parts[2]),\n a: Number.isFinite(parts[3]) ? Math.max(0, Math.min(1, parts[3])) : 1\n };\n }\n }\n return undefined;\n}\n\nfunction alphaComposite(color: RgbaColor, background: RgbaColor): RgbaColor {\n const a = color.a + background.a * (1 - color.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (color.r * color.a + background.r * background.a * (1 - color.a)) / a,\n g: (color.g * color.a + background.g * background.a * (1 - color.a)) / a,\n b: (color.b * color.a + background.b * background.a * (1 - color.a)) / a,\n a\n };\n}\n\nfunction mix(a: RgbaColor, b: RgbaColor, amount: number): RgbaColor {\n const t = Math.max(0, Math.min(1, amount));\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a\n };\n}\n\nfunction relativeLuminance(color: RgbaColor): number {\n const channels = [color.r, color.g, color.b].map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\nfunction contrastRatio(a: RgbaColor, b: RgbaColor): number {\n const l1 = relativeLuminance(a);\n const l2 = relativeLuminance(b);\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction toCssColor(color: RgbaColor): string {\n const r = clampByte(color.r);\n const g = clampByte(color.g);\n const b = clampByte(color.b);\n return color.a < 0.999 ? `rgba(${r}, ${g}, ${b}, ${roundAlpha(color.a)})` : `rgb(${r}, ${g}, ${b})`;\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction roundAlpha(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n","import type { CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from './types';\n\nexport interface Matrix2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport const IDENTITY_MATRIX: Matrix2D = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n\nexport function multiplyMatrix(left: Matrix2D, right: Matrix2D): Matrix2D {\n return {\n a: left.a * right.a + left.c * right.b,\n b: left.b * right.a + left.d * right.b,\n c: left.a * right.c + left.c * right.d,\n d: left.b * right.c + left.d * right.d,\n e: left.a * right.e + left.c * right.f + left.e,\n f: left.b * right.e + left.d * right.f + left.f\n };\n}\n\nexport function translationMatrix(x: number, y: number): Matrix2D {\n return { a: 1, b: 0, c: 0, d: 1, e: x, f: y };\n}\n\nexport function rotationMatrix(angle: number): Matrix2D {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { a: c, b: s, c: -s, d: c, e: 0, f: 0 };\n}\n\nexport function scaleMatrix(x: number, y = x): Matrix2D {\n return { a: x, b: 0, c: 0, d: y, e: 0, f: 0 };\n}\n\nexport function transformPoint(point: CadPoint2D | CadPoint3D, matrix: Matrix2D): CadPoint3D {\n return {\n x: point.x * matrix.a + point.y * matrix.c + matrix.e,\n y: point.x * matrix.b + point.y * matrix.d + matrix.f,\n z: 'z' in point ? point.z : undefined\n };\n}\n\nexport function transformPathCommands(commands: CadPathCommand[] | undefined, matrix: Matrix2D): CadPathCommand[] | undefined {\n if (!commands) return undefined;\n return commands.map((command) => ({ cmd: command.cmd, points: command.points.map((p) => transformPoint(p, matrix)) }));\n}\n\nexport function matrixFromInsert(entity: CadEntity, basePoint: CadPoint3D = { x: 0, y: 0 }): Matrix2D {\n const insertion = entity.insertionPoint ?? { x: 0, y: 0 };\n const scaleValue = entity.scale;\n const sx = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.x ?? 1) : Number((entity as Record<string, unknown>).scaleX ?? 1);\n const sy = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.y ?? sx) : Number((entity as Record<string, unknown>).scaleY ?? sx);\n const rotation = Number(entity.rotation ?? 0);\n let matrix = translationMatrix(insertion.x, insertion.y);\n matrix = multiplyMatrix(matrix, rotationMatrix(Number.isFinite(rotation) ? rotation : 0));\n matrix = multiplyMatrix(matrix, scaleMatrix(Number.isFinite(sx) ? sx : 1, Number.isFinite(sy) ? sy : 1));\n matrix = multiplyMatrix(matrix, translationMatrix(-basePoint.x, -basePoint.y));\n return matrix;\n}\n\nexport function transformEntity(entity: CadEntity, matrix: Matrix2D): CadEntity {\n const clone: CadEntity = { ...entity };\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n const scaleApprox = Math.sqrt(Math.abs(determinant));\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n if (entity.startPoint) clone.startPoint = transformPoint(entity.startPoint, matrix);\n if (entity.endPoint) clone.endPoint = transformPoint(entity.endPoint, matrix);\n if (entity.center) clone.center = transformPoint(entity.center, matrix);\n if (entity.insertionPoint) clone.insertionPoint = transformPoint(entity.insertionPoint, matrix);\n if (entity.majorAxisEndPoint) {\n const origin = transformPoint({ x: 0, y: 0 }, matrix);\n const major = transformPoint(entity.majorAxisEndPoint, matrix);\n clone.majorAxisEndPoint = { x: major.x - origin.x, y: major.y - origin.y, z: major.z };\n }\n if (entity.vertices) {\n clone.vertices = entity.vertices.map((point) => ({\n ...transformPoint(point, matrix),\n bulge: point.bulge,\n startWidth: scaleDimension(point.startWidth, scaleApprox),\n endWidth: scaleDimension(point.endWidth, scaleApprox)\n }));\n }\n if (entity.points) clone.points = entity.points.map((p) => transformPoint(p, matrix));\n if (entity.controlPoints) clone.controlPoints = entity.controlPoints.map((p) => transformPoint(p, matrix));\n if (entity.fitPoints) clone.fitPoints = entity.fitPoints.map((p) => transformPoint(p, matrix));\n if (entity.attribs) clone.attribs = entity.attribs.map((attribute) => transformEntity(attribute, matrix));\n if (entity.commands) clone.commands = transformPathCommands(entity.commands, matrix);\n if (entity.loops) {\n clone.loops = entity.loops.map((loop) => ({\n ...loop,\n vertices: loop.vertices?.map((p) => transformPoint(p, matrix)),\n commands: transformPathCommands(loop.commands, matrix)\n }));\n }\n\n if (typeof entity.radius === 'number' && Number.isFinite(scaleApprox)) clone.radius = entity.radius * scaleApprox;\n if (typeof entity.constantWidth === 'number' && Number.isFinite(scaleApprox)) clone.constantWidth = entity.constantWidth * scaleApprox;\n if (typeof entity.thickness === 'number' && Number.isFinite(scaleApprox)) clone.thickness = entity.thickness * scaleApprox;\n if (typeof entity.lineTypeScale === 'number' && Number.isFinite(scaleApprox)) clone.lineTypeScale = entity.lineTypeScale * scaleApprox;\n if (entity.kind === 'text' || /^(TEXT|MTEXT|ATTRIB|ATTDEF|DIMENSION)$/i.test(String(entity.type ?? ''))) {\n if (typeof entity.textHeight === 'number' && Number.isFinite(scaleY)) clone.textHeight = entity.textHeight * scaleY;\n if (typeof entity.height === 'number' && Number.isFinite(scaleY)) clone.height = entity.height * scaleY;\n if (typeof entity.xScale === 'number' && scaleY > 1e-14 && Number.isFinite(scaleX)) clone.xScale = entity.xScale * scaleX / scaleY;\n }\n const rotation = Math.atan2(matrix.b, matrix.a);\n const ellipseAnglesAreRelative = entity.kind === 'ellipse' || String(entity.type ?? '').toUpperCase() === 'ELLIPSE';\n if (typeof entity.rotation === 'number' || entity.kind === 'text' || entity.kind === 'insert') {\n clone.rotation = normalizeRotation(Number(entity.rotation ?? 0) + (Number.isFinite(rotation) ? rotation : 0));\n }\n if (Number.isFinite(rotation) && Math.abs(rotation) > 1e-14) {\n // ARC angles are WCS angles and rotate with the scene. ELLIPSE start/end\n // parameters are relative to majorAxisEndPoint, which was already rotated.\n if (!ellipseAnglesAreRelative && typeof entity.startAngle === 'number') clone.startAngle = entity.startAngle + rotation;\n if (!ellipseAnglesAreRelative && typeof entity.endAngle === 'number') clone.endAngle = entity.endAngle + rotation;\n }\n if (determinant < 0 && clone.vertices) {\n clone.vertices = clone.vertices.map((point) => ({ ...point, bulge: typeof point.bulge === 'number' ? -point.bulge : undefined }));\n }\n return clone;\n}\n\nfunction scaleDimension(value: number | undefined, scale: number): number | undefined {\n return typeof value === 'number' && Number.isFinite(scale) ? value * scale : value;\n}\n\nfunction normalizeRotation(angle: number): number {\n if (!Number.isFinite(angle)) return angle;\n const tau = Math.PI * 2;\n const normalized = ((angle + Math.PI) % tau + tau) % tau - Math.PI;\n return Math.abs(normalized) <= 1e-12 ? 0 : normalized;\n}\n\nexport function parseMatrix(value: string | null | undefined): Matrix2D | undefined {\n if (!value) return undefined;\n const numbers = value.match(/-?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?/g)?.map(Number) ?? [];\n if (numbers.length < 6) return undefined;\n const [a, b, c, d, e, f] = numbers;\n return { a, b, c, d, e, f };\n}\n","import { inferEntityKind } from './entity';\nimport { boundsValid, ellipsePoints, emptyBounds, includeCircle, includePoint, isFinitePoint, mergeBounds, paddedBounds } from './geometry';\nimport { matrixFromInsert, transformEntity } from './transform';\nimport type { CadBlock, CadBounds, CadDocument, CadEntity, CadFitMode } from './types';\n\nexport interface CadBoundsOptions {\n maxInsertDepth?: number;\n maxCurveSegments?: number;\n}\n\ninterface BoundsContext {\n document: CadDocument;\n maxInsertDepth: number;\n maxCurveSegments: number;\n}\n\nconst DEFAULT_MAX_INSERT_DEPTH = 16;\nconst DEFAULT_MAX_CURVE_SEGMENTS = 96;\nconst MIN_SAVED_VIEW_CONTENT_RATIO = 0.01;\n\nexport function computeCadDocumentBounds(document: CadDocument, options: CadBoundsOptions = {}): CadBounds {\n const bounds = emptyBounds();\n for (const page of document.pages ?? []) {\n includePoint(bounds, { x: 0, y: 0 });\n includePoint(bounds, { x: page.width, y: page.height });\n }\n\n const context = createBoundsContext(document, options);\n for (const entity of document.entities) mergeBounds(bounds, computeEntityBounds(entity, context));\n return paddedBounds(bounds);\n}\n\nexport function resolveCadFitBounds(\n document: CadDocument,\n extents: CadBounds,\n mode: CadFitMode = 'auto',\n options: CadBoundsOptions = {}\n): CadBounds {\n if (mode === 'extents') return extents;\n\n const savedViewBounds = resolveCadSavedViewBounds(document);\n if (!savedViewBounds) return extents;\n if (mode === 'saved-view') return savedViewBounds;\n\n const visibleContent = emptyBounds();\n const context = createBoundsContext(document, options);\n let intersectingEntities = 0;\n for (const entity of document.entities) {\n const intersection = intersectBounds(computeEntityBounds(entity, context), savedViewBounds);\n if (!intersection) continue;\n intersectingEntities++;\n mergeBounds(visibleContent, intersection);\n }\n\n if (intersectingEntities === 0 || !hasMeaningfulExtent(visibleContent, savedViewBounds)) {\n return savedViewBounds;\n }\n return paddedBounds(visibleContent);\n}\n\nexport function resolveCadSavedViewBounds(document: CadDocument): CadBounds | undefined {\n const view = document.savedView;\n if (!view || view.source !== 'vport' || view.sceneTransformApplied !== true || !isFinitePoint(view.center)) return undefined;\n\n const height = Number(view.viewHeight);\n const aspectRatio = Number(view.aspectRatio);\n if (!Number.isFinite(height) || height <= 1e-9 || !Number.isFinite(aspectRatio) || aspectRatio <= 1e-9) return undefined;\n\n const width = height * aspectRatio;\n return {\n minX: view.center.x - width / 2,\n minY: view.center.y - height / 2,\n maxX: view.center.x + width / 2,\n maxY: view.center.y + height / 2\n };\n}\n\nfunction createBoundsContext(document: CadDocument, options: CadBoundsOptions): BoundsContext {\n return {\n document,\n maxInsertDepth: Math.max(0, Math.floor(options.maxInsertDepth ?? DEFAULT_MAX_INSERT_DEPTH)),\n maxCurveSegments: Math.max(12, Math.floor(options.maxCurveSegments ?? DEFAULT_MAX_CURVE_SEGMENTS))\n };\n}\n\nfunction computeEntityBounds(entity: CadEntity, context: BoundsContext, depth = 0): CadBounds {\n const bounds = emptyBounds();\n includeEntityBounds(bounds, entity, context, depth);\n return bounds;\n}\n\nfunction includeEntityBounds(bounds: CadBounds, entity: CadEntity, context: BoundsContext, depth: number): void {\n const type = String(entity.type ?? '').toUpperCase();\n const kind = entity.kind ?? inferEntityKind(type);\n if (kind === 'insert') {\n const block = lookupBlock(context.document, entity.blockName ?? entity.name);\n if (block && depth < context.maxInsertDepth) {\n const matrix = matrixFromInsert(entity, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) includeEntityBounds(bounds, transformEntity(child, matrix), context, depth + 1);\n return;\n }\n }\n\n if (kind === 'line') {\n if (isFinitePoint(entity.startPoint)) includePoint(bounds, entity.startPoint);\n if (isFinitePoint(entity.endPoint)) includePoint(bounds, entity.endPoint);\n } else if (kind === 'circle' || kind === 'arc') {\n if (isFinitePoint(entity.center) && Number.isFinite(entity.radius)) includeCircle(bounds, entity.center, Number(entity.radius));\n } else if (kind === 'polyline' || kind === 'solid' || kind === 'spline') {\n for (const point of [...(entity.vertices ?? []), ...(entity.points ?? []), ...(entity.controlPoints ?? []), ...(entity.fitPoints ?? [])]) {\n if (isFinitePoint(point)) includePoint(bounds, point);\n }\n } else if (kind === 'ellipse') {\n if (isFinitePoint(entity.center) && isFinitePoint(entity.majorAxisEndPoint)) {\n for (const point of ellipsePoints(\n entity.center,\n entity.majorAxisEndPoint,\n Number(entity.axisRatio ?? 1),\n Number(entity.startAngle ?? 0),\n Number(entity.endAngle ?? Math.PI * 2),\n context.maxCurveSegments\n )) includePoint(bounds, point);\n }\n } else if (kind === 'path') {\n for (const command of entity.commands ?? []) for (const point of command.points) includePoint(bounds, point);\n } else if (kind === 'hatch') {\n for (const loop of entity.loops ?? []) {\n for (const point of loop.vertices ?? []) includePoint(bounds, point);\n for (const command of loop.commands ?? []) for (const point of command.points) includePoint(bounds, point);\n }\n } else {\n const anchor = entityAnchor(entity);\n if (anchor) includePoint(bounds, anchor);\n }\n}\n\nfunction entityAnchor(entity: CadEntity) {\n for (const key of ['startPoint', 'insertionPoint', 'center', 'point', 'location']) {\n const point = entity[key];\n if (isFinitePoint(point)) return point;\n }\n if (Array.isArray(entity.vertices) && isFinitePoint(entity.vertices[0])) return entity.vertices[0];\n if (Array.isArray(entity.commands)) {\n const command = entity.commands.find((item) => item.points.length > 0);\n if (command) return command.points[0];\n }\n return undefined;\n}\n\nfunction lookupBlock(document: CadDocument, name: string | undefined): CadBlock | undefined {\n if (!name) return undefined;\n return document.blocks[name]\n ?? document.blocks[name.toLowerCase()]\n ?? Object.values(document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction intersectBounds(a: CadBounds, b: CadBounds): CadBounds | undefined {\n if (!boundsValid(a) || !boundsValid(b)) return undefined;\n const intersection = {\n minX: Math.max(a.minX, b.minX),\n minY: Math.max(a.minY, b.minY),\n maxX: Math.min(a.maxX, b.maxX),\n maxY: Math.min(a.maxY, b.maxY)\n };\n return boundsValid(intersection) ? intersection : undefined;\n}\n\nfunction hasMeaningfulExtent(content: CadBounds, savedView: CadBounds): boolean {\n if (!boundsValid(content) || !boundsValid(savedView)) return false;\n const contentDiagonal = Math.hypot(content.maxX - content.minX, content.maxY - content.minY);\n const savedViewDiagonal = Math.hypot(savedView.maxX - savedView.minX, savedView.maxY - savedView.minY);\n return savedViewDiagonal > 1e-9 && contentDiagonal / savedViewDiagonal >= MIN_SAVED_VIEW_CONTENT_RATIO;\n}\n","import type { CadDocument, CadEntity, CadLayer, CadLineType, CadPoint2D } from './types';\nimport type { CadShxGlyph } from './shx';\n\nexport interface ResolvedCadLinePattern {\n name: string;\n /** Alternating world-unit draw/gap lengths, always starting with draw. */\n segments: number[];\n /** Exact signed-pattern semantics used by the renderers. Zero-length runs are marker events. */\n runs: ResolvedCadLinePatternRun[];\n period: number;\n}\n\nexport interface ResolvedCadLinePatternRun {\n draw: boolean;\n /** World-unit phase advance. A zero-length run does not change the pattern period. */\n length: number;\n /** Render a screen-space dot as a fallback for a DXF dot or unavailable SHX glyph. */\n marker: boolean;\n /** Source LTYPE element retained for complex shape/text placement. */\n element?: CadLineType['pattern'][number];\n /** Combined drawing, global and entity linetype scale. */\n globalScale: number;\n}\n\nexport interface CadLineTypeMarker {\n kind: 'shape' | 'text';\n /** Unshifted event point used by the legacy dot fallback. */\n fallbackPoint: CadPoint2D;\n point: CadPoint2D;\n angle: number;\n scale: number;\n shapeNumber?: number;\n text?: string;\n fontName?: string;\n}\n\nexport interface CadDashedPrimitives {\n segments: Array<readonly [CadPoint2D, CadPoint2D]>;\n dots: CadPoint2D[];\n markers?: CadLineTypeMarker[];\n}\n\nconst DEFAULT_MAX_DASH_PRIMITIVES = 100_000;\n\nconst BY_LAYER = new Set(['', 'bylayer', '15']);\nconst BY_BLOCK = new Set(['byblock', '14']);\nconst CONTINUOUS = new Set(['continuous', '16']);\n\nconst refKey = (value: unknown) => String(value ?? '').trim().toLowerCase();\n\nexport function isByBlockLineType(value: unknown): boolean {\n return BY_BLOCK.has(refKey(value));\n}\n\nexport function applyByBlockLineTypeInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument): CadEntity {\n if (!isByBlockLineType(entity.lineType)) return entity;\n const parentRef = resolveCadLineTypeReference(parent, document);\n return {\n ...entity,\n lineType: parentRef || 'Continuous',\n lineTypeScale: finitePositive(entity.lineTypeScale, 1) * finitePositive(parent.lineTypeScale, 1)\n };\n}\n\nexport function resolveCadLineTypeReference(entity: CadEntity, document?: CadDocument): string {\n let reference = String(entity.lineType ?? '').trim();\n const key = refKey(reference);\n if (BY_LAYER.has(key)) {\n reference = lookupLayer(document, entity.layer)?.lineType ?? 'Continuous';\n } else if (BY_BLOCK.has(key)) {\n reference = 'Continuous';\n }\n return reference || 'Continuous';\n}\n\nexport function resolveCadLinePattern(entity: CadEntity, document?: CadDocument): ResolvedCadLinePattern | undefined {\n if (!document) return undefined;\n const reference = resolveCadLineTypeReference(entity, document);\n const key = refKey(reference);\n if (CONTINUOUS.has(key) || BY_LAYER.has(key) || BY_BLOCK.has(key)) return undefined;\n const definition = lookupLineType(document, reference);\n if (!definition?.pattern.length) return undefined;\n\n // CELTSCALE is the authoring default for new entities. Once an entity has a\n // stored lineTypeScale it replaces (rather than multiplies) that default.\n const entityScale = finitePositive(entity.lineTypeScale, finitePositive(document.header?.CELTSCALE, 1));\n const globalScale = finitePositive(document.header?.LTSCALE, 1) * entityScale;\n const runs = patternRuns(definition, globalScale);\n const period = runs.reduce((sum, run) => sum + run.length, 0);\n if (!Number.isFinite(period) || period <= 1e-9) return undefined;\n const hasGap = runs.some((run) => !run.draw && run.length > 1e-12);\n const hasMarker = runs.some((run) => run.marker);\n if (!hasGap && !hasMarker) return undefined;\n return { name: definition.name, segments: canvasDashSegments(runs, hasGap), runs, period };\n}\n\nexport function createDashedCadSegments(\n points: CadPoint2D[],\n closed: boolean,\n pattern: ResolvedCadLinePattern\n): Array<readonly [CadPoint2D, CadPoint2D]> {\n return createDashedCadPrimitives(points, closed, pattern).segments;\n}\n\n/**\n * Expands one CAD path while keeping the LTYPE phase continuous across every\n * polyline edge. DXF zero-length dots and unavailable complex SHX glyphs are\n * returned as screen-space marker points instead of sub-pixel GL_LINES.\n */\nexport function createDashedCadPrimitives(\n points: CadPoint2D[],\n closed: boolean,\n pattern: ResolvedCadLinePattern,\n maxPrimitives = DEFAULT_MAX_DASH_PRIMITIVES\n): CadDashedPrimitives {\n const valid = points.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n if (valid.length < 2 || pattern.runs.length === 0) return { segments: [], dots: [] };\n const edges: Array<readonly [CadPoint2D, CadPoint2D]> = [];\n for (let index = 0; index < valid.length - 1; index++) edges.push([valid[index], valid[index + 1]]);\n if (closed) edges.push([valid[valid.length - 1], valid[0]]);\n\n const finiteLimit = Number.isFinite(maxPrimitives) ? Math.max(1, Math.floor(maxPrimitives)) : DEFAULT_MAX_DASH_PRIMITIVES;\n const totalLength = edges.reduce((sum, [start, end]) => sum + Math.hypot(end.x - start.x, end.y - start.y), 0);\n const estimatedCycles = pattern.period > 1e-12 ? totalLength / pattern.period : Number.POSITIVE_INFINITY;\n const estimatedPrimitives = estimatedCycles * Math.max(1, pattern.runs.length);\n if (!Number.isFinite(estimatedPrimitives) || estimatedPrimitives > finiteLimit) {\n // A corrupt or microscopic pattern can otherwise expand one entity into\n // millions of allocations. Keeping the source edges visible is a safer\n // degradation than freezing the viewer or dropping the entity entirely.\n return { segments: edges, dots: [] };\n }\n\n const output: CadDashedPrimitives = { segments: [], dots: [] };\n let runIndex = 0;\n let remaining = pattern.runs[0].length;\n let markerPending = true;\n const addDot = (point: CadPoint2D) => {\n const previous = output.dots[output.dots.length - 1];\n if (previous && Math.hypot(previous.x - point.x, previous.y - point.y) <= 1e-10) return;\n output.dots.push(point);\n };\n const advance = () => {\n runIndex = (runIndex + 1) % pattern.runs.length;\n remaining = pattern.runs[runIndex].length;\n markerPending = true;\n };\n const addMarker = (run: ResolvedCadLinePatternRun, point: CadPoint2D, dx: number, dy: number, edgeLength: number) => {\n const marker = createLineTypeMarker(run, point, dx / edgeLength, dy / edgeLength);\n addDot(point);\n if (marker) (output.markers ??= []).push(marker);\n };\n for (const [start, end] of edges) {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const length = Math.hypot(dx, dy);\n if (length <= 1e-14) continue;\n let offset = 0;\n while (offset < length - 1e-12) {\n let zeroRunCount = 0;\n while (remaining <= 1e-12 && zeroRunCount < pattern.runs.length) {\n const run = pattern.runs[runIndex];\n if (markerPending && run.marker) {\n const ratio = offset / length;\n const point = { x: start.x + dx * ratio, y: start.y + dy * ratio };\n if (isComplexRun(run)) addMarker(run, point, dx, dy, length);\n else addDot(point);\n }\n advance();\n zeroRunCount++;\n }\n if (remaining <= 1e-12) break;\n const run = pattern.runs[runIndex];\n if (markerPending) {\n if (run.marker) {\n const ratio = offset / length;\n const point = { x: start.x + dx * ratio, y: start.y + dy * ratio };\n if (isComplexRun(run)) addMarker(run, point, dx, dy, length);\n else addDot(point);\n }\n markerPending = false;\n }\n const take = Math.min(remaining, length - offset);\n if (run.draw && take > 1e-12) {\n const from = offset / length;\n const to = (offset + take) / length;\n output.segments.push([\n { x: start.x + dx * from, y: start.y + dy * from },\n { x: start.x + dx * to, y: start.y + dy * to }\n ]);\n }\n offset += take;\n remaining -= take;\n if (remaining <= 1e-12) {\n advance();\n }\n }\n }\n return output;\n}\n\nfunction patternRuns(definition: CadLineType, scale: number): ResolvedCadLinePatternRun[] {\n const out: ResolvedCadLinePatternRun[] = [];\n for (const element of definition.pattern) {\n const length = Number(element.length);\n const complex = Number(element.elementTypeFlag ?? 0) !== 0;\n if (!Number.isFinite(length)) continue;\n // Group 49 keeps its sign semantics even when group 74 attaches a shape\n // or text glyph: positive is a baseline dash, negative is a gap and zero\n // is a dot. The glyph is an additional marker, not a replacement dash.\n out.push({\n draw: length >= 0,\n length: Math.abs(length) * scale,\n marker: length >= 0 && (length === 0 || complex),\n element,\n globalScale: scale\n });\n }\n return out;\n}\n\nexport function transformCadLineTypeGlyph(marker: CadLineTypeMarker, glyph: CadShxGlyph): CadPoint2D[][] {\n const cosine = Math.cos(marker.angle);\n const sine = Math.sin(marker.angle);\n return glyph.polylines.map((polyline) => polyline.map((point) => {\n const x = point.x * marker.scale;\n const y = point.y * marker.scale;\n return {\n x: marker.point.x + x * cosine - y * sine,\n y: marker.point.y + x * sine + y * cosine\n };\n }));\n}\n\nfunction isComplexRun(run: ResolvedCadLinePatternRun): boolean {\n return Number(run.element?.elementTypeFlag ?? 0) !== 0;\n}\n\nfunction createLineTypeMarker(\n run: ResolvedCadLinePatternRun,\n point: CadPoint2D,\n tangentX: number,\n tangentY: number\n): CadLineTypeMarker | undefined {\n const element = run.element;\n const flag = Number(element?.elementTypeFlag ?? 0);\n if (!element || flag === 0) return undefined;\n\n const offsetX = finiteNumber(element.offsetX, 0) * run.globalScale;\n const offsetY = finiteNumber(element.offsetY, 0) * run.globalScale;\n const rotation = finiteNumber(element.rotation, 0);\n const tangentAngle = Math.atan2(tangentY, tangentX);\n const markerPoint = {\n x: point.x + tangentX * offsetX - tangentY * offsetY,\n y: point.y + tangentY * offsetX + tangentX * offsetY\n };\n const common = {\n fallbackPoint: point,\n point: markerPoint,\n angle: (flag & 1) === 1 ? rotation : tangentAngle + rotation,\n scale: Math.abs(finiteNumber(element.scale, 1) * run.globalScale),\n fontName: element.fontName\n };\n\n const shapeNumber = Number(element.shapeNumber);\n if ((flag & 4) === 4 && Number.isFinite(shapeNumber)) {\n return { ...common, kind: 'shape', shapeNumber: Math.trunc(shapeNumber) };\n }\n if ((flag & 2) === 2 && element.text) {\n return { ...common, kind: 'text', text: element.text };\n }\n return undefined;\n}\n\nfunction canvasDashSegments(runs: ResolvedCadLinePatternRun[], hasGap: boolean): number[] {\n if (!hasGap) return [];\n const merged: Array<{ draw: boolean; length: number }> = [];\n for (const run of runs) {\n if (run.length <= 1e-12) continue;\n const previous = merged[merged.length - 1];\n if (previous?.draw === run.draw) previous.length += run.length;\n else merged.push({ draw: run.draw, length: run.length });\n }\n const segments: number[] = [];\n for (const run of merged) {\n const expectedDraw = segments.length % 2 === 0;\n if (run.draw !== expectedDraw) segments.push(1e-9);\n segments.push(run.length);\n }\n if (segments.length % 2 === 1) segments.push(1e-9);\n return segments;\n}\n\nfunction lookupLineType(document: CadDocument, reference: string): CadLineType | undefined {\n const key = refKey(reference);\n const lineTypes = document.lineTypes ?? {};\n return lineTypes[reference]\n ?? lineTypes[key]\n ?? Object.values(lineTypes).find((lineType) => refKey(lineType.name) === key || refKey(lineType.handle) === key);\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name]\n ?? document.layers[name.toLowerCase()]\n ?? Object.values(document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction finitePositive(value: unknown, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) && number > 0 ? number : fallback;\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n}\n","import type { CadDocument, CadSceneTransform2D } from './types';\nimport { IDENTITY_MATRIX, transformEntity } from './transform';\n\nconst isIdentity = (matrix: CadSceneTransform2D) => {\n return Math.abs(matrix.a - 1) < 1e-12\n && Math.abs(matrix.b) < 1e-12\n && Math.abs(matrix.c) < 1e-12\n && Math.abs(matrix.d - 1) < 1e-12\n && Math.abs(matrix.e) < 1e-9\n && Math.abs(matrix.f) < 1e-9;\n};\n\n/**\n * Produces the one normalized coordinate space consumed by bounds, both\n * renderers, overlay text and future hit testing. The parser-owned document is\n * left untouched so callers can still inspect original WCS coordinates.\n */\nexport function createCadSceneDocument(document: CadDocument): CadDocument {\n if (document.metadata.sceneTransformApplied === true) return document;\n if (document.savedView?.sceneTransformApplied === false) return document;\n const matrix = document.savedView?.sceneTransform ?? IDENTITY_MATRIX;\n if (isIdentity(matrix)) return document;\n return {\n ...document,\n entities: document.entities.map((entity) => transformEntity(entity, matrix)),\n pages: document.pages?.map((page) => ({\n ...page,\n entities: page.entities.map((entity) => transformEntity(entity, matrix))\n })),\n metadata: {\n ...document.metadata,\n sceneTransformApplied: true\n }\n };\n}\n","import { applyByBlockColorInheritance, layerVisible, resolveCadColor, resolveFillColor, type CadColorContrastMode } from '../core/color';\nimport { computeCadDocumentBounds, resolveCadFitBounds } from '../core/bounds';\nimport { arcPoints, boundsValid, bulgeToPolylinePoints, clamp, ellipsePoints, emptyBounds, isFinitePoint, stripMTextFormatting, xy } from '../core/geometry';\nimport { cadEntityWorldStrokeWidth, inferEntityKind, isCadPolylineClosed } from '../core/entity';\nimport { applyByBlockLineTypeInheritance, createDashedCadPrimitives, resolveCadLinePattern, transformCadLineTypeGlyph, type CadLineTypeMarker } from '../core/linetype';\nimport { createCadSceneDocument } from '../core/scene';\nimport { EMPTY_SHX_GLYPH_RESOLVER, type CadShxGlyph, type CadShxGlyphResolver } from '../core/shx';\nimport { matrixFromInsert, transformEntity } from '../core/transform';\nimport type { CadBlock, CadBounds, CadDocument, CadEntity, CadFitMode, CadPathCommand, CadPoint2D, CadPoint3D } from '../core/types';\n\nexport interface CanvasViewerOptions {\n background?: string;\n foreground?: string;\n showUnsupportedMarkers?: boolean;\n showImagePlaceholders?: boolean;\n showPageBounds?: boolean;\n minScale?: number;\n maxScale?: number;\n wheelZoomFactor?: number;\n trueColorByteOrder?: 'rgb' | 'bgr';\n maxInsertDepth?: number;\n /** Initial and toolbar Fit behavior. Auto prefers meaningful content inside a valid saved DWG viewport. */\n fitMode?: CadFitMode;\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n\n /** WebGL renderer: approximate curve tessellation cap for circles/arcs/ellipses. */\n maxCurveSegments?: number;\n /** WebGL renderer: target number of spatial cells across the longest drawing axis. */\n spatialIndexCellCount?: number;\n /** WebGL renderer: maximum vertices per GPU batch. Smaller values improve culling granularity. */\n maxVerticesPerBatch?: number;\n /** WebGL renderer: hide labels below this screen-space height. */\n textMinPixelHeight?: number;\n /** WebGL renderer: cap the number of labels drawn into the 2D overlay per frame. */\n maxVisibleTextLabels?: number;\n /** WebGL renderer: WebGL context power preference. */\n powerPreference?: WebGLPowerPreference;\n /** WebGL renderer: request antialiasing from the WebGL context. */\n antialias?: boolean;\n /** WebGL renderer: keep WebGL framebuffer pixels after rendering. Usually false for speed. */\n preserveDrawingBuffer?: boolean;\n /** WebGL renderer: use retained, spatially culled GPU batches. */\n enableSpatialIndex?: boolean;\n /** Advanced renderer hook. CadViewer supplies this automatically for uploaded SHX references. */\n shxGlyphResolver?: CadShxGlyphResolver;\n}\n\nexport interface ViewState {\n centerX: number;\n centerY: number;\n scale: number;\n}\n\nexport interface RenderStats {\n total: number;\n drawn: number;\n skipped: number;\n byType: Record<string, number>;\n unsupported: Record<string, number>;\n renderElapsedMs: number;\n /** Active renderer backend. */\n backend?: 'canvas2d' | 'webgl';\n /** Total retained GPU/CPU primitives after scene normalization. */\n primitiveCount?: number;\n /** Primitives submitted in the latest frame after viewport culling. */\n visiblePrimitiveCount?: number;\n /** Primitives skipped by viewport culling in the latest frame. */\n culledPrimitiveCount?: number;\n /** Estimated GPU buffer memory in bytes. */\n gpuMemoryBytes?: number;\n /** One-time retained scene build/upload time in milliseconds. */\n buildElapsedMs?: number;\n}\n\nexport interface ViewChangeEvent {\n view: ViewState;\n fitScale: number;\n zoomRatio: number;\n zoomPercent: number;\n bounds: CadBounds;\n}\n\nconst DEFAULT_OPTIONS: Required<CanvasViewerOptions> = {\n background: '#0b1020',\n foreground: '#ffffff',\n showUnsupportedMarkers: false,\n showImagePlaceholders: true,\n showPageBounds: true,\n minScale: 1e-9,\n maxScale: 1e9,\n wheelZoomFactor: 1.14,\n trueColorByteOrder: 'rgb',\n maxInsertDepth: 16,\n fitMode: 'auto',\n contrastMode: 'adaptive',\n minColorContrast: 2.4,\n maxCurveSegments: 96,\n spatialIndexCellCount: 72,\n maxVerticesPerBatch: 65536,\n textMinPixelHeight: 4,\n maxVisibleTextLabels: 2500,\n powerPreference: 'high-performance',\n antialias: true,\n preserveDrawingBuffer: false,\n enableSpatialIndex: true,\n shxGlyphResolver: EMPTY_SHX_GLYPH_RESOLVER\n};\n\nexport class CadCanvasRenderer {\n readonly canvas: HTMLCanvasElement;\n private readonly ctx: CanvasRenderingContext2D;\n private readonly opts: Required<CanvasViewerOptions>;\n private sourceDocument?: CadDocument;\n private document?: CadDocument;\n private bounds: CadBounds = emptyBounds();\n private view: ViewState = { centerX: 0, centerY: 0, scale: 1 };\n private fitScale = 1;\n private dpr = 1;\n private isDragging = false;\n private lastPointer?: { x: number; y: number };\n private resizeObserver?: ResizeObserver;\n private imageCache = new Map<string, HTMLImageElement>();\n private stats: RenderStats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'canvas2d' };\n\n onStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n\n constructor(canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}) {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context is not available.');\n this.canvas = canvas;\n this.ctx = ctx;\n this.opts = { ...DEFAULT_OPTIONS, ...options };\n this.canvas.classList.add('cad-viewer-canvas');\n this.bindEvents();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(canvas);\n }\n this.resize();\n }\n\n destroy(): void {\n this.resizeObserver?.disconnect();\n }\n\n clear(): void {\n this.sourceDocument = undefined;\n this.document = undefined;\n this.bounds = emptyBounds();\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n }\n\n setDocument(document: CadDocument): void {\n this.sourceDocument = document;\n this.document = createCadSceneDocument(document);\n this.bounds = computeCadDocumentBounds(this.document, this.boundsOptions());\n this.fitToView();\n }\n\n refreshReferences(): void {\n this.render();\n this.emitViewChange();\n }\n\n getDocument(): CadDocument | undefined {\n return this.document;\n }\n\n getSourceDocument(): CadDocument | undefined { return this.sourceDocument; }\n\n setOptions(options: CanvasViewerOptions): void {\n const refit = options.fitMode !== undefined && options.fitMode !== this.opts.fitMode;\n Object.assign(this.opts, options);\n if (refit && this.document) {\n this.fitToView();\n return;\n }\n this.render();\n this.emitViewChange();\n }\n\n getOptions(): Required<CanvasViewerOptions> {\n return { ...this.opts };\n }\n\n fitToView(padding = 0.92, mode: CadFitMode = this.opts.fitMode): void {\n const fitBounds = this.document\n ? resolveCadFitBounds(this.document, this.bounds, mode, this.boundsOptions())\n : this.bounds;\n if (!boundsValid(fitBounds)) {\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n return;\n }\n const w = Math.max(1, this.cssWidth);\n const h = Math.max(1, this.cssHeight);\n const bw = Math.max(fitBounds.maxX - fitBounds.minX, 1e-9);\n const bh = Math.max(fitBounds.maxY - fitBounds.minY, 1e-9);\n const scale = this.clampScale(Math.min(w / bw, h / bh) * padding);\n this.fitScale = scale;\n this.view = {\n centerX: (fitBounds.minX + fitBounds.maxX) / 2,\n centerY: (fitBounds.minY + fitBounds.maxY) / 2,\n scale\n };\n this.render();\n this.emitViewChange();\n }\n\n resize(): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n const w = Math.max(1, Math.floor(this.cssWidth * this.dpr));\n const h = Math.max(1, Math.floor(this.cssHeight * this.dpr));\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w;\n this.canvas.height = h;\n }\n this.render();\n this.emitViewChange();\n }\n\n zoom(factor: number, anchor?: CadPoint2D): void {\n if (!Number.isFinite(factor) || factor <= 0) return;\n const point = anchor ?? { x: this.cssWidth / 2, y: this.cssHeight / 2 };\n const before = this.screenToWorld(point);\n this.view.scale = this.clampScale(this.view.scale * factor);\n const after = this.screenToWorld(point);\n this.view.centerX += before.x - after.x;\n this.view.centerY += before.y - after.y;\n this.render();\n this.emitViewChange();\n }\n\n zoomIn(): void { this.zoom(this.opts.wheelZoomFactor); }\n zoomOut(): void { this.zoom(1 / this.opts.wheelZoomFactor); }\n\n panByScreenDelta(dx: number, dy: number): void {\n if (!Number.isFinite(dx) || !Number.isFinite(dy)) return;\n this.view.centerX -= dx / this.view.scale;\n this.view.centerY += dy / this.view.scale;\n this.render();\n this.emitViewChange();\n }\n\n setViewState(view: ViewState): void {\n if (![view.centerX, view.centerY, view.scale].every(Number.isFinite)) throw new Error('Invalid view state.');\n this.view = { ...view, scale: this.clampScale(view.scale) };\n this.render();\n this.emitViewChange();\n }\n\n getViewState(): ViewState { return { ...this.view }; }\n getBounds(): CadBounds { return { ...this.bounds }; }\n getStats(): RenderStats { return cloneStats(this.stats); }\n getZoomRatio(): number { return Math.abs(this.fitScale) < 1e-12 ? 1 : this.view.scale / this.fitScale; }\n getZoomPercent(): number { return this.getZoomRatio() * 100; }\n\n worldToScreen(p: CadPoint2D): CadPoint2D {\n return {\n x: this.cssWidth / 2 + (p.x - this.view.centerX) * this.view.scale,\n y: this.cssHeight / 2 - (p.y - this.view.centerY) * this.view.scale\n };\n }\n\n screenToWorld(p: CadPoint2D): CadPoint2D {\n return {\n x: this.view.centerX + (p.x - this.cssWidth / 2) / this.view.scale,\n y: this.view.centerY - (p.y - this.cssHeight / 2) / this.view.scale\n };\n }\n\n render(): RenderStats {\n const started = performance.now();\n this.stats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'canvas2d' };\n this.clearCanvas();\n if (this.document) {\n if (this.opts.showPageBounds && this.document.pages?.length) this.drawPageBounds(this.document);\n for (const entity of this.document.entities) this.drawEntityTracked(entity, 0);\n }\n this.stats.renderElapsedMs = performance.now() - started;\n this.onStats?.(this.getStats());\n return this.getStats();\n }\n\n private get cssWidth(): number { return this.canvas.clientWidth || 1; }\n private get cssHeight(): number { return this.canvas.clientHeight || 1; }\n\n private bindEvents(): void {\n this.canvas.addEventListener('wheel', (ev) => {\n ev.preventDefault();\n const factor = ev.deltaY < 0 ? this.opts.wheelZoomFactor : 1 / this.opts.wheelZoomFactor;\n this.zoom(factor, { x: ev.offsetX, y: ev.offsetY });\n }, { passive: false });\n\n this.canvas.addEventListener('pointerdown', (ev) => {\n this.canvas.setPointerCapture(ev.pointerId);\n this.isDragging = true;\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n this.canvas.classList.add('is-dragging');\n });\n this.canvas.addEventListener('pointermove', (ev) => {\n if (!this.isDragging || !this.lastPointer) return;\n this.panByScreenDelta(ev.clientX - this.lastPointer.x, ev.clientY - this.lastPointer.y);\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n });\n const stopDrag = (ev?: PointerEvent) => {\n if (ev && this.canvas.hasPointerCapture(ev.pointerId)) this.canvas.releasePointerCapture(ev.pointerId);\n this.isDragging = false;\n this.lastPointer = undefined;\n this.canvas.classList.remove('is-dragging');\n };\n this.canvas.addEventListener('pointerup', stopDrag);\n this.canvas.addEventListener('pointercancel', () => stopDrag());\n }\n\n private clearCanvas(): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.clearRect(0, 0, this.cssWidth, this.cssHeight);\n ctx.fillStyle = this.opts.background;\n ctx.fillRect(0, 0, this.cssWidth, this.cssHeight);\n ctx.restore();\n }\n\n private drawPageBounds(document: CadDocument): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.strokeStyle = 'rgba(148, 163, 184, 0.35)';\n ctx.lineWidth = 1;\n ctx.setLineDash([8, 6]);\n for (const page of document.pages ?? []) {\n const a = this.worldToScreen({ x: 0, y: 0 });\n const b = this.worldToScreen({ x: page.width, y: page.height });\n ctx.strokeRect(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n }\n ctx.restore();\n }\n\n private drawEntityTracked(entity: CadEntity, depth: number): void {\n this.stats.total++;\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n this.stats.byType[type] = (this.stats.byType[type] ?? 0) + 1;\n const layer = this.lookupLayer(entity.layer);\n if (entity.isVisible === false || !layerVisible(layer)) {\n this.stats.skipped++;\n return;\n }\n this.drawEntity(entity, type, depth);\n }\n\n private drawEntity(entity: CadEntity, type: string, depth: number): void {\n const kind = entity.kind ?? inferEntityKind(type);\n switch (kind) {\n case 'line': return this.drawLine(entity);\n case 'circle': return this.drawCircle(entity);\n case 'arc': return this.drawArc(entity);\n case 'polyline': return this.drawPolyline(entity);\n case 'ellipse': return this.drawEllipse(entity);\n case 'text': return this.drawText(entity);\n case 'point': return this.drawPoint(entity);\n case 'insert': return this.drawInsert(entity, depth);\n case 'solid': return this.drawSolid(entity);\n case 'hatch': return this.drawHatch(entity);\n case 'spline': return this.drawSpline(entity);\n case 'path': return this.drawPath(entity);\n case 'image': return this.drawImage(entity);\n case 'viewport': return this.markSkipped(type);\n default:\n this.stats.unsupported[type] = (this.stats.unsupported[type] ?? 0) + 1;\n this.stats.skipped++;\n if (this.opts.showUnsupportedMarkers) this.drawUnsupportedMarker(entity);\n }\n }\n\n private beginStyledPath(entity: CadEntity, fill = false, applyLinePattern = true): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n const color = resolveCadColor(entity, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n const fillColor = resolveFillColor(entity, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast }) ?? color;\n ctx.strokeStyle = color;\n ctx.fillStyle = fill ? fillColor : color;\n ctx.globalAlpha = clamp(Number(entity.opacity ?? 1), 0, 1);\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n const lineweightPixels = typeof entity.lineweight === 'number' && entity.lineweight > 0 ? entity.lineweight / 30 : 1;\n const worldWidthPixels = cadEntityWorldStrokeWidth(entity) * Math.abs(this.view.scale);\n ctx.lineWidth = Math.max(1, Math.min(256, Math.max(lineweightPixels, Number.isFinite(worldWidthPixels) ? worldWidthPixels : 0)));\n const linePattern = applyLinePattern ? resolveCadLinePattern(entity, this.document) : undefined;\n ctx.setLineDash(linePattern\n ? linePattern.segments.map((length) => Math.max(0.05, length * this.view.scale))\n : []);\n ctx.beginPath();\n }\n\n private finishStroke(): void { this.ctx.stroke(); this.ctx.restore(); this.stats.drawn++; }\n private finishFillStroke(fill = false): void { if (fill) this.ctx.fill(); this.ctx.stroke(); this.ctx.restore(); this.stats.drawn++; }\n\n private drawLine(e: CadEntity): void {\n const start = e.startPoint;\n const end = e.endPoint;\n if (!isFinitePoint(start) || !isFinitePoint(end)) return this.markSkipped('LINE');\n this.strokeWorldPolyline(e, [start, end], false);\n }\n\n private drawCircle(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return this.markSkipped('CIRCLE');\n this.strokeWorldPolyline(e, arcPoints(xy(center), radius, 0, Math.PI * 2, true), true);\n }\n\n private drawArc(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n const startAngle = Number(e.startAngle);\n const endAngle = Number(e.endAngle);\n if (!isFinitePoint(center) || !Number.isFinite(radius) || !Number.isFinite(startAngle) || !Number.isFinite(endAngle)) return this.markSkipped('ARC');\n this.strokeWorldPolyline(e, arcPoints(xy(center), radius, startAngle, endAngle, true), false);\n }\n\n private drawPolyline(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as Array<CadPoint3D & { bulge?: number }> | undefined;\n if (!Array.isArray(vertices) || vertices.length < 2) return this.markSkipped(String(e.type));\n const closed = isCadPolylineClosed(e);\n const pts: CadPoint2D[] = [];\n const pairs = closed ? vertices.length : vertices.length - 1;\n for (let i = 0; i < pairs; i++) {\n const p1 = vertices[i];\n const p2 = vertices[(i + 1) % vertices.length];\n if (!isFinitePoint(p1) || !isFinitePoint(p2)) continue;\n const segment = bulgeToPolylinePoints(p1, p2, Number(p1.bulge ?? 0));\n if (pts.length > 0) segment.shift();\n pts.push(...segment);\n }\n this.strokeWorldPolyline(e, pts, closed);\n }\n\n private drawEllipse(e: CadEntity): void {\n const center = e.center;\n const major = e.majorAxisEndPoint;\n const ratio = Number(e.axisRatio ?? 1);\n if (!isFinitePoint(center) || !isFinitePoint(major)) return this.markSkipped('ELLIPSE');\n const pts = ellipsePoints(center, major, ratio, Number(e.startAngle ?? 0), Number(e.endAngle ?? Math.PI * 2));\n const closed = Math.abs(Number(e.endAngle ?? Math.PI * 2) - Number(e.startAngle ?? 0)) >= Math.PI * 2 - 1e-6;\n this.strokeWorldPolyline(e, pts, closed);\n }\n\n private drawPoint(e: CadEntity): void {\n const p = (e.point ?? e.location ?? e.center ?? e.insertionPoint) as CadPoint3D | undefined;\n if (!isFinitePoint(p)) return this.markSkipped('POINT');\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n this.ctx.moveTo(s.x - 3, s.y);\n this.ctx.lineTo(s.x + 3, s.y);\n this.ctx.moveTo(s.x, s.y - 3);\n this.ctx.lineTo(s.x, s.y + 3);\n this.finishStroke();\n }\n\n private drawText(e: CadEntity): void {\n const aligned = (Number(e.halign ?? 0) !== 0 || Number(e.valign ?? 0) !== 0) && isFinitePoint(e.endPoint);\n const p = (aligned ? e.endPoint : e.insertionPoint ?? e.startPoint ?? e.center) as CadPoint3D | undefined;\n const text = stripMTextFormatting(String(e.text ?? e.value ?? ''));\n const height = Number(e.textHeight ?? e.height ?? 1);\n if (!isFinitePoint(p) || !text) return this.markSkipped(String(e.type));\n this.drawTextAt(e, p, text, height, Number(e.rotation ?? 0));\n }\n\n private drawInsert(e: CadEntity, depth: number): void {\n const block = this.lookupBlock(e.blockName ?? e.name);\n if (block && depth < this.opts.maxInsertDepth) {\n const matrix = matrixFromInsert(e, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) {\n const inheritedColor = applyByBlockColorInheritance(child, e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n const inherited = applyByBlockLineTypeInheritance(inheritedColor, e, this.document);\n this.drawEntityTracked(transformEntity(inherited, matrix), depth + 1);\n }\n return;\n }\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped('INSERT');\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n const r = 5;\n this.ctx.rect(s.x - r, s.y - r, r * 2, r * 2);\n this.finishStroke();\n if (Array.isArray(e.attribs)) for (const attr of e.attribs) this.drawText(attr);\n }\n\n private drawSolid(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as CadPoint3D[] | undefined;\n if (!Array.isArray(vertices) || vertices.length < 3) return this.markSkipped(String(e.type));\n this.beginStyledPath(e, true);\n const first = this.worldToScreen(vertices[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const vertex of vertices.slice(1)) {\n if (!isFinitePoint(vertex)) continue;\n const s = this.worldToScreen(vertex);\n this.ctx.lineTo(s.x, s.y);\n }\n this.ctx.closePath();\n this.finishFillStroke(true);\n }\n\n private drawHatch(e: CadEntity): void {\n const loops = e.loops;\n if (!Array.isArray(loops) || loops.length === 0) return this.markSkipped('HATCH');\n this.beginStyledPath(e, true);\n for (const loop of loops) {\n if (loop.commands?.length) this.addPathCommands(loop.commands);\n else if (loop.vertices?.length) {\n const first = this.worldToScreen(loop.vertices[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const p of loop.vertices.slice(1)) {\n const s = this.worldToScreen(p);\n this.ctx.lineTo(s.x, s.y);\n }\n this.ctx.closePath();\n }\n }\n this.finishFillStroke(Boolean(resolveFillColor(e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast })));\n }\n\n private drawSpline(e: CadEntity): void {\n const points = e.fitPoints?.length ? e.fitPoints : e.controlPoints;\n if (!points || points.length < 2) return this.markSkipped('SPLINE');\n // Lightweight preview: draw fit/control polygon. A full NURBS evaluator can be added behind this normalized entity.\n this.strokeWorldPolyline(e, points, Boolean(e.isClosed));\n }\n\n private drawPath(e: CadEntity): void {\n if (!e.commands?.length) return this.markSkipped(String(e.type));\n this.beginStyledPath(e, Boolean(e.fillColor));\n this.addPathCommands(e.commands);\n this.finishFillStroke(Boolean(e.fillColor));\n }\n\n private addPathCommands(commands: CadPathCommand[]): void {\n for (const command of commands) {\n if (command.cmd === 'M') {\n const p = this.worldToScreen(command.points[0]);\n this.ctx.moveTo(p.x, p.y);\n } else if (command.cmd === 'L') {\n const p = this.worldToScreen(command.points[0]);\n this.ctx.lineTo(p.x, p.y);\n } else if (command.cmd === 'C') {\n const [p1, p2, p3] = command.points.map((p) => this.worldToScreen(p));\n this.ctx.bezierCurveTo(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);\n } else if (command.cmd === 'Q') {\n const [p1, p2] = command.points.map((p) => this.worldToScreen(p));\n this.ctx.quadraticCurveTo(p1.x, p1.y, p2.x, p2.y);\n } else if (command.cmd === 'Z') this.ctx.closePath();\n }\n }\n\n private drawImage(e: CadEntity): void {\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped(String(e.type));\n const w = Number(e.width ?? 32);\n const h = Number(e.height ?? 32);\n const a = this.worldToScreen(p);\n const b = this.worldToScreen({ x: p.x + w, y: p.y - h });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.abs(b.x - a.x);\n const height = Math.abs(b.y - a.y);\n const src = e.imageDataUrl;\n if (src) {\n const image = this.getImage(src);\n if (image.complete && image.naturalWidth > 0) {\n this.ctx.save();\n this.ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n this.ctx.drawImage(image, x, y, width, height);\n this.ctx.restore();\n this.stats.drawn++;\n return;\n }\n image.onload = () => this.render();\n }\n if (!this.opts.showImagePlaceholders) return this.markSkipped(String(e.type));\n this.beginStyledPath(e);\n this.ctx.rect(x, y, width, height);\n this.ctx.moveTo(x, y); this.ctx.lineTo(x + width, y + height);\n this.ctx.moveTo(x + width, y); this.ctx.lineTo(x, y + height);\n this.finishStroke();\n }\n\n private getImage(src: string): HTMLImageElement {\n let image = this.imageCache.get(src);\n if (!image) {\n image = new Image();\n image.src = src;\n this.imageCache.set(src, image);\n }\n return image;\n }\n\n private drawUnsupportedMarker(e: CadEntity): void {\n const p = this.entityAnchor(e);\n if (!p) return;\n const s = this.worldToScreen(p);\n this.beginStyledPath(e);\n this.ctx.moveTo(s.x - 4, s.y - 4);\n this.ctx.lineTo(s.x + 4, s.y + 4);\n this.ctx.moveTo(s.x + 4, s.y - 4);\n this.ctx.lineTo(s.x - 4, s.y + 4);\n this.finishStroke();\n }\n\n private drawTextAt(e: CadEntity, p: CadPoint2D, text: string, height: number, rotation: number): void {\n const ctx = this.ctx;\n const s = this.worldToScreen(p);\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.translate(s.x, s.y);\n ctx.rotate(-rotation);\n const generationFlag = Number(e.generationFlag ?? 0);\n const xScale = Number(e.xScale ?? 1);\n ctx.scale((generationFlag & 2 ? -1 : 1) * (Number.isFinite(xScale) && Math.abs(xScale) > 1e-9 ? Math.abs(xScale) : 1), generationFlag & 4 ? -1 : 1);\n const pixelHeight = Math.max(4, Math.min(256, Math.abs(height) * this.view.scale));\n ctx.font = `${pixelHeight}px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.fillStyle = resolveCadColor(e, this.document, { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast });\n ctx.globalAlpha = clamp(Number(e.opacity ?? 1), 0, 1);\n const halign = Number(e.halign ?? 0);\n const valign = Number(e.valign ?? 0);\n ctx.textAlign = halign === 1 || halign === 4 ? 'center' : halign === 2 ? 'right' : 'left';\n ctx.textBaseline = valign === 1 ? 'bottom' : valign === 2 ? 'middle' : valign === 3 ? 'top' : 'alphabetic';\n for (const [index, line] of text.split(/\\r?\\n/g).entries()) ctx.fillText(line, 0, index * pixelHeight * 1.22);\n ctx.restore();\n this.stats.drawn++;\n }\n\n private strokeWorldPolyline(e: CadEntity, points: CadPoint2D[], closed: boolean): void {\n const valid = points.filter(isFinitePoint);\n if (valid.length < 2) return this.markSkipped(String(e.type));\n const pattern = resolveCadLinePattern(e, this.document);\n if (pattern) {\n const primitives = createDashedCadPrimitives(valid, closed, pattern);\n const fallbackDots = [...primitives.dots];\n this.beginStyledPath(e, false, false);\n for (const [start, end] of primitives.segments) {\n const a = this.worldToScreen(start);\n const b = this.worldToScreen(end);\n this.ctx.moveTo(a.x, a.y);\n this.ctx.lineTo(b.x, b.y);\n }\n for (const marker of primitives.markers ?? []) {\n const glyph = this.resolveLineTypeGlyph(marker);\n if (!glyph) continue;\n removeMatchingPoint(fallbackDots, marker.fallbackPoint);\n for (const polyline of transformCadLineTypeGlyph(marker, glyph)) {\n if (polyline.length < 2) continue;\n const first = this.worldToScreen(polyline[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const point of polyline.slice(1)) {\n const screen = this.worldToScreen(point);\n this.ctx.lineTo(screen.x, screen.y);\n }\n }\n }\n this.ctx.stroke();\n if (fallbackDots.length > 0) {\n this.ctx.setLineDash([]);\n this.ctx.beginPath();\n const radius = Math.max(0.5, this.ctx.lineWidth / 2);\n for (const point of fallbackDots) {\n const screen = this.worldToScreen(point);\n this.ctx.moveTo(screen.x + radius, screen.y);\n this.ctx.arc(screen.x, screen.y, radius, 0, Math.PI * 2);\n }\n this.ctx.fillStyle = this.ctx.strokeStyle;\n this.ctx.fill();\n }\n this.ctx.restore();\n this.stats.drawn++;\n return;\n }\n this.beginStyledPath(e);\n const first = this.worldToScreen(valid[0]);\n this.ctx.moveTo(first.x, first.y);\n for (const point of valid.slice(1)) {\n const s = this.worldToScreen(point);\n this.ctx.lineTo(s.x, s.y);\n }\n if (closed) this.ctx.closePath();\n this.finishStroke();\n }\n\n private resolveLineTypeGlyph(marker: CadLineTypeMarker): CadShxGlyph | undefined {\n return marker.kind === 'shape'\n ? this.opts.shxGlyphResolver.resolveShape(Number(marker.shapeNumber), marker.fontName)\n : this.opts.shxGlyphResolver.resolveText(String(marker.text ?? ''), marker.fontName);\n }\n\n private markSkipped(type: string): void {\n this.stats.skipped++;\n this.stats.unsupported[type] = this.stats.unsupported[type] ?? 0;\n }\n\n private entityAnchor(e: CadEntity): CadPoint2D | undefined {\n for (const key of ['startPoint', 'insertionPoint', 'center', 'point', 'location']) {\n const p = e[key];\n if (isFinitePoint(p)) return xy(p);\n }\n if (Array.isArray(e.vertices) && isFinitePoint(e.vertices[0])) return xy(e.vertices[0]);\n if (Array.isArray(e.commands) && e.commands.length) {\n const cmd = e.commands.find((item) => item.points.length > 0);\n if (cmd) return xy(cmd.points[0]);\n }\n return undefined;\n }\n\n private lookupLayer(name: string | undefined) {\n if (!this.document || !name) return undefined;\n return this.document.layers[name] ?? this.document.layers[name.toLowerCase()] ?? Object.values(this.document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n }\n\n private lookupBlock(name: string | undefined): CadBlock | undefined {\n if (!this.document || !name) return undefined;\n return this.document.blocks[name] ?? this.document.blocks[name.toLowerCase()] ?? Object.values(this.document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n }\n\n private clampScale(value: number): number {\n return Math.min(this.opts.maxScale, Math.max(this.opts.minScale, value));\n }\n\n private boundsOptions() {\n return { maxInsertDepth: this.opts.maxInsertDepth, maxCurveSegments: this.opts.maxCurveSegments };\n }\n\n private emitViewChange(): void {\n this.onViewChange?.({\n view: this.getViewState(),\n fitScale: this.fitScale,\n zoomRatio: this.getZoomRatio(),\n zoomPercent: this.getZoomPercent(),\n bounds: this.getBounds()\n });\n }\n}\n\nfunction cloneStats(stats: RenderStats): RenderStats {\n return {\n total: stats.total,\n drawn: stats.drawn,\n skipped: stats.skipped,\n byType: { ...stats.byType },\n unsupported: { ...stats.unsupported },\n renderElapsedMs: stats.renderElapsedMs,\n backend: stats.backend,\n primitiveCount: stats.primitiveCount,\n visiblePrimitiveCount: stats.visiblePrimitiveCount,\n culledPrimitiveCount: stats.culledPrimitiveCount,\n gpuMemoryBytes: stats.gpuMemoryBytes,\n buildElapsedMs: stats.buildElapsedMs\n };\n}\n\nfunction removeMatchingPoint(points: CadPoint2D[], target: CadPoint2D): void {\n const extent = Math.max(1, Math.abs(target.x), Math.abs(target.y));\n const tolerance = Math.max(1e-9, extent * 1e-12);\n const index = points.findIndex((point) => Math.hypot(point.x - target.x, point.y - target.y) <= tolerance);\n if (index >= 0) points.splice(index, 1);\n}\n","import { applyByBlockColorInheritance, layerVisible, resolveCadColor, resolveFillColor } from '../core/color';\nimport { computeCadDocumentBounds, resolveCadFitBounds } from '../core/bounds';\nimport { arcPoints, boundsValid, bulgeToPolylinePoints, clamp, ellipsePoints, emptyBounds, includePoint, isFinitePoint, stripMTextFormatting, xy } from '../core/geometry';\nimport { cadEntityWorldStrokeWidth, inferEntityKind, isCadPolylineClosed } from '../core/entity';\nimport { applyByBlockLineTypeInheritance, createDashedCadPrimitives, resolveCadLinePattern, transformCadLineTypeGlyph, type CadLineTypeMarker } from '../core/linetype';\nimport { createCadSceneDocument } from '../core/scene';\nimport { EMPTY_SHX_GLYPH_RESOLVER, type CadShxGlyph } from '../core/shx';\nimport { matrixFromInsert, transformEntity } from '../core/transform';\nimport type { CadBlock, CadBounds, CadDocument, CadEntity, CadFitMode, CadPathCommand, CadPoint2D, CadPoint3D } from '../core/types';\nimport type { CanvasViewerOptions, RenderStats, ViewChangeEvent, ViewState } from './CadCanvasRenderer';\n\ntype GL = WebGLRenderingContext | WebGL2RenderingContext;\ntype GlMode = WebGLRenderingContext['LINES'] | WebGLRenderingContext['TRIANGLES'] | WebGLRenderingContext['POINTS'];\n\ntype RgbaBytes = [number, number, number, number];\n\ninterface CpuBatch {\n positions: Float32Array;\n colors: Uint8Array;\n bounds: CadBounds;\n primitiveCount: number;\n}\n\ninterface GpuBatch {\n positionBuffer: WebGLBuffer;\n colorBuffer: WebGLBuffer;\n vertexCount: number;\n primitiveCount: number;\n bounds: CadBounds;\n gpuBytes: number;\n}\n\ninterface TextItem {\n point: CadPoint2D;\n text: string;\n height: number;\n rotation: number;\n xScale: number;\n generationFlag: number;\n halign: number;\n valign: number;\n color: string;\n opacity: number;\n bounds: CadBounds;\n}\n\ninterface ImageItem {\n point: CadPoint2D;\n width: number;\n height: number;\n source?: string;\n color: string;\n opacity: number;\n bounds: CadBounds;\n}\n\ninterface CpuScene {\n origin: CadPoint2D;\n lineBatches: CpuBatch[];\n triangleBatches: CpuBatch[];\n lineTypePointBatches: CpuBatch[];\n pointBatches: CpuBatch[];\n textItems: TextItem[];\n imageItems: ImageItem[];\n stats: Omit<RenderStats, 'renderElapsedMs'>;\n primitiveCount: number;\n buildElapsedMs: number;\n}\n\ninterface GpuScene {\n origin: CadPoint2D;\n lineBatches: GpuBatch[];\n triangleBatches: GpuBatch[];\n lineTypePointBatches: GpuBatch[];\n pointBatches: GpuBatch[];\n textItems: TextItem[];\n imageItems: ImageItem[];\n stats: Omit<RenderStats, 'renderElapsedMs'>;\n primitiveCount: number;\n gpuMemoryBytes: number;\n buildElapsedMs: number;\n}\n\ninterface ProgramInfo {\n program: WebGLProgram;\n aPosition: number;\n aColor: number;\n uViewCenter: WebGLUniformLocation;\n uScale: WebGLUniformLocation;\n uViewport: WebGLUniformLocation;\n uPointSize: WebGLUniformLocation;\n}\n\nconst DEFAULT_WEBGL_OPTIONS: Required<CanvasViewerOptions> = {\n background: '#0b1020',\n foreground: '#ffffff',\n showUnsupportedMarkers: false,\n showImagePlaceholders: true,\n showPageBounds: true,\n minScale: 1e-9,\n maxScale: 1e9,\n wheelZoomFactor: 1.14,\n trueColorByteOrder: 'rgb',\n maxInsertDepth: 16,\n fitMode: 'auto',\n contrastMode: 'adaptive',\n minColorContrast: 2.4,\n maxCurveSegments: 96,\n spatialIndexCellCount: 72,\n maxVerticesPerBatch: 65536,\n textMinPixelHeight: 4,\n maxVisibleTextLabels: 2500,\n powerPreference: 'high-performance',\n antialias: true,\n preserveDrawingBuffer: false,\n enableSpatialIndex: true,\n shxGlyphResolver: EMPTY_SHX_GLYPH_RESOLVER\n};\n\nexport class CadWebGLRenderer {\n readonly canvas: HTMLCanvasElement;\n readonly backend = 'webgl' as const;\n private readonly gl: GL;\n private readonly program: ProgramInfo;\n private readonly eventController = new AbortController();\n private readonly imageCache = new Map<string, HTMLImageElement>();\n private opts: Required<CanvasViewerOptions>;\n private sourceDocument?: CadDocument;\n private document?: CadDocument;\n private bounds: CadBounds = emptyBounds();\n private view: ViewState = { centerX: 0, centerY: 0, scale: 1 };\n private fitScale = 1;\n private dpr = 1;\n private isDragging = false;\n private lastPointer?: { x: number; y: number };\n private resizeObserver?: ResizeObserver;\n private overlayCanvas?: HTMLCanvasElement;\n private overlayCtx?: CanvasRenderingContext2D;\n private scene?: GpuScene;\n private stats: RenderStats = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs: 0, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n private rafHandle = 0;\n\n onStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n\n constructor(canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}) {\n const gl = createWebGLContext(canvas, options);\n if (!gl) throw new Error('WebGL is not available. Use renderer: \"canvas2d\" to force the Canvas2D fallback.');\n this.canvas = canvas;\n this.gl = gl;\n this.program = createProgramInfo(gl);\n this.opts = { ...DEFAULT_WEBGL_OPTIONS, ...options };\n this.canvas.classList.add('cad-viewer-canvas', 'cad-viewer-webgl-canvas');\n this.createOverlayCanvas();\n this.bindEvents();\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(canvas);\n }\n this.resize();\n }\n\n static isSupported(): boolean {\n return isWebGLAvailable();\n }\n\n destroy(): void {\n this.eventController.abort();\n this.resizeObserver?.disconnect();\n this.cancelScheduledRender();\n this.disposeScene();\n this.overlayCanvas?.remove();\n }\n\n clear(): void {\n this.sourceDocument = undefined;\n this.document = undefined;\n this.bounds = emptyBounds();\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.disposeScene();\n this.render();\n this.emitViewChange();\n }\n\n setDocument(document: CadDocument): void {\n this.sourceDocument = document;\n this.document = createCadSceneDocument(document);\n this.bounds = computeCadDocumentBounds(this.document, this.boundsOptions());\n this.disposeScene();\n const cpuScene = buildCpuScene(this.document, this.opts, this.bounds);\n this.scene = uploadScene(this.gl, cpuScene);\n this.stats = createStatsFromScene(this.scene, 0);\n this.fitToView();\n }\n\n refreshReferences(): void {\n if (!this.document) return;\n const view = { ...this.view };\n const fitScale = this.fitScale;\n this.disposeScene();\n const cpuScene = buildCpuScene(this.document, this.opts, this.bounds);\n this.scene = uploadScene(this.gl, cpuScene);\n this.stats = createStatsFromScene(this.scene, 0);\n this.view = view;\n this.fitScale = fitScale;\n this.render();\n this.emitViewChange();\n }\n\n getDocument(): CadDocument | undefined {\n return this.document;\n }\n\n getSourceDocument(): CadDocument | undefined { return this.sourceDocument; }\n\n setOptions(options: CanvasViewerOptions): void {\n const rebuildRequired = requiresSceneRebuild(this.opts, options);\n const refit = options.fitMode !== undefined && options.fitMode !== this.opts.fitMode;\n this.opts = { ...this.opts, ...options };\n if (rebuildRequired && (this.sourceDocument ?? this.document)) {\n this.setDocument(this.sourceDocument ?? this.document!);\n return;\n }\n if (refit && this.document) {\n this.fitToView();\n return;\n }\n this.render();\n this.emitViewChange();\n }\n\n getOptions(): Required<CanvasViewerOptions> {\n return { ...this.opts };\n }\n\n fitToView(padding = 0.92, mode: CadFitMode = this.opts.fitMode): void {\n const fitBounds = this.document\n ? resolveCadFitBounds(this.document, this.bounds, mode, this.boundsOptions())\n : this.bounds;\n if (!boundsValid(fitBounds)) {\n this.view = { centerX: 0, centerY: 0, scale: 1 };\n this.fitScale = 1;\n this.render();\n this.emitViewChange();\n return;\n }\n const w = Math.max(1, this.cssWidth);\n const h = Math.max(1, this.cssHeight);\n const bw = Math.max(fitBounds.maxX - fitBounds.minX, 1e-9);\n const bh = Math.max(fitBounds.maxY - fitBounds.minY, 1e-9);\n const scale = this.clampScale(Math.min(w / bw, h / bh) * padding);\n this.fitScale = scale;\n this.view = {\n centerX: (fitBounds.minX + fitBounds.maxX) / 2,\n centerY: (fitBounds.minY + fitBounds.maxY) / 2,\n scale\n };\n this.render();\n this.emitViewChange();\n }\n\n resize(): void {\n this.dpr = Math.max(1, window.devicePixelRatio || 1);\n const w = Math.max(1, Math.floor(this.cssWidth * this.dpr));\n const h = Math.max(1, Math.floor(this.cssHeight * this.dpr));\n if (this.canvas.width !== w || this.canvas.height !== h) {\n this.canvas.width = w;\n this.canvas.height = h;\n }\n this.resizeOverlay(w, h);\n this.render();\n this.emitViewChange();\n }\n\n zoom(factor: number, anchor?: CadPoint2D): void {\n if (!Number.isFinite(factor) || factor <= 0) return;\n const point = anchor ?? { x: this.cssWidth / 2, y: this.cssHeight / 2 };\n const before = this.screenToWorld(point);\n this.view.scale = this.clampScale(this.view.scale * factor);\n const after = this.screenToWorld(point);\n this.view.centerX += before.x - after.x;\n this.view.centerY += before.y - after.y;\n this.scheduleRender();\n this.emitViewChange();\n }\n\n zoomIn(): void { this.zoom(this.opts.wheelZoomFactor); }\n zoomOut(): void { this.zoom(1 / this.opts.wheelZoomFactor); }\n\n panByScreenDelta(dx: number, dy: number): void {\n if (!Number.isFinite(dx) || !Number.isFinite(dy)) return;\n this.view.centerX -= dx / this.view.scale;\n this.view.centerY += dy / this.view.scale;\n this.scheduleRender();\n this.emitViewChange();\n }\n\n setViewState(view: ViewState): void {\n if (![view.centerX, view.centerY, view.scale].every(Number.isFinite)) throw new Error('Invalid view state.');\n this.view = { ...view, scale: this.clampScale(view.scale) };\n this.render();\n this.emitViewChange();\n }\n\n getViewState(): ViewState { return { ...this.view }; }\n getBounds(): CadBounds { return { ...this.bounds }; }\n getStats(): RenderStats { return cloneStats(this.stats); }\n getZoomRatio(): number { return Math.abs(this.fitScale) < 1e-12 ? 1 : this.view.scale / this.fitScale; }\n getZoomPercent(): number { return this.getZoomRatio() * 100; }\n\n worldToScreen(p: CadPoint2D): CadPoint2D {\n return {\n x: this.cssWidth / 2 + (p.x - this.view.centerX) * this.view.scale,\n y: this.cssHeight / 2 - (p.y - this.view.centerY) * this.view.scale\n };\n }\n\n screenToWorld(p: CadPoint2D): CadPoint2D {\n return {\n x: this.view.centerX + (p.x - this.cssWidth / 2) / this.view.scale,\n y: this.view.centerY - (p.y - this.cssHeight / 2) / this.view.scale\n };\n }\n\n render(): RenderStats {\n this.cancelScheduledRender();\n return this.renderNow();\n }\n\n private renderNow(): RenderStats {\n const started = performance.now();\n const gl = this.gl;\n gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n const bg = cssToRgbaBytes(this.opts.background, [11, 16, 32, 255]);\n gl.clearColor(bg[0] / 255, bg[1] / 255, bg[2] / 255, bg[3] / 255);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.disable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n let visiblePrimitiveCount = 0;\n let culledPrimitiveCount = 0;\n const scene = this.scene;\n const visibleBounds = this.visibleWorldBounds();\n if (scene) {\n gl.useProgram(this.program.program);\n gl.uniform2f(this.program.uViewCenter, this.view.centerX - scene.origin.x, this.view.centerY - scene.origin.y);\n gl.uniform1f(this.program.uScale, this.view.scale * this.dpr);\n gl.uniform2f(this.program.uViewport, this.canvas.width, this.canvas.height);\n gl.uniform1f(this.program.uPointSize, Math.max(1, this.dpr));\n const lineCounts = this.drawBatches(scene.lineBatches, gl.LINES, visibleBounds);\n visiblePrimitiveCount += lineCounts.visible;\n culledPrimitiveCount += lineCounts.culled;\n const triangleCounts = this.drawBatches(scene.triangleBatches, gl.TRIANGLES, visibleBounds);\n visiblePrimitiveCount += triangleCounts.visible;\n culledPrimitiveCount += triangleCounts.culled;\n const lineTypePointCounts = this.drawBatches(scene.lineTypePointBatches, gl.POINTS, visibleBounds);\n visiblePrimitiveCount += lineTypePointCounts.visible;\n culledPrimitiveCount += lineTypePointCounts.culled;\n gl.uniform1f(this.program.uPointSize, Math.max(2, Math.min(12, 4 * this.dpr)));\n const pointCounts = this.drawBatches(scene.pointBatches, gl.POINTS, visibleBounds);\n visiblePrimitiveCount += pointCounts.visible;\n culledPrimitiveCount += pointCounts.culled;\n }\n\n this.renderOverlay(visibleBounds);\n const renderElapsedMs = performance.now() - started;\n this.stats = scene\n ? { ...scene.stats, renderElapsedMs, backend: 'webgl', primitiveCount: scene.primitiveCount, visiblePrimitiveCount, culledPrimitiveCount, gpuMemoryBytes: scene.gpuMemoryBytes, buildElapsedMs: scene.buildElapsedMs }\n : { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, renderElapsedMs, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n this.onStats?.(this.getStats());\n return this.getStats();\n }\n\n private drawBatches(batches: GpuBatch[], mode: GlMode, visibleBounds: CadBounds): { visible: number; culled: number } {\n const gl = this.gl;\n let visible = 0;\n let culled = 0;\n for (const batch of batches) {\n if (!boundsIntersects(batch.bounds, visibleBounds)) {\n culled += batch.primitiveCount;\n continue;\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, batch.positionBuffer);\n gl.enableVertexAttribArray(this.program.aPosition);\n gl.vertexAttribPointer(this.program.aPosition, 2, gl.FLOAT, false, 0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, batch.colorBuffer);\n gl.enableVertexAttribArray(this.program.aColor);\n gl.vertexAttribPointer(this.program.aColor, 4, gl.UNSIGNED_BYTE, true, 0, 0);\n gl.drawArrays(mode, 0, batch.vertexCount);\n visible += batch.primitiveCount;\n }\n return { visible, culled };\n }\n\n private scheduleRender(): void {\n if (this.rafHandle) return;\n this.rafHandle = window.requestAnimationFrame(() => {\n this.rafHandle = 0;\n this.renderNow();\n });\n }\n\n private cancelScheduledRender(): void {\n if (!this.rafHandle) return;\n window.cancelAnimationFrame(this.rafHandle);\n this.rafHandle = 0;\n }\n\n private renderOverlay(visibleBounds: CadBounds): void {\n const ctx = this.overlayCtx;\n const canvas = this.overlayCanvas;\n if (!ctx || !canvas) return;\n ctx.save();\n ctx.setTransform(this.dpr, 0, 0, this.dpr, 0, 0);\n ctx.clearRect(0, 0, this.cssWidth, this.cssHeight);\n if (this.opts.showPageBounds && this.document?.pages?.length) this.drawPageBoundsOverlay(ctx);\n if (this.scene) {\n this.drawImagesOverlay(ctx, this.scene.imageItems, visibleBounds);\n this.drawTextOverlay(ctx, this.scene.textItems, visibleBounds);\n }\n ctx.restore();\n }\n\n private drawPageBoundsOverlay(ctx: CanvasRenderingContext2D): void {\n if (!this.document?.pages?.length) return;\n ctx.save();\n ctx.strokeStyle = 'rgba(148, 163, 184, 0.34)';\n ctx.lineWidth = 1;\n ctx.setLineDash([8, 6]);\n for (const page of this.document.pages) {\n const a = this.worldToScreen({ x: 0, y: 0 });\n const b = this.worldToScreen({ x: page.width, y: page.height });\n ctx.strokeRect(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.abs(b.x - a.x), Math.abs(b.y - a.y));\n }\n ctx.restore();\n }\n\n private drawTextOverlay(ctx: CanvasRenderingContext2D, items: TextItem[], visibleBounds: CadBounds): void {\n const maxLabels = this.opts.maxVisibleTextLabels;\n let drawn = 0;\n for (const item of items) {\n if (drawn >= maxLabels) break;\n if (!boundsIntersects(item.bounds, visibleBounds)) continue;\n const pixelHeight = Math.abs(item.height) * this.view.scale;\n if (pixelHeight < this.opts.textMinPixelHeight) continue;\n const s = this.worldToScreen(item.point);\n if (s.x < -512 || s.y < -512 || s.x > this.cssWidth + 512 || s.y > this.cssHeight + 512) continue;\n ctx.save();\n ctx.translate(s.x, s.y);\n ctx.rotate(-item.rotation);\n ctx.scale((item.generationFlag & 2 ? -1 : 1) * item.xScale, item.generationFlag & 4 ? -1 : 1);\n const fontSize = Math.max(4, Math.min(256, pixelHeight));\n ctx.font = `${fontSize}px ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif`;\n ctx.fillStyle = item.color;\n ctx.globalAlpha = item.opacity;\n ctx.textAlign = item.halign === 1 || item.halign === 4 ? 'center' : item.halign === 2 ? 'right' : 'left';\n ctx.textBaseline = item.valign === 1 ? 'bottom' : item.valign === 2 ? 'middle' : item.valign === 3 ? 'top' : 'alphabetic';\n for (const [index, line] of item.text.split(/\\r?\\n/g).entries()) ctx.fillText(line, 0, index * fontSize * 1.22);\n ctx.restore();\n drawn++;\n }\n }\n\n private drawImagesOverlay(ctx: CanvasRenderingContext2D, items: ImageItem[], visibleBounds: CadBounds): void {\n for (const item of items) {\n if (!boundsIntersects(item.bounds, visibleBounds)) continue;\n const a = this.worldToScreen(item.point);\n const b = this.worldToScreen({ x: item.point.x + item.width, y: item.point.y - item.height });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.abs(b.x - a.x);\n const height = Math.abs(b.y - a.y);\n if (width < 1 || height < 1) continue;\n if (item.source) {\n const image = this.getImage(item.source);\n if (image.complete && image.naturalWidth > 0) {\n ctx.save();\n ctx.globalAlpha = item.opacity;\n ctx.drawImage(image, x, y, width, height);\n ctx.restore();\n continue;\n }\n image.onload = () => this.scheduleRender();\n }\n if (!this.opts.showImagePlaceholders) continue;\n ctx.save();\n ctx.strokeStyle = item.color;\n ctx.globalAlpha = item.opacity;\n ctx.lineWidth = 1;\n ctx.strokeRect(x, y, width, height);\n ctx.beginPath();\n ctx.moveTo(x, y); ctx.lineTo(x + width, y + height);\n ctx.moveTo(x + width, y); ctx.lineTo(x, y + height);\n ctx.stroke();\n ctx.restore();\n }\n }\n\n private getImage(src: string): HTMLImageElement {\n let image = this.imageCache.get(src);\n if (!image) {\n image = new Image();\n image.src = src;\n this.imageCache.set(src, image);\n }\n return image;\n }\n\n private createOverlayCanvas(): void {\n const parent = this.canvas.parentElement;\n if (!parent || typeof document === 'undefined') return;\n const style = window.getComputedStyle(parent);\n if (style.position === 'static') parent.style.position = 'relative';\n const overlay = document.createElement('canvas');\n overlay.className = 'cad-viewer-text-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n overlay.style.position = 'absolute';\n overlay.style.inset = '0';\n overlay.style.width = '100%';\n overlay.style.height = '100%';\n overlay.style.pointerEvents = 'none';\n overlay.style.zIndex = '1';\n const ctx = overlay.getContext('2d');\n if (!ctx) return;\n parent.appendChild(overlay);\n this.overlayCanvas = overlay;\n this.overlayCtx = ctx;\n }\n\n private resizeOverlay(width: number, height: number): void {\n if (!this.overlayCanvas) return;\n if (this.overlayCanvas.width !== width || this.overlayCanvas.height !== height) {\n this.overlayCanvas.width = width;\n this.overlayCanvas.height = height;\n }\n }\n\n private bindEvents(): void {\n const signal = this.eventController.signal;\n this.canvas.addEventListener('wheel', (ev) => {\n ev.preventDefault();\n const factor = ev.deltaY < 0 ? this.opts.wheelZoomFactor : 1 / this.opts.wheelZoomFactor;\n this.zoom(factor, { x: ev.offsetX, y: ev.offsetY });\n }, { passive: false, signal });\n\n this.canvas.addEventListener('pointerdown', (ev) => {\n this.canvas.setPointerCapture(ev.pointerId);\n this.isDragging = true;\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n this.canvas.classList.add('is-dragging');\n }, { signal });\n\n this.canvas.addEventListener('pointermove', (ev) => {\n if (!this.isDragging || !this.lastPointer) return;\n this.panByScreenDelta(ev.clientX - this.lastPointer.x, ev.clientY - this.lastPointer.y);\n this.lastPointer = { x: ev.clientX, y: ev.clientY };\n }, { signal });\n\n const stopDrag = (ev?: PointerEvent) => {\n if (ev && this.canvas.hasPointerCapture(ev.pointerId)) this.canvas.releasePointerCapture(ev.pointerId);\n this.isDragging = false;\n this.lastPointer = undefined;\n this.canvas.classList.remove('is-dragging');\n };\n this.canvas.addEventListener('pointerup', stopDrag, { signal });\n this.canvas.addEventListener('pointercancel', () => stopDrag(), { signal });\n this.canvas.addEventListener('webglcontextlost', (ev) => {\n ev.preventDefault();\n this.cancelScheduledRender();\n }, { signal });\n }\n\n private visibleWorldBounds(): CadBounds {\n const halfW = this.cssWidth / Math.max(this.view.scale, 1e-12) / 2;\n const halfH = this.cssHeight / Math.max(this.view.scale, 1e-12) / 2;\n return {\n minX: this.view.centerX - halfW,\n maxX: this.view.centerX + halfW,\n minY: this.view.centerY - halfH,\n maxY: this.view.centerY + halfH\n };\n }\n\n private get cssWidth(): number { return this.canvas.clientWidth || 1; }\n private get cssHeight(): number { return this.canvas.clientHeight || 1; }\n\n private clampScale(value: number): number {\n return Math.min(this.opts.maxScale, Math.max(this.opts.minScale, value));\n }\n\n private boundsOptions() {\n return { maxInsertDepth: this.opts.maxInsertDepth, maxCurveSegments: this.opts.maxCurveSegments };\n }\n\n private disposeScene(): void {\n if (!this.scene) return;\n const gl = this.gl;\n for (const batch of [...this.scene.lineBatches, ...this.scene.triangleBatches, ...this.scene.lineTypePointBatches, ...this.scene.pointBatches]) {\n gl.deleteBuffer(batch.positionBuffer);\n gl.deleteBuffer(batch.colorBuffer);\n }\n this.scene = undefined;\n }\n\n private emitViewChange(): void {\n this.onViewChange?.({\n view: this.getViewState(),\n fitScale: this.fitScale,\n zoomRatio: this.getZoomRatio(),\n zoomPercent: this.getZoomPercent(),\n bounds: this.getBounds()\n });\n }\n}\n\nexport function isWebGLAvailable(): boolean {\n if (typeof document === 'undefined') return false;\n const canvas = document.createElement('canvas');\n return Boolean(canvas.getContext('webgl2') ?? canvas.getContext('webgl') ?? canvas.getContext('experimental-webgl'));\n}\n\nfunction createWebGLContext(canvas: HTMLCanvasElement, options: CanvasViewerOptions): GL | undefined {\n const attributes: WebGLContextAttributes = {\n alpha: false,\n antialias: options.antialias ?? true,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: options.preserveDrawingBuffer ?? false,\n powerPreference: options.powerPreference ?? 'high-performance'\n };\n return (canvas.getContext('webgl2', attributes) as GL | null)\n ?? (canvas.getContext('webgl', attributes) as GL | null)\n ?? (canvas.getContext('experimental-webgl', attributes) as GL | null)\n ?? undefined;\n}\n\nfunction createProgramInfo(gl: GL): ProgramInfo {\n const vertexSource = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n uniform vec2 u_viewCenter;\n uniform float u_scale;\n uniform vec2 u_viewport;\n uniform float u_pointSize;\n varying vec4 v_color;\n void main() {\n vec2 screen = vec2(\n u_viewport.x * 0.5 + (a_position.x - u_viewCenter.x) * u_scale,\n u_viewport.y * 0.5 - (a_position.y - u_viewCenter.y) * u_scale\n );\n vec2 clip = vec2(screen.x / u_viewport.x * 2.0 - 1.0, 1.0 - screen.y / u_viewport.y * 2.0);\n gl_Position = vec4(clip, 0.0, 1.0);\n gl_PointSize = u_pointSize;\n v_color = a_color;\n }\n `;\n const fragmentSource = `\n precision mediump float;\n varying vec4 v_color;\n void main() {\n gl_FragColor = v_color;\n }\n `;\n const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);\n const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);\n const program = gl.createProgram();\n if (!program) throw new Error('Failed to create WebGL program.');\n gl.attachShader(program, vertex);\n gl.attachShader(program, fragment);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const message = gl.getProgramInfoLog(program) ?? 'Unknown WebGL program link error.';\n gl.deleteProgram(program);\n throw new Error(message);\n }\n gl.deleteShader(vertex);\n gl.deleteShader(fragment);\n const uViewCenter = gl.getUniformLocation(program, 'u_viewCenter');\n const uScale = gl.getUniformLocation(program, 'u_scale');\n const uViewport = gl.getUniformLocation(program, 'u_viewport');\n const uPointSize = gl.getUniformLocation(program, 'u_pointSize');\n if (!uViewCenter || !uScale || !uViewport || !uPointSize) throw new Error('Failed to resolve WebGL shader uniforms.');\n return {\n program,\n aPosition: gl.getAttribLocation(program, 'a_position'),\n aColor: gl.getAttribLocation(program, 'a_color'),\n uViewCenter,\n uScale,\n uViewport,\n uPointSize\n };\n}\n\nfunction compileShader(gl: GL, type: number, source: string): WebGLShader {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Failed to create WebGL shader.');\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const message = gl.getShaderInfoLog(shader) ?? 'Unknown WebGL shader compile error.';\n gl.deleteShader(shader);\n throw new Error(message);\n }\n return shader;\n}\n\nfunction uploadScene(gl: GL, cpu: CpuScene): GpuScene {\n let gpuMemoryBytes = 0;\n const upload = (items: CpuBatch[]): GpuBatch[] => items.map((item) => {\n const positionBuffer = createBuffer(gl, item.positions);\n const colorBuffer = createBuffer(gl, item.colors);\n const gpuBytes = item.positions.byteLength + item.colors.byteLength;\n gpuMemoryBytes += gpuBytes;\n return {\n positionBuffer,\n colorBuffer,\n vertexCount: item.positions.length / 2,\n primitiveCount: item.primitiveCount,\n bounds: item.bounds,\n gpuBytes\n };\n });\n const lineBatches = upload(cpu.lineBatches);\n const triangleBatches = upload(cpu.triangleBatches);\n const lineTypePointBatches = upload(cpu.lineTypePointBatches);\n const pointBatches = upload(cpu.pointBatches);\n return {\n origin: cpu.origin,\n lineBatches,\n triangleBatches,\n lineTypePointBatches,\n pointBatches,\n textItems: cpu.textItems,\n imageItems: cpu.imageItems,\n stats: cpu.stats,\n primitiveCount: cpu.primitiveCount,\n gpuMemoryBytes,\n buildElapsedMs: cpu.buildElapsedMs\n };\n}\n\nfunction createBuffer(gl: GL, data: Float32Array | Uint8Array): WebGLBuffer {\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error('Failed to create WebGL buffer.');\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data as unknown as BufferSource, gl.STATIC_DRAW);\n return buffer;\n}\n\nfunction buildCpuScene(document: CadDocument, opts: Required<CanvasViewerOptions>, bounds: CadBounds): CpuScene {\n const started = performance.now();\n const origin = boundsValid(bounds)\n ? { x: (bounds.minX + bounds.maxX) / 2, y: (bounds.minY + bounds.maxY) / 2 }\n : { x: 0, y: 0 };\n const builder = new CpuSceneBuilder(document, opts, bounds, origin);\n for (const entity of document.entities) builder.addEntityTracked(entity, 0);\n const scene = builder.finalize();\n scene.buildElapsedMs = performance.now() - started;\n return scene;\n}\n\nclass CpuSceneBuilder {\n private readonly lineBuckets = new Map<string, MutableBatch>();\n private readonly triangleBuckets = new Map<string, MutableBatch>();\n private readonly lineTypePointBuckets = new Map<string, MutableBatch>();\n private readonly pointBuckets = new Map<string, MutableBatch>();\n private readonly textItems: TextItem[] = [];\n private readonly imageItems: ImageItem[] = [];\n private readonly stats: Omit<RenderStats, 'renderElapsedMs'> = { total: 0, drawn: 0, skipped: 0, byType: {}, unsupported: {}, backend: 'webgl', primitiveCount: 0, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: 0, buildElapsedMs: 0 };\n private readonly tileSize: number;\n private readonly maxVerticesPerBatch: number;\n private primitiveCount = 0;\n\n constructor(private readonly document: CadDocument, private readonly opts: Required<CanvasViewerOptions>, private readonly bounds: CadBounds, private readonly origin: CadPoint2D) {\n const width = boundsValid(bounds) ? Math.max(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY, 1e-9) : 1;\n this.tileSize = opts.enableSpatialIndex ? width / Math.max(8, opts.spatialIndexCellCount) : Number.POSITIVE_INFINITY;\n this.maxVerticesPerBatch = Math.max(4096, Math.floor(opts.maxVerticesPerBatch));\n }\n\n addEntityTracked(entity: CadEntity, depth: number): void {\n this.stats.total++;\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n this.stats.byType[type] = (this.stats.byType[type] ?? 0) + 1;\n const layer = this.lookupLayer(entity.layer);\n if (entity.isVisible === false || !layerVisible(layer)) {\n this.stats.skipped++;\n return;\n }\n this.addEntity(entity, type, depth);\n }\n\n finalize(): CpuScene {\n const lineBatches = finalizeMutableBatches(this.lineBuckets, this.maxVerticesPerBatch);\n const triangleBatches = finalizeMutableBatches(this.triangleBuckets, this.maxVerticesPerBatch);\n const lineTypePointBatches = finalizeMutableBatches(this.lineTypePointBuckets, this.maxVerticesPerBatch);\n const pointBatches = finalizeMutableBatches(this.pointBuckets, this.maxVerticesPerBatch);\n this.stats.primitiveCount = this.primitiveCount;\n return {\n origin: this.origin,\n lineBatches,\n triangleBatches,\n lineTypePointBatches,\n pointBatches,\n textItems: this.textItems,\n imageItems: this.imageItems,\n stats: this.stats,\n primitiveCount: this.primitiveCount,\n buildElapsedMs: 0\n };\n }\n\n private addEntity(entity: CadEntity, type: string, depth: number): void {\n const kind = entity.kind ?? inferEntityKind(type);\n switch (kind) {\n case 'line': return this.addLineEntity(entity);\n case 'circle': return this.addCircleEntity(entity);\n case 'arc': return this.addArcEntity(entity);\n case 'polyline': return this.addPolylineEntity(entity);\n case 'ellipse': return this.addEllipseEntity(entity);\n case 'text': return this.addTextEntity(entity);\n case 'point': return this.addPointEntity(entity);\n case 'insert': return this.addInsertEntity(entity, depth);\n case 'solid': return this.addSolidEntity(entity);\n case 'hatch': return this.addHatchEntity(entity);\n case 'spline': return this.addSplineEntity(entity);\n case 'path': return this.addPathEntity(entity);\n case 'image': return this.addImageEntity(entity);\n case 'viewport': return this.markSkipped(type);\n default:\n this.stats.unsupported[type] = (this.stats.unsupported[type] ?? 0) + 1;\n this.stats.skipped++;\n if (this.opts.showUnsupportedMarkers) this.addUnsupportedMarker(entity);\n }\n }\n\n private addLineEntity(e: CadEntity): void {\n if (!isFinitePoint(e.startPoint) || !isFinitePoint(e.endPoint)) return this.markSkipped('LINE');\n this.addPolyline([e.startPoint, e.endPoint], false, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addCircleEntity(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n if (!isFinitePoint(center) || !Number.isFinite(radius)) return this.markSkipped('CIRCLE');\n const segments = Math.max(16, Math.min(this.opts.maxCurveSegments, Math.ceil(Math.sqrt(Math.abs(radius)) * 12)));\n const pts = arcPoints(center, radius, 0, Math.PI * 2, true, segments);\n this.addPolyline(pts, true, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addArcEntity(e: CadEntity): void {\n const center = e.center;\n const radius = Number(e.radius);\n const startAngle = Number(e.startAngle);\n const endAngle = Number(e.endAngle);\n if (!isFinitePoint(center) || !Number.isFinite(radius) || !Number.isFinite(startAngle) || !Number.isFinite(endAngle)) return this.markSkipped('ARC');\n this.addPolyline(arcPoints(center, radius, startAngle, endAngle, true, this.opts.maxCurveSegments), false, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addPolylineEntity(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as Array<CadPoint3D & { bulge?: number }> | undefined;\n if (!Array.isArray(vertices) || vertices.length < 2) return this.markSkipped(String(e.type));\n const closed = isCadPolylineClosed(e);\n const pts: CadPoint2D[] = [];\n const pairs = closed ? vertices.length : vertices.length - 1;\n for (let i = 0; i < pairs; i++) {\n const p1 = vertices[i];\n const p2 = vertices[(i + 1) % vertices.length];\n if (!isFinitePoint(p1) || !isFinitePoint(p2)) continue;\n const segment = bulgeToPolylinePoints(p1, p2, Number(p1.bulge ?? 0), Math.max(4, Math.min(24, this.opts.maxCurveSegments / 4)));\n if (pts.length > 0) segment.shift();\n pts.push(...segment);\n }\n if (pts.length < 2) return this.markSkipped(String(e.type));\n this.addPolyline(pts, closed, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addEllipseEntity(e: CadEntity): void {\n if (!isFinitePoint(e.center) || !isFinitePoint(e.majorAxisEndPoint)) return this.markSkipped('ELLIPSE');\n const pts = ellipsePoints(e.center, e.majorAxisEndPoint, Number(e.axisRatio ?? 1), Number(e.startAngle ?? 0), Number(e.endAngle ?? Math.PI * 2), this.opts.maxCurveSegments);\n const closed = Math.abs(Number(e.endAngle ?? Math.PI * 2) - Number(e.startAngle ?? 0)) >= Math.PI * 2 - 1e-6;\n this.addPolyline(pts, closed, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addTextEntity(e: CadEntity): void {\n const halign = Number(e.halign ?? 0);\n const valign = Number(e.valign ?? 0);\n const aligned = (halign !== 0 || valign !== 0) && isFinitePoint(e.endPoint);\n const p = (aligned ? e.endPoint : e.insertionPoint ?? e.startPoint ?? e.center) as CadPoint3D | undefined;\n const text = stripMTextFormatting(String(e.text ?? e.value ?? ''));\n const height = Number(e.textHeight ?? e.height ?? 1);\n if (!isFinitePoint(p) || !text || !Number.isFinite(height)) return this.markSkipped(String(e.type));\n const point = xy(p);\n const xScale = Number(e.xScale ?? 1);\n const safeXScale = Number.isFinite(xScale) && Math.abs(xScale) > 1e-9 ? Math.abs(xScale) : 1;\n const approxWidth = Math.max(1, text.split(/\\r?\\n/g).reduce((max, line) => Math.max(max, line.length), 0)) * Math.abs(height) * 0.62 * safeXScale;\n const approxHeight = Math.max(1, text.split(/\\r?\\n/g).length) * Math.abs(height) * 1.22;\n this.textItems.push({\n point,\n text,\n height,\n rotation: Number(e.rotation ?? 0),\n xScale: safeXScale,\n generationFlag: Number(e.generationFlag ?? 0),\n halign,\n valign,\n color: resolveCadColor(e, this.document, this.colorOptions()),\n opacity: clamp(Number(e.opacity ?? 1), 0, 1),\n bounds: { minX: point.x - approxWidth, minY: point.y - approxHeight, maxX: point.x + approxWidth, maxY: point.y + approxHeight }\n });\n this.stats.drawn++;\n }\n\n private addPointEntity(e: CadEntity): void {\n const p = (e.point ?? e.location ?? e.center ?? e.insertionPoint) as CadPoint3D | undefined;\n if (!isFinitePoint(p)) return this.markSkipped('POINT');\n this.addPoint(p, this.strokeBytes(e));\n this.stats.drawn++;\n }\n\n private addInsertEntity(e: CadEntity, depth: number): void {\n const block = this.lookupBlock(e.blockName ?? e.name);\n if (block && depth < this.opts.maxInsertDepth) {\n const matrix = matrixFromInsert(e, block.basePoint ?? { x: 0, y: 0 });\n for (const child of block.entities) {\n const inheritedColor = applyByBlockColorInheritance(child, e, this.document, this.colorOptions());\n const inherited = applyByBlockLineTypeInheritance(inheritedColor, e, this.document);\n this.addEntityTracked(transformEntity(inherited, matrix), depth + 1);\n }\n return;\n }\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped('INSERT');\n this.addPoint(p, this.strokeBytes(e));\n if (Array.isArray(e.attribs)) for (const attr of e.attribs) this.addTextEntity(attr);\n this.stats.drawn++;\n }\n\n private addSolidEntity(e: CadEntity): void {\n const vertices = (e.vertices ?? e.points) as CadPoint3D[] | undefined;\n if (!Array.isArray(vertices) || vertices.length < 3) return this.markSkipped(String(e.type));\n const points = vertices.filter(isFinitePoint).map(xy);\n if (points.length < 3) return this.markSkipped(String(e.type));\n const fill = this.fillBytes(e) ?? this.strokeBytes(e);\n this.addTriangleFan(points, fill);\n this.addPolyline(points, true, this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addHatchEntity(e: CadEntity): void {\n const loops = e.loops;\n if (!Array.isArray(loops) || loops.length === 0) return this.markSkipped('HATCH');\n const stroke = this.strokeBytes(e);\n const fill = this.fillBytes(e);\n let added = false;\n for (const loop of loops) {\n const points = loop.commands?.length ? flattenPathCommands(loop.commands, this.opts.maxCurveSegments) : (loop.vertices ?? []).filter(isFinitePoint).map(xy);\n if (points.length < 2) continue;\n this.addPolyline(points, true, stroke, e);\n if (fill && points.length >= 3) this.addTriangleFan(points, fill);\n added = true;\n }\n if (!added) return this.markSkipped('HATCH');\n this.stats.drawn++;\n }\n\n private addSplineEntity(e: CadEntity): void {\n const points = e.fitPoints?.length ? e.fitPoints : e.controlPoints;\n if (!points || points.length < 2) return this.markSkipped('SPLINE');\n this.addPolyline(points.filter(isFinitePoint).map(xy), Boolean(e.isClosed), this.strokeBytes(e), e);\n this.stats.drawn++;\n }\n\n private addPathEntity(e: CadEntity): void {\n if (!e.commands?.length) return this.markSkipped(String(e.type));\n const points = flattenPathCommands(e.commands, this.opts.maxCurveSegments);\n if (points.length < 2) return this.markSkipped(String(e.type));\n this.addPolyline(points, false, this.strokeBytes(e), e);\n const fill = this.fillBytes(e);\n if (fill && points.length >= 3) this.addTriangleFan(points, fill);\n this.stats.drawn++;\n }\n\n private addImageEntity(e: CadEntity): void {\n const p = e.insertionPoint;\n if (!isFinitePoint(p)) return this.markSkipped(String(e.type));\n const width = Number(e.width ?? 32);\n const height = Number(e.height ?? 32);\n if (!Number.isFinite(width) || !Number.isFinite(height)) return this.markSkipped(String(e.type));\n const point = xy(p);\n const bounds = boundsFromPoints([point, { x: point.x + width, y: point.y - height }]);\n this.imageItems.push({ point, width, height, source: e.imageDataUrl ?? e.imageSource, color: resolveCadColor(e, this.document, this.colorOptions()), opacity: clamp(Number(e.opacity ?? 1), 0, 1), bounds });\n this.stats.drawn++;\n }\n\n private addUnsupportedMarker(e: CadEntity): void {\n const p = entityAnchor(e);\n if (!p) return;\n this.addPoint(p, this.strokeBytes(e));\n }\n\n private addPolyline(points: CadPoint2D[], closed: boolean, color: RgbaBytes, entity?: CadEntity): void {\n const valid = points.filter(isFinitePoint).map(xy);\n if (valid.length < 2) return;\n if (closed && pointsEqual(valid[0], valid[valid.length - 1])) valid.pop();\n if (valid.length < 2) return;\n const worldWidth = entity ? cadEntityWorldStrokeWidth(entity) : 0;\n const pattern = entity ? resolveCadLinePattern(entity, this.document) : undefined;\n if (pattern) {\n const primitives = createDashedCadPrimitives(valid, closed, pattern);\n const fallbackDots = [...primitives.dots];\n for (const [start, end] of primitives.segments) {\n this.addSegment(start, end, color);\n if (worldWidth > 1e-9) this.addWideSegment(start, end, worldWidth, color, true);\n }\n for (const marker of primitives.markers ?? []) {\n const glyph = this.resolveLineTypeGlyph(marker);\n if (!glyph) continue;\n removeMatchingPoint(fallbackDots, marker.fallbackPoint);\n let added = false;\n for (const polyline of transformCadLineTypeGlyph(marker, glyph)) {\n for (let index = 0; index < polyline.length - 1; index++) {\n this.addSegment(polyline[index], polyline[index + 1], color);\n added = true;\n }\n }\n if (!added) fallbackDots.push(marker.point);\n }\n for (const point of fallbackDots) this.addLineTypePoint(point, color);\n return;\n }\n for (let i = 0; i < valid.length - 1; i++) this.addSegment(valid[i], valid[i + 1], color);\n if (closed) this.addSegment(valid[valid.length - 1], valid[0], color);\n if (worldWidth > 1e-9) this.addWidePolyline(valid, closed, worldWidth, color);\n }\n\n private addWidePolyline(points: CadPoint2D[], closed: boolean, width: number, color: RgbaBytes): void {\n for (let index = 0; index < points.length - 1; index++) this.addWideSegment(points[index], points[index + 1], width, color, false);\n if (closed) this.addWideSegment(points[points.length - 1], points[0], width, color, false);\n for (const point of points) this.addWideDisc(point, width / 2, color);\n }\n\n private addWideSegment(a: CadPoint2D, b: CadPoint2D, width: number, color: RgbaBytes, roundCaps: boolean): void {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const length = Math.hypot(dx, dy);\n if (!Number.isFinite(length) || length <= 1e-14) return;\n const half = Math.abs(width) / 2;\n const nx = -dy / length * half;\n const ny = dx / length * half;\n this.addTriangleFan([\n { x: a.x + nx, y: a.y + ny },\n { x: b.x + nx, y: b.y + ny },\n { x: b.x - nx, y: b.y - ny },\n { x: a.x - nx, y: a.y - ny }\n ], color);\n if (roundCaps) {\n this.addWideDisc(a, half, color);\n this.addWideDisc(b, half, color);\n }\n }\n\n private addWideDisc(center: CadPoint2D, radius: number, color: RgbaBytes): void {\n if (!Number.isFinite(radius) || radius <= 1e-9) return;\n const ring: CadPoint2D[] = [];\n const segments = 8;\n for (let index = 0; index < segments; index++) {\n const angle = index / segments * Math.PI * 2;\n ring.push({ x: center.x + Math.cos(angle) * radius, y: center.y + Math.sin(angle) * radius });\n }\n this.addTriangleFan([center, ...ring, ring[0]], color);\n }\n\n private addSegment(a: CadPoint2D, b: CadPoint2D, color: RgbaBytes): void {\n if (!isFinitePoint(a) || !isFinitePoint(b)) return;\n if (Math.hypot(a.x - b.x, a.y - b.y) <= 1e-14) return;\n const bucket = this.batchFor(this.lineBuckets, boundsFromPoints([a, b]));\n pushVertex(bucket, a, color, this.origin);\n pushVertex(bucket, b, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private addPoint(p: CadPoint2D, color: RgbaBytes): void {\n const bucket = this.batchFor(this.pointBuckets, pointBounds(p));\n pushVertex(bucket, p, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private addLineTypePoint(p: CadPoint2D, color: RgbaBytes): void {\n const bucket = this.batchFor(this.lineTypePointBuckets, pointBounds(p));\n pushVertex(bucket, p, color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n\n private resolveLineTypeGlyph(marker: CadLineTypeMarker): CadShxGlyph | undefined {\n return marker.kind === 'shape'\n ? this.opts.shxGlyphResolver.resolveShape(Number(marker.shapeNumber), marker.fontName)\n : this.opts.shxGlyphResolver.resolveText(String(marker.text ?? ''), marker.fontName);\n }\n\n private addTriangleFan(points: CadPoint2D[], color: RgbaBytes): void {\n const valid = points.filter(isFinitePoint).map(xy);\n if (valid.length < 3) return;\n const bounds = boundsFromPoints(valid);\n const bucket = this.batchFor(this.triangleBuckets, bounds);\n for (let i = 1; i < valid.length - 1; i++) {\n pushVertex(bucket, valid[0], color, this.origin);\n pushVertex(bucket, valid[i], color, this.origin);\n pushVertex(bucket, valid[i + 1], color, this.origin);\n bucket.primitiveCount++;\n this.primitiveCount++;\n }\n }\n\n private batchFor(buckets: Map<string, MutableBatch>, bounds: CadBounds): MutableBatch {\n const key = this.bucketKey(bounds);\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = createMutableBatch();\n buckets.set(key, bucket);\n }\n includePoint(bucket.bounds, { x: bounds.minX, y: bounds.minY });\n includePoint(bucket.bounds, { x: bounds.maxX, y: bounds.maxY });\n return bucket;\n }\n\n private bucketKey(bounds: CadBounds): string {\n if (!Number.isFinite(this.tileSize)) return 'all';\n const cx = (bounds.minX + bounds.maxX) / 2;\n const cy = (bounds.minY + bounds.maxY) / 2;\n const ix = Math.floor((cx - this.bounds.minX) / this.tileSize);\n const iy = Math.floor((cy - this.bounds.minY) / this.tileSize);\n return `${ix}:${iy}`;\n }\n\n private strokeBytes(e: CadEntity): RgbaBytes {\n return cssToRgbaBytes(resolveCadColor(e, this.document, this.colorOptions()), [255, 255, 255, 255], clamp(Number(e.opacity ?? 1), 0, 1));\n }\n\n private fillBytes(e: CadEntity): RgbaBytes | undefined {\n const color = resolveFillColor(e, this.document, this.colorOptions());\n return color ? cssToRgbaBytes(color, [255, 255, 255, 255], clamp(Number(e.opacity ?? 1), 0, 1)) : undefined;\n }\n\n private colorOptions() {\n return { foreground: this.opts.foreground, background: this.opts.background, trueColorByteOrder: this.opts.trueColorByteOrder, contrastMode: this.opts.contrastMode, minColorContrast: this.opts.minColorContrast };\n }\n\n private markSkipped(type: string): void {\n this.stats.skipped++;\n this.stats.unsupported[type] = this.stats.unsupported[type] ?? 0;\n }\n\n private lookupLayer(name: string | undefined) {\n if (!name) return undefined;\n return this.document.layers[name] ?? this.document.layers[name.toLowerCase()] ?? Object.values(this.document.layers).find((layer) => layer.name.toLowerCase() === name.toLowerCase());\n }\n\n private lookupBlock(name: string | undefined): CadBlock | undefined {\n if (!name) return undefined;\n return this.document.blocks[name] ?? this.document.blocks[name.toLowerCase()] ?? Object.values(this.document.blocks).find((block) => block.name.toLowerCase() === name.toLowerCase());\n }\n}\n\ninterface MutableBatch {\n positions: number[];\n colors: number[];\n bounds: CadBounds;\n primitiveCount: number;\n}\n\nfunction createMutableBatch(): MutableBatch {\n return { positions: [], colors: [], bounds: emptyBounds(), primitiveCount: 0 };\n}\n\nfunction pushVertex(batch: MutableBatch, point: CadPoint2D, color: RgbaBytes, origin: CadPoint2D): void {\n batch.positions.push(point.x - origin.x, point.y - origin.y);\n batch.colors.push(color[0], color[1], color[2], color[3]);\n}\n\nfunction finalizeMutableBatches(map: Map<string, MutableBatch>, maxVerticesPerBatch: number): CpuBatch[] {\n const out: CpuBatch[] = [];\n for (const batch of map.values()) {\n const vertexCount = batch.positions.length / 2;\n if (vertexCount <= 0 || !boundsValid(batch.bounds)) continue;\n if (vertexCount <= maxVerticesPerBatch) {\n out.push({ positions: new Float32Array(batch.positions), colors: new Uint8Array(batch.colors), bounds: { ...batch.bounds }, primitiveCount: batch.primitiveCount });\n continue;\n }\n const primitiveSize = inferPrimitiveSize(batch);\n const verticesPerChunk = Math.max(primitiveSize, Math.floor(maxVerticesPerBatch / primitiveSize) * primitiveSize);\n for (let startVertex = 0; startVertex < vertexCount; startVertex += verticesPerChunk) {\n const endVertex = Math.min(vertexCount, startVertex + verticesPerChunk);\n const p = batch.positions.slice(startVertex * 2, endVertex * 2);\n const c = batch.colors.slice(startVertex * 4, endVertex * 4);\n const bounds = emptyBounds();\n for (let i = 0; i < p.length; i += 2) includePoint(bounds, { x: p[i], y: p[i + 1] });\n // Chunk bounds are local here; widen to parent batch bounds to avoid culling errors for split primitives.\n out.push({ positions: new Float32Array(p), colors: new Uint8Array(c), bounds: { ...batch.bounds }, primitiveCount: Math.floor((endVertex - startVertex) / primitiveSize) });\n }\n }\n return out;\n}\n\nfunction inferPrimitiveSize(batch: MutableBatch): 1 | 2 | 3 {\n const vertices = batch.positions.length / 2;\n if (vertices === batch.primitiveCount) return 1;\n if (vertices === batch.primitiveCount * 3) return 3;\n return 2;\n}\n\nfunction flattenPathCommands(commands: CadPathCommand[], segments: number): CadPoint2D[] {\n const points: CadPoint2D[] = [];\n let current: CadPoint2D | undefined;\n let start: CadPoint2D | undefined;\n const push = (point: CadPoint2D) => {\n if (!points.length || Math.hypot(points[points.length - 1].x - point.x, points[points.length - 1].y - point.y) > 1e-12) points.push(xy(point));\n current = xy(point);\n };\n for (const command of commands) {\n if (command.cmd === 'M') {\n current = xy(command.points[0]);\n start = current;\n push(current);\n } else if (command.cmd === 'L') {\n push(command.points[0]);\n } else if (command.cmd === 'Q' && current && command.points.length >= 2) {\n const p0 = current;\n const [c, end] = command.points;\n const n = Math.max(4, Math.min(segments, 24));\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const mt = 1 - t;\n push({ x: mt * mt * p0.x + 2 * mt * t * c.x + t * t * end.x, y: mt * mt * p0.y + 2 * mt * t * c.y + t * t * end.y });\n }\n } else if (command.cmd === 'C' && current && command.points.length >= 3) {\n const p0 = current;\n const [c1, c2, end] = command.points;\n const n = Math.max(6, Math.min(segments, 32));\n for (let i = 1; i <= n; i++) {\n const t = i / n;\n const mt = 1 - t;\n push({\n x: mt ** 3 * p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t ** 3 * end.x,\n y: mt ** 3 * p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t ** 3 * end.y\n });\n }\n } else if (command.cmd === 'Z' && start) {\n push(start);\n }\n }\n return points;\n}\n\nfunction entityAnchor(e: CadEntity): CadPoint2D | undefined {\n for (const key of ['startPoint', 'insertionPoint', 'center', 'point', 'location']) {\n const p = e[key];\n if (isFinitePoint(p)) return xy(p);\n }\n if (Array.isArray(e.vertices) && isFinitePoint(e.vertices[0])) return xy(e.vertices[0]);\n if (Array.isArray(e.commands) && e.commands.length) {\n const cmd = e.commands.find((item) => item.points.length > 0);\n if (cmd) return xy(cmd.points[0]);\n }\n return undefined;\n}\n\nfunction boundsFromPoints(points: CadPoint2D[]): CadBounds {\n const bounds = emptyBounds();\n for (const point of points) includePoint(bounds, point);\n return bounds;\n}\n\nfunction pointsEqual(a: CadPoint2D, b: CadPoint2D): boolean {\n const extent = Math.max(1, Math.abs(a.x), Math.abs(a.y), Math.abs(b.x), Math.abs(b.y));\n return Math.hypot(a.x - b.x, a.y - b.y) <= Math.max(1e-9, extent * 1e-12);\n}\n\nfunction removeMatchingPoint(points: CadPoint2D[], target: CadPoint2D): void {\n const index = points.findIndex((point) => pointsEqual(point, target));\n if (index >= 0) points.splice(index, 1);\n}\n\nfunction pointBounds(point: CadPoint2D): CadBounds {\n return { minX: point.x, minY: point.y, maxX: point.x, maxY: point.y };\n}\n\nfunction boundsIntersects(a: CadBounds, b: CadBounds): boolean {\n return a.minX <= b.maxX && a.maxX >= b.minX && a.minY <= b.maxY && a.maxY >= b.minY;\n}\n\nfunction requiresSceneRebuild(current: Required<CanvasViewerOptions>, next: CanvasViewerOptions): boolean {\n return next.trueColorByteOrder !== undefined && next.trueColorByteOrder !== current.trueColorByteOrder\n || next.contrastMode !== undefined && next.contrastMode !== current.contrastMode\n || next.minColorContrast !== undefined && next.minColorContrast !== current.minColorContrast\n || next.foreground !== undefined && next.foreground !== current.foreground\n || next.background !== undefined && next.background !== current.background\n || next.maxInsertDepth !== undefined && next.maxInsertDepth !== current.maxInsertDepth\n || next.maxCurveSegments !== undefined && next.maxCurveSegments !== current.maxCurveSegments\n || next.spatialIndexCellCount !== undefined && next.spatialIndexCellCount !== current.spatialIndexCellCount\n || next.maxVerticesPerBatch !== undefined && next.maxVerticesPerBatch !== current.maxVerticesPerBatch\n || next.enableSpatialIndex !== undefined && next.enableSpatialIndex !== current.enableSpatialIndex\n || next.shxGlyphResolver !== undefined && next.shxGlyphResolver !== current.shxGlyphResolver;\n}\n\nfunction createStatsFromScene(scene: GpuScene, renderElapsedMs: number): RenderStats {\n return { ...scene.stats, renderElapsedMs, backend: 'webgl', primitiveCount: scene.primitiveCount, visiblePrimitiveCount: 0, culledPrimitiveCount: 0, gpuMemoryBytes: scene.gpuMemoryBytes, buildElapsedMs: scene.buildElapsedMs };\n}\n\nfunction cloneStats(stats: RenderStats): RenderStats {\n return {\n total: stats.total,\n drawn: stats.drawn,\n skipped: stats.skipped,\n byType: { ...stats.byType },\n unsupported: { ...stats.unsupported },\n renderElapsedMs: stats.renderElapsedMs,\n backend: stats.backend,\n primitiveCount: stats.primitiveCount,\n visiblePrimitiveCount: stats.visiblePrimitiveCount,\n culledPrimitiveCount: stats.culledPrimitiveCount,\n gpuMemoryBytes: stats.gpuMemoryBytes,\n buildElapsedMs: stats.buildElapsedMs\n };\n}\n\nfunction cssToRgbaBytes(value: string, fallback: RgbaBytes, opacity = 1): RgbaBytes {\n const text = value.trim().toLowerCase();\n let rgba: RgbaBytes | undefined;\n if (/^#[0-9a-f]{3}$/i.test(text)) {\n rgba = [parseInt(text[1] + text[1], 16), parseInt(text[2] + text[2], 16), parseInt(text[3] + text[3], 16), 255];\n } else if (/^#[0-9a-f]{6}$/i.test(text)) {\n rgba = [parseInt(text.slice(1, 3), 16), parseInt(text.slice(3, 5), 16), parseInt(text.slice(5, 7), 16), 255];\n } else {\n const match = text.match(/^rgba?\\(([^)]+)\\)$/i);\n if (match) {\n const raw = match[1].split(/[\\s,\\/]+/).filter(Boolean);\n const percent = raw.slice(0, 3).some((part) => part.includes('%'));\n const nums = raw.map((part) => Number(part.replace('%', '')));\n if (nums.length >= 3 && nums.slice(0, 3).every(Number.isFinite)) {\n rgba = [clampByte(percent ? nums[0] * 2.55 : nums[0]), clampByte(percent ? nums[1] * 2.55 : nums[1]), clampByte(percent ? nums[2] * 2.55 : nums[2]), clampByte((Number.isFinite(nums[3]) ? nums[3] : 1) * 255)];\n }\n }\n }\n const out = rgba ?? fallback;\n return [out[0], out[1], out[2], clampByte(out[3] * opacity)];\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n","import { createDefaultLoaderRegistry } from '../loaders';\nimport type { CadLoaderRegistry } from '../loaders/CadLoaderRegistry';\nimport { summarizeCadDocument } from '../core/entity';\nimport { CadShxFontRegistry, synchronizeCadDocumentReferences, type CadShxGlyphResolver } from '../core/shx';\nimport { isCadNativeRenderableLoader, type CadDocument, type CadFitMode, type CadLoadInput, type CadLoadedReference, type CadLoadOptions, type CadLoadProgress, type CadLoadResult, type CadLoader, type CadMissingReference, type CadNativeRenderableLoader, type CadReferenceInput, type CadReferenceState } from '../core/types';\nimport { CadCanvasRenderer, type CanvasViewerOptions, type RenderStats, type ViewChangeEvent } from './CadCanvasRenderer';\nimport { CadWebGLRenderer, isWebGLAvailable } from './CadWebGLRenderer';\n\nexport type CadViewerRendererBackend = 'auto' | 'webgl' | 'canvas2d';\nexport type CadRenderer = CadCanvasRenderer | CadWebGLRenderer;\n\nexport interface CadViewerOptions extends CadLoadOptions {\n container?: HTMLElement;\n canvas?: HTMLCanvasElement;\n /** Optional DOM host used by native format viewers such as dwf-viewer. */\n nativeHost?: HTMLElement;\n /** Rendering backend for normalized DWG/DXF scenes. `auto` uses WebGL when available and falls back to Canvas2D. */\n renderer?: CadViewerRendererBackend;\n canvasOptions?: CanvasViewerOptions;\n loaders?: CadLoader[];\n registry?: CadLoaderRegistry;\n autoFit?: boolean;\n onLoadStart?: (source: File | ArrayBuffer | Uint8Array | CadLoadInput) => void;\n onLoadProgress?: (progress: CadLoadProgress) => void;\n onLoad?: (result: CadViewerLoadResult) => void;\n onError?: (error: Error) => void;\n onRenderStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n onReferenceStateChange?: (state: CadReferenceState) => void;\n}\n\nexport interface CadViewerLoadResult extends CadLoadResult {\n summary: ReturnType<typeof summarizeCadDocument>;\n fileName?: string;\n}\n\nexport class CadViewer {\n readonly canvas: HTMLCanvasElement;\n readonly renderer: CadRenderer;\n readonly registry: CadLoaderRegistry;\n readonly nativeHost?: HTMLElement;\n private readonly options: Required<Pick<CadViewerOptions, 'autoFit'>> & CadViewerOptions;\n private readonly referenceRegistry = new CadShxFontRegistry();\n private readonly shxGlyphResolver: CadShxGlyphResolver;\n private externalShxGlyphResolver?: CadShxGlyphResolver;\n private lastResult?: CadViewerLoadResult;\n private activeNativeLoader?: CadNativeRenderableLoader;\n\n constructor(options: CadViewerOptions = {}) {\n this.options = { autoFit: true, ...options };\n this.externalShxGlyphResolver = options.canvasOptions?.shxGlyphResolver;\n this.shxGlyphResolver = {\n resolveShape: (shapeNumber, fontName) => this.referenceRegistry.resolveShape(shapeNumber, fontName)\n ?? this.externalShxGlyphResolver?.resolveShape(shapeNumber, fontName),\n resolveText: (value, fontName) => this.referenceRegistry.resolveText(value, fontName)\n ?? this.externalShxGlyphResolver?.resolveText(value, fontName)\n };\n this.registry = options.registry ?? createDefaultLoaderRegistry(options);\n if (options.loaders) for (const loader of options.loaders) this.registry.register(loader);\n\n this.canvas = options.canvas ?? document.createElement('canvas');\n this.canvas.classList.add('cad-viewer-canvas');\n\n if (options.container) {\n options.container.classList.add('cad-viewer-container');\n if (!options.canvas) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.display = 'block';\n options.container.appendChild(this.canvas);\n }\n this.nativeHost = options.nativeHost ?? document.createElement('div');\n this.nativeHost.classList.add('cad-viewer-native-host');\n if (!options.nativeHost) options.container.appendChild(this.nativeHost);\n } else if (options.nativeHost) {\n this.nativeHost = options.nativeHost;\n this.nativeHost.classList.add('cad-viewer-native-host');\n } else if (options.canvas?.parentElement) {\n options.canvas.parentElement.classList.add('cad-viewer-container');\n const host = document.createElement('div');\n host.classList.add('cad-viewer-native-host');\n options.canvas.parentElement.appendChild(host);\n this.nativeHost = host;\n }\n\n this.renderer = createRenderer(options.renderer ?? 'auto', this.canvas, {\n ...options.canvasOptions,\n shxGlyphResolver: this.shxGlyphResolver\n });\n this.renderer.onStats = (stats) => this.options.onRenderStats?.(stats);\n this.renderer.onViewChange = (event) => this.options.onViewChange?.(event);\n }\n\n registerLoader(loader: CadLoader): this {\n this.registry.register(loader);\n return this;\n }\n\n async loadFile(file: File, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(file);\n return this.loadThroughRegistry({ file, fileName: file.name }, options, file.name);\n }\n\n async loadBuffer(buffer: ArrayBuffer | Uint8Array, fileName?: string, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(buffer);\n return this.loadThroughRegistry({ buffer, fileName }, options, fileName);\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(input);\n return this.loadThroughRegistry(input, options, input.fileName ?? input.file?.name);\n }\n\n async addReference(input: CadReferenceInput): Promise<CadLoadedReference> {\n try {\n const loaded = await this.referenceRegistry.add(input);\n this.refreshCurrentReferences();\n return loaded;\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n async addReferenceFile(file: File): Promise<CadLoadedReference> {\n return this.addReference({ file, fileName: file.name });\n }\n\n async addReferenceBuffer(buffer: ArrayBuffer | Uint8Array, fileName: string): Promise<CadLoadedReference> {\n return this.addReference({ buffer, fileName });\n }\n\n removeReference(fileName: string): boolean {\n const removed = this.referenceRegistry.remove(fileName);\n if (removed) this.refreshCurrentReferences();\n return removed;\n }\n\n clearReferences(): void {\n this.referenceRegistry.clear();\n this.refreshCurrentReferences();\n }\n\n getReferenceState(): CadReferenceState {\n return this.referenceRegistry.getState();\n }\n\n getMissingReferences(): CadMissingReference[] {\n return this.getReferenceState().missing;\n }\n\n getLoadedReferences(): CadLoadedReference[] {\n return this.getReferenceState().loaded;\n }\n\n setDocument(document: CadDocument, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n this.activateDocumentReferences(document);\n const result: CadViewerLoadResult = {\n document,\n raw: document.raw,\n bytes: 0,\n elapsedMs: 0,\n format: document.format,\n warnings: document.warnings,\n summary: summarizeCadDocument(document),\n fileName\n };\n this.renderer.setDocument(document);\n if (!this.options.autoFit) this.renderer.render();\n this.lastResult = result;\n this.options.onLoad?.(result);\n return result;\n }\n\n fit(mode?: CadFitMode): void {\n if (this.activeNativeLoader) this.activeNativeLoader.fit?.();\n else this.renderer.fitToView(0.92, mode);\n }\n\n zoomIn(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomIn?.();\n else this.renderer.zoomIn();\n }\n\n zoomOut(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomOut?.();\n else this.renderer.zoomOut();\n }\n\n resize(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.resize?.();\n else this.renderer.resize();\n }\n\n setCanvasOptions(options: CanvasViewerOptions): void {\n this.options.canvasOptions = { ...(this.options.canvasOptions ?? {}), ...options };\n if (options.shxGlyphResolver) this.externalShxGlyphResolver = options.shxGlyphResolver;\n this.renderer.setOptions({ ...options, shxGlyphResolver: this.shxGlyphResolver });\n if (this.activeNativeLoader) {\n this.activeNativeLoader.setNativeOptions?.({\n ...this.mergeLoadOptions({}),\n dwfBackground: options.background ?? this.options.dwfBackground\n });\n }\n }\n\n async preloadDwg(options: CadLoadOptions = {}): Promise<void> {\n const loader = this.registry.list().find((item) => item.id === 'dwg') as unknown as { preload?: (options?: CadLoadOptions) => Promise<void> } | undefined;\n if (!loader?.preload) throw new Error('The registered DWG loader does not support preload().');\n return loader.preload(this.mergeLoadOptions(options));\n }\n\n clear(): void {\n this.lastResult = undefined;\n this.deactivateNativeRenderer();\n this.renderer.clear();\n this.referenceRegistry.setDocument(undefined);\n this.emitReferenceState();\n }\n\n destroy(): void {\n this.deactivateNativeRenderer();\n for (const loader of this.registry.list()) {\n const maybeDisposable = loader as unknown as { terminateWorker?: () => void; destroy?: () => void; unmount?: () => void };\n maybeDisposable.terminateWorker?.();\n maybeDisposable.unmount?.();\n maybeDisposable.destroy?.();\n }\n this.referenceRegistry.clear();\n this.renderer.destroy();\n }\n\n getLoadResult(): CadViewerLoadResult | undefined { return this.lastResult; }\n getDocument(): CadDocument | undefined { return this.activeNativeLoader ? this.lastResult?.document : this.renderer.getDocument(); }\n getSourceDocument(): CadDocument | undefined { return this.activeNativeLoader ? this.lastResult?.document : this.renderer.getSourceDocument(); }\n getZoomPercent(): number { return this.activeNativeLoader ? 100 : this.renderer.getZoomPercent(); }\n isNativeRendererActive(): boolean { return Boolean(this.activeNativeLoader); }\n\n private async loadThroughRegistry(input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n try {\n const merged = this.mergeLoadOptions(options);\n throwIfAborted(merged.signal);\n const detected = await this.registry.detect(input);\n const normalizedInput: CadLoadInput = { ...input, buffer: detected.bytes };\n if (isCadNativeRenderableLoader(detected.loader)) {\n return await this.applyNativeLoadResult(detected.loader, normalizedInput, merged, fileName);\n }\n const result = await detected.loader.load(normalizedInput, merged);\n return this.applyLoadResult(result, fileName);\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n private applyLoadResult(result: CadLoadResult, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n this.options.onLoadProgress?.({ phase: 'render', format: result.format, message: 'Rendering normalized CAD scene…', percent: 96 });\n this.activateDocumentReferences(result.document);\n result.warnings = result.document.warnings;\n this.renderer.setDocument(result.document);\n if (!this.options.autoFit) this.renderer.render();\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.options.onLoad?.(value);\n return value;\n }\n\n private async applyNativeLoadResult(loader: CadNativeRenderableLoader, input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n if (!this.nativeHost) {\n throw new Error('Native DWF rendering requires CadViewerOptions.container, nativeHost, or a canvas parent element.');\n }\n throwIfAborted(options.signal);\n this.renderer.clear();\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = loader;\n this.canvas.style.display = 'none';\n this.nativeHost.classList.add('is-active');\n\n try {\n const result = await loader.mount(input, this.nativeHost, options);\n throwIfAborted(options.signal);\n this.activateDocumentReferences(result.document);\n result.warnings = result.document.warnings;\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.emitNativeRenderStats(result);\n this.options.onLoad?.(value);\n return value;\n } catch (error) {\n this.deactivateNativeRenderer();\n throw error;\n }\n }\n\n private deactivateNativeRenderer(): void {\n if (!this.activeNativeLoader && !this.nativeHost?.classList.contains('is-active')) {\n this.canvas.style.display = '';\n return;\n }\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = undefined;\n if (this.nativeHost) {\n this.nativeHost.classList.remove('is-active');\n this.nativeHost.replaceChildren();\n }\n this.canvas.style.display = '';\n }\n\n private emitNativeRenderStats(result: CadLoadResult): void {\n const metadata = result.document.metadata as { nativeRenderStats?: { backend?: string; commands?: number } };\n const commands = Number(metadata.nativeRenderStats?.commands ?? result.document.entities.length ?? 0);\n const backendText = String(metadata.nativeRenderStats?.backend ?? 'webgl');\n const backend: RenderStats['backend'] = backendText.includes('webgl') ? 'webgl' : 'canvas2d';\n this.options.onRenderStats?.({\n total: commands,\n drawn: commands,\n skipped: 0,\n byType: summarizeCadDocument(result.document).byType,\n unsupported: {},\n renderElapsedMs: result.elapsedMs,\n backend,\n primitiveCount: commands,\n visiblePrimitiveCount: commands,\n culledPrimitiveCount: 0,\n gpuMemoryBytes: undefined,\n buildElapsedMs: result.elapsedMs\n });\n }\n\n private mergeLoadOptions(options: CadLoadOptions): CadLoadOptions {\n const baseProgress = this.options.onProgress;\n const overrideProgress = options.onProgress;\n return {\n ...this.options,\n ...options,\n onProgress: (progress) => {\n this.options.onLoadProgress?.(progress);\n baseProgress?.(progress);\n if (overrideProgress && overrideProgress !== baseProgress) overrideProgress(progress);\n }\n };\n }\n\n private activateDocumentReferences(document: CadDocument): void {\n this.referenceRegistry.setDocument(document);\n synchronizeCadDocumentReferences(document, this.referenceRegistry.getState());\n this.emitReferenceState();\n }\n\n private refreshCurrentReferences(): void {\n const document = this.lastResult?.document;\n if (document) {\n this.referenceRegistry.setDocument(document);\n synchronizeCadDocumentReferences(document, this.referenceRegistry.getState());\n this.lastResult!.warnings = document.warnings;\n this.lastResult!.summary = summarizeCadDocument(document);\n if (!this.activeNativeLoader) this.renderer.refreshReferences();\n }\n this.emitReferenceState();\n }\n\n private emitReferenceState(): void {\n this.options.onReferenceStateChange?.(this.referenceRegistry.getState());\n }\n}\n\nexport function createCadViewer(options: CadViewerOptions = {}): CadViewer {\n return new CadViewer(options);\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new DOMException('Loading cancelled.', 'AbortError');\n}\n\nfunction createRenderer(backend: CadViewerRendererBackend, canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}): CadRenderer {\n if (backend === 'canvas2d') return new CadCanvasRenderer(canvas, options);\n if (backend === 'webgl') return new CadWebGLRenderer(canvas, options);\n if (isWebGLAvailable()) {\n try {\n return new CadWebGLRenderer(canvas, options);\n } catch {\n // Fall through to Canvas2D. Some browsers report WebGL support but reject the actual context.\n }\n }\n return new CadCanvasRenderer(canvas, options);\n}\n","import { addBlock, addLayer, addLineType, createCadDocument, normalizeCadEntity, numberOrUndefined, pointFromUnknown, stringOrUndefined } from '../../core/entity';\nimport { exactArrayBuffer } from '../../core/format';\nimport { multiplyMatrix, rotationMatrix } from '../../core/transform';\nimport type { CadBlock, CadDocument, CadEntity, CadLayer, CadLineType, CadLoadOptions, CadLoadProgress, CadLoadResult, CadPoint3D, CadSavedView, CadSceneTransform2D } from '../../core/types';\nimport { readDwgVersion } from './dwgVersion';\n\ninterface LibreDwgModule {\n Dwg_File_Type?: Record<string, number>;\n LibreDwg?: {\n create(wasmPath?: string): Promise<any>;\n createByWasmInstance?(wasmInstance: any): any;\n };\n createModule?: (moduleArg?: Record<string, unknown>) => Promise<any>;\n}\n\nexport interface ParseDwgBytesOptions extends CadLoadOptions {\n sourceName?: string;\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nconst instances = new Map<string, Promise<any>>();\n\nexport async function parseDwgBytes(bytes: Uint8Array, options: ParseDwgBytesOptions = {}): Promise<CadLoadResult> {\n const started = performance.now();\n const sourceName = options.sourceName;\n options.onProgress?.({ phase: 'detect', format: 'dwg', message: 'Validating DWG header…', total: bytes.byteLength });\n\n const version = readDwgVersion(bytes);\n if (!version.signature.startsWith('AC')) {\n throw new Error(`Invalid DWG header: ${JSON.stringify(version.signature)}.`);\n }\n\n options.onProgress?.({ phase: 'wasm-init', format: 'dwg', message: 'Initializing LibreDWG WebAssembly…', total: bytes.byteLength });\n const lib = await createLibreDwg(options.wasmPath ?? '/wasm/');\n\n options.onProgress?.({ phase: 'parse', format: 'dwg', message: `Decoding ${version.signature} DWG…`, total: bytes.byteLength, percent: 35 });\n const fileContent = exactArrayBuffer(bytes);\n const fileType = lib.Dwg_File_Type?.DWG ?? 0;\n const dwg = lib.instance.dwg_read_data(fileContent, fileType);\n if (!dwg) throw new Error('LibreDWG returned an empty DWG result.');\n if (typeof dwg.error === 'number' && dwg.error !== 0) throw new Error(`LibreDWG parse error code: ${dwg.error}.`);\n\n options.onProgress?.({ phase: 'normalize', format: 'dwg', message: 'Normalizing DWG database…', total: bytes.byteLength, percent: 72 });\n const rawDb = typeof lib.instance.convert === 'function' ? lib.instance.convert(dwg) : dwg;\n try {\n if (typeof lib.instance.dwg_free === 'function') lib.instance.dwg_free(dwg);\n } catch {\n // Different wrapper versions manage native memory differently.\n }\n\n const document = normalizeDwgDatabase(rawDb, sourceName, version, { keepRaw: Boolean(options.keepRaw) });\n const elapsedMs = performance.now() - started;\n options.onProgress?.({ phase: 'done', format: 'dwg', message: 'DWG loaded.', total: bytes.byteLength, percent: 100, elapsedMs });\n return {\n document,\n raw: options.keepRaw ? rawDb : undefined,\n bytes: bytes.byteLength,\n elapsedMs,\n format: 'dwg',\n warnings: document.warnings\n };\n}\n\nexport async function createLibreDwg(wasmPath = '/wasm/'): Promise<{ module: LibreDwgModule; instance: any; Dwg_File_Type?: Record<string, number> }> {\n const normalizedPath = normalizeWasmPath(wasmPath);\n let promise = instances.get(normalizedPath);\n if (!promise) {\n promise = import('@mlightcad/libredwg-web').then(async (module) => {\n const typed = module as LibreDwgModule;\n const LibreDwg = typed.LibreDwg;\n if (!LibreDwg || typeof LibreDwg.create !== 'function') {\n throw new Error('@mlightcad/libredwg-web did not expose LibreDwg.create().');\n }\n\n try {\n // Load the WASM binary explicitly instead of relying on Emscripten's\n // streaming fetch. This makes deployments robust when a CDN returns\n // application/octet-stream, when the server lacks the application/wasm\n // MIME mapping, and, most importantly, lets us detect SPA fallback HTML\n // before the WebAssembly runtime aborts with a cryptic magic-word error.\n if (typeof typed.createModule === 'function' && typeof LibreDwg.createByWasmInstance === 'function') {\n const wasmUrl = getLibreDwgWasmUrl(normalizedPath);\n const wasmBinary = await fetchWasmBinary(wasmUrl);\n const wasmInstance = await typed.createModule({\n wasmBinary,\n locateFile: (filename: string) => new URL(filename, ensureTrailingSlash(normalizedPath)).href\n });\n return LibreDwg.createByWasmInstance(wasmInstance);\n }\n\n // Important: call the static method on the class object. The upstream\n // implementation uses `this.createByWasmInstance(...)`; extracting\n // `create` into a standalone function loses `this` and causes\n // \"Cannot read properties of undefined (reading 'createByWasmInstance')\".\n return await LibreDwg.create(normalizedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to initialize LibreDWG WebAssembly from ${normalizedPath}. Ensure libredwg-web.wasm is deployed at ${getLibreDwgWasmUrl(normalizedPath)} and wasmPath is resolved relative to the page, not the worker script. Run npm run copy:wasm before dev/build. Original error: ${message}`);\n }\n });\n instances.set(normalizedPath, promise);\n }\n const instance = await promise;\n const module = await import('@mlightcad/libredwg-web') as LibreDwgModule;\n return { module, instance, Dwg_File_Type: module.Dwg_File_Type };\n}\n\nexport function normalizeDwgDatabase(rawDb: unknown, sourceName?: string, version?: unknown, options: { keepRaw?: boolean } = {}): CadDocument {\n const record = rawDb && typeof rawDb === 'object' ? rawDb as Record<string, unknown> : {};\n const layers = extractLayers(record, options);\n const shapeStyles = extractShxStyles(record);\n const lineTypes = extractLineTypes(record, options, shapeStyles);\n const blocks = extractBlocks(record, options);\n const header = normalizeHeader(record.header, version);\n const requiredShxFonts = extractRequiredShapeFonts(lineTypes);\n const savedViewResult = extractSavedView(record, header);\n const savedView = savedViewResult.view;\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDwgEntity(item, normalizeOptions));\n\n const document = createCadDocument({\n format: 'dwg',\n sourceName,\n header,\n layers,\n lineTypes,\n blocks,\n entities,\n savedView,\n metadata: {\n parser: '@mlightcad/libredwg-web',\n parserMode: 'wasm',\n version,\n savedView,\n requiredShxFonts\n },\n warnings: savedViewResult.warning ? [savedViewResult.warning] : [],\n raw: options.keepRaw ? rawDb : undefined\n });\n\n if (entities.length === 0) {\n document.warnings.push('DWG parsed successfully but no model-space entities were exposed by the converter. Check layout/paper-space content or unsupported proxy objects.');\n }\n const uniqueLineTypes = new Set(Object.values(lineTypes));\n if ([...uniqueLineTypes].some((lineType) => lineType.pattern.some((element) => Number(element.elementTypeFlag ?? 0) !== 0))) {\n const dependency = requiredShxFonts.length > 0\n ? ` This drawing references external shape font${requiredShxFonts.length === 1 ? '' : 's'} ${requiredShxFonts.join(', ')}, whose outlines are not embedded in the DWG.`\n : '';\n document.warnings.push(`Complex SHX linetype glyphs are preserved in the normalized LTYPE definition and rendered as a dash/dot approximation.${dependency}`);\n }\n return document;\n}\n\nfunction extractRequiredShapeFonts(lineTypes: Record<string, CadLineType>): string[] {\n const referenced = new Set<string>();\n for (const lineType of new Set(Object.values(lineTypes))) {\n for (const element of lineType.pattern) {\n if (Number(element.elementTypeFlag ?? 0) !== 0 && element.fontName) referenced.add(element.fontName);\n }\n }\n return [...referenced].sort((left, right) => left.localeCompare(right));\n}\n\ninterface DwgShxStyles {\n byReference: Map<string, string>;\n shapeFonts: string[];\n}\n\nfunction extractShxStyles(rawDb: Record<string, unknown>): DwgShxStyles {\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n const candidates = [rawDb.STYLE, rawDb.styles, tables?.STYLE, tables?.styles];\n const byReference = new Map<string, string>();\n const shapeFonts = new Set<string>();\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n if (!item || typeof item !== 'object') continue;\n const record = item as Record<string, unknown>;\n const font = stringOrUndefined(record.font ?? record.fontFileName ?? record.primaryFontFileName);\n if (!font || !/\\.shx$/i.test(font)) continue;\n const flag = numberOrUndefined(record.standardFlag ?? record.flag) ?? 0;\n if ((flag & 1) === 1) shapeFonts.add(font);\n for (const reference of [record.handle, record.id, record.name]) {\n const key = styleReferenceKey(reference);\n if (key) byReference.set(key, font);\n }\n }\n }\n return { byReference, shapeFonts: [...shapeFonts] };\n}\n\nfunction normalizeDwgEntity(record: Record<string, unknown>, options: { keepRaw?: boolean; includeUnknownProperties?: boolean }): CadEntity {\n const entity = normalizeCadEntity(record, undefined, { ...options, numericColorMode: 'rgb' });\n const rgb = numberOrUndefined(record.color);\n // @mlightcad/libredwg-web exposes DwgEntity.color as a 24-bit RGB value,\n // while DXF parsers commonly expose `color` as an ACI index. DWG normalization\n // must therefore preserve `color` as trueColor even for low RGB values such as\n // 0x0000ff; otherwise valid DWG colors are interpreted as ACI and many files\n // render as a single foreground color.\n if (rgb !== undefined && rgb >= 0 && rgb <= 0xffffff) {\n entity.color = rgb;\n entity.trueColor = rgb;\n }\n entity.colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber ?? record.aci) ?? entity.colorIndex;\n entity.colorName = stringOrUndefined(record.colorName ?? record.color_name) ?? entity.colorName;\n const flag = numberOrUndefined(record.flag ?? record.flags);\n if (flag !== undefined) entity.flag = flag;\n const type = String(record.type ?? record.entityType ?? '').toUpperCase();\n const classicPolyline = /^(POLYLINE|POLYLINE_2D|POLYLINE2D|POLYLINE_3D|POLYLINE3D)$/.test(type);\n if (record.isClosed === true || record.closed === true || (classicPolyline && (Number(flag ?? 0) & 1) === 1)\n || (type === 'LWPOLYLINE' && (Number(flag ?? 0) & 0x200) === 0x200)) {\n entity.isClosed = true;\n }\n return entity;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction normalizeHeader(header: unknown, version: unknown): Record<string, unknown> {\n const result = header && typeof header === 'object' ? { ...(header as Record<string, unknown>) } : {};\n if (version) result.dwgVersion = version;\n return result;\n}\n\nfunction extractLayers(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const candidates: unknown[] = [];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n for (const key of ['LAYER', 'layer', 'layers']) {\n const value = rawDb[key] ?? tables?.[key];\n if (value) candidates.push(value);\n }\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.layerName ?? record.entryName);\n if (!name) continue;\n const colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber);\n const rawRgb = numberOrUndefined(record.trueColor ?? record.true_color ?? record.truecolor ?? record.colorRGB ?? record.colorRgb ?? record.rgbColor ?? record.rgb);\n const convertedRgb = numberOrUndefined(record.color);\n const useIndexedColor = isRenderableAci(colorIndex);\n const trueColor = rawRgb ?? (!useIndexedColor && convertedRgb !== undefined && convertedRgb >= 0 && convertedRgb <= 0xffffff ? convertedRgb : undefined);\n const layer: CadLayer = {\n name,\n color: useIndexedColor ? undefined : (record.color ?? record.colorName) as CadLayer['color'],\n colorIndex: colorIndex ?? (convertedRgb !== undefined && Math.abs(convertedRgb) <= 257 ? convertedRgb : undefined),\n trueColor,\n lineType: stringOrUndefined(record.lineType ?? record.linetype),\n lineweight: numberOrUndefined(record.lineweight ?? record.lineWeight),\n isVisible: record.isVisible === false || record.off === true || Number(colorIndex ?? record.color ?? 1) < 0 ? false : true,\n isFrozen: Boolean(record.isFrozen ?? record.frozen),\n isLocked: Boolean(record.isLocked ?? record.locked),\n raw: options.keepRaw ? record : undefined\n };\n addLayer(result, layer);\n }\n }\n return result;\n}\n\nfunction extractLineTypes(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }, styles: DwgShxStyles): Record<string, CadLineType> {\n const result: Record<string, CadLineType> = {};\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n const candidates = [rawDb.LTYPE, rawDb.ltype, rawDb.lineTypes, tables?.LTYPE, tables?.ltype, tables?.lineTypes];\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.lineTypeName ?? record.entryName);\n if (!name) continue;\n const rawPattern = Array.isArray(record.pattern)\n ? record.pattern\n : Array.isArray(record.dashes)\n ? record.dashes\n : [];\n const pattern = rawPattern.flatMap((entry) => {\n if (typeof entry === 'number') return [{ length: entry }];\n if (!entry || typeof entry !== 'object') return [];\n const part = entry as Record<string, unknown>;\n const length = numberOrUndefined(part.elementLength ?? part.length ?? part.dashLength);\n if (length === undefined) return [];\n const convertedShapeCode = numberOrUndefined(part.elementTypeFlag);\n const convertedTypeFlag = numberOrUndefined(part.shapeNumber);\n // @mlightcad/libredwg-web 0.7.x maps LibreDWG's internal names in the\n // opposite direction: complex_shapecode is DXF group 75 (shape number)\n // and shape_flag is group 74 (element type). Restore the public DXF\n // semantics here instead of leaking the converter mismatch downstream.\n const hasLibreDwgPair = convertedShapeCode !== undefined && convertedTypeFlag !== undefined;\n const elementTypeFlag = hasLibreDwgPair ? convertedTypeFlag : numberOrUndefined(part.typeFlag ?? part.elementTypeFlag);\n const styleHandle = stringOrUndefined(part.styleObjectId ?? part.styleHandle ?? part.style);\n const fontName = (styleHandle ? styles.byReference.get(styleReferenceKey(styleHandle)) : undefined)\n ?? ((Number(elementTypeFlag ?? 0) & 4) === 4 && styles.shapeFonts.length === 1 ? styles.shapeFonts[0] : undefined);\n return [{\n length,\n elementTypeFlag,\n shapeNumber: hasLibreDwgPair ? convertedShapeCode : numberOrUndefined(part.shapeCode ?? part.shapeNumber),\n scale: numberOrUndefined(part.scale),\n rotation: numberOrUndefined(part.rotation),\n offsetX: numberOrUndefined(part.offsetX),\n offsetY: numberOrUndefined(part.offsetY),\n text: stringOrUndefined(part.text),\n styleHandle,\n fontName\n }];\n });\n addLineType(result, {\n name,\n handle: stringOrUndefined(record.handle ?? record.id),\n description: stringOrUndefined(record.description),\n totalPatternLength: numberOrUndefined(record.totalPatternLength ?? record.patternLength),\n pattern,\n raw: options.keepRaw ? record : undefined\n });\n }\n }\n return result;\n}\n\nfunction styleReferenceKey(value: unknown): string {\n return String(value ?? '').trim().replace(/^0x/i, '').replace(/^0+(?=[0-9a-f])/i, '').toLowerCase();\n}\n\nfunction extractSavedView(rawDb: Record<string, unknown>, header: Record<string, unknown>): { view?: CadSavedView; warning?: string } {\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n const vports = expandCandidate(rawDb.VPORT ?? rawDb.vports ?? tables?.VPORT ?? tables?.vports)\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object');\n const active = vports.find((record) => String(record.name ?? '').trim().toLowerCase() === '*active');\n const source = active ? 'vport' as const : 'header-ucs' as const;\n const record = active ?? header;\n const ucsOrigin = pointFromUnknown(record.ucsOrigin ?? record.UCSORG ?? header.UCSORG);\n const ucsXAxis = pointFromUnknown(record.ucsXAxis ?? record.UCSXDIR ?? header.UCSXDIR);\n const ucsYAxis = pointFromUnknown(record.ucsYAxis ?? record.UCSYDIR ?? header.UCSYDIR);\n const twistAngle = numberOrUndefined(record.viewTwistAngle ?? record.twistAngle ?? record.VIEWTWIST) ?? 0;\n const direction = pointFromUnknown(record.viewDirectionFromTarget ?? record.viewDirection ?? record.direction ?? record.VIEWDIR);\n const hasNonWorldUcs = !isWorldUcs(ucsOrigin, ucsXAxis, ucsYAxis);\n const hasViewData = Boolean(active)\n || Boolean(direction)\n || hasNonWorldUcs\n || Math.abs(twistAngle) > 1e-12;\n if (!hasViewData) return {};\n const planView = isPlanViewDirection(direction);\n const sceneTransform = planView\n ? createSavedViewTransform(ucsOrigin, ucsXAxis, ucsYAxis, twistAngle)\n : { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n const view: CadSavedView = {\n source,\n name: stringOrUndefined(record.name),\n handle: stringOrUndefined(record.handle),\n center: pointFromUnknown(record.center ?? record.VIEWCTR),\n target: pointFromUnknown(record.viewTarget ?? record.target ?? record.TARGET),\n direction,\n viewHeight: numberOrUndefined(record.viewHeight ?? record.height ?? record.VIEWSIZE),\n aspectRatio: numberOrUndefined(record.aspectRatio),\n twistAngle,\n ucsOrigin,\n ucsXAxis,\n ucsYAxis,\n sceneTransformApplied: planView,\n sceneTransform\n };\n return planView\n ? { view }\n : {\n view,\n warning: 'The saved CAD view has a missing, non-finite, or tilted VIEWDIR. File Viewer kept world coordinates instead of applying an unsafe 2D UCS/PLAN rotation.'\n };\n}\n\nfunction createSavedViewTransform(\n origin: CadPoint3D | undefined,\n rawXAxis: CadPoint3D | undefined,\n rawYAxis: CadPoint3D | undefined,\n twistAngle: number\n): CadSceneTransform2D {\n const xAxis = normalizePlanAxis(rawXAxis) ?? { x: 1, y: 0 };\n const yAxisCandidate = normalizePlanAxis(rawYAxis) ?? { x: -xAxis.y, y: xAxis.x };\n const projection = xAxis.x * yAxisCandidate.x + xAxis.y * yAxisCandidate.y;\n const orthogonalY = normalizePlanAxis({\n x: yAxisCandidate.x - xAxis.x * projection,\n y: yAxisCandidate.y - xAxis.y * projection\n }) ?? { x: -xAxis.y, y: xAxis.x };\n const base: CadSceneTransform2D = {\n a: xAxis.x,\n b: orthogonalY.x,\n c: xAxis.y,\n d: orthogonalY.y,\n e: origin ? -(origin.x * xAxis.x + origin.y * xAxis.y) : 0,\n f: origin ? -(origin.x * orthogonalY.x + origin.y * orthogonalY.y) : 0\n };\n return multiplyMatrix(rotationMatrix(Number.isFinite(twistAngle) ? twistAngle : 0), base);\n}\n\nfunction normalizePlanAxis(axis: CadPoint3D | undefined): { x: number; y: number } | undefined {\n if (!axis || Math.abs(Number(axis.z ?? 0)) > 1e-6) return undefined;\n const length = Math.hypot(axis.x, axis.y);\n if (!Number.isFinite(length) || length < 1e-12) return undefined;\n return { x: axis.x / length, y: axis.y / length };\n}\n\nfunction isPlanViewDirection(direction: CadPoint3D | undefined): boolean {\n if (!direction || !Number.isFinite(direction.x) || !Number.isFinite(direction.y) || !Number.isFinite(direction.z)) return false;\n const length = Math.hypot(direction.x, direction.y, Number(direction.z));\n if (!Number.isFinite(length) || length < 1e-12) return false;\n return Math.hypot(direction.x, direction.y) / length <= 1e-4\n && Math.abs(Number(direction.z)) / length >= 1 - 1e-8;\n}\n\nfunction isWorldUcs(\n origin: CadPoint3D | undefined,\n xAxis: CadPoint3D | undefined,\n yAxis: CadPoint3D | undefined\n): boolean {\n const close = (value: number | undefined, expected: number) => Number.isFinite(value) && Math.abs(Number(value) - expected) <= 1e-10;\n const originWorld = !origin || (close(origin.x, 0) && close(origin.y, 0) && close(origin.z ?? 0, 0));\n const xWorld = !xAxis || (close(xAxis.x, 1) && close(xAxis.y, 0) && close(xAxis.z ?? 0, 0));\n const yWorld = !yAxis || (close(yAxis.x, 0) && close(yAxis.y, 1) && close(yAxis.z ?? 0, 0));\n return originWorld && xWorld && yWorld;\n}\n\nfunction extractBlocks(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const candidates: unknown[] = [rawDb.blocks, rawDb.blockHeaders, rawDb.block_records, rawDb.blockRecords];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n candidates.push(tables?.BLOCK, tables?.BLOCK_RECORD, tables?.blocks);\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.blockName ?? record.name2);\n if (!name) continue;\n const rawEntities = Array.isArray(record.entities) ? record.entities : Array.isArray(record.ownedObjects) ? record.ownedObjects : [];\n const entities: CadEntity[] = rawEntities\n .filter((entry): entry is Record<string, unknown> => !!entry && typeof entry === 'object')\n .map((entry) => normalizeDwgEntity(entry, normalizeOptions));\n addBlock(result, {\n name,\n basePoint: pointFromUnknown(record.basePoint ?? record.origin) ?? { x: 0, y: 0 },\n entities,\n raw: options.keepRaw ? record : undefined\n });\n }\n }\n return result;\n}\n\nfunction expandCandidate(candidate: unknown): unknown[] {\n if (!candidate) return [];\n if (Array.isArray(candidate)) return candidate;\n if (typeof candidate !== 'object') return [];\n const record = candidate as Record<string, unknown>;\n const directValues = Object.values(record).filter((value) => value && typeof value === 'object');\n const arrays = ['entries', 'records', 'items', 'values', 'layers', 'blocks'].flatMap((key) => Array.isArray(record[key]) ? record[key] as unknown[] : []);\n if (arrays.length > 0) return arrays;\n return directValues;\n}\n\nfunction normalizeWasmPath(wasmPath: string): string {\n const trimmed = wasmPath.trim() || '/wasm';\n if (trimmed === '/') return getRuntimeOrigin();\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, '');\n if (isAbsoluteUrl(withoutTrailingSlash)) return withoutTrailingSlash;\n if (withoutTrailingSlash.startsWith('/')) return `${getRuntimeOrigin()}${withoutTrailingSlash}`;\n return new URL(withoutTrailingSlash, getRuntimeBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction getLibreDwgWasmUrl(wasmPath: string): string {\n return new URL('libredwg-web.wasm', ensureTrailingSlash(wasmPath)).href;\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n\nfunction getRuntimeBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getRuntimeOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getRuntimeBaseUrl()).origin;\n}\n\nasync function fetchWasmBinary(url: string): Promise<Uint8Array> {\n if (typeof fetch !== 'function') {\n throw new Error('fetch() is not available, so the LibreDWG WASM binary cannot be loaded.');\n }\n\n const response = await fetch(url, { credentials: 'same-origin', cache: 'force-cache' });\n if (!response.ok) {\n throw new Error(`WASM asset request failed with HTTP ${response.status} for ${url}.`);\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (!hasWasmMagic(bytes)) {\n const preview = decodeAsciiPreview(bytes);\n const contentType = response.headers.get('content-type') ?? 'unknown content-type';\n throw new Error(`Invalid WASM asset at ${url}. Expected bytes 00 61 73 6d, got ${formatFirstBytes(bytes)} (${contentType}). The server probably returned an HTML fallback page instead of libredwg-web.wasm. Response preview: ${preview}`);\n }\n\n return bytes;\n}\n\nfunction hasWasmMagic(bytes: Uint8Array): boolean {\n return bytes.length >= 4 && bytes[0] === 0x00 && bytes[1] === 0x61 && bytes[2] === 0x73 && bytes[3] === 0x6d;\n}\n\nfunction formatFirstBytes(bytes: Uint8Array): string {\n return Array.from(bytes.slice(0, 4)).map((byte) => byte.toString(16).padStart(2, '0')).join(' ');\n}\n\nfunction decodeAsciiPreview(bytes: Uint8Array): string {\n const text = Array.from(bytes.slice(0, 32))\n .map((byte) => byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : '.')\n .join('');\n return JSON.stringify(text);\n}\n"],"names":["readInputBytes","input","exactArrayBuffer","bytes","extensionOf","name","_a","index","detectCadFormat","ext","sig","ascii","head","b","CadLoaderRegistry","loaders","__publicField","loader","item","loaderId","format","direct","fallback","options","DEFAULT_DWG_WORKER_URL","DwgWorkerClient","supportsDwgWorker","worker","requestId","timeout","fileName","transferBuffer","prepareTransferBuffer","_b","resolve","reject","createAbortError","pending","serializeOptions","error","cleanupPending","createWorker","event","message","resolveWorkerUrl","resolveWasmPathForWorker","wasmPath","candidate","getPageOrigin","isAbsoluteUrl","getPageBaseUrl","workerUrl","value","DwgLoader","defaults","merged","sourceName","isAbortError","normalizeWorkerError","createCadDocument","init","inferEntityKind","type","normalizeCadEntity","raw","forcedType","entity","stringOrUndefined","numberOrUndefined","explicitClosed","typeUsesClassicPolylineFlag","typeUsesLwPolylineFlag","numericColorMode","rawColorNumber","explicitAci","explicitTrueColor","rawColorLooksRgb","pointFromUnknown","scale","scaleX","scaleY","scaleZ","vertices","normalizePoints","controlPoints","fitPoints","rawAttribs","attribute","record","x","y","zCandidate","z","out","p","rec","vertex","bulge","startWidth","endWidth","summarizeCadDocument","document","byType","isCadPolylineClosed","flag","isLightweightPolyline","isClassicPolyline","points","first","last","extent","max","point","cadEntityWorldStrokeWidth","width","finiteNonNegative","addLayer","target","layer","addBlock","block","addLineType","lineType","flattenPages","pages","page","n","number","emptyBounds","boundsValid","bounds","includePoint","isFinitePoint","includeCircle","center","radius","r","mergeBounds","source","paddedBounds","ratio","minimum","padX","padY","xy","degreesToRadians","arcPoints","startAngle","endAngle","ccw","segments","start","end","sweep","count","pts","i","t","ellipsePoints","majorAxisEndPoint","major","minor","rotation","cosR","sinR","bulgeToPolylinePoints","p1","p2","chord","theta","mid","dx","dy","sagittaDirection","h","a1","a2","stripMTextFormatting","text","clamp","min","DxfLoader","mergedOptions","started","decodeDxfText","warnings","parsed","parseWithDxfParser","parseDxfFallback","normalizeDxfDatabase","elapsedMs","module","Parser","layers","extractDxfLayers","blocks","extractDxfBlocks","entities","normalizeDxfEntity","rawColor","normalizeDxfText","normalizeRotation","normalizeAngle","sx","sy","sz","control","normalizeControlPoints","fit","normalizeHatchLoops","normalizeSolidVertices","result","tables","layerTable","candidates","expandRecords","addDxfBlock","blockValue","fallbackName","loops","loop","preferredEncoding","explicitEncoding","normalizeDxfEncoding","decodeBytes","bomEncoding","detectBomEncoding","declaredEncoding","detectDxfCodePage","utf8","chooseBestLegacyDxfDecode","DXF_CODEPAGE_ENCODING","lines","cursor","code","_c","_d","trimmed","key","ansi","cp","encoding","bestText","bestScore","score","scoreDxfDecode","replacements","countMatches","controls","cjk","hasDxfStructure","pattern","match","pairs","section","current","polyline","pair","flushEntity","v","readPoint","readNumber","e","entityFromPairs","common","readString","degreesToRadiansSafe","readJoinedText","readLwPolylineVertices","readRepeatedPoints","found","xCode","yCode","zCode","yPair","zPair","j","chunks","DwfLoader","normalizeFormat","loaded","openDwfDocument","cadDocumentFromDwf","host","wasmUrl","resolveDwfWasmUrl","background","resolveDwfBackground","viewerOptions","buildDwfViewerOptions","loadOptions","buildDwfLoadOptions","DwfViewer","_e","button","native","setOptionalNumber","keepRaw","diagnosticsToWarnings","pageToCadPage","metadata","countBy","unique","pageEntities","pageIndex","primitive","primitiveToEntity","mesh","rgbToHex","base","pointsArrayToCadPoints","w","diagnostics","detected","ensureTrailingSlash","canvasOptions","rgb","g","toHex","values","createDefaultLoaderRegistry","d","c","o","O","U","$","H","K","a","s","u","q","Z","J","D","L","M","E","f","_","tt","et","nt","it","F","st","ot","m","S","A","P","k","R","W","I","C","V","N","X","rt","at","T","ct","G","ht","lt","ut","dt","Y","B","ft","gt","pt","l","wt","yt","bt","xt","EMPTY_SHX_GLYPH_RESOLVER","COMPLEX_SHX_WARNING_PREFIX","CadShxFontRegistry","referenceFileName","copyBytes","font","ShxFont","referenceKey","previous","info","requirements","add","normalizedName","requirement","element","shapeNumber","declared","unknown","named","existing","entry","missing","fontSatisfies","left","right","fontName","cached","glyph","shape","glyphFromPolylines","codes","character","placed","layoutTextRun","predicate","exact","requiredMatches","matches","synchronizeCadDocumentReferences","state","required","reference","names","reason","polylines","normalized","buffer","isCadNativeRenderableLoader","BASE_ACI","colorFromAci","foreground","colorFromTrueColor","byteOrder","int","parseCssColor","normalizeXpsColor","obj","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","keys","rgba","part","hasPercent","clampByte","channels","l1","l2","hi","lo","IDENTITY_MATRIX","multiplyMatrix","translationMatrix","rotationMatrix","angle","scaleMatrix","transformPoint","matrix","transformPathCommands","commands","command","matrixFromInsert","basePoint","insertion","scaleValue","transformEntity","clone","determinant","scaleApprox","origin","scaleDimension","ellipseAnglesAreRelative","tau","DEFAULT_MAX_INSERT_DEPTH","DEFAULT_MAX_CURVE_SEGMENTS","MIN_SAVED_VIEW_CONTENT_RATIO","computeCadDocumentBounds","context","createBoundsContext","computeEntityBounds","resolveCadFitBounds","extents","mode","savedViewBounds","resolveCadSavedViewBounds","visibleContent","intersectingEntities","intersection","intersectBounds","hasMeaningfulExtent","view","height","aspectRatio","depth","includeEntityBounds","kind","lookupBlock","child","anchor","entityAnchor","content","savedView","contentDiagonal","savedViewDiagonal","DEFAULT_MAX_DASH_PRIMITIVES","BY_LAYER","BY_BLOCK","CONTINUOUS","refKey","isByBlockLineType","applyByBlockLineTypeInheritance","parentRef","resolveCadLineTypeReference","finitePositive","resolveCadLinePattern","definition","lookupLineType","entityScale","globalScale","runs","patternRuns","period","sum","run","hasGap","hasMarker","canvasDashSegments","createDashedCadSegments","closed","createDashedCadPrimitives","maxPrimitives","valid","edges","finiteLimit","totalLength","estimatedPrimitives","output","runIndex","remaining","markerPending","addDot","advance","addMarker","edgeLength","marker","createLineTypeMarker","length","offset","zeroRunCount","isComplexRun","take","from","to","complex","transformCadLineTypeGlyph","cosine","sine","tangentX","tangentY","offsetX","finiteNumber","offsetY","tangentAngle","markerPoint","expectedDraw","lineTypes","isIdentity","createCadSceneDocument","DEFAULT_OPTIONS","CadCanvasRenderer","canvas","ctx","refit","padding","fitBounds","bw","bh","factor","before","after","cloneStats","ev","stopDrag","fill","applyLinePattern","fillColor","lineweightPixels","worldWidthPixels","linePattern","segment","inherited","attr","p3","src","image","generationFlag","xScale","pixelHeight","halign","valign","line","primitives","fallbackDots","removeMatchingPoint","screen","cmd","stats","tolerance","DEFAULT_WEBGL_OPTIONS","CadWebGLRenderer","gl","createWebGLContext","createProgramInfo","isWebGLAvailable","cpuScene","buildCpuScene","uploadScene","createStatsFromScene","fitScale","rebuildRequired","requiresSceneRebuild","cssToRgbaBytes","visiblePrimitiveCount","culledPrimitiveCount","scene","visibleBounds","lineCounts","triangleCounts","lineTypePointCounts","pointCounts","renderElapsedMs","batches","visible","culled","batch","boundsIntersects","items","maxLabels","drawn","fontSize","overlay","signal","halfW","halfH","attributes","vertexSource","fragmentSource","compileShader","fragment","program","uViewCenter","uScale","uViewport","uPointSize","shader","cpu","gpuMemoryBytes","upload","positionBuffer","createBuffer","colorBuffer","gpuBytes","lineBatches","triangleBatches","lineTypePointBatches","pointBatches","data","opts","builder","CpuSceneBuilder","finalizeMutableBatches","safeXScale","approxWidth","approxHeight","stroke","added","flattenPathCommands","boundsFromPoints","pointsEqual","worldWidth","roundCaps","half","nx","ny","ring","bucket","pushVertex","pointBounds","buckets","createMutableBatch","cx","cy","ix","iy","map","maxVerticesPerBatch","vertexCount","primitiveSize","inferPrimitiveSize","verticesPerChunk","startVertex","endVertex","push","p0","mt","c1","c2","next","opacity","percent","nums","CadViewer","createRenderer","file","normalizeError","removed","maybeDisposable","throwIfAborted","normalizedInput","backend","baseProgress","overrideProgress","progress","createCadViewer","normalizeDwgDatabase","rawDb","version","extractLayers","shapeStyles","extractShxStyles","extractLineTypes","extractBlocks","header","normalizeHeader","requiredShxFonts","extractRequiredShapeFonts","savedViewResult","extractSavedView","rawEntities","normalizeOptions","normalizeDwgEntity","dependency","referenced","byReference","shapeFonts","expandCandidate","styleReferenceKey","classicPolyline","colorIndex","rawRgb","convertedRgb","useIndexedColor","trueColor","styles","convertedShapeCode","convertedTypeFlag","hasLibreDwgPair","elementTypeFlag","styleHandle","active","ucsOrigin","ucsXAxis","ucsYAxis","twistAngle","direction","hasNonWorldUcs","isWorldUcs","planView","isPlanViewDirection","sceneTransform","createSavedViewTransform","rawXAxis","rawYAxis","xAxis","normalizePlanAxis","yAxisCandidate","projection","orthogonalY","axis","yAxis","close","expected","originWorld","xWorld","yWorld","directValues","arrays"],"mappings":"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AAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UACrJ,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK,UAAW,IAAK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","x_google_ignoreList":[9]}