| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "core/animation/LengthPropertyFunctions.h" |
| |
| #include "core/style/ComputedStyle.h" |
| |
| namespace blink { |
| |
| ValueRange LengthPropertyFunctions::getValueRange(CSSPropertyID property) { |
| switch (property) { |
| case CSSPropertyBorderBottomWidth: |
| case CSSPropertyBorderLeftWidth: |
| case CSSPropertyBorderRightWidth: |
| case CSSPropertyBorderTopWidth: |
| case CSSPropertyFlexBasis: |
| case CSSPropertyHeight: |
| case CSSPropertyLineHeight: |
| case CSSPropertyMaxHeight: |
| case CSSPropertyMaxWidth: |
| case CSSPropertyMinHeight: |
| case CSSPropertyMinWidth: |
| case CSSPropertyOutlineWidth: |
| case CSSPropertyPaddingBottom: |
| case CSSPropertyPaddingLeft: |
| case CSSPropertyPaddingRight: |
| case CSSPropertyPaddingTop: |
| case CSSPropertyPerspective: |
| case CSSPropertyR: |
| case CSSPropertyRx: |
| case CSSPropertyRy: |
| case CSSPropertyShapeMargin: |
| case CSSPropertyStrokeWidth: |
| case CSSPropertyWebkitBorderHorizontalSpacing: |
| case CSSPropertyWebkitBorderVerticalSpacing: |
| case CSSPropertyColumnGap: |
| case CSSPropertyColumnWidth: |
| case CSSPropertyWidth: |
| return ValueRangeNonNegative; |
| default: |
| return ValueRangeAll; |
| } |
| } |
| |
| bool LengthPropertyFunctions::isZoomedLength(CSSPropertyID property) { |
| return property != CSSPropertyStrokeWidth; |
| } |
| |
| bool LengthPropertyFunctions::getPixelsForKeyword(CSSPropertyID property, |
| CSSValueID valueID, |
| double& result) { |
| switch (property) { |
| case CSSPropertyBaselineShift: |
| if (valueID == CSSValueBaseline) { |
| result = 0; |
| return true; |
| } |
| return false; |
| case CSSPropertyBorderBottomWidth: |
| case CSSPropertyBorderLeftWidth: |
| case CSSPropertyBorderRightWidth: |
| case CSSPropertyBorderTopWidth: |
| case CSSPropertyColumnRuleWidth: |
| case CSSPropertyOutlineWidth: |
| if (valueID == CSSValueThin) { |
| result = 1; |
| return true; |
| } |
| if (valueID == CSSValueMedium) { |
| result = 3; |
| return true; |
| } |
| if (valueID == CSSValueThick) { |
| result = 5; |
| return true; |
| } |
| return false; |
| case CSSPropertyLetterSpacing: |
| case CSSPropertyWordSpacing: |
| if (valueID == CSSValueNormal) { |
| result = 0; |
| return true; |
| } |
| return false; |
| default: |
| return false; |
| } |
| } |
| |
| static Length lengthFromUnsigned(unsigned short value) { |
| return Length(static_cast<float>(value), Fixed); |
| } |
| |
| bool LengthPropertyFunctions::getInitialLength(CSSPropertyID property, |
| Length& result) { |
| switch (property) { |
| // The computed value of "initial" for the following properties is 0px if |
| // the associated *-style property resolves to "none" or "hidden". |
| // - border-width: |
| // https://drafts.csswg.org/css-backgrounds-3/#the-border-width |
| // - outline-width: https://drafts.csswg.org/css-ui-3/#outline-width |
| // - column-rule-width: https://drafts.csswg.org/css-multicol-1/#crw |
| // We ignore this value adjustment for animations and use the wrong value |
| // for hidden widths to avoid having to restart our animations based on the |
| // computed *-style values. This is acceptable since animations running on |
| // hidden widths are unobservable to the user, even via getComputedStyle(). |
| case CSSPropertyBorderBottomWidth: |
| case CSSPropertyBorderLeftWidth: |
| case CSSPropertyBorderRightWidth: |
| case CSSPropertyBorderTopWidth: |
| result = lengthFromUnsigned(ComputedStyle::initialBorderWidth()); |
| return true; |
| case CSSPropertyOutlineWidth: |
| result = lengthFromUnsigned(ComputedStyle::initialOutlineWidth()); |
| return true; |
| case CSSPropertyColumnRuleWidth: |
| result = lengthFromUnsigned(ComputedStyle::initialColumnRuleWidth()); |
| return true; |
| |
| default: |
| return getLength(property, ComputedStyle::initialStyle(), result); |
| } |
| } |
| |
| bool LengthPropertyFunctions::getLength(CSSPropertyID property, |
| const ComputedStyle& style, |
| Length& result) { |
| switch (property) { |
| case CSSPropertyBottom: |
| result = style.bottom(); |
| return true; |
| case CSSPropertyCx: |
| result = style.svgStyle().cx(); |
| return true; |
| case CSSPropertyCy: |
| result = style.svgStyle().cy(); |
| return true; |
| case CSSPropertyFlexBasis: |
| result = style.flexBasis(); |
| return true; |
| case CSSPropertyHeight: |
| result = style.height(); |
| return true; |
| case CSSPropertyLeft: |
| result = style.left(); |
| return true; |
| case CSSPropertyMarginBottom: |
| result = style.marginBottom(); |
| return true; |
| case CSSPropertyMarginLeft: |
| result = style.marginLeft(); |
| return true; |
| case CSSPropertyMarginRight: |
| result = style.marginRight(); |
| return true; |
| case CSSPropertyMarginTop: |
| result = style.marginTop(); |
| return true; |
| case CSSPropertyMaxHeight: |
| result = style.maxHeight(); |
| return true; |
| case CSSPropertyMaxWidth: |
| result = style.maxWidth(); |
| return true; |
| case CSSPropertyMinHeight: |
| result = style.minHeight(); |
| return true; |
| case CSSPropertyMinWidth: |
| result = style.minWidth(); |
| return true; |
| case CSSPropertyOffsetDistance: |
| result = style.offsetDistance(); |
| return true; |
| case CSSPropertyPaddingBottom: |
| result = style.paddingBottom(); |
| return true; |
| case CSSPropertyPaddingLeft: |
| result = style.paddingLeft(); |
| return true; |
| case CSSPropertyPaddingRight: |
| result = style.paddingRight(); |
| return true; |
| case CSSPropertyPaddingTop: |
| result = style.paddingTop(); |
| return true; |
| case CSSPropertyR: |
| result = style.svgStyle().r(); |
| return true; |
| case CSSPropertyRight: |
| result = style.right(); |
| return true; |
| case CSSPropertyRx: |
| result = style.svgStyle().rx(); |
| return true; |
| case CSSPropertyRy: |
| result = style.svgStyle().ry(); |
| return true; |
| case CSSPropertyShapeMargin: |
| result = style.shapeMargin(); |
| return true; |
| case CSSPropertyStrokeDashoffset: |
| result = style.strokeDashOffset(); |
| return true; |
| case CSSPropertyTextIndent: |
| result = style.textIndent(); |
| return true; |
| case CSSPropertyTop: |
| result = style.top(); |
| return true; |
| case CSSPropertyWebkitPerspectiveOriginX: |
| result = style.perspectiveOriginX(); |
| return true; |
| case CSSPropertyWebkitPerspectiveOriginY: |
| result = style.perspectiveOriginY(); |
| return true; |
| case CSSPropertyWebkitTransformOriginX: |
| result = style.transformOriginX(); |
| return true; |
| case CSSPropertyWebkitTransformOriginY: |
| result = style.transformOriginY(); |
| return true; |
| case CSSPropertyWidth: |
| result = style.width(); |
| return true; |
| case CSSPropertyX: |
| result = style.svgStyle().x(); |
| return true; |
| case CSSPropertyY: |
| result = style.svgStyle().y(); |
| return true; |
| |
| case CSSPropertyBorderBottomWidth: |
| result = Length(style.borderBottomWidth(), Fixed); |
| return true; |
| case CSSPropertyBorderLeftWidth: |
| result = Length(style.borderLeftWidth(), Fixed); |
| return true; |
| case CSSPropertyBorderRightWidth: |
| result = Length(style.borderRightWidth(), Fixed); |
| return true; |
| case CSSPropertyBorderTopWidth: |
| result = Length(style.borderTopWidth(), Fixed); |
| return true; |
| case CSSPropertyLetterSpacing: |
| result = Length(style.letterSpacing(), Fixed); |
| return true; |
| case CSSPropertyOutlineOffset: |
| result = Length(style.outlineOffset(), Fixed); |
| return true; |
| case CSSPropertyOutlineWidth: |
| result = Length(style.outlineWidth(), Fixed); |
| return true; |
| case CSSPropertyWebkitBorderHorizontalSpacing: |
| result = Length(style.horizontalBorderSpacing(), Fixed); |
| return true; |
| case CSSPropertyWebkitBorderVerticalSpacing: |
| result = Length(style.verticalBorderSpacing(), Fixed); |
| return true; |
| case CSSPropertyColumnGap: |
| result = Length(style.columnGap(), Fixed); |
| return true; |
| case CSSPropertyColumnRuleWidth: |
| result = Length(style.columnRuleWidth(), Fixed); |
| return true; |
| case CSSPropertyWebkitTransformOriginZ: |
| result = Length(style.transformOriginZ(), Fixed); |
| return true; |
| case CSSPropertyWordSpacing: |
| result = Length(style.wordSpacing(), Fixed); |
| return true; |
| |
| case CSSPropertyBaselineShift: |
| if (style.baselineShift() != BS_LENGTH) |
| return false; |
| result = style.baselineShiftValue(); |
| return true; |
| case CSSPropertyLineHeight: |
| // Percent Lengths are used to represent numbers on line-height. |
| if (style.specifiedLineHeight().isPercentOrCalc()) |
| return false; |
| result = style.specifiedLineHeight(); |
| return true; |
| case CSSPropertyPerspective: |
| if (!style.hasPerspective()) |
| return false; |
| result = Length(style.perspective(), Fixed); |
| return true; |
| case CSSPropertyStrokeWidth: |
| DCHECK(!isZoomedLength(CSSPropertyStrokeWidth)); |
| result = style.strokeWidth().length(); |
| return true; |
| case CSSPropertyVerticalAlign: |
| if (style.verticalAlign() != EVerticalAlign::Length) |
| return false; |
| result = style.getVerticalAlignLength(); |
| return true; |
| case CSSPropertyColumnWidth: |
| if (style.hasAutoColumnWidth()) |
| return false; |
| result = Length(style.columnWidth(), Fixed); |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool LengthPropertyFunctions::setLength(CSSPropertyID property, |
| ComputedStyle& style, |
| const Length& value) { |
| switch (property) { |
| // Setters that take a Length value. |
| case CSSPropertyBaselineShift: |
| style.setBaselineShiftValue(value); |
| return true; |
| case CSSPropertyBottom: |
| style.setBottom(value); |
| return true; |
| case CSSPropertyCx: |
| style.setCx(value); |
| return true; |
| case CSSPropertyCy: |
| style.setCy(value); |
| return true; |
| case CSSPropertyFlexBasis: |
| style.setFlexBasis(value); |
| return true; |
| case CSSPropertyHeight: |
| style.setHeight(value); |
| return true; |
| case CSSPropertyLeft: |
| style.setLeft(value); |
| return true; |
| case CSSPropertyMarginBottom: |
| style.setMarginBottom(value); |
| return true; |
| case CSSPropertyMarginLeft: |
| style.setMarginLeft(value); |
| return true; |
| case CSSPropertyMarginRight: |
| style.setMarginRight(value); |
| return true; |
| case CSSPropertyMarginTop: |
| style.setMarginTop(value); |
| return true; |
| case CSSPropertyMaxHeight: |
| style.setMaxHeight(value); |
| return true; |
| case CSSPropertyMaxWidth: |
| style.setMaxWidth(value); |
| return true; |
| case CSSPropertyMinHeight: |
| style.setMinHeight(value); |
| return true; |
| case CSSPropertyMinWidth: |
| style.setMinWidth(value); |
| return true; |
| case CSSPropertyOffsetDistance: |
| style.setOffsetDistance(value); |
| return true; |
| case CSSPropertyPaddingBottom: |
| style.setPaddingBottom(value); |
| return true; |
| case CSSPropertyPaddingLeft: |
| style.setPaddingLeft(value); |
| return true; |
| case CSSPropertyPaddingRight: |
| style.setPaddingRight(value); |
| return true; |
| case CSSPropertyPaddingTop: |
| style.setPaddingTop(value); |
| return true; |
| case CSSPropertyR: |
| style.setR(value); |
| return true; |
| case CSSPropertyRx: |
| style.setRx(value); |
| return true; |
| case CSSPropertyRy: |
| style.setRy(value); |
| return true; |
| case CSSPropertyRight: |
| style.setRight(value); |
| return true; |
| case CSSPropertyShapeMargin: |
| style.setShapeMargin(value); |
| return true; |
| case CSSPropertyStrokeDashoffset: |
| style.setStrokeDashOffset(value); |
| return true; |
| case CSSPropertyTop: |
| style.setTop(value); |
| return true; |
| case CSSPropertyWidth: |
| style.setWidth(value); |
| return true; |
| case CSSPropertyWebkitPerspectiveOriginX: |
| style.setPerspectiveOriginX(value); |
| return true; |
| case CSSPropertyWebkitPerspectiveOriginY: |
| style.setPerspectiveOriginY(value); |
| return true; |
| case CSSPropertyWebkitTransformOriginX: |
| style.setTransformOriginX(value); |
| return true; |
| case CSSPropertyWebkitTransformOriginY: |
| style.setTransformOriginY(value); |
| return true; |
| case CSSPropertyX: |
| style.setX(value); |
| return true; |
| case CSSPropertyY: |
| style.setY(value); |
| return true; |
| |
| case CSSPropertyLineHeight: |
| // Percent Lengths are used to represent numbers on line-height. |
| if (value.isPercentOrCalc()) |
| return false; |
| style.setLineHeight(value); |
| return true; |
| |
| // TODO(alancutter): Support setters that take a numeric value (need to |
| // resolve percentages). |
| case CSSPropertyBorderBottomWidth: |
| case CSSPropertyBorderLeftWidth: |
| case CSSPropertyBorderRightWidth: |
| case CSSPropertyBorderTopWidth: |
| case CSSPropertyLetterSpacing: |
| case CSSPropertyOutlineOffset: |
| case CSSPropertyOutlineWidth: |
| case CSSPropertyPerspective: |
| case CSSPropertyStrokeWidth: |
| case CSSPropertyVerticalAlign: |
| case CSSPropertyWebkitBorderHorizontalSpacing: |
| case CSSPropertyWebkitBorderVerticalSpacing: |
| case CSSPropertyColumnGap: |
| case CSSPropertyColumnRuleWidth: |
| case CSSPropertyColumnWidth: |
| case CSSPropertyWebkitTransformOriginZ: |
| case CSSPropertyWordSpacing: |
| return false; |
| |
| default: |
| return false; |
| } |
| } |
| |
| } // namespace blink |