OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/css/cssom/CSSRotation.h" | 5 #include "core/css/cssom/CSSRotation.h" |
6 | 6 |
| 7 #include "core/css/CSSFunctionValue.h" |
7 #include "core/css/CSSPrimitiveValue.h" | 8 #include "core/css/CSSPrimitiveValue.h" |
8 | 9 |
9 namespace blink { | 10 namespace blink { |
10 | 11 |
| 12 namespace { |
| 13 |
| 14 bool isNumberValue(const CSSValue& value) |
| 15 { |
| 16 return value.isPrimitiveValue() && toCSSPrimitiveValue(value).isNumber(); |
| 17 } |
| 18 |
| 19 CSSRotation* fromCSSRotate(const CSSFunctionValue& value) |
| 20 { |
| 21 DCHECK_EQ(value.length(), 1UL); |
| 22 return CSSRotation::create(toCSSPrimitiveValue(value.item(0)).computeDegrees
()); |
| 23 } |
| 24 |
| 25 CSSRotation* fromCSSRotate3d(const CSSFunctionValue& value) |
| 26 { |
| 27 DCHECK_EQ(value.length(), 4UL); |
| 28 DCHECK(isNumberValue(value.item(0))); |
| 29 DCHECK(isNumberValue(value.item(1))); |
| 30 DCHECK(isNumberValue(value.item(2))); |
| 31 // computeDegrees asserts that value.item(3) is an angle. |
| 32 |
| 33 double x = toCSSPrimitiveValue(value.item(0)).getDoubleValue(); |
| 34 double y = toCSSPrimitiveValue(value.item(1)).getDoubleValue(); |
| 35 double z = toCSSPrimitiveValue(value.item(2)).getDoubleValue(); |
| 36 double angle = toCSSPrimitiveValue(value.item(3)).computeDegrees(); |
| 37 return CSSRotation::create(x, y, z, angle); |
| 38 } |
| 39 |
| 40 CSSRotation* fromCSSRotateXYZ(const CSSFunctionValue& value) |
| 41 { |
| 42 DCHECK_EQ(value.length(), 1UL); |
| 43 double angle = toCSSPrimitiveValue(value.item(0)).computeDegrees(); |
| 44 |
| 45 switch (value.functionType()) { |
| 46 case CSSValueRotateX: |
| 47 return CSSRotation::create(1, 0, 0, angle); |
| 48 case CSSValueRotateY: |
| 49 return CSSRotation::create(0, 1, 0, angle); |
| 50 case CSSValueRotateZ: |
| 51 return CSSRotation::create(0, 0, 1, angle); |
| 52 default: |
| 53 NOTREACHED(); |
| 54 return nullptr; |
| 55 } |
| 56 } |
| 57 |
| 58 } // namespace |
| 59 |
| 60 CSSRotation* CSSRotation::fromCSSValue(const CSSFunctionValue& value) |
| 61 { |
| 62 switch (value.functionType()) { |
| 63 case CSSValueRotate: |
| 64 return fromCSSRotate(value); |
| 65 case CSSValueRotate3d: |
| 66 return fromCSSRotate3d(value); |
| 67 case CSSValueRotateX: |
| 68 case CSSValueRotateY: |
| 69 case CSSValueRotateZ: |
| 70 return fromCSSRotateXYZ(value); |
| 71 default: |
| 72 NOTREACHED(); |
| 73 return nullptr; |
| 74 } |
| 75 } |
| 76 |
11 CSSFunctionValue* CSSRotation::toCSSValue() const | 77 CSSFunctionValue* CSSRotation::toCSSValue() const |
12 { | 78 { |
13 CSSFunctionValue* result = CSSFunctionValue::create(m_is2D ? CSSValueRotate
: CSSValueRotate3d); | 79 CSSFunctionValue* result = CSSFunctionValue::create(m_is2D ? CSSValueRotate
: CSSValueRotate3d); |
14 if (!m_is2D) { | 80 if (!m_is2D) { |
15 result->append(*CSSPrimitiveValue::create(m_x, CSSPrimitiveValue::UnitTy
pe::Number)); | 81 result->append(*CSSPrimitiveValue::create(m_x, CSSPrimitiveValue::UnitTy
pe::Number)); |
16 result->append(*CSSPrimitiveValue::create(m_y, CSSPrimitiveValue::UnitTy
pe::Number)); | 82 result->append(*CSSPrimitiveValue::create(m_y, CSSPrimitiveValue::UnitTy
pe::Number)); |
17 result->append(*CSSPrimitiveValue::create(m_z, CSSPrimitiveValue::UnitTy
pe::Number)); | 83 result->append(*CSSPrimitiveValue::create(m_z, CSSPrimitiveValue::UnitTy
pe::Number)); |
18 } | 84 } |
19 result->append(*CSSPrimitiveValue::create(m_angle, CSSPrimitiveValue::UnitTy
pe::Degrees)); | 85 result->append(*CSSPrimitiveValue::create(m_angle, CSSPrimitiveValue::UnitTy
pe::Degrees)); |
20 return result; | 86 return result; |
21 } | 87 } |
22 | 88 |
23 } // namespace blink | 89 } // namespace blink |
OLD | NEW |