UNPKG

@realfavicongenerator/generate-favicon

Version:
122 lines (121 loc) 5.7 kB
"use strict"; 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;