"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=