src/app/hooks/useImageColour/colorthief.js

Summary

Maintainability
F
1 wk
Test Coverage
F
5%
/*
The colorthief module does not seem to be compatible with
yarn v3 due to how it references github sub dependencies

This file is from:
  https://github.com/lokesh/color-thief/blob/master/dist/color-thief.mjs

Importing it as an ES6 module seems to be what is recommended in the docs:
  https://lokeshdhakar.com/projects/color-thief/#getting-started
*/

/* eslint-disable */
if (!t)
  var t = {
    map: function (t, r) {
      var n = {};
      return r
        ? t.map(function (t, o) {
            return (n.index = o), r.call(n, t);
          })
        : t.slice();
    },
    naturalOrder: function (t, r) {
      return t < r ? -1 : t > r ? 1 : 0;
    },
    sum: function (t, r) {
      var n = {};
      return t.reduce(
        r
          ? function (t, o, e) {
              return (n.index = e), t + r.call(n, o);
            }
          : function (t, r) {
              return t + r;
            },
        0,
      );
    },
    max: function (r, n) {
      return Math.max.apply(null, n ? t.map(r, n) : r);
    },
  };
var r = (function () {
    var r = 5,
      n = 8 - r,
      o = 1e3;
    function e(t, n, o) {
      return (t << (2 * r)) + (n << r) + o;
    }
    function i(t) {
      var r = [],
        n = !1;
      function o() {
        r.sort(t), (n = !0);
      }
      return {
        push: function (t) {
          r.push(t), (n = !1);
        },
        peek: function (t) {
          return n || o(), void 0 === t && (t = r.length - 1), r[t];
        },
        pop: function () {
          return n || o(), r.pop();
        },
        size: function () {
          return r.length;
        },
        map: function (t) {
          return r.map(t);
        },
        debug: function () {
          return n || o(), r;
        },
      };
    }
    function u(t, r, n, o, e, i, u) {
      (this.r1 = t),
        (this.r2 = r),
        (this.g1 = n),
        (this.g2 = o),
        (this.b1 = e),
        (this.b2 = i),
        (this.histo = u);
    }
    function a() {
      this.vboxes = new i(function (r, n) {
        return t.naturalOrder(
          r.vbox.count() * r.vbox.volume(),
          n.vbox.count() * n.vbox.volume(),
        );
      });
    }
    function s(r, n) {
      if (n.count()) {
        var o = n.r2 - n.r1 + 1,
          i = n.g2 - n.g1 + 1,
          u = t.max([o, i, n.b2 - n.b1 + 1]);
        if (1 == n.count()) return [n.copy()];
        var a,
          s,
          h,
          c,
          f = 0,
          v = [],
          l = [];
        if (u == o)
          for (a = n.r1; a <= n.r2; a++) {
            for (c = 0, s = n.g1; s <= n.g2; s++)
              for (h = n.b1; h <= n.b2; h++) c += r[e(a, s, h)] || 0;
            v[a] = f += c;
          }
        else if (u == i)
          for (a = n.g1; a <= n.g2; a++) {
            for (c = 0, s = n.r1; s <= n.r2; s++)
              for (h = n.b1; h <= n.b2; h++) c += r[e(s, a, h)] || 0;
            v[a] = f += c;
          }
        else
          for (a = n.b1; a <= n.b2; a++) {
            for (c = 0, s = n.r1; s <= n.r2; s++)
              for (h = n.g1; h <= n.g2; h++) c += r[e(s, h, a)] || 0;
            v[a] = f += c;
          }
        return (
          v.forEach(function (t, r) {
            l[r] = f - t;
          }),
          (function (t) {
            var r,
              o,
              e,
              i,
              u,
              s = t + '1',
              h = t + '2',
              c = 0;
            for (a = n[s]; a <= n[h]; a++)
              if (v[a] > f / 2) {
                for (
                  e = n.copy(),
                    i = n.copy(),
                    u =
                      (r = a - n[s]) <= (o = n[h] - a)
                        ? Math.min(n[h] - 1, ~~(a + o / 2))
                        : Math.max(n[s], ~~(a - 1 - r / 2));
                  !v[u];

                )
                  u++;
                for (c = l[u]; !c && v[u - 1]; ) c = l[--u];
                return (e[h] = u), (i[s] = e[h] + 1), [e, i];
              }
          })(u == o ? 'r' : u == i ? 'g' : 'b')
        );
      }
    }
    return (
      (u.prototype = {
        volume: function (t) {
          return (
            (this._volume && !t) ||
              (this._volume =
                (this.r2 - this.r1 + 1) *
                (this.g2 - this.g1 + 1) *
                (this.b2 - this.b1 + 1)),
            this._volume
          );
        },
        count: function (t) {
          var r = this.histo;
          if (!this._count_set || t) {
            var n,
              o,
              i,
              u = 0;
            for (n = this.r1; n <= this.r2; n++)
              for (o = this.g1; o <= this.g2; o++)
                for (i = this.b1; i <= this.b2; i++) u += r[e(n, o, i)] || 0;
            (this._count = u), (this._count_set = !0);
          }
          return this._count;
        },
        copy: function () {
          return new u(
            this.r1,
            this.r2,
            this.g1,
            this.g2,
            this.b1,
            this.b2,
            this.histo,
          );
        },
        avg: function (t) {
          var n = this.histo;
          if (!this._avg || t) {
            var o,
              i,
              u,
              a,
              s = 0,
              h = 1 << (8 - r),
              c = 0,
              f = 0,
              v = 0;
            for (i = this.r1; i <= this.r2; i++)
              for (u = this.g1; u <= this.g2; u++)
                for (a = this.b1; a <= this.b2; a++)
                  (s += o = n[e(i, u, a)] || 0),
                    (c += o * (i + 0.5) * h),
                    (f += o * (u + 0.5) * h),
                    (v += o * (a + 0.5) * h);
            this._avg = s
              ? [~~(c / s), ~~(f / s), ~~(v / s)]
              : [
                  ~~((h * (this.r1 + this.r2 + 1)) / 2),
                  ~~((h * (this.g1 + this.g2 + 1)) / 2),
                  ~~((h * (this.b1 + this.b2 + 1)) / 2),
                ];
          }
          return this._avg;
        },
        contains: function (t) {
          var r = t[0] >> n;
          return (
            (gval = t[1] >> n),
            (bval = t[2] >> n),
            r >= this.r1 &&
              r <= this.r2 &&
              gval >= this.g1 &&
              gval <= this.g2 &&
              bval >= this.b1 &&
              bval <= this.b2
          );
        },
      }),
      (a.prototype = {
        push: function (t) {
          this.vboxes.push({ vbox: t, color: t.avg() });
        },
        palette: function () {
          return this.vboxes.map(function (t) {
            return t.color;
          });
        },
        size: function () {
          return this.vboxes.size();
        },
        map: function (t) {
          for (var r = this.vboxes, n = 0; n < r.size(); n++)
            if (r.peek(n).vbox.contains(t)) return r.peek(n).color;
          return this.nearest(t);
        },
        nearest: function (t) {
          for (var r, n, o, e = this.vboxes, i = 0; i < e.size(); i++)
            ((n = Math.sqrt(
              Math.pow(t[0] - e.peek(i).color[0], 2) +
                Math.pow(t[1] - e.peek(i).color[1], 2) +
                Math.pow(t[2] - e.peek(i).color[2], 2),
            )) < r ||
              void 0 === r) &&
              ((r = n), (o = e.peek(i).color));
          return o;
        },
        forcebw: function () {
          var r = this.vboxes;
          r.sort(function (r, n) {
            return t.naturalOrder(t.sum(r.color), t.sum(n.color));
          });
          var n = r[0].color;
          n[0] < 5 && n[1] < 5 && n[2] < 5 && (r[0].color = [0, 0, 0]);
          var o = r.length - 1,
            e = r[o].color;
          e[0] > 251 &&
            e[1] > 251 &&
            e[2] > 251 &&
            (r[o].color = [255, 255, 255]);
        },
      }),
      {
        quantize: function (h, c) {
          if (!h.length || c < 2 || c > 256) return !1;
          var f = (function (t) {
            var o,
              i = new Array(1 << (3 * r));
            return (
              t.forEach(function (t) {
                (o = e(t[0] >> n, t[1] >> n, t[2] >> n)),
                  (i[o] = (i[o] || 0) + 1);
              }),
              i
            );
          })(h);
          f.forEach(function () {});
          var v = (function (t, r) {
              var o,
                e,
                i,
                a = 1e6,
                s = 0,
                h = 1e6,
                c = 0,
                f = 1e6,
                v = 0;
              return (
                t.forEach(function (t) {
                  (o = t[0] >> n) < a ? (a = o) : o > s && (s = o),
                    (e = t[1] >> n) < h ? (h = e) : e > c && (c = e),
                    (i = t[2] >> n) < f ? (f = i) : i > v && (v = i);
                }),
                new u(a, s, h, c, f, v, r)
              );
            })(h, f),
            l = new i(function (r, n) {
              return t.naturalOrder(r.count(), n.count());
            });
          function g(t, r) {
            for (var n, e = t.size(), i = 0; i < o; ) {
              if (e >= r) return;
              if (i++ > o) return;
              if ((n = t.pop()).count()) {
                var u = s(f, n),
                  a = u[0],
                  h = u[1];
                if (!a) return;
                t.push(a), h && (t.push(h), e++);
              } else t.push(n), i++;
            }
          }
          l.push(v), g(l, 0.75 * c);
          for (
            var p = new i(function (r, n) {
              return t.naturalOrder(
                r.count() * r.volume(),
                n.count() * n.volume(),
              );
            });
            l.size();

          )
            p.push(l.pop());
          g(p, c);
          for (var b = new a(); p.size(); ) b.push(p.pop());
          return b;
        },
      }
    );
  })().quantize,
  n = function (t) {
    (this.canvas = document.createElement('canvas')),
      (this.context = this.canvas.getContext('2d')),
      (this.width = this.canvas.width = t.naturalWidth),
      (this.height = this.canvas.height = t.naturalHeight),
      this.context.drawImage(t, 0, 0, this.width, this.height);
  };
n.prototype.getImageData = function () {
  return this.context.getImageData(0, 0, this.width, this.height);
};
var o = function () {};
(o.prototype.getColor = function (t, r) {
  return void 0 === r && (r = 10), this.getPalette(t, 5, r)[0];
}),
  (o.prototype.getPalette = function (t, o, e) {
    var i = (function (t) {
        var r = t.colorCount,
          n = t.quality;
        if (void 0 !== r && Number.isInteger(r)) {
          if (1 === r)
            throw new Error(
              'colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()',
            );
          (r = Math.max(r, 2)), (r = Math.min(r, 20));
        } else r = 10;
        return (
          (void 0 === n || !Number.isInteger(n) || n < 1) && (n = 10),
          { colorCount: r, quality: n }
        );
      })({ colorCount: o, quality: e }),
      u = new n(t),
      a = (function (t, r, n) {
        for (
          var o = t,
            e = [],
            i = 0,
            u = void 0,
            a = void 0,
            s = void 0,
            h = void 0,
            c = void 0;
          i < r;
          i += n
        )
          (a = o[0 + (u = 4 * i)]),
            (s = o[u + 1]),
            (h = o[u + 2]),
            (void 0 === (c = o[u + 3]) || c >= 125) &&
              ((a > 250 && s > 250 && h > 250) || e.push([a, s, h]));
        return e;
      })(u.getImageData().data, u.width * u.height, i.quality),
      s = r(a, i.colorCount);
    return s ? s.palette() : null;
  }),
  (o.prototype.getColorFromUrl = function (t, r, n) {
    var o = this,
      e = document.createElement('img');
    e.addEventListener('load', function () {
      var i = o.getPalette(e, 5, n);
      r(i[0], t);
    }),
      (e.src = t);
  }),
  (o.prototype.getImageData = function (t, r) {
    var n = new XMLHttpRequest();
    n.open('GET', t, !0),
      (n.responseType = 'arraybuffer'),
      (n.onload = function () {
        if (200 == this.status) {
          var t = new Uint8Array(this.response);
          i = t.length;
          for (var n = new Array(i), o = 0; o < t.length; o++)
            n[o] = String.fromCharCode(t[o]);
          var e = n.join(''),
            u = window.btoa(e);
          r('data:image/png;base64,' + u);
        }
      }),
      n.send();
  }),
  (o.prototype.getColorAsync = function (t, r, n) {
    var o = this;
    this.getImageData(t, function (t) {
      var e = document.createElement('img');
      e.addEventListener('load', function () {
        var t = o.getPalette(e, 5, n);
        r(t[0], this);
      }),
        (e.src = t);
    });
  });
export default o;