blob: b661281114b1be3c7d39a61e94f8c33ed9f425ae [file] [log] [blame]
// 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/NumberPropertyFunctions.h"
#include "core/style/ComputedStyle.h"
namespace blink {
bool NumberPropertyFunctions::getInitialNumber(CSSPropertyID property, double& result)
{
return getNumber(property, *ComputedStyle::initialStyle(), result);
}
bool NumberPropertyFunctions::getNumber(CSSPropertyID property, const ComputedStyle& style, double& result)
{
switch (property) {
case CSSPropertyFillOpacity:
result = style.fillOpacity();
return true;
case CSSPropertyFlexGrow:
result = style.flexGrow();
return true;
case CSSPropertyFlexShrink:
result = style.flexShrink();
return true;
case CSSPropertyFloodOpacity:
result = style.floodOpacity();
return true;
case CSSPropertyOpacity:
result = style.opacity();
return true;
case CSSPropertyOrphans:
result = style.orphans();
return true;
case CSSPropertyShapeImageThreshold:
result = style.shapeImageThreshold();
return true;
case CSSPropertyStopOpacity:
result = style.stopOpacity();
return true;
case CSSPropertyStrokeMiterlimit:
result = style.strokeMiterLimit();
return true;
case CSSPropertyStrokeOpacity:
result = style.strokeOpacity();
return true;
case CSSPropertyWidows:
result = style.widows();
return true;
case CSSPropertyFontSizeAdjust:
if (!style.hasFontSizeAdjust())
return false;
result = style.fontSizeAdjust();
return true;
case CSSPropertyColumnCount:
if (style.hasAutoColumnCount())
return false;
result = style.columnCount();
return true;
case CSSPropertyZIndex:
if (style.hasAutoZIndex())
return false;
result = style.zIndex();
return true;
case CSSPropertyLineHeight: {
const Length& length = style.specifiedLineHeight();
// Numbers are represented by percentages.
if (length.type() != Percent)
return false;
double value = length.value();
// -100% represents the keyword "normal".
if (value == -100)
return false;
result = value / 100;
return true;
}
default:
return false;
}
}
double NumberPropertyFunctions::clampNumber(CSSPropertyID property, double value)
{
switch (property) {
case CSSPropertyStrokeMiterlimit:
return clampTo<float>(value, 1);
case CSSPropertyFloodOpacity:
case CSSPropertyStopOpacity:
case CSSPropertyStrokeOpacity:
case CSSPropertyShapeImageThreshold:
return clampTo<float>(value, 0, 1);
case CSSPropertyFillOpacity:
case CSSPropertyOpacity:
return clampTo<float>(value, 0, nextafterf(1, 0));
case CSSPropertyFlexGrow:
case CSSPropertyFlexShrink:
case CSSPropertyFontSizeAdjust:
case CSSPropertyLineHeight:
return clampTo<float>(value, 0);
case CSSPropertyOrphans:
case CSSPropertyWidows:
return clampTo<short>(round(value), 1);
case CSSPropertyColumnCount:
return clampTo<unsigned short>(round(value), 1);
case CSSPropertyColumnRuleWidth:
return clampTo<unsigned short>(round(value));
case CSSPropertyZIndex:
return clampTo<int>(round(value));
default:
ASSERT_NOT_REACHED();
return value;
}
}
bool NumberPropertyFunctions::setNumber(CSSPropertyID property, ComputedStyle& style, double value)
{
ASSERT(value == clampNumber(property, value));
switch (property) {
case CSSPropertyFillOpacity:
style.setFillOpacity(value);
return true;
case CSSPropertyFlexGrow:
style.setFlexGrow(value);
return true;
case CSSPropertyFlexShrink:
style.setFlexShrink(value);
return true;
case CSSPropertyFloodOpacity:
style.setFloodOpacity(value);
return true;
case CSSPropertyLineHeight:
style.setLineHeight(Length(value * 100, Percent));
return true;
case CSSPropertyOpacity:
style.setOpacity(value);
return true;
case CSSPropertyOrphans:
style.setOrphans(value);
return true;
case CSSPropertyShapeImageThreshold:
style.setShapeImageThreshold(value);
return true;
case CSSPropertyStopOpacity:
style.setStopOpacity(value);
return true;
case CSSPropertyStrokeMiterlimit:
style.setStrokeMiterLimit(value);
return true;
case CSSPropertyStrokeOpacity:
style.setStrokeOpacity(value);
return true;
case CSSPropertyColumnCount:
style.setColumnCount(value);
return true;
case CSSPropertyWidows:
style.setWidows(value);
return true;
case CSSPropertyZIndex:
style.setZIndex(value);
return true;
default:
return false;
}
}
} // namespace blink