| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.calculateBackgroundRepeatPath = exports.getBackgroundValueForIndex = exports.calculateBackgroundSize = exports.isAuto = exports.calculateBackgroundRendering = exports.calculateBackgroundPaintingArea = exports.calculateBackgroundPositioningArea = void 0; |
| var background_size_1 = require("../css/property-descriptors/background-size"); |
| var vector_1 = require("./vector"); |
| var length_percentage_1 = require("../css/types/length-percentage"); |
| var parser_1 = require("../css/syntax/parser"); |
| var box_sizing_1 = require("./box-sizing"); |
| var calculateBackgroundPositioningArea = function (backgroundOrigin, element) { |
| if (backgroundOrigin === 0 ) { |
| return element.bounds; |
| } |
| if (backgroundOrigin === 2 ) { |
| return box_sizing_1.contentBox(element); |
| } |
| return box_sizing_1.paddingBox(element); |
| }; |
| exports.calculateBackgroundPositioningArea = calculateBackgroundPositioningArea; |
| var calculateBackgroundPaintingArea = function (backgroundClip, element) { |
| if (backgroundClip === 0 ) { |
| return element.bounds; |
| } |
| if (backgroundClip === 2 ) { |
| return box_sizing_1.contentBox(element); |
| } |
| return box_sizing_1.paddingBox(element); |
| }; |
| exports.calculateBackgroundPaintingArea = calculateBackgroundPaintingArea; |
| var calculateBackgroundRendering = function (container, index, intrinsicSize) { |
| var backgroundPositioningArea = exports.calculateBackgroundPositioningArea(exports.getBackgroundValueForIndex(container.styles.backgroundOrigin, index), container); |
| var backgroundPaintingArea = exports.calculateBackgroundPaintingArea(exports.getBackgroundValueForIndex(container.styles.backgroundClip, index), container); |
| var backgroundImageSize = exports.calculateBackgroundSize(exports.getBackgroundValueForIndex(container.styles.backgroundSize, index), intrinsicSize, backgroundPositioningArea); |
| var sizeWidth = backgroundImageSize[0], sizeHeight = backgroundImageSize[1]; |
| var position = length_percentage_1.getAbsoluteValueForTuple(exports.getBackgroundValueForIndex(container.styles.backgroundPosition, index), backgroundPositioningArea.width - sizeWidth, backgroundPositioningArea.height - sizeHeight); |
| var path = exports.calculateBackgroundRepeatPath(exports.getBackgroundValueForIndex(container.styles.backgroundRepeat, index), position, backgroundImageSize, backgroundPositioningArea, backgroundPaintingArea); |
| var offsetX = Math.round(backgroundPositioningArea.left + position[0]); |
| var offsetY = Math.round(backgroundPositioningArea.top + position[1]); |
| return [path, offsetX, offsetY, sizeWidth, sizeHeight]; |
| }; |
| exports.calculateBackgroundRendering = calculateBackgroundRendering; |
| var isAuto = function (token) { return parser_1.isIdentToken(token) && token.value === background_size_1.BACKGROUND_SIZE.AUTO; }; |
| exports.isAuto = isAuto; |
| var hasIntrinsicValue = function (value) { return typeof value === 'number'; }; |
| var calculateBackgroundSize = function (size, _a, bounds) { |
| var intrinsicWidth = _a[0], intrinsicHeight = _a[1], intrinsicProportion = _a[2]; |
| var first = size[0], second = size[1]; |
| if (!first) { |
| return [0, 0]; |
| } |
| if (length_percentage_1.isLengthPercentage(first) && second && length_percentage_1.isLengthPercentage(second)) { |
| return [length_percentage_1.getAbsoluteValue(first, bounds.width), length_percentage_1.getAbsoluteValue(second, bounds.height)]; |
| } |
| var hasIntrinsicProportion = hasIntrinsicValue(intrinsicProportion); |
| if (parser_1.isIdentToken(first) && (first.value === background_size_1.BACKGROUND_SIZE.CONTAIN || first.value === background_size_1.BACKGROUND_SIZE.COVER)) { |
| if (hasIntrinsicValue(intrinsicProportion)) { |
| var targetRatio = bounds.width / bounds.height; |
| return targetRatio < intrinsicProportion !== (first.value === background_size_1.BACKGROUND_SIZE.COVER) |
| ? [bounds.width, bounds.width / intrinsicProportion] |
| : [bounds.height * intrinsicProportion, bounds.height]; |
| } |
| return [bounds.width, bounds.height]; |
| } |
| var hasIntrinsicWidth = hasIntrinsicValue(intrinsicWidth); |
| var hasIntrinsicHeight = hasIntrinsicValue(intrinsicHeight); |
| var hasIntrinsicDimensions = hasIntrinsicWidth || hasIntrinsicHeight; |
| |
| if (exports.isAuto(first) && (!second || exports.isAuto(second))) { |
| |
| if (hasIntrinsicWidth && hasIntrinsicHeight) { |
| return [intrinsicWidth, intrinsicHeight]; |
| } |
| |
| |
| if (!hasIntrinsicProportion && !hasIntrinsicDimensions) { |
| return [bounds.width, bounds.height]; |
| } |
| |
| |
| |
| if (hasIntrinsicDimensions && hasIntrinsicProportion) { |
| var width_1 = hasIntrinsicWidth |
| ? intrinsicWidth |
| : intrinsicHeight * intrinsicProportion; |
| var height_1 = hasIntrinsicHeight |
| ? intrinsicHeight |
| : intrinsicWidth / intrinsicProportion; |
| return [width_1, height_1]; |
| } |
| |
| |
| var width_2 = hasIntrinsicWidth ? intrinsicWidth : bounds.width; |
| var height_2 = hasIntrinsicHeight ? intrinsicHeight : bounds.height; |
| return [width_2, height_2]; |
| } |
| |
| |
| if (hasIntrinsicProportion) { |
| var width_3 = 0; |
| var height_3 = 0; |
| if (length_percentage_1.isLengthPercentage(first)) { |
| width_3 = length_percentage_1.getAbsoluteValue(first, bounds.width); |
| } |
| else if (length_percentage_1.isLengthPercentage(second)) { |
| height_3 = length_percentage_1.getAbsoluteValue(second, bounds.height); |
| } |
| if (exports.isAuto(first)) { |
| width_3 = height_3 * intrinsicProportion; |
| } |
| else if (!second || exports.isAuto(second)) { |
| height_3 = width_3 / intrinsicProportion; |
| } |
| return [width_3, height_3]; |
| } |
| |
| |
| |
| |
| var width = null; |
| var height = null; |
| if (length_percentage_1.isLengthPercentage(first)) { |
| width = length_percentage_1.getAbsoluteValue(first, bounds.width); |
| } |
| else if (second && length_percentage_1.isLengthPercentage(second)) { |
| height = length_percentage_1.getAbsoluteValue(second, bounds.height); |
| } |
| if (width !== null && (!second || exports.isAuto(second))) { |
| height = |
| hasIntrinsicWidth && hasIntrinsicHeight |
| ? (width / intrinsicWidth) * intrinsicHeight |
| : bounds.height; |
| } |
| if (height !== null && exports.isAuto(first)) { |
| width = |
| hasIntrinsicWidth && hasIntrinsicHeight |
| ? (height / intrinsicHeight) * intrinsicWidth |
| : bounds.width; |
| } |
| if (width !== null && height !== null) { |
| return [width, height]; |
| } |
| throw new Error("Unable to calculate background-size for element"); |
| }; |
| exports.calculateBackgroundSize = calculateBackgroundSize; |
| var getBackgroundValueForIndex = function (values, index) { |
| var value = values[index]; |
| if (typeof value === 'undefined') { |
| return values[0]; |
| } |
| return value; |
| }; |
| exports.getBackgroundValueForIndex = getBackgroundValueForIndex; |
| var calculateBackgroundRepeatPath = function (repeat, _a, _b, backgroundPositioningArea, backgroundPaintingArea) { |
| var x = _a[0], y = _a[1]; |
| var width = _b[0], height = _b[1]; |
| switch (repeat) { |
| case 2 : |
| return [ |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left), Math.round(backgroundPositioningArea.top + y)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(backgroundPositioningArea.top + y)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(height + backgroundPositioningArea.top + y)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left), Math.round(height + backgroundPositioningArea.top + y)) |
| ]; |
| case 3 : |
| return [ |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)) |
| ]; |
| case 1 : |
| return [ |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y + height)), |
| new vector_1.Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y + height)) |
| ]; |
| default: |
| return [ |
| new vector_1.Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.top)), |
| new vector_1.Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.top)), |
| new vector_1.Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)), |
| new vector_1.Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)) |
| ]; |
| } |
| }; |
| exports.calculateBackgroundRepeatPath = calculateBackgroundRepeatPath; |
| |