@flyfish-dev/cad-viewer 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"cad-viewer.es.js","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","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","h","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","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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,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AACvF;AAoB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"}
1
+ {"version":3,"file":"cad-viewer.es.js","sources":["../src/core/format.ts","../src/loaders/CadLoaderRegistry.ts","../src/loaders/dwg/DwgWorkerClient.ts","../src/loaders/dwg/DwgLoader.ts","../src/core/entity.ts","../src/core/geometry.ts","../src/loaders/dxf/DxfLoader.ts","../src/loaders/dwf/DwfLoader.ts","../src/loaders/index.ts","../src/core/types.ts","../src/core/color.ts","../src/core/transform.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 { DwfViewer, openDwfDocument, type DwfViewerOptions, type LoadedDwfDocument, type LoadOptions as DwfLoadOptions, type PageData, type RenderStats as DwfRenderStats, type W2dPrimitive } from 'dwf-viewer';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadDocument, CadEntity, CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadNativeRenderableLoader, CadPage, CadPathCommand, CadPoint3D } from '../../core/types';\n\nexport class DwfLoader implements CadNativeRenderableLoader {\n readonly id = 'dwf';\n readonly label = 'DWF/DWFx native viewer powered by dwf-viewer';\n readonly formats = ['dwf', 'dwfx', 'xps'] as const;\n readonly nativeRenderer = true as const;\n private readonly defaults: CadLoadOptions;\n private native?: DwfViewer;\n private host?: HTMLElement;\n private lastStats?: DwfRenderStats;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n const ext = extensionOf(input);\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwf' || format === 'dwfx' || format === 'xps';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Opening DWF/DWFx with dwf-viewer…', percent: 48 });\n const loaded = await openDwfDocument(bytes, { fileName: sourceName });\n merged.onProgress?.({ phase: 'normalize', format, message: 'Reading DWF pages, sheets and model metadata…', percent: 76 });\n\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx document ready.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n async mount(input: CadLoadInput, host: HTMLElement, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n const wasmUrl = resolveDwfWasmUrl(merged);\n const background = resolveDwfBackground(merged);\n const viewerOptions = buildDwfViewerOptions(merged, wasmUrl, background);\n const loadOptions = buildDwfLoadOptions(merged, wasmUrl, background);\n\n merged.onProgress?.({ phase: 'native-render', format, message: 'Mounting native DWF renderer…', percent: 28 });\n this.unmount();\n this.host = host;\n host.replaceChildren();\n this.native = new DwfViewer(host, viewerOptions);\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Parsing DWF package and page streams…', percent: 58 });\n await this.native.load(bytes, {\n fileName: sourceName,\n ...loadOptions\n });\n\n merged.onProgress?.({ phase: 'render', format, message: 'Rendering DWF/DWFx with dwf-viewer…', percent: 88 });\n this.lastStats = await this.native.render();\n const loaded = this.native.getDocument();\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n document.metadata.loaderMode = 'Native DWF';\n document.metadata.nativeRenderer = 'dwf-viewer';\n document.metadata.nativeRenderStats = this.lastStats ? { ...this.lastStats, warnings: this.lastStats.warnings.length } : undefined;\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx rendered.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n unmount(): void {\n this.native?.dispose();\n this.native = undefined;\n this.lastStats = undefined;\n if (this.host) this.host.replaceChildren();\n }\n\n fit(): void {\n this.native?.fit();\n }\n\n zoomIn(): void {\n const button = (this.native as unknown as { zoomInButton?: HTMLButtonElement } | undefined)?.zoomInButton;\n button?.click();\n }\n\n zoomOut(): void {\n const button = (this.native as unknown as { zoomOutButton?: HTMLButtonElement } | undefined)?.zoomOutButton;\n button?.click();\n }\n\n resize(): void {\n void this.native?.render();\n }\n\n setNativeOptions(options: CadLoadOptions): void {\n const native = this.native as unknown as {\n background?: string;\n setPreferWebgl?: (value: boolean) => void;\n setPreferWasm?: (value: boolean) => void;\n setLineWeightMode?: (value: NonNullable<CadLoadOptions['dwfLineWeightMode']>) => void;\n minStrokeCssPx?: number;\n maxOverviewStrokeCssPx?: number;\n minTextCssPx?: number;\n minFilledAreaCssPx?: number;\n render?: () => Promise<unknown>;\n } | undefined;\n if (!native) return;\n if (typeof options.dwfBackground === 'string') native.background = options.dwfBackground;\n else {\n const background = resolveDwfBackground(options);\n if (background) native.background = background;\n }\n if (typeof options.dwfPreferWebgl === 'boolean') native.setPreferWebgl?.(options.dwfPreferWebgl);\n if (typeof options.dwfPreferWasm === 'boolean') native.setPreferWasm?.(options.dwfPreferWasm);\n if (options.dwfLineWeightMode) native.setLineWeightMode?.(options.dwfLineWeightMode);\n setOptionalNumber(native, 'minStrokeCssPx', options.dwfMinStrokeCssPx);\n setOptionalNumber(native, 'maxOverviewStrokeCssPx', options.dwfMaxOverviewStrokeCssPx);\n setOptionalNumber(native, 'minTextCssPx', options.dwfMinTextCssPx);\n setOptionalNumber(native, 'minFilledAreaCssPx', options.dwfMinFilledAreaCssPx);\n void native.render?.();\n }\n\n getLastNativeStats(): DwfRenderStats | undefined {\n return this.lastStats;\n }\n}\n\nfunction cadDocumentFromDwf(loaded: LoadedDwfDocument | undefined, sourceName: string | undefined, format: CadFormat, keepRaw: boolean): CadDocument {\n const warnings = diagnosticsToWarnings(loaded?.diagnostics ?? []);\n const pages = (loaded?.pageData ?? []).map((page, index) => pageToCadPage(page, index));\n for (const page of loaded?.pageData ?? []) warnings.push(...diagnosticsToWarnings(page.diagnostics));\n const metadata = {\n parser: 'dwf-viewer',\n nativeRenderer: 'dwf-viewer',\n dwfKind: loaded?.kind,\n packageEntries: loaded?.packageEntries?.length ?? 0,\n resources: loaded?.resources?.length ?? 0,\n pageKinds: countBy((loaded?.pageData ?? []).map((page) => page.kind)),\n pageNames: (loaded?.pages ?? []).map((page) => page.name)\n };\n return createCadDocument({\n format,\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata,\n warnings: unique(warnings),\n raw: keepRaw ? loaded : undefined\n });\n}\n\nfunction pageToCadPage(page: PageData, index: number): CadPage {\n const entities = pageEntities(page, index);\n return {\n index,\n name: page.name || page.sourcePath || `${index + 1}`,\n width: page.width || 1000,\n height: page.height || 1000,\n entities\n };\n}\n\nfunction pageEntities(page: PageData, pageIndex: number): CadEntity[] {\n if (page.kind === 'w2d-text') return page.primitives.flatMap((primitive, index) => primitiveToEntity(primitive, pageIndex, index));\n if (page.kind === 'image') {\n return [{ type: 'DWF_IMAGE_PAGE', kind: 'image', pageIndex, width: page.width, height: page.height, imageSource: page.sourcePath }];\n }\n if (page.kind === 'w3d-model') {\n return page.model.meshes.map((mesh, index) => ({\n id: mesh.id,\n type: 'W3D_MESH',\n kind: 'solid',\n pageIndex,\n color: mesh.color ? rgbToHex(mesh.color) : undefined,\n name: mesh.name || `mesh-${index + 1}`,\n raw: { vertexCount: mesh.vertexCount, triangleCount: mesh.triangleCount, materialId: mesh.materialId }\n }));\n }\n if (page.kind === 'xps-fixed-page') {\n return [{ type: 'XPS_FIXED_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n }\n return [{ type: 'DWF_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n}\n\nfunction primitiveToEntity(primitive: W2dPrimitive, pageIndex: number, index: number): CadEntity[] {\n const base = {\n id: `dwf-${pageIndex}-${index}`,\n pageIndex,\n color: primitive.stroke,\n fillColor: primitive.fill,\n lineweight: primitive.lineWidth,\n raw: { matrix: primitive.matrix }\n } satisfies Partial<CadEntity>;\n if (primitive.type === 'polyline' || primitive.type === 'polygon') {\n return [{\n ...base,\n type: primitive.type === 'polygon' ? 'DWF_POLYGON' : 'DWF_POLYLINE',\n kind: 'polyline',\n vertices: pointsArrayToCadPoints(primitive.points),\n isClosed: primitive.type === 'polygon'\n }];\n }\n if (primitive.type === 'path') {\n return [{ ...base, type: 'DWF_PATH', kind: 'path', commands: primitive.commands as unknown as CadPathCommand[] }];\n }\n if (primitive.type === 'text') {\n return [{\n ...base,\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: { x: primitive.x, y: primitive.y, z: 0 },\n text: primitive.text,\n textHeight: primitive.size\n }];\n }\n if (primitive.type === 'rect') {\n const x = primitive.x;\n const y = primitive.y;\n const w = primitive.width;\n const h = primitive.height;\n return [{\n ...base,\n type: 'DWF_RECT',\n kind: 'polyline',\n isClosed: true,\n vertices: [\n { x, y, z: 0 },\n { x: x + w, y, z: 0 },\n { x: x + w, y: y + h, z: 0 },\n { x, y: y + h, z: 0 }\n ]\n }];\n }\n return [];\n}\n\nfunction pointsArrayToCadPoints(points: number[]): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) out.push({ x: points[i], y: points[i + 1], z: 0 });\n return out;\n}\n\nfunction diagnosticsToWarnings(diagnostics: readonly { level: string; code: string; message: string; source?: string }[]): string[] {\n return diagnostics\n .filter((item) => item.level !== 'info')\n .map((item) => `${item.code}: ${item.message}${item.source ? ` (${item.source})` : ''}`);\n}\n\nfunction normalizeFormat(detected: CadFormat, ext: string): CadFormat {\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return ext;\n if (detected === 'dwf' || detected === 'dwfx' || detected === 'xps') return detected;\n return 'dwf';\n}\n\nfunction resolveDwfWasmUrl(options: CadLoadOptions): string | undefined {\n if (options.dwfWasmUrl) return options.dwfWasmUrl;\n if (typeof document === 'undefined') return undefined;\n const base = options.wasmPath\n ? new URL(ensureTrailingSlash(options.wasmPath), document.baseURI).href\n : new URL('wasm/', document.baseURI).href;\n return new URL('dwfv-render.wasm', base).href;\n}\n\nfunction resolveDwfBackground(options: CadLoadOptions): string {\n if (options.dwfBackground) return options.dwfBackground;\n const canvasOptions = (options as CadLoadOptions & { canvasOptions?: { background?: string } }).canvasOptions;\n return canvasOptions?.background ?? '#05070d';\n}\n\nfunction buildDwfViewerOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfViewerOptions {\n return {\n ...buildDwfLoadOptions(options, wasmUrl, background),\n maxDevicePixelRatio: options.dwfMaxDevicePixelRatio ?? 2,\n maxCanvasPixels: options.dwfMaxCanvasPixels ?? 16_777_216\n };\n}\n\nfunction buildDwfLoadOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfLoadOptions {\n return {\n wasmUrl,\n preferWebgl: options.dwfPreferWebgl ?? true,\n preferWasm: options.dwfPreferWasm ?? true,\n background,\n maxGpuCacheBytes: options.dwfMaxGpuCacheBytes ?? 160 * 1024 * 1024,\n maxCachedScenes: options.dwfMaxCachedScenes ?? 2,\n lineWeightMode: options.dwfLineWeightMode ?? 'adaptive',\n minStrokeCssPx: options.dwfMinStrokeCssPx,\n maxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,\n minTextCssPx: options.dwfMinTextCssPx,\n minFilledAreaCssPx: options.dwfMinFilledAreaCssPx\n };\n}\n\nfunction setOptionalNumber<T extends object, K extends keyof T>(target: T, key: K, value: number | undefined): void {\n if (typeof value === 'number' && Number.isFinite(value)) target[key] = value as T[K];\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction rgbToHex(rgb: [number, number, number]): string {\n const [r, g, b] = rgb.map((value) => Math.max(0, Math.min(255, Math.round(value * 255))));\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return value.toString(16).padStart(2, '0');\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const value of values) out[value] = (out[value] ?? 0) + 1;\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { CadLoaderRegistry } from './CadLoaderRegistry';\nimport { DwgLoader } from './dwg/DwgLoader';\nimport { DxfLoader } from './dxf/DxfLoader';\nimport { DwfLoader } from './dwf/DwfLoader';\nimport type { CadLoadOptions } from '../core/types';\n\nexport function createDefaultLoaderRegistry(options: CadLoadOptions = {}): CadLoaderRegistry {\n return new CadLoaderRegistry([\n new DwgLoader(options),\n new DxfLoader(options),\n new DwfLoader(options)\n ]);\n}\n\nexport { CadLoaderRegistry } from './CadLoaderRegistry';\nexport { DwgLoader, DwgWorkerClient, supportsDwgWorker } from './dwg/DwgLoader';\nexport { DxfLoader } from './dxf/DxfLoader';\nexport { DwfLoader } from './dwf/DwfLoader';\n","export type CadFormat = 'dwg' | 'dxf' | 'dwf' | 'dwfx' | 'xps' | 'unknown';\nexport type CadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';\n\nexport interface CadPoint2D {\n x: number;\n y: number;\n}\n\nexport interface CadPoint3D extends CadPoint2D {\n z?: number;\n}\n\nexport type CadPoint = CadPoint2D | CadPoint3D;\n\nexport interface CadBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface CadLayer {\n name: string;\n color?: string | number;\n colorIndex?: number;\n trueColor?: number;\n lineType?: string;\n lineweight?: number;\n isVisible?: boolean;\n isLocked?: boolean;\n isFrozen?: boolean;\n raw?: unknown;\n}\n\nexport interface CadPathCommand {\n cmd: 'M' | 'L' | 'C' | 'Q' | 'Z';\n points: CadPoint2D[];\n}\n\nexport type CadEntityKind =\n | 'line'\n | 'circle'\n | 'arc'\n | 'polyline'\n | 'ellipse'\n | 'text'\n | 'point'\n | 'insert'\n | 'solid'\n | 'hatch'\n | 'spline'\n | 'path'\n | 'image'\n | 'viewport'\n | 'unsupported';\n\nexport interface CadEntity {\n id?: string;\n type: string;\n kind?: CadEntityKind;\n handle?: string;\n layer?: string;\n color?: string | number;\n trueColor?: number | string | { r: number; g: number; b: number; a?: number };\n colorIndex?: number;\n colorNumber?: number;\n colorName?: string;\n fillColor?: string | number;\n fillColorIndex?: number;\n opacity?: number;\n lineweight?: number;\n lineType?: string;\n linetype?: string;\n isVisible?: boolean;\n isInPaperSpace?: boolean;\n\n startPoint?: CadPoint3D;\n endPoint?: CadPoint3D;\n center?: CadPoint3D;\n radius?: number;\n startAngle?: number;\n endAngle?: number;\n majorAxisEndPoint?: CadPoint3D;\n axisRatio?: number;\n vertices?: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }>;\n points?: CadPoint3D[];\n controlPoints?: CadPoint3D[];\n fitPoints?: CadPoint3D[];\n degree?: number;\n knots?: number[];\n isClosed?: boolean;\n flag?: number;\n\n insertionPoint?: CadPoint3D;\n text?: string;\n value?: string;\n height?: number;\n textHeight?: number;\n rotation?: number;\n scale?: CadPoint3D;\n name?: string;\n blockName?: string;\n attribs?: CadEntity[];\n\n loops?: Array<{ vertices?: CadPoint3D[]; commands?: CadPathCommand[]; isClosed?: boolean }>;\n commands?: CadPathCommand[];\n imageSource?: string;\n imageDataUrl?: string;\n width?: number;\n pageIndex?: number;\n\n raw?: unknown;\n [key: string]: unknown;\n}\n\nexport interface CadBlock {\n name: string;\n basePoint?: CadPoint3D;\n entities: CadEntity[];\n raw?: unknown;\n}\n\nexport interface CadPage {\n index: number;\n name?: string;\n width: number;\n height: number;\n entities: CadEntity[];\n}\n\nexport interface CadDocument {\n format: CadFormat;\n sourceName?: string;\n units?: string;\n header?: Record<string, unknown>;\n layers: Record<string, CadLayer>;\n blocks: Record<string, CadBlock>;\n entities: CadEntity[];\n pages?: CadPage[];\n metadata: Record<string, unknown>;\n warnings: string[];\n raw?: unknown;\n}\n\nexport interface CadLoadInput {\n file?: File;\n fileName?: string;\n buffer?: ArrayBuffer | Uint8Array;\n}\n\nexport type CadLoadProgressPhase =\n | 'read'\n | 'detect'\n | 'worker-start'\n | 'worker-ready'\n | 'wasm-init'\n | 'parse'\n | 'normalize'\n | 'render'\n | 'native-render'\n | 'done';\n\nexport interface CadLoadProgress {\n phase: CadLoadProgressPhase;\n message: string;\n format?: CadFormat;\n loaded?: number;\n total?: number;\n percent?: number;\n elapsedMs?: number;\n}\n\nexport interface CadLoadOptions {\n wasmPath?: string;\n preferDwgWasm?: boolean;\n maxInsertDepth?: number;\n includePaperSpace?: boolean;\n /**\n * Parse heavy formats in a Web Worker where available. DWG defaults to true\n * because LibreDWG WebAssembly initialization and decoding can block the UI.\n */\n useWorker?: boolean;\n /** Custom worker URL for bundlers/CDNs that cannot resolve the packaged worker URL. */\n workerUrl?: string | URL;\n /** Custom worker factory for applications that manage workers themselves. */\n workerFactory?: () => Worker;\n /** Milliseconds before an in-flight worker load is rejected. 0 disables timeout. */\n workerTimeoutMs?: number;\n /**\n * Transfer the input ArrayBuffer to the worker when it is safe to do so. This\n * avoids an extra copy for File inputs. ArrayBuffer inputs are copied by\n * default to avoid detaching caller-owned buffers.\n */\n transferInputBuffer?: boolean;\n /** Keep parser raw objects on the normalized document. Disabled by default for memory and worker cloning safety. */\n keepRaw?: boolean;\n /** Abort a pending load. For native parsers this terminates and recreates the worker. */\n signal?: AbortSignal;\n\n /** URL to dwf-viewer's optional 2D raster fallback WASM asset, usually /wasm/dwfv-render.wasm. */\n dwfWasmUrl?: string;\n /** Prefer dwf-viewer's WebGL paths for W2D/W3D rendering. */\n dwfPreferWebgl?: boolean;\n /** Allow dwf-viewer's WASM raster backend for complex 2D vector pages. */\n dwfPreferWasm?: boolean;\n /** Background passed to the native DWF renderer. Defaults to the active CAD canvas background. */\n dwfBackground?: string;\n /** DWF renderer device-pixel-ratio cap. */\n dwfMaxDevicePixelRatio?: number;\n /** DWF renderer maximum backing-store pixels per canvas. */\n dwfMaxCanvasPixels?: number;\n /** DWF WebGL GPU cache budget in bytes. */\n dwfMaxGpuCacheBytes?: number;\n /** Number of DWF pages/scenes kept in the native renderer cache. */\n dwfMaxCachedScenes?: number;\n /** DWF/XPS CAD line-weight rendering mode. Defaults to dwf-viewer's adaptive mode. */\n dwfLineWeightMode?: CadDwfLineWeightMode;\n /** Minimum CSS-pixel stroke used by the DWF/XPS adaptive line-weight renderer. */\n dwfMinStrokeCssPx?: number;\n /** Maximum overview stroke width before zoom restores physical line weights. */\n dwfMaxOverviewStrokeCssPx?: number;\n /** Minimum CSS-pixel text size shown in dense adaptive DWF/XPS overviews. */\n dwfMinTextCssPx?: number;\n /** Minimum filled area, in CSS pixels, shown in dense adaptive DWF/XPS overviews. */\n dwfMinFilledAreaCssPx?: number;\n /** Receives coarse loader progress events. */\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nexport interface CadLoadResult {\n document: CadDocument;\n raw?: unknown;\n bytes: number;\n elapsedMs: number;\n format: CadFormat;\n warnings: string[];\n}\n\nexport interface CadLoader {\n readonly id: string;\n readonly label: string;\n readonly formats: readonly CadFormat[];\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean;\n load(input: CadLoadInput, options?: CadLoadOptions): Promise<CadLoadResult>;\n}\n\n\n\nexport interface CadNativeRenderableLoader extends CadLoader {\n readonly nativeRenderer: true;\n mount(input: CadLoadInput, host: HTMLElement, options?: CadLoadOptions): Promise<CadLoadResult>;\n unmount(): void;\n fit?(): void;\n zoomIn?(): void;\n zoomOut?(): void;\n resize?(): void;\n setNativeOptions?(options: CadLoadOptions): void;\n}\n\nexport function isCadNativeRenderableLoader(loader: CadLoader): loader is CadNativeRenderableLoader {\n const candidate = loader as Partial<CadNativeRenderableLoader>;\n return candidate.nativeRenderer === true && typeof candidate.mount === 'function';\n}\n\nexport interface CadSummary {\n format: CadFormat;\n sourceName?: string;\n entityCount: number;\n layerCount: number;\n blockCount: number;\n pageCount: number;\n byType: Record<string, number>;\n warnings: string[];\n}\n","import type { CadDocument, CadEntity, CadLayer } from './types';\n\nconst BASE_ACI: Record<number, string> = {\n 1: '#ff0000', 2: '#ffff00', 3: '#00ff00', 4: '#00ffff', 5: '#0000ff', 6: '#ff00ff',\n 8: '#808080', 9: '#c0c0c0',\n 10: '#ff0000', 11: '#ff7f7f', 12: '#a50000', 13: '#a55252', 14: '#7f0000', 15: '#7f3f3f', 16: '#4c0000', 17: '#4c2626', 18: '#260000', 19: '#261313',\n 20: '#ff3f00', 21: '#ff9f7f', 22: '#a52900', 23: '#a56752', 24: '#7f1f00', 25: '#7f4f3f', 26: '#4c1300', 27: '#4c2f26', 28: '#260900', 29: '#261713',\n 30: '#ff7f00', 31: '#ffbf7f', 32: '#a55200', 33: '#a57c52', 34: '#7f3f00', 35: '#7f5f3f', 36: '#4c2600', 37: '#4c3926', 38: '#261300', 39: '#261c13',\n 40: '#ffbf00', 41: '#ffdf7f', 42: '#a57c00', 43: '#a59152', 44: '#7f5f00', 45: '#7f6f3f', 46: '#4c3900', 47: '#4c4226', 48: '#261c00', 49: '#262113',\n 50: '#ffff00', 51: '#ffff7f', 52: '#a5a500', 53: '#a5a552', 54: '#7f7f00', 55: '#7f7f3f', 56: '#4c4c00', 57: '#4c4c26', 58: '#262600', 59: '#262613',\n 60: '#bfff00', 61: '#dfff7f', 62: '#7ca500', 63: '#91a552', 64: '#5f7f00', 65: '#6f7f3f', 66: '#394c00', 67: '#424c26', 68: '#1c2600', 69: '#212613',\n 70: '#7fff00', 71: '#bfff7f', 72: '#52a500', 73: '#7ca552', 74: '#3f7f00', 75: '#5f7f3f', 76: '#264c00', 77: '#394c26', 78: '#132600', 79: '#1c2613',\n 80: '#3fff00', 81: '#9fff7f', 82: '#29a500', 83: '#67a552', 84: '#1f7f00', 85: '#4f7f3f', 86: '#134c00', 87: '#2f4c26', 88: '#092600', 89: '#172613',\n 90: '#00ff00', 91: '#7fff7f', 92: '#00a500', 93: '#52a552', 94: '#007f00', 95: '#3f7f3f', 96: '#004c00', 97: '#264c26', 98: '#002600', 99: '#132613',\n 100: '#00ff3f', 101: '#7fff9f', 102: '#00a529', 103: '#52a567', 104: '#007f1f', 105: '#3f7f4f', 106: '#004c13', 107: '#264c2f', 108: '#002609', 109: '#132617',\n 110: '#00ff7f', 111: '#7fffbf', 112: '#00a552', 113: '#52a57c', 114: '#007f3f', 115: '#3f7f5f', 116: '#004c26', 117: '#264c39', 118: '#002613', 119: '#13261c',\n 120: '#00ffbf', 121: '#7fffdf', 122: '#00a57c', 123: '#52a591', 124: '#007f5f', 125: '#3f7f6f', 126: '#004c39', 127: '#264c42', 128: '#00261c', 129: '#132621',\n 130: '#00ffff', 131: '#7fffff', 132: '#00a5a5', 133: '#52a5a5', 134: '#007f7f', 135: '#3f7f7f', 136: '#004c4c', 137: '#264c4c', 138: '#002626', 139: '#132626',\n 140: '#00bfff', 141: '#7fdfff', 142: '#007ca5', 143: '#5291a5', 144: '#005f7f', 145: '#3f6f7f', 146: '#00394c', 147: '#26424c', 148: '#001c26', 149: '#132126',\n 150: '#007fff', 151: '#7fbfff', 152: '#0052a5', 153: '#527ca5', 154: '#003f7f', 155: '#3f5f7f', 156: '#00264c', 157: '#26394c', 158: '#001326', 159: '#131c26',\n 160: '#003fff', 161: '#7f9fff', 162: '#0029a5', 163: '#5267a5', 164: '#001f7f', 165: '#3f4f7f', 166: '#00134c', 167: '#262f4c', 168: '#000926', 169: '#131726',\n 170: '#0000ff', 171: '#7f7fff', 172: '#0000a5', 173: '#5252a5', 174: '#00007f', 175: '#3f3f7f', 176: '#00004c', 177: '#26264c', 178: '#000026', 179: '#131326',\n 180: '#3f00ff', 181: '#9f7fff', 182: '#2900a5', 183: '#6752a5', 184: '#1f007f', 185: '#4f3f7f', 186: '#13004c', 187: '#2f264c', 188: '#090026', 189: '#171326',\n 190: '#7f00ff', 191: '#bf7fff', 192: '#5200a5', 193: '#7c52a5', 194: '#3f007f', 195: '#5f3f7f', 196: '#26004c', 197: '#39264c', 198: '#130026', 199: '#1c1326',\n 200: '#bf00ff', 201: '#df7fff', 202: '#7c00a5', 203: '#9152a5', 204: '#5f007f', 205: '#6f3f7f', 206: '#39004c', 207: '#42264c', 208: '#1c0026', 209: '#211326',\n 210: '#ff00ff', 211: '#ff7fff', 212: '#a500a5', 213: '#a552a5', 214: '#7f007f', 215: '#7f3f7f', 216: '#4c004c', 217: '#4c264c', 218: '#260026', 219: '#261326',\n 220: '#ff00bf', 221: '#ff7fdf', 222: '#a5007c', 223: '#a55291', 224: '#7f005f', 225: '#7f3f6f', 226: '#4c0039', 227: '#4c2642', 228: '#26001c', 229: '#261321',\n 230: '#ff007f', 231: '#ff7fbf', 232: '#a50052', 233: '#a5527c', 234: '#7f003f', 235: '#7f3f5f', 236: '#4c0026', 237: '#4c2639', 238: '#260013', 239: '#26131c',\n 240: '#ff003f', 241: '#ff7f9f', 242: '#a50029', 243: '#a55267', 244: '#7f001f', 245: '#7f3f4f', 246: '#4c0013', 247: '#4c262f', 248: '#260009', 249: '#261317',\n 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#bebebe', 255: '#ffffff'\n};\n\n\nexport type CadColorContrastMode = 'preserve' | 'adaptive';\n\nexport interface ColorResolveOptions {\n foreground?: string;\n background?: string;\n trueColorByteOrder?: 'rgb' | 'bgr';\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport function colorFromAci(index: number | undefined, fallback = '#ffffff', foreground = fallback): string {\n if (typeof index !== 'number' || Number.isNaN(index)) return fallback;\n const normalized = Math.abs(Math.trunc(index));\n if (normalized === 0 || normalized === 256 || normalized === 257) return fallback;\n // ACI 7 is intentionally foreground-dependent in CAD viewers: it should be\n // black on a light canvas and white on a dark canvas.\n if (normalized === 7) return foreground;\n return BASE_ACI[normalized] ?? fallback;\n}\n\nexport function colorFromTrueColor(value: number, byteOrder: 'rgb' | 'bgr' = 'rgb'): string {\n const int = Math.max(0, Math.trunc(value)) & 0xffffff;\n const a = (int >> 16) & 0xff;\n const b = (int >> 8) & 0xff;\n const c = int & 0xff;\n const red = byteOrder === 'rgb' ? a : c;\n const green = b;\n const blue = byteOrder === 'rgb' ? c : a;\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport function parseCssColor(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n if (!v) return undefined;\n if (/^(#|rgb\\(|rgba\\(|hsl\\(|hsla\\()/i.test(v)) return normalizeXpsColor(v) ?? v;\n const named: Record<string, string> = {\n red: '#ff0000',\n yellow: '#ffff00',\n green: '#00ff00',\n cyan: '#00ffff',\n blue: '#0000ff',\n magenta: '#ff00ff',\n white: '#ffffff',\n black: '#000000',\n grey: '#808080',\n gray: '#808080'\n };\n return named[v.toLowerCase()];\n }\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const r = Number(obj.r ?? obj.red);\n const g = Number(obj.g ?? obj.green);\n const b = Number(obj.b ?? obj.blue);\n const a = Number(obj.a ?? obj.alpha ?? 1);\n if ([r, g, b].every(Number.isFinite)) {\n return Number.isFinite(a) && a >= 0 && a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n }\n }\n return undefined;\n}\n\nexport function normalizeXpsColor(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^#[0-9a-f]{8}$/i.test(trimmed)) {\n const a = parseInt(trimmed.slice(1, 3), 16) / 255;\n const r = parseInt(trimmed.slice(3, 5), 16);\n const g = parseInt(trimmed.slice(5, 7), 16);\n const b = parseInt(trimmed.slice(7, 9), 16);\n return a >= 0.999 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${roundAlpha(a)})`;\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed) || /^#[0-9a-f]{3}$/i.test(trimmed)) return trimmed;\n if (/^sc#/i.test(trimmed)) {\n const parts = trimmed.slice(3).split(',').map((x) => Number(x.trim()));\n const [a, r, g, b] = parts.length === 4 ? parts : [1, ...parts];\n if ([a, r, g, b].every(Number.isFinite)) return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${roundAlpha(a)})`;\n }\n return undefined;\n}\n\nexport function resolveCadColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string {\n const foreground = options.foreground ?? '#ffffff';\n const fallback = foreground;\n let color: string | undefined;\n\n const explicit = parseCssColor(entity.trueColor) ?? parseCssColor(entity.color) ?? parseCssColor(entity.colorName);\n if (explicit) color = explicit;\n\n if (!color) {\n const trueColorCandidate = numberFromKeys(entity, ['trueColor', 'true_color', 'truecolor', 'colorRGB', 'colorRgb', 'rgbColor', 'rgb']);\n if (typeof trueColorCandidate === 'number' && trueColorCandidate >= 0 && trueColorCandidate <= 0xffffff) {\n color = colorFromTrueColor(trueColorCandidate, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (typeof aci === 'number' && Math.abs(aci) <= 257 && aci !== 256 && aci !== 0 && aci !== 257) color = colorFromAci(aci, fallback, foreground);\n }\n\n if (!color && typeof entity.color === 'number') {\n const c = Number(entity.color);\n // Most DWG/DXF JavaScript parsers expose `color` as ACI for values 1..257.\n // Treating those values as RGB is the common cause of nearly black drawings.\n if (Math.abs(c) <= 257) {\n if (c !== 0 && c !== 256 && c !== 257) color = colorFromAci(c, fallback, foreground);\n } else {\n color = colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const layer = lookupLayer(document, entity.layer);\n color = resolveLayerColor(layer, options);\n }\n\n return adaptColorForCanvas(color ?? fallback, options);\n}\n\nexport function resolveFillColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string | undefined {\n let color: string | undefined;\n const explicit = parseCssColor(entity.fillColor);\n if (explicit) color = explicit;\n if (!color && typeof entity.fillColor === 'number') {\n const n = entity.fillColor;\n color = Math.abs(n) <= 257 ? colorFromAci(n, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff') : colorFromTrueColor(n, options.trueColorByteOrder ?? 'rgb');\n }\n if (!color && typeof entity.fillColorIndex === 'number') color = colorFromAci(entity.fillColorIndex, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff');\n return color ? adaptColorForCanvas(color, options) : undefined;\n}\n\nexport function adaptColorForCanvas(color: string, options: ColorResolveOptions = {}): string {\n if (options.contrastMode !== 'adaptive') return color;\n const background = options.background ?? '#0b1020';\n const foreground = options.foreground ?? '#ffffff';\n return ensureContrast(color, background, foreground, options.minColorContrast ?? 2.4);\n}\n\nexport function ensureContrast(color: string, background: string, foreground: string, minRatio = 2.4): string {\n const fg = parseRgba(foreground) ?? { r: 255, g: 255, b: 255, a: 1 };\n const bg = parseRgba(background) ?? { r: 11, g: 16, b: 32, a: 1 };\n const raw = parseRgba(color);\n if (!raw) return color;\n\n const effective = alphaComposite(raw, bg);\n if (contrastRatio(effective, bg) >= minRatio) return color;\n\n const bgLum = relativeLuminance(bg);\n const target = bgLum < 0.5 ? { r: 255, g: 255, b: 255, a: raw.a } : { r: 0, g: 0, b: 0, a: raw.a };\n for (const amount of [0.25, 0.4, 0.55, 0.7, 0.85, 1]) {\n const mixed = mix(raw, target, amount);\n if (contrastRatio(alphaComposite(mixed, bg), bg) >= minRatio) return toCssColor(mixed);\n }\n\n if (contrastRatio(fg, bg) >= minRatio) return toCssColor(fg);\n return bgLum < 0.5 ? '#ffffff' : '#000000';\n}\n\nexport function layerVisible(layer: CadLayer | undefined): boolean {\n if (!layer) return true;\n return layer.isVisible !== false && layer.isFrozen !== true;\n}\n\nfunction resolveLayerColor(layer: CadLayer | undefined, options: ColorResolveOptions): string | undefined {\n if (!layer) return undefined;\n const foreground = options.foreground ?? '#ffffff';\n\n const trueColorText = parseCssColor(layer.trueColor);\n if (trueColorText) return trueColorText;\n if (typeof layer.trueColor === 'number' && layer.trueColor >= 0 && layer.trueColor <= 0xffffff) return colorFromTrueColor(layer.trueColor, options.trueColorByteOrder ?? 'rgb');\n\n const explicitColorText = parseCssColor(layer.color);\n if (explicitColorText) return explicitColorText;\n\n // Prefer a valid ACI index over a numeric `layer.color` when both are\n // present. LibreDWG's JS converter uses `color: 0xffffff` as a placeholder\n // for many indexed-color layers; using that value first turns drawings\n // monochrome white. The ACI index is the authoritative layer color in that\n // case.\n if (isRenderableAci(layer.colorIndex)) return colorFromAci(layer.colorIndex, foreground, foreground);\n\n if (typeof layer.color === 'number') {\n const c = Number(layer.color);\n return Math.abs(c) <= 257 ? colorFromAci(c, foreground, foreground) : colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n if (typeof layer.colorIndex === 'number') return colorFromAci(layer.colorIndex, foreground, foreground);\n return undefined;\n}\n\n\nexport function isByBlockColor(entity: CadEntity): boolean {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (aci === 0) return true;\n return entity.trueColor === undefined && entity.color === 0;\n}\n\nexport function applyByBlockColorInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): CadEntity {\n if (!isByBlockColor(entity)) return entity;\n const inheritedColor = resolveCadColor(parent, document, options);\n const clone: CadEntity = { ...entity, color: inheritedColor, trueColor: undefined, colorIndex: undefined, colorNumber: undefined };\n return clone;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name] ?? document.layers[name.toLowerCase()] ?? Object.values(document.layers).find((x) => x.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction numberFromKeys(entity: CadEntity, keys: string[]): number | undefined {\n const record = entity as Record<string, unknown>;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction parseRgba(value: string): RgbaColor | undefined {\n const input = value.trim().toLowerCase();\n if (/^#[0-9a-f]{3}$/i.test(input)) {\n return {\n r: parseInt(input[1] + input[1], 16),\n g: parseInt(input[2] + input[2], 16),\n b: parseInt(input[3] + input[3], 16),\n a: 1\n };\n }\n if (/^#[0-9a-f]{6}$/i.test(input)) {\n return {\n r: parseInt(input.slice(1, 3), 16),\n g: parseInt(input.slice(3, 5), 16),\n b: parseInt(input.slice(5, 7), 16),\n a: 1\n };\n }\n const rgba = input.match(/^rgba?\\(([^)]+)\\)$/i);\n if (rgba) {\n const parts = rgba[1].split(/[,\\s/]+/).filter(Boolean).map((part) => Number(part.replace('%', '')));\n if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n const hasPercent = /%/.test(rgba[1]);\n return {\n r: clampByte(hasPercent ? parts[0] * 2.55 : parts[0]),\n g: clampByte(hasPercent ? parts[1] * 2.55 : parts[1]),\n b: clampByte(hasPercent ? parts[2] * 2.55 : parts[2]),\n a: Number.isFinite(parts[3]) ? Math.max(0, Math.min(1, parts[3])) : 1\n };\n }\n }\n return undefined;\n}\n\nfunction alphaComposite(color: RgbaColor, background: RgbaColor): RgbaColor {\n const a = color.a + background.a * (1 - color.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (color.r * color.a + background.r * background.a * (1 - color.a)) / a,\n g: (color.g * color.a + background.g * background.a * (1 - color.a)) / a,\n b: (color.b * color.a + background.b * background.a * (1 - color.a)) / a,\n a\n };\n}\n\nfunction mix(a: RgbaColor, b: RgbaColor, amount: number): RgbaColor {\n const t = Math.max(0, Math.min(1, amount));\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a\n };\n}\n\nfunction relativeLuminance(color: RgbaColor): number {\n const channels = [color.r, color.g, color.b].map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\nfunction contrastRatio(a: RgbaColor, b: RgbaColor): number {\n const l1 = relativeLuminance(a);\n const l2 = relativeLuminance(b);\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction toCssColor(color: RgbaColor): string {\n const r = clampByte(color.r);\n const g = clampByte(color.g);\n const b = clampByte(color.b);\n return color.a < 0.999 ? `rgba(${r}, ${g}, ${b}, ${roundAlpha(color.a)})` : `rgb(${r}, ${g}, ${b})`;\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction roundAlpha(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n","import type { CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from './types';\n\nexport interface Matrix2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport const IDENTITY_MATRIX: Matrix2D = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n\nexport function multiplyMatrix(left: Matrix2D, right: Matrix2D): Matrix2D {\n return {\n a: left.a * right.a + left.c * right.b,\n b: left.b * right.a + left.d * right.b,\n c: left.a * right.c + left.c * right.d,\n d: left.b * right.c + left.d * right.d,\n e: left.a * right.e + left.c * right.f + left.e,\n f: left.b * right.e + left.d * right.f + left.f\n };\n}\n\nexport function translationMatrix(x: number, y: number): Matrix2D {\n return { a: 1, b: 0, c: 0, d: 1, e: x, f: y };\n}\n\nexport function rotationMatrix(angle: number): Matrix2D {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { a: c, b: s, c: -s, d: c, e: 0, f: 0 };\n}\n\nexport function scaleMatrix(x: number, y = x): Matrix2D {\n return { a: x, b: 0, c: 0, d: y, e: 0, f: 0 };\n}\n\nexport function transformPoint(point: CadPoint2D | CadPoint3D, matrix: Matrix2D): CadPoint3D {\n return {\n x: point.x * matrix.a + point.y * matrix.c + matrix.e,\n y: point.x * matrix.b + point.y * matrix.d + matrix.f,\n z: 'z' in point ? point.z : undefined\n };\n}\n\nexport function transformPathCommands(commands: CadPathCommand[] | undefined, matrix: Matrix2D): CadPathCommand[] | undefined {\n if (!commands) return undefined;\n return commands.map((command) => ({ cmd: command.cmd, points: command.points.map((p) => transformPoint(p, matrix)) }));\n}\n\nexport function matrixFromInsert(entity: CadEntity, basePoint: CadPoint3D = { x: 0, y: 0 }): Matrix2D {\n const insertion = entity.insertionPoint ?? { x: 0, y: 0 };\n const scaleValue = entity.scale;\n const sx = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.x ?? 1) : Number((entity as Record<string, unknown>).scaleX ?? 1);\n const sy = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.y ?? sx) : Number((entity as Record<string, unknown>).scaleY ?? sx);\n const rotation = Number(entity.rotation ?? 0);\n let matrix = translationMatrix(insertion.x, insertion.y);\n matrix = multiplyMatrix(matrix, rotationMatrix(Number.isFinite(rotation) ? rotation : 0));\n matrix = multiplyMatrix(matrix, scaleMatrix(Number.isFinite(sx) ? sx : 1, Number.isFinite(sy) ? sy : 1));\n matrix = multiplyMatrix(matrix, translationMatrix(-basePoint.x, -basePoint.y));\n return matrix;\n}\n\nexport function transformEntity(entity: CadEntity, matrix: Matrix2D): CadEntity {\n const clone: CadEntity = { ...entity, 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 { 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 { isCadNativeRenderableLoader, type CadDocument, type CadLoadInput, type CadLoadOptions, type CadLoadProgress, type CadLoadResult, type CadLoader, type CadNativeRenderableLoader } from '../core/types';\nimport { CadCanvasRenderer, type CanvasViewerOptions, type RenderStats, type ViewChangeEvent } from './CadCanvasRenderer';\nimport { CadWebGLRenderer, isWebGLAvailable } from './CadWebGLRenderer';\n\nexport type CadViewerRendererBackend = 'auto' | 'webgl' | 'canvas2d';\nexport type CadRenderer = CadCanvasRenderer | CadWebGLRenderer;\n\nexport interface CadViewerOptions extends CadLoadOptions {\n container?: HTMLElement;\n canvas?: HTMLCanvasElement;\n /** Optional DOM host used by native format viewers such as dwf-viewer. */\n nativeHost?: HTMLElement;\n /** Rendering backend for normalized DWG/DXF scenes. `auto` uses WebGL when available and falls back to Canvas2D. */\n renderer?: CadViewerRendererBackend;\n canvasOptions?: CanvasViewerOptions;\n loaders?: CadLoader[];\n registry?: CadLoaderRegistry;\n autoFit?: boolean;\n onLoadStart?: (source: File | ArrayBuffer | Uint8Array | CadLoadInput) => void;\n onLoadProgress?: (progress: CadLoadProgress) => void;\n onLoad?: (result: CadViewerLoadResult) => void;\n onError?: (error: Error) => void;\n onRenderStats?: (stats: RenderStats) => void;\n onViewChange?: (event: ViewChangeEvent) => void;\n}\n\nexport interface CadViewerLoadResult extends CadLoadResult {\n summary: ReturnType<typeof summarizeCadDocument>;\n fileName?: string;\n}\n\nexport class CadViewer {\n readonly canvas: HTMLCanvasElement;\n readonly renderer: CadRenderer;\n readonly registry: CadLoaderRegistry;\n readonly nativeHost?: HTMLElement;\n private readonly options: Required<Pick<CadViewerOptions, 'autoFit'>> & CadViewerOptions;\n private lastResult?: CadViewerLoadResult;\n private activeNativeLoader?: CadNativeRenderableLoader;\n\n constructor(options: CadViewerOptions = {}) {\n this.options = { autoFit: true, ...options };\n this.registry = options.registry ?? createDefaultLoaderRegistry(options);\n if (options.loaders) for (const loader of options.loaders) this.registry.register(loader);\n\n this.canvas = options.canvas ?? document.createElement('canvas');\n this.canvas.classList.add('cad-viewer-canvas');\n\n if (options.container) {\n options.container.classList.add('cad-viewer-container');\n if (!options.canvas) {\n this.canvas.style.width = '100%';\n this.canvas.style.height = '100%';\n this.canvas.style.display = 'block';\n options.container.appendChild(this.canvas);\n }\n this.nativeHost = options.nativeHost ?? document.createElement('div');\n this.nativeHost.classList.add('cad-viewer-native-host');\n if (!options.nativeHost) options.container.appendChild(this.nativeHost);\n } else if (options.nativeHost) {\n this.nativeHost = options.nativeHost;\n this.nativeHost.classList.add('cad-viewer-native-host');\n } else if (options.canvas?.parentElement) {\n options.canvas.parentElement.classList.add('cad-viewer-container');\n const host = document.createElement('div');\n host.classList.add('cad-viewer-native-host');\n options.canvas.parentElement.appendChild(host);\n this.nativeHost = host;\n }\n\n this.renderer = createRenderer(options.renderer ?? 'auto', this.canvas, options.canvasOptions);\n this.renderer.onStats = (stats) => this.options.onRenderStats?.(stats);\n this.renderer.onViewChange = (event) => this.options.onViewChange?.(event);\n }\n\n registerLoader(loader: CadLoader): this {\n this.registry.register(loader);\n return this;\n }\n\n async loadFile(file: File, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(file);\n return this.loadThroughRegistry({ file, fileName: file.name }, options, file.name);\n }\n\n async loadBuffer(buffer: ArrayBuffer | Uint8Array, fileName?: string, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(buffer);\n return this.loadThroughRegistry({ buffer, fileName }, options, fileName);\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadViewerLoadResult> {\n this.options.onLoadStart?.(input);\n return this.loadThroughRegistry(input, options, input.fileName ?? input.file?.name);\n }\n\n setDocument(document: CadDocument, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n const result: CadViewerLoadResult = {\n document,\n raw: document.raw,\n bytes: 0,\n elapsedMs: 0,\n format: document.format,\n warnings: document.warnings,\n summary: summarizeCadDocument(document),\n fileName\n };\n this.renderer.setDocument(document);\n if (!this.options.autoFit) this.renderer.render();\n this.lastResult = result;\n this.options.onLoad?.(result);\n return result;\n }\n\n fit(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.fit?.();\n else this.renderer.fitToView();\n }\n\n zoomIn(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomIn?.();\n else this.renderer.zoomIn();\n }\n\n zoomOut(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.zoomOut?.();\n else this.renderer.zoomOut();\n }\n\n resize(): void {\n if (this.activeNativeLoader) this.activeNativeLoader.resize?.();\n else this.renderer.resize();\n }\n\n setCanvasOptions(options: CanvasViewerOptions): void {\n this.options.canvasOptions = { ...(this.options.canvasOptions ?? {}), ...options };\n this.renderer.setOptions(options);\n if (this.activeNativeLoader) {\n this.activeNativeLoader.setNativeOptions?.({\n ...this.mergeLoadOptions({}),\n dwfBackground: options.background ?? this.options.dwfBackground\n });\n }\n }\n\n async preloadDwg(options: CadLoadOptions = {}): Promise<void> {\n const loader = this.registry.list().find((item) => item.id === 'dwg') as unknown as { preload?: (options?: CadLoadOptions) => Promise<void> } | undefined;\n if (!loader?.preload) throw new Error('The registered DWG loader does not support preload().');\n return loader.preload(this.mergeLoadOptions(options));\n }\n\n clear(): void {\n this.lastResult = undefined;\n this.deactivateNativeRenderer();\n this.renderer.clear();\n }\n\n destroy(): void {\n this.deactivateNativeRenderer();\n for (const loader of this.registry.list()) {\n const maybeDisposable = loader as unknown as { terminateWorker?: () => void; destroy?: () => void; unmount?: () => void };\n maybeDisposable.terminateWorker?.();\n maybeDisposable.unmount?.();\n maybeDisposable.destroy?.();\n }\n this.renderer.destroy();\n }\n\n getLoadResult(): CadViewerLoadResult | undefined { return this.lastResult; }\n getDocument(): CadDocument | undefined { return this.activeNativeLoader ? this.lastResult?.document : this.renderer.getDocument(); }\n getZoomPercent(): number { return this.activeNativeLoader ? 100 : this.renderer.getZoomPercent(); }\n isNativeRendererActive(): boolean { return Boolean(this.activeNativeLoader); }\n\n private async loadThroughRegistry(input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n try {\n const merged = this.mergeLoadOptions(options);\n throwIfAborted(merged.signal);\n const detected = await this.registry.detect(input);\n const normalizedInput: CadLoadInput = { ...input, buffer: detected.bytes };\n if (isCadNativeRenderableLoader(detected.loader)) {\n return await this.applyNativeLoadResult(detected.loader, normalizedInput, merged, fileName);\n }\n const result = await detected.loader.load(normalizedInput, merged);\n return this.applyLoadResult(result, fileName);\n } catch (error) {\n const normalized = normalizeError(error);\n this.options.onError?.(normalized);\n throw normalized;\n }\n }\n\n private applyLoadResult(result: CadLoadResult, fileName?: string): CadViewerLoadResult {\n this.deactivateNativeRenderer();\n this.options.onLoadProgress?.({ phase: 'render', format: result.format, message: 'Rendering normalized CAD scene…', percent: 96 });\n this.renderer.setDocument(result.document);\n if (!this.options.autoFit) this.renderer.render();\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.options.onLoad?.(value);\n return value;\n }\n\n private async applyNativeLoadResult(loader: CadNativeRenderableLoader, input: CadLoadInput, options: CadLoadOptions, fileName?: string): Promise<CadViewerLoadResult> {\n if (!this.nativeHost) {\n throw new Error('Native DWF rendering requires CadViewerOptions.container, nativeHost, or a canvas parent element.');\n }\n throwIfAborted(options.signal);\n this.renderer.clear();\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = loader;\n this.canvas.style.display = 'none';\n this.nativeHost.classList.add('is-active');\n\n try {\n const result = await loader.mount(input, this.nativeHost, options);\n throwIfAborted(options.signal);\n const value: CadViewerLoadResult = {\n ...result,\n fileName,\n summary: summarizeCadDocument(result.document)\n };\n this.lastResult = value;\n this.emitNativeRenderStats(result);\n this.options.onLoad?.(value);\n return value;\n } catch (error) {\n this.deactivateNativeRenderer();\n throw error;\n }\n }\n\n private deactivateNativeRenderer(): void {\n if (!this.activeNativeLoader && !this.nativeHost?.classList.contains('is-active')) {\n this.canvas.style.display = '';\n return;\n }\n this.activeNativeLoader?.unmount();\n this.activeNativeLoader = undefined;\n if (this.nativeHost) {\n this.nativeHost.classList.remove('is-active');\n this.nativeHost.replaceChildren();\n }\n this.canvas.style.display = '';\n }\n\n private emitNativeRenderStats(result: CadLoadResult): void {\n const metadata = result.document.metadata as { nativeRenderStats?: { backend?: string; commands?: number } };\n const commands = Number(metadata.nativeRenderStats?.commands ?? result.document.entities.length ?? 0);\n const backendText = String(metadata.nativeRenderStats?.backend ?? 'webgl');\n const backend: RenderStats['backend'] = backendText.includes('webgl') ? 'webgl' : 'canvas2d';\n this.options.onRenderStats?.({\n total: commands,\n drawn: commands,\n skipped: 0,\n byType: summarizeCadDocument(result.document).byType,\n unsupported: {},\n renderElapsedMs: result.elapsedMs,\n backend,\n primitiveCount: commands,\n visiblePrimitiveCount: commands,\n culledPrimitiveCount: 0,\n gpuMemoryBytes: undefined,\n buildElapsedMs: result.elapsedMs\n });\n }\n\n private mergeLoadOptions(options: CadLoadOptions): CadLoadOptions {\n const baseProgress = this.options.onProgress;\n const overrideProgress = options.onProgress;\n return {\n ...this.options,\n ...options,\n onProgress: (progress) => {\n this.options.onLoadProgress?.(progress);\n baseProgress?.(progress);\n if (overrideProgress && overrideProgress !== baseProgress) overrideProgress(progress);\n }\n };\n }\n}\n\nexport function createCadViewer(options: CadViewerOptions = {}): CadViewer {\n return new CadViewer(options);\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n throw new DOMException('Loading cancelled.', 'AbortError');\n}\n\nfunction createRenderer(backend: CadViewerRendererBackend, canvas: HTMLCanvasElement, options: CanvasViewerOptions = {}): CadRenderer {\n if (backend === 'canvas2d') return new CadCanvasRenderer(canvas, options);\n if (backend === 'webgl') return new CadWebGLRenderer(canvas, options);\n if (isWebGLAvailable()) {\n try {\n return new CadWebGLRenderer(canvas, options);\n } catch {\n // Fall through to Canvas2D. Some browsers report WebGL support but reject the actual context.\n }\n }\n return new CadCanvasRenderer(canvas, options);\n}\n"],"names":["readInputBytes","input","exactArrayBuffer","bytes","extensionOf","name","_a","index","detectCadFormat","ext","sig","ascii","head","b","CadLoaderRegistry","loaders","__publicField","loader","item","loaderId","format","direct","fallback","options","DwgWorkerClient","supportsDwgWorker","worker","requestId","timeout","fileName","transferBuffer","prepareTransferBuffer","_b","resolve","reject","createAbortError","pending","serializeOptions","error","cleanupPending","createWorker","event","message","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","h","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","DwfLoader","normalizeFormat","loaded","openDwfDocument","_c","cadDocumentFromDwf","_d","host","wasmUrl","resolveDwfWasmUrl","background","resolveDwfBackground","viewerOptions","buildDwfViewerOptions","loadOptions","buildDwfLoadOptions","DwfViewer","_e","button","native","setOptionalNumber","keepRaw","diagnosticsToWarnings","pageToCadPage","metadata","countBy","unique","pageEntities","pageIndex","primitive","primitiveToEntity","mesh","rgbToHex","base","pointsArrayToCadPoints","w","points","diagnostics","detected","ensureTrailingSlash","canvasOptions","key","rgb","g","toHex","values","createDefaultLoaderRegistry","isCadNativeRenderableLoader","BASE_ACI","colorFromAci","foreground","normalized","colorFromTrueColor","byteOrder","int","a","c","parseCssColor","normalizeXpsColor","obj","trimmed","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","keys","rgba","part","hasPercent","clampByte","channels","s","l1","l2","hi","lo","multiplyMatrix","left","right","translationMatrix","rotationMatrix","angle","scaleMatrix","transformPoint","matrix","transformPathCommands","commands","command","matrixFromInsert","basePoint","insertion","scaleValue","transformEntity","clone","origin","scaleApprox","DEFAULT_OPTIONS","CadCanvasRenderer","canvas","ctx","padding","bw","bh","scale","factor","anchor","before","after","view","cloneStats","ev","stopDrag","depth","fill","fillColor","lw","closed","segment","height","child","inherited","attr","first","p3","width","src","image","pixelHeight","line","valid","cmd","kind","stats","DEFAULT_WEBGL_OPTIONS","CadWebGLRenderer","gl","createWebGLContext","createProgramInfo","isWebGLAvailable","computeBounds","cpuScene","buildCpuScene","uploadScene","createStatsFromScene","rebuildRequired","requiresSceneRebuild","cssToRgbaBytes","visiblePrimitiveCount","culledPrimitiveCount","scene","visibleBounds","lineCounts","triangleCounts","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","data","buffer","opts","builder","CpuSceneBuilder","finalizeMutableBatches","approxWidth","approxHeight","stroke","added","flattenPathCommands","boundsFromPoints","entityAnchor","bucket","pushVertex","pointBounds","buckets","createMutableBatch","cx","cy","ix","iy","map","maxVerticesPerBatch","vertexCount","primitiveSize","inferPrimitiveSize","verticesPerChunk","startVertex","endVertex","lookupBlock","includeEntityBounds","push","p0","mt","c1","c2","next","opacity","match","percent","nums","CadViewer","createRenderer","file","maybeDisposable","throwIfAborted","normalizedInput","normalizeError","backend","baseProgress","overrideProgress","progress","createCadViewer"],"mappings":"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EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAAW,IAAI;AAAA,EAC3I,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EACrJ,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,EAAW,KAAK;AAAA,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"}