{"version":3,"file":"histogram.cjs","sources":["../../src/histogram.ts"],"sourcesContent":["import type { Pixels } from \"./index\";\n\nexport interface HistogramOptions {\n\tsigBits: number;\n}\n\nexport class Histogram {\n\tbmin: number;\n\tbmax: number;\n\tgmin: number;\n\tgmax: number;\n\trmin: number;\n\trmax: number;\n\thist: Uint32Array;\n\tprivate _colorCount: number;\n\tget colorCount() {\n\t\treturn this._colorCount;\n\t}\n\tgetColorIndex: (r: number, g: number, b: number) => number;\n\tconstructor(\n\t\tpublic pixels: Pixels,\n\t\tpublic opts: HistogramOptions,\n\t) {\n\t\tconst { sigBits } = opts;\n\t\tconst getColorIndex = (r: number, g: number, b: number) =>\n\t\t\t(r << (2 * sigBits)) + (g << sigBits) + b;\n\n\t\tthis.getColorIndex = getColorIndex;\n\n\t\tconst rshift = 8 - sigBits;\n\t\tconst hn = 1 << (3 * sigBits);\n\t\tconst hist = new Uint32Array(hn);\n\t\tlet rmax: number;\n\t\tlet rmin: number;\n\t\tlet gmax: number;\n\t\tlet gmin: number;\n\t\tlet bmax: number;\n\t\tlet bmin: number;\n\t\tlet r: number;\n\t\tlet g: number;\n\t\tlet b: number;\n\t\tlet a: number;\n\t\trmax = gmax = bmax = 0;\n\t\trmin = gmin = bmin = Number.MAX_VALUE;\n\t\tconst n = pixels.length / 4;\n\t\tlet i = 0;\n\n\t\twhile (i < n) {\n\t\t\tconst offset = i * 4;\n\t\t\ti++;\n\t\t\tr = pixels[offset + 0]!;\n\t\t\tg = pixels[offset + 1]!;\n\t\t\tb = pixels[offset + 2]!;\n\t\t\ta = pixels[offset + 3]!;\n\n\t\t\t// Ignored pixels' alpha is marked as 0 in filtering stage\n\t\t\tif (a === 0) continue;\n\n\t\t\tr = r >> rshift;\n\t\t\tg = g >> rshift;\n\t\t\tb = b >> rshift;\n\n\t\t\tconst index = getColorIndex(r, g, b);\n\t\t\tif (hist[index] === undefined) hist[index] = 0;\n\t\t\thist[index] += 1;\n\n\t\t\tif (r > rmax) rmax = r;\n\t\t\tif (r < rmin) rmin = r;\n\t\t\tif (g > gmax) gmax = g;\n\t\t\tif (g < gmin) gmin = g;\n\t\t\tif (b > bmax) bmax = b;\n\t\t\tif (b < bmin) bmin = b;\n\t\t}\n\t\tthis._colorCount = hist.reduce(\n\t\t\t(total, c) => (c > 0 ? total + 1 : total),\n\t\t\t0,\n\t\t);\n\t\tthis.hist = hist;\n\t\tthis.rmax = rmax;\n\t\tthis.rmin = rmin;\n\t\tthis.gmax = gmax;\n\t\tthis.gmin = gmin;\n\t\tthis.bmax = bmax;\n\t\tthis.bmin = bmin;\n\t}\n}\n"],"names":["r","g","b"],"mappings":";;AAMO,MAAM,UAAU;AAAA,EAatB,YACQ,QACA,MACN;AAFM,SAAA,SAAA;AACA,SAAA,OAAA;AAEP,UAAM,EAAE,YAAY;AACpB,UAAM,gBAAgB,CAACA,IAAWC,IAAWC,QAC3CF,MAAM,IAAI,YAAaC,MAAK,WAAWC;AAEzC,SAAK,gBAAgB;AAErB,UAAM,SAAS,IAAI;AACnB,UAAM,KAAK,KAAM,IAAI;AACrB,UAAM,OAAO,IAAI,YAAY,EAAE;AAC/B,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,WAAO,OAAO,OAAO;AACrB,WAAO,OAAO,OAAO,OAAO;AAC5B,UAAM,IAAI,OAAO,SAAS;AAC1B,QAAI,IAAI;AAER,WAAO,IAAI,GAAG;AACb,YAAM,SAAS,IAAI;AACnB;AACA,UAAI,OAAO,SAAS,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC;AAGrB,UAAI,MAAM,EAAG;AAEb,UAAI,KAAK;AACT,UAAI,KAAK;AACT,UAAI,KAAK;AAET,YAAM,QAAQ,cAAc,GAAG,GAAG,CAAC;AACnC,UAAI,KAAK,KAAK,MAAM,OAAW,MAAK,KAAK,IAAI;AAC7C,WAAK,KAAK,KAAK;AAEf,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AAAA,IACtB;AACA,SAAK,cAAc,KAAK;AAAA,MACvB,CAAC,OAAO,MAAO,IAAI,IAAI,QAAQ,IAAI;AAAA,MACnC;AAAA,IAAA;AAED,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACb;AAAA,EArEA,IAAI,aAAa;AAChB,WAAO,KAAK;AAAA,EACb;AAoED;;"}