OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
All rights reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 namespace WebCore { | 44 namespace WebCore { |
45 | 45 |
46 TransformBuilder::TransformBuilder() | 46 TransformBuilder::TransformBuilder() |
47 { | 47 { |
48 } | 48 } |
49 | 49 |
50 TransformBuilder::~TransformBuilder() | 50 TransformBuilder::~TransformBuilder() |
51 { | 51 { |
52 } | 52 } |
53 | 53 |
54 static Length convertToFloatLength(CSSPrimitiveValue* primitiveValue, const Rend
erStyle* style, const RenderStyle* rootStyle, double multiplier) | 54 static Length convertToFloatLength(CSSPrimitiveValue* primitiveValue, const CSST
oLengthConversionData& conversionData) |
55 { | 55 { |
56 return primitiveValue ? primitiveValue->convertToLength<FixedConversion | Pe
rcentConversion>(style, rootStyle, multiplier) : Length(Undefined); | 56 return primitiveValue ? primitiveValue->convertToLength<FixedConversion | Pe
rcentConversion>(conversionData) : Length(Undefined); |
57 } | 57 } |
58 | 58 |
59 static TransformOperation::OperationType getTransformOperationType(CSSTransformV
alue::TransformOperationType type) | 59 static TransformOperation::OperationType getTransformOperationType(CSSTransformV
alue::TransformOperationType type) |
60 { | 60 { |
61 switch (type) { | 61 switch (type) { |
62 case CSSTransformValue::ScaleTransformOperation: return TransformOperation::
Scale; | 62 case CSSTransformValue::ScaleTransformOperation: return TransformOperation::
Scale; |
63 case CSSTransformValue::ScaleXTransformOperation: return TransformOperation:
:ScaleX; | 63 case CSSTransformValue::ScaleXTransformOperation: return TransformOperation:
:ScaleX; |
64 case CSSTransformValue::ScaleYTransformOperation: return TransformOperation:
:ScaleY; | 64 case CSSTransformValue::ScaleYTransformOperation: return TransformOperation:
:ScaleY; |
65 case CSSTransformValue::ScaleZTransformOperation: return TransformOperation:
:ScaleZ; | 65 case CSSTransformValue::ScaleZTransformOperation: return TransformOperation:
:ScaleZ; |
66 case CSSTransformValue::Scale3DTransformOperation: return TransformOperation
::Scale3D; | 66 case CSSTransformValue::Scale3DTransformOperation: return TransformOperation
::Scale3D; |
(...skipping 11 matching lines...) Expand all Loading... |
78 case CSSTransformValue::SkewXTransformOperation: return TransformOperation::
SkewX; | 78 case CSSTransformValue::SkewXTransformOperation: return TransformOperation::
SkewX; |
79 case CSSTransformValue::SkewYTransformOperation: return TransformOperation::
SkewY; | 79 case CSSTransformValue::SkewYTransformOperation: return TransformOperation::
SkewY; |
80 case CSSTransformValue::MatrixTransformOperation: return TransformOperation:
:Matrix; | 80 case CSSTransformValue::MatrixTransformOperation: return TransformOperation:
:Matrix; |
81 case CSSTransformValue::Matrix3DTransformOperation: return TransformOperatio
n::Matrix3D; | 81 case CSSTransformValue::Matrix3DTransformOperation: return TransformOperatio
n::Matrix3D; |
82 case CSSTransformValue::PerspectiveTransformOperation: return TransformOpera
tion::Perspective; | 82 case CSSTransformValue::PerspectiveTransformOperation: return TransformOpera
tion::Perspective; |
83 case CSSTransformValue::UnknownTransformOperation: return TransformOperation
::None; | 83 case CSSTransformValue::UnknownTransformOperation: return TransformOperation
::None; |
84 } | 84 } |
85 return TransformOperation::None; | 85 return TransformOperation::None; |
86 } | 86 } |
87 | 87 |
88 bool TransformBuilder::createTransformOperations(CSSValue* inValue, const Render
Style* style, const RenderStyle* rootStyle, TransformOperations& outOperations) | 88 bool TransformBuilder::createTransformOperations(CSSValue* inValue, const CSSToL
engthConversionData& conversionData, TransformOperations& outOperations) |
89 { | 89 { |
90 if (!inValue || !inValue->isValueList()) { | 90 if (!inValue || !inValue->isValueList()) { |
91 outOperations.clear(); | 91 outOperations.clear(); |
92 return false; | 92 return false; |
93 } | 93 } |
94 | 94 |
95 float zoomFactor = style ? style->effectiveZoom() : 1; | 95 float zoomFactor = conversionData.zoom(); |
96 TransformOperations operations; | 96 TransformOperations operations; |
97 for (CSSValueListIterator i = inValue; i.hasMore(); i.advance()) { | 97 for (CSSValueListIterator i = inValue; i.hasMore(); i.advance()) { |
98 CSSValue* currValue = i.value(); | 98 CSSValue* currValue = i.value(); |
99 | 99 |
100 if (!currValue->isTransformValue()) | 100 if (!currValue->isTransformValue()) |
101 continue; | 101 continue; |
102 | 102 |
103 CSSTransformValue* transformValue = toCSSTransformValue(i.value()); | 103 CSSTransformValue* transformValue = toCSSTransformValue(i.value()); |
104 if (!transformValue->length()) | 104 if (!transformValue->length()) |
105 continue; | 105 continue; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 162 } |
163 operations.operations().append(ScaleTransformOperation::create(sx, s
y, sz, getTransformOperationType(transformValue->operationType()))); | 163 operations.operations().append(ScaleTransformOperation::create(sx, s
y, sz, getTransformOperationType(transformValue->operationType()))); |
164 break; | 164 break; |
165 } | 165 } |
166 case CSSTransformValue::TranslateTransformOperation: | 166 case CSSTransformValue::TranslateTransformOperation: |
167 case CSSTransformValue::TranslateXTransformOperation: | 167 case CSSTransformValue::TranslateXTransformOperation: |
168 case CSSTransformValue::TranslateYTransformOperation: { | 168 case CSSTransformValue::TranslateYTransformOperation: { |
169 Length tx = Length(0, Fixed); | 169 Length tx = Length(0, Fixed); |
170 Length ty = Length(0, Fixed); | 170 Length ty = Length(0, Fixed); |
171 if (transformValue->operationType() == CSSTransformValue::TranslateY
TransformOperation) | 171 if (transformValue->operationType() == CSSTransformValue::TranslateY
TransformOperation) |
172 ty = convertToFloatLength(firstValue, style, rootStyle, zoomFact
or); | 172 ty = convertToFloatLength(firstValue, conversionData); |
173 else { | 173 else { |
174 tx = convertToFloatLength(firstValue, style, rootStyle, zoomFact
or); | 174 tx = convertToFloatLength(firstValue, conversionData); |
175 if (transformValue->operationType() != CSSTransformValue::Transl
ateXTransformOperation) { | 175 if (transformValue->operationType() != CSSTransformValue::Transl
ateXTransformOperation) { |
176 if (transformValue->length() > 1) { | 176 if (transformValue->length() > 1) { |
177 CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(tra
nsformValue->itemWithoutBoundsCheck(1)); | 177 CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(tra
nsformValue->itemWithoutBoundsCheck(1)); |
178 ty = convertToFloatLength(secondValue, style, rootStyle,
zoomFactor); | 178 ty = convertToFloatLength(secondValue, conversionData); |
179 } | 179 } |
180 } | 180 } |
181 } | 181 } |
182 | 182 |
183 if (tx.isUndefined() || ty.isUndefined()) | 183 if (tx.isUndefined() || ty.isUndefined()) |
184 return false; | 184 return false; |
185 | 185 |
186 operations.operations().append(TranslateTransformOperation::create(t
x, ty, Length(0, Fixed), getTransformOperationType(transformValue->operationType
()))); | 186 operations.operations().append(TranslateTransformOperation::create(t
x, ty, Length(0, Fixed), getTransformOperationType(transformValue->operationType
()))); |
187 break; | 187 break; |
188 } | 188 } |
189 case CSSTransformValue::TranslateZTransformOperation: | 189 case CSSTransformValue::TranslateZTransformOperation: |
190 case CSSTransformValue::Translate3DTransformOperation: { | 190 case CSSTransformValue::Translate3DTransformOperation: { |
191 Length tx = Length(0, Fixed); | 191 Length tx = Length(0, Fixed); |
192 Length ty = Length(0, Fixed); | 192 Length ty = Length(0, Fixed); |
193 Length tz = Length(0, Fixed); | 193 Length tz = Length(0, Fixed); |
194 if (transformValue->operationType() == CSSTransformValue::TranslateZ
TransformOperation) | 194 if (transformValue->operationType() == CSSTransformValue::TranslateZ
TransformOperation) |
195 tz = convertToFloatLength(firstValue, style, rootStyle, zoomFact
or); | 195 tz = convertToFloatLength(firstValue, conversionData); |
196 else if (transformValue->operationType() == CSSTransformValue::Trans
lateYTransformOperation) | 196 else if (transformValue->operationType() == CSSTransformValue::Trans
lateYTransformOperation) |
197 ty = convertToFloatLength(firstValue, style, rootStyle, zoomFact
or); | 197 ty = convertToFloatLength(firstValue, conversionData); |
198 else { | 198 else { |
199 tx = convertToFloatLength(firstValue, style, rootStyle, zoomFact
or); | 199 tx = convertToFloatLength(firstValue, conversionData); |
200 if (transformValue->operationType() != CSSTransformValue::Transl
ateXTransformOperation) { | 200 if (transformValue->operationType() != CSSTransformValue::Transl
ateXTransformOperation) { |
201 if (transformValue->length() > 2) { | 201 if (transformValue->length() > 2) { |
202 CSSPrimitiveValue* thirdValue = toCSSPrimitiveValue(tran
sformValue->itemWithoutBoundsCheck(2)); | 202 CSSPrimitiveValue* thirdValue = toCSSPrimitiveValue(tran
sformValue->itemWithoutBoundsCheck(2)); |
203 tz = convertToFloatLength(thirdValue, style, rootStyle,
zoomFactor); | 203 tz = convertToFloatLength(thirdValue, conversionData); |
204 } | 204 } |
205 if (transformValue->length() > 1) { | 205 if (transformValue->length() > 1) { |
206 CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(tra
nsformValue->itemWithoutBoundsCheck(1)); | 206 CSSPrimitiveValue* secondValue = toCSSPrimitiveValue(tra
nsformValue->itemWithoutBoundsCheck(1)); |
207 ty = convertToFloatLength(secondValue, style, rootStyle,
zoomFactor); | 207 ty = convertToFloatLength(secondValue, conversionData); |
208 } | 208 } |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 if (tx.isUndefined() || ty.isUndefined() || tz.isUndefined()) | 212 if (tx.isUndefined() || ty.isUndefined() || tz.isUndefined()) |
213 return false; | 213 return false; |
214 | 214 |
215 operations.operations().append(TranslateTransformOperation::create(t
x, ty, tz, getTransformOperationType(transformValue->operationType()))); | 215 operations.operations().append(TranslateTransformOperation::create(t
x, ty, tz, getTransformOperationType(transformValue->operationType()))); |
216 break; | 216 break; |
217 } | 217 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoun
dsCheck(12))->getDoubleValue(), | 300 zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoun
dsCheck(12))->getDoubleValue(), |
301 zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoun
dsCheck(13))->getDoubleValue(), | 301 zoomFactor * toCSSPrimitiveValue(transformValue->itemWithoutBoun
dsCheck(13))->getDoubleValue(), |
302 toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(14))-
>getDoubleValue(), | 302 toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(14))-
>getDoubleValue(), |
303 toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(15))-
>getDoubleValue()); | 303 toCSSPrimitiveValue(transformValue->itemWithoutBoundsCheck(15))-
>getDoubleValue()); |
304 operations.operations().append(Matrix3DTransformOperation::create(ma
trix)); | 304 operations.operations().append(Matrix3DTransformOperation::create(ma
trix)); |
305 break; | 305 break; |
306 } | 306 } |
307 case CSSTransformValue::PerspectiveTransformOperation: { | 307 case CSSTransformValue::PerspectiveTransformOperation: { |
308 Length p = Length(0, Fixed); | 308 Length p = Length(0, Fixed); |
309 if (firstValue->isLength()) | 309 if (firstValue->isLength()) |
310 p = convertToFloatLength(firstValue, style, rootStyle, zoomFacto
r); | 310 p = convertToFloatLength(firstValue, conversionData); |
311 else { | 311 else { |
312 // This is a quirk that should go away when 3d transforms are fi
nalized. | 312 // This is a quirk that should go away when 3d transforms are fi
nalized. |
313 double val = firstValue->getDoubleValue(); | 313 double val = firstValue->getDoubleValue(); |
314 p = val >= 0 ? Length(clampToPositiveInteger(val), Fixed) : Leng
th(Undefined); | 314 p = val >= 0 ? Length(clampToPositiveInteger(val), Fixed) : Leng
th(Undefined); |
315 } | 315 } |
316 | 316 |
317 if (p.isUndefined()) | 317 if (p.isUndefined()) |
318 return false; | 318 return false; |
319 | 319 |
320 operations.operations().append(PerspectiveTransformOperation::create
(p)); | 320 operations.operations().append(PerspectiveTransformOperation::create
(p)); |
321 break; | 321 break; |
322 } | 322 } |
323 case CSSTransformValue::UnknownTransformOperation: | 323 case CSSTransformValue::UnknownTransformOperation: |
324 ASSERT_NOT_REACHED(); | 324 ASSERT_NOT_REACHED(); |
325 break; | 325 break; |
326 } | 326 } |
327 } | 327 } |
328 | 328 |
329 outOperations = operations; | 329 outOperations = operations; |
330 return true; | 330 return true; |
331 } | 331 } |
332 | 332 |
333 } // namespace WebCore | 333 } // namespace WebCore |
OLD | NEW |