UNPKG

6.88 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const pngjs_1 = require("pngjs");
7const lodash_1 = require("lodash");
8const generate_1 = __importDefault(require("nanoid/generate"));
9const constants_1 = require("./constants");
10const ALPHABET = '01';
11function generateScreenshotMark() {
12 // NOTE: 32-bit id
13 const id = generate_1.default(ALPHABET, constants_1.MARK_LENGTH);
14 // NOTE: array of RGB values
15 const markSeed = lodash_1.flatten(lodash_1.map(id, bit => bit === '0' ? [0, 0, 0, 255] : [255, 255, 255, 255]));
16 // NOTE: macOS browsers can't display an element, if it's CSS height is lesser than 1.
17 // It happens on Retina displays, because they have more than 1 physical pixel in a CSS pixel.
18 // So increase mark size by prepending transparent pixels before the actual mark.
19 const imageData = lodash_1.times(constants_1.MARK_BYTES_PER_PIXEL * constants_1.MARK_LENGTH * (constants_1.MARK_HEIGHT - 1), lodash_1.constant(0)).concat(markSeed);
20 const imageDataBuffer = Buffer.from(imageData);
21 const pngImage = new pngjs_1.PNG({ width: constants_1.MARK_LENGTH, height: constants_1.MARK_HEIGHT });
22 imageDataBuffer.copy(pngImage.data);
23 const markData = 'data:image/png;base64,' + pngjs_1.PNG.sync.write(pngImage).toString('base64');
24 return { markSeed, markData };
25}
26exports.generateScreenshotMark = generateScreenshotMark;
27function copyImagePart(pngImage, { clipLeft, clipTop, clipRight, clipBottom }) {
28 const width = clipRight - clipLeft;
29 const height = clipBottom - clipTop;
30 const dstImage = new pngjs_1.PNG({ width, height });
31 const stride = dstImage.width * constants_1.MARK_BYTES_PER_PIXEL;
32 for (let i = 0; i < height; i++) {
33 const srcStartIndex = (pngImage.width * (i + clipTop) + clipLeft) * constants_1.MARK_BYTES_PER_PIXEL;
34 pngImage.data.copy(dstImage.data, stride * i, srcStartIndex, srcStartIndex + stride);
35 }
36 return dstImage;
37}
38exports.copyImagePart = copyImagePart;
39//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvdXRpbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBNEI7QUFDNUIsbUNBQXVEO0FBQ3ZELCtEQUF5QztBQUN6QywyQ0FBNkU7QUFFN0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBRXRCLFNBQWdCLHNCQUFzQjtJQUNsQyxrQkFBa0I7SUFDbEIsTUFBTSxFQUFFLEdBQUcsa0JBQVUsQ0FBQyxRQUFRLEVBQUUsdUJBQVcsQ0FBQyxDQUFDO0lBRTdDLDRCQUE0QjtJQUM1QixNQUFNLFFBQVEsR0FBRyxnQkFBTyxDQUFDLFlBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RixzRkFBc0Y7SUFDdEYsOEZBQThGO0lBQzlGLGlGQUFpRjtJQUNqRixNQUFNLFNBQVMsR0FBUyxjQUFLLENBQUMsZ0NBQW9CLEdBQUcsdUJBQVcsR0FBRyxDQUFDLHVCQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUUsaUJBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwSCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFVLElBQUksV0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLHVCQUFXLEVBQUUsTUFBTSxFQUFFLHVCQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTdFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixHQUFHLFdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV4RixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFuQkQsd0RBbUJDO0FBRUQsU0FBZ0IsYUFBYSxDQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRTtJQUNqRixNQUFNLEtBQUssR0FBSSxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFFcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxXQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLGdDQUFvQixDQUFDO0lBRXJELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLGdDQUFvQixDQUFDO1FBRXpGLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQ3hGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQWZELHNDQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUE5HIH0gZnJvbSAncG5nanMnO1xuaW1wb3J0IHsgbWFwLCBmbGF0dGVuLCB0aW1lcywgY29uc3RhbnQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGdlbmVyYXRlSWQgZnJvbSAnbmFub2lkL2dlbmVyYXRlJztcbmltcG9ydCB7IE1BUktfTEVOR1RILCBNQVJLX0hFSUdIVCwgTUFSS19CWVRFU19QRVJfUElYRUwgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IEFMUEhBQkVUID0gJzAxJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyZWVuc2hvdE1hcmsgKCkge1xuICAgIC8vIE5PVEU6IDMyLWJpdCBpZFxuICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVJZChBTFBIQUJFVCwgTUFSS19MRU5HVEgpO1xuXG4gICAgLy8gTk9URTogYXJyYXkgb2YgUkdCIHZhbHVlc1xuICAgIGNvbnN0IG1hcmtTZWVkID0gZmxhdHRlbihtYXAoaWQsIGJpdCA9PiBiaXQgPT09ICcwJyA/IFswLCAwLCAwLCAyNTVdIDogWzI1NSwgMjU1LCAyNTUsIDI1NV0pKTtcblxuICAgIC8vIE5PVEU6IG1hY09TIGJyb3dzZXJzIGNhbid0IGRpc3BsYXkgYW4gZWxlbWVudCwgaWYgaXQncyBDU1MgaGVpZ2h0IGlzIGxlc3NlciB0aGFuIDEuXG4gICAgLy8gSXQgaGFwcGVucyBvbiBSZXRpbmEgZGlzcGxheXMsIGJlY2F1c2UgdGhleSBoYXZlIG1vcmUgdGhhbiAxIHBoeXNpY2FsIHBpeGVsIGluIGEgQ1NTIHBpeGVsLlxuICAgIC8vIFNvIGluY3JlYXNlIG1hcmsgc2l6ZSBieSBwcmVwZW5kaW5nIHRyYW5zcGFyZW50IHBpeGVscyBiZWZvcmUgdGhlIGFjdHVhbCBtYXJrLlxuICAgIGNvbnN0IGltYWdlRGF0YSAgICAgICA9IHRpbWVzKE1BUktfQllURVNfUEVSX1BJWEVMICogTUFSS19MRU5HVEggKiAoTUFSS19IRUlHSFQgLSAxKSwgY29uc3RhbnQoMCkpLmNvbmNhdChtYXJrU2VlZCk7XG4gICAgY29uc3QgaW1hZ2VEYXRhQnVmZmVyID0gQnVmZmVyLmZyb20oaW1hZ2VEYXRhKTtcbiAgICBjb25zdCBwbmdJbWFnZSAgICAgICAgPSBuZXcgUE5HKHsgd2lkdGg6IE1BUktfTEVOR1RILCBoZWlnaHQ6IE1BUktfSEVJR0hUIH0pO1xuXG4gICAgaW1hZ2VEYXRhQnVmZmVyLmNvcHkocG5nSW1hZ2UuZGF0YSk7XG5cbiAgICBjb25zdCBtYXJrRGF0YSA9ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsJyArIFBORy5zeW5jLndyaXRlKHBuZ0ltYWdlKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICByZXR1cm4geyBtYXJrU2VlZCwgbWFya0RhdGEgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZVBhcnQgKHBuZ0ltYWdlLCB7IGNsaXBMZWZ0LCBjbGlwVG9wLCBjbGlwUmlnaHQsIGNsaXBCb3R0b20gfSkge1xuICAgIGNvbnN0IHdpZHRoICA9IGNsaXBSaWdodCAtIGNsaXBMZWZ0O1xuICAgIGNvbnN0IGhlaWdodCA9IGNsaXBCb3R0b20gLSBjbGlwVG9wO1xuXG4gICAgY29uc3QgZHN0SW1hZ2UgPSBuZXcgUE5HKHsgd2lkdGgsIGhlaWdodCB9KTtcblxuICAgIGNvbnN0IHN0cmlkZSA9IGRzdEltYWdlLndpZHRoICogTUFSS19CWVRFU19QRVJfUElYRUw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNyY1N0YXJ0SW5kZXggPSAocG5nSW1hZ2Uud2lkdGggKiAoaSArIGNsaXBUb3ApICsgY2xpcExlZnQpICogTUFSS19CWVRFU19QRVJfUElYRUw7XG5cbiAgICAgICAgcG5nSW1hZ2UuZGF0YS5jb3B5KGRzdEltYWdlLmRhdGEsIHN0cmlkZSAqIGksIHNyY1N0YXJ0SW5kZXgsIHNyY1N0YXJ0SW5kZXggKyBzdHJpZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBkc3RJbWFnZTtcbn1cbiJdfQ==
\No newline at end of file