{"version":3,"file":"ai-model/shared/model-locate-result/bbox.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/bbox.ts"],"sourcesContent":["import type {\n  LocateResultBbox,\n  LocateResultContext,\n  PixelBbox,\n  SectionLocatePixelBboxGroup,\n} from './types';\n\nexport function maxPixelIndex(size: number) {\n  return Math.max(size - 1, 0);\n}\n\nexport function normalizedCoordinateToPixelIndex(\n  value: number,\n  normalizedBy: number,\n  size: number,\n) {\n  return Math.round((value * maxPixelIndex(size)) / normalizedBy);\n}\n\nexport function mapNormalizedCoordinatesToPixelBbox(\n  coordinates: LocateResultBbox,\n  normalizedBy: number,\n  width: number,\n  height: number,\n): PixelBbox {\n  // PixelBbox uses inclusive pixel indexes, so normalized coordinates map to\n  // size - 1.\n  const [left, top, right, bottom] = coordinates;\n  return [\n    normalizedCoordinateToPixelIndex(left, normalizedBy, width),\n    normalizedCoordinateToPixelIndex(top, normalizedBy, height),\n    normalizedCoordinateToPixelIndex(right, normalizedBy, width),\n    normalizedCoordinateToPixelIndex(bottom, normalizedBy, height),\n  ];\n}\n\nexport function expandPointToBbox(\n  x: number,\n  y: number,\n  maxX: number,\n  maxY: number,\n  halfSize: number,\n): LocateResultBbox {\n  return [\n    Math.max(0, x - halfSize),\n    Math.max(0, y - halfSize),\n    Math.min(maxX, x + halfSize),\n    Math.min(maxY, y + halfSize),\n  ];\n}\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max);\n}\n\nfunction assertFinitePixelBbox(\n  pixelBbox: readonly number[],\n  rawResult: unknown,\n): asserts pixelBbox is PixelBbox {\n  if (\n    pixelBbox.length !== 4 ||\n    !pixelBbox.every(\n      (value) => typeof value === 'number' && Number.isFinite(value),\n    )\n  ) {\n    throw new Error(`invalid locate bbox data: ${JSON.stringify(rawResult)} `);\n  }\n}\n\nfunction assertPixelBboxOrder(pixelBbox: PixelBbox, rawResult: unknown) {\n  const [left, top, right, bottom] = pixelBbox;\n  if (right >= left && bottom >= top) {\n    return;\n  }\n\n  throw new Error(\n    `locate pixel bbox has invalid coordinate order: bbox=${JSON.stringify(\n      rawResult,\n    )} pixelBbox=${JSON.stringify(pixelBbox)}`,\n  );\n}\n\nfunction assertPixelBboxInsideImage(\n  pixelBbox: PixelBbox,\n  rawResult: unknown,\n  width: number,\n  height: number,\n) {\n  const [left, top, right, bottom] = pixelBbox;\n  const maxRight = maxPixelIndex(width);\n  const maxBottom = maxPixelIndex(height);\n  const outOfImage =\n    left < 0 || top < 0 || right > maxRight || bottom > maxBottom;\n\n  if (!outOfImage) {\n    return;\n  }\n\n  throw new Error(\n    `locate pixel bbox is outside the image size: bbox=${JSON.stringify(\n      rawResult,\n    )} imageSize=${width}x${height}`,\n  );\n}\n\nexport function finalizePixelBbox(\n  pixelBbox: PixelBbox,\n  rawResult: unknown,\n  { preparedSize, contentSize }: LocateResultContext,\n): PixelBbox {\n  const { width, height } = preparedSize;\n  assertFinitePixelBbox(pixelBbox, rawResult);\n  assertPixelBboxOrder(pixelBbox, rawResult);\n  assertPixelBboxInsideImage(pixelBbox, rawResult, width, height);\n\n  const rightLimit = maxPixelIndex(contentSize?.width ?? width);\n  const bottomLimit = maxPixelIndex(contentSize?.height ?? height);\n  const [left, top, right, bottom] = pixelBbox;\n\n  return [\n    clamp(left, 0, rightLimit),\n    clamp(top, 0, bottomLimit),\n    clamp(right, 0, rightLimit),\n    clamp(bottom, 0, bottomLimit),\n  ];\n}\n\nexport function finalizeSectionLocatePixelBboxGroup(\n  result: SectionLocatePixelBboxGroup,\n  rawResult: unknown,\n  ctx: LocateResultContext,\n): SectionLocatePixelBboxGroup {\n  return {\n    target: finalizePixelBbox(result.target, rawResult, ctx),\n    ...(result.references\n      ? {\n          references: result.references.map((reference) =>\n            finalizePixelBbox(reference, rawResult, ctx),\n          ),\n        }\n      : {}),\n  };\n}\n"],"names":["maxPixelIndex","size","Math","normalizedCoordinateToPixelIndex","value","normalizedBy","mapNormalizedCoordinatesToPixelBbox","coordinates","width","height","left","top","right","bottom","expandPointToBbox","x","y","maxX","maxY","halfSize","clamp","min","max","assertFinitePixelBbox","pixelBbox","rawResult","Number","Error","JSON","assertPixelBboxOrder","assertPixelBboxInsideImage","maxRight","maxBottom","outOfImage","finalizePixelBbox","preparedSize","contentSize","rightLimit","bottomLimit","finalizeSectionLocatePixelBboxGroup","result","ctx","reference"],"mappings":"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"}