@realfavicongenerator/generate-favicon
Version:
Generate a favicon
122 lines (121 loc) • 5.7 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBrowserImageAdapter = exports.svgToImageAndMeta = void 0;
const svg_js_1 = require("@svgdotjs/svg.js");
// const svgToSquarePngAsDataUrl = async (svg: string, size?: number): Promise<string> => {
// return svgToSquarePng<string>(svg, (canvas) => Promise.resolve(canvas.toDataURL('image/png')), size);
// };
const svgToSquarePngAsBlob = (svg, size) => __awaiter(void 0, void 0, void 0, function* () {
return svgToSquarePng(svg, (canvas) => new Promise(resolve => {
canvas.toBlob(blob => {
if (blob) {
resolve(blob);
}
}, 'image/png');
}), size);
});
const svgToSquarePngAsBuffer = (svg, size) => __awaiter(void 0, void 0, void 0, function* () {
return svgToSquarePng(svg, (canvas) => new Promise(resolve => {
canvas.toBlob(blob => {
if (blob) {
const reader = new FileReader();
reader.onload = () => {
if (reader.result instanceof ArrayBuffer) {
resolve(Buffer.from(reader.result));
}
};
reader.readAsArrayBuffer(blob);
}
}, 'image/png');
}), size);
});
const svgToSquarePng = (svg, converter, size) => __awaiter(void 0, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const svgImage = createHiddenDomElement('img');
svgImage.onload = () => __awaiter(void 0, void 0, void 0, function* () {
const canvas = document.createElement('canvas');
const svgSize = Math.max(svgImage.clientWidth, svgImage.clientHeight);
size = size || svgSize;
canvas.width = size;
canvas.height = size;
const svgNewWidth = svgImage.clientWidth / svgSize * size;
const svgNewHeight = svgImage.clientHeight / svgSize * size;
const canvasCtx = canvas.getContext('2d');
if (canvasCtx) {
canvasCtx.drawImage(svgImage, (size - svgNewWidth) / 2, (size - svgNewHeight) / 2, svgNewWidth, svgNewHeight);
const result = yield converter(canvas);
document.body.removeChild(svgImage);
resolve(result);
}
});
svgImage.onerror = (e) => reject(e);
svgImage.src = 'data:image/svg+xml;base64,' + btoa(svg);
});
});
const createHiddenDomElement = (tagName, options) => {
const elt = window.document.createElement(tagName);
elt.style.position = 'absolute';
elt.style.left = '-5000px';
window.document.body.appendChild(elt);
return elt;
};
const svgToImageAndMeta = (dataUrl, size) => __awaiter(void 0, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const svgImage = createHiddenDomElement('img');
svgImage.onload = () => __awaiter(void 0, void 0, void 0, function* () {
const canvas = document.createElement('canvas');
const svgSize = Math.max(svgImage.clientWidth, svgImage.clientHeight);
canvas.width = size;
canvas.height = size;
const svgNewWidth = svgImage.clientWidth / svgSize * size;
const svgNewHeight = svgImage.clientHeight / svgSize * size;
const canvasCtx = canvas.getContext('2d');
if (canvasCtx) {
canvasCtx.drawImage(svgImage, (size - svgNewWidth) / 2, (size - svgNewHeight) / 2, svgNewWidth, svgNewHeight);
const imageData = canvasCtx.getImageData(0, 0, canvas.width, canvas.height);
const data = Buffer.from(imageData.data);
document.body.removeChild(svgImage);
resolve(data);
}
});
svgImage.onerror = (e) => reject(e);
svgImage.src = dataUrl;
});
});
exports.svgToImageAndMeta = svgToImageAndMeta;
const getBrowserImageAdapter = () => {
return {
createSvg: () => {
const rootDiv = createHiddenDomElement('div');
return (0, svg_js_1.SVG)().addTo(rootDiv);
},
convertSvgToPng: (svg) => __awaiter(void 0, void 0, void 0, function* () {
return svgToSquarePngAsBuffer(svg.svg());
}),
getImageSize: (dataUrl) => __awaiter(void 0, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const img = createHiddenDomElement('img');
img.onload = () => {
resolve({ width: img.width, height: img.height });
};
img.onerror = (e) => {
reject(e);
};
img.src = dataUrl;
});
}),
getImageData: (dataUrl, widthHeight) => __awaiter(void 0, void 0, void 0, function* () {
return (0, exports.svgToImageAndMeta)(dataUrl, widthHeight);
})
};
};
exports.getBrowserImageAdapter = getBrowserImageAdapter;