187 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			187 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | "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 /* BORDER_BOX */) { | ||
|  |         return element.bounds; | ||
|  |     } | ||
|  |     if (backgroundOrigin === 2 /* CONTENT_BOX */) { | ||
|  |         return box_sizing_1.contentBox(element); | ||
|  |     } | ||
|  |     return box_sizing_1.paddingBox(element); | ||
|  | }; | ||
|  | exports.calculateBackgroundPositioningArea = calculateBackgroundPositioningArea; | ||
|  | var calculateBackgroundPaintingArea = function (backgroundClip, element) { | ||
|  |     if (backgroundClip === 0 /* BORDER_BOX */) { | ||
|  |         return element.bounds; | ||
|  |     } | ||
|  |     if (backgroundClip === 2 /* CONTENT_BOX */) { | ||
|  |         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 the background-size is auto or auto auto:
 | ||
|  |     if (exports.isAuto(first) && (!second || exports.isAuto(second))) { | ||
|  |         // If the image has both horizontal and vertical intrinsic dimensions, it's rendered at that size.
 | ||
|  |         if (hasIntrinsicWidth && hasIntrinsicHeight) { | ||
|  |             return [intrinsicWidth, intrinsicHeight]; | ||
|  |         } | ||
|  |         // If the image has no intrinsic dimensions and has no intrinsic proportions,
 | ||
|  |         // it's rendered at the size of the background positioning area.
 | ||
|  |         if (!hasIntrinsicProportion && !hasIntrinsicDimensions) { | ||
|  |             return [bounds.width, bounds.height]; | ||
|  |         } | ||
|  |         // TODO If the image has no intrinsic dimensions but has intrinsic proportions, it's rendered as if contain had been specified instead.
 | ||
|  |         // If the image has only one intrinsic dimension and has intrinsic proportions, it's rendered at the size corresponding to that one dimension.
 | ||
|  |         // The other dimension is computed using the specified dimension and the intrinsic proportions.
 | ||
|  |         if (hasIntrinsicDimensions && hasIntrinsicProportion) { | ||
|  |             var width_1 = hasIntrinsicWidth | ||
|  |                 ? intrinsicWidth | ||
|  |                 : intrinsicHeight * intrinsicProportion; | ||
|  |             var height_1 = hasIntrinsicHeight | ||
|  |                 ? intrinsicHeight | ||
|  |                 : intrinsicWidth / intrinsicProportion; | ||
|  |             return [width_1, height_1]; | ||
|  |         } | ||
|  |         // If the image has only one intrinsic dimension but has no intrinsic proportions,
 | ||
|  |         // it's rendered using the specified dimension and the other dimension of the background positioning area.
 | ||
|  |         var width_2 = hasIntrinsicWidth ? intrinsicWidth : bounds.width; | ||
|  |         var height_2 = hasIntrinsicHeight ? intrinsicHeight : bounds.height; | ||
|  |         return [width_2, height_2]; | ||
|  |     } | ||
|  |     // If the image has intrinsic proportions, it's stretched to the specified dimension.
 | ||
|  |     // The unspecified dimension is computed using the specified dimension and the intrinsic proportions.
 | ||
|  |     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]; | ||
|  |     } | ||
|  |     // If the image has no intrinsic proportions, it's stretched to the specified dimension.
 | ||
|  |     // The unspecified dimension is computed using the image's corresponding intrinsic dimension,
 | ||
|  |     // if there is one. If there is no such intrinsic dimension,
 | ||
|  |     // it becomes the corresponding dimension of the background positioning area.
 | ||
|  |     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 /* REPEAT_X */: | ||
|  |             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 /* REPEAT_Y */: | ||
|  |             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 /* NO_REPEAT */: | ||
|  |             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; | ||
|  | //# sourceMappingURL=background.js.map
 |