@flyfish-dev/cad-viewer 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/NOTICE +11 -0
- package/README.md +411 -0
- package/README.zh-CN.md +411 -0
- package/dist/assets/DwgWorker-CuZJ5EUe.js +349 -0
- package/dist/assets/DwgWorker-CuZJ5EUe.js.map +1 -0
- package/dist/assets/index-C365l3i9.js +4161 -0
- package/dist/assets/index-C365l3i9.js.map +1 -0
- package/dist/cad-viewer.es.js +2992 -0
- package/dist/cad-viewer.es.js.map +1 -0
- package/dist/cad-viewer.umd.cjs +30 -0
- package/dist/cad-viewer.umd.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/style.css +1 -0
- package/dist/types/core/color.d.ts +21 -0
- package/dist/types/core/color.d.ts.map +1 -0
- package/dist/types/core/entity.d.ts +34 -0
- package/dist/types/core/entity.d.ts.map +1 -0
- package/dist/types/core/format.d.ts +8 -0
- package/dist/types/core/format.d.ts.map +1 -0
- package/dist/types/core/geometry.d.ts +17 -0
- package/dist/types/core/geometry.d.ts.map +1 -0
- package/dist/types/core/transform.d.ts +20 -0
- package/dist/types/core/transform.d.ts.map +1 -0
- package/dist/types/core/types.d.ts +195 -0
- package/dist/types/core/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/loaders/CadLoaderRegistry.d.ts +15 -0
- package/dist/types/loaders/CadLoaderRegistry.d.ts.map +1 -0
- package/dist/types/loaders/dwf/DwfLoader.d.ts +15 -0
- package/dist/types/loaders/dwf/DwfLoader.d.ts.map +1 -0
- package/dist/types/loaders/dwg/DwgLoader.d.ts +15 -0
- package/dist/types/loaders/dwg/DwgLoader.d.ts.map +1 -0
- package/dist/types/loaders/dwg/DwgParser.d.ts +24 -0
- package/dist/types/loaders/dwg/DwgParser.d.ts.map +1 -0
- package/dist/types/loaders/dwg/DwgWorker.d.ts +2 -0
- package/dist/types/loaders/dwg/DwgWorker.d.ts.map +1 -0
- package/dist/types/loaders/dwg/DwgWorkerClient.d.ts +18 -0
- package/dist/types/loaders/dwg/DwgWorkerClient.d.ts.map +1 -0
- package/dist/types/loaders/dwg/dwgVersion.d.ts +9 -0
- package/dist/types/loaders/dwg/dwgVersion.d.ts.map +1 -0
- package/dist/types/loaders/dwg/libredwgWasmModuleProxy.d.ts +14 -0
- package/dist/types/loaders/dwg/libredwgWasmModuleProxy.d.ts.map +1 -0
- package/dist/types/loaders/dxf/DxfLoader.d.ts +12 -0
- package/dist/types/loaders/dxf/DxfLoader.d.ts.map +1 -0
- package/dist/types/loaders/index.d.ts +8 -0
- package/dist/types/loaders/index.d.ts.map +1 -0
- package/dist/types/viewer/CadCanvasRenderer.d.ts +142 -0
- package/dist/types/viewer/CadCanvasRenderer.d.ts.map +1 -0
- package/dist/types/viewer/CadViewer.d.ts +55 -0
- package/dist/types/viewer/CadViewer.d.ts.map +1 -0
- package/dist/types/viewer/CadWebGLRenderer.d.ts +69 -0
- package/dist/types/viewer/CadWebGLRenderer.d.ts.map +1 -0
- package/dist/wasm/libredwg-web.js +15 -0
- package/dist/wasm/libredwg-web.wasm +0 -0
- package/package.json +103 -0
|
@@ -0,0 +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/core/color.ts","../src/core/transform.ts","../src/loaders/dwf/DwfLoader.ts","../src/loaders/index.ts","../src/viewer/CadCanvasRenderer.ts","../src/viewer/CadWebGLRenderer.ts","../src/viewer/CadViewer.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\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 if (options.workerUrl) return new Worker(options.workerUrl, { type: 'module', name: 'lightweight-cad-dwg-loader' });\n return new Worker(new URL('./DwgWorker.ts', import.meta.url), { 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 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, 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 blocks: init.blocks ?? {},\n entities: init.entities ?? [],\n pages: init.pages,\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\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 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 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 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 void { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const text = decodeDxfText(bytes);\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 = stringOrUndefined(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\nfunction decodeDxfText(bytes: Uint8Array): string {\n const utf8 = new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n if (utf8.includes('SECTION')) return utf8;\n return new TextDecoder('iso-8859-1', { fatal: false }).decode(bytes);\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 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, raw: entity.raw ?? 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.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 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 { unzipSync } from 'fflate';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { normalizeXpsColor } from '../../core/color';\nimport { decodeUtf8, detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport { emptyBounds, includePoint } from '../../core/geometry';\nimport { IDENTITY_MATRIX, multiplyMatrix, parseMatrix, transformPoint, type Matrix2D } from '../../core/transform';\nimport type { CadDocument, CadEntity, CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader, CadPage, CadPathCommand, CadPoint2D } from '../../core/types';\n\nexport class DwfUnsupportedError extends Error {\n readonly format = 'dwf';\n constructor(message: string) {\n super(message);\n this.name = 'DwfUnsupportedError';\n }\n}\n\nexport class DwfLoader implements CadLoader {\n readonly id = 'dwf';\n readonly label = 'DWFx/XPS 2D package loader';\n readonly formats = ['dwf', 'dwfx', 'xps'] 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 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 void { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const sourceName = input.fileName ?? input.file?.name;\n const ext = extensionOf(input);\n const packageFiles = openZipPackage(bytes);\n const pages = parseXpsPages(packageFiles, sourceName);\n\n if (pages.length === 0) {\n const entries = Object.keys(packageFiles);\n const hasWhip = entries.some((name) => /\\.(w2d|w3d|whip)$/i.test(name));\n const hasDwfManifest = entries.some((name) => /manifest|descriptor|eplot/i.test(name));\n if (hasWhip || ext === 'dwf' || hasDwfManifest) {\n throw new DwfUnsupportedError('Classic DWF packages usually store geometry in WHIP/W2D/W3D streams. This browser build detects them but does not decode the full classic DWF graphics stream without a DWF Toolkit/WASM implementation. DWFx/XPS 2D pages are supported.');\n }\n throw new DwfUnsupportedError('No FixedPage/XPS content found in this DWF/DWFx package.');\n }\n\n const warnings: string[] = [];\n if (ext === 'dwf') warnings.push('This .dwf package contained XPS/FixedPage-compatible content and was rendered through the DWFx loader path. Classic WHIP/W2D streams are not decoded.');\n const document = createCadDocument({\n format: ext === 'dwf' ? 'dwf' : ext === 'xps' ? 'xps' : 'dwfx',\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata: {\n parser: 'cad-viewer DWFx/XPS loader',\n packageEntries: Object.keys(packageFiles).length\n },\n warnings,\n raw: { entries: Object.keys(packageFiles) }\n });\n const elapsedMs = performance.now() - started;\n return { document, raw: document.raw, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n}\n\nfunction openZipPackage(bytes: Uint8Array): Record<string, Uint8Array> {\n if (!(bytes[0] === 0x50 && bytes[1] === 0x4b)) {\n throw new DwfUnsupportedError('DWF/DWFx loader expects a ZIP/OPC package. Non-ZIP classic DWF streams require a dedicated WHIP decoder.');\n }\n return unzipSync(bytes);\n}\n\nfunction parseXpsPages(files: Record<string, Uint8Array>, sourceName?: string): CadPage[] {\n const pageEntries = Object.entries(files)\n .filter(([name, data]) => /\\.fpage$/i.test(name) || decodeUtf8(data.slice(0, Math.min(512, data.byteLength))).includes('<FixedPage'))\n .sort(([a], [b]) => a.localeCompare(b));\n\n const pages: CadPage[] = [];\n for (const [name, data] of pageEntries) {\n const xml = decodeUtf8(data);\n if (!xml.includes('<FixedPage')) continue;\n const page = parseFixedPage(xml, pages.length, name, files, sourceName);\n if (page) pages.push(page);\n }\n return pages;\n}\n\nfunction parseFixedPage(xml: string, index: number, name: string, files: Record<string, Uint8Array>, sourceName?: string): CadPage | undefined {\n if (typeof DOMParser === 'undefined') {\n throw new Error('DWFx/XPS parsing requires DOMParser. Use it in a browser environment or provide a DOMParser polyfill.');\n }\n const doc = new DOMParser().parseFromString(xml, 'application/xml');\n const root = doc.documentElement;\n if (!root || !/FixedPage$/i.test(root.nodeName)) return undefined;\n const width = numberAttr(root, 'Width') ?? 1000;\n const height = numberAttr(root, 'Height') ?? 1000;\n const entities: CadEntity[] = [];\n\n walkElement(root, IDENTITY_MATRIX, (element, matrix) => {\n const localMatrix = multiplyMatrix(matrix, parseElementTransform(element) ?? IDENTITY_MATRIX);\n const tag = stripNamespace(element.nodeName);\n if (tag === 'Path') {\n const pathEntity = parsePathElement(element, localMatrix, height, index);\n if (pathEntity) entities.push(pathEntity);\n } else if (tag === 'Glyphs') {\n const textEntity = parseGlyphsElement(element, localMatrix, height, index);\n if (textEntity) entities.push(textEntity);\n } else if (tag === 'Canvas') {\n // Children are visited by walkElement with the accumulated transform.\n } else if (tag === 'ImageBrush') {\n const image = parseImageBrushElement(element, localMatrix, height, index, name, files);\n if (image) entities.push(image);\n }\n return localMatrix;\n });\n\n return { index, name: sourceName ? `${sourceName} / ${name}` : name, width, height, entities };\n}\n\nfunction walkElement(element: Element, matrix: Matrix2D, visitor: (element: Element, matrix: Matrix2D) => Matrix2D): void {\n const local = visitor(element, matrix);\n for (const child of Array.from(element.children)) walkElement(child, local, visitor);\n}\n\nfunction parsePathElement(element: Element, matrix: Matrix2D, pageHeight: number, pageIndex: number): CadEntity | undefined {\n const data = element.getAttribute('Data') ?? findGeometryData(element);\n if (!data) return undefined;\n const commands = parseXpsPathData(data)\n .map((command) => ({\n cmd: command.cmd,\n points: command.points.map((p) => pageToCadPoint(transformPoint(p, matrix), pageHeight))\n }));\n if (!commands.length) return undefined;\n\n const stroke = normalizeXpsColor(element.getAttribute('Stroke') ?? undefined);\n const fill = normalizeXpsColor(element.getAttribute('Fill') ?? undefined);\n const opacity = numberAttr(element, 'Opacity');\n return {\n type: 'XPS_PATH',\n kind: 'path',\n commands,\n color: stroke ?? fill ?? '#ffffff',\n fillColor: fill,\n lineweight: numberAttr(element, 'StrokeThickness') ?? 1,\n opacity,\n pageIndex,\n raw: element.outerHTML\n };\n}\n\nfunction parseGlyphsElement(element: Element, matrix: Matrix2D, pageHeight: number, pageIndex: number): CadEntity | undefined {\n const text = element.getAttribute('UnicodeString') ?? element.getAttribute('Indices') ?? '';\n if (!text) return undefined;\n const origin = { x: numberAttr(element, 'OriginX') ?? 0, y: numberAttr(element, 'OriginY') ?? 0 };\n const p = pageToCadPoint(transformPoint(origin, matrix), pageHeight);\n return {\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: p,\n text,\n textHeight: numberAttr(element, 'FontRenderingEmSize') ?? 12,\n color: normalizeXpsColor(element.getAttribute('Fill') ?? undefined) ?? '#ffffff',\n opacity: numberAttr(element, 'Opacity'),\n pageIndex,\n raw: element.outerHTML\n };\n}\n\nfunction parseImageBrushElement(element: Element, matrix: Matrix2D, pageHeight: number, pageIndex: number, pageName: string, files: Record<string, Uint8Array>): CadEntity | undefined {\n const src = element.getAttribute('ImageSource');\n if (!src) return undefined;\n const viewport = element.getAttribute('Viewport')?.match(/-?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?/g)?.map(Number) ?? [];\n const x = viewport[0] ?? 0;\n const y = viewport[1] ?? 0;\n const w = viewport[2] ?? 32;\n const h = viewport[3] ?? 32;\n const p = pageToCadPoint(transformPoint({ x, y }, matrix), pageHeight);\n const imageName = resolvePackagePath(pageName, src);\n const data = files[imageName.replace(/^\\//, '')] ?? files[imageName];\n return {\n type: 'DWF_IMAGE',\n kind: 'image',\n insertionPoint: p,\n width: w,\n height: h,\n imageSource: src,\n imageDataUrl: data ? bytesToDataUrl(data, imageName) : undefined,\n pageIndex,\n raw: element.outerHTML\n };\n}\n\nfunction parseXpsPathData(data: string): CadPathCommand[] {\n const tokens = data.match(/[AaCcHhLlMmQqSsVvZz]|-?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?/g) ?? [];\n const out: CadPathCommand[] = [];\n let i = 0;\n let cmd = '';\n let current: CadPoint2D = { x: 0, y: 0 };\n let subpathStart: CadPoint2D = { x: 0, y: 0 };\n const isCommand = (token: string) => /^[A-Za-z]$/.test(token);\n const read = () => Number(tokens[i++]);\n while (i < tokens.length) {\n if (isCommand(tokens[i])) cmd = tokens[i++];\n if (!cmd) break;\n const relative = cmd === cmd.toLowerCase();\n const upper = cmd.toUpperCase();\n if (upper === 'Z') {\n out.push({ cmd: 'Z', points: [] });\n current = { ...subpathStart };\n cmd = '';\n continue;\n }\n if (upper === 'M') {\n const x = read(); const y = read();\n if (!Number.isFinite(x) || !Number.isFinite(y)) break;\n current = makePoint(x, y, relative, current);\n subpathStart = { ...current };\n out.push({ cmd: 'M', points: [current] });\n cmd = relative ? 'l' : 'L';\n continue;\n }\n if (upper === 'L') {\n const x = read(); const y = read();\n if (!Number.isFinite(x) || !Number.isFinite(y)) break;\n current = makePoint(x, y, relative, current);\n out.push({ cmd: 'L', points: [current] });\n continue;\n }\n if (upper === 'H') {\n const x = read();\n if (!Number.isFinite(x)) break;\n current = { x: relative ? current.x + x : x, y: current.y };\n out.push({ cmd: 'L', points: [current] });\n continue;\n }\n if (upper === 'V') {\n const y = read();\n if (!Number.isFinite(y)) break;\n current = { x: current.x, y: relative ? current.y + y : y };\n out.push({ cmd: 'L', points: [current] });\n continue;\n }\n if (upper === 'C') {\n const p1 = makePoint(read(), read(), relative, current);\n const p2 = makePoint(read(), read(), relative, current);\n const p3 = makePoint(read(), read(), relative, current);\n if (![p1.x, p1.y, p2.x, p2.y, p3.x, p3.y].every(Number.isFinite)) break;\n current = p3;\n out.push({ cmd: 'C', points: [p1, p2, p3] });\n continue;\n }\n if (upper === 'Q' || upper === 'S') {\n const p1 = makePoint(read(), read(), relative, current);\n const p2 = makePoint(read(), read(), relative, current);\n if (![p1.x, p1.y, p2.x, p2.y].every(Number.isFinite)) break;\n current = p2;\n out.push({ cmd: 'Q', points: [p1, p2] });\n continue;\n }\n if (upper === 'A') {\n // XPS/SVG elliptical arc: rx ry xrot largeArc sweep x y. Canvas renderer approximates it as a line to the endpoint.\n read(); read(); read(); read(); read();\n const end = makePoint(read(), read(), relative, current);\n if (![end.x, end.y].every(Number.isFinite)) break;\n current = end;\n out.push({ cmd: 'L', points: [end] });\n continue;\n }\n break;\n }\n return out;\n}\n\nfunction makePoint(x: number, y: number, relative: boolean, current: CadPoint2D): CadPoint2D {\n return relative ? { x: current.x + x, y: current.y + y } : { x, y };\n}\n\nfunction pageToCadPoint(point: CadPoint2D, pageHeight: number): CadPoint2D {\n return { x: point.x, y: pageHeight - point.y };\n}\n\nfunction findGeometryData(element: Element): string | undefined {\n for (const child of Array.from(element.children)) {\n if (/PathGeometry$/i.test(child.nodeName)) {\n const figures = child.getAttribute('Figures');\n if (figures) return figures;\n }\n }\n return undefined;\n}\n\nfunction parseElementTransform(element: Element): Matrix2D | undefined {\n return parseMatrix(element.getAttribute('RenderTransform'))\n ?? parseMatrix(element.getAttribute('Transform'))\n ?? parseChildMatrix(element, 'RenderTransform')\n ?? parseChildMatrix(element, 'Canvas.RenderTransform')\n ?? parseChildMatrix(element, 'Path.RenderTransform')\n ?? parseChildMatrix(element, 'Glyphs.RenderTransform');\n}\n\nfunction parseChildMatrix(element: Element, tag: string): Matrix2D | undefined {\n for (const child of Array.from(element.children)) {\n if (stripNamespace(child.nodeName) !== tag && child.nodeName !== tag) continue;\n const matrix = child.textContent ? parseMatrix(child.textContent) : undefined;\n if (matrix) return matrix;\n for (const nested of Array.from(child.children)) {\n const candidate = parseMatrix(nested.getAttribute('Matrix') ?? nested.textContent ?? undefined);\n if (candidate) return candidate;\n }\n }\n return undefined;\n}\n\nfunction numberAttr(element: Element, name: string): number | undefined {\n const value = element.getAttribute(name);\n const n = value === null ? NaN : Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction stripNamespace(name: string): string {\n return name.includes(':') ? name.split(':').pop() ?? name : name;\n}\n\nfunction resolvePackagePath(baseFile: string, relative: string): string {\n if (relative.startsWith('/')) return relative.slice(1);\n const dir = baseFile.includes('/') ? baseFile.slice(0, baseFile.lastIndexOf('/') + 1) : '';\n const stack = `${dir}${relative}`.split('/');\n const out: string[] = [];\n for (const part of stack) {\n if (!part || part === '.') continue;\n if (part === '..') out.pop();\n else out.push(part);\n }\n return out.join('/');\n}\n\nfunction bytesToDataUrl(bytes: Uint8Array, name: string): string {\n const mime = /\\.jpe?g$/i.test(name) ? 'image/jpeg' : /\\.webp$/i.test(name) ? 'image/webp' : 'image/png';\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return `data:${mime};base64,${btoa(binary)}`;\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, DwfUnsupportedError } from './dwf/DwfLoader';\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 } from '../core/entity';\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 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.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.document = document;\n this.bounds = this.computeBounds(document);\n this.fitToView();\n }\n\n getDocument(): CadDocument | undefined {\n return this.document;\n }\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): 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 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 const a = this.worldToScreen(start);\n const b = this.worldToScreen(end);\n this.beginStyledPath(e);\n this.ctx.moveTo(a.x, a.y);\n this.ctx.lineTo(b.x, b.y);\n this.finishStroke();\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 const c = this.worldToScreen(center);\n this.beginStyledPath(e);\n this.ctx.arc(c.x, c.y, Math.abs(radius) * this.view.scale, 0, Math.PI * 2);\n this.finishStroke();\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 = Boolean(e.isClosed) || (Number(e.flag) & 1) === 1;\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 inherited = 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 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 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 } from '../core/entity';\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 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 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 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.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.document = document;\n this.bounds = computeBounds(document, this.opts);\n this.disposeScene();\n const cpuScene = buildCpuScene(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 setOptions(options: CanvasViewerOptions): void {\n const rebuildRequired = requiresSceneRebuild(this.opts, options);\n this.opts = { ...this.opts, ...options };\n if (rebuildRequired && this.document) {\n this.setDocument(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(2, Math.min(12, 4 * 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 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.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 pointBatches = upload(cpu.pointBatches);\n return {\n origin: cpu.origin,\n lineBatches,\n triangleBatches,\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 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 pointBatches = finalizeMutableBatches(this.pointBuckets, this.maxVerticesPerBatch);\n this.stats.primitiveCount = this.primitiveCount;\n return {\n origin: this.origin,\n lineBatches,\n triangleBatches,\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.addSegment(e.startPoint, e.endPoint, this.strokeBytes(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));\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));\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 = Boolean(e.isClosed) || (Number(e.flag) & 1) === 1;\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));\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));\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 inherited = applyByBlockColorInheritance(child, e, this.document, this.colorOptions());\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));\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);\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));\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));\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): void {\n const valid = points.filter(isFinitePoint).map(xy);\n if (valid.length < 2) return;\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 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 type { CadDocument, CadLoadInput, CadLoadOptions, CadLoadProgress, CadLoadResult, CadLoader } 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 /** Rendering backend. `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 private readonly options: Required<Pick<CadViewerOptions, 'autoFit'>> & CadViewerOptions;\n private lastResult?: CadViewerLoadResult;\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 if (!options.canvas && options.container) {\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\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 try {\n const result = await this.registry.load({ file, fileName: file.name }, this.mergeLoadOptions(options));\n return this.applyLoadResult(result, file.name);\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n async loadBuffer(buffer: ArrayBuffer | Uint8Array, fileName?: string, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(buffer);\n try {\n const result = await this.registry.load({ buffer, fileName }, this.mergeLoadOptions(options));\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 async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(input);\n try {\n const result = await this.registry.load(input, this.mergeLoadOptions(options));\n return this.applyLoadResult(result, input.fileName ?? input.file?.name);\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n setDocument(document: CadDocument, fileName?: string): CadViewerLoadResult {\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 { this.renderer.fitToView(); }\n zoomIn(): void { this.renderer.zoomIn(); }\n zoomOut(): void { this.renderer.zoomOut(); }\n resize(): void { this.renderer.resize(); }\n setCanvasOptions(options: CanvasViewerOptions): void { this.renderer.setOptions(options); }\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 clear(): void { this.lastResult = undefined; this.renderer.clear(); }\n destroy(): void {\n for (const loader of this.registry.list()) {\n const maybeDisposable = loader as unknown as { terminateWorker?: () => void; destroy?: () => void };\n maybeDisposable.terminateWorker?.();\n maybeDisposable.destroy?.();\n }\n this.renderer.destroy();\n }\n getLoadResult(): CadViewerLoadResult | undefined { return this.lastResult; }\n getDocument(): CadDocument | undefined { return this.renderer.getDocument(); }\n getZoomPercent(): number { return this.renderer.getZoomPercent(); }\n\n private applyLoadResult(result: CadLoadResult, fileName?: string): CadViewerLoadResult {\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 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 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"],"names":["readInputBytes","input","exactArrayBuffer","bytes","extensionOf","name","_a","index","detectCadFormat","ext","sig","ascii","head","b","decodeUtf8","CadLoaderRegistry","loaders","__publicField","loader","item","loaderId","format","direct","fallback","options","DwgWorkerClient","supportsDwgWorker","worker","requestId","timeout","fileName","transferBuffer","prepareTransferBuffer","_b","resolve","reject","createAbortError","pending","serializeOptions","error","cleanupPending","createWorker","event","message","_documentCurrentScript","resolveWasmPathForWorker","wasmPath","candidate","getPageOrigin","isAbsoluteUrl","getPageBaseUrl","value","DwgLoader","defaults","merged","sourceName","isAbortError","normalizeWorkerError","createCadDocument","init","inferEntityKind","type","normalizeCadEntity","raw","forcedType","entity","stringOrUndefined","numericColorMode","rawColorNumber","numberOrUndefined","explicitAci","explicitTrueColor","rawColorLooksRgb","pointFromUnknown","vertices","normalizePoints","controlPoints","fitPoints","record","x","y","zCandidate","z","out","p","rec","vertex","bulge","startWidth","endWidth","summarizeCadDocument","document","byType","addLayer","target","layer","addBlock","block","flattenPages","pages","page","n","emptyBounds","boundsValid","bounds","includePoint","point","isFinitePoint","includeCircle","center","radius","r","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","started","decodeDxfText","warnings","parsed","parseWithDxfParser","parseDxfFallback","normalizeDxfDatabase","elapsedMs","module","Parser","layers","extractDxfLayers","blocks","extractDxfBlocks","entities","normalizeDxfEntity","rawColor","normalizeRotation","normalizeAngle","sx","sy","sz","control","normalizeControlPoints","fit","normalizeHatchLoops","normalizeSolidVertices","result","tables","layerTable","candidates","expandRecords","addDxfBlock","blockValue","fallbackName","loops","loop","utf8","lines","pairs","code","section","current","polyline","pair","flushEntity","v","readPoint","readNumber","e","entityFromPairs","common","readString","degreesToRadiansSafe","readJoinedText","readLwPolylineVertices","readRepeatedPoints","found","xCode","yCode","zCode","yPair","zPair","j","chunks","BASE_ACI","colorFromAci","foreground","normalized","colorFromTrueColor","byteOrder","int","a","c","parseCssColor","normalizeXpsColor","obj","g","trimmed","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","background","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","values","keys","key","rgba","part","hasPercent","clampByte","channels","s","l1","l2","hi","lo","IDENTITY_MATRIX","multiplyMatrix","left","right","translationMatrix","rotationMatrix","angle","scaleMatrix","transformPoint","matrix","transformPathCommands","commands","command","matrixFromInsert","basePoint","insertion","scaleValue","transformEntity","clone","origin","scaleApprox","parseMatrix","numbers","d","f","DwfUnsupportedError","DwfLoader","packageFiles","openZipPackage","parseXpsPages","entries","hasWhip","hasDwfManifest","unzipSync","files","pageEntries","data","xml","parseFixedPage","root","width","numberAttr","height","walkElement","element","localMatrix","parseElementTransform","tag","stripNamespace","pathEntity","parsePathElement","textEntity","parseGlyphsElement","image","parseImageBrushElement","visitor","local","child","pageHeight","pageIndex","findGeometryData","parseXpsPathData","pageToCadPoint","stroke","fill","opacity","pageName","src","viewport","w","imageName","resolvePackagePath","bytesToDataUrl","tokens","cmd","subpathStart","isCommand","token","read","relative","upper","makePoint","p3","figures","parseChildMatrix","nested","baseFile","stack","mime","binary","byte","createDefaultLoaderRegistry","DEFAULT_OPTIONS","CadCanvasRenderer","canvas","ctx","padding","h","bw","bh","scale","factor","anchor","before","after","view","cloneStats","ev","stopDrag","depth","fillColor","lw","closed","segment","inherited","attr","first","points","pixelHeight","line","valid","kind","stats","DEFAULT_WEBGL_OPTIONS","CadWebGLRenderer","gl","createWebGLContext","createProgramInfo","isWebGLAvailable","computeBounds","cpuScene","buildCpuScene","uploadScene","createStatsFromScene","rebuildRequired","requiresSceneRebuild","cssToRgbaBytes","visiblePrimitiveCount","culledPrimitiveCount","scene","visibleBounds","lineCounts","triangleCounts","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","pointBatches","buffer","opts","builder","CpuSceneBuilder","finalizeMutableBatches","approxWidth","approxHeight","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","match","percent","nums","CadViewer","createRenderer","file","normalizeError","_d","_c","_e","maybeDisposable","baseProgress","overrideProgress","progress","createCadViewer","backend"],"mappings":"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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,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,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,UAA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"}
|