OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 bool isZero() const override { return !m_value->getDoubleValue(); } | 178 bool isZero() const override { return !m_value->getDoubleValue(); } |
179 | 179 |
180 String customCSSText() const override { return m_value->cssText(); } | 180 String customCSSText() const override { return m_value->cssText(); } |
181 | 181 |
182 void accumulatePixelsAndPercent( | 182 void accumulatePixelsAndPercent( |
183 const CSSToLengthConversionData& conversionData, | 183 const CSSToLengthConversionData& conversionData, |
184 PixelsAndPercent& value, | 184 PixelsAndPercent& value, |
185 float multiplier) const override { | 185 float multiplier) const override { |
186 switch (m_category) { | 186 switch (m_category) { |
187 case CalcLength: | 187 case CalcLength: |
188 value.pixels += | 188 value.pixels = clampTo<float>( |
189 m_value->computeLength<float>(conversionData) * multiplier; | 189 value.pixels + |
| 190 m_value->computeLength<double>(conversionData) * multiplier); |
190 break; | 191 break; |
191 case CalcPercent: | 192 case CalcPercent: |
192 ASSERT(m_value->isPercentage()); | 193 ASSERT(m_value->isPercentage()); |
193 value.percent += m_value->getDoubleValue() * multiplier; | 194 value.percent = clampTo<float>(value.percent + |
| 195 m_value->getDoubleValue() * multiplier); |
194 break; | 196 break; |
195 case CalcNumber: | 197 case CalcNumber: |
196 // TODO(alancutter): Stop treating numbers like pixels unconditionally | 198 // TODO(alancutter): Stop treating numbers like pixels unconditionally |
197 // in calcs to be able to accomodate border-image-width | 199 // in calcs to be able to accomodate border-image-width |
198 // https://drafts.csswg.org/css-backgrounds-3/#the-border-image-width | 200 // https://drafts.csswg.org/css-backgrounds-3/#the-border-image-width |
199 value.pixels += | 201 value.pixels = clampTo<float>(value.pixels + |
200 m_value->getDoubleValue() * conversionData.zoom() * multiplier; | 202 m_value->getDoubleValue() * |
| 203 conversionData.zoom() * multiplier); |
201 break; | 204 break; |
202 default: | 205 default: |
203 ASSERT_NOT_REACHED(); | 206 ASSERT_NOT_REACHED(); |
204 } | 207 } |
205 } | 208 } |
206 | 209 |
207 double doubleValue() const override { | 210 double doubleValue() const override { |
208 if (hasDoubleValue(typeWithCalcResolved())) | 211 if (hasDoubleValue(typeWithCalcResolved())) |
209 return m_value->getDoubleValue(); | 212 return m_value->getDoubleValue(); |
210 ASSERT_NOT_REACHED(); | 213 ASSERT_NOT_REACHED(); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 leftType, isInteger); | 392 leftType, isInteger); |
390 CSSPrimitiveValue::UnitCategory leftUnitCategory = | 393 CSSPrimitiveValue::UnitCategory leftUnitCategory = |
391 CSSPrimitiveValue::unitTypeToUnitCategory(leftType); | 394 CSSPrimitiveValue::unitTypeToUnitCategory(leftType); |
392 if (leftUnitCategory != CSSPrimitiveValue::UOther && | 395 if (leftUnitCategory != CSSPrimitiveValue::UOther && |
393 leftUnitCategory == | 396 leftUnitCategory == |
394 CSSPrimitiveValue::unitTypeToUnitCategory(rightType)) { | 397 CSSPrimitiveValue::unitTypeToUnitCategory(rightType)) { |
395 CSSPrimitiveValue::UnitType canonicalType = | 398 CSSPrimitiveValue::UnitType canonicalType = |
396 CSSPrimitiveValue::canonicalUnitTypeForCategory( | 399 CSSPrimitiveValue::canonicalUnitTypeForCategory( |
397 leftUnitCategory); | 400 leftUnitCategory); |
398 if (canonicalType != CSSPrimitiveValue::UnitType::Unknown) { | 401 if (canonicalType != CSSPrimitiveValue::UnitType::Unknown) { |
399 double leftValue = | 402 double leftValue = clampTo<double>( |
400 leftSide->doubleValue() * | 403 leftSide->doubleValue() * |
401 CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor( | 404 CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor( |
402 leftType); | 405 leftType)); |
403 double rightValue = | 406 double rightValue = clampTo<double>( |
404 rightSide->doubleValue() * | 407 rightSide->doubleValue() * |
405 CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor( | 408 CSSPrimitiveValue::conversionToCanonicalUnitsScaleFactor( |
406 rightType); | 409 rightType)); |
407 return CSSCalcPrimitiveValue::create( | 410 return CSSCalcPrimitiveValue::create( |
408 evaluateOperator(leftValue, rightValue, op), canonicalType, | 411 evaluateOperator(leftValue, rightValue, op), canonicalType, |
409 isInteger); | 412 isInteger); |
410 } | 413 } |
411 } | 414 } |
412 } | 415 } |
413 } | 416 } |
414 } else { | 417 } else { |
415 // Simplify multiplying or dividing by a number for simplifiable types. | 418 // Simplify multiplying or dividing by a number for simplifiable types. |
416 ASSERT(op == CalcMultiply || op == CalcDivide); | 419 ASSERT(op == CalcMultiply || op == CalcDivide); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 | 619 |
617 double evaluate(double leftSide, double rightSide) const { | 620 double evaluate(double leftSide, double rightSide) const { |
618 return evaluateOperator(leftSide, rightSide, m_operator); | 621 return evaluateOperator(leftSide, rightSide, m_operator); |
619 } | 622 } |
620 | 623 |
621 static double evaluateOperator(double leftValue, | 624 static double evaluateOperator(double leftValue, |
622 double rightValue, | 625 double rightValue, |
623 CalcOperator op) { | 626 CalcOperator op) { |
624 switch (op) { | 627 switch (op) { |
625 case CalcAdd: | 628 case CalcAdd: |
626 return leftValue + rightValue; | 629 return clampTo<double>(leftValue + rightValue); |
627 case CalcSubtract: | 630 case CalcSubtract: |
628 return leftValue - rightValue; | 631 return clampTo<double>(leftValue - rightValue); |
629 case CalcMultiply: | 632 case CalcMultiply: |
630 return leftValue * rightValue; | 633 return clampTo<double>(leftValue * rightValue); |
631 case CalcDivide: | 634 case CalcDivide: |
632 if (rightValue) | 635 if (rightValue) |
633 return leftValue / rightValue; | 636 return clampTo<double>(leftValue / rightValue); |
634 return std::numeric_limits<double>::quiet_NaN(); | 637 return std::numeric_limits<double>::quiet_NaN(); |
635 } | 638 } |
636 return 0; | 639 return 0; |
637 } | 640 } |
638 | 641 |
639 const Member<CSSCalcExpressionNode> m_leftSide; | 642 const Member<CSSCalcExpressionNode> m_leftSide; |
640 const Member<CSSCalcExpressionNode> m_rightSide; | 643 const Member<CSSCalcExpressionNode> m_rightSide; |
641 const CalcOperator m_operator; | 644 const CalcOperator m_operator; |
642 }; | 645 }; |
643 | 646 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 | 815 |
813 return expression ? new CSSCalcValue(expression, range) : nullptr; | 816 return expression ? new CSSCalcValue(expression, range) : nullptr; |
814 } | 817 } |
815 | 818 |
816 CSSCalcValue* CSSCalcValue::create(CSSCalcExpressionNode* expression, | 819 CSSCalcValue* CSSCalcValue::create(CSSCalcExpressionNode* expression, |
817 ValueRange range) { | 820 ValueRange range) { |
818 return new CSSCalcValue(expression, range); | 821 return new CSSCalcValue(expression, range); |
819 } | 822 } |
820 | 823 |
821 } // namespace blink | 824 } // namespace blink |
OLD | NEW |