{"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["import { Quantizer } from \"@vibrant/quantizer\";\nimport { Filter, Swatch } from \"@vibrant/color\";\nimport { VBox } from \"./vbox\";\nimport { PQueue } from \"./pqueue\";\nimport type { Pixels } from \"@vibrant/image\";\nimport type { QuantizerOptions } from \"@vibrant/quantizer\";\n\nconst fractByPopulations = 0.75;\n\nfunction _splitBoxes(pq: PQueue<VBox>, target: number): void {\n\tlet lastSize = pq.size();\n\twhile (pq.size() < target) {\n\t\tconst vbox = pq.pop();\n\n\t\tif (vbox && vbox.count() > 0) {\n\t\t\tconst [vbox1, vbox2] = vbox.split();\n\n\t\t\tif (!vbox1) break;\n\n\t\t\tpq.push(vbox1);\n\t\t\tif (vbox2 && vbox2.count() > 0) pq.push(vbox2);\n\n\t\t\t// No more new boxes, converged\n\t\t\tif (pq.size() === lastSize) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tlastSize = pq.size();\n\t\t\t}\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport const MMCQ = (pixels: Pixels, opts: QuantizerOptions): Array<Swatch> => {\n\tif (pixels.length === 0 || opts.colorCount < 2 || opts.colorCount > 256) {\n\t\tthrow new Error(\"Wrong MMCQ parameters\");\n\t}\n\n\tconst vbox = VBox.build(pixels);\n\tconst colorCount = vbox.histogram.colorCount;\n\tconst pq = new PQueue<VBox>((a, b) => a.count() - b.count());\n\n\tpq.push(vbox);\n\n\t// first set of colors, sorted by population\n\t_splitBoxes(pq, fractByPopulations * opts.colorCount);\n\n\t// Re-order\n\tconst pq2 = new PQueue<VBox>(\n\t\t(a, b) => a.count() * a.volume() - b.count() * b.volume(),\n\t);\n\tpq2.contents = pq.contents;\n\n\t// next set - generate the median cuts using the (npix * vol) sorting.\n\t_splitBoxes(pq2, opts.colorCount - pq2.size());\n\n\t// calculate the actual colors\n\treturn generateSwatches(pq2);\n};\n\nfunction generateSwatches(pq: PQueue<VBox>) {\n\tconst swatches: Swatch[] = [];\n\twhile (pq.size()) {\n\t\tconst v = pq.pop()!;\n\t\tconst color = v.avg();\n\t\tconst [r, g, b] = color;\n\t\tswatches.push(new Swatch(color, v.count()));\n\t}\n\treturn swatches;\n}\n"],"names":["vbox","vbox2","VBox","PQueue","color","Swatch"],"mappings":";;;;;AAOA,MAAM,qBAAqB;AAE3B,SAAS,YAAY,IAAkB,QAAsB;AACxD,MAAA,WAAW,GAAG,KAAK;AAChB,SAAA,GAAG,KAAK,IAAI,QAAQ;AACpB,UAAAA,QAAO,GAAG,IAAI;AAEpB,QAAIA,SAAQA,MAAK,MAAM,IAAI,GAAG;AAC7B,YAAM,CAAC,OAAOC,MAAK,IAAID,MAAK,MAAM;AAElC,UAAI,CAAC,MAAO;AAEZ,SAAG,KAAK,KAAK;AACb,UAAIC,UAASA,OAAM,MAAA,IAAU,EAAG,IAAG,KAAKA,MAAK;AAGzC,UAAA,GAAG,KAAK,MAAM,UAAU;AAC3B;AAAA,MAAA,OACM;AACN,mBAAW,GAAG,KAAK;AAAA,MAAA;AAAA,IACpB,OACM;AACN;AAAA,IAAA;AAAA,EACD;AAEF;AAEa,MAAA,OAAO,CAAC,QAAgB,SAA0C;AAC1E,MAAA,OAAO,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK,aAAa,KAAK;AAClE,UAAA,IAAI,MAAM,uBAAuB;AAAA,EAAA;AAGlC,QAAAD,SAAOE,KAAAA,KAAK,MAAM,MAAM;AACXF,SAAK,UAAU;AAC5B,QAAA,KAAK,IAAIG,cAAa,CAAC,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,OAAO;AAE3D,KAAG,KAAKH,MAAI;AAGA,cAAA,IAAI,qBAAqB,KAAK,UAAU;AAGpD,QAAM,MAAM,IAAIG,OAAA;AAAA,IACf,CAAC,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,OAAA,IAAW,EAAE,MAAM,IAAI,EAAE,OAAO;AAAA,EACzD;AACA,MAAI,WAAW,GAAG;AAGlB,cAAY,KAAK,KAAK,aAAa,IAAI,MAAM;AAG7C,SAAO,iBAAiB,GAAG;AAC5B;AAEA,SAAS,iBAAiB,IAAkB;AAC3C,QAAM,WAAqB,CAAC;AACrB,SAAA,GAAG,QAAQ;AACX,UAAA,IAAI,GAAG,IAAI;AACX,UAAAC,UAAQ,EAAE,IAAI;AAEpB,aAAS,KAAK,IAAIC,MAAA,OAAOD,SAAO,EAAE,MAAA,CAAO,CAAC;AAAA,EAAA;AAEpC,SAAA;AACR;;"}