| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "core/css/cssom/StyleCalcLength.h" | |
| 6 | |
| 7 #include "core/css/CSSCalculationValue.h" | |
| 8 #include "core/css/CSSPrimitiveValue.h" | |
| 9 #include "core/css/cssom/CSSSimpleLength.h" | |
| 10 #include "core/css/cssom/CalcDictionary.h" | |
| 11 #include "wtf/Vector.h" | |
| 12 | |
| 13 namespace blink { | |
| 14 | |
| 15 StyleCalcLength::StyleCalcLength() : m_values(CSSLengthValue::kNumSupportedUnits
), m_hasValues(CSSLengthValue::kNumSupportedUnits) {} | |
| 16 | |
| 17 StyleCalcLength::StyleCalcLength(const StyleCalcLength& other) : | |
| 18 m_values(other.m_values), | |
| 19 m_hasValues(other.m_hasValues) | |
| 20 {} | |
| 21 | |
| 22 StyleCalcLength::StyleCalcLength(const CSSSimpleLength& other) : | |
| 23 m_values(CSSLengthValue::kNumSupportedUnits), m_hasValues(CSSLengthValue::kN
umSupportedUnits) | |
| 24 { | |
| 25 set(other.value(), other.lengthUnit()); | |
| 26 } | |
| 27 | |
| 28 StyleCalcLength* StyleCalcLength::create(const CSSLengthValue* length) | |
| 29 { | |
| 30 if (length->type() == SimpleLengthType) { | |
| 31 const CSSSimpleLength* simpleLength = toCSSSimpleLength(length); | |
| 32 return new StyleCalcLength(*simpleLength); | |
| 33 } | |
| 34 | |
| 35 return new StyleCalcLength(*toStyleCalcLength(length)); | |
| 36 } | |
| 37 | |
| 38 StyleCalcLength* StyleCalcLength::create(const CalcDictionary& dictionary, Excep
tionState& exceptionState) | |
| 39 { | |
| 40 StyleCalcLength* result = new StyleCalcLength(); | |
| 41 int numSet = 0; | |
| 42 | |
| 43 #define setFromDictValue(name, camelName, primitiveName) \ | |
| 44 if (dictionary.has##camelName()) { \ | |
| 45 result->set(dictionary.name(), CSSPrimitiveValue::UnitType::primitiveNam
e); \ | |
| 46 numSet++; \ | |
| 47 } | |
| 48 | |
| 49 setFromDictValue(px, Px, Pixels) | |
| 50 setFromDictValue(percent, Percent, Percentage) | |
| 51 setFromDictValue(em, Em, Ems) | |
| 52 setFromDictValue(ex, Ex, Exs) | |
| 53 setFromDictValue(ch, Ch, Chs) | |
| 54 setFromDictValue(rem, Rem, Rems) | |
| 55 setFromDictValue(vw, Vw, ViewportWidth) | |
| 56 setFromDictValue(vh, Vh, ViewportHeight) | |
| 57 setFromDictValue(vmin, Vmin, ViewportMin) | |
| 58 setFromDictValue(vmax, Vmax, ViewportMax) | |
| 59 setFromDictValue(cm, Cm, Centimeters) | |
| 60 setFromDictValue(mm, Mm, Millimeters) | |
| 61 setFromDictValue(in, In, Inches) | |
| 62 setFromDictValue(pc, Pc, Picas) | |
| 63 setFromDictValue(pt, Pt, Points) | |
| 64 | |
| 65 if (numSet == 0) { | |
| 66 exceptionState.throwTypeError("Must specify at least one value in CalcDi
ctionary for creating a CalcLength."); | |
| 67 } | |
| 68 return result; | |
| 69 } | |
| 70 | |
| 71 bool StyleCalcLength::containsPercent() const | |
| 72 { | |
| 73 return has(CSSPrimitiveValue::UnitType::Percentage); | |
| 74 } | |
| 75 | |
| 76 CSSLengthValue* StyleCalcLength::addInternal(const CSSLengthValue* other, Except
ionState& exceptionState) | |
| 77 { | |
| 78 StyleCalcLength* result = StyleCalcLength::create(other, exceptionState); | |
| 79 for (int i = 0; i < CSSLengthValue::kNumSupportedUnits; ++i) { | |
| 80 if (hasAtIndex(i)) { | |
| 81 result->setAtIndex(getAtIndex(i) + result->getAtIndex(i), i); | |
| 82 } | |
| 83 } | |
| 84 return result; | |
| 85 } | |
| 86 | |
| 87 CSSLengthValue* StyleCalcLength::subtractInternal(const CSSLengthValue* other, E
xceptionState& exceptionState) | |
| 88 { | |
| 89 StyleCalcLength* result = StyleCalcLength::create(this, exceptionState); | |
| 90 if (other->type() == CalcLengthType) { | |
| 91 const StyleCalcLength* o = toStyleCalcLength(other); | |
| 92 for (unsigned i = 0; i < CSSLengthValue::kNumSupportedUnits; ++i) { | |
| 93 if (o->hasAtIndex(i)) { | |
| 94 result->setAtIndex(getAtIndex(i) - o->getAtIndex(i), i); | |
| 95 } | |
| 96 } | |
| 97 } else { | |
| 98 const CSSSimpleLength* o = toCSSSimpleLength(other); | |
| 99 result->set(get(o->lengthUnit()) - o->value(), o->lengthUnit()); | |
| 100 } | |
| 101 return result; | |
| 102 } | |
| 103 | |
| 104 CSSLengthValue* StyleCalcLength::multiplyInternal(double x, ExceptionState& exce
ptionState) | |
| 105 { | |
| 106 StyleCalcLength* result = StyleCalcLength::create(this, exceptionState); | |
| 107 for (unsigned i = 0; i < CSSLengthValue::kNumSupportedUnits; ++i) { | |
| 108 if (hasAtIndex(i)) { | |
| 109 result->setAtIndex(getAtIndex(i) * x, i); | |
| 110 } | |
| 111 } | |
| 112 return result; | |
| 113 } | |
| 114 | |
| 115 CSSLengthValue* StyleCalcLength::divideInternal(double x, ExceptionState& except
ionState) | |
| 116 { | |
| 117 StyleCalcLength* result = StyleCalcLength::create(this, exceptionState); | |
| 118 for (unsigned i = 0; i < CSSLengthValue::kNumSupportedUnits; ++i) { | |
| 119 if (hasAtIndex(i)) { | |
| 120 result->setAtIndex(getAtIndex(i) / x, i); | |
| 121 } | |
| 122 } | |
| 123 return result; | |
| 124 } | |
| 125 | |
| 126 CSSValue* StyleCalcLength::toCSSValue() const | |
| 127 { | |
| 128 // Create a CSS Calc Value, then put it into a CSSPrimitiveValue | |
| 129 CSSCalcExpressionNode* node = nullptr; | |
| 130 for (unsigned i = 0; i < CSSLengthValue::kNumSupportedUnits; ++i) { | |
| 131 if (!hasAtIndex(i)) | |
| 132 continue; | |
| 133 double value = getAtIndex(i); | |
| 134 if (node) { | |
| 135 node = CSSCalcValue::createExpressionNode( | |
| 136 node, | |
| 137 CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(std
::abs(value), unitFromIndex(i))), | |
| 138 value >= 0 ? CalcAdd : CalcSubtract); | |
| 139 } else { | |
| 140 node = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(
value, unitFromIndex(i))); | |
| 141 } | |
| 142 } | |
| 143 return CSSPrimitiveValue::create(CSSCalcValue::create(node)); | |
| 144 } | |
| 145 | |
| 146 int StyleCalcLength::indexForUnit(CSSPrimitiveValue::UnitType unit) | |
| 147 { | |
| 148 return (static_cast<int>(unit) - static_cast<int>(CSSPrimitiveValue::UnitTyp
e::Percentage)); | |
| 149 } | |
| 150 | |
| 151 } // namespace blink | |
| OLD | NEW |