mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
simplify vibrant
This commit is contained in:
parent
dc66936c08
commit
353dd8d067
1 changed files with 356 additions and 359 deletions
|
@ -504,380 +504,377 @@ module.exports = MMCQ.quantize
|
||||||
Google - Palette support library in Android
|
Google - Palette support library in Android
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function() {
|
var CanvasImage, Swatch, Vibrant,
|
||||||
var CanvasImage, Swatch, Vibrant,
|
bind = function (fn, me) { return function () { return fn.apply(me, arguments); }; },
|
||||||
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
slice = [].slice;
|
||||||
slice = [].slice;
|
|
||||||
|
|
||||||
window.Swatch = Swatch = (function() {
|
window.Swatch = Swatch = (function () {
|
||||||
Swatch.prototype.hsl = void 0;
|
Swatch.prototype.hsl = void 0;
|
||||||
|
|
||||||
Swatch.prototype.rgb = void 0;
|
Swatch.prototype.rgb = void 0;
|
||||||
|
|
||||||
Swatch.prototype.population = 1;
|
Swatch.prototype.population = 1;
|
||||||
|
|
||||||
Swatch.yiq = 0;
|
Swatch.yiq = 0;
|
||||||
|
|
||||||
function Swatch(rgb, population) {
|
function Swatch(rgb, population) {
|
||||||
this.rgb = rgb;
|
this.rgb = rgb;
|
||||||
this.population = population;
|
this.population = population;
|
||||||
}
|
}
|
||||||
|
|
||||||
Swatch.prototype.getHsl = function() {
|
Swatch.prototype.getHsl = function () {
|
||||||
if (!this.hsl) {
|
if (!this.hsl) {
|
||||||
return this.hsl = Vibrant.rgbToHsl(this.rgb[0], this.rgb[1], this.rgb[2]);
|
return this.hsl = Vibrant.rgbToHsl(this.rgb[0], this.rgb[1], this.rgb[2]);
|
||||||
} else {
|
} else {
|
||||||
return this.hsl;
|
return this.hsl;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype.getPopulation = function() {
|
Swatch.prototype.getPopulation = function () {
|
||||||
return this.population;
|
return this.population;
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype.getRgb = function() {
|
Swatch.prototype.getRgb = function () {
|
||||||
return this.rgb;
|
return this.rgb;
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype.getHex = function() {
|
Swatch.prototype.getHex = function () {
|
||||||
return "#" + ((1 << 24) + (this.rgb[0] << 16) + (this.rgb[1] << 8) + this.rgb[2]).toString(16).slice(1, 7);
|
return "#" + ((1 << 24) + (this.rgb[0] << 16) + (this.rgb[1] << 8) + this.rgb[2]).toString(16).slice(1, 7);
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype.getTitleTextColor = function() {
|
Swatch.prototype.getTitleTextColor = function () {
|
||||||
this._ensureTextColors();
|
this._ensureTextColors();
|
||||||
if (this.yiq < 200) {
|
if (this.yiq < 200) {
|
||||||
return "#fff";
|
return "#fff";
|
||||||
} else {
|
} else {
|
||||||
return "#000";
|
return "#000";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype.getBodyTextColor = function() {
|
Swatch.prototype.getBodyTextColor = function () {
|
||||||
this._ensureTextColors();
|
this._ensureTextColors();
|
||||||
if (this.yiq < 150) {
|
if (this.yiq < 150) {
|
||||||
return "#fff";
|
return "#fff";
|
||||||
} else {
|
} else {
|
||||||
return "#000";
|
return "#000";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Swatch.prototype._ensureTextColors = function() {
|
Swatch.prototype._ensureTextColors = function () {
|
||||||
if (!this.yiq) {
|
if (!this.yiq) {
|
||||||
return this.yiq = (this.rgb[0] * 299 + this.rgb[1] * 587 + this.rgb[2] * 114) / 1000;
|
return this.yiq = (this.rgb[0] * 299 + this.rgb[1] * 587 + this.rgb[2] * 114) / 1000;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return Swatch;
|
return Swatch;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
window.Vibrant = Vibrant = (function() {
|
window.Vibrant = Vibrant = (function () {
|
||||||
Vibrant.prototype.quantize = require('quantize');
|
Vibrant.prototype.quantize = require('quantize');
|
||||||
|
|
||||||
Vibrant.prototype._swatches = [];
|
Vibrant.prototype._swatches = [];
|
||||||
|
|
||||||
Vibrant.prototype.TARGET_DARK_LUMA = 0.26;
|
Vibrant.prototype.TARGET_DARK_LUMA = 0.26;
|
||||||
|
|
||||||
Vibrant.prototype.MAX_DARK_LUMA = 0.45;
|
Vibrant.prototype.MAX_DARK_LUMA = 0.45;
|
||||||
|
|
||||||
Vibrant.prototype.MIN_LIGHT_LUMA = 0.55;
|
Vibrant.prototype.MIN_LIGHT_LUMA = 0.55;
|
||||||
|
|
||||||
Vibrant.prototype.TARGET_LIGHT_LUMA = 0.74;
|
Vibrant.prototype.TARGET_LIGHT_LUMA = 0.74;
|
||||||
|
|
||||||
Vibrant.prototype.MIN_NORMAL_LUMA = 0.3;
|
Vibrant.prototype.MIN_NORMAL_LUMA = 0.3;
|
||||||
|
|
||||||
Vibrant.prototype.TARGET_NORMAL_LUMA = 0.5;
|
Vibrant.prototype.TARGET_NORMAL_LUMA = 0.5;
|
||||||
|
|
||||||
Vibrant.prototype.MAX_NORMAL_LUMA = 0.7;
|
Vibrant.prototype.MAX_NORMAL_LUMA = 0.7;
|
||||||
|
|
||||||
Vibrant.prototype.TARGET_MUTED_SATURATION = 0.3;
|
Vibrant.prototype.TARGET_MUTED_SATURATION = 0.3;
|
||||||
|
|
||||||
Vibrant.prototype.MAX_MUTED_SATURATION = 0.4;
|
Vibrant.prototype.MAX_MUTED_SATURATION = 0.4;
|
||||||
|
|
||||||
Vibrant.prototype.TARGET_VIBRANT_SATURATION = 1;
|
Vibrant.prototype.TARGET_VIBRANT_SATURATION = 1;
|
||||||
|
|
||||||
Vibrant.prototype.MIN_VIBRANT_SATURATION = 0.35;
|
Vibrant.prototype.MIN_VIBRANT_SATURATION = 0.35;
|
||||||
|
|
||||||
Vibrant.prototype.WEIGHT_SATURATION = 3;
|
Vibrant.prototype.WEIGHT_SATURATION = 3;
|
||||||
|
|
||||||
Vibrant.prototype.WEIGHT_LUMA = 6;
|
Vibrant.prototype.WEIGHT_LUMA = 6;
|
||||||
|
|
||||||
Vibrant.prototype.WEIGHT_POPULATION = 1;
|
Vibrant.prototype.WEIGHT_POPULATION = 1;
|
||||||
|
|
||||||
Vibrant.prototype.VibrantSwatch = void 0;
|
Vibrant.prototype.VibrantSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.MutedSwatch = void 0;
|
Vibrant.prototype.MutedSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.DarkVibrantSwatch = void 0;
|
Vibrant.prototype.DarkVibrantSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.DarkMutedSwatch = void 0;
|
Vibrant.prototype.DarkMutedSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.LightVibrantSwatch = void 0;
|
Vibrant.prototype.LightVibrantSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.LightMutedSwatch = void 0;
|
Vibrant.prototype.LightMutedSwatch = void 0;
|
||||||
|
|
||||||
Vibrant.prototype.HighestPopulation = 0;
|
Vibrant.prototype.HighestPopulation = 0;
|
||||||
|
|
||||||
function Vibrant(sourceImage, colorCount, quality) {
|
function Vibrant(sourceImage, colorCount, quality) {
|
||||||
this.swatches = bind(this.swatches, this);
|
this.swatches = bind(this.swatches, this);
|
||||||
var a, allPixels, b, cmap, g, i, image, imageData, offset, pixelCount, pixels, r;
|
var a, allPixels, b, cmap, g, i, image, imageData, offset, pixelCount, pixels, r;
|
||||||
if (typeof colorCount === 'undefined') {
|
if (typeof colorCount === 'undefined') {
|
||||||
colorCount = 16;
|
colorCount = 16;
|
||||||
}
|
}
|
||||||
if (typeof quality === 'undefined') {
|
if (typeof quality === 'undefined') {
|
||||||
quality = 5;
|
quality = 5;
|
||||||
}
|
}
|
||||||
image = new CanvasImage(sourceImage);
|
image = new CanvasImage(sourceImage);
|
||||||
try {
|
try {
|
||||||
imageData = image.getImageData();
|
imageData = image.getImageData();
|
||||||
pixels = imageData.data;
|
pixels = imageData.data;
|
||||||
pixelCount = image.getPixelCount();
|
pixelCount = image.getPixelCount();
|
||||||
allPixels = [];
|
allPixels = [];
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < pixelCount) {
|
while (i < pixelCount) {
|
||||||
offset = i * 4;
|
offset = i * 4;
|
||||||
r = pixels[offset + 0];
|
r = pixels[offset + 0];
|
||||||
g = pixels[offset + 1];
|
g = pixels[offset + 1];
|
||||||
b = pixels[offset + 2];
|
b = pixels[offset + 2];
|
||||||
a = pixels[offset + 3];
|
a = pixels[offset + 3];
|
||||||
if (a >= 125) {
|
if (a >= 125) {
|
||||||
if (!(r > 250 && g > 250 && b > 250)) {
|
if (!(r > 250 && g > 250 && b > 250)) {
|
||||||
allPixels.push([r, g, b]);
|
allPixels.push([r, g, b]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = i + quality;
|
||||||
|
}
|
||||||
|
cmap = this.quantize(allPixels, colorCount);
|
||||||
|
this._swatches = cmap.vboxes.map((function (_this) {
|
||||||
|
return function (vbox) {
|
||||||
|
return new Swatch(vbox.color, vbox.vbox.count());
|
||||||
|
};
|
||||||
|
})(this));
|
||||||
|
this.maxPopulation = this.findMaxPopulation;
|
||||||
|
this.generateVarationColors();
|
||||||
|
this.generateEmptySwatches();
|
||||||
|
} finally {
|
||||||
|
image.removeCanvas();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
i = i + quality;
|
|
||||||
}
|
}
|
||||||
cmap = this.quantize(allPixels, colorCount);
|
|
||||||
this._swatches = cmap.vboxes.map((function(_this) {
|
|
||||||
return function(vbox) {
|
|
||||||
return new Swatch(vbox.color, vbox.vbox.count());
|
|
||||||
};
|
|
||||||
})(this));
|
|
||||||
this.maxPopulation = this.findMaxPopulation;
|
|
||||||
this.generateVarationColors();
|
|
||||||
this.generateEmptySwatches();
|
|
||||||
} finally {
|
|
||||||
image.removeCanvas();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Vibrant.prototype.generateVarationColors = function() {
|
Vibrant.prototype.generateVarationColors = function () {
|
||||||
this.VibrantSwatch = this.findColorVariation(this.TARGET_NORMAL_LUMA, this.MIN_NORMAL_LUMA, this.MAX_NORMAL_LUMA, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
this.VibrantSwatch = this.findColorVariation(this.TARGET_NORMAL_LUMA, this.MIN_NORMAL_LUMA, this.MAX_NORMAL_LUMA, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
||||||
this.LightVibrantSwatch = this.findColorVariation(this.TARGET_LIGHT_LUMA, this.MIN_LIGHT_LUMA, 1, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
this.LightVibrantSwatch = this.findColorVariation(this.TARGET_LIGHT_LUMA, this.MIN_LIGHT_LUMA, 1, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
||||||
this.DarkVibrantSwatch = this.findColorVariation(this.TARGET_DARK_LUMA, 0, this.MAX_DARK_LUMA, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
this.DarkVibrantSwatch = this.findColorVariation(this.TARGET_DARK_LUMA, 0, this.MAX_DARK_LUMA, this.TARGET_VIBRANT_SATURATION, this.MIN_VIBRANT_SATURATION, 1);
|
||||||
this.MutedSwatch = this.findColorVariation(this.TARGET_NORMAL_LUMA, this.MIN_NORMAL_LUMA, this.MAX_NORMAL_LUMA, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
this.MutedSwatch = this.findColorVariation(this.TARGET_NORMAL_LUMA, this.MIN_NORMAL_LUMA, this.MAX_NORMAL_LUMA, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
||||||
this.LightMutedSwatch = this.findColorVariation(this.TARGET_LIGHT_LUMA, this.MIN_LIGHT_LUMA, 1, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
this.LightMutedSwatch = this.findColorVariation(this.TARGET_LIGHT_LUMA, this.MIN_LIGHT_LUMA, 1, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
||||||
return this.DarkMutedSwatch = this.findColorVariation(this.TARGET_DARK_LUMA, 0, this.MAX_DARK_LUMA, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
return this.DarkMutedSwatch = this.findColorVariation(this.TARGET_DARK_LUMA, 0, this.MAX_DARK_LUMA, this.TARGET_MUTED_SATURATION, 0, this.MAX_MUTED_SATURATION);
|
||||||
};
|
};
|
||||||
|
|
||||||
Vibrant.prototype.generateEmptySwatches = function() {
|
Vibrant.prototype.generateEmptySwatches = function () {
|
||||||
var hsl;
|
var hsl;
|
||||||
if (this.VibrantSwatch === void 0) {
|
if (this.VibrantSwatch === void 0) {
|
||||||
if (this.DarkVibrantSwatch !== void 0) {
|
if (this.DarkVibrantSwatch !== void 0) {
|
||||||
hsl = this.DarkVibrantSwatch.getHsl();
|
hsl = this.DarkVibrantSwatch.getHsl();
|
||||||
hsl[2] = this.TARGET_NORMAL_LUMA;
|
hsl[2] = this.TARGET_NORMAL_LUMA;
|
||||||
this.VibrantSwatch = new Swatch(Vibrant.hslToRgb(hsl[0], hsl[1], hsl[2]), 0);
|
this.VibrantSwatch = new Swatch(Vibrant.hslToRgb(hsl[0], hsl[1], hsl[2]), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.DarkVibrantSwatch === void 0) {
|
||||||
|
if (this.VibrantSwatch !== void 0) {
|
||||||
|
hsl = this.VibrantSwatch.getHsl();
|
||||||
|
hsl[2] = this.TARGET_DARK_LUMA;
|
||||||
|
return this.DarkVibrantSwatch = new Swatch(Vibrant.hslToRgb(hsl[0], hsl[1], hsl[2]), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.findMaxPopulation = function () {
|
||||||
|
var j, len, population, ref, swatch;
|
||||||
|
population = 0;
|
||||||
|
ref = this._swatches;
|
||||||
|
for (j = 0, len = ref.length; j < len; j++) {
|
||||||
|
swatch = ref[j];
|
||||||
|
population = Math.max(population, swatch.getPopulation());
|
||||||
|
}
|
||||||
|
return population;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.findColorVariation = function (targetLuma, minLuma, maxLuma, targetSaturation, minSaturation, maxSaturation) {
|
||||||
|
var j, len, luma, max, maxValue, ref, sat, swatch, value;
|
||||||
|
max = void 0;
|
||||||
|
maxValue = 0;
|
||||||
|
ref = this._swatches;
|
||||||
|
for (j = 0, len = ref.length; j < len; j++) {
|
||||||
|
swatch = ref[j];
|
||||||
|
sat = swatch.getHsl()[1];
|
||||||
|
luma = swatch.getHsl()[2];
|
||||||
|
if (sat >= minSaturation && sat <= maxSaturation && luma >= minLuma && luma <= maxLuma && !this.isAlreadySelected(swatch)) {
|
||||||
|
value = this.createComparisonValue(sat, targetSaturation, luma, targetLuma, swatch.getPopulation(), this.HighestPopulation);
|
||||||
|
if (max === void 0 || value > maxValue) {
|
||||||
|
max = swatch;
|
||||||
|
maxValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.createComparisonValue = function (saturation, targetSaturation, luma, targetLuma, population, maxPopulation) {
|
||||||
|
return this.weightedMean(this.invertDiff(saturation, targetSaturation), this.WEIGHT_SATURATION, this.invertDiff(luma, targetLuma), this.WEIGHT_LUMA, population / maxPopulation, this.WEIGHT_POPULATION);
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.invertDiff = function (value, targetValue) {
|
||||||
|
return 1 - Math.abs(value - targetValue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.weightedMean = function () {
|
||||||
|
var i, sum, sumWeight, value, values, weight;
|
||||||
|
values = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
||||||
|
sum = 0;
|
||||||
|
sumWeight = 0;
|
||||||
|
i = 0;
|
||||||
|
while (i < values.length) {
|
||||||
|
value = values[i];
|
||||||
|
weight = values[i + 1];
|
||||||
|
sum += value * weight;
|
||||||
|
sumWeight += weight;
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
return sum / sumWeight;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.swatches = function () {
|
||||||
|
return {
|
||||||
|
Vibrant: this.VibrantSwatch,
|
||||||
|
Muted: this.MutedSwatch,
|
||||||
|
DarkVibrant: this.DarkVibrantSwatch,
|
||||||
|
DarkMuted: this.DarkMutedSwatch,
|
||||||
|
LightVibrant: this.LightVibrantSwatch,
|
||||||
|
LightMuted: this.LightMuted
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.prototype.isAlreadySelected = function (swatch) {
|
||||||
|
return this.VibrantSwatch === swatch || this.DarkVibrantSwatch === swatch || this.LightVibrantSwatch === swatch || this.MutedSwatch === swatch || this.DarkMutedSwatch === swatch || this.LightMutedSwatch === swatch;
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.rgbToHsl = function (r, g, b) {
|
||||||
|
var d, h, l, max, min, s;
|
||||||
|
r /= 255;
|
||||||
|
g /= 255;
|
||||||
|
b /= 255;
|
||||||
|
max = Math.max(r, g, b);
|
||||||
|
min = Math.min(r, g, b);
|
||||||
|
h = void 0;
|
||||||
|
s = void 0;
|
||||||
|
l = (max + min) / 2;
|
||||||
|
if (max === min) {
|
||||||
|
h = s = 0;
|
||||||
|
} else {
|
||||||
|
d = max - min;
|
||||||
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
||||||
|
switch (max) {
|
||||||
|
case r:
|
||||||
|
h = (g - b) / d + (g < b ? 6 : 0);
|
||||||
|
break;
|
||||||
|
case g:
|
||||||
|
h = (b - r) / d + 2;
|
||||||
|
break;
|
||||||
|
case b:
|
||||||
|
h = (r - g) / d + 4;
|
||||||
|
}
|
||||||
|
h /= 6;
|
||||||
|
}
|
||||||
|
return [h, s, l];
|
||||||
|
};
|
||||||
|
|
||||||
|
Vibrant.hslToRgb = function (h, s, l) {
|
||||||
|
var b, g, hue2rgb, p, q, r;
|
||||||
|
r = void 0;
|
||||||
|
g = void 0;
|
||||||
|
b = void 0;
|
||||||
|
hue2rgb = function (p, q, t) {
|
||||||
|
if (t < 0) {
|
||||||
|
t += 1;
|
||||||
|
}
|
||||||
|
if (t > 1) {
|
||||||
|
t -= 1;
|
||||||
|
}
|
||||||
|
if (t < 1 / 6) {
|
||||||
|
return p + (q - p) * 6 * t;
|
||||||
|
}
|
||||||
|
if (t < 1 / 2) {
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
if (t < 2 / 3) {
|
||||||
|
return p + (q - p) * (2 / 3 - t) * 6;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
};
|
||||||
|
if (s === 0) {
|
||||||
|
r = g = b = l;
|
||||||
|
} else {
|
||||||
|
q = l < 0.5 ? l * (1 + s) : l + s - (l * s);
|
||||||
|
p = 2 * l - q;
|
||||||
|
r = hue2rgb(p, q, h + 1 / 3);
|
||||||
|
g = hue2rgb(p, q, h);
|
||||||
|
b = hue2rgb(p, q, h - (1 / 3));
|
||||||
|
}
|
||||||
|
return [r * 255, g * 255, b * 255];
|
||||||
|
};
|
||||||
|
|
||||||
|
return Vibrant;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
CanvasImage Class
|
||||||
|
Class that wraps the html image element and canvas.
|
||||||
|
It also simplifies some of the canvas context manipulation
|
||||||
|
with a set of helper functions.
|
||||||
|
Stolen from https://github.com/lokesh/color-thief
|
||||||
|
*/
|
||||||
|
|
||||||
|
window.CanvasImage = CanvasImage = (function () {
|
||||||
|
function CanvasImage(image) {
|
||||||
|
|
||||||
|
this.canvas = document.createElement('canvas');
|
||||||
|
|
||||||
|
this.context = this.canvas.getContext('2d');
|
||||||
|
|
||||||
|
var originalWidth = image.width;
|
||||||
|
var originalHeight = image.height;
|
||||||
|
|
||||||
|
var maxArea = 300 * 300;
|
||||||
|
var bitmapArea = originalWidth * originalHeight;
|
||||||
|
var scaleRatio = 1;
|
||||||
|
if (bitmapArea > maxArea) {
|
||||||
|
scaleRatio = maxArea / bitmapArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
//console.log(scaleRatio);
|
||||||
|
|
||||||
|
this.width = this.canvas.width = originalWidth * scaleRatio;
|
||||||
|
this.height = this.canvas.height = originalHeight * scaleRatio;
|
||||||
|
|
||||||
|
this.context.drawImage(image, 0, 0, originalWidth, originalHeight, 0, 0, this.width, this.height);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (this.DarkVibrantSwatch === void 0) {
|
|
||||||
if (this.VibrantSwatch !== void 0) {
|
|
||||||
hsl = this.VibrantSwatch.getHsl();
|
|
||||||
hsl[2] = this.TARGET_DARK_LUMA;
|
|
||||||
return this.DarkVibrantSwatch = new Swatch(Vibrant.hslToRgb(hsl[0], hsl[1], hsl[2]), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.findMaxPopulation = function() {
|
CanvasImage.prototype.getPixelCount = function () {
|
||||||
var j, len, population, ref, swatch;
|
return this.width * this.height;
|
||||||
population = 0;
|
};
|
||||||
ref = this._swatches;
|
|
||||||
for (j = 0, len = ref.length; j < len; j++) {
|
|
||||||
swatch = ref[j];
|
|
||||||
population = Math.max(population, swatch.getPopulation());
|
|
||||||
}
|
|
||||||
return population;
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.findColorVariation = function(targetLuma, minLuma, maxLuma, targetSaturation, minSaturation, maxSaturation) {
|
CanvasImage.prototype.getImageData = function () {
|
||||||
var j, len, luma, max, maxValue, ref, sat, swatch, value;
|
return this.context.getImageData(0, 0, this.width, this.height);
|
||||||
max = void 0;
|
};
|
||||||
maxValue = 0;
|
|
||||||
ref = this._swatches;
|
|
||||||
for (j = 0, len = ref.length; j < len; j++) {
|
|
||||||
swatch = ref[j];
|
|
||||||
sat = swatch.getHsl()[1];
|
|
||||||
luma = swatch.getHsl()[2];
|
|
||||||
if (sat >= minSaturation && sat <= maxSaturation && luma >= minLuma && luma <= maxLuma && !this.isAlreadySelected(swatch)) {
|
|
||||||
value = this.createComparisonValue(sat, targetSaturation, luma, targetLuma, swatch.getPopulation(), this.HighestPopulation);
|
|
||||||
if (max === void 0 || value > maxValue) {
|
|
||||||
max = swatch;
|
|
||||||
maxValue = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return max;
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.createComparisonValue = function(saturation, targetSaturation, luma, targetLuma, population, maxPopulation) {
|
CanvasImage.prototype.removeCanvas = function () {
|
||||||
return this.weightedMean(this.invertDiff(saturation, targetSaturation), this.WEIGHT_SATURATION, this.invertDiff(luma, targetLuma), this.WEIGHT_LUMA, population / maxPopulation, this.WEIGHT_POPULATION);
|
this.context = null;
|
||||||
};
|
this.canvas = null;
|
||||||
|
};
|
||||||
|
|
||||||
Vibrant.prototype.invertDiff = function(value, targetValue) {
|
return CanvasImage;
|
||||||
return 1 - Math.abs(value - targetValue);
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.weightedMean = function() {
|
})();
|
||||||
var i, sum, sumWeight, value, values, weight;
|
|
||||||
values = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
|
||||||
sum = 0;
|
|
||||||
sumWeight = 0;
|
|
||||||
i = 0;
|
|
||||||
while (i < values.length) {
|
|
||||||
value = values[i];
|
|
||||||
weight = values[i + 1];
|
|
||||||
sum += value * weight;
|
|
||||||
sumWeight += weight;
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
return sum / sumWeight;
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.swatches = function() {
|
|
||||||
return {
|
|
||||||
Vibrant: this.VibrantSwatch,
|
|
||||||
Muted: this.MutedSwatch,
|
|
||||||
DarkVibrant: this.DarkVibrantSwatch,
|
|
||||||
DarkMuted: this.DarkMutedSwatch,
|
|
||||||
LightVibrant: this.LightVibrantSwatch,
|
|
||||||
LightMuted: this.LightMuted
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.prototype.isAlreadySelected = function(swatch) {
|
|
||||||
return this.VibrantSwatch === swatch || this.DarkVibrantSwatch === swatch || this.LightVibrantSwatch === swatch || this.MutedSwatch === swatch || this.DarkMutedSwatch === swatch || this.LightMutedSwatch === swatch;
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.rgbToHsl = function(r, g, b) {
|
|
||||||
var d, h, l, max, min, s;
|
|
||||||
r /= 255;
|
|
||||||
g /= 255;
|
|
||||||
b /= 255;
|
|
||||||
max = Math.max(r, g, b);
|
|
||||||
min = Math.min(r, g, b);
|
|
||||||
h = void 0;
|
|
||||||
s = void 0;
|
|
||||||
l = (max + min) / 2;
|
|
||||||
if (max === min) {
|
|
||||||
h = s = 0;
|
|
||||||
} else {
|
|
||||||
d = max - min;
|
|
||||||
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
||||||
switch (max) {
|
|
||||||
case r:
|
|
||||||
h = (g - b) / d + (g < b ? 6 : 0);
|
|
||||||
break;
|
|
||||||
case g:
|
|
||||||
h = (b - r) / d + 2;
|
|
||||||
break;
|
|
||||||
case b:
|
|
||||||
h = (r - g) / d + 4;
|
|
||||||
}
|
|
||||||
h /= 6;
|
|
||||||
}
|
|
||||||
return [h, s, l];
|
|
||||||
};
|
|
||||||
|
|
||||||
Vibrant.hslToRgb = function(h, s, l) {
|
|
||||||
var b, g, hue2rgb, p, q, r;
|
|
||||||
r = void 0;
|
|
||||||
g = void 0;
|
|
||||||
b = void 0;
|
|
||||||
hue2rgb = function(p, q, t) {
|
|
||||||
if (t < 0) {
|
|
||||||
t += 1;
|
|
||||||
}
|
|
||||||
if (t > 1) {
|
|
||||||
t -= 1;
|
|
||||||
}
|
|
||||||
if (t < 1 / 6) {
|
|
||||||
return p + (q - p) * 6 * t;
|
|
||||||
}
|
|
||||||
if (t < 1 / 2) {
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
if (t < 2 / 3) {
|
|
||||||
return p + (q - p) * (2 / 3 - t) * 6;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
};
|
|
||||||
if (s === 0) {
|
|
||||||
r = g = b = l;
|
|
||||||
} else {
|
|
||||||
q = l < 0.5 ? l * (1 + s) : l + s - (l * s);
|
|
||||||
p = 2 * l - q;
|
|
||||||
r = hue2rgb(p, q, h + 1 / 3);
|
|
||||||
g = hue2rgb(p, q, h);
|
|
||||||
b = hue2rgb(p, q, h - (1 / 3));
|
|
||||||
}
|
|
||||||
return [r * 255, g * 255, b * 255];
|
|
||||||
};
|
|
||||||
|
|
||||||
return Vibrant;
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
CanvasImage Class
|
|
||||||
Class that wraps the html image element and canvas.
|
|
||||||
It also simplifies some of the canvas context manipulation
|
|
||||||
with a set of helper functions.
|
|
||||||
Stolen from https://github.com/lokesh/color-thief
|
|
||||||
*/
|
|
||||||
|
|
||||||
window.CanvasImage = CanvasImage = (function() {
|
|
||||||
function CanvasImage(image) {
|
|
||||||
|
|
||||||
this.canvas = document.createElement('canvas');
|
|
||||||
|
|
||||||
this.context = this.canvas.getContext('2d');
|
|
||||||
|
|
||||||
var originalWidth = image.width;
|
|
||||||
var originalHeight = image.height;
|
|
||||||
|
|
||||||
var maxArea = 300 * 300;
|
|
||||||
var bitmapArea = originalWidth * originalHeight;
|
|
||||||
var scaleRatio = 1;
|
|
||||||
if (bitmapArea > maxArea) {
|
|
||||||
scaleRatio = maxArea / bitmapArea;
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.log(scaleRatio);
|
|
||||||
|
|
||||||
this.width = this.canvas.width = originalWidth * scaleRatio;
|
|
||||||
this.height = this.canvas.height = originalHeight * scaleRatio;
|
|
||||||
|
|
||||||
this.context.drawImage(image, 0, 0, originalWidth, originalHeight, 0, 0, this.width, this.height);
|
|
||||||
}
|
|
||||||
|
|
||||||
CanvasImage.prototype.getPixelCount = function() {
|
|
||||||
return this.width * this.height;
|
|
||||||
};
|
|
||||||
|
|
||||||
CanvasImage.prototype.getImageData = function () {
|
|
||||||
return this.context.getImageData(0, 0, this.width, this.height);
|
|
||||||
};
|
|
||||||
|
|
||||||
CanvasImage.prototype.removeCanvas = function() {
|
|
||||||
this.context = null;
|
|
||||||
this.canvas = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
return CanvasImage;
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|
||||||
}).call(this);
|
|
||||||
|
|
||||||
},{"quantize":1}]},{},[2]);
|
},{"quantize":1}]},{},[2]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue