diff --git a/CHANGELOG.md b/CHANGELOG.md index 718dfe5..d9cb15e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ### Changelog ### #### v1.0.0-alpha3 - TBD #### + * Fix background-size when using background-origin and background-size: cover/contain (#1299) + * Added support for background-origin: content-box (#1299) #### v1.0.0-alpha2 - 7.12.2017 #### * Fix scroll positions for CanvasRenderer (#1259) diff --git a/src/Renderer.js b/src/Renderer.js index dd65acd..ccc48f0 100644 --- a/src/Renderer.js +++ b/src/Renderer.js @@ -20,20 +20,13 @@ import type NodeContainer from './NodeContainer'; import type StackingContext from './StackingContext'; import type {TextBounds} from './TextBounds'; -import { - Bounds, - parsePathForBorder, - calculateContentBox, - calculatePaddingBox, - calculatePaddingBoxPath -} from './Bounds'; -import {PADDING_SIDES} from './parsing/padding'; +import {Bounds, parsePathForBorder, calculateContentBox, calculatePaddingBoxPath} from './Bounds'; import {FontMetrics} from './Font'; import {parseGradient} from './Gradient'; import TextContainer from './TextContainer'; import { - BACKGROUND_ORIGIN, + calculateBackgroungPositioningArea, calculateBackgroungPaintingArea, calculateBackgroundPosition, calculateBackgroundRepeatPath, @@ -222,32 +215,12 @@ export default class Renderer { renderBackgroundRepeat(container: NodeContainer, background: BackgroundImage) { const image = this.options.imageStore.get(background.source.args[0]); if (image) { - const bounds = container.bounds; - const paddingBox = calculatePaddingBox(bounds, container.style.border); - - let backgroundPositioningArea; - switch (container.style.background.backgroundOrigin) { - case BACKGROUND_ORIGIN.BORDER_BOX: - backgroundPositioningArea = bounds; - break; - case BACKGROUND_ORIGIN.CONTENT_BOX: - const paddingLeft = container.style.padding[PADDING_SIDES.LEFT].value; - const paddingRight = container.style.padding[PADDING_SIDES.RIGHT].value; - const paddingTop = container.style.padding[PADDING_SIDES.TOP].value; - const paddingBottom = container.style.padding[PADDING_SIDES.BOTTOM].value; - backgroundPositioningArea = new Bounds( - paddingBox.left + paddingLeft, - paddingBox.top + paddingTop, - paddingBox.width - paddingLeft - paddingRight, - paddingBox.height - paddingTop - paddingBottom - ); - break; - case BACKGROUND_ORIGIN.PADDING_BOX: - default: - backgroundPositioningArea = paddingBox; - break; - } - + const backgroundPositioningArea = calculateBackgroungPositioningArea( + container.style.background.backgroundOrigin, + container.bounds, + container.style.padding, + container.style.border + ); const backgroundImageSize = calculateBackgroundSize( background, image, @@ -263,7 +236,7 @@ export default class Renderer { position, backgroundImageSize, backgroundPositioningArea, - bounds + container.bounds ); const offsetX = Math.round(backgroundPositioningArea.left + position.x); diff --git a/src/parsing/background.js b/src/parsing/background.js index 5c2ac05..bc12be2 100644 --- a/src/parsing/background.js +++ b/src/parsing/background.js @@ -1,14 +1,22 @@ /* @flow */ 'use strict'; import type {Path} from '../drawing/Path'; -import type {Bounds, BoundCurves} from '../Bounds'; +import type {BoundCurves} from '../Bounds'; import type ResourceLoader, {ImageElement} from '../ResourceLoader'; +import type {Border} from './border'; +import type {Padding} from './padding'; import Color from '../Color'; import Length from '../Length'; import Size from '../drawing/Size'; import Vector from '../drawing/Vector'; -import {calculateBorderBoxPath, calculatePaddingBoxPath} from '../Bounds'; +import { + calculateBorderBoxPath, + calculatePaddingBoxPath, + calculatePaddingBox, + Bounds +} from '../Bounds'; +import {PADDING_SIDES} from './padding'; export type Background = { backgroundImage: Array, @@ -121,7 +129,6 @@ export const calculateBackgroungPaintingArea = ( curves: BoundCurves, clip: BackgroundClip ): Path => { - // TODO support CONTENT_BOX switch (clip) { case BACKGROUND_CLIP.BORDER_BOX: return calculateBorderBoxPath(curves); @@ -131,6 +138,34 @@ export const calculateBackgroungPaintingArea = ( } }; +export const calculateBackgroungPositioningArea = ( + backgroundOrigin: BackgroundOrigin, + bounds: Bounds, + padding: Padding, + border: Array +): Bounds => { + const paddingBox = calculatePaddingBox(bounds, border); + + switch (backgroundOrigin) { + case BACKGROUND_ORIGIN.BORDER_BOX: + return bounds; + case BACKGROUND_ORIGIN.CONTENT_BOX: + const paddingLeft = padding[PADDING_SIDES.LEFT].getAbsoluteValue(bounds.width); + const paddingRight = padding[PADDING_SIDES.RIGHT].getAbsoluteValue(bounds.width); + const paddingTop = padding[PADDING_SIDES.TOP].getAbsoluteValue(bounds.width); + const paddingBottom = padding[PADDING_SIDES.BOTTOM].getAbsoluteValue(bounds.width); + return new Bounds( + paddingBox.left + paddingLeft, + paddingBox.top + paddingTop, + paddingBox.width - paddingLeft - paddingRight, + paddingBox.height - paddingTop - paddingBottom + ); + case BACKGROUND_ORIGIN.PADDING_BOX: + default: + return paddingBox; + } +}; + export const calculateBackgroundPosition = ( position: [Length, Length], size: Size, diff --git a/tests/reftests/background/origin.html b/tests/reftests/background/origin.html index d7dcb34..4839358 100644 --- a/tests/reftests/background/origin.html +++ b/tests/reftests/background/origin.html @@ -1,6 +1,7 @@ + @@ -30,4 +31,4 @@
- \ No newline at end of file +