Innovenergy_trunk/frontend/node_modules/testcafe/lib/screenshots/crop.js

106 lines
14 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cropScreenshot = exports.calculateClipInfo = exports.getClipInfoByCropDimensions = exports.getClipInfoByMarkPosition = exports.calculateMarkPosition = exports.markSeedToId = void 0;
const utils_1 = require("./utils");
const limit_number_1 = __importDefault(require("../utils/limit-number"));
const promisified_functions_1 = require("../utils/promisified-functions");
const test_run_1 = require("../errors/test-run/");
const constants_1 = require("./constants");
const MARK_SEED_ERROR_THRESHOLD = 10;
const WHITE_COLOR_PART = 255;
const BLACK_COLOR_PART = 0;
function markSeedToId(markSeed) {
let id = 0;
for (let i = 0; i < constants_1.MARK_LENGTH; i++)
id = id * 2 + (markSeed[i * constants_1.MARK_BYTES_PER_PIXEL] ? 1 : 0);
return id;
}
exports.markSeedToId = markSeedToId;
function getCorrectedColorPart(colorPart) {
const isWhite = colorPart > WHITE_COLOR_PART - MARK_SEED_ERROR_THRESHOLD;
const isBlack = colorPart < MARK_SEED_ERROR_THRESHOLD;
if (isBlack)
return BLACK_COLOR_PART;
if (isWhite)
return WHITE_COLOR_PART;
return colorPart;
}
async function validateClipInfo(clipInfo, path) {
const clipWidth = clipInfo.clipRight - clipInfo.clipLeft;
const clipHeight = clipInfo.clipBottom - clipInfo.clipTop;
if (clipWidth <= 0 || clipHeight <= 0) {
await (0, promisified_functions_1.deleteFile)(path);
throw new test_run_1.InvalidElementScreenshotDimensionsError(clipWidth, clipHeight);
}
}
function calculateMarkPosition(pngImage, markSeed) {
const mark = Buffer.from(markSeed);
const filtImg = Buffer.from(pngImage.data);
for (let i = 0; i < filtImg.length; i++)
filtImg[i] = getCorrectedColorPart(filtImg[i]);
const markIndex = filtImg.indexOf(mark);
if (markIndex < 0)
return null;
const endPosition = markIndex / constants_1.MARK_BYTES_PER_PIXEL + constants_1.MARK_LENGTH + constants_1.MARK_RIGHT_MARGIN;
const x = endPosition % pngImage.width || pngImage.width;
const y = (endPosition - x) / pngImage.width + 1;
return { x, y };
}
exports.calculateMarkPosition = calculateMarkPosition;
function getClipInfoByMarkPosition(markPosition, { width, height }) {
const { x, y } = markPosition;
const clipRight = x;
const clipBottom = y;
const clipLeft = clipRight - width;
const clipTop = clipBottom - height;
return {
clipLeft,
clipTop,
clipRight,
clipBottom,
};
}
exports.getClipInfoByMarkPosition = getClipInfoByMarkPosition;
function getClipInfoByCropDimensions({ clipRight, clipLeft, clipBottom, clipTop }, cropDimensions) {
if (cropDimensions) {
const { right, top, bottom, left } = cropDimensions;
clipRight = (0, limit_number_1.default)(clipLeft + right, clipLeft, clipRight);
clipBottom = (0, limit_number_1.default)(clipTop + bottom, clipTop, clipBottom);
clipLeft = (0, limit_number_1.default)(clipLeft + left, clipLeft, clipRight);
clipTop = (0, limit_number_1.default)(clipTop + top, clipTop, clipBottom);
}
return {
clipLeft,
clipTop,
clipRight,
clipBottom,
};
}
exports.getClipInfoByCropDimensions = getClipInfoByCropDimensions;
function calculateClipInfo(pngImage, markSeedPosition, clientAreaDimensions, cropDimensions) {
let clipInfo = {
clipRight: pngImage.width,
clipBottom: pngImage.height,
clipLeft: 0,
clipTop: 0,
};
if (markSeedPosition && clientAreaDimensions)
clipInfo = getClipInfoByMarkPosition(markSeedPosition, clientAreaDimensions);
clipInfo = getClipInfoByCropDimensions(clipInfo, cropDimensions);
if (markSeedPosition && markSeedPosition.y === clipInfo.clipBottom)
clipInfo.clipBottom--;
return clipInfo;
}
exports.calculateClipInfo = calculateClipInfo;
async function cropScreenshot(image, { path, markSeedPosition, clientAreaDimensions, cropDimensions }) {
if (!markSeedPosition && !cropDimensions)
return null;
const clip = calculateClipInfo(image, markSeedPosition, clientAreaDimensions, cropDimensions);
await validateClipInfo(clip, path);
return (0, utils_1.copyImagePart)(image, clip);
}
exports.cropScreenshot = cropScreenshot;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JlZW5zaG90cy9jcm9wLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQUF3QztBQUN4Qyx5RUFBZ0Q7QUFDaEQsMEVBQTREO0FBQzVELGtEQUE4RTtBQUM5RSwyQ0FJcUI7QUFFckIsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckMsTUFBTSxnQkFBZ0IsR0FBWSxHQUFHLENBQUM7QUFDdEMsTUFBTSxnQkFBZ0IsR0FBWSxDQUFDLENBQUM7QUFFcEMsU0FBZ0IsWUFBWSxDQUFFLFFBQVE7SUFDbEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRVgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHVCQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQ2hDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxnQ0FBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE9BQU8sRUFBRSxDQUFDO0FBQ2QsQ0FBQztBQVBELG9DQU9DO0FBRUQsU0FBUyxxQkFBcUIsQ0FBRSxTQUFTO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxnQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcseUJBQXlCLENBQUM7SUFFdEQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxnQkFBZ0IsQ0FBQztJQUU1QixJQUFJLE9BQU87UUFDUCxPQUFPLGdCQUFnQixDQUFDO0lBRTVCLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxLQUFLLFVBQVUsZ0JBQWdCLENBQUUsUUFBUSxFQUFFLElBQUk7SUFDM0MsTUFBTSxTQUFTLEdBQUksUUFBUSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFB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bHMnO1xuaW1wb3J0IGxpbWl0TnVtYmVyIGZyb20gJy4uL3V0aWxzL2xpbWl0LW51bWJlcic7XG5pbXBvcnQgeyBkZWxldGVGaWxlIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzaWZpZWQtZnVuY3Rpb25zJztcbmltcG9ydCB7IEludmFsaWRFbGVtZW50U2NyZWVuc2hvdERpbWVuc2lvbnNFcnJvciB9IGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi8nO1xuaW1wb3J0IHtcbiAgICBNQVJLX0xFTkdUSCxcbiAgICBNQVJLX1JJR0hUX01BUkdJTixcbiAgICBNQVJLX0JZVEVTX1BFUl9QSVhFTCxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBNQVJLX1NFRURfRVJST1JfVEhSRVNIT0xEID0gMTA7XG5jb25zdCBXSElURV9DT0xPUl9QQVJUICAgICAgICAgID0gMjU1O1xuY29uc3QgQkxBQ0tfQ09MT1JfUEFSVCAgICAgICAgICA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrU2VlZFRvSWQgKG1hcmtTZWVkKSB7XG4gICAgbGV0IGlkID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFSS19MRU5HVEg7IGkrKylcbiAgICAgICAgaWQgPSBpZCAqIDIgKyAobWFya1NlZWRbaSAqIE1BUktfQllURVNfUEVSX1BJWEVMXSA/IDEgOiAwKTtcblxuICAgIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29ycmVjdGVkQ29sb3JQYXJ0IChjb2xvclBhcnQpIHtcbiAgICBjb25zdCBpc1doaXRlID0gY29sb3JQYXJ0ID4gV0hJVEVfQ09MT1JfUEFSVCAtIE1BUktfU0VFRF9FUlJPUl9USFJFU0hPTEQ7XG4gICAgY29uc3QgaXNCbGFjayA9IGNvbG9yUGFydCA8IE1BUktfU0VFRF9FUlJPUl9USFJFU0hPTEQ7XG5cbiAgICBpZiAoaXNCbGFjaylcbiAgICAgICAgcmV0dXJuIEJMQUNLX0NPTE9SX1BBUlQ7XG5cbiAgICBpZiAoaXNXaGl0ZSlcbiAgICAgICAgcmV0dXJuIFdISVRFX0NPTE9SX1BBUlQ7XG5cbiAgICByZXR1cm4gY29sb3JQYXJ0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUNsaXBJbmZvIChjbGlwSW5mbywgcGF0aCkge1xuICAgIGNvbnN0IGNsaXBXaWR0aCAgPSBjbGlwSW5mby5jbGlwUmlnaHQgLSBjbGlwSW5mby5jbGlwTGVmdDtcbiAgICBjb25zdCBjbGlwSGVpZ2h0ID0gY2xpcEluZm8uY2xpcEJvdHRvbSAtIGNsaXBJbmZvLmNsaXBUb3A7XG5cbiAgICBpZiAoY2xpcFdpZHRoIDw9IDAgfHwgY2xpcEhlaWdodCA8PSAwKSB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUZpbGUocGF0aCk7XG5cbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFbGVtZW50U2NyZWVuc2hvdERpbWVuc2lvbnNFcnJvcihjbGlwV2lkdGgsIGNsaXBIZWlnaHQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZU1hcmtQb3NpdGlvbiAocG5nSW1hZ2UsIG1hcmtTZWVkKSB7XG4gICAgY29uc3QgbWFyayAgICA9IEJ1ZmZlci5mcm9tKG1hcmtTZWVkKTtcbiAgICBjb25zdCBmaWx0SW1nID0gQnVmZmVyLmZyb20ocG5nSW1hZ2UuZGF0YSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRJbWcubGVuZ3RoOyBpKyspXG4gICAgICAgIGZpbHRJbWdbaV0gPSBnZXRDb3JyZWN0ZWRDb2xvclBhcnQoZmlsdEltZ1tpXSk7XG5cbiAgICBjb25zdCBtYXJrSW5kZXggPSBmaWx0SW1nLmluZGV4T2YobWFyayk7XG5cbiAgICBpZiAobWFya0luZGV4IDwgMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBlbmRQb3NpdGlvbiA9IG1hcmtJbmRleCAvIE1BUktfQllURVNfUEVSX1BJWEVMICsgTUFSS19MRU5HVEggKyBNQVJLX1JJR0hUX01BUkdJTjtcblxuICAgIGNvbnN0IHggPSBlbmRQb3NpdGlvbiAlIHBuZ0ltYWdlLndpZHRoIHx8IHBuZ0ltYWdlLndpZHRoO1xuICAgIGNvbnN0IHkgPSAoZW5kUG9zaXRpb24gLSB4KSAvIHBuZ0ltYWdlLndpZHRoICsgMTtcblxuICAgIHJldHVybiB7IHgsIHkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaXBJbmZvQnlNYXJrUG9zaXRpb24gKG1hcmtQb3NpdGlvbiwgeyB3aWR0aCwgaGVpZ2h0IH0pIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IG1hcmtQb3NpdGlvbjtcblxuICAgIGNvbnN0IGNsaXBSaWdodCAgPSB4O1xuICAgIGNvbnN0IGNsaXBCb3R0b20gPSB5O1xuICAgIGNvbnN0IGNsaXBMZWZ0ICAgPSBjbGlwUmlnaHQgLSB3aWR0aDtcbiAgICBjb25zdCBjbGlwVG9wICAgID0gY2xpcEJvdHRvbSAtIGhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNsaXBMZWZ0LFxuICAgICAgICBjbGlwVG9wLFxuICAgICAgICBjbGlwUmlnaHQsXG4gICAgICAgIGNsaXBCb3R0b20sXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaXBJbmZvQnlDcm9wRGltZW5zaW9ucyAoeyBjbGlwUmlnaHQsIGNsaXBMZWZ0LCBjbGlwQm90dG9tLCBjbGlwVG9wIH0sIGNyb3BEaW1lbnNpb25zKSB7XG4gICAgaWYgKGNyb3BEaW1lbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgcmlnaHQsIHRvcCwgYm90dG9tLCBsZWZ0IH0gPSBjcm9wRGltZW5zaW9ucztcblxuICAgICAgICBjbGlwUmlnaHQgID0gbGltaXROdW1iZXIoY2xpcExlZnQgKyByaWdodCwgY2xpcExlZnQsIGNsaXBSaWdodCk7XG4gICAgICAgIGNsaXBCb3R0b20gPSBsaW1pdE51bWJlcihjbGlwVG9wICsgYm90dG9tLCBjbGlwVG9wLCBjbGlwQm90dG9tKTtcbiAgICAgICAgY2xpcExlZnQgICA9IGxpbWl0TnVtYmVyKGNsaXBMZWZ0ICsgbGVmdCwgY2xpcExlZnQsIGNsaXBSaWdodCk7XG4gICAgICAgIGNsaXBUb3AgICAgPSBsaW1pdE51bWJlcihjbGlwVG9wICsgdG9wLCBjbGlwVG9wLCBjbGlwQm90dG9tKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjbGlwTGVmdCxcbiAgICAgICAgY2xpcFRvcCxcbiAgICAgICAgY2xpcFJpZ2h0LFxuICAgICAgICBjbGlwQm90dG9tLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDbGlwSW5mbyAocG5nSW1hZ2UsIG1hcmtTZWVkUG9zaXRpb24sIGNsaWVudEFyZWFEaW1lbnNpb25zLCBjcm9wRGltZW5zaW9ucykge1xuICAgIGxldCBjbGlwSW5mbyA9IHtcbiAgICAgICAgY2xpcFJpZ2h0OiAgcG5nSW1hZ2Uud2lkdGgsXG4gICAgICAgIGNsaXBCb3R0b206IHBuZ0ltYWdlLmhlaWdodCxcbiAgICAgICAgY2xpcExlZnQ6ICAgMCxcbiAgICAgICAgY2xpcFRvcDogICAgMCxcbiAgICB9O1xuXG4gICAgaWYgKG1hcmtTZWVkUG9zaXRpb24gJiYgY2xpZW50QXJlYURpbWVuc2lvbnMpXG4gICAgICAgIGNsaXBJbmZvID0gZ2V0Q2xpcEluZm9CeU1hcmtQb3NpdGlvbihtYXJrU2VlZFBvc2l0aW9uLCBjbGllbnRBcmVhRGltZW5zaW9ucyk7XG5cbiAgICBjbGlwSW5mbyA9IGdldENsaXBJbmZvQnlDcm9wRGltZW5zaW9ucyhjbGlwSW5mbywgY3JvcERpbWVuc2lvbnMpO1xuXG4gICAgaWYgKG1hcmtTZWVkUG9zaXRpb24gJiYgbWFya1NlZWRQb3NpdGlvbi55ID09PSBjbGlwSW5mby5jbGlwQm90dG9tKVxuICAgICAgICBjbGlwSW5mby5jbGlwQm90dG9tLS07XG5cbiAgICByZXR1cm4gY2xpcEluZm87XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcm9wU2NyZWVuc2hvdCAoaW1hZ2UsIHsgcGF0aCwgbWFya1NlZWRQb3NpdGlvbiwgY2xpZW50QXJlYURpbWVuc2lvbnMsIGNyb3BEaW1lbnNpb25zIH0pIHtcbiAgICBpZiAoIW1hcmtTZWVkUG9zaXRpb24gJiYgIWNyb3BEaW1lbnNpb25zKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGNsaXAgPSBjYWxjdWxhdGVDbGlwSW5mbyhpbWFnZSwgbWFya1NlZWRQb3NpdGlvbiwgY2xpZW50QXJlYURpbWVuc2lvbnMsIGNyb3BEaW1lbnNpb25zKTtcblxuICAgIGF3YWl0IHZhbGlkYXRlQ2xpcEluZm8oY2xpcCwgcGF0aCk7XG5cbiAgICByZXR1cm4gY29weUltYWdlUGFydChpbWFnZSwgY2xpcCk7XG59XG4iXX0=