@flyfish-dev/cad-viewer 0.6.3 → 0.6.4

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/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 const mergedOptions = { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const text = decodeDxfText(bytes, mergedOptions.dxfEncoding);\n const warnings: string[] = [];\n let parsed: unknown;\n try {\n parsed = await parseWithDxfParser(text);\n } catch (error) {\n warnings.push(`dxf-parser failed, using built-in fallback parser: ${error instanceof Error ? error.message : String(error)}`);\n parsed = parseDxfFallback(text);\n }\n const document = normalizeDxfDatabase(parsed, input.fileName ?? input.file?.name, warnings);\n const elapsedMs = performance.now() - started;\n return { document, raw: parsed, bytes: bytes.byteLength, elapsedMs, format: 'dxf', warnings: document.warnings };\n }\n}\n\nasync function parseWithDxfParser(text: string): Promise<unknown> {\n const module = await import('dxf-parser') as { default?: new () => { parseSync(text: string): unknown }; DxfParser?: new () => { parseSync(text: string): unknown } };\n const Parser = module.default ?? module.DxfParser;\n if (!Parser) throw new Error('dxf-parser did not expose a parser constructor.');\n return new Parser().parseSync(text);\n}\n\nexport function normalizeDxfDatabase(parsed: unknown, sourceName?: string, warnings: string[] = []): CadDocument {\n const record = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};\n const layers = extractDxfLayers(record);\n const blocks = extractDxfBlocks(record);\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n\n const document = createCadDocument({\n format: 'dxf',\n sourceName,\n header: record.header && typeof record.header === 'object' ? record.header as Record<string, unknown> : {},\n layers,\n blocks,\n entities,\n metadata: { parser: 'dxf-parser + cad-viewer normalizer' },\n warnings,\n raw: parsed\n });\n if (entities.length === 0) document.warnings.push('DXF file did not expose any ENTITIES.');\n return document;\n}\n\nfunction normalizeDxfEntity(raw: Record<string, unknown>): CadEntity {\n const type = String(raw.type ?? raw.entityType ?? 'UNKNOWN').toUpperCase();\n const entity = normalizeCadEntity(raw, type);\n const rawColorNumber = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci);\n const rawColor = numberOrUndefined(raw.color);\n entity.colorIndex = rawColorNumber ?? (rawColor !== undefined && Math.abs(rawColor) <= 257 ? rawColor : undefined);\n entity.trueColor = (raw.trueColor ?? raw.true_color ?? raw.colorRGB ?? raw.trueColorValue ?? (rawColor !== undefined && Math.abs(rawColor) > 257 ? rawColor : undefined)) as CadEntity['trueColor'];\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName) ?? '0';\n entity.isClosed = Boolean(raw.shape ?? raw.closed ?? raw.isClosed) || ((Number(raw.flag ?? raw.flags ?? 0) & 1) === 1);\n\n if (type === 'LINE') {\n entity.startPoint = pointFromUnknown(raw.startPoint ?? { x: raw.x1 ?? raw.x, y: raw.y1 ?? raw.y, z: raw.z1 ?? raw.z }) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? { x: raw.x2, y: raw.y2, z: raw.z2 }) ?? entity.endPoint;\n }\n if (type === 'TEXT' || type === 'MTEXT' || type === 'ATTRIB' || type === 'ATTDEF') {\n entity.insertionPoint = pointFromUnknown(raw.startPoint ?? raw.position ?? raw.insertionPoint) ?? entity.insertionPoint;\n entity.text = normalizeDxfText(raw.text ?? raw.string ?? raw.value) ?? entity.text;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'ARC' || type === 'ELLIPSE') {\n entity.startAngle = normalizeAngle(raw.startAngle ?? raw.start_angle);\n entity.endAngle = normalizeAngle(raw.endAngle ?? raw.end_angle);\n }\n if (type === 'INSERT') {\n entity.blockName = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.blockName;\n entity.insertionPoint = pointFromUnknown(raw.position ?? raw.insertionPoint ?? raw.point) ?? entity.insertionPoint;\n const sx = numberOrUndefined(raw.xScale ?? raw.scaleX ?? raw.xscale);\n const sy = numberOrUndefined(raw.yScale ?? raw.scaleY ?? raw.yscale);\n const sz = numberOrUndefined(raw.zScale ?? raw.scaleZ ?? raw.zscale);\n if (sx !== undefined || sy !== undefined || sz !== undefined) entity.scale = { x: sx ?? 1, y: sy ?? sx ?? 1, z: sz ?? 1 };\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'SPLINE') {\n const control = normalizeControlPoints(raw.controlPoints ?? raw.control_points ?? raw.points);\n if (control.length) entity.controlPoints = control;\n const fit = normalizeControlPoints(raw.fitPoints ?? raw.fit_points);\n if (fit.length) entity.fitPoints = fit;\n }\n if (type === 'HATCH') {\n entity.loops = normalizeHatchLoops(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n if (type === 'SOLID' || type === 'TRACE' || type === '3DFACE') {\n entity.vertices = normalizeSolidVertices(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n return entity;\n}\n\nfunction extractDxfLayers(raw: Record<string, unknown>): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const tables = raw.tables as Record<string, unknown> | undefined;\n const layerTable = raw.layers ?? tables?.layer ?? tables?.LAYER ?? tables?.layers;\n const candidates = expandRecords(layerTable);\n for (const item of candidates) {\n const rec = item as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.layerName);\n if (!name) continue;\n addLayer(result, {\n name,\n color: (rec.color ?? rec.colorNumber ?? rec.colorIndex) as string | number | undefined,\n colorIndex: numberOrUndefined(rec.colorNumber ?? rec.colorIndex ?? rec.color),\n lineType: stringOrUndefined(rec.lineType ?? rec.linetype),\n isVisible: Number(rec.colorNumber ?? rec.colorIndex ?? rec.color ?? 1) >= 0,\n isFrozen: Boolean(rec.frozen),\n isLocked: Boolean(rec.locked),\n raw: rec\n });\n }\n if (!result['0']) addLayer(result, { name: '0', colorIndex: 7, isVisible: true });\n return result;\n}\n\nfunction extractDxfBlocks(raw: Record<string, unknown>): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const blocks = raw.blocks;\n if (!blocks || typeof blocks !== 'object') return result;\n if (Array.isArray(blocks)) {\n for (const block of blocks) addDxfBlock(result, block);\n } else {\n for (const [name, block] of Object.entries(blocks as Record<string, unknown>)) addDxfBlock(result, block, name);\n }\n return result;\n}\n\nfunction addDxfBlock(target: Record<string, CadBlock>, blockValue: unknown, fallbackName?: string): void {\n if (!blockValue || typeof blockValue !== 'object') return;\n const rec = blockValue as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.blockName ?? fallbackName);\n if (!name) return;\n const rawEntities = Array.isArray(rec.entities) ? rec.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n addBlock(target, { name, basePoint: pointFromUnknown(rec.basePoint ?? rec.position) ?? { x: 0, y: 0 }, entities, raw: rec });\n}\n\nfunction expandRecords(value: unknown): unknown[] {\n if (!value) return [];\n if (Array.isArray(value)) return value;\n if (typeof value !== 'object') return [];\n const rec = value as Record<string, unknown>;\n if (Array.isArray(rec.entries)) return rec.entries;\n if (Array.isArray(rec.records)) return rec.records;\n if (Array.isArray(rec.layers)) return rec.layers;\n return Object.values(rec).filter((x) => x && typeof x === 'object');\n}\n\nfunction normalizeControlPoints(value: unknown): CadPoint3D[] {\n if (!Array.isArray(value)) return [];\n return value.map(pointFromUnknown).filter((p): p is CadPoint3D => !!p);\n}\n\nfunction normalizeSolidVertices(raw: Record<string, unknown>): CadPoint3D[] {\n const direct = normalizeControlPoints(raw.vertices ?? raw.points);\n if (direct.length) return direct;\n const out: CadPoint3D[] = [];\n for (let i = 0; i < 4; i++) {\n const point = pointFromUnknown({ x: raw[`x${i}`] ?? raw[`x${i + 1}`], y: raw[`y${i}`] ?? raw[`y${i + 1}`], z: raw[`z${i}`] ?? raw[`z${i + 1}`] });\n if (point) out.push(point);\n }\n return out;\n}\n\nfunction normalizeHatchLoops(raw: Record<string, unknown>): CadEntity['loops'] {\n const loops = raw.boundaryLoops ?? raw.loops ?? raw.paths;\n if (!Array.isArray(loops)) return undefined;\n return loops.map((loop) => {\n const rec = loop as Record<string, unknown>;\n const vertices = normalizeControlPoints(rec.vertices ?? rec.points);\n return { vertices, isClosed: true };\n }).filter((loop) => loop.vertices && loop.vertices.length > 0);\n}\n\nfunction normalizeRotation(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nfunction normalizeAngle(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nexport function decodeDxfText(bytes: Uint8Array, preferredEncoding?: string): string {\n const explicitEncoding = normalizeDxfEncoding(preferredEncoding);\n if (explicitEncoding) return decodeBytes(bytes, explicitEncoding);\n\n const bomEncoding = detectBomEncoding(bytes);\n if (bomEncoding) return decodeBytes(bytes, bomEncoding);\n\n const declaredEncoding = normalizeDxfEncoding(detectDxfCodePage(bytes));\n if (declaredEncoding) return decodeBytes(bytes, declaredEncoding);\n\n const utf8 = decodeBytes(bytes, 'utf-8');\n if (!utf8.includes('\\uFFFD')) return utf8;\n\n return chooseBestLegacyDxfDecode(bytes);\n}\n\nconst DXF_CODEPAGE_ENCODING: Record<string, string> = {\n ANSI_874: 'windows-874',\n ANSI_932: 'shift_jis',\n ANSI_936: 'gb18030',\n ANSI_949: 'euc-kr',\n ANSI_950: 'big5',\n ANSI_1250: 'windows-1250',\n ANSI_1251: 'windows-1251',\n ANSI_1252: 'windows-1252',\n ANSI_1253: 'windows-1253',\n ANSI_1254: 'windows-1254',\n ANSI_1255: 'windows-1255',\n ANSI_1256: 'windows-1256',\n ANSI_1257: 'windows-1257',\n ANSI_1258: 'windows-1258',\n BIG5: 'big5',\n CP874: 'windows-874',\n CP932: 'shift_jis',\n CP936: 'gb18030',\n CP949: 'euc-kr',\n CP950: 'big5',\n CP1250: 'windows-1250',\n CP1251: 'windows-1251',\n CP1252: 'windows-1252',\n CP1253: 'windows-1253',\n CP1254: 'windows-1254',\n CP1255: 'windows-1255',\n CP1256: 'windows-1256',\n CP1257: 'windows-1257',\n CP1258: 'windows-1258',\n GB18030: 'gb18030',\n GB2312: 'gb18030',\n GBK: 'gb18030',\n SHIFT_JIS: 'shift_jis',\n SHIFTJIS: 'shift_jis',\n SJIS: 'shift_jis',\n UTF8: 'utf-8',\n UTF_8: 'utf-8',\n UTF16: 'utf-16le',\n UTF_16: 'utf-16le',\n UTF16LE: 'utf-16le',\n UTF_16LE: 'utf-16le',\n UTF16BE: 'utf-16be',\n UTF_16BE: 'utf-16be'\n};\n\nfunction detectBomEncoding(bytes: Uint8Array): string | undefined {\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) return 'utf-8';\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) return 'utf-16le';\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) return 'utf-16be';\n return undefined;\n}\n\nfunction detectDxfCodePage(bytes: Uint8Array): string | undefined {\n const header = decodeBytes(bytes.subarray(0, Math.min(bytes.byteLength, 128 * 1024)), 'iso-8859-1');\n const lines = header.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n for (let index = 0; index < lines.length - 3; index++) {\n if (lines[index]?.trim() !== '9' || lines[index + 1]?.trim().toUpperCase() !== '$DWGCODEPAGE') continue;\n for (let cursor = index + 2; cursor < Math.min(index + 10, lines.length - 1); cursor += 2) {\n const code = lines[cursor]?.trim();\n const value = lines[cursor + 1]?.trim();\n if (code === '3' && value) return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeDxfEncoding(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n const key = trimmed.replace(/[-\\s]+/g, '_').toUpperCase();\n if (DXF_CODEPAGE_ENCODING[key]) return DXF_CODEPAGE_ENCODING[key];\n const ansi = /^ANSI_(\\d{3,4})$/.exec(key);\n if (ansi) return normalizeDxfEncoding(`cp${ansi[1]}`);\n const cp = /^CP(\\d{3,4})$/.exec(key);\n if (cp) {\n if (cp[1] === '936') return 'gb18030';\n if (cp[1] === '950') return 'big5';\n if (cp[1] === '932') return 'shift_jis';\n if (cp[1] === '949') return 'euc-kr';\n return `windows-${cp[1]}`;\n }\n return trimmed;\n}\n\nfunction decodeBytes(bytes: Uint8Array, encoding: string): string {\n try {\n return new TextDecoder(encoding, { fatal: false }).decode(bytes);\n } catch {\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n }\n}\n\nfunction chooseBestLegacyDxfDecode(bytes: Uint8Array): string {\n const candidates = ['windows-1252', 'gb18030', 'big5', 'shift_jis', 'euc-kr', 'iso-8859-1'];\n let bestText = '';\n let bestScore = Number.POSITIVE_INFINITY;\n for (const encoding of candidates) {\n const text = decodeBytes(bytes, encoding);\n const score = scoreDxfDecode(text, encoding);\n if (score < bestScore) {\n bestScore = score;\n bestText = text;\n }\n }\n return bestText || decodeBytes(bytes, 'utf-8');\n}\n\nfunction scoreDxfDecode(text: string, encoding: string): number {\n const replacements = countMatches(text, /\\uFFFD/g);\n const controls = countMatches(text, /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g);\n const cjk = countMatches(text, /[\\u3400-\\u9FFF\\uF900-\\uFAFF]/g);\n const hasDxfStructure = text.includes('SECTION') && (text.includes('ENTITIES') || text.includes('HEADER'));\n let score = replacements * 10000 + controls * 1000;\n if (hasDxfStructure) score -= 500;\n if (encoding === 'windows-1252') score -= 2;\n if (encoding === 'gb18030' && cjk >= 2) score -= 50 + Math.min(cjk, 200) * 2;\n return score;\n}\n\nfunction countMatches(text: string, pattern: RegExp): number {\n return text.match(pattern)?.length ?? 0;\n}\n\nfunction normalizeDxfText(value: unknown): string | undefined {\n const text = stringOrUndefined(value);\n if (text === undefined) return undefined;\n return text\n .replace(/\\\\U\\+([0-9a-fA-F]{4,6})/g, (match, code: string) => {\n const point = Number.parseInt(code, 16);\n return Number.isFinite(point) && point >= 0 && point <= 0x10ffff ? String.fromCodePoint(point) : match;\n })\n .replace(/%%[cC]/g, '\\u2205')\n .replace(/%%[dD]/g, '\\u00b0')\n .replace(/%%[pP]/g, '\\u00b1')\n .replace(/\\\\P/g, '\\n');\n}\n\ninterface DxfPair { code: number; value: string }\n\nfunction parseDxfFallback(text: string): { header: Record<string, unknown>; tables: Record<string, unknown>; entities: CadEntity[]; blocks: Record<string, unknown> } {\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n const pairs: DxfPair[] = [];\n for (let i = 0; i < lines.length - 1; i += 2) {\n const code = Number(lines[i]?.trim());\n const value = lines[i + 1] ?? '';\n if (Number.isFinite(code)) pairs.push({ code, value: value.trimEnd() });\n }\n const entities: CadEntity[] = [];\n const blocks: Record<string, unknown> = {};\n let section = '';\n let current: DxfPair[] = [];\n let polyline: CadEntity | undefined;\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n if (pair.code === 0 && pair.value === 'SECTION') {\n section = pairs[i + 1]?.code === 2 ? pairs[i + 1].value.toUpperCase() : '';\n i++;\n continue;\n }\n if (pair.code === 0 && pair.value === 'ENDSEC') {\n flushEntity();\n section = '';\n continue;\n }\n if (section !== 'ENTITIES') continue;\n if (pair.code === 0) {\n flushEntity();\n current = [pair];\n } else current.push(pair);\n }\n flushEntity();\n return { header: {}, tables: {}, entities, blocks };\n\n function flushEntity(): void {\n if (!current.length) return;\n const type = current[0]?.value.toUpperCase();\n if (type === 'VERTEX' && polyline) {\n const v = readPoint(current, 10, 20, 30);\n if (v) (polyline.vertices ??= []).push({ ...v, bulge: readNumber(current, 42) });\n current = [];\n return;\n }\n if (type === 'SEQEND') {\n if (polyline) entities.push(polyline);\n polyline = undefined;\n current = [];\n return;\n }\n if (polyline) {\n entities.push(polyline);\n polyline = undefined;\n }\n if (!type || type === 'EOF') { current = []; return; }\n const e = entityFromPairs(type, current);\n if (type === 'POLYLINE') polyline = e;\n else entities.push(e);\n current = [];\n }\n}\n\nfunction entityFromPairs(type: string, pairs: DxfPair[]): CadEntity {\n const common: Record<string, unknown> = {\n type,\n handle: readString(pairs, 5),\n layer: readString(pairs, 8) ?? '0',\n colorIndex: readNumber(pairs, 62),\n trueColor: readNumber(pairs, 420),\n lineType: readString(pairs, 6),\n lineweight: readNumber(pairs, 370)\n };\n switch (type) {\n case 'LINE': Object.assign(common, { startPoint: readPoint(pairs, 10, 20, 30), endPoint: readPoint(pairs, 11, 21, 31) }); break;\n case 'CIRCLE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40) }); break;\n case 'ARC': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40), startAngle: degreesToRadiansSafe(readNumber(pairs, 50)), endAngle: degreesToRadiansSafe(readNumber(pairs, 51)) }); break;\n case 'POINT': Object.assign(common, { point: readPoint(pairs, 10, 20, 30) }); break;\n case 'TEXT':\n case 'MTEXT': Object.assign(common, { insertionPoint: readPoint(pairs, 10, 20, 30), text: readJoinedText(pairs), textHeight: readNumber(pairs, 40), rotation: degreesToRadiansSafe(readNumber(pairs, 50)) }); break;\n case 'LWPOLYLINE': Object.assign(common, { vertices: readLwPolylineVertices(pairs), flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'POLYLINE': Object.assign(common, { vertices: [], flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'ELLIPSE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), majorAxisEndPoint: readPoint(pairs, 11, 21, 31), axisRatio: readNumber(pairs, 40), startAngle: readNumber(pairs, 41), endAngle: readNumber(pairs, 42) }); break;\n case 'SPLINE': Object.assign(common, { controlPoints: readRepeatedPoints(pairs, 10, 20, 30), degree: readNumber(pairs, 71), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'INSERT': Object.assign(common, { name: readString(pairs, 2), blockName: readString(pairs, 2), insertionPoint: readPoint(pairs, 10, 20, 30), rotation: degreesToRadiansSafe(readNumber(pairs, 50)), scale: { x: readNumber(pairs, 41) ?? 1, y: readNumber(pairs, 42) ?? readNumber(pairs, 41) ?? 1, z: readNumber(pairs, 43) ?? 1 } }); break;\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': Object.assign(common, { vertices: [readPoint(pairs, 10, 20, 30), readPoint(pairs, 11, 21, 31), readPoint(pairs, 12, 22, 32), readPoint(pairs, 13, 23, 33)].filter(Boolean) }); break;\n }\n return normalizeDxfEntity(common);\n}\n\nfunction readNumber(pairs: DxfPair[], code: number): number | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n const n = Number(found);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction readString(pairs: DxfPair[], code: number): string | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n return found && found.length > 0 ? found : undefined;\n}\nfunction readPoint(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D | undefined {\n const x = readNumber(pairs, xCode);\n const y = readNumber(pairs, yCode);\n const z = readNumber(pairs, zCode);\n if (x === undefined || y === undefined) return undefined;\n return z === undefined ? { x, y } : { x, y, z };\n}\nfunction readRepeatedPoints(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== xCode) continue;\n const x = Number(pairs[i].value);\n const yPair = pairs.slice(i + 1).find((pair) => pair.code === yCode);\n const zPair = pairs.slice(i + 1).find((pair) => pair.code === zCode);\n const y = Number(yPair?.value);\n const z = Number(zPair?.value);\n if (Number.isFinite(x) && Number.isFinite(y)) out.push(Number.isFinite(z) ? { x, y, z } : { x, y });\n }\n return out;\n}\nfunction readLwPolylineVertices(pairs: DxfPair[]): Array<CadPoint3D & { bulge?: number }> {\n const out: Array<CadPoint3D & { bulge?: number }> = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== 10) continue;\n const x = Number(pairs[i].value);\n let y: number | undefined;\n let bulge: number | undefined;\n for (let j = i + 1; j < pairs.length; j++) {\n if (pairs[j].code === 10) break;\n if (pairs[j].code === 20) y = Number(pairs[j].value);\n if (pairs[j].code === 42) bulge = Number(pairs[j].value);\n }\n if (Number.isFinite(x) && Number.isFinite(y)) out.push({ x, y: y as number, bulge: Number.isFinite(bulge) ? bulge : undefined });\n }\n return out;\n}\nfunction readJoinedText(pairs: DxfPair[]): string | undefined {\n const chunks = pairs.filter((pair) => pair.code === 1 || pair.code === 3).map((pair) => pair.value);\n return chunks.length ? chunks.join('') : undefined;\n}\n\nfunction degreesToRadiansSafe(value: number | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? degreesToRadians(value) : undefined;\n}\n","import { DwfViewer, openDwfDocument, type DwfViewerOptions, type LoadedDwfDocument, type LoadOptions as DwfLoadOptions, type PageData, type RenderStats as DwfRenderStats, type W2dPrimitive } from 'dwf-viewer';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadDocument, CadEntity, CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadNativeRenderableLoader, CadPage, CadPathCommand, CadPoint3D } from '../../core/types';\n\nexport class DwfLoader implements CadNativeRenderableLoader {\n readonly id = 'dwf';\n readonly label = 'DWF/DWFx native viewer powered by dwf-viewer';\n readonly formats = ['dwf', 'dwfx', 'xps'] as const;\n readonly nativeRenderer = true as const;\n private readonly defaults: CadLoadOptions;\n private native?: DwfViewer;\n private host?: HTMLElement;\n private lastStats?: DwfRenderStats;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n const ext = extensionOf(input);\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwf' || format === 'dwfx' || format === 'xps';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Opening DWF/DWFx with dwf-viewer…', percent: 48 });\n const loaded = await openDwfDocument(bytes, { fileName: sourceName });\n merged.onProgress?.({ phase: 'normalize', format, message: 'Reading DWF pages, sheets and model metadata…', percent: 76 });\n\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx document ready.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n async mount(input: CadLoadInput, host: HTMLElement, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n const wasmUrl = resolveDwfWasmUrl(merged);\n const background = resolveDwfBackground(merged);\n const viewerOptions = buildDwfViewerOptions(merged, wasmUrl, background);\n const loadOptions = buildDwfLoadOptions(merged, wasmUrl, background);\n\n merged.onProgress?.({ phase: 'native-render', format, message: 'Mounting native DWF renderer…', percent: 28 });\n this.unmount();\n this.host = host;\n host.replaceChildren();\n this.native = new DwfViewer(host, viewerOptions);\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Parsing DWF package and page streams…', percent: 58 });\n await this.native.load(bytes, {\n fileName: sourceName,\n ...loadOptions\n });\n\n merged.onProgress?.({ phase: 'render', format, message: 'Rendering DWF/DWFx with dwf-viewer…', percent: 88 });\n this.lastStats = await this.native.render();\n const loaded = this.native.getDocument();\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n document.metadata.loaderMode = 'Native DWF';\n document.metadata.nativeRenderer = 'dwf-viewer';\n document.metadata.nativeRenderStats = this.lastStats ? { ...this.lastStats, warnings: this.lastStats.warnings.length } : undefined;\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx rendered.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n unmount(): void {\n this.native?.dispose();\n this.native = undefined;\n this.lastStats = undefined;\n if (this.host) this.host.replaceChildren();\n }\n\n fit(): void {\n this.native?.fit();\n }\n\n zoomIn(): void {\n const button = (this.native as unknown as { zoomInButton?: HTMLButtonElement } | undefined)?.zoomInButton;\n button?.click();\n }\n\n zoomOut(): void {\n const button = (this.native as unknown as { zoomOutButton?: HTMLButtonElement } | undefined)?.zoomOutButton;\n button?.click();\n }\n\n resize(): void {\n void this.native?.render();\n }\n\n setNativeOptions(options: CadLoadOptions): void {\n const native = this.native as unknown as {\n background?: string;\n setPreferWebgl?: (value: boolean) => void;\n setPreferWasm?: (value: boolean) => void;\n setLineWeightMode?: (value: NonNullable<CadLoadOptions['dwfLineWeightMode']>) => void;\n minStrokeCssPx?: number;\n maxOverviewStrokeCssPx?: number;\n minTextCssPx?: number;\n minFilledAreaCssPx?: number;\n render?: () => Promise<unknown>;\n } | undefined;\n if (!native) return;\n if (typeof options.dwfBackground === 'string') native.background = options.dwfBackground;\n else {\n const background = resolveDwfBackground(options);\n if (background) native.background = background;\n }\n if (typeof options.dwfPreferWebgl === 'boolean') native.setPreferWebgl?.(options.dwfPreferWebgl);\n if (typeof options.dwfPreferWasm === 'boolean') native.setPreferWasm?.(options.dwfPreferWasm);\n if (options.dwfLineWeightMode) native.setLineWeightMode?.(options.dwfLineWeightMode);\n setOptionalNumber(native, 'minStrokeCssPx', options.dwfMinStrokeCssPx);\n setOptionalNumber(native, 'maxOverviewStrokeCssPx', options.dwfMaxOverviewStrokeCssPx);\n setOptionalNumber(native, 'minTextCssPx', options.dwfMinTextCssPx);\n setOptionalNumber(native, 'minFilledAreaCssPx', options.dwfMinFilledAreaCssPx);\n void native.render?.();\n }\n\n getLastNativeStats(): DwfRenderStats | undefined {\n return this.lastStats;\n }\n}\n\nfunction cadDocumentFromDwf(loaded: LoadedDwfDocument | undefined, sourceName: string | undefined, format: CadFormat, keepRaw: boolean): CadDocument {\n const warnings = diagnosticsToWarnings(loaded?.diagnostics ?? []);\n const pages = (loaded?.pageData ?? []).map((page, index) => pageToCadPage(page, index));\n for (const page of loaded?.pageData ?? []) warnings.push(...diagnosticsToWarnings(page.diagnostics));\n const metadata = {\n parser: 'dwf-viewer',\n nativeRenderer: 'dwf-viewer',\n dwfKind: loaded?.kind,\n packageEntries: loaded?.packageEntries?.length ?? 0,\n resources: loaded?.resources?.length ?? 0,\n pageKinds: countBy((loaded?.pageData ?? []).map((page) => page.kind)),\n pageNames: (loaded?.pages ?? []).map((page) => page.name)\n };\n return createCadDocument({\n format,\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata,\n warnings: unique(warnings),\n raw: keepRaw ? loaded : undefined\n });\n}\n\nfunction pageToCadPage(page: PageData, index: number): CadPage {\n const entities = pageEntities(page, index);\n return {\n index,\n name: page.name || page.sourcePath || `${index + 1}`,\n width: page.width || 1000,\n height: page.height || 1000,\n entities\n };\n}\n\nfunction pageEntities(page: PageData, pageIndex: number): CadEntity[] {\n if (page.kind === 'w2d-text') return page.primitives.flatMap((primitive, index) => primitiveToEntity(primitive, pageIndex, index));\n if (page.kind === 'image') {\n return [{ type: 'DWF_IMAGE_PAGE', kind: 'image', pageIndex, width: page.width, height: page.height, imageSource: page.sourcePath }];\n }\n if (page.kind === 'w3d-model') {\n return page.model.meshes.map((mesh, index) => ({\n id: mesh.id,\n type: 'W3D_MESH',\n kind: 'solid',\n pageIndex,\n color: mesh.color ? rgbToHex(mesh.color) : undefined,\n name: mesh.name || `mesh-${index + 1}`,\n raw: { vertexCount: mesh.vertexCount, triangleCount: mesh.triangleCount, materialId: mesh.materialId }\n }));\n }\n if (page.kind === 'xps-fixed-page') {\n return [{ type: 'XPS_FIXED_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n }\n return [{ type: 'DWF_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n}\n\nfunction primitiveToEntity(primitive: W2dPrimitive, pageIndex: number, index: number): CadEntity[] {\n const base = {\n id: `dwf-${pageIndex}-${index}`,\n pageIndex,\n color: primitive.stroke,\n fillColor: primitive.fill,\n lineweight: primitive.lineWidth,\n raw: { matrix: primitive.matrix }\n } satisfies Partial<CadEntity>;\n if (primitive.type === 'polyline' || primitive.type === 'polygon') {\n return [{\n ...base,\n type: primitive.type === 'polygon' ? 'DWF_POLYGON' : 'DWF_POLYLINE',\n kind: 'polyline',\n vertices: pointsArrayToCadPoints(primitive.points),\n isClosed: primitive.type === 'polygon'\n }];\n }\n if (primitive.type === 'path') {\n return [{ ...base, type: 'DWF_PATH', kind: 'path', commands: primitive.commands as unknown as CadPathCommand[] }];\n }\n if (primitive.type === 'text') {\n return [{\n ...base,\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: { x: primitive.x, y: primitive.y, z: 0 },\n text: primitive.text,\n textHeight: primitive.size\n }];\n }\n if (primitive.type === 'rect') {\n const x = primitive.x;\n const y = primitive.y;\n const w = primitive.width;\n const h = primitive.height;\n return [{\n ...base,\n type: 'DWF_RECT',\n kind: 'polyline',\n isClosed: true,\n vertices: [\n { x, y, z: 0 },\n { x: x + w, y, z: 0 },\n { x: x + w, y: y + h, z: 0 },\n { x, y: y + h, z: 0 }\n ]\n }];\n }\n return [];\n}\n\nfunction pointsArrayToCadPoints(points: number[]): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) out.push({ x: points[i], y: points[i + 1], z: 0 });\n return out;\n}\n\nfunction diagnosticsToWarnings(diagnostics: readonly { level: string; code: string; message: string; source?: string }[]): string[] {\n return diagnostics\n .filter((item) => item.level !== 'info')\n .map((item) => `${item.code}: ${item.message}${item.source ? ` (${item.source})` : ''}`);\n}\n\nfunction normalizeFormat(detected: CadFormat, ext: string): CadFormat {\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return ext;\n if (detected === 'dwf' || detected === 'dwfx' || detected === 'xps') return detected;\n return 'dwf';\n}\n\nfunction resolveDwfWasmUrl(options: CadLoadOptions): string | undefined {\n if (options.dwfWasmUrl) return options.dwfWasmUrl;\n if (typeof document === 'undefined') return undefined;\n const base = options.wasmPath\n ? new URL(ensureTrailingSlash(options.wasmPath), document.baseURI).href\n : new URL('wasm/', document.baseURI).href;\n return new URL('dwfv-render.wasm', base).href;\n}\n\nfunction resolveDwfBackground(options: CadLoadOptions): string {\n if (options.dwfBackground) return options.dwfBackground;\n const canvasOptions = (options as CadLoadOptions & { canvasOptions?: { background?: string } }).canvasOptions;\n return canvasOptions?.background ?? '#05070d';\n}\n\nfunction buildDwfViewerOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfViewerOptions {\n return {\n ...buildDwfLoadOptions(options, wasmUrl, background),\n maxDevicePixelRatio: options.dwfMaxDevicePixelRatio ?? 2,\n maxCanvasPixels: options.dwfMaxCanvasPixels ?? 16_777_216\n };\n}\n\nfunction buildDwfLoadOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfLoadOptions {\n return {\n wasmUrl,\n preferWebgl: options.dwfPreferWebgl ?? true,\n preferWasm: options.dwfPreferWasm ?? true,\n background,\n maxGpuCacheBytes: options.dwfMaxGpuCacheBytes ?? 160 * 1024 * 1024,\n maxCachedScenes: options.dwfMaxCachedScenes ?? 2,\n lineWeightMode: options.dwfLineWeightMode ?? 'adaptive',\n minStrokeCssPx: options.dwfMinStrokeCssPx,\n maxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,\n minTextCssPx: options.dwfMinTextCssPx,\n minFilledAreaCssPx: options.dwfMinFilledAreaCssPx\n };\n}\n\nfunction setOptionalNumber<T extends object, K extends keyof T>(target: T, key: K, value: number | undefined): void {\n if (typeof value === 'number' && Number.isFinite(value)) target[key] = value as T[K];\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction rgbToHex(rgb: [number, number, number]): string {\n const [r, g, b] = rgb.map((value) => Math.max(0, Math.min(255, Math.round(value * 255))));\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return value.toString(16).padStart(2, '0');\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const value of values) out[value] = (out[value] ?? 0) + 1;\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { CadLoaderRegistry } from './CadLoaderRegistry';\nimport { DwgLoader } from './dwg/DwgLoader';\nimport { DxfLoader } from './dxf/DxfLoader';\nimport { DwfLoader } from './dwf/DwfLoader';\nimport type { CadLoadOptions } from '../core/types';\n\nexport function createDefaultLoaderRegistry(options: CadLoadOptions = {}): CadLoaderRegistry {\n return new CadLoaderRegistry([\n new DwgLoader(options),\n new DxfLoader(options),\n new DwfLoader(options)\n ]);\n}\n\nexport { CadLoaderRegistry } from './CadLoaderRegistry';\nexport { DwgLoader, DwgWorkerClient, supportsDwgWorker } from './dwg/DwgLoader';\nexport { DxfLoader } from './dxf/DxfLoader';\nexport { DwfLoader } from './dwf/DwfLoader';\n","export type CadFormat = 'dwg' | 'dxf' | 'dwf' | 'dwfx' | 'xps' | 'unknown';\nexport type CadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';\n\nexport interface CadPoint2D {\n x: number;\n y: number;\n}\n\nexport interface CadPoint3D extends CadPoint2D {\n z?: number;\n}\n\nexport type CadPoint = CadPoint2D | CadPoint3D;\n\nexport interface CadBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface CadLayer {\n name: string;\n color?: string | number;\n colorIndex?: number;\n trueColor?: number;\n lineType?: string;\n lineweight?: number;\n isVisible?: boolean;\n isLocked?: boolean;\n isFrozen?: boolean;\n raw?: unknown;\n}\n\nexport interface 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 /**\n * Explicit text encoding for DXF sources. DXF files normally declare this in\n * `$DWGCODEPAGE`; use this only when legacy files are missing or lying about\n * their code page, for example `gb18030`, `big5`, `shift_jis` or `windows-1252`.\n */\n dxfEncoding?: string;\n preferDwgWasm?: boolean;\n maxInsertDepth?: number;\n includePaperSpace?: boolean;\n /**\n * Parse heavy formats in a Web Worker where available. DWG defaults to true\n * because LibreDWG WebAssembly initialization and decoding can block the UI.\n */\n useWorker?: boolean;\n /** Custom worker URL for bundlers/CDNs that cannot resolve the packaged worker URL. */\n workerUrl?: string | URL;\n /** Custom worker factory for applications that manage workers themselves. */\n workerFactory?: () => Worker;\n /** Milliseconds before an in-flight worker load is rejected. 0 disables timeout. */\n workerTimeoutMs?: number;\n /**\n * Transfer the input ArrayBuffer to the worker when it is safe to do so. This\n * avoids an extra copy for File inputs. ArrayBuffer inputs are copied by\n * default to avoid detaching caller-owned buffers.\n */\n transferInputBuffer?: boolean;\n /** Keep parser raw objects on the normalized document. Disabled by default for memory and worker cloning safety. */\n keepRaw?: boolean;\n /** Abort a pending load. For native parsers this terminates and recreates the worker. */\n signal?: AbortSignal;\n\n /** URL to dwf-viewer's optional 2D raster fallback WASM asset, usually /wasm/dwfv-render.wasm. */\n dwfWasmUrl?: string;\n /** Prefer dwf-viewer's WebGL paths for W2D/W3D rendering. */\n dwfPreferWebgl?: boolean;\n /** Allow dwf-viewer's WASM raster backend for complex 2D vector pages. */\n dwfPreferWasm?: boolean;\n /** Background passed to the native DWF renderer. Defaults to the active CAD canvas background. */\n dwfBackground?: string;\n /** DWF renderer device-pixel-ratio cap. */\n dwfMaxDevicePixelRatio?: number;\n /** DWF renderer maximum backing-store pixels per canvas. */\n dwfMaxCanvasPixels?: number;\n /** DWF WebGL GPU cache budget in bytes. */\n dwfMaxGpuCacheBytes?: number;\n /** Number of DWF pages/scenes kept in the native renderer cache. */\n dwfMaxCachedScenes?: number;\n /** DWF/XPS CAD line-weight rendering mode. Defaults to dwf-viewer's adaptive mode. */\n dwfLineWeightMode?: CadDwfLineWeightMode;\n /** Minimum CSS-pixel stroke used by the DWF/XPS adaptive line-weight renderer. */\n dwfMinStrokeCssPx?: number;\n /** Maximum overview stroke width before zoom restores physical line weights. */\n dwfMaxOverviewStrokeCssPx?: number;\n /** Minimum CSS-pixel text size shown in dense adaptive DWF/XPS overviews. */\n dwfMinTextCssPx?: number;\n /** Minimum filled area, in CSS pixels, shown in dense adaptive DWF/XPS overviews. */\n dwfMinFilledAreaCssPx?: number;\n /** Receives coarse loader progress events. */\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nexport interface CadLoadResult {\n document: CadDocument;\n raw?: unknown;\n bytes: number;\n elapsedMs: number;\n format: CadFormat;\n warnings: string[];\n}\n\nexport interface CadLoader {\n readonly id: string;\n readonly label: string;\n readonly formats: readonly CadFormat[];\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean;\n load(input: CadLoadInput, options?: CadLoadOptions): Promise<CadLoadResult>;\n}\n\n\n\nexport interface CadNativeRenderableLoader extends CadLoader {\n readonly nativeRenderer: true;\n mount(input: CadLoadInput, host: HTMLElement, options?: CadLoadOptions): Promise<CadLoadResult>;\n unmount(): void;\n fit?(): void;\n zoomIn?(): void;\n zoomOut?(): void;\n resize?(): void;\n setNativeOptions?(options: CadLoadOptions): void;\n}\n\nexport function isCadNativeRenderableLoader(loader: CadLoader): loader is CadNativeRenderableLoader {\n const candidate = loader as Partial<CadNativeRenderableLoader>;\n return candidate.nativeRenderer === true && typeof candidate.mount === 'function';\n}\n\nexport interface CadSummary {\n format: CadFormat;\n sourceName?: string;\n entityCount: number;\n layerCount: number;\n blockCount: number;\n pageCount: number;\n byType: Record<string, number>;\n warnings: string[];\n}\n","import type { CadDocument, CadEntity, CadLayer } from './types';\n\nconst BASE_ACI: Record<number, string> = {\n 1: '#ff0000', 2: '#ffff00', 3: '#00ff00', 4: '#00ffff', 5: '#0000ff', 6: '#ff00ff',\n 8: '#808080', 9: '#c0c0c0',\n 10: '#ff0000', 11: '#ff7f7f', 12: '#a50000', 13: '#a55252', 14: '#7f0000', 15: '#7f3f3f', 16: '#4c0000', 17: '#4c2626', 18: '#260000', 19: '#261313',\n 20: '#ff3f00', 21: '#ff9f7f', 22: '#a52900', 23: '#a56752', 24: '#7f1f00', 25: '#7f4f3f', 26: '#4c1300', 27: '#4c2f26', 28: '#260900', 29: '#261713',\n 30: '#ff7f00', 31: '#ffbf7f', 32: '#a55200', 33: '#a57c52', 34: '#7f3f00', 35: '#7f5f3f', 36: '#4c2600', 37: '#4c3926', 38: '#261300', 39: '#261c13',\n 40: '#ffbf00', 41: '#ffdf7f', 42: '#a57c00', 43: '#a59152', 44: '#7f5f00', 45: '#7f6f3f', 46: '#4c3900', 47: '#4c4226', 48: '#261c00', 49: '#262113',\n 50: '#ffff00', 51: '#ffff7f', 52: '#a5a500', 53: '#a5a552', 54: '#7f7f00', 55: '#7f7f3f', 56: '#4c4c00', 57: '#4c4c26', 58: '#262600', 59: '#262613',\n 60: '#bfff00', 61: '#dfff7f', 62: '#7ca500', 63: '#91a552', 64: '#5f7f00', 65: '#6f7f3f', 66: '#394c00', 67: '#424c26', 68: '#1c2600', 69: '#212613',\n 70: '#7fff00', 71: '#bfff7f', 72: '#52a500', 73: '#7ca552', 74: '#3f7f00', 75: '#5f7f3f', 76: '#264c00', 77: '#394c26', 78: '#132600', 79: '#1c2613',\n 80: '#3fff00', 81: '#9fff7f', 82: '#29a500', 83: '#67a552', 84: '#1f7f00', 85: '#4f7f3f', 86: '#134c00', 87: '#2f4c26', 88: '#092600', 89: '#172613',\n 90: '#00ff00', 91: '#7fff7f', 92: '#00a500', 93: '#52a552', 94: '#007f00', 95: '#3f7f3f', 96: '#004c00', 97: '#264c26', 98: '#002600', 99: '#132613',\n 100: '#00ff3f', 101: '#7fff9f', 102: '#00a529', 103: '#52a567', 104: '#007f1f', 105: '#3f7f4f', 106: '#004c13', 107: '#264c2f', 108: '#002609', 109: '#132617',\n 110: '#00ff7f', 111: '#7fffbf', 112: '#00a552', 113: '#52a57c', 114: '#007f3f', 115: '#3f7f5f', 116: '#004c26', 117: '#264c39', 118: '#002613', 119: '#13261c',\n 120: '#00ffbf', 121: '#7fffdf', 122: '#00a57c', 123: '#52a591', 124: '#007f5f', 125: '#3f7f6f', 126: '#004c39', 127: '#264c42', 128: '#00261c', 129: '#132621',\n 130: '#00ffff', 131: '#7fffff', 132: '#00a5a5', 133: '#52a5a5', 134: '#007f7f', 135: '#3f7f7f', 136: '#004c4c', 137: '#264c4c', 138: '#002626', 139: '#132626',\n 140: '#00bfff', 141: '#7fdfff', 142: '#007ca5', 143: '#5291a5', 144: '#005f7f', 145: '#3f6f7f', 146: '#00394c', 147: '#26424c', 148: '#001c26', 149: '#132126',\n 150: '#007fff', 151: '#7fbfff', 152: '#0052a5', 153: '#527ca5', 154: '#003f7f', 155: '#3f5f7f', 156: '#00264c', 157: '#26394c', 158: '#001326', 159: '#131c26',\n 160: '#003fff', 161: '#7f9fff', 162: '#0029a5', 163: '#5267a5', 164: '#001f7f', 165: '#3f4f7f', 166: '#00134c', 167: '#262f4c', 168: '#000926', 169: '#131726',\n 170: '#0000ff', 171: '#7f7fff', 172: '#0000a5', 173: '#5252a5', 174: '#00007f', 175: '#3f3f7f', 176: '#00004c', 177: '#26264c', 178: '#000026', 179: '#131326',\n 180: '#3f00ff', 181: '#9f7fff', 182: '#2900a5', 183: '#6752a5', 184: '#1f007f', 185: '#4f3f7f', 186: '#13004c', 187: '#2f264c', 188: '#090026', 189: '#171326',\n 190: '#7f00ff', 191: '#bf7fff', 192: '#5200a5', 193: '#7c52a5', 194: '#3f007f', 195: '#5f3f7f', 196: '#26004c', 197: '#39264c', 198: '#130026', 199: '#1c1326',\n 200: '#bf00ff', 201: '#df7fff', 202: '#7c00a5', 203: '#9152a5', 204: '#5f007f', 205: '#6f3f7f', 206: '#39004c', 207: '#42264c', 208: '#1c0026', 209: '#211326',\n 210: '#ff00ff', 211: '#ff7fff', 212: '#a500a5', 213: '#a552a5', 214: '#7f007f', 215: '#7f3f7f', 216: '#4c004c', 217: '#4c264c', 218: '#260026', 219: '#261326',\n 220: '#ff00bf', 221: '#ff7fdf', 222: '#a5007c', 223: '#a55291', 224: '#7f005f', 225: '#7f3f6f', 226: '#4c0039', 227: '#4c2642', 228: '#26001c', 229: '#261321',\n 230: '#ff007f', 231: '#ff7fbf', 232: '#a50052', 233: '#a5527c', 234: '#7f003f', 235: '#7f3f5f', 236: '#4c0026', 237: '#4c2639', 238: '#260013', 239: '#26131c',\n 240: '#ff003f', 241: '#ff7f9f', 242: '#a50029', 243: '#a55267', 244: '#7f001f', 245: '#7f3f4f', 246: '#4c0013', 247: '#4c262f', 248: '#260009', 249: '#261317',\n 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#bebebe', 255: '#ffffff'\n};\n\n\nexport type CadColorContrastMode = 'preserve' | 'adaptive';\n\nexport interface ColorResolveOptions {\n foreground?: string;\n background?: string;\n trueColorByteOrder?: 'rgb' | 'bgr';\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport function colorFromAci(index: number | undefined, fallback = '#ffffff', foreground = fallback): string {\n if (typeof index !== 'number' || Number.isNaN(index)) return fallback;\n const normalized = Math.abs(Math.trunc(index));\n if (normalized === 0 || normalized === 256 || normalized === 257) return fallback;\n // ACI 7 is intentionally foreground-dependent in CAD viewers: it should be\n // black on a light canvas and white on a dark canvas.\n if (normalized === 7) return foreground;\n return BASE_ACI[normalized] ?? fallback;\n}\n\nexport function colorFromTrueColor(value: number, byteOrder: 'rgb' | 'bgr' = 'rgb'): string {\n const int = Math.max(0, Math.trunc(value)) & 0xffffff;\n const a = (int >> 16) & 0xff;\n const b = (int >> 8) & 0xff;\n const c = int & 0xff;\n const red = byteOrder === 'rgb' ? a : c;\n const green = b;\n const blue = byteOrder === 'rgb' ? c : a;\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport function parseCssColor(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n if (!v) return undefined;\n if (/^(#|rgb\\(|rgba\\(|hsl\\(|hsla\\()/i.test(v)) return normalizeXpsColor(v) ?? v;\n const named: Record<string, string> = {\n red: '#ff0000',\n yellow: '#ffff00',\n green: '#00ff00',\n cyan: '#00ffff',\n blue: '#0000ff',\n magenta: '#ff00ff',\n white: '#ffffff',\n black: '#000000',\n grey: '#808080',\n gray: '#808080'\n };\n return named[v.toLowerCase()];\n }\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const r = Number(obj.r ?? obj.red);\n const g = Number(obj.g ?? obj.green);\n const b = Number(obj.b ?? obj.blue);\n const a = Number(obj.a ?? obj.alpha ?? 1);\n if ([r, g, b].every(Number.isFinite)) {\n return Number.isFinite(a) && a >= 0 && a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n }\n }\n return undefined;\n}\n\nexport function normalizeXpsColor(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^#[0-9a-f]{8}$/i.test(trimmed)) {\n const a = parseInt(trimmed.slice(1, 3), 16) / 255;\n const r = parseInt(trimmed.slice(3, 5), 16);\n const g = parseInt(trimmed.slice(5, 7), 16);\n const b = parseInt(trimmed.slice(7, 9), 16);\n return a >= 0.999 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${roundAlpha(a)})`;\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed) || /^#[0-9a-f]{3}$/i.test(trimmed)) return trimmed;\n if (/^sc#/i.test(trimmed)) {\n const parts = trimmed.slice(3).split(',').map((x) => Number(x.trim()));\n const [a, r, g, b] = parts.length === 4 ? parts : [1, ...parts];\n if ([a, r, g, b].every(Number.isFinite)) return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${roundAlpha(a)})`;\n }\n return undefined;\n}\n\nexport function resolveCadColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string {\n const foreground = options.foreground ?? '#ffffff';\n const fallback = foreground;\n let color: string | undefined;\n\n const explicit = parseCssColor(entity.trueColor) ?? parseCssColor(entity.color) ?? parseCssColor(entity.colorName);\n if (explicit) color = explicit;\n\n if (!color) {\n const trueColorCandidate = numberFromKeys(entity, ['trueColor', 'true_color', 'truecolor', 'colorRGB', 'colorRgb', 'rgbColor', 'rgb']);\n if (typeof trueColorCandidate === 'number' && trueColorCandidate >= 0 && trueColorCandidate <= 0xffffff) {\n color = colorFromTrueColor(trueColorCandidate, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (typeof aci === 'number' && Math.abs(aci) <= 257 && aci !== 256 && aci !== 0 && aci !== 257) color = colorFromAci(aci, fallback, foreground);\n }\n\n if (!color && typeof entity.color === 'number') {\n const c = Number(entity.color);\n // Most DWG/DXF JavaScript parsers expose `color` as ACI for values 1..257.\n // Treating those values as RGB is the common cause of nearly black drawings.\n if (Math.abs(c) <= 257) {\n if (c !== 0 && c !== 256 && c !== 257) color = colorFromAci(c, fallback, foreground);\n } else {\n color = colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const layer = lookupLayer(document, entity.layer);\n color = resolveLayerColor(layer, options);\n }\n\n return adaptColorForCanvas(color ?? fallback, options);\n}\n\nexport function resolveFillColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string | undefined {\n let color: string | undefined;\n const explicit = parseCssColor(entity.fillColor);\n if (explicit) color = explicit;\n if (!color && typeof entity.fillColor === 'number') {\n const n = entity.fillColor;\n color = Math.abs(n) <= 257 ? colorFromAci(n, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff') : colorFromTrueColor(n, options.trueColorByteOrder ?? 'rgb');\n }\n if (!color && typeof entity.fillColorIndex === 'number') color = colorFromAci(entity.fillColorIndex, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff');\n return color ? adaptColorForCanvas(color, options) : undefined;\n}\n\nexport function adaptColorForCanvas(color: string, options: ColorResolveOptions = {}): string {\n if (options.contrastMode !== 'adaptive') return color;\n const background = options.background ?? '#0b1020';\n const foreground = options.foreground ?? '#ffffff';\n return ensureContrast(color, background, foreground, options.minColorContrast ?? 2.4);\n}\n\nexport function ensureContrast(color: string, background: string, foreground: string, minRatio = 2.4): string {\n const fg = parseRgba(foreground) ?? { r: 255, g: 255, b: 255, a: 1 };\n const bg = parseRgba(background) ?? { r: 11, g: 16, b: 32, a: 1 };\n const raw = parseRgba(color);\n if (!raw) return color;\n\n const effective = alphaComposite(raw, bg);\n if (contrastRatio(effective, bg) >= minRatio) return color;\n\n const bgLum = relativeLuminance(bg);\n const target = bgLum < 0.5 ? { r: 255, g: 255, b: 255, a: raw.a } : { r: 0, g: 0, b: 0, a: raw.a };\n for (const amount of [0.25, 0.4, 0.55, 0.7, 0.85, 1]) {\n const mixed = mix(raw, target, amount);\n if (contrastRatio(alphaComposite(mixed, bg), bg) >= minRatio) return toCssColor(mixed);\n }\n\n if (contrastRatio(fg, bg) >= minRatio) return toCssColor(fg);\n return bgLum < 0.5 ? '#ffffff' : '#000000';\n}\n\nexport function layerVisible(layer: CadLayer | undefined): boolean {\n if (!layer) return true;\n return layer.isVisible !== false && layer.isFrozen !== true;\n}\n\nfunction resolveLayerColor(layer: CadLayer | undefined, options: ColorResolveOptions): string | undefined {\n if (!layer) return undefined;\n const foreground = options.foreground ?? '#ffffff';\n\n const trueColorText = parseCssColor(layer.trueColor);\n if (trueColorText) return trueColorText;\n if (typeof layer.trueColor === 'number' && layer.trueColor >= 0 && layer.trueColor <= 0xffffff) return colorFromTrueColor(layer.trueColor, options.trueColorByteOrder ?? 'rgb');\n\n const explicitColorText = parseCssColor(layer.color);\n if (explicitColorText) return explicitColorText;\n\n // Prefer a valid ACI index over a numeric `layer.color` when both are\n // present. LibreDWG's JS converter uses `color: 0xffffff` as a placeholder\n // for many indexed-color layers; using that value first turns drawings\n // monochrome white. The ACI index is the authoritative layer color in that\n // case.\n if (isRenderableAci(layer.colorIndex)) return colorFromAci(layer.colorIndex, foreground, foreground);\n\n if (typeof layer.color === 'number') {\n const c = Number(layer.color);\n return Math.abs(c) <= 257 ? colorFromAci(c, foreground, foreground) : colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n if (typeof layer.colorIndex === 'number') return colorFromAci(layer.colorIndex, foreground, foreground);\n return undefined;\n}\n\n\nexport function isByBlockColor(entity: CadEntity): boolean {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (aci === 0) return true;\n return entity.trueColor === undefined && entity.color === 0;\n}\n\nexport function applyByBlockColorInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): CadEntity {\n if (!isByBlockColor(entity)) return entity;\n const inheritedColor = resolveCadColor(parent, document, options);\n const clone: CadEntity = { ...entity, color: inheritedColor, trueColor: undefined, colorIndex: undefined, colorNumber: undefined };\n return clone;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name] ?? document.layers[name.toLowerCase()] ?? Object.values(document.layers).find((x) => x.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction numberFromKeys(entity: CadEntity, keys: string[]): number | undefined {\n const record = entity as Record<string, unknown>;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction parseRgba(value: string): RgbaColor | undefined {\n const input = value.trim().toLowerCase();\n if (/^#[0-9a-f]{3}$/i.test(input)) {\n return {\n r: parseInt(input[1] + input[1], 16),\n g: parseInt(input[2] + input[2], 16),\n b: parseInt(input[3] + input[3], 16),\n a: 1\n };\n }\n if (/^#[0-9a-f]{6}$/i.test(input)) {\n return {\n r: parseInt(input.slice(1, 3), 16),\n g: parseInt(input.slice(3, 5), 16),\n b: parseInt(input.slice(5, 7), 16),\n a: 1\n };\n }\n const rgba = input.match(/^rgba?\\(([^)]+)\\)$/i);\n if (rgba) {\n const parts = rgba[1].split(/[,\\s/]+/).filter(Boolean).map((part) => Number(part.replace('%', '')));\n if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n const hasPercent = /%/.test(rgba[1]);\n return {\n r: clampByte(hasPercent ? parts[0] * 2.55 : parts[0]),\n g: clampByte(hasPercent ? parts[1] * 2.55 : parts[1]),\n b: clampByte(hasPercent ? parts[2] * 2.55 : parts[2]),\n a: Number.isFinite(parts[3]) ? Math.max(0, Math.min(1, parts[3])) : 1\n };\n }\n }\n return undefined;\n}\n\nfunction alphaComposite(color: RgbaColor, background: RgbaColor): RgbaColor {\n const a = color.a + background.a * (1 - color.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (color.r * color.a + background.r * background.a * (1 - color.a)) / a,\n g: (color.g * color.a + background.g * background.a * (1 - color.a)) / a,\n b: (color.b * color.a + background.b * background.a * (1 - color.a)) / a,\n a\n };\n}\n\nfunction mix(a: RgbaColor, b: RgbaColor, amount: number): RgbaColor {\n const t = Math.max(0, Math.min(1, amount));\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a\n };\n}\n\nfunction relativeLuminance(color: RgbaColor): number {\n const channels = [color.r, color.g, color.b].map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\nfunction contrastRatio(a: RgbaColor, b: RgbaColor): number {\n const l1 = relativeLuminance(a);\n const l2 = relativeLuminance(b);\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction toCssColor(color: RgbaColor): string {\n const r = clampByte(color.r);\n const g = clampByte(color.g);\n const b = clampByte(color.b);\n return color.a < 0.999 ? `rgba(${r}, ${g}, ${b}, ${roundAlpha(color.a)})` : `rgb(${r}, ${g}, ${b})`;\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction roundAlpha(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n","import type { CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from './types';\n\nexport interface Matrix2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport const IDENTITY_MATRIX: Matrix2D = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n\nexport function multiplyMatrix(left: Matrix2D, right: Matrix2D): Matrix2D {\n return {\n a: left.a * right.a + left.c * right.b,\n b: left.b * right.a + left.d * right.b,\n c: left.a * right.c + left.c * right.d,\n d: left.b * right.c + left.d * right.d,\n e: left.a * right.e + left.c * right.f + left.e,\n f: left.b * right.e + left.d * right.f + left.f\n };\n}\n\nexport function translationMatrix(x: number, y: number): Matrix2D {\n return { a: 1, b: 0, c: 0, d: 1, e: x, f: y };\n}\n\nexport function rotationMatrix(angle: number): Matrix2D {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { a: c, b: s, c: -s, d: c, e: 0, f: 0 };\n}\n\nexport function scaleMatrix(x: number, y = x): Matrix2D {\n return { a: x, b: 0, c: 0, d: y, e: 0, f: 0 };\n}\n\nexport function transformPoint(point: CadPoint2D | CadPoint3D, matrix: Matrix2D): CadPoint3D {\n return {\n x: point.x * matrix.a + point.y * matrix.c + matrix.e,\n y: point.x * matrix.b + point.y * matrix.d + matrix.f,\n z: 'z' in point ? point.z : undefined\n };\n}\n\nexport function transformPathCommands(commands: CadPathCommand[] | undefined, matrix: Matrix2D): CadPathCommand[] | undefined {\n if (!commands) return undefined;\n return commands.map((command) => ({ cmd: command.cmd, points: command.points.map((p) => transformPoint(p, matrix)) }));\n}\n\nexport function matrixFromInsert(entity: CadEntity, basePoint: CadPoint3D = { x: 0, y: 0 }): Matrix2D {\n const insertion = entity.insertionPoint ?? { x: 0, y: 0 };\n const scaleValue = entity.scale;\n const sx = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.x ?? 1) : Number((entity as Record<string, unknown>).scaleX ?? 1);\n const sy = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.y ?? sx) : Number((entity as Record<string, unknown>).scaleY ?? sx);\n const rotation = Number(entity.rotation ?? 0);\n let matrix = translationMatrix(insertion.x, insertion.y);\n matrix = multiplyMatrix(matrix, rotationMatrix(Number.isFinite(rotation) ? rotation : 0));\n matrix = multiplyMatrix(matrix, scaleMatrix(Number.isFinite(sx) ? sx : 1, Number.isFinite(sy) ? sy : 1));\n matrix = multiplyMatrix(matrix, translationMatrix(-basePoint.x, -basePoint.y));\n return matrix;\n}\n\nexport function transformEntity(entity: CadEntity, matrix: Matrix2D): CadEntity {\n const clone: CadEntity = { ...entity, 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","mergedOptions","started","decodeDxfText","warnings","parsed","parseWithDxfParser","parseDxfFallback","normalizeDxfDatabase","elapsedMs","module","Parser","layers","extractDxfLayers","blocks","extractDxfBlocks","entities","normalizeDxfEntity","rawColor","normalizeDxfText","normalizeRotation","normalizeAngle","sx","sy","sz","control","normalizeControlPoints","fit","normalizeHatchLoops","normalizeSolidVertices","result","tables","layerTable","candidates","expandRecords","addDxfBlock","blockValue","fallbackName","loops","loop","preferredEncoding","explicitEncoding","normalizeDxfEncoding","decodeBytes","bomEncoding","detectBomEncoding","declaredEncoding","detectDxfCodePage","utf8","chooseBestLegacyDxfDecode","DXF_CODEPAGE_ENCODING","lines","cursor","code","_c","_d","trimmed","key","ansi","cp","encoding","bestText","bestScore","score","scoreDxfDecode","replacements","countMatches","controls","cjk","hasDxfStructure","pattern","match","pairs","section","current","polyline","pair","flushEntity","v","readPoint","readNumber","e","entityFromPairs","common","readString","degreesToRadiansSafe","readJoinedText","readLwPolylineVertices","readRepeatedPoints","found","xCode","yCode","zCode","yPair","zPair","j","chunks","DwfLoader","normalizeFormat","loaded","openDwfDocument","cadDocumentFromDwf","host","wasmUrl","resolveDwfWasmUrl","background","resolveDwfBackground","viewerOptions","buildDwfViewerOptions","loadOptions","buildDwfLoadOptions","DwfViewer","_e","button","native","setOptionalNumber","keepRaw","diagnosticsToWarnings","pageToCadPage","metadata","countBy","unique","pageEntities","pageIndex","primitive","primitiveToEntity","mesh","rgbToHex","base","pointsArrayToCadPoints","w","points","diagnostics","detected","ensureTrailingSlash","canvasOptions","rgb","g","toHex","values","createDefaultLoaderRegistry","isCadNativeRenderableLoader","BASE_ACI","colorFromAci","foreground","normalized","colorFromTrueColor","byteOrder","int","a","c","parseCssColor","normalizeXpsColor","obj","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","keys","rgba","part","hasPercent","clampByte","channels","s","l1","l2","hi","lo","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","percent","nums","CadViewer","createRenderer","file","maybeDisposable","throwIfAborted","normalizedInput","normalizeError","backend","baseProgress","overrideProgress","progress","createCadViewer"],"mappings":"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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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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\nconst DEFAULT_DWG_WORKER_URL = 'wasm/dwg-worker.js';\n\nexport class DwgWorkerClient {\n private worker?: Worker;\n private sequence = 0;\n private readonly pending = new Map<number, PendingRequest>();\n\n load(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions = {}): Promise<CadLoadResult> {\n if (!supportsDwgWorker()) throw new Error('Web Worker is not available in this runtime.');\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n const fileName = options.fileName ?? input.fileName ?? input.file?.name;\n const transferBuffer = prepareTransferBuffer(bytes, input, options);\n\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Dispatching DWG parse to worker…', total: bytes.byteLength });\n\n return new Promise<CadLoadResult>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = { resolve, reject, onProgress: options.onProgress, signal: options.signal };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({\n type: 'load',\n requestId,\n bytes: transferBuffer,\n fileName,\n options: serializeOptions(options)\n }, [transferBuffer]);\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n preload(options: DwgWorkerLoadOptions = {}): Promise<void> {\n if (!supportsDwgWorker()) return Promise.reject(new Error('Web Worker is not available in this runtime.'));\n const worker = this.ensureWorker(options);\n const requestId = ++this.sequence;\n const timeout = Math.max(0, Number(options.workerTimeoutMs ?? 0));\n options.onProgress?.({ phase: 'worker-start', format: 'dwg', message: 'Starting DWG worker warmup…' });\n\n return new Promise<void>((resolve, reject) => {\n if (options.signal?.aborted) {\n reject(createAbortError());\n return;\n }\n const pending: PendingRequest = {\n resolve: () => resolve(),\n reject,\n onProgress: options.onProgress,\n signal: options.signal\n };\n if (timeout > 0) {\n pending.timer = setTimeout(() => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(new Error(`DWG worker warmup timed out after ${timeout} ms.`));\n }, timeout);\n }\n if (options.signal) {\n pending.abortHandler = () => {\n this.pending.delete(requestId);\n this.resetWorker();\n reject(createAbortError());\n };\n options.signal.addEventListener('abort', pending.abortHandler, { once: true });\n }\n this.pending.set(requestId, pending);\n try {\n worker.postMessage({ type: 'warmup', requestId, options: serializeOptions(options) });\n } catch (error) {\n this.pending.delete(requestId);\n cleanupPending(pending);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n terminate(): void {\n this.resetWorker();\n }\n\n private ensureWorker(options: DwgWorkerLoadOptions): Worker {\n if (!this.worker) {\n this.worker = createWorker(options);\n this.worker.onmessage = (event: MessageEvent<DwgWorkerMessage>) => this.handleMessage(event.data);\n this.worker.onerror = (event) => {\n const message = event.message || 'DWG worker failed.';\n this.rejectAll(new Error(message));\n this.resetWorker(false);\n };\n this.worker.onmessageerror = () => {\n this.rejectAll(new Error('DWG worker returned a message that could not be cloned.'));\n this.resetWorker(false);\n };\n }\n return this.worker;\n }\n\n private handleMessage(message: DwgWorkerMessage): void {\n if (message.type === 'ready') return;\n const pending = this.pending.get(message.requestId);\n if (!pending) return;\n\n if (message.type === 'progress') {\n pending.onProgress?.(message.progress);\n return;\n }\n\n this.pending.delete(message.requestId);\n cleanupPending(pending);\n\n if (message.type === 'result') {\n pending.resolve(message.result);\n return;\n }\n\n if (message.type === 'warmup-result') {\n pending.onProgress?.({ phase: 'worker-ready', format: 'dwg', message: 'DWG worker warmup complete.', percent: 100, elapsedMs: message.elapsedMs });\n pending.resolve(undefined);\n return;\n }\n\n const error = new Error(message.error.message);\n error.name = message.error.name || 'DwgWorkerError';\n if (message.error.stack) error.stack = message.error.stack;\n pending.reject(error);\n }\n\n private rejectAll(error: Error): void {\n for (const [, pending] of this.pending) {\n cleanupPending(pending);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private resetWorker(reject = true): void {\n if (reject) this.rejectAll(new Error('DWG worker was terminated.'));\n this.worker?.terminate();\n this.worker = undefined;\n }\n}\n\nexport function supportsDwgWorker(): boolean {\n return typeof Worker !== 'undefined' && typeof URL !== 'undefined';\n}\n\nfunction createWorker(options: DwgWorkerLoadOptions): Worker {\n if (options.workerFactory) return options.workerFactory();\n return new Worker(resolveWorkerUrl(options.workerUrl), { type: 'module', name: 'lightweight-cad-dwg-loader' });\n}\n\nfunction serializeOptions(options: DwgWorkerLoadOptions): Record<string, unknown> {\n return {\n // Resolve the asset directory on the UI thread. Relative paths such as\n // './wasm' must be relative to the document URL, not to the generated\n // worker chunk URL. Otherwise the worker may request /assets/wasm/... and\n // receive the app's HTML fallback instead of libredwg-web.wasm.\n wasmPath: resolveWasmPathForWorker(options.wasmPath),\n includePaperSpace: options.includePaperSpace,\n maxInsertDepth: options.maxInsertDepth,\n keepRaw: Boolean(options.keepRaw)\n };\n}\n\nfunction prepareTransferBuffer(bytes: Uint8Array, input: CadLoadInput, options: DwgWorkerLoadOptions): ArrayBuffer {\n const canTransferWithoutSurprise = Boolean(input.file) || options.transferInputBuffer === true;\n if (canTransferWithoutSurprise) return exactArrayBuffer(bytes);\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nfunction cleanupPending(pending: PendingRequest): void {\n if (pending.timer) clearTimeout(pending.timer);\n if (pending.signal && pending.abortHandler) pending.signal.removeEventListener('abort', pending.abortHandler);\n}\n\nfunction createAbortError(): Error {\n if (typeof DOMException !== 'undefined') return new DOMException('DWG loading was aborted.', 'AbortError');\n const error = new Error('DWG loading was aborted.');\n error.name = 'AbortError';\n return error;\n}\n\nfunction resolveWasmPathForWorker(wasmPath: string | undefined): string {\n const candidate = (wasmPath?.trim() || '/wasm').replace(/\\/+$/, '');\n if (candidate === '') return getPageOrigin();\n if (isAbsoluteUrl(candidate)) return candidate;\n if (candidate.startsWith('/')) return `${getPageOrigin()}${candidate}`;\n return new URL(candidate, getPageBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction resolveWorkerUrl(workerUrl: string | URL | undefined): string | URL {\n if (workerUrl instanceof URL) return workerUrl;\n const candidate = workerUrl?.trim() || DEFAULT_DWG_WORKER_URL;\n if (isAbsoluteUrl(candidate)) return candidate;\n return new URL(candidate, getPageBaseUrl()).href;\n}\n\nfunction getPageBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getPageOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getPageBaseUrl()).origin;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n","import { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadLoadInput, CadLoadOptions, CadLoadResult, CadLoader } from '../../core/types';\nimport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nexport class DwgLoader implements CadLoader {\n readonly id = 'dwg';\n readonly label = 'DWG / LibreDWG WebAssembly';\n readonly formats = ['dwg'] as const;\n private readonly defaults: CadLoadOptions;\n private readonly workerClient = new DwgWorkerClient();\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = { useWorker: true, ...defaults };\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n if (extensionOf(input) === 'dwg') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwg';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n merged.onProgress?.({ phase: 'read', format: 'dwg', message: 'Reading DWG bytes…' });\n const bytes = await readInputBytes(input);\n const sourceName = input.fileName ?? input.file?.name;\n\n if (merged.useWorker === false) {\n throw new Error('DWG main-thread parsing is intentionally not bundled by the default viewer. Keep useWorker enabled, or register a custom DWG loader for non-browser runtimes.');\n }\n\n if (!supportsDwgWorker()) {\n throw new Error('DWG loading requires Web Worker support in this build. Provide a custom loader for this runtime.');\n }\n\n try {\n return await this.workerClient.load(bytes, input, { ...merged, fileName: sourceName });\n } catch (error) {\n if (isAbortError(error)) throw error;\n throw normalizeWorkerError(error);\n }\n }\n\n terminateWorker(): void {\n this.workerClient.terminate();\n }\n\n preload(options: CadLoadOptions = {}): Promise<void> {\n const merged = { ...this.defaults, ...options };\n if (merged.useWorker === false) {\n return Promise.reject(new Error('DWG preload requires worker mode in the default viewer.'));\n }\n return this.workerClient.preload(merged);\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nexport { DwgWorkerClient, supportsDwgWorker } from './DwgWorkerClient';\n\nfunction normalizeWorkerError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n return new Error(`${message} If the worker asset cannot be resolved by your bundler/CDN, pass workerUrl or workerFactory to CadViewer.`);\n}\n","import type { CadBlock, CadDocument, CadEntity, CadEntityKind, CadLayer, 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 const mergedOptions = { ...this.defaults, ...options };\n const started = performance.now();\n const bytes = await readInputBytes(input);\n const text = decodeDxfText(bytes, mergedOptions.dxfEncoding);\n const warnings: string[] = [];\n let parsed: unknown;\n try {\n parsed = await parseWithDxfParser(text);\n } catch (error) {\n warnings.push(`dxf-parser failed, using built-in fallback parser: ${error instanceof Error ? error.message : String(error)}`);\n parsed = parseDxfFallback(text);\n }\n const document = normalizeDxfDatabase(parsed, input.fileName ?? input.file?.name, warnings);\n const elapsedMs = performance.now() - started;\n return { document, raw: parsed, bytes: bytes.byteLength, elapsedMs, format: 'dxf', warnings: document.warnings };\n }\n}\n\nasync function parseWithDxfParser(text: string): Promise<unknown> {\n const module = await import('dxf-parser') as { default?: new () => { parseSync(text: string): unknown }; DxfParser?: new () => { parseSync(text: string): unknown } };\n const Parser = module.default ?? module.DxfParser;\n if (!Parser) throw new Error('dxf-parser did not expose a parser constructor.');\n return new Parser().parseSync(text);\n}\n\nexport function normalizeDxfDatabase(parsed: unknown, sourceName?: string, warnings: string[] = []): CadDocument {\n const record = parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};\n const layers = extractDxfLayers(record);\n const blocks = extractDxfBlocks(record);\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n\n const document = createCadDocument({\n format: 'dxf',\n sourceName,\n header: record.header && typeof record.header === 'object' ? record.header as Record<string, unknown> : {},\n layers,\n blocks,\n entities,\n metadata: { parser: 'dxf-parser + cad-viewer normalizer' },\n warnings,\n raw: parsed\n });\n if (entities.length === 0) document.warnings.push('DXF file did not expose any ENTITIES.');\n return document;\n}\n\nfunction normalizeDxfEntity(raw: Record<string, unknown>): CadEntity {\n const type = String(raw.type ?? raw.entityType ?? 'UNKNOWN').toUpperCase();\n const entity = normalizeCadEntity(raw, type);\n const rawColorNumber = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci);\n const rawColor = numberOrUndefined(raw.color);\n entity.colorIndex = rawColorNumber ?? (rawColor !== undefined && Math.abs(rawColor) <= 257 ? rawColor : undefined);\n entity.trueColor = (raw.trueColor ?? raw.true_color ?? raw.colorRGB ?? raw.trueColorValue ?? (rawColor !== undefined && Math.abs(rawColor) > 257 ? rawColor : undefined)) as CadEntity['trueColor'];\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName) ?? '0';\n entity.isClosed = Boolean(raw.shape ?? raw.closed ?? raw.isClosed) || ((Number(raw.flag ?? raw.flags ?? 0) & 1) === 1);\n\n if (type === 'LINE') {\n entity.startPoint = pointFromUnknown(raw.startPoint ?? { x: raw.x1 ?? raw.x, y: raw.y1 ?? raw.y, z: raw.z1 ?? raw.z }) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? { x: raw.x2, y: raw.y2, z: raw.z2 }) ?? entity.endPoint;\n }\n if (type === 'TEXT' || type === 'MTEXT' || type === 'ATTRIB' || type === 'ATTDEF') {\n entity.insertionPoint = pointFromUnknown(raw.startPoint ?? raw.position ?? raw.insertionPoint) ?? entity.insertionPoint;\n entity.text = normalizeDxfText(raw.text ?? raw.string ?? raw.value) ?? entity.text;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'ARC' || type === 'ELLIPSE') {\n entity.startAngle = normalizeAngle(raw.startAngle ?? raw.start_angle);\n entity.endAngle = normalizeAngle(raw.endAngle ?? raw.end_angle);\n }\n if (type === 'INSERT') {\n entity.blockName = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.blockName;\n entity.insertionPoint = pointFromUnknown(raw.position ?? raw.insertionPoint ?? raw.point) ?? entity.insertionPoint;\n const sx = numberOrUndefined(raw.xScale ?? raw.scaleX ?? raw.xscale);\n const sy = numberOrUndefined(raw.yScale ?? raw.scaleY ?? raw.yscale);\n const sz = numberOrUndefined(raw.zScale ?? raw.scaleZ ?? raw.zscale);\n if (sx !== undefined || sy !== undefined || sz !== undefined) entity.scale = { x: sx ?? 1, y: sy ?? sx ?? 1, z: sz ?? 1 };\n entity.rotation = normalizeRotation(raw.rotation ?? raw.angle);\n }\n if (type === 'SPLINE') {\n const control = normalizeControlPoints(raw.controlPoints ?? raw.control_points ?? raw.points);\n if (control.length) entity.controlPoints = control;\n const fit = normalizeControlPoints(raw.fitPoints ?? raw.fit_points);\n if (fit.length) entity.fitPoints = fit;\n }\n if (type === 'HATCH') {\n entity.loops = normalizeHatchLoops(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n if (type === 'SOLID' || type === 'TRACE' || type === '3DFACE') {\n entity.vertices = normalizeSolidVertices(raw);\n entity.fillColorIndex = entity.colorIndex;\n }\n return entity;\n}\n\nfunction extractDxfLayers(raw: Record<string, unknown>): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const tables = raw.tables as Record<string, unknown> | undefined;\n const layerTable = raw.layers ?? tables?.layer ?? tables?.LAYER ?? tables?.layers;\n const candidates = expandRecords(layerTable);\n for (const item of candidates) {\n const rec = item as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.layerName);\n if (!name) continue;\n addLayer(result, {\n name,\n color: (rec.color ?? rec.colorNumber ?? rec.colorIndex) as string | number | undefined,\n colorIndex: numberOrUndefined(rec.colorNumber ?? rec.colorIndex ?? rec.color),\n lineType: stringOrUndefined(rec.lineType ?? rec.linetype),\n isVisible: Number(rec.colorNumber ?? rec.colorIndex ?? rec.color ?? 1) >= 0,\n isFrozen: Boolean(rec.frozen),\n isLocked: Boolean(rec.locked),\n raw: rec\n });\n }\n if (!result['0']) addLayer(result, { name: '0', colorIndex: 7, isVisible: true });\n return result;\n}\n\nfunction extractDxfBlocks(raw: Record<string, unknown>): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const blocks = raw.blocks;\n if (!blocks || typeof blocks !== 'object') return result;\n if (Array.isArray(blocks)) {\n for (const block of blocks) addDxfBlock(result, block);\n } else {\n for (const [name, block] of Object.entries(blocks as Record<string, unknown>)) addDxfBlock(result, block, name);\n }\n return result;\n}\n\nfunction addDxfBlock(target: Record<string, CadBlock>, blockValue: unknown, fallbackName?: string): void {\n if (!blockValue || typeof blockValue !== 'object') return;\n const rec = blockValue as Record<string, unknown>;\n const name = stringOrUndefined(rec.name ?? rec.blockName ?? fallbackName);\n if (!name) return;\n const rawEntities = Array.isArray(rec.entities) ? rec.entities : [];\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDxfEntity(item));\n addBlock(target, { name, basePoint: pointFromUnknown(rec.basePoint ?? rec.position) ?? { x: 0, y: 0 }, entities, raw: rec });\n}\n\nfunction expandRecords(value: unknown): unknown[] {\n if (!value) return [];\n if (Array.isArray(value)) return value;\n if (typeof value !== 'object') return [];\n const rec = value as Record<string, unknown>;\n if (Array.isArray(rec.entries)) return rec.entries;\n if (Array.isArray(rec.records)) return rec.records;\n if (Array.isArray(rec.layers)) return rec.layers;\n return Object.values(rec).filter((x) => x && typeof x === 'object');\n}\n\nfunction normalizeControlPoints(value: unknown): CadPoint3D[] {\n if (!Array.isArray(value)) return [];\n return value.map(pointFromUnknown).filter((p): p is CadPoint3D => !!p);\n}\n\nfunction normalizeSolidVertices(raw: Record<string, unknown>): CadPoint3D[] {\n const direct = normalizeControlPoints(raw.vertices ?? raw.points);\n if (direct.length) return direct;\n const out: CadPoint3D[] = [];\n for (let i = 0; i < 4; i++) {\n const point = pointFromUnknown({ x: raw[`x${i}`] ?? raw[`x${i + 1}`], y: raw[`y${i}`] ?? raw[`y${i + 1}`], z: raw[`z${i}`] ?? raw[`z${i + 1}`] });\n if (point) out.push(point);\n }\n return out;\n}\n\nfunction normalizeHatchLoops(raw: Record<string, unknown>): CadEntity['loops'] {\n const loops = raw.boundaryLoops ?? raw.loops ?? raw.paths;\n if (!Array.isArray(loops)) return undefined;\n return loops.map((loop) => {\n const rec = loop as Record<string, unknown>;\n const vertices = normalizeControlPoints(rec.vertices ?? rec.points);\n return { vertices, isClosed: true };\n }).filter((loop) => loop.vertices && loop.vertices.length > 0);\n}\n\nfunction normalizeRotation(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nfunction normalizeAngle(value: unknown): number | undefined {\n const n = numberOrUndefined(value);\n if (n === undefined) return undefined;\n return Math.abs(n) > Math.PI * 2 + 1e-6 ? degreesToRadians(n) : n;\n}\n\nexport function decodeDxfText(bytes: Uint8Array, preferredEncoding?: string): string {\n const explicitEncoding = normalizeDxfEncoding(preferredEncoding);\n if (explicitEncoding) return decodeBytes(bytes, explicitEncoding);\n\n const bomEncoding = detectBomEncoding(bytes);\n if (bomEncoding) return decodeBytes(bytes, bomEncoding);\n\n const declaredEncoding = normalizeDxfEncoding(detectDxfCodePage(bytes));\n if (declaredEncoding) return decodeBytes(bytes, declaredEncoding);\n\n const utf8 = decodeBytes(bytes, 'utf-8');\n if (!utf8.includes('\\uFFFD')) return utf8;\n\n return chooseBestLegacyDxfDecode(bytes);\n}\n\nconst DXF_CODEPAGE_ENCODING: Record<string, string> = {\n ANSI_874: 'windows-874',\n ANSI_932: 'shift_jis',\n ANSI_936: 'gb18030',\n ANSI_949: 'euc-kr',\n ANSI_950: 'big5',\n ANSI_1250: 'windows-1250',\n ANSI_1251: 'windows-1251',\n ANSI_1252: 'windows-1252',\n ANSI_1253: 'windows-1253',\n ANSI_1254: 'windows-1254',\n ANSI_1255: 'windows-1255',\n ANSI_1256: 'windows-1256',\n ANSI_1257: 'windows-1257',\n ANSI_1258: 'windows-1258',\n BIG5: 'big5',\n CP874: 'windows-874',\n CP932: 'shift_jis',\n CP936: 'gb18030',\n CP949: 'euc-kr',\n CP950: 'big5',\n CP1250: 'windows-1250',\n CP1251: 'windows-1251',\n CP1252: 'windows-1252',\n CP1253: 'windows-1253',\n CP1254: 'windows-1254',\n CP1255: 'windows-1255',\n CP1256: 'windows-1256',\n CP1257: 'windows-1257',\n CP1258: 'windows-1258',\n GB18030: 'gb18030',\n GB2312: 'gb18030',\n GBK: 'gb18030',\n SHIFT_JIS: 'shift_jis',\n SHIFTJIS: 'shift_jis',\n SJIS: 'shift_jis',\n UTF8: 'utf-8',\n UTF_8: 'utf-8',\n UTF16: 'utf-16le',\n UTF_16: 'utf-16le',\n UTF16LE: 'utf-16le',\n UTF_16LE: 'utf-16le',\n UTF16BE: 'utf-16be',\n UTF_16BE: 'utf-16be'\n};\n\nfunction detectBomEncoding(bytes: Uint8Array): string | undefined {\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) return 'utf-8';\n if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) return 'utf-16le';\n if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) return 'utf-16be';\n return undefined;\n}\n\nfunction detectDxfCodePage(bytes: Uint8Array): string | undefined {\n const header = decodeBytes(bytes.subarray(0, Math.min(bytes.byteLength, 128 * 1024)), 'iso-8859-1');\n const lines = header.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n for (let index = 0; index < lines.length - 3; index++) {\n if (lines[index]?.trim() !== '9' || lines[index + 1]?.trim().toUpperCase() !== '$DWGCODEPAGE') continue;\n for (let cursor = index + 2; cursor < Math.min(index + 10, lines.length - 1); cursor += 2) {\n const code = lines[cursor]?.trim();\n const value = lines[cursor + 1]?.trim();\n if (code === '3' && value) return value;\n }\n }\n return undefined;\n}\n\nfunction normalizeDxfEncoding(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n const key = trimmed.replace(/[-\\s]+/g, '_').toUpperCase();\n if (DXF_CODEPAGE_ENCODING[key]) return DXF_CODEPAGE_ENCODING[key];\n const ansi = /^ANSI_(\\d{3,4})$/.exec(key);\n if (ansi) return normalizeDxfEncoding(`cp${ansi[1]}`);\n const cp = /^CP(\\d{3,4})$/.exec(key);\n if (cp) {\n if (cp[1] === '936') return 'gb18030';\n if (cp[1] === '950') return 'big5';\n if (cp[1] === '932') return 'shift_jis';\n if (cp[1] === '949') return 'euc-kr';\n return `windows-${cp[1]}`;\n }\n return trimmed;\n}\n\nfunction decodeBytes(bytes: Uint8Array, encoding: string): string {\n try {\n return new TextDecoder(encoding, { fatal: false }).decode(bytes);\n } catch {\n return new TextDecoder('utf-8', { fatal: false }).decode(bytes);\n }\n}\n\nfunction chooseBestLegacyDxfDecode(bytes: Uint8Array): string {\n const candidates = ['windows-1252', 'gb18030', 'big5', 'shift_jis', 'euc-kr', 'iso-8859-1'];\n let bestText = '';\n let bestScore = Number.POSITIVE_INFINITY;\n for (const encoding of candidates) {\n const text = decodeBytes(bytes, encoding);\n const score = scoreDxfDecode(text, encoding);\n if (score < bestScore) {\n bestScore = score;\n bestText = text;\n }\n }\n return bestText || decodeBytes(bytes, 'utf-8');\n}\n\nfunction scoreDxfDecode(text: string, encoding: string): number {\n const replacements = countMatches(text, /\\uFFFD/g);\n const controls = countMatches(text, /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g);\n const cjk = countMatches(text, /[\\u3400-\\u9FFF\\uF900-\\uFAFF]/g);\n const hasDxfStructure = text.includes('SECTION') && (text.includes('ENTITIES') || text.includes('HEADER'));\n let score = replacements * 10000 + controls * 1000;\n if (hasDxfStructure) score -= 500;\n if (encoding === 'windows-1252') score -= 2;\n if (encoding === 'gb18030' && cjk >= 2) score -= 50 + Math.min(cjk, 200) * 2;\n return score;\n}\n\nfunction countMatches(text: string, pattern: RegExp): number {\n return text.match(pattern)?.length ?? 0;\n}\n\nfunction normalizeDxfText(value: unknown): string | undefined {\n const text = stringOrUndefined(value);\n if (text === undefined) return undefined;\n return text\n .replace(/\\\\U\\+([0-9a-fA-F]{4,6})/g, (match, code: string) => {\n const point = Number.parseInt(code, 16);\n return Number.isFinite(point) && point >= 0 && point <= 0x10ffff ? String.fromCodePoint(point) : match;\n })\n .replace(/%%[cC]/g, '\\u2205')\n .replace(/%%[dD]/g, '\\u00b0')\n .replace(/%%[pP]/g, '\\u00b1')\n .replace(/\\\\P/g, '\\n');\n}\n\ninterface DxfPair { code: number; value: string }\n\nfunction parseDxfFallback(text: string): { header: Record<string, unknown>; tables: Record<string, unknown>; entities: CadEntity[]; blocks: Record<string, unknown> } {\n const lines = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').split('\\n');\n const pairs: DxfPair[] = [];\n for (let i = 0; i < lines.length - 1; i += 2) {\n const code = Number(lines[i]?.trim());\n const value = lines[i + 1] ?? '';\n if (Number.isFinite(code)) pairs.push({ code, value: value.trimEnd() });\n }\n const entities: CadEntity[] = [];\n const blocks: Record<string, unknown> = {};\n let section = '';\n let current: DxfPair[] = [];\n let polyline: CadEntity | undefined;\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n if (pair.code === 0 && pair.value === 'SECTION') {\n section = pairs[i + 1]?.code === 2 ? pairs[i + 1].value.toUpperCase() : '';\n i++;\n continue;\n }\n if (pair.code === 0 && pair.value === 'ENDSEC') {\n flushEntity();\n section = '';\n continue;\n }\n if (section !== 'ENTITIES') continue;\n if (pair.code === 0) {\n flushEntity();\n current = [pair];\n } else current.push(pair);\n }\n flushEntity();\n return { header: {}, tables: {}, entities, blocks };\n\n function flushEntity(): void {\n if (!current.length) return;\n const type = current[0]?.value.toUpperCase();\n if (type === 'VERTEX' && polyline) {\n const v = readPoint(current, 10, 20, 30);\n if (v) (polyline.vertices ??= []).push({ ...v, bulge: readNumber(current, 42) });\n current = [];\n return;\n }\n if (type === 'SEQEND') {\n if (polyline) entities.push(polyline);\n polyline = undefined;\n current = [];\n return;\n }\n if (polyline) {\n entities.push(polyline);\n polyline = undefined;\n }\n if (!type || type === 'EOF') { current = []; return; }\n const e = entityFromPairs(type, current);\n if (type === 'POLYLINE') polyline = e;\n else entities.push(e);\n current = [];\n }\n}\n\nfunction entityFromPairs(type: string, pairs: DxfPair[]): CadEntity {\n const common: Record<string, unknown> = {\n type,\n handle: readString(pairs, 5),\n layer: readString(pairs, 8) ?? '0',\n colorIndex: readNumber(pairs, 62),\n trueColor: readNumber(pairs, 420),\n lineType: readString(pairs, 6),\n lineweight: readNumber(pairs, 370)\n };\n switch (type) {\n case 'LINE': Object.assign(common, { startPoint: readPoint(pairs, 10, 20, 30), endPoint: readPoint(pairs, 11, 21, 31) }); break;\n case 'CIRCLE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40) }); break;\n case 'ARC': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), radius: readNumber(pairs, 40), startAngle: degreesToRadiansSafe(readNumber(pairs, 50)), endAngle: degreesToRadiansSafe(readNumber(pairs, 51)) }); break;\n case 'POINT': Object.assign(common, { point: readPoint(pairs, 10, 20, 30) }); break;\n case 'TEXT':\n case 'MTEXT': Object.assign(common, { insertionPoint: readPoint(pairs, 10, 20, 30), text: readJoinedText(pairs), textHeight: readNumber(pairs, 40), rotation: degreesToRadiansSafe(readNumber(pairs, 50)) }); break;\n case 'LWPOLYLINE': Object.assign(common, { vertices: readLwPolylineVertices(pairs), flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'POLYLINE': Object.assign(common, { vertices: [], flag: readNumber(pairs, 70), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'ELLIPSE': Object.assign(common, { center: readPoint(pairs, 10, 20, 30), majorAxisEndPoint: readPoint(pairs, 11, 21, 31), axisRatio: readNumber(pairs, 40), startAngle: readNumber(pairs, 41), endAngle: readNumber(pairs, 42) }); break;\n case 'SPLINE': Object.assign(common, { controlPoints: readRepeatedPoints(pairs, 10, 20, 30), degree: readNumber(pairs, 71), isClosed: (Number(readNumber(pairs, 70) ?? 0) & 1) === 1 }); break;\n case 'INSERT': Object.assign(common, { name: readString(pairs, 2), blockName: readString(pairs, 2), insertionPoint: readPoint(pairs, 10, 20, 30), rotation: degreesToRadiansSafe(readNumber(pairs, 50)), scale: { x: readNumber(pairs, 41) ?? 1, y: readNumber(pairs, 42) ?? readNumber(pairs, 41) ?? 1, z: readNumber(pairs, 43) ?? 1 } }); break;\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': Object.assign(common, { vertices: [readPoint(pairs, 10, 20, 30), readPoint(pairs, 11, 21, 31), readPoint(pairs, 12, 22, 32), readPoint(pairs, 13, 23, 33)].filter(Boolean) }); break;\n }\n return normalizeDxfEntity(common);\n}\n\nfunction readNumber(pairs: DxfPair[], code: number): number | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n const n = Number(found);\n return Number.isFinite(n) ? n : undefined;\n}\nfunction readString(pairs: DxfPair[], code: number): string | undefined {\n const found = pairs.find((pair) => pair.code === code)?.value;\n return found && found.length > 0 ? found : undefined;\n}\nfunction readPoint(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D | undefined {\n const x = readNumber(pairs, xCode);\n const y = readNumber(pairs, yCode);\n const z = readNumber(pairs, zCode);\n if (x === undefined || y === undefined) return undefined;\n return z === undefined ? { x, y } : { x, y, z };\n}\nfunction readRepeatedPoints(pairs: DxfPair[], xCode: number, yCode: number, zCode: number): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== xCode) continue;\n const x = Number(pairs[i].value);\n const yPair = pairs.slice(i + 1).find((pair) => pair.code === yCode);\n const zPair = pairs.slice(i + 1).find((pair) => pair.code === zCode);\n const y = Number(yPair?.value);\n const z = Number(zPair?.value);\n if (Number.isFinite(x) && Number.isFinite(y)) out.push(Number.isFinite(z) ? { x, y, z } : { x, y });\n }\n return out;\n}\nfunction readLwPolylineVertices(pairs: DxfPair[]): Array<CadPoint3D & { bulge?: number }> {\n const out: Array<CadPoint3D & { bulge?: number }> = [];\n for (let i = 0; i < pairs.length; i++) {\n if (pairs[i].code !== 10) continue;\n const x = Number(pairs[i].value);\n let y: number | undefined;\n let bulge: number | undefined;\n for (let j = i + 1; j < pairs.length; j++) {\n if (pairs[j].code === 10) break;\n if (pairs[j].code === 20) y = Number(pairs[j].value);\n if (pairs[j].code === 42) bulge = Number(pairs[j].value);\n }\n if (Number.isFinite(x) && Number.isFinite(y)) out.push({ x, y: y as number, bulge: Number.isFinite(bulge) ? bulge : undefined });\n }\n return out;\n}\nfunction readJoinedText(pairs: DxfPair[]): string | undefined {\n const chunks = pairs.filter((pair) => pair.code === 1 || pair.code === 3).map((pair) => pair.value);\n return chunks.length ? chunks.join('') : undefined;\n}\n\nfunction degreesToRadiansSafe(value: number | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? degreesToRadians(value) : undefined;\n}\n","import { DwfViewer, openDwfDocument, type DwfViewerOptions, type LoadedDwfDocument, type LoadOptions as DwfLoadOptions, type PageData, type RenderStats as DwfRenderStats, type W2dPrimitive } from 'dwf-viewer';\nimport { createCadDocument, flattenPages } from '../../core/entity';\nimport { detectCadFormat, extensionOf, readInputBytes } from '../../core/format';\nimport type { CadDocument, CadEntity, CadFormat, CadLoadInput, CadLoadOptions, CadLoadResult, CadNativeRenderableLoader, CadPage, CadPathCommand, CadPoint3D } from '../../core/types';\n\nexport class DwfLoader implements CadNativeRenderableLoader {\n readonly id = 'dwf';\n readonly label = 'DWF/DWFx native viewer powered by dwf-viewer';\n readonly formats = ['dwf', 'dwfx', 'xps'] as const;\n readonly nativeRenderer = true as const;\n private readonly defaults: CadLoadOptions;\n private native?: DwfViewer;\n private host?: HTMLElement;\n private lastStats?: DwfRenderStats;\n\n constructor(defaults: CadLoadOptions = {}) {\n this.defaults = defaults;\n }\n\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean {\n const ext = extensionOf(input);\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return true;\n const format = detectCadFormat(input, bytes);\n return format === 'dwf' || format === 'dwfx' || format === 'xps';\n }\n\n async load(input: CadLoadInput, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Opening DWF/DWFx with dwf-viewer…', percent: 48 });\n const loaded = await openDwfDocument(bytes, { fileName: sourceName });\n merged.onProgress?.({ phase: 'normalize', format, message: 'Reading DWF pages, sheets and model metadata…', percent: 76 });\n\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx document ready.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n async mount(input: CadLoadInput, host: HTMLElement, options: CadLoadOptions = {}): Promise<CadLoadResult> {\n const merged = { ...this.defaults, ...options };\n const started = performance.now();\n const sourceName = input.fileName ?? input.file?.name;\n const bytes = await readInputBytes(input);\n const format = normalizeFormat(detectCadFormat(input, bytes), extensionOf(input));\n const wasmUrl = resolveDwfWasmUrl(merged);\n const background = resolveDwfBackground(merged);\n const viewerOptions = buildDwfViewerOptions(merged, wasmUrl, background);\n const loadOptions = buildDwfLoadOptions(merged, wasmUrl, background);\n\n merged.onProgress?.({ phase: 'native-render', format, message: 'Mounting native DWF renderer…', percent: 28 });\n this.unmount();\n this.host = host;\n host.replaceChildren();\n this.native = new DwfViewer(host, viewerOptions);\n\n merged.onProgress?.({ phase: 'parse', format, message: 'Parsing DWF package and page streams…', percent: 58 });\n await this.native.load(bytes, {\n fileName: sourceName,\n ...loadOptions\n });\n\n merged.onProgress?.({ phase: 'render', format, message: 'Rendering DWF/DWFx with dwf-viewer…', percent: 88 });\n this.lastStats = await this.native.render();\n const loaded = this.native.getDocument();\n const document = cadDocumentFromDwf(loaded, sourceName, format, merged.keepRaw === true);\n document.metadata.loaderMode = 'Native DWF';\n document.metadata.nativeRenderer = 'dwf-viewer';\n document.metadata.nativeRenderStats = this.lastStats ? { ...this.lastStats, warnings: this.lastStats.warnings.length } : undefined;\n const elapsedMs = performance.now() - started;\n merged.onProgress?.({ phase: 'done', format: document.format, message: 'DWF/DWFx rendered.', percent: 100, elapsedMs });\n return { document, raw: merged.keepRaw ? loaded : undefined, bytes: bytes.byteLength, elapsedMs, format: document.format, warnings: document.warnings };\n }\n\n unmount(): void {\n this.native?.dispose();\n this.native = undefined;\n this.lastStats = undefined;\n if (this.host) this.host.replaceChildren();\n }\n\n fit(): void {\n this.native?.fit();\n }\n\n zoomIn(): void {\n const button = (this.native as unknown as { zoomInButton?: HTMLButtonElement } | undefined)?.zoomInButton;\n button?.click();\n }\n\n zoomOut(): void {\n const button = (this.native as unknown as { zoomOutButton?: HTMLButtonElement } | undefined)?.zoomOutButton;\n button?.click();\n }\n\n resize(): void {\n void this.native?.render();\n }\n\n setNativeOptions(options: CadLoadOptions): void {\n const native = this.native as unknown as {\n background?: string;\n setPreferWebgl?: (value: boolean) => void;\n setPreferWasm?: (value: boolean) => void;\n setLineWeightMode?: (value: NonNullable<CadLoadOptions['dwfLineWeightMode']>) => void;\n minStrokeCssPx?: number;\n maxOverviewStrokeCssPx?: number;\n minTextCssPx?: number;\n minFilledAreaCssPx?: number;\n render?: () => Promise<unknown>;\n } | undefined;\n if (!native) return;\n if (typeof options.dwfBackground === 'string') native.background = options.dwfBackground;\n else {\n const background = resolveDwfBackground(options);\n if (background) native.background = background;\n }\n if (typeof options.dwfPreferWebgl === 'boolean') native.setPreferWebgl?.(options.dwfPreferWebgl);\n if (typeof options.dwfPreferWasm === 'boolean') native.setPreferWasm?.(options.dwfPreferWasm);\n if (options.dwfLineWeightMode) native.setLineWeightMode?.(options.dwfLineWeightMode);\n setOptionalNumber(native, 'minStrokeCssPx', options.dwfMinStrokeCssPx);\n setOptionalNumber(native, 'maxOverviewStrokeCssPx', options.dwfMaxOverviewStrokeCssPx);\n setOptionalNumber(native, 'minTextCssPx', options.dwfMinTextCssPx);\n setOptionalNumber(native, 'minFilledAreaCssPx', options.dwfMinFilledAreaCssPx);\n void native.render?.();\n }\n\n getLastNativeStats(): DwfRenderStats | undefined {\n return this.lastStats;\n }\n}\n\nfunction cadDocumentFromDwf(loaded: LoadedDwfDocument | undefined, sourceName: string | undefined, format: CadFormat, keepRaw: boolean): CadDocument {\n const warnings = diagnosticsToWarnings(loaded?.diagnostics ?? []);\n const pages = (loaded?.pageData ?? []).map((page, index) => pageToCadPage(page, index));\n for (const page of loaded?.pageData ?? []) warnings.push(...diagnosticsToWarnings(page.diagnostics));\n const metadata = {\n parser: 'dwf-viewer',\n nativeRenderer: 'dwf-viewer',\n dwfKind: loaded?.kind,\n packageEntries: loaded?.packageEntries?.length ?? 0,\n resources: loaded?.resources?.length ?? 0,\n pageKinds: countBy((loaded?.pageData ?? []).map((page) => page.kind)),\n pageNames: (loaded?.pages ?? []).map((page) => page.name)\n };\n return createCadDocument({\n format,\n sourceName,\n layers: {},\n blocks: {},\n pages,\n entities: flattenPages(pages),\n metadata,\n warnings: unique(warnings),\n raw: keepRaw ? loaded : undefined\n });\n}\n\nfunction pageToCadPage(page: PageData, index: number): CadPage {\n const entities = pageEntities(page, index);\n return {\n index,\n name: page.name || page.sourcePath || `${index + 1}`,\n width: page.width || 1000,\n height: page.height || 1000,\n entities\n };\n}\n\nfunction pageEntities(page: PageData, pageIndex: number): CadEntity[] {\n if (page.kind === 'w2d-text') return page.primitives.flatMap((primitive, index) => primitiveToEntity(primitive, pageIndex, index));\n if (page.kind === 'image') {\n return [{ type: 'DWF_IMAGE_PAGE', kind: 'image', pageIndex, width: page.width, height: page.height, imageSource: page.sourcePath }];\n }\n if (page.kind === 'w3d-model') {\n return page.model.meshes.map((mesh, index) => ({\n id: mesh.id,\n type: 'W3D_MESH',\n kind: 'solid',\n pageIndex,\n color: mesh.color ? rgbToHex(mesh.color) : undefined,\n name: mesh.name || `mesh-${index + 1}`,\n raw: { vertexCount: mesh.vertexCount, triangleCount: mesh.triangleCount, materialId: mesh.materialId }\n }));\n }\n if (page.kind === 'xps-fixed-page') {\n return [{ type: 'XPS_FIXED_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n }\n return [{ type: 'DWF_PAGE', kind: 'viewport', pageIndex, width: page.width, height: page.height, raw: { sourcePath: page.sourcePath } }];\n}\n\nfunction primitiveToEntity(primitive: W2dPrimitive, pageIndex: number, index: number): CadEntity[] {\n const base = {\n id: `dwf-${pageIndex}-${index}`,\n pageIndex,\n color: primitive.stroke,\n fillColor: primitive.fill,\n lineweight: primitive.lineWidth,\n raw: { matrix: primitive.matrix }\n } satisfies Partial<CadEntity>;\n if (primitive.type === 'polyline' || primitive.type === 'polygon') {\n return [{\n ...base,\n type: primitive.type === 'polygon' ? 'DWF_POLYGON' : 'DWF_POLYLINE',\n kind: 'polyline',\n vertices: pointsArrayToCadPoints(primitive.points),\n isClosed: primitive.type === 'polygon'\n }];\n }\n if (primitive.type === 'path') {\n return [{ ...base, type: 'DWF_PATH', kind: 'path', commands: primitive.commands as unknown as CadPathCommand[] }];\n }\n if (primitive.type === 'text') {\n return [{\n ...base,\n type: 'DWF_TEXT',\n kind: 'text',\n insertionPoint: { x: primitive.x, y: primitive.y, z: 0 },\n text: primitive.text,\n textHeight: primitive.size\n }];\n }\n if (primitive.type === 'rect') {\n const x = primitive.x;\n const y = primitive.y;\n const w = primitive.width;\n const h = primitive.height;\n return [{\n ...base,\n type: 'DWF_RECT',\n kind: 'polyline',\n isClosed: true,\n vertices: [\n { x, y, z: 0 },\n { x: x + w, y, z: 0 },\n { x: x + w, y: y + h, z: 0 },\n { x, y: y + h, z: 0 }\n ]\n }];\n }\n return [];\n}\n\nfunction pointsArrayToCadPoints(points: number[]): CadPoint3D[] {\n const out: CadPoint3D[] = [];\n for (let i = 0; i + 1 < points.length; i += 2) out.push({ x: points[i], y: points[i + 1], z: 0 });\n return out;\n}\n\nfunction diagnosticsToWarnings(diagnostics: readonly { level: string; code: string; message: string; source?: string }[]): string[] {\n return diagnostics\n .filter((item) => item.level !== 'info')\n .map((item) => `${item.code}: ${item.message}${item.source ? ` (${item.source})` : ''}`);\n}\n\nfunction normalizeFormat(detected: CadFormat, ext: string): CadFormat {\n if (ext === 'dwf' || ext === 'dwfx' || ext === 'xps') return ext;\n if (detected === 'dwf' || detected === 'dwfx' || detected === 'xps') return detected;\n return 'dwf';\n}\n\nfunction resolveDwfWasmUrl(options: CadLoadOptions): string | undefined {\n if (options.dwfWasmUrl) return options.dwfWasmUrl;\n if (typeof document === 'undefined') return undefined;\n const base = options.wasmPath\n ? new URL(ensureTrailingSlash(options.wasmPath), document.baseURI).href\n : new URL('wasm/', document.baseURI).href;\n return new URL('dwfv-render.wasm', base).href;\n}\n\nfunction resolveDwfBackground(options: CadLoadOptions): string {\n if (options.dwfBackground) return options.dwfBackground;\n const canvasOptions = (options as CadLoadOptions & { canvasOptions?: { background?: string } }).canvasOptions;\n return canvasOptions?.background ?? '#05070d';\n}\n\nfunction buildDwfViewerOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfViewerOptions {\n return {\n ...buildDwfLoadOptions(options, wasmUrl, background),\n maxDevicePixelRatio: options.dwfMaxDevicePixelRatio ?? 2,\n maxCanvasPixels: options.dwfMaxCanvasPixels ?? 16_777_216\n };\n}\n\nfunction buildDwfLoadOptions(options: CadLoadOptions, wasmUrl: string | undefined, background: string): DwfLoadOptions {\n return {\n wasmUrl,\n preferWebgl: options.dwfPreferWebgl ?? true,\n preferWasm: options.dwfPreferWasm ?? true,\n background,\n maxGpuCacheBytes: options.dwfMaxGpuCacheBytes ?? 160 * 1024 * 1024,\n maxCachedScenes: options.dwfMaxCachedScenes ?? 2,\n lineWeightMode: options.dwfLineWeightMode ?? 'adaptive',\n minStrokeCssPx: options.dwfMinStrokeCssPx,\n maxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,\n minTextCssPx: options.dwfMinTextCssPx,\n minFilledAreaCssPx: options.dwfMinFilledAreaCssPx\n };\n}\n\nfunction setOptionalNumber<T extends object, K extends keyof T>(target: T, key: K, value: number | undefined): void {\n if (typeof value === 'number' && Number.isFinite(value)) target[key] = value as T[K];\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction rgbToHex(rgb: [number, number, number]): string {\n const [r, g, b] = rgb.map((value) => Math.max(0, Math.min(255, Math.round(value * 255))));\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nfunction toHex(value: number): string {\n return value.toString(16).padStart(2, '0');\n}\n\nfunction countBy(values: string[]): Record<string, number> {\n const out: Record<string, number> = {};\n for (const value of values) out[value] = (out[value] ?? 0) + 1;\n return out;\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n","import { CadLoaderRegistry } from './CadLoaderRegistry';\nimport { DwgLoader } from './dwg/DwgLoader';\nimport { DxfLoader } from './dxf/DxfLoader';\nimport { DwfLoader } from './dwf/DwfLoader';\nimport type { CadLoadOptions } from '../core/types';\n\nexport function createDefaultLoaderRegistry(options: CadLoadOptions = {}): CadLoaderRegistry {\n return new CadLoaderRegistry([\n new DwgLoader(options),\n new DxfLoader(options),\n new DwfLoader(options)\n ]);\n}\n\nexport { CadLoaderRegistry } from './CadLoaderRegistry';\nexport { DwgLoader, DwgWorkerClient, supportsDwgWorker } from './dwg/DwgLoader';\nexport { DxfLoader } from './dxf/DxfLoader';\nexport { DwfLoader } from './dwf/DwfLoader';\n","export type CadFormat = 'dwg' | 'dxf' | 'dwf' | 'dwfx' | 'xps' | 'unknown';\nexport type CadDwfLineWeightMode = 'adaptive' | 'physical' | 'hairline';\n\nexport interface CadPoint2D {\n x: number;\n y: number;\n}\n\nexport interface CadPoint3D extends CadPoint2D {\n z?: number;\n}\n\nexport type CadPoint = CadPoint2D | CadPoint3D;\n\nexport interface CadBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface CadLayer {\n name: string;\n color?: string | number;\n colorIndex?: number;\n trueColor?: number;\n lineType?: string;\n lineweight?: number;\n isVisible?: boolean;\n isLocked?: boolean;\n isFrozen?: boolean;\n raw?: unknown;\n}\n\nexport interface 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 /**\n * Explicit text encoding for DXF sources. DXF files normally declare this in\n * `$DWGCODEPAGE`; use this only when legacy files are missing or lying about\n * their code page, for example `gb18030`, `big5`, `shift_jis` or `windows-1252`.\n */\n dxfEncoding?: string;\n preferDwgWasm?: boolean;\n maxInsertDepth?: number;\n includePaperSpace?: boolean;\n /**\n * Parse heavy formats in a Web Worker where available. DWG defaults to true\n * because LibreDWG WebAssembly initialization and decoding can block the UI.\n */\n useWorker?: boolean;\n /** Custom worker URL for bundlers/CDNs that cannot resolve the packaged worker URL. */\n workerUrl?: string | URL;\n /** Custom worker factory for applications that manage workers themselves. */\n workerFactory?: () => Worker;\n /** Milliseconds before an in-flight worker load is rejected. 0 disables timeout. */\n workerTimeoutMs?: number;\n /**\n * Transfer the input ArrayBuffer to the worker when it is safe to do so. This\n * avoids an extra copy for File inputs. ArrayBuffer inputs are copied by\n * default to avoid detaching caller-owned buffers.\n */\n transferInputBuffer?: boolean;\n /** Keep parser raw objects on the normalized document. Disabled by default for memory and worker cloning safety. */\n keepRaw?: boolean;\n /** Abort a pending load. For native parsers this terminates and recreates the worker. */\n signal?: AbortSignal;\n\n /** URL to dwf-viewer's optional 2D raster fallback WASM asset, usually /wasm/dwfv-render.wasm. */\n dwfWasmUrl?: string;\n /** Prefer dwf-viewer's WebGL paths for W2D/W3D rendering. */\n dwfPreferWebgl?: boolean;\n /** Allow dwf-viewer's WASM raster backend for complex 2D vector pages. */\n dwfPreferWasm?: boolean;\n /** Background passed to the native DWF renderer. Defaults to the active CAD canvas background. */\n dwfBackground?: string;\n /** DWF renderer device-pixel-ratio cap. */\n dwfMaxDevicePixelRatio?: number;\n /** DWF renderer maximum backing-store pixels per canvas. */\n dwfMaxCanvasPixels?: number;\n /** DWF WebGL GPU cache budget in bytes. */\n dwfMaxGpuCacheBytes?: number;\n /** Number of DWF pages/scenes kept in the native renderer cache. */\n dwfMaxCachedScenes?: number;\n /** DWF/XPS CAD line-weight rendering mode. Defaults to dwf-viewer's adaptive mode. */\n dwfLineWeightMode?: CadDwfLineWeightMode;\n /** Minimum CSS-pixel stroke used by the DWF/XPS adaptive line-weight renderer. */\n dwfMinStrokeCssPx?: number;\n /** Maximum overview stroke width before zoom restores physical line weights. */\n dwfMaxOverviewStrokeCssPx?: number;\n /** Minimum CSS-pixel text size shown in dense adaptive DWF/XPS overviews. */\n dwfMinTextCssPx?: number;\n /** Minimum filled area, in CSS pixels, shown in dense adaptive DWF/XPS overviews. */\n dwfMinFilledAreaCssPx?: number;\n /** Receives coarse loader progress events. */\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nexport interface CadLoadResult {\n document: CadDocument;\n raw?: unknown;\n bytes: number;\n elapsedMs: number;\n format: CadFormat;\n warnings: string[];\n}\n\nexport interface CadLoader {\n readonly id: string;\n readonly label: string;\n readonly formats: readonly CadFormat[];\n accepts(input: CadLoadInput, bytes?: Uint8Array): boolean;\n load(input: CadLoadInput, options?: CadLoadOptions): Promise<CadLoadResult>;\n}\n\n\n\nexport interface CadNativeRenderableLoader extends CadLoader {\n readonly nativeRenderer: true;\n mount(input: CadLoadInput, host: HTMLElement, options?: CadLoadOptions): Promise<CadLoadResult>;\n unmount(): void;\n fit?(): void;\n zoomIn?(): void;\n zoomOut?(): void;\n resize?(): void;\n setNativeOptions?(options: CadLoadOptions): void;\n}\n\nexport function isCadNativeRenderableLoader(loader: CadLoader): loader is CadNativeRenderableLoader {\n const candidate = loader as Partial<CadNativeRenderableLoader>;\n return candidate.nativeRenderer === true && typeof candidate.mount === 'function';\n}\n\nexport interface CadSummary {\n format: CadFormat;\n sourceName?: string;\n entityCount: number;\n layerCount: number;\n blockCount: number;\n pageCount: number;\n byType: Record<string, number>;\n warnings: string[];\n}\n","import type { CadDocument, CadEntity, CadLayer } from './types';\n\nconst BASE_ACI: Record<number, string> = {\n 1: '#ff0000', 2: '#ffff00', 3: '#00ff00', 4: '#00ffff', 5: '#0000ff', 6: '#ff00ff',\n 8: '#808080', 9: '#c0c0c0',\n 10: '#ff0000', 11: '#ff7f7f', 12: '#a50000', 13: '#a55252', 14: '#7f0000', 15: '#7f3f3f', 16: '#4c0000', 17: '#4c2626', 18: '#260000', 19: '#261313',\n 20: '#ff3f00', 21: '#ff9f7f', 22: '#a52900', 23: '#a56752', 24: '#7f1f00', 25: '#7f4f3f', 26: '#4c1300', 27: '#4c2f26', 28: '#260900', 29: '#261713',\n 30: '#ff7f00', 31: '#ffbf7f', 32: '#a55200', 33: '#a57c52', 34: '#7f3f00', 35: '#7f5f3f', 36: '#4c2600', 37: '#4c3926', 38: '#261300', 39: '#261c13',\n 40: '#ffbf00', 41: '#ffdf7f', 42: '#a57c00', 43: '#a59152', 44: '#7f5f00', 45: '#7f6f3f', 46: '#4c3900', 47: '#4c4226', 48: '#261c00', 49: '#262113',\n 50: '#ffff00', 51: '#ffff7f', 52: '#a5a500', 53: '#a5a552', 54: '#7f7f00', 55: '#7f7f3f', 56: '#4c4c00', 57: '#4c4c26', 58: '#262600', 59: '#262613',\n 60: '#bfff00', 61: '#dfff7f', 62: '#7ca500', 63: '#91a552', 64: '#5f7f00', 65: '#6f7f3f', 66: '#394c00', 67: '#424c26', 68: '#1c2600', 69: '#212613',\n 70: '#7fff00', 71: '#bfff7f', 72: '#52a500', 73: '#7ca552', 74: '#3f7f00', 75: '#5f7f3f', 76: '#264c00', 77: '#394c26', 78: '#132600', 79: '#1c2613',\n 80: '#3fff00', 81: '#9fff7f', 82: '#29a500', 83: '#67a552', 84: '#1f7f00', 85: '#4f7f3f', 86: '#134c00', 87: '#2f4c26', 88: '#092600', 89: '#172613',\n 90: '#00ff00', 91: '#7fff7f', 92: '#00a500', 93: '#52a552', 94: '#007f00', 95: '#3f7f3f', 96: '#004c00', 97: '#264c26', 98: '#002600', 99: '#132613',\n 100: '#00ff3f', 101: '#7fff9f', 102: '#00a529', 103: '#52a567', 104: '#007f1f', 105: '#3f7f4f', 106: '#004c13', 107: '#264c2f', 108: '#002609', 109: '#132617',\n 110: '#00ff7f', 111: '#7fffbf', 112: '#00a552', 113: '#52a57c', 114: '#007f3f', 115: '#3f7f5f', 116: '#004c26', 117: '#264c39', 118: '#002613', 119: '#13261c',\n 120: '#00ffbf', 121: '#7fffdf', 122: '#00a57c', 123: '#52a591', 124: '#007f5f', 125: '#3f7f6f', 126: '#004c39', 127: '#264c42', 128: '#00261c', 129: '#132621',\n 130: '#00ffff', 131: '#7fffff', 132: '#00a5a5', 133: '#52a5a5', 134: '#007f7f', 135: '#3f7f7f', 136: '#004c4c', 137: '#264c4c', 138: '#002626', 139: '#132626',\n 140: '#00bfff', 141: '#7fdfff', 142: '#007ca5', 143: '#5291a5', 144: '#005f7f', 145: '#3f6f7f', 146: '#00394c', 147: '#26424c', 148: '#001c26', 149: '#132126',\n 150: '#007fff', 151: '#7fbfff', 152: '#0052a5', 153: '#527ca5', 154: '#003f7f', 155: '#3f5f7f', 156: '#00264c', 157: '#26394c', 158: '#001326', 159: '#131c26',\n 160: '#003fff', 161: '#7f9fff', 162: '#0029a5', 163: '#5267a5', 164: '#001f7f', 165: '#3f4f7f', 166: '#00134c', 167: '#262f4c', 168: '#000926', 169: '#131726',\n 170: '#0000ff', 171: '#7f7fff', 172: '#0000a5', 173: '#5252a5', 174: '#00007f', 175: '#3f3f7f', 176: '#00004c', 177: '#26264c', 178: '#000026', 179: '#131326',\n 180: '#3f00ff', 181: '#9f7fff', 182: '#2900a5', 183: '#6752a5', 184: '#1f007f', 185: '#4f3f7f', 186: '#13004c', 187: '#2f264c', 188: '#090026', 189: '#171326',\n 190: '#7f00ff', 191: '#bf7fff', 192: '#5200a5', 193: '#7c52a5', 194: '#3f007f', 195: '#5f3f7f', 196: '#26004c', 197: '#39264c', 198: '#130026', 199: '#1c1326',\n 200: '#bf00ff', 201: '#df7fff', 202: '#7c00a5', 203: '#9152a5', 204: '#5f007f', 205: '#6f3f7f', 206: '#39004c', 207: '#42264c', 208: '#1c0026', 209: '#211326',\n 210: '#ff00ff', 211: '#ff7fff', 212: '#a500a5', 213: '#a552a5', 214: '#7f007f', 215: '#7f3f7f', 216: '#4c004c', 217: '#4c264c', 218: '#260026', 219: '#261326',\n 220: '#ff00bf', 221: '#ff7fdf', 222: '#a5007c', 223: '#a55291', 224: '#7f005f', 225: '#7f3f6f', 226: '#4c0039', 227: '#4c2642', 228: '#26001c', 229: '#261321',\n 230: '#ff007f', 231: '#ff7fbf', 232: '#a50052', 233: '#a5527c', 234: '#7f003f', 235: '#7f3f5f', 236: '#4c0026', 237: '#4c2639', 238: '#260013', 239: '#26131c',\n 240: '#ff003f', 241: '#ff7f9f', 242: '#a50029', 243: '#a55267', 244: '#7f001f', 245: '#7f3f4f', 246: '#4c0013', 247: '#4c262f', 248: '#260009', 249: '#261317',\n 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#bebebe', 255: '#ffffff'\n};\n\n\nexport type CadColorContrastMode = 'preserve' | 'adaptive';\n\nexport interface ColorResolveOptions {\n foreground?: string;\n background?: string;\n trueColorByteOrder?: 'rgb' | 'bgr';\n contrastMode?: CadColorContrastMode;\n minColorContrast?: number;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport function colorFromAci(index: number | undefined, fallback = '#ffffff', foreground = fallback): string {\n if (typeof index !== 'number' || Number.isNaN(index)) return fallback;\n const normalized = Math.abs(Math.trunc(index));\n if (normalized === 0 || normalized === 256 || normalized === 257) return fallback;\n // ACI 7 is intentionally foreground-dependent in CAD viewers: it should be\n // black on a light canvas and white on a dark canvas.\n if (normalized === 7) return foreground;\n return BASE_ACI[normalized] ?? fallback;\n}\n\nexport function colorFromTrueColor(value: number, byteOrder: 'rgb' | 'bgr' = 'rgb'): string {\n const int = Math.max(0, Math.trunc(value)) & 0xffffff;\n const a = (int >> 16) & 0xff;\n const b = (int >> 8) & 0xff;\n const c = int & 0xff;\n const red = byteOrder === 'rgb' ? a : c;\n const green = b;\n const blue = byteOrder === 'rgb' ? c : a;\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport function parseCssColor(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const v = value.trim();\n if (!v) return undefined;\n if (/^(#|rgb\\(|rgba\\(|hsl\\(|hsla\\()/i.test(v)) return normalizeXpsColor(v) ?? v;\n const named: Record<string, string> = {\n red: '#ff0000',\n yellow: '#ffff00',\n green: '#00ff00',\n cyan: '#00ffff',\n blue: '#0000ff',\n magenta: '#ff00ff',\n white: '#ffffff',\n black: '#000000',\n grey: '#808080',\n gray: '#808080'\n };\n return named[v.toLowerCase()];\n }\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const r = Number(obj.r ?? obj.red);\n const g = Number(obj.g ?? obj.green);\n const b = Number(obj.b ?? obj.blue);\n const a = Number(obj.a ?? obj.alpha ?? 1);\n if ([r, g, b].every(Number.isFinite)) {\n return Number.isFinite(a) && a >= 0 && a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;\n }\n }\n return undefined;\n}\n\nexport function normalizeXpsColor(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n if (/^#[0-9a-f]{8}$/i.test(trimmed)) {\n const a = parseInt(trimmed.slice(1, 3), 16) / 255;\n const r = parseInt(trimmed.slice(3, 5), 16);\n const g = parseInt(trimmed.slice(5, 7), 16);\n const b = parseInt(trimmed.slice(7, 9), 16);\n return a >= 0.999 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${roundAlpha(a)})`;\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed) || /^#[0-9a-f]{3}$/i.test(trimmed)) return trimmed;\n if (/^sc#/i.test(trimmed)) {\n const parts = trimmed.slice(3).split(',').map((x) => Number(x.trim()));\n const [a, r, g, b] = parts.length === 4 ? parts : [1, ...parts];\n if ([a, r, g, b].every(Number.isFinite)) return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${roundAlpha(a)})`;\n }\n return undefined;\n}\n\nexport function resolveCadColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string {\n const foreground = options.foreground ?? '#ffffff';\n const fallback = foreground;\n let color: string | undefined;\n\n const explicit = parseCssColor(entity.trueColor) ?? parseCssColor(entity.color) ?? parseCssColor(entity.colorName);\n if (explicit) color = explicit;\n\n if (!color) {\n const trueColorCandidate = numberFromKeys(entity, ['trueColor', 'true_color', 'truecolor', 'colorRGB', 'colorRgb', 'rgbColor', 'rgb']);\n if (typeof trueColorCandidate === 'number' && trueColorCandidate >= 0 && trueColorCandidate <= 0xffffff) {\n color = colorFromTrueColor(trueColorCandidate, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (typeof aci === 'number' && Math.abs(aci) <= 257 && aci !== 256 && aci !== 0 && aci !== 257) color = colorFromAci(aci, fallback, foreground);\n }\n\n if (!color && typeof entity.color === 'number') {\n const c = Number(entity.color);\n // Most DWG/DXF JavaScript parsers expose `color` as ACI for values 1..257.\n // Treating those values as RGB is the common cause of nearly black drawings.\n if (Math.abs(c) <= 257) {\n if (c !== 0 && c !== 256 && c !== 257) color = colorFromAci(c, fallback, foreground);\n } else {\n color = colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n }\n\n if (!color) {\n const layer = lookupLayer(document, entity.layer);\n color = resolveLayerColor(layer, options);\n }\n\n return adaptColorForCanvas(color ?? fallback, options);\n}\n\nexport function resolveFillColor(entity: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): string | undefined {\n let color: string | undefined;\n const explicit = parseCssColor(entity.fillColor);\n if (explicit) color = explicit;\n if (!color && typeof entity.fillColor === 'number') {\n const n = entity.fillColor;\n color = Math.abs(n) <= 257 ? colorFromAci(n, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff') : colorFromTrueColor(n, options.trueColorByteOrder ?? 'rgb');\n }\n if (!color && typeof entity.fillColorIndex === 'number') color = colorFromAci(entity.fillColorIndex, options.foreground ?? '#ffffff', options.foreground ?? '#ffffff');\n return color ? adaptColorForCanvas(color, options) : undefined;\n}\n\nexport function adaptColorForCanvas(color: string, options: ColorResolveOptions = {}): string {\n if (options.contrastMode !== 'adaptive') return color;\n const background = options.background ?? '#0b1020';\n const foreground = options.foreground ?? '#ffffff';\n return ensureContrast(color, background, foreground, options.minColorContrast ?? 2.4);\n}\n\nexport function ensureContrast(color: string, background: string, foreground: string, minRatio = 2.4): string {\n const fg = parseRgba(foreground) ?? { r: 255, g: 255, b: 255, a: 1 };\n const bg = parseRgba(background) ?? { r: 11, g: 16, b: 32, a: 1 };\n const raw = parseRgba(color);\n if (!raw) return color;\n\n const effective = alphaComposite(raw, bg);\n if (contrastRatio(effective, bg) >= minRatio) return color;\n\n const bgLum = relativeLuminance(bg);\n const target = bgLum < 0.5 ? { r: 255, g: 255, b: 255, a: raw.a } : { r: 0, g: 0, b: 0, a: raw.a };\n for (const amount of [0.25, 0.4, 0.55, 0.7, 0.85, 1]) {\n const mixed = mix(raw, target, amount);\n if (contrastRatio(alphaComposite(mixed, bg), bg) >= minRatio) return toCssColor(mixed);\n }\n\n if (contrastRatio(fg, bg) >= minRatio) return toCssColor(fg);\n return bgLum < 0.5 ? '#ffffff' : '#000000';\n}\n\nexport function layerVisible(layer: CadLayer | undefined): boolean {\n if (!layer) return true;\n return layer.isVisible !== false && layer.isFrozen !== true;\n}\n\nfunction resolveLayerColor(layer: CadLayer | undefined, options: ColorResolveOptions): string | undefined {\n if (!layer) return undefined;\n const foreground = options.foreground ?? '#ffffff';\n\n const trueColorText = parseCssColor(layer.trueColor);\n if (trueColorText) return trueColorText;\n if (typeof layer.trueColor === 'number' && layer.trueColor >= 0 && layer.trueColor <= 0xffffff) return colorFromTrueColor(layer.trueColor, options.trueColorByteOrder ?? 'rgb');\n\n const explicitColorText = parseCssColor(layer.color);\n if (explicitColorText) return explicitColorText;\n\n // Prefer a valid ACI index over a numeric `layer.color` when both are\n // present. LibreDWG's JS converter uses `color: 0xffffff` as a placeholder\n // for many indexed-color layers; using that value first turns drawings\n // monochrome white. The ACI index is the authoritative layer color in that\n // case.\n if (isRenderableAci(layer.colorIndex)) return colorFromAci(layer.colorIndex, foreground, foreground);\n\n if (typeof layer.color === 'number') {\n const c = Number(layer.color);\n return Math.abs(c) <= 257 ? colorFromAci(c, foreground, foreground) : colorFromTrueColor(c, options.trueColorByteOrder ?? 'rgb');\n }\n if (typeof layer.colorIndex === 'number') return colorFromAci(layer.colorIndex, foreground, foreground);\n return undefined;\n}\n\n\nexport function isByBlockColor(entity: CadEntity): boolean {\n const aci = firstNumber(entity.colorIndex, entity.colorNumber, (entity as Record<string, unknown>).aci);\n if (aci === 0) return true;\n return entity.trueColor === undefined && entity.color === 0;\n}\n\nexport function applyByBlockColorInheritance(entity: CadEntity, parent: CadEntity, document?: CadDocument, options: ColorResolveOptions = {}): CadEntity {\n if (!isByBlockColor(entity)) return entity;\n const inheritedColor = resolveCadColor(parent, document, options);\n const clone: CadEntity = { ...entity, color: inheritedColor, trueColor: undefined, colorIndex: undefined, colorNumber: undefined };\n return clone;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction lookupLayer(document: CadDocument | undefined, name: string | undefined): CadLayer | undefined {\n if (!document || !name) return undefined;\n return document.layers[name] ?? document.layers[name.toLowerCase()] ?? Object.values(document.layers).find((x) => x.name.toLowerCase() === name.toLowerCase());\n}\n\nfunction firstNumber(...values: unknown[]): number | undefined {\n for (const value of values) {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction numberFromKeys(entity: CadEntity, keys: string[]): number | undefined {\n const record = entity as Record<string, unknown>;\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction parseRgba(value: string): RgbaColor | undefined {\n const input = value.trim().toLowerCase();\n if (/^#[0-9a-f]{3}$/i.test(input)) {\n return {\n r: parseInt(input[1] + input[1], 16),\n g: parseInt(input[2] + input[2], 16),\n b: parseInt(input[3] + input[3], 16),\n a: 1\n };\n }\n if (/^#[0-9a-f]{6}$/i.test(input)) {\n return {\n r: parseInt(input.slice(1, 3), 16),\n g: parseInt(input.slice(3, 5), 16),\n b: parseInt(input.slice(5, 7), 16),\n a: 1\n };\n }\n const rgba = input.match(/^rgba?\\(([^)]+)\\)$/i);\n if (rgba) {\n const parts = rgba[1].split(/[,\\s/]+/).filter(Boolean).map((part) => Number(part.replace('%', '')));\n if (parts.length >= 3 && parts.slice(0, 3).every(Number.isFinite)) {\n const hasPercent = /%/.test(rgba[1]);\n return {\n r: clampByte(hasPercent ? parts[0] * 2.55 : parts[0]),\n g: clampByte(hasPercent ? parts[1] * 2.55 : parts[1]),\n b: clampByte(hasPercent ? parts[2] * 2.55 : parts[2]),\n a: Number.isFinite(parts[3]) ? Math.max(0, Math.min(1, parts[3])) : 1\n };\n }\n }\n return undefined;\n}\n\nfunction alphaComposite(color: RgbaColor, background: RgbaColor): RgbaColor {\n const a = color.a + background.a * (1 - color.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (color.r * color.a + background.r * background.a * (1 - color.a)) / a,\n g: (color.g * color.a + background.g * background.a * (1 - color.a)) / a,\n b: (color.b * color.a + background.b * background.a * (1 - color.a)) / a,\n a\n };\n}\n\nfunction mix(a: RgbaColor, b: RgbaColor, amount: number): RgbaColor {\n const t = Math.max(0, Math.min(1, amount));\n return {\n r: a.r + (b.r - a.r) * t,\n g: a.g + (b.g - a.g) * t,\n b: a.b + (b.b - a.b) * t,\n a: a.a\n };\n}\n\nfunction relativeLuminance(color: RgbaColor): number {\n const channels = [color.r, color.g, color.b].map((v) => {\n const s = v / 255;\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * channels[0] + 0.7152 * channels[1] + 0.0722 * channels[2];\n}\n\nfunction contrastRatio(a: RgbaColor, b: RgbaColor): number {\n const l1 = relativeLuminance(a);\n const l2 = relativeLuminance(b);\n const hi = Math.max(l1, l2);\n const lo = Math.min(l1, l2);\n return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction toCssColor(color: RgbaColor): string {\n const r = clampByte(color.r);\n const g = clampByte(color.g);\n const b = clampByte(color.b);\n return color.a < 0.999 ? `rgba(${r}, ${g}, ${b}, ${roundAlpha(color.a)})` : `rgb(${r}, ${g}, ${b})`;\n}\n\nfunction clampByte(value: number): number {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction roundAlpha(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n","import type { CadEntity, CadPathCommand, CadPoint2D, CadPoint3D } from './types';\n\nexport interface Matrix2D {\n a: number;\n b: number;\n c: number;\n d: number;\n e: number;\n f: number;\n}\n\nexport const IDENTITY_MATRIX: Matrix2D = { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n\nexport function multiplyMatrix(left: Matrix2D, right: Matrix2D): Matrix2D {\n return {\n a: left.a * right.a + left.c * right.b,\n b: left.b * right.a + left.d * right.b,\n c: left.a * right.c + left.c * right.d,\n d: left.b * right.c + left.d * right.d,\n e: left.a * right.e + left.c * right.f + left.e,\n f: left.b * right.e + left.d * right.f + left.f\n };\n}\n\nexport function translationMatrix(x: number, y: number): Matrix2D {\n return { a: 1, b: 0, c: 0, d: 1, e: x, f: y };\n}\n\nexport function rotationMatrix(angle: number): Matrix2D {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return { a: c, b: s, c: -s, d: c, e: 0, f: 0 };\n}\n\nexport function scaleMatrix(x: number, y = x): Matrix2D {\n return { a: x, b: 0, c: 0, d: y, e: 0, f: 0 };\n}\n\nexport function transformPoint(point: CadPoint2D | CadPoint3D, matrix: Matrix2D): CadPoint3D {\n return {\n x: point.x * matrix.a + point.y * matrix.c + matrix.e,\n y: point.x * matrix.b + point.y * matrix.d + matrix.f,\n z: 'z' in point ? point.z : undefined\n };\n}\n\nexport function transformPathCommands(commands: CadPathCommand[] | undefined, matrix: Matrix2D): CadPathCommand[] | undefined {\n if (!commands) return undefined;\n return commands.map((command) => ({ cmd: command.cmd, points: command.points.map((p) => transformPoint(p, matrix)) }));\n}\n\nexport function matrixFromInsert(entity: CadEntity, basePoint: CadPoint3D = { x: 0, y: 0 }): Matrix2D {\n const insertion = entity.insertionPoint ?? { x: 0, y: 0 };\n const scaleValue = entity.scale;\n const sx = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.x ?? 1) : Number((entity as Record<string, unknown>).scaleX ?? 1);\n const sy = typeof scaleValue === 'object' && scaleValue ? Number(scaleValue.y ?? sx) : Number((entity as Record<string, unknown>).scaleY ?? sx);\n const rotation = Number(entity.rotation ?? 0);\n let matrix = translationMatrix(insertion.x, insertion.y);\n matrix = multiplyMatrix(matrix, rotationMatrix(Number.isFinite(rotation) ? rotation : 0));\n matrix = multiplyMatrix(matrix, scaleMatrix(Number.isFinite(sx) ? sx : 1, Number.isFinite(sy) ? sy : 1));\n matrix = multiplyMatrix(matrix, translationMatrix(-basePoint.x, -basePoint.y));\n return matrix;\n}\n\nexport function transformEntity(entity: CadEntity, matrix: Matrix2D): CadEntity {\n const clone: CadEntity = { ...entity, 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","DEFAULT_DWG_WORKER_URL","DwgWorkerClient","supportsDwgWorker","worker","requestId","timeout","fileName","transferBuffer","prepareTransferBuffer","_b","resolve","reject","createAbortError","pending","serializeOptions","error","cleanupPending","createWorker","event","message","resolveWorkerUrl","resolveWasmPathForWorker","wasmPath","candidate","getPageOrigin","isAbsoluteUrl","getPageBaseUrl","workerUrl","value","DwgLoader","defaults","merged","sourceName","isAbortError","normalizeWorkerError","createCadDocument","init","inferEntityKind","type","normalizeCadEntity","raw","forcedType","entity","stringOrUndefined","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","mergedOptions","started","decodeDxfText","warnings","parsed","parseWithDxfParser","parseDxfFallback","normalizeDxfDatabase","elapsedMs","module","Parser","layers","extractDxfLayers","blocks","extractDxfBlocks","entities","normalizeDxfEntity","rawColor","normalizeDxfText","normalizeRotation","normalizeAngle","sx","sy","sz","control","normalizeControlPoints","fit","normalizeHatchLoops","normalizeSolidVertices","result","tables","layerTable","candidates","expandRecords","addDxfBlock","blockValue","fallbackName","loops","loop","preferredEncoding","explicitEncoding","normalizeDxfEncoding","decodeBytes","bomEncoding","detectBomEncoding","declaredEncoding","detectDxfCodePage","utf8","chooseBestLegacyDxfDecode","DXF_CODEPAGE_ENCODING","lines","cursor","code","_c","_d","trimmed","key","ansi","cp","encoding","bestText","bestScore","score","scoreDxfDecode","replacements","countMatches","controls","cjk","hasDxfStructure","pattern","match","pairs","section","current","polyline","pair","flushEntity","v","readPoint","readNumber","e","entityFromPairs","common","readString","degreesToRadiansSafe","readJoinedText","readLwPolylineVertices","readRepeatedPoints","found","xCode","yCode","zCode","yPair","zPair","j","chunks","DwfLoader","normalizeFormat","loaded","openDwfDocument","cadDocumentFromDwf","host","wasmUrl","resolveDwfWasmUrl","background","resolveDwfBackground","viewerOptions","buildDwfViewerOptions","loadOptions","buildDwfLoadOptions","DwfViewer","_e","button","native","setOptionalNumber","keepRaw","diagnosticsToWarnings","pageToCadPage","metadata","countBy","unique","pageEntities","pageIndex","primitive","primitiveToEntity","mesh","rgbToHex","base","pointsArrayToCadPoints","w","points","diagnostics","detected","ensureTrailingSlash","canvasOptions","rgb","g","toHex","values","createDefaultLoaderRegistry","isCadNativeRenderableLoader","BASE_ACI","colorFromAci","foreground","normalized","colorFromTrueColor","byteOrder","int","a","c","parseCssColor","normalizeXpsColor","obj","roundAlpha","parts","resolveCadColor","color","explicit","trueColorCandidate","numberFromKeys","aci","firstNumber","lookupLayer","resolveLayerColor","adaptColorForCanvas","resolveFillColor","ensureContrast","minRatio","fg","parseRgba","bg","effective","alphaComposite","contrastRatio","bgLum","relativeLuminance","amount","mixed","mix","toCssColor","layerVisible","trueColorText","explicitColorText","isRenderableAci","isByBlockColor","applyByBlockColorInheritance","parent","inheritedColor","keys","rgba","part","hasPercent","clampByte","channels","s","l1","l2","hi","lo","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","percent","nums","CadViewer","createRenderer","file","maybeDisposable","throwIfAborted","normalizedInput","normalizeError","backend","baseProgress","overrideProgress","progress","createCadViewer"],"mappings":"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,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,EAA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"}