@rickyzhangca/fpsr 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +267 -0
  4. package/dist/abort-CrgARaZd.js +43 -0
  5. package/dist/abort-CrgARaZd.js.map +1 -0
  6. package/dist/assets-Dy4fqZBV.d.ts +85 -0
  7. package/dist/assets-Dy4fqZBV.d.ts.map +1 -0
  8. package/dist/canvas.d.ts +98 -0
  9. package/dist/canvas.d.ts.map +1 -0
  10. package/dist/canvas.js +3 -0
  11. package/dist/execute-CRZV5zw1.js +963 -0
  12. package/dist/execute-CRZV5zw1.js.map +1 -0
  13. package/dist/host-DdX4g1YM.d.ts +34 -0
  14. package/dist/host-DdX4g1YM.d.ts.map +1 -0
  15. package/dist/index.d.ts +463 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +1776 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/node.d.ts +16 -0
  20. package/dist/node.d.ts.map +1 -0
  21. package/dist/node.js +101 -0
  22. package/dist/node.js.map +1 -0
  23. package/dist/planner.d.ts +418 -0
  24. package/dist/planner.d.ts.map +1 -0
  25. package/dist/planner.js +96 -0
  26. package/dist/planner.js.map +1 -0
  27. package/dist/profile-CTN1Q5SI.d.ts +365 -0
  28. package/dist/profile-CTN1Q5SI.d.ts.map +1 -0
  29. package/dist/profile-DR4i6HDp.js +610 -0
  30. package/dist/profile-DR4i6HDp.js.map +1 -0
  31. package/dist/render-db-BFQIspDB.d.ts +426 -0
  32. package/dist/render-db-BFQIspDB.d.ts.map +1 -0
  33. package/dist/render-db.d.ts +2 -0
  34. package/dist/render-db.js +1 -0
  35. package/dist/tiled-draw-list-Dc-5Ledi.js +3990 -0
  36. package/dist/tiled-draw-list-Dc-5Ledi.js.map +1 -0
  37. package/dist/types-CHgZBSra.d.ts +105 -0
  38. package/dist/types-CHgZBSra.d.ts.map +1 -0
  39. package/dist/upgrade-planner-CNjnMHPJ.d.ts +385 -0
  40. package/dist/upgrade-planner-CNjnMHPJ.d.ts.map +1 -0
  41. package/package.json +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-CRZV5zw1.js","names":["packedWidth","packedHeight","packedWidth","packedHeight","rgba"],"sources":["../src/text-font.ts","../src/checkerboard.ts","../src/coordinate-overlay.ts","../src/space-background.ts","../src/terrain-background.ts","../src/canvas2d/util.ts","../src/canvas2d/draw-icon.ts","../src/canvas2d/draw-snap-grid.ts","../src/canvas2d/draw-sprite.ts","../src/canvas2d/draw-text.ts","../src/canvas2d/draw-wire.ts","../src/canvas2d/execute.ts"],"sourcesContent":["/** CSS / canvas font-family registered from pipeline DejaVuSans.ttf. */\nexport const FPSR_TEXT_FONT_FAMILY = \"fpsr-dejavu\";\n\n/** Fallback stack when the bundled TTF is unavailable. */\nexport const FPSR_TEXT_FONT_FALLBACK = \"DejaVu Sans, sans-serif\";\n\nexport function fpsrTextFontCss(sizePx: number): string {\n return `${sizePx}px ${FPSR_TEXT_FONT_FAMILY}, ${FPSR_TEXT_FONT_FALLBACK}`;\n}\n","import type { Canvas2DContextLike } from \"./canvas2d.js\";\nimport type { ImageSource } from \"./host.js\";\n\nconst TILE_LIGHT = \"#1a1a1a\";\nconst TILE_DARK = \"#252525\";\n\n/** Fill `width`×`height` with an axis-aligned checkerboard; one cell = `pixelsPerTile` px. */\nexport function drawTileCheckerboard(\n ctx: Canvas2DContextLike,\n width: number,\n height: number,\n pixelsPerTile: number,\n tileOffsetX = 0,\n tileOffsetY = 0,\n): void {\n const ppt = Math.max(1, pixelsPerTile);\n const columns = Math.ceil(width / ppt);\n const rows = Math.ceil(height / ppt);\n // Drive coordinates from integer cell indexes. Repeatedly adding a\n // fractional ppt (for example 51.2 after 4K scaling) accumulates enough\n // floating-point error for floor(x / ppt) to repeat a cell at boundaries.\n for (let cellY = 0; cellY < rows; cellY++) {\n const y = cellY * ppt;\n for (let cellX = 0; cellX < columns; cellX++) {\n const x = cellX * ppt;\n ctx.fillStyle =\n (cellX + tileOffsetX + cellY + tileOffsetY) % 2 === 0 ? TILE_DARK : TILE_LIGHT;\n ctx.fillRect(x, y, Math.min(ppt, width - x), Math.min(ppt, height - y));\n }\n }\n}\n\n/** Paint an image on top of a tile-aligned checkerboard (for external reference PNGs). */\nexport function blitWithTileCheckerboard(\n canvas: {\n width: number;\n height: number;\n getContext(type: \"2d\"): Canvas2DContextLike | null;\n },\n image: ImageSource,\n width: number,\n height: number,\n pixelsPerTile: number,\n): void {\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n drawTileCheckerboard(ctx, width, height, pixelsPerTile);\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(image, 0, 0, width, height);\n}\n","import type { Canvas2DContextLike } from \"./canvas2d.js\";\nimport type { TileFrame } from \"./frame.js\";\n\nconst GRID_STROKE = \"rgba(255, 255, 255, 0.28)\";\nconst LABEL_FILL = \"rgba(255, 255, 255, 0.85)\";\nconst LABEL_SHADOW = \"rgba(0, 0, 0, 0.75)\";\n\n/** How often to place a cell label based on pixels-per-tile. */\nfunction labelStride(pixelsPerTile: number): number {\n if (pixelsPerTile < 12) return 4;\n if (pixelsPerTile < 24) return 2;\n return 1;\n}\n\n/**\n * Draw map-space tile grid lines and coordinate labels over a rendered preview.\n * Canvas (0,0) corresponds to `tileFrame.minX/minY`.\n */\nexport function drawCoordinateOverlay(\n ctx: Canvas2DContextLike,\n tileFrame: TileFrame,\n pixelsPerTile: number,\n width: number,\n height: number,\n outputTileFrame: TileFrame = tileFrame,\n): void {\n const { minX, minY, maxX, maxY } = tileFrame;\n const cols = maxX - minX;\n const rows = maxY - minY;\n if (cols <= 0 || rows <= 0 || pixelsPerTile <= 0) return;\n\n ctx.save();\n ctx.strokeStyle = GRID_STROKE;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (let i = 0; i <= cols; i++) {\n const x = i * pixelsPerTile + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, height);\n }\n for (let j = 0; j <= rows; j++) {\n const y = j * pixelsPerTile + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.stroke();\n\n const stride = labelStride(pixelsPerTile);\n const fontSize = Math.max(8, Math.min(12, Math.floor(pixelsPerTile * 0.35)));\n ctx.font = `${fontSize}px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace`;\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"left\";\n const pad = Math.max(1, Math.floor(pixelsPerTile * 0.06));\n const columnStart = (((outputTileFrame.minX - minX) % stride) + stride) % stride;\n const rowStart = (((outputTileFrame.minY - minY) % stride) + stride) % stride;\n\n for (let j = rowStart; j < rows; j += stride) {\n for (let i = columnStart; i < cols; i += stride) {\n const tx = minX + i;\n const ty = minY + j;\n const label = `${tx},${ty}`;\n const x = i * pixelsPerTile + pad;\n const y = j * pixelsPerTile + pad;\n ctx.fillStyle = LABEL_SHADOW;\n ctx.fillText(label, x + 1, y + 1);\n ctx.fillStyle = LABEL_FILL;\n ctx.fillText(label, x, y);\n }\n }\n\n ctx.restore();\n}\n","import type { Canvas2DContextLike } from \"./canvas2d.js\";\nimport type { ImageSource } from \"./host.js\";\nimport type { FrameMeta } from \"./types/render-db.js\";\n\nconst SPACE_FILL = \"#000000\";\nconst DEFAULT_STAR_SEED = 0x51f1_5e77;\n\ninterface StarLayer {\n cellSize: number;\n occupancy: number;\n brightness: [number, number];\n largeChance: number;\n salt: number;\n}\n\n/** Incommensurate grids overlap into a starfield without a visible repeated lattice. */\nconst STAR_LAYERS: readonly StarLayer[] = [\n { cellSize: 17, occupancy: 0.06, brightness: [0.24, 0.5], largeChance: 0, salt: 11 },\n { cellSize: 37, occupancy: 0.13, brightness: [0.42, 0.76], largeChance: 0.04, salt: 29 },\n { cellSize: 79, occupancy: 0.28, brightness: [0.68, 1], largeChance: 0.36, salt: 47 },\n];\n\n/**\n * Factorio `platform_backdrop` placement for Nauvis, expressed relative to\n * screen center with radius 600 on a ~1920×1080 reference viewport:\n * `position = {-680, 601}`, `radius = 600`.\n */\nconst PLANET_OFFSET_X_OVER_RADIUS = -680 / 600;\nconst PLANET_OFFSET_Y_OVER_RADIUS = 601 / 600;\n/** Planet radius as a fraction of the shorter canvas edge. */\nconst PLANET_RADIUS_FRACTION = 0.5;\n/** Floor so tiny previews still get a readable bottom-left peek. */\nconst PLANET_MIN_RADIUS_PX = 140;\n\nfunction packedWidth(frame: FrameMeta): number {\n return frame.pw ?? frame.w;\n}\n\nfunction packedHeight(frame: FrameMeta): number {\n return frame.ph ?? frame.h;\n}\n\n/** Deterministic 0..1 hash from integer cell coordinates. */\nconst cellHash = (cellX: number, cellY: number, salt: number): number => {\n let h = Math.imul(cellX, 374761393) ^ Math.imul(cellY, 668265263) ^ Math.imul(salt, 1442695041);\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n return ((h ^ (h >>> 16)) >>> 0) / 4294967296;\n};\n\nexport interface SpacePlanetDecoration {\n frame: FrameMeta;\n image: ImageSource;\n}\n\nexport interface DrawSpaceBackgroundOptions {\n /** Optional starmap planet drawn bottom-left after the starfield. */\n planet?: SpacePlanetDecoration;\n /** Stable salt; selected planets use different skies while rerenders remain reproducible. */\n seed?: number;\n /** Full output dimensions and this viewport's offset within it (for tiled rendering). */\n viewport?: {\n x: number;\n y: number;\n fullWidth: number;\n fullHeight: number;\n };\n}\n\n/**\n * Draw the space-platform planet peeking from the bottom-left, matching\n * Factorio's backdrop offset ratios scaled to the canvas.\n */\nexport function drawSpacePlanet(\n ctx: Canvas2DContextLike,\n width: number,\n height: number,\n planet: SpacePlanetDecoration,\n viewport?: DrawSpaceBackgroundOptions[\"viewport\"],\n): void {\n if (width <= 0 || height <= 0) return;\n const { frame, image } = planet;\n if (frame.sw <= 0 || frame.sh <= 0 || frame.w <= 0 || frame.h <= 0) return;\n\n const fullWidth = viewport?.fullWidth ?? width;\n const fullHeight = viewport?.fullHeight ?? height;\n const radius = Math.max(\n PLANET_MIN_RADIUS_PX,\n PLANET_RADIUS_FRACTION * Math.min(fullWidth, fullHeight),\n );\n const cx = fullWidth / 2 + PLANET_OFFSET_X_OVER_RADIUS * radius - (viewport?.x ?? 0);\n const cy = fullHeight / 2 + PLANET_OFFSET_Y_OVER_RADIUS * radius - (viewport?.y ?? 0);\n const logicalSize = radius * 2;\n const scale = logicalSize / Math.max(frame.sw, frame.sh);\n\n const previousSmoothing = ctx.imageSmoothingEnabled;\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(\n image,\n frame.x,\n frame.y,\n packedWidth(frame),\n packedHeight(frame),\n cx - radius + frame.ox * scale,\n cy - radius + frame.oy * scale,\n frame.w * scale,\n frame.h * scale,\n );\n ctx.imageSmoothingEnabled = previousSmoothing;\n}\n\nfunction smoothstep(value: number): number {\n return value * value * (3 - 2 * value);\n}\n\nfunction lerp(from: number, to: number, amount: number): number {\n return from + (to - from) * amount;\n}\n\n/** Smooth low-frequency value noise used only to vary local star density. */\nfunction densityNoise(x: number, y: number, seed: number): number {\n const cellX = Math.floor(x);\n const cellY = Math.floor(y);\n const tx = smoothstep(x - cellX);\n const ty = smoothstep(y - cellY);\n const top = lerp(cellHash(cellX, cellY, seed), cellHash(cellX + 1, cellY, seed), tx);\n const bottom = lerp(cellHash(cellX, cellY + 1, seed), cellHash(cellX + 1, cellY + 1, seed), tx);\n return lerp(top, bottom, ty);\n}\n\nfunction starDensity(x: number, y: number, seed: number): number {\n const broad = densityNoise(x / 310, y / 310, seed ^ 0x6d2b_79f5);\n const detail = densityNoise(x / 137, y / 137, seed ^ 0x1b87_3593);\n return 0.36 + (broad * 0.68 + detail * 0.32) * 0.88;\n}\n\nfunction drawStar(\n ctx: Canvas2DContextLike,\n width: number,\n height: number,\n x: number,\n y: number,\n size: number,\n color: string,\n sparkle: boolean,\n): void {\n const left = Math.max(0, x);\n const top = Math.max(0, y);\n const clippedWidth = Math.min(width, x + size) - left;\n const clippedHeight = Math.min(height, y + size) - top;\n if (clippedWidth <= 0 || clippedHeight <= 0) return;\n ctx.fillStyle = color;\n ctx.fillRect(left, top, clippedWidth, clippedHeight);\n if (!sparkle) return;\n ctx.fillRect(x - 1, y, 4, 1);\n ctx.fillRect(x, y - 1, 1, 4);\n}\n\n/** Fill `width`×`height` with a layered deterministic starfield. */\nexport function drawSpaceBackground(\n ctx: Canvas2DContextLike,\n width: number,\n height: number,\n options?: DrawSpaceBackgroundOptions,\n): void {\n if (width <= 0 || height <= 0) return;\n ctx.fillStyle = SPACE_FILL;\n ctx.fillRect(0, 0, width, height);\n\n const seed = options?.seed == null ? DEFAULT_STAR_SEED : options.seed >>> 0;\n const viewportX = options?.viewport?.x ?? 0;\n const viewportY = options?.viewport?.y ?? 0;\n for (const layer of STAR_LAYERS) {\n const firstCellX = Math.max(0, Math.floor(viewportX / layer.cellSize) - 1);\n const firstCellY = Math.max(0, Math.floor(viewportY / layer.cellSize) - 1);\n const lastCellX = Math.ceil((viewportX + width) / layer.cellSize);\n const lastCellY = Math.ceil((viewportY + height) / layer.cellSize);\n const layerSeed = seed ^ Math.imul(layer.salt, 0x9e37_79b1);\n for (let cellY = firstCellY; cellY < lastCellY; cellY++) {\n for (let cellX = firstCellX; cellX < lastCellX; cellX++) {\n const xUnit = cellHash(cellX, cellY, layerSeed ^ 2);\n const yUnit = cellHash(cellX, cellY, layerSeed ^ 3);\n const globalX = cellX * layer.cellSize + Math.floor(xUnit * layer.cellSize);\n const globalY = cellY * layer.cellSize + Math.floor(yUnit * layer.cellSize);\n const density = starDensity(globalX, globalY, seed);\n if (cellHash(cellX, cellY, layerSeed ^ 1) > layer.occupancy * density) continue;\n\n const brightness = lerp(\n layer.brightness[0],\n layer.brightness[1],\n cellHash(cellX, cellY, layerSeed ^ 4),\n );\n const warmth = cellHash(cellX, cellY, layerSeed ^ 5) - 0.5;\n const red = Math.round(Math.min(1, brightness * (1 + warmth * 0.12)) * 255);\n const green = Math.round(brightness * (1 - Math.abs(warmth) * 0.035) * 255);\n const blue = Math.round(Math.min(1, brightness * (1 - warmth * 0.16)) * 255);\n const size = cellHash(cellX, cellY, layerSeed ^ 6) < layer.largeChance ? 2 : 1;\n const sparkle = size === 2 && cellHash(cellX, cellY, layerSeed ^ 7) > 0.86;\n drawStar(\n ctx,\n width,\n height,\n globalX - viewportX,\n globalY - viewportY,\n size,\n `rgb(${red},${green},${blue})`,\n sparkle,\n );\n }\n }\n }\n\n if (options?.planet) drawSpacePlanet(ctx, width, height, options.planet, options.viewport);\n}\n","import type { Canvas2DContextLike } from \"./canvas2d.js\";\nimport type { TileFrame } from \"./frame.js\";\nimport type { ImageSource } from \"./host.js\";\nimport type { FrameMeta, TerrainPatchBackground, TerrainPatchSet } from \"./types/render-db.js\";\n\nconst UINT32_RANGE = 4_294_967_296;\nconst VARIANT_SALT = 0x9e37_79b9;\nconst PATCH_SIZE_SALT = 0x85eb_ca6b;\n/** Keep enough smaller patches in uniform terrain to break up large repeated motifs. */\nconst MAX_LARGEST_PATCH_PROBABILITY = 0.4;\nconst MAX_INTERMEDIATE_PATCH_PROBABILITY = 0.7;\n\nfunction packedWidth(frame: FrameMeta): number {\n return frame.pw ?? frame.w;\n}\n\nfunction packedHeight(frame: FrameMeta): number {\n return frame.ph ?? frame.h;\n}\n\n/** Stable unsigned hash for an absolute terrain-patch cell and background salt. */\nfunction terrainCellHash(cellX: number, cellY: number, salt: number): number {\n let hash =\n (Math.imul(cellX | 0, 374_761_393) ^\n Math.imul(cellY | 0, 668_265_263) ^\n Math.imul(salt | 0, 1_597_334_677)) |\n 0;\n hash = Math.imul(hash ^ (hash >>> 13), 1_274_126_177);\n return (hash ^ (hash >>> 16)) >>> 0;\n}\n\n/** Derive a fallback salt for pre-seed render databases without coupling terrain types. */\nfunction terrainSeed(background: TerrainPatchBackground): number {\n if (Number.isFinite(background.seed)) return (background.seed ?? 0) >>> 0;\n let seed = 2_166_136_261;\n for (const patch of [background, ...(background.patches ?? [])]) {\n seed = Math.imul(seed ^ Math.floor(patch.patchSize), 16_777_619) >>> 0;\n for (const frame of patch.frames) {\n seed = Math.imul(seed ^ ((frame + 1) >>> 0), 16_777_619) >>> 0;\n }\n }\n return seed >>> 0;\n}\n\nfunction greatestCommonDivisor(a: number, b: number): number {\n let left = Math.abs(a);\n let right = Math.abs(b);\n while (right !== 0) {\n const remainder = left % right;\n left = right;\n right = remainder;\n }\n return left;\n}\n\n/**\n * Split four-or-more variants into two seed-permuted pools on a checkerboard.\n * Direct neighbours cannot select the exact same authored frame, while selection\n * within each pool remains hashed and weighted.\n */\nfunction variantCandidates(count: number, cellX: number, cellY: number, seed: number): number[] {\n if (count < 4) return Array.from({ length: count }, (_, index) => index);\n\n let stride = ((seed >>> 8) % count) | 1;\n while (greatestCommonDivisor(stride, count) !== 1) stride += 2;\n const offset = (seed >>> 16) % count;\n const parity = (cellX + cellY) & 1;\n const candidates: number[] = [];\n for (let logical = parity; logical < count; logical += 2) {\n candidates.push((logical * stride + offset) % count);\n }\n return candidates;\n}\n\nfunction selectVariant(cellX: number, cellY: number, patch: TerrainPatchSet, seed: number): number {\n const candidates = variantCandidates(patch.frames.length, cellX, cellY, seed);\n const unit = terrainCellHash(cellX, cellY, seed ^ VARIANT_SALT) / UINT32_RANGE;\n const { weights } = patch;\n if (!weights || weights.length !== patch.frames.length) {\n return candidates[Math.min(candidates.length - 1, Math.floor(unit * candidates.length))] ?? 0;\n }\n\n let total = 0;\n for (const index of candidates) {\n const weight = weights[index] ?? 0;\n if (Number.isFinite(weight) && weight > 0) total += weight;\n }\n if (total <= 0) {\n return candidates[Math.min(candidates.length - 1, Math.floor(unit * candidates.length))] ?? 0;\n }\n\n let target = unit * total;\n for (const index of candidates) {\n const weight = weights[index] ?? 0;\n if (Number.isFinite(weight) && weight > 0) {\n target -= weight;\n if (target < 0) return index;\n }\n }\n return candidates[candidates.length - 1] ?? 0;\n}\n\nfunction terrainPatchSets(background: TerrainPatchBackground): TerrainPatchSet[] {\n const unique = new Map<number, TerrainPatchSet>();\n for (const patch of [background, ...(background.patches ?? [])]) {\n const patchSize = Math.floor(patch.patchSize);\n if (patchSize > 0 && patch.frames.length > 0 && !unique.has(patchSize)) {\n unique.set(patchSize, {\n patchSize,\n frames: patch.frames,\n ...(patch.weights ? { weights: patch.weights } : {}),\n ...(patch.probability != null ? { probability: patch.probability } : {}),\n });\n }\n }\n return [...unique.values()].sort((left, right) => right.patchSize - left.patchSize);\n}\n\nfunction patchProbability(patch: TerrainPatchSet, index: number, count: number): number {\n if (index === count - 1) return 1;\n const authored = Number.isFinite(patch.probability)\n ? Math.max(0, Math.min(1, patch.probability ?? 1))\n : 1;\n const cap = index === 0 ? MAX_LARGEST_PATCH_PROBABILITY : MAX_INTERMEDIATE_PATCH_PROBABILITY;\n return Math.min(authored, cap);\n}\n\nfunction rgba(color: [number, number, number, number]): string {\n const [r, g, b, a] = color;\n return `rgba(${Math.round(r * 255)},${Math.round(g * 255)},${Math.round(b * 255)},${a})`;\n}\n\nexport interface DrawTerrainBackgroundOptions {\n tileFrame: TileFrame;\n pixelsPerTile: number;\n frames: FrameMeta[];\n images: ImageSource[];\n background?: TerrainPatchBackground;\n fallbackColor: [number, number, number, number];\n}\n\n/**\n * Paint an infinite terrain plane anchored to absolute map coordinates.\n * Only complete, untransformed Factorio patches are drawn. Larger regions may\n * be subdivided into complete smaller authored patches, so every destination is\n * covered exactly once and every texture edge keeps its intended orientation.\n */\nexport function drawTerrainBackground(\n ctx: Canvas2DContextLike,\n width: number,\n height: number,\n options: DrawTerrainBackgroundOptions,\n): void {\n if (width <= 0 || height <= 0) return;\n\n const { background, fallbackColor, frames, images, pixelsPerTile, tileFrame } = options;\n ctx.fillStyle = rgba(background?.color ?? fallbackColor);\n ctx.fillRect(0, 0, width, height);\n if (!background) return;\n\n const patchSets = terrainPatchSets(background);\n const largestPatch = patchSets[0];\n if (!largestPatch) return;\n\n const seed = terrainSeed(background);\n const previousSmoothing = ctx.imageSmoothingEnabled;\n ctx.imageSmoothingEnabled = false;\n\n const drawPatch = (worldX: number, worldY: number, patch: TerrainPatchSet): void => {\n const cellX = Math.floor(worldX / patch.patchSize);\n const cellY = Math.floor(worldY / patch.patchSize);\n const patchSeed = seed ^ Math.imul(patch.patchSize, PATCH_SIZE_SALT);\n const variantIndex = selectVariant(cellX, cellY, patch, patchSeed);\n const frameId = patch.frames[variantIndex];\n const frame = frameId == null ? undefined : frames[frameId];\n const image = frame ? images[frame.a] : undefined;\n if (!frame || !image || frame.sw <= 0 || frame.sh <= 0) return;\n\n // `maxOutputSize` can produce a fractional pixelsPerTile. Snap both sides\n // from the same absolute world boundary so neighbouring patches share the\n // exact destination pixel instead of exposing one-pixel background seams.\n const patchLeft = Math.round((worldX - tileFrame.minX) * pixelsPerTile);\n const patchTop = Math.round((worldY - tileFrame.minY) * pixelsPerTile);\n const patchRight = Math.round((worldX + patch.patchSize - tileFrame.minX) * pixelsPerTile);\n const patchBottom = Math.round((worldY + patch.patchSize - tileFrame.minY) * pixelsPerTile);\n const scaleX = (patchRight - patchLeft) / frame.sw;\n const scaleY = (patchBottom - patchTop) / frame.sh;\n ctx.drawImage(\n image,\n frame.x,\n frame.y,\n packedWidth(frame),\n packedHeight(frame),\n patchLeft + frame.ox * scaleX,\n patchTop + frame.oy * scaleY,\n frame.w * scaleX,\n frame.h * scaleY,\n );\n };\n\n const drawRegion = (\n worldX: number,\n worldY: number,\n regionSize: number,\n patchIndex: number,\n ): void => {\n const patch = patchSets[patchIndex];\n if (!patch) return;\n\n if (patch.patchSize < regionSize) {\n const step = patch.patchSize;\n for (let offsetY = 0; offsetY < regionSize; offsetY += step) {\n for (let offsetX = 0; offsetX < regionSize; offsetX += step) {\n drawRegion(worldX + offsetX, worldY + offsetY, step, patchIndex);\n }\n }\n return;\n }\n\n const cellX = Math.floor(worldX / regionSize);\n const cellY = Math.floor(worldY / regionSize);\n const probability = patchProbability(patch, patchIndex, patchSets.length);\n const usePatch =\n probability >= 1 ||\n terrainCellHash(cellX, cellY, seed ^ Math.imul(regionSize, PATCH_SIZE_SALT)) / UINT32_RANGE <\n probability;\n const nextPatch = patchSets[patchIndex + 1];\n if (usePatch || !nextPatch || regionSize % nextPatch.patchSize !== 0) {\n drawPatch(worldX, worldY, patch);\n return;\n }\n\n const step = nextPatch.patchSize;\n for (let offsetY = 0; offsetY < regionSize; offsetY += step) {\n for (let offsetX = 0; offsetX < regionSize; offsetX += step) {\n drawRegion(worldX + offsetX, worldY + offsetY, step, patchIndex + 1);\n }\n }\n };\n\n const patchSize = largestPatch.patchSize;\n const firstCellX = Math.floor(tileFrame.minX / patchSize);\n const firstCellY = Math.floor(tileFrame.minY / patchSize);\n const lastCellX = Math.ceil(tileFrame.maxX / patchSize);\n const lastCellY = Math.ceil(tileFrame.maxY / patchSize);\n for (let cellY = firstCellY; cellY < lastCellY; cellY++) {\n for (let cellX = firstCellX; cellX < lastCellX; cellX++) {\n drawRegion(cellX * patchSize, cellY * patchSize, patchSize, 0);\n }\n }\n\n ctx.imageSmoothingEnabled = previousSmoothing;\n}\n","import type { FrameMeta } from \"../types/render-db.js\";\n\nexport function packedWidth(frame: FrameMeta): number {\n return frame.pw ?? frame.w;\n}\n\nexport function packedHeight(frame: FrameMeta): number {\n return frame.ph ?? frame.h;\n}\n\nexport function rgba([r, g, b, a]: [number, number, number, number]): string {\n return `rgba(${r * 255}, ${g * 255}, ${b * 255}, ${a})`;\n}\n","import type { ImageSource } from \"../host.js\";\nimport { entityInfoSilhouettePadPx } from \"../icon-silhouette.js\";\nimport type { IconCmd } from \"../types/draw-list.js\";\nimport type { FrameMeta } from \"../types/render-db.js\";\nimport type { Canvas2DContextLike } from \"./types.js\";\nimport { packedHeight, packedWidth } from \"./util.js\";\n\n// Entity-info icons occupy 32 px at scale 1. The backing is a 53 px\n// `extra-high-no-scale` utility sprite, so it intentionally extends beyond\n// the foreground icon instead of being normalized as another 64 px icon.\nconst ENTITY_INFO_BASE_ICON_PX = 32;\n/** Scale the foreground icon inside the pin so it sits above the chevron. */\nconst REQUEST_PIN_ICON_SCALE = 0.7;\n/** Shift the pin icon upward (fraction of command size) into the pin body. */\nconst REQUEST_PIN_ICON_Y_SHIFT = 0.1;\n/**\n * Trimmed atlas width still includes soft alpha fringe. Opaque chrome (a>20) is\n * ~44 px of the 48 px trim — scale to that so layout gaps match the visible edge.\n */\nconst REQUEST_PIN_OPAQUE_WIDTH_RATIO = 44 / 48;\n\nexport function drawIcon(\n ctx: Canvas2DContextLike,\n cmd: IconCmd,\n frame: FrameMeta,\n image: ImageSource,\n frames: FrameMeta[],\n images: ImageSource[],\n iconImage: ImageSource | undefined,\n silhouetteImage: ImageSource | undefined,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const size = cmd.size * ppt;\n const cx = (cmd.x + ox) * ppt;\n const cy = (cmd.y + oy) * ppt;\n const isRequestPin = cmd.backingStyle === \"request-pin\";\n const left = cx - size / 2;\n const top = cy - size / 2;\n\n const backingFrame = cmd.backingFrame == null ? undefined : frames[cmd.backingFrame];\n const backingImage = backingFrame ? images[backingFrame.a] : undefined;\n if (backingFrame && backingImage) {\n // Request pins: map opaque chrome width to cmd.size (trim still has soft fringe).\n // Entity-info: 53px around 32px.\n const backingBasePx = isRequestPin\n ? Math.max(1, backingFrame.w * REQUEST_PIN_OPAQUE_WIDTH_RATIO)\n : ENTITY_INFO_BASE_ICON_PX;\n const backingScale = size / backingBasePx;\n const backingWidth = backingFrame.sw * backingScale;\n const backingHeight = backingFrame.sh * backingScale;\n const backingLeft = cx - backingWidth / 2;\n const backingTop = cy - backingHeight / 2;\n const previousAlpha = ctx.globalAlpha;\n // Entity-info: soft disc at 16% alpha; request-pin: full-alpha cyan chrome.\n if (!isRequestPin) ctx.globalAlpha = previousAlpha * 0.16;\n ctx.drawImage(\n backingImage,\n backingFrame.x,\n backingFrame.y,\n packedWidth(backingFrame),\n packedHeight(backingFrame),\n backingLeft + backingFrame.ox * backingScale,\n backingTop + backingFrame.oy * backingScale,\n backingFrame.w * backingScale,\n backingFrame.h * backingScale,\n );\n ctx.globalAlpha = previousAlpha;\n } else if (cmd.backing) {\n ctx.fillStyle = \"rgba(0,0,0,0.6)\";\n const radius = size * 0.15;\n if (typeof ctx.roundRect === \"function\") {\n ctx.beginPath();\n ctx.roundRect(left, top, size, size, radius);\n ctx.fill();\n } else {\n ctx.fillRect(left, top, size, size);\n }\n }\n\n const drawSize = isRequestPin ? size * REQUEST_PIN_ICON_SCALE : size;\n const drawCx = cx;\n const drawCy = isRequestPin ? cy - size * REQUEST_PIN_ICON_Y_SHIFT : cy;\n const drawLeft = drawCx - drawSize / 2;\n const drawTop = drawCy - drawSize / 2;\n const iconScaleX = frame.sw === 0 ? 0 : drawSize / frame.sw;\n const iconScaleY = frame.sh === 0 ? 0 : drawSize / frame.sh;\n const iconLeft = drawLeft + frame.ox * iconScaleX;\n const iconTop = drawTop + frame.oy * iconScaleY;\n const iconWidth = frame.w * iconScaleX;\n const iconHeight = frame.h * iconScaleY;\n const hasEntityInfoBacking = !isRequestPin && (backingFrame != null || cmd.backing === true);\n const needsEntityInfoSilhouette =\n !isRequestPin && (hasEntityInfoBacking || cmd.silhouette === true);\n const drawIconLayer = (\n sourceImage: ImageSource,\n sourceX: number,\n sourceY: number,\n sourceW: number,\n sourceH: number,\n destLeft: number,\n destTop: number,\n destWidth: number,\n destHeight: number,\n ): void => {\n if (cmd.rotation != null && cmd.rotation !== 0) {\n ctx.save();\n ctx.translate(drawCx, drawCy);\n ctx.rotate((cmd.rotation * Math.PI) / 180);\n ctx.drawImage(\n sourceImage,\n sourceX,\n sourceY,\n sourceW,\n sourceH,\n destLeft - drawCx,\n destTop - drawCy,\n destWidth,\n destHeight,\n );\n ctx.restore();\n return;\n }\n ctx.drawImage(\n sourceImage,\n sourceX,\n sourceY,\n sourceW,\n sourceH,\n destLeft,\n destTop,\n destWidth,\n destHeight,\n );\n };\n\n if (needsEntityInfoSilhouette && iconImage && silhouetteImage) {\n const pad = entityInfoSilhouettePadPx();\n const sourcePad = Math.max(1, Math.round(pad * (packedWidth(frame) / frame.w)));\n const padX = pad * iconScaleX;\n const padY = pad * iconScaleY;\n drawIconLayer(\n silhouetteImage,\n 0,\n 0,\n packedWidth(frame) + 2 * sourcePad,\n packedHeight(frame) + 2 * sourcePad,\n iconLeft - padX,\n iconTop - padY,\n iconWidth + 2 * padX,\n iconHeight + 2 * padY,\n );\n drawIconLayer(\n iconImage,\n 0,\n 0,\n packedWidth(frame),\n packedHeight(frame),\n iconLeft,\n iconTop,\n iconWidth,\n iconHeight,\n );\n return;\n }\n\n const sourceImage = iconImage ?? image;\n const sourceX = iconImage ? 0 : frame.x;\n const sourceY = iconImage ? 0 : frame.y;\n drawIconLayer(\n sourceImage,\n sourceX,\n sourceY,\n packedWidth(frame),\n packedHeight(frame),\n iconLeft,\n iconTop,\n iconWidth,\n iconHeight,\n );\n}\n","import type { SnapGridCmd } from \"../types/draw-list.js\";\nimport type { Canvas2DContextLike } from \"./types.js\";\n\n/** Factorio snap-rectangle green. */\nconst SNAP_GRID_STROKE = \"#3cff00\";\nconst SNAP_GRID_STROKE_OUTER = \"#0a3d00\";\n/** Dash pattern in tiles at 32 ppt. */\nconst SNAP_DASH_AT_32PPT = [10, 6];\n\n/**\n * Draw the blueprint snap-to-grid rectangle as a dashed perimeter along the\n * four edges (no corner L-brackets).\n */\nexport function drawSnapGrid(\n ctx: Canvas2DContextLike,\n cmd: SnapGridCmd,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const { x, y, w, h } = cmd;\n if (!(w > 0) || !(h > 0)) return;\n drawSnapGridStroke(ctx, x, y, w, h, ox, oy, ppt);\n}\n\nfunction drawSnapGridStroke(\n ctx: Canvas2DContextLike,\n x: number,\n y: number,\n w: number,\n h: number,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const px = (x + ox) * ppt;\n const py = (y + oy) * ppt;\n const pw = w * ppt;\n const ph = h * ppt;\n const lineWidth = Math.max(2, (3 * ppt) / 32);\n const dash = SNAP_DASH_AT_32PPT.map((v) => (v * ppt) / 32);\n\n ctx.save();\n if (typeof ctx.setLineDash === \"function\") ctx.setLineDash(dash);\n ctx.lineCap = \"butt\";\n ctx.lineWidth = lineWidth + 2;\n ctx.strokeStyle = SNAP_GRID_STROKE_OUTER;\n strokeRectCompat(ctx, px + 0.5, py + 0.5, pw - 1, ph - 1);\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = SNAP_GRID_STROKE;\n strokeRectCompat(ctx, px + 0.5, py + 0.5, pw - 1, ph - 1);\n if (typeof ctx.setLineDash === \"function\") ctx.setLineDash([]);\n ctx.restore();\n}\n\nfunction strokeRectCompat(\n ctx: Canvas2DContextLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): void {\n if (typeof ctx.strokeRect === \"function\") {\n ctx.strokeRect(x, y, w, h);\n return;\n }\n ctx.beginPath();\n ctx.rect(x, y, w, h);\n ctx.stroke();\n}\n","import type { ImageSource } from \"../host.js\";\nimport { RENDER_LAYERS, type RectCmd, type SpriteCmd } from \"../types/draw-list.js\";\nimport type { FrameMeta } from \"../types/render-db.js\";\nimport type { Canvas2DContextLike, ExecuteDrawListOptions } from \"./types.js\";\nimport { packedHeight, packedWidth, rgba } from \"./util.js\";\n\nconst PIXEL_SNAPPED_RAIL_LAYERS = new Set<number>([\n RENDER_LAYERS[\"rail-stone-path-lower\"],\n RENDER_LAYERS[\"rail-stone-path\"],\n RENDER_LAYERS[\"rail-tie\"],\n RENDER_LAYERS[\"rail-screw\"],\n RENDER_LAYERS[\"rail-metal\"],\n RENDER_LAYERS[\"elevated-rail-stone-path-lower\"],\n RENDER_LAYERS[\"elevated-rail-stone-path\"],\n RENDER_LAYERS[\"elevated-rail-tie\"],\n RENDER_LAYERS[\"elevated-rail-screw\"],\n RENDER_LAYERS[\"elevated-rail-metal\"],\n]);\n\nexport function drawRect(\n ctx: Canvas2DContextLike,\n cmd: RectCmd,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n ctx.fillStyle = rgba(cmd.color);\n ctx.fillRect((cmd.x + ox) * ppt, (cmd.y + oy) * ppt, cmd.w * ppt, cmd.h * ppt);\n}\n\nexport function atlasSourceRect(\n frame: FrameMeta,\n src: { x: number; y: number; w: number; h: number },\n): { x: number; y: number; w: number; h: number } {\n const packedW = packedWidth(frame);\n const packedH = packedHeight(frame);\n const atlasScaleX = frame.w === 0 ? 0 : packedW / frame.w;\n const atlasScaleY = frame.h === 0 ? 0 : packedH / frame.h;\n const relX = src.x - frame.ox;\n const relY = src.y - frame.oy;\n return {\n x: frame.x + relX * atlasScaleX,\n y: frame.y + relY * atlasScaleY,\n w: src.w * atlasScaleX,\n h: src.h * atlasScaleY,\n };\n}\n\nexport function drawSprite(\n ctx: Canvas2DContextLike,\n cmd: SpriteCmd,\n frame: FrameMeta,\n image: ImageSource,\n ox: number,\n oy: number,\n ppt: number,\n createCanvas?: ExecuteDrawListOptions[\"createCanvas\"],\n): void {\n let dx = (cmd.x + ox) * ppt;\n let dy = (cmd.y + oy) * ppt;\n let dw = cmd.w * ppt;\n let dh = cmd.h * ppt;\n\n // Rail pieces are authored to meet exactly at their untrimmed sprite\n // boundaries. When a large render is capped, ppt becomes fractional and\n // independent drawImage calls can round the shared edge in opposite\n // directions, exposing a one-pixel strip of terrain. Snap both sides from\n // absolute world coordinates so adjacent pieces share the same pixel edge.\n if (PIXEL_SNAPPED_RAIL_LAYERS.has(cmd.layer) && (cmd.rotation ?? 0) === 0) {\n const right = Math.round((cmd.x + cmd.w + ox) * ppt);\n const bottom = Math.round((cmd.y + cmd.h + oy) * ppt);\n dx = Math.round(dx);\n dy = Math.round(dy);\n dw = right - dx;\n dh = bottom - dy;\n }\n\n const src = cmd.src ?? { x: 0, y: 0, w: frame.sw, h: frame.sh };\n const scaleX = src.w === 0 ? 0 : dw / src.w;\n const scaleY = src.h === 0 ? 0 : dh / src.h;\n const atlasSrc = cmd.src\n ? atlasSourceRect(frame, src)\n : {\n x: frame.x,\n y: frame.y,\n w: packedWidth(frame),\n h: packedHeight(frame),\n };\n const trimmedDx = cmd.src ? dx : dx + frame.ox * scaleX;\n const trimmedDy = cmd.src ? dy : dy + frame.oy * scaleY;\n const trimmedDw = cmd.src ? dw : frame.w * scaleX;\n const trimmedDh = cmd.src ? dh : frame.h * scaleY;\n\n const prevAlpha = ctx.globalAlpha;\n if (cmd.shadow) {\n ctx.globalAlpha = prevAlpha * 0.5;\n }\n\n const flipX = cmd.flipX === true;\n const flipY = cmd.flipY === true;\n const rotation = cmd.rotation ?? 0;\n const hasClip = cmd.clip != null;\n const tint = cmd.tint;\n\n const blit = (\n target: Canvas2DContextLike,\n destDx: number,\n destDy: number,\n destDw: number,\n destDh: number,\n ): void => {\n target.drawImage(\n image,\n atlasSrc.x,\n atlasSrc.y,\n atlasSrc.w,\n atlasSrc.h,\n destDx,\n destDy,\n destDw,\n destDh,\n );\n };\n\n /** Multiply-tint the sprite via an offscreen canvas, then draw the result. */\n const tintedSource = (): { image: ImageSource; w: number; h: number } | null => {\n if (!tint || !createCanvas) return null;\n const tw = Math.max(1, Math.ceil(trimmedDw));\n const th = Math.max(1, Math.ceil(trimmedDh));\n const scratch = createCanvas(tw, th);\n scratch.width = tw;\n scratch.height = th;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return null;\n sctx.imageSmoothingEnabled = false;\n blit(sctx, 0, 0, tw, th);\n sctx.globalCompositeOperation = \"multiply\";\n sctx.fillStyle = rgba(tint);\n sctx.fillRect(0, 0, tw, th);\n sctx.globalCompositeOperation = \"destination-in\";\n blit(sctx, 0, 0, tw, th);\n sctx.globalCompositeOperation = \"source-over\";\n return { image: scratch as unknown as ImageSource, w: tw, h: th };\n };\n\n const tinted = tintedSource();\n\n if (hasClip) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n (cmd.clip!.x + ox) * ppt,\n (cmd.clip!.y + oy) * ppt,\n cmd.clip!.w * ppt,\n cmd.clip!.h * ppt,\n );\n ctx.clip();\n }\n\n if (flipX || flipY || rotation !== 0) {\n // Rotate/flip around the untrimmed sprite center so shift+rotation stay aligned.\n const ucx = dx + dw / 2;\n const ucy = dy + dh / 2;\n ctx.save();\n ctx.translate(ucx, ucy);\n if (rotation !== 0) ctx.rotate((rotation * Math.PI) / 180);\n ctx.scale(flipX ? -1 : 1, flipY ? -1 : 1);\n if (tinted) {\n ctx.drawImage(\n tinted.image,\n 0,\n 0,\n tinted.w,\n tinted.h,\n trimmedDx - ucx,\n trimmedDy - ucy,\n trimmedDw,\n trimmedDh,\n );\n } else {\n blit(ctx, trimmedDx - ucx, trimmedDy - ucy, trimmedDw, trimmedDh);\n }\n ctx.restore();\n } else if (tinted) {\n ctx.drawImage(\n tinted.image,\n 0,\n 0,\n tinted.w,\n tinted.h,\n trimmedDx,\n trimmedDy,\n trimmedDw,\n trimmedDh,\n );\n } else {\n blit(ctx, trimmedDx, trimmedDy, trimmedDw, trimmedDh);\n }\n\n // Legacy straight/curved lower rail beds have a sparse alpha-feathered\n // perimeter. Extend a narrow interior sample beyond each edge so an\n // adjoining piece can fill the feather's holes. Unlike enlarging the\n // destination, this leaves every pixel inside the authored sprite unchanged.\n const seamBleed = cmd.seamBleed;\n if (seamBleed && !hasClip && !tinted && !flipX && !flipY && rotation === 0) {\n const bleed = (\n clipX: number,\n clipY: number,\n clipW: number,\n clipH: number,\n sx: number,\n sy: number,\n ) => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(clipX, clipY, clipW, clipH);\n ctx.clip();\n blit(ctx, trimmedDx + sx, trimmedDy + sy, trimmedDw, trimmedDh);\n ctx.restore();\n };\n const seamBand = 2;\n if (seamBleed.top) bleed(dx, dy - seamBand, dw, seamBand, 0, -seamBand);\n if (seamBleed.right) bleed(dx + dw, dy, seamBand, dh, seamBand, 0);\n if (seamBleed.bottom) bleed(dx, dy + dh, dw, seamBand, 0, seamBand);\n if (seamBleed.left) bleed(dx - seamBand, dy, seamBand, dh, -seamBand, 0);\n }\n\n if (hasClip) {\n ctx.restore();\n }\n\n if (cmd.shadow) {\n ctx.globalAlpha = prevAlpha;\n }\n}\n\ninterface PixelBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function shadowSpriteBounds(\n cmd: SpriteCmd,\n frame: FrameMeta,\n ox: number,\n oy: number,\n ppt: number,\n outputWidth: number,\n outputHeight: number,\n): PixelBounds | null {\n const dx = (cmd.x + ox) * ppt;\n const dy = (cmd.y + oy) * ppt;\n const dw = cmd.w * ppt;\n const dh = cmd.h * ppt;\n const scaleX = frame.sw === 0 ? 0 : dw / frame.sw;\n const scaleY = frame.sh === 0 ? 0 : dh / frame.sh;\n const left = dx + frame.ox * scaleX;\n const top = dy + frame.oy * scaleY;\n const right = left + frame.w * scaleX;\n const bottom = top + frame.h * scaleY;\n const centerX = dx + dw / 2;\n const centerY = dy + dh / 2;\n const radians = ((cmd.rotation ?? 0) * Math.PI) / 180;\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const flipX = cmd.flipX === true ? -1 : 1;\n const flipY = cmd.flipY === true ? -1 : 1;\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const [x, y] of [\n [left, top],\n [right, top],\n [right, bottom],\n [left, bottom],\n ] as const) {\n const localX = (x - centerX) * flipX;\n const localY = (y - centerY) * flipY;\n const transformedX = centerX + localX * cos - localY * sin;\n const transformedY = centerY + localX * sin + localY * cos;\n minX = Math.min(minX, transformedX);\n minY = Math.min(minY, transformedY);\n maxX = Math.max(maxX, transformedX);\n maxY = Math.max(maxY, transformedY);\n }\n\n // Preserve transformed edge pixels at tile boundaries. The gutter is only\n // used for conservative command-to-tile assignment; the tile canvas itself\n // provides the exact output clip.\n minX = Math.floor(minX) - 1;\n minY = Math.floor(minY) - 1;\n maxX = Math.ceil(maxX) + 1;\n maxY = Math.ceil(maxY) + 1;\n\n if (cmd.clip) {\n const clipLeft = (cmd.clip.x + ox) * ppt;\n const clipTop = (cmd.clip.y + oy) * ppt;\n const clipRight = clipLeft + cmd.clip.w * ppt;\n const clipBottom = clipTop + cmd.clip.h * ppt;\n minX = Math.max(minX, clipLeft);\n minY = Math.max(minY, clipTop);\n maxX = Math.min(maxX, clipRight);\n maxY = Math.min(maxY, clipBottom);\n }\n\n minX = Math.max(0, minX);\n minY = Math.max(0, minY);\n maxX = Math.min(outputWidth, maxX);\n maxY = Math.min(outputHeight, maxY);\n return maxX > minX && maxY > minY ? { minX, minY, maxX, maxY } : null;\n}\n","import { fpsrTextFontCss } from \"../text-font.js\";\nimport type { TextCmd } from \"../types/draw-list.js\";\nimport type { Canvas2DContextLike } from \"./types.js\";\nimport { rgba } from \"./util.js\";\n\nexport function drawText(\n ctx: Canvas2DContextLike,\n cmd: TextCmd,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const sizePx = Math.max(1, cmd.size * ppt);\n ctx.save();\n ctx.font = fpsrTextFontCss(sizePx);\n ctx.textAlign = cmd.align ?? \"left\";\n ctx.textBaseline = cmd.baseline ?? \"top\";\n ctx.fillStyle = rgba(cmd.color);\n ctx.fillText(cmd.text, (cmd.x + ox) * ppt, (cmd.y + oy) * ppt);\n ctx.restore();\n}\n","import { TRAIN_CHAIN_JOINT_RADIUS } from \"../train-chains.js\";\nimport type { TrainChainCmd, WireCmd } from \"../types/draw-list.js\";\nimport type { Canvas2DContextLike } from \"./types.js\";\n\n// FBE-aligned muted wire colors (game uses textured strips; we approximate with\n// a thin semi-transparent stroke so they don't read as solid bars).\nconst WIRE_COLORS: Record<WireCmd[\"wire\"], string> = {\n copper: \"#cf7c00\",\n red: \"#c83718\",\n green: \"#588c38\",\n};\n/** Stroke width in px at 32 ppt (FBE uses 1.5; we go slightly thinner). */\nconst WIRE_WIDTH_AT_32PPT = 1;\nconst WIRE_ALPHA = 0.72;\n/** Factorio rolling-stock coupling overlay (procedural; no dedicated sprite).\n * In-game measured color `#658024` (olive). Chart constants like\n * `green_wire_color` / `train_preview_path_outline_color` are pure `#00ff00`\n * and do not match this overlay; `vehicle_wagon_connection_color` is map-only red. */\nconst TRAIN_CHAIN_COLOR = \"#658024\";\n/** Stroke width in px at 32 ppt (in-game coupling overlay ≈ 3 px). */\nconst TRAIN_CHAIN_WIDTH_AT_32PPT = 3;\nconst TRAIN_CHAIN_ALPHA = 0.95;\n\nexport function drawWire(\n ctx: Canvas2DContextLike,\n cmd: WireCmd,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const x1 = (cmd.x1 + ox) * ppt;\n const y1 = (cmd.y1 + oy) * ppt;\n const x2 = (cmd.x2 + ox) * ppt;\n const y2 = (cmd.y2 + oy) * ppt;\n const dist = Math.hypot(x2 - x1, y2 - y1);\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2 + 0.15 * dist;\n\n const prevAlpha = ctx.globalAlpha;\n ctx.beginPath();\n ctx.strokeStyle = WIRE_COLORS[cmd.wire];\n ctx.lineWidth = (WIRE_WIDTH_AT_32PPT * ppt) / 32;\n ctx.lineCap = \"round\";\n ctx.globalAlpha = prevAlpha * WIRE_ALPHA;\n ctx.moveTo(x1, y1);\n ctx.quadraticCurveTo(mx, my, x2, y2);\n ctx.stroke();\n ctx.globalAlpha = prevAlpha;\n}\n\nexport function drawTrainChain(\n ctx: Canvas2DContextLike,\n cmd: TrainChainCmd,\n ox: number,\n oy: number,\n ppt: number,\n): void {\n const prevAlpha = ctx.globalAlpha;\n ctx.strokeStyle = TRAIN_CHAIN_COLOR;\n ctx.lineWidth = (TRAIN_CHAIN_WIDTH_AT_32PPT * ppt) / 32;\n ctx.lineCap = \"round\";\n ctx.globalAlpha = prevAlpha * TRAIN_CHAIN_ALPHA;\n\n for (const s of cmd.segments) {\n ctx.beginPath();\n ctx.moveTo((s.x1 + ox) * ppt, (s.y1 + oy) * ppt);\n ctx.lineTo((s.x2 + ox) * ppt, (s.y2 + oy) * ppt);\n ctx.stroke();\n }\n\n const r = TRAIN_CHAIN_JOINT_RADIUS * ppt;\n for (const j of cmd.joints) {\n ctx.beginPath();\n ctx.arc((j.x + ox) * ppt, (j.y + oy) * ppt, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n\n ctx.globalAlpha = prevAlpha;\n}\n","import { drawTileCheckerboard } from \"../checkerboard.js\";\nimport { drawCoordinateOverlay } from \"../coordinate-overlay.js\";\nimport type { ImageSource } from \"../host.js\";\nimport { drawSpaceBackground } from \"../space-background.js\";\nimport { drawTerrainBackground } from \"../terrain-background.js\";\nimport type { DrawList, SpriteCmd } from \"../types/draw-list.js\";\nimport { drawIcon } from \"./draw-icon.js\";\nimport { drawSnapGrid } from \"./draw-snap-grid.js\";\nimport { drawRect, drawSprite, shadowSpriteBounds } from \"./draw-sprite.js\";\nimport { drawText } from \"./draw-text.js\";\nimport { drawTrainChain, drawWire } from \"./draw-wire.js\";\nimport type { Canvas2DContextLike, ExecuteDrawListOptions } from \"./types.js\";\nimport { rgba } from \"./util.js\";\n\nconst TERRAIN_FALLBACK_COLOR: [number, number, number, number] = [\n 141 / 255,\n 104 / 255,\n 60 / 255,\n 1,\n];\n\n/**\n * Execute a sorted draw list against a Canvas2D context.\n * `images[i]` is the atlas image for atlas index i.\n */\nexport function executeDrawList(\n ctx: Canvas2DContextLike,\n list: DrawList,\n images: ImageSource[],\n opts: ExecuteDrawListOptions,\n): void {\n const ppt = opts.pixelsPerTile;\n const pad = opts.padTiles ?? 0;\n const { frames } = opts;\n const { minX, minY, maxX, maxY } = list.bounds;\n const frame = opts.tileFrame ?? {\n minX: Math.floor(minX) - pad,\n minY: Math.floor(minY) - pad,\n maxX: Math.ceil(maxX) + pad,\n maxY: Math.ceil(maxY) + pad,\n };\n const ox = -frame.minX;\n const oy = -frame.minY;\n const width = Math.max(0, (frame.maxX - frame.minX) * ppt);\n const height = Math.max(0, (frame.maxY - frame.minY) * ppt);\n const shadowTileSize = Math.max(1, Math.floor(opts.shadowTileSize ?? 1024));\n const stats = opts.stats;\n if (stats) {\n stats.shadowRuns = 0;\n stats.shadowTiles = 0;\n stats.shadowCompositedPixels = 0;\n stats.shadowPeakScratchPixels = 0;\n }\n\n // Nearest-neighbor: Factorio sprites are pixel art; bilinear filtering turns\n // rotated/foreshortened hands into a soft \"motion blur\" smear.\n ctx.imageSmoothingEnabled = false;\n\n if (opts.showSpace) {\n const planetFrameId = opts.spaceBackground?.planetFrame;\n const planetFrame = planetFrameId != null ? opts.frames[planetFrameId] : undefined;\n const planetImage = planetFrame ? images[planetFrame.a] : undefined;\n drawSpaceBackground(ctx, width, height, {\n seed: planetFrameId,\n viewport: opts.outputTileFrame\n ? {\n x: (frame.minX - opts.outputTileFrame.minX) * ppt,\n y: (frame.minY - opts.outputTileFrame.minY) * ppt,\n fullWidth: (opts.outputTileFrame.maxX - opts.outputTileFrame.minX) * ppt,\n fullHeight: (opts.outputTileFrame.maxY - opts.outputTileFrame.minY) * ppt,\n }\n : undefined,\n planet:\n planetFrame && planetImage\n ? {\n frame: planetFrame,\n image: planetImage,\n }\n : undefined,\n });\n } else if (opts.terrainBackground) {\n drawTerrainBackground(ctx, width, height, {\n tileFrame: frame,\n pixelsPerTile: ppt,\n frames: opts.frames,\n images,\n background: opts.terrainBackground,\n fallbackColor: opts.terrainBackground.color ?? TERRAIN_FALLBACK_COLOR,\n });\n } else if (opts.showCheckerboard) {\n drawTileCheckerboard(ctx, width, height, ppt, frame.minX, frame.minY);\n } else if (opts.background) {\n ctx.fillStyle = rgba(opts.background);\n ctx.fillRect(0, 0, width, height);\n }\n\n // Flatten shadow overlap at full opacity, then apply the combined result at\n // 50%. A single reusable tile bounds scratch memory independently of output\n // dimensions while retaining the old overlap semantics.\n let shadowCanvas:\n | {\n width: number;\n height: number;\n getContext(type: \"2d\"): Canvas2DContextLike | null;\n }\n | undefined;\n let shadowCtx: Canvas2DContextLike | null = null;\n const renderShadowRun = (commands: SpriteCmd[]): void => {\n if (!opts.createCanvas || commands.length === 0 || width <= 0 || height <= 0) return;\n const tileWidth = Math.min(shadowTileSize, Math.ceil(width));\n const tileHeight = Math.min(shadowTileSize, Math.ceil(height));\n if (!shadowCanvas) {\n shadowCanvas = opts.createCanvas(tileWidth, tileHeight);\n shadowCanvas.width = tileWidth;\n shadowCanvas.height = tileHeight;\n shadowCtx = shadowCanvas.getContext(\"2d\");\n if (shadowCtx) shadowCtx.imageSmoothingEnabled = false;\n }\n if (!shadowCtx || !shadowCanvas) return;\n\n const columns = Math.ceil(width / shadowTileSize);\n const bins = new Map<number, SpriteCmd[]>();\n for (const command of commands) {\n const spriteFrame = frames[command.frame];\n const image = spriteFrame ? images[spriteFrame.a] : undefined;\n if (!spriteFrame || !image) continue;\n const bounds = shadowSpriteBounds(command, spriteFrame, ox, oy, ppt, width, height);\n if (!bounds) continue;\n const minTileX = Math.floor(bounds.minX / shadowTileSize);\n const minTileY = Math.floor(bounds.minY / shadowTileSize);\n const maxTileX = Math.floor((bounds.maxX - 1) / shadowTileSize);\n const maxTileY = Math.floor((bounds.maxY - 1) / shadowTileSize);\n for (let tileY = minTileY; tileY <= maxTileY; tileY++) {\n for (let tileX = minTileX; tileX <= maxTileX; tileX++) {\n const key = tileY * columns + tileX;\n const bin = bins.get(key);\n if (bin) bin.push(command);\n else bins.set(key, [command]);\n }\n }\n }\n\n if (stats) {\n stats.shadowRuns++;\n stats.shadowPeakScratchPixels = Math.max(\n stats.shadowPeakScratchPixels,\n shadowCanvas.width * shadowCanvas.height,\n );\n }\n const prevAlpha = ctx.globalAlpha;\n for (const [key, tileCommands] of [...bins].sort((a, b) => a[0] - b[0])) {\n const tileX = key % columns;\n const tileY = Math.floor(key / columns);\n const outputX = tileX * shadowTileSize;\n const outputY = tileY * shadowTileSize;\n const outputTileWidth = Math.min(shadowTileSize, width - outputX);\n const outputTileHeight = Math.min(shadowTileSize, height - outputY);\n\n shadowCtx.clearRect(0, 0, shadowCanvas.width, shadowCanvas.height);\n shadowCtx.save();\n shadowCtx.translate(-outputX, -outputY);\n for (const command of tileCommands) {\n const spriteFrame = frames[command.frame];\n const image = spriteFrame ? images[spriteFrame.a] : undefined;\n if (!spriteFrame || !image) continue;\n drawSprite(\n shadowCtx,\n { ...command, shadow: false },\n spriteFrame,\n image,\n ox,\n oy,\n ppt,\n opts.createCanvas,\n );\n }\n shadowCtx.restore();\n\n ctx.globalAlpha = prevAlpha * 0.5;\n ctx.drawImage(\n shadowCanvas as unknown as ImageSource,\n 0,\n 0,\n outputTileWidth,\n outputTileHeight,\n outputX,\n outputY,\n outputTileWidth,\n outputTileHeight,\n );\n if (stats) {\n stats.shadowTiles++;\n stats.shadowCompositedPixels += outputTileWidth * outputTileHeight;\n }\n }\n ctx.globalAlpha = prevAlpha;\n };\n\n for (let commandIndex = 0; commandIndex < list.commands.length; commandIndex++) {\n const cmd = list.commands[commandIndex]!;\n if (cmd.kind === \"sprite\" && cmd.shadow && opts.createCanvas) {\n const shadowRun: SpriteCmd[] = [];\n while (commandIndex < list.commands.length) {\n const candidate = list.commands[commandIndex];\n if (candidate?.kind !== \"sprite\" || !candidate.shadow) break;\n shadowRun.push(candidate);\n commandIndex++;\n }\n commandIndex--;\n renderShadowRun(shadowRun);\n continue;\n }\n switch (cmd.kind) {\n case \"rect\":\n drawRect(ctx, cmd, ox, oy, ppt);\n break;\n case \"sprite\": {\n const frame = frames[cmd.frame];\n const image = frame ? images[frame.a] : undefined;\n if (!frame || !image) break;\n drawSprite(ctx, cmd, frame, image, ox, oy, ppt, opts.createCanvas);\n break;\n }\n case \"wire\":\n drawWire(ctx, cmd, ox, oy, ppt);\n break;\n case \"train-chain\":\n drawTrainChain(ctx, cmd, ox, oy, ppt);\n break;\n case \"snap-grid\":\n drawSnapGrid(ctx, cmd, ox, oy, ppt);\n break;\n case \"text\":\n drawText(ctx, cmd, ox, oy, ppt);\n break;\n case \"icon\": {\n const frame = frames[cmd.frame];\n const image = frame ? images[frame.a] : undefined;\n if (!frame || !image) break;\n drawIcon(\n ctx,\n cmd,\n frame,\n image,\n frames,\n images,\n opts.iconImages?.get(cmd.frame),\n opts.silhouetteImages?.get(cmd.frame),\n ox,\n oy,\n ppt,\n );\n break;\n }\n }\n }\n\n if (opts.showCoordinates) {\n drawCoordinateOverlay(ctx, frame, ppt, width, height, opts.outputTileFrame ?? frame);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ //#region src/host.d.ts
2
+ /**
3
+ * DOM-free host abstractions for canvas / image types.
4
+ *
5
+ * Published declarations must type-check in a strict Node-only TypeScript
6
+ * project (no DOM lib, no skipLibCheck). Browser and skia-canvas values are
7
+ * accepted at runtime as structural matches.
8
+ */
9
+ /** Opaque decoded image used as a canvas drawImage source. */
10
+ type ImageSource = object;
11
+ /** Minimal ImageData shape used for silhouette baking. */
12
+ interface ImageDataLike {
13
+ readonly data: Uint8ClampedArray;
14
+ readonly width: number;
15
+ readonly height: number;
16
+ }
17
+ type CanvasFillStyle = string;
18
+ type CanvasLineCap = "butt" | "round" | "square";
19
+ type CanvasTextAlign = "start" | "end" | "left" | "right" | "center";
20
+ type CanvasTextBaseline = "top" | "hanging" | "middle" | "alphabetic" | "ideographic" | "bottom";
21
+ /** Subset of CSS compositing operators used by the Canvas2D backend. */
22
+ type GlobalCompositeOperation = "source-over" | "source-in" | "source-out" | "source-atop" | "destination-over" | "destination-in" | "destination-out" | "destination-atop" | "lighter" | "copy" | "xor" | "multiply" | "screen" | "overlay" | "darken" | "lighten" | "color-dodge" | "color-burn" | "hard-light" | "soft-light" | "difference" | "exclusion" | "hue" | "saturation" | "color" | "luminosity";
23
+ /** Options passed to AssetSource load methods. */
24
+ interface AssetLoadOptions {
25
+ /**
26
+ * Abort waiting for this load. Shared in-flight fetches are not cancelled
27
+ * for other concurrent consumers; only the waiting caller is rejected.
28
+ * Aborted waits never poison the shared success cache.
29
+ */
30
+ signal?: AbortSignal;
31
+ }
32
+ //#endregion
33
+ export { CanvasTextBaseline as a, ImageSource as c, CanvasTextAlign as i, CanvasFillStyle as n, GlobalCompositeOperation as o, CanvasLineCap as r, ImageDataLike as s, AssetLoadOptions as t };
34
+ //# sourceMappingURL=host-DdX4g1YM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-DdX4g1YM.d.ts","names":[],"sources":["../src/host.ts"],"mappings":";;AASA;;;;AAAuB;AAGvB;;KAHY,WAAA;;UAGK,aAAA;EAAA,SACN,IAAA,EAAM,iBAAiB;EAAA,SACvB,KAAA;EAAA,SACA,MAAA;AAAA;AAAA,KAGC,eAAA;AAAA,KAEA,aAAA;AAAA,KAEA,eAAA;AAAA,KAEA,kBAAA;;KASA,wBAAA;AAbZ;AAAA,UA0CiB,gBAAA;;;AA1CQ;AAEzB;;EA8CE,MAAA,GAAS,WAAW;AAAA"}