@paroicms/server-image-cache-engine
Version:
The image variant engine that we use at Paroi.
100 lines • 3.04 kB
JavaScript
import sharp from "sharp";
import { sharpQueue } from "./image-processor-setup.js";
import { convertSharpFormatToMediaType } from "./internal/resizer.js";
const drawPixelByChannels = {
1: drawPixel1Channel,
2: drawPixel2Channels,
3: drawPixel3Channels,
4: drawPixel4Channels,
};
export async function createDefaultBoFavicon(binaryFile) {
const sharpInst = sharp(binaryFile);
const metadata = await sharpQueue(() => sharpInst.metadata());
if (metadata.width === undefined || metadata.height === undefined) {
throw new Error("cannot get image size");
}
const dim = Math.min(metadata.width, metadata.height, 128);
const { data, info } = await sharpQueue(() => sharpInst
.resize({
width: dim,
height: dim,
fit: "cover",
})
.ensureAlpha()
.raw()
.toBuffer({ resolveWithObject: true }));
const { width, height, channels } = info;
const drawPixel = drawPixelByChannels[channels];
drawThePattern({ data, drawPixel, width: dim, channels });
const result = await sharpQueue(() => sharp(data, { raw: { width, height, channels } })
.webp({
lossless: true,
})
.toBuffer({ resolveWithObject: true }));
const mediaType = convertSharpFormatToMediaType(result.info.format);
return {
rawWidth: result.info.width,
rawHeight: result.info.height,
weightB: result.data.byteLength,
mediaType,
lossless: mediaType === "image/png" || mediaType === "image/webp",
binaryFile: result.data,
};
}
function drawThePattern({ data, drawPixel, width, channels, }) {
const minX = Math.trunc(width * 0.05);
let maxX = Math.trunc(width * 0.45);
let w = maxX - minX;
if (w <= 0)
return;
if (w % 2 === 1) {
// ensure even width
++w;
++maxX;
if (maxX >= width)
return;
}
const minY = minX; // it's a square
const maxY = maxX;
const startX = minX + w / 2 - 1;
let curX = startX;
let curEndX = curX + 2;
let inc = true;
for (let y = minY; y < maxY; ++y) {
for (let x = curX; x < curEndX; ++x) {
const index = (y * width + x) * channels;
drawPixel(data, index);
}
if (inc) {
--curX;
++curEndX;
if (curX <= minX || curEndX >= maxX) {
inc = false;
}
}
else {
++curX;
--curEndX;
if (curX > startX) {
break;
}
}
}
}
function drawPixel1Channel(data, index) {
data[index] = 200;
}
function drawPixel2Channels(data, index) {
drawPixel1Channel(data, index);
data[index + 1] = 255;
}
function drawPixel3Channels(data, index) {
data[index] = 240;
data[index + 1] = 60;
data[index + 2] = 60;
}
function drawPixel4Channels(data, index) {
drawPixel3Channels(data, index);
data[index + 3] = 255;
}
//# sourceMappingURL=default-bo-favicon.js.map