{"version":3,"sources":["jsdelivr-header.js","/npm/@thi.ng/pixel-analysis@2.0.22/hues.js","/npm/@thi.ng/pixel-analysis@2.0.22/analyze-colors.js","/npm/@thi.ng/pixel-analysis@2.0.22/analyze-features.js"],"names":[],"mappings":"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","file":"/npm/@thi.ng/pixel-analysis@2.0.22/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@thi.ng/pixel-analysis@2.0.22/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { ensureArray } from \"@thi.ng/arrays/ensure-array\";\nimport { compareByKey } from \"@thi.ng/compare\";\nimport { TAU } from \"@thi.ng/math/api\";\nimport { roundTo } from \"@thi.ng/math/prec\";\nimport { smoothStep } from \"@thi.ng/math/step\";\nimport { circularRange } from \"@thi.ng/metrics/metrics\";\nimport { normFrequenciesAuto, repeat, transduce } from \"@thi.ng/transducers\";\nimport { map } from \"@thi.ng/transducers/map\";\nimport { mapcat } from \"@thi.ng/transducers/mapcat\";\nimport { mean } from \"@thi.ng/transducers/mean\";\nimport { circularMean } from \"@thi.ng/vectors/circular\";\nfunction* selectHueRange(colors, minHue, maxHue, minSat) {\n  const pred = __hueSelector(minHue, maxHue);\n  for (const col of colors) {\n    if (col[1] >= minSat && pred(col[0])) yield col;\n  }\n}\nfunction* selectHueRangeIDs(colors, minHue, maxHue, minSat) {\n  const pred = __hueSelector(minHue, maxHue);\n  let id = 0;\n  for (const col of colors) {\n    if (col[1] >= minSat && pred(col[0])) yield id;\n    id++;\n  }\n}\nconst countHueRange = (colors, minHue, maxHue, minSat) => {\n  const pred = __hueSelector(minHue, maxHue);\n  let count = 0;\n  for (const col of colors) {\n    if (col[1] >= minSat && pred(col[0])) count++;\n  }\n  return count;\n};\nconst __hueSelector = (min, max) => min <= max ? (h) => h >= min && h < max : (h) => h >= min || h < max;\nconst hueRangeArea = (colors, hueRanges, minSat = 0.2) => {\n  const $img = ensureArray(colors);\n  const selected = new Set(\n    mapcat((range) => selectHueRangeIDs($img, ...range, minSat), hueRanges)\n  );\n  return selected.size / $img.length;\n};\nconst hueRangeAreaIntensity = (colors, hueRanges, minSat = 0.2) => {\n  const $colors = ensureArray(colors);\n  const selected = new Set(\n    mapcat(\n      (range) => selectHueRangeIDs($colors, ...range, minSat),\n      hueRanges\n    )\n  );\n  const area = selected.size / $colors.length;\n  const intensity = transduce(\n    map((id) => {\n      const color = $colors[id];\n      return color[1] * color[2];\n    }),\n    mean(),\n    selected\n  );\n  return intensity * area;\n};\nconst meanIntensity = (colors) => transduce(\n  map((x) => x[1] * x[2]),\n  mean(),\n  colors\n);\nconst hueRange = circularRange;\nconst temperature = (colors, minSat = 0.2, coeffs) => {\n  const $colors = ensureArray(colors);\n  const filtered = $colors.filter((x) => x[1] >= minSat);\n  const area = filtered.length / $colors.length;\n  const hues = [\n    ...transduce(\n      map((x) => roundTo(x[0], 1 / 12) % 1),\n      normFrequenciesAuto(),\n      filtered\n    )\n  ].sort(compareByKey(0));\n  const angles = [\n    ...mapcat(([hue, num]) => {\n      num *= 50;\n      return num >= 1 ? repeat(hue * TAU, num) : null;\n    }, hues)\n  ];\n  if (!angles.length) {\n    return { hues, meanHue: 0, temp: 0, areaTemp: 0, area: 0 };\n  }\n  const meanHue = circularMean(angles) / TAU;\n  const temp = hueTemperature(meanHue, coeffs);\n  const areaTemp = temp * area;\n  return { hues, meanHue, temp, areaTemp, area };\n};\nconst DEFAULT_TEMPERATURE_COEFFS = [\n  0.1,\n  0.6,\n  0.72,\n  0.92\n];\nconst hueTemperature = (hue, [a, b, c, d] = DEFAULT_TEMPERATURE_COEFFS) => 2 * (hue < 2 / 3 ? smoothStep(b, a, hue) : smoothStep(c, d, hue)) - 1;\nexport {\n  DEFAULT_TEMPERATURE_COEFFS,\n  countHueRange,\n  hueRange,\n  hueRangeArea,\n  hueRangeAreaIntensity,\n  hueTemperature,\n  meanIntensity,\n  selectHueRange,\n  selectHueRangeIDs,\n  temperature\n};\n","import { contrast as contrastWCAG } from \"@thi.ng/color/contrast\";\nimport { css } from \"@thi.ng/color/css/css\";\nimport { hsv } from \"@thi.ng/color/hsv/hsv\";\nimport { luminanceSrgb } from \"@thi.ng/color/luminance-rgb\";\nimport { oklch } from \"@thi.ng/color/oklch/oklch\";\nimport { srgb } from \"@thi.ng/color/srgb/srgb\";\nimport { compareByKey } from \"@thi.ng/compare/keys\";\nimport { compareNumDesc } from \"@thi.ng/compare/numeric\";\nimport { fit } from \"@thi.ng/math/fit\";\nimport {\n  aggregateCircularMetrics,\n  aggregateMetrics,\n  aggregateWeightedMetrics,\n  defCircularMetric,\n  defMetric,\n  defWeightedMetric\n} from \"@thi.ng/metrics/metrics\";\nimport { dominantColorsMeanCut } from \"@thi.ng/pixel-dominant-colors\";\nimport { dominantColorsKmeans } from \"@thi.ng/pixel-dominant-colors/kmeans\";\nimport { FloatBuffer } from \"@thi.ng/pixel/float\";\nimport { FLOAT_GRAY } from \"@thi.ng/pixel/format/float-gray\";\nimport { FLOAT_HSVA } from \"@thi.ng/pixel/format/float-hsva\";\nimport { FLOAT_RGBA } from \"@thi.ng/pixel/format/float-rgba\";\nimport { IntBuffer } from \"@thi.ng/pixel/int\";\nimport { map } from \"@thi.ng/transducers/map\";\nimport { max } from \"@thi.ng/transducers/max\";\nimport { permutations } from \"@thi.ng/transducers/permutations\";\nimport { transduce } from \"@thi.ng/transducers/transduce\";\nimport { roundN } from \"@thi.ng/vectors/roundn\";\nimport { ones } from \"@thi.ng/vectors/setn\";\nimport { temperature } from \"./hues.js\";\nconst analyzeColors = (img, opts) => {\n  let $img = img.format !== FLOAT_RGBA ? img.as(FLOAT_RGBA) : img;\n  if (opts?.size) $img = __resize($img, opts.size);\n  const imgGray = $img.as(FLOAT_GRAY);\n  const imgHsv = $img.as(FLOAT_HSVA);\n  const colors = __dominantColors($img, opts);\n  const colorAreas = colors.map((x) => x.area);\n  const derived = deriveColorResults(\n    colors.map((x) => x.color),\n    colorAreas,\n    opts?.minSat,\n    opts?.tempCoeffs\n  );\n  const lumImg = defMetric(imgGray.data);\n  return {\n    ...derived,\n    img: $img,\n    imgGray,\n    imgHsv,\n    lumImg,\n    temperature: temperature(imgHsv, opts?.minSat, opts?.tempCoeffs),\n    contrastImg: lumImg.max - lumImg.min\n  };\n};\nconst deriveColorResults = (colors, areas = ones(colors.length), minSat, tempCoeffs) => {\n  const dominantLuma = colors.map((x) => luminanceSrgb(x));\n  const dominantSrgb = colors.map((x) => srgb(x));\n  const dominantHsv = dominantSrgb.map((x) => hsv(x));\n  const dominantOklch = dominantSrgb.map((x) => oklch(x));\n  const dominantCss = dominantSrgb.map((x) => css(x));\n  const hues = dominantHsv.map((x) => x[0]);\n  const sats = dominantHsv.map((x) => x[1]);\n  const lum = defWeightedMetric(dominantLuma, areas);\n  return {\n    css: dominantCss,\n    srgb: dominantSrgb,\n    hsv: dominantHsv,\n    oklch: dominantOklch,\n    hue: defCircularMetric(hues),\n    sat: defWeightedMetric(sats, areas),\n    chroma: defWeightedMetric(\n      dominantOklch.map((x) => x[1]),\n      areas\n    ),\n    lum,\n    areas,\n    contrast: lum.max - lum.min,\n    colorContrast: fit(\n      transduce(\n        map((pair) => contrastWCAG(...pair)),\n        max(),\n        permutations(dominantSrgb, dominantSrgb)\n      ),\n      1,\n      21,\n      0,\n      1\n    ),\n    temperature: temperature(dominantHsv, minSat, tempCoeffs)\n  };\n};\nconst aggregateColorResults = (results, numColors = 4) => {\n  const dominant = dominantColorsMeanCut(\n    results.flatMap((res) => res.srgb),\n    numColors\n  ).map((x) => srgb(x.color));\n  return {\n    srgb: dominant,\n    css: dominant.map((x) => css(x)),\n    hsv: dominant.map((x) => hsv(x)),\n    oklch: dominant.map((x) => oklch(x)),\n    hue: aggregateCircularMetrics(results.map((x) => x.hue)),\n    sat: aggregateWeightedMetrics(results.map((x) => x.sat)),\n    chroma: aggregateWeightedMetrics(results.map((x) => x.chroma)),\n    lum: aggregateWeightedMetrics(results.map((x) => x.lum)),\n    lumImg: aggregateMetrics(results.map((x) => x.lumImg)),\n    contrast: defMetric(results.map((x) => x.contrast)),\n    contrastImg: defMetric(results.map((x) => x.contrastImg)),\n    colorContrast: defMetric(results.map((x) => x.colorContrast)),\n    temperature: {\n      meanHue: defCircularMetric(\n        results.map((x) => x.temperature.meanHue)\n      ),\n      temp: defMetric(results.map((x) => x.temperature.temp)),\n      areaTemp: defMetric(results.map((x) => x.temperature.areaTemp))\n    }\n  };\n};\nconst __dominantColors = (img, {\n  dominantFn = dominantColorsKmeans,\n  numColors = 4,\n  prec = 1e-3\n} = {}) => dominantFn(img, numColors).sort(compareByKey(\"area\", compareNumDesc)).map((x) => (roundN(null, x.color, prec), x));\nconst __resize = ($img, size) => {\n  size = ~~size;\n  let w = $img.width;\n  let h = $img.height;\n  [w, h] = w > h ? [size, ~~Math.max(1, h / w * size)] : [~~Math.max(1, w / h * size), size];\n  return $img.resize(w, h);\n};\nexport {\n  aggregateColorResults,\n  analyzeColors,\n  deriveColorResults\n};\n","import {\n  convolveImage,\n  EDGE5,\n  SOBEL_X,\n  SOBEL_Y\n} from \"@thi.ng/pixel-convolve/convolve\";\nimport {} from \"@thi.ng/pixel/float\";\nimport { FLOAT_GRAY } from \"@thi.ng/pixel/format/float-gray\";\nimport { FLOAT_GRAY_RANGE } from \"@thi.ng/pixel/format/float-gray-range\";\nimport { magSq } from \"@thi.ng/vectors/magsq\";\nconst { sqrt } = Math;\nconst FMT_EDGE = FLOAT_GRAY_RANGE(-24, 24);\nconst FMT_SOBEL = FLOAT_GRAY_RANGE(-4, 4);\nconst analyzeFeatures = (img) => {\n  const { width, height } = img;\n  const numPixels = width * height;\n  const $img = img.format !== FLOAT_GRAY ? img.as(FLOAT_GRAY) : img;\n  const imgEdge = convolveImage($img, { kernel: EDGE5 });\n  imgEdge.format = FMT_EDGE;\n  const imgSobelX = convolveImage($img, { kernel: SOBEL_X });\n  imgSobelX.format = FMT_SOBEL;\n  const imgSobelY = convolveImage($img, { kernel: SOBEL_Y });\n  imgSobelY.format = FMT_SOBEL;\n  const edge = sqrt(magSq(imgEdge.data)) / numPixels;\n  const sobX = magSq(imgSobelX.data);\n  const sobY = magSq(imgSobelY.data);\n  const sobelX = sqrt(sobX) / numPixels;\n  const sobelY = sqrt(sobY) / numPixels;\n  const sobel = sqrt(sobX + sobY) / numPixels;\n  return {\n    imgEdge,\n    imgSobelX,\n    imgSobelY,\n    edge,\n    sobelX,\n    sobelY,\n    sobel\n  };\n};\nexport {\n  analyzeFeatures\n};\n"]}