Repository URL to install this package:
|
Version:
3.12.2 ▾
|
import { decode83 } from './base83';
import { sRGBToLinear, signPow, linearTosRGB } from './utils';
import { ValidationError } from './error';
/**
* Returns an error message if invalid or undefined if valid
*
* @param blurhash
*/
var validateBlurhash = function validateBlurhash(blurhash) {
if (!blurhash || blurhash.length < 6) {
throw new ValidationError('The blurhash string must be at least 6 characters');
}
var sizeFlag = decode83(blurhash[0]);
var numY = Math.floor(sizeFlag / 9) + 1;
var numX = sizeFlag % 9 + 1;
if (blurhash.length !== 4 + 2 * numX * numY) {
throw new ValidationError("blurhash length mismatch: length is ".concat(blurhash.length, " but it should be ").concat(4 + 2 * numX * numY));
}
};
var decodeDC = function decodeDC(value) {
var intR = value >> 16;
var intG = value >> 8 & 255;
var intB = value & 255;
return [sRGBToLinear(intR), sRGBToLinear(intG), sRGBToLinear(intB)];
};
var decodeAC = function decodeAC(value, maximumValue) {
var quantR = Math.floor(value / (19 * 19));
var quantG = Math.floor(value / 19) % 19;
var quantB = value % 19;
var rgb = [signPow((quantR - 9) / 9, 2.0) * maximumValue, signPow((quantG - 9) / 9, 2.0) * maximumValue, signPow((quantB - 9) / 9, 2.0) * maximumValue];
return rgb;
};
var decode = function decode(blurhash, width, height, punch) {
validateBlurhash(blurhash);
punch = punch | 1;
var sizeFlag = decode83(blurhash[0]);
var numY = Math.floor(sizeFlag / 9) + 1;
var numX = sizeFlag % 9 + 1;
var quantisedMaximumValue = decode83(blurhash[1]);
var maximumValue = (quantisedMaximumValue + 1) / 166;
var colors = new Array(numX * numY);
for (var i = 0; i < colors.length; i++) {
if (i === 0) {
var value = decode83(blurhash.substring(2, 6));
colors[i] = decodeDC(value);
} else {
var _value = decode83(blurhash.substring(4 + i * 2, 6 + i * 2));
colors[i] = decodeAC(_value, maximumValue * punch);
}
}
var bytesPerRow = width * 4;
var pixels = new Uint8ClampedArray(bytesPerRow * height);
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
var r = 0;
var g = 0;
var b = 0;
for (var j = 0; j < numY; j++) {
for (var _i = 0; _i < numX; _i++) {
var basis = Math.cos(Math.PI * x * _i / width) * Math.cos(Math.PI * y * j / height);
var color = colors[_i + j * numX];
r += color[0] * basis;
g += color[1] * basis;
b += color[2] * basis;
}
}
var intR = linearTosRGB(r);
var intG = linearTosRGB(g);
var intB = linearTosRGB(b);
pixels[4 * x + 0 + y * bytesPerRow] = intR;
pixels[4 * x + 1 + y * bytesPerRow] = intG;
pixels[4 * x + 2 + y * bytesPerRow] = intB;
pixels[4 * x + 3 + y * bytesPerRow] = 255; // alpha
}
}
return pixels;
};
export default decode;