Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(912)

Side by Side Diff: Source/core/platform/graphics/chromium/AnimationTranslationUtil.cpp

Issue 22900008: Make vw/vh units to work in css transforms. Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "public/platform/WebTransformOperations.h" 49 #include "public/platform/WebTransformOperations.h"
50 50
51 #include "wtf/OwnPtr.h" 51 #include "wtf/OwnPtr.h"
52 #include "wtf/text/CString.h" 52 #include "wtf/text/CString.h"
53 53
54 using namespace std; 54 using namespace std;
55 using namespace WebKit; 55 using namespace WebKit;
56 56
57 namespace WebCore { 57 namespace WebCore {
58 58
59 PassOwnPtr<WebTransformOperations> toWebTransformOperations(const TransformOpera tions& transformOperations, const FloatSize& boxSize) 59 PassOwnPtr<WebTransformOperations> toWebTransformOperations(const TransformOpera tions& transformOperations, const FloatSize& boxSize, RenderView* renderView)
60 { 60 {
61 // We need to do a deep copy the transformOperations may contain ref pointer s to TransformOperation objects. 61 // We need to do a deep copy the transformOperations may contain ref pointer s to TransformOperation objects.
62 OwnPtr<WebTransformOperations> webTransformOperations = adoptPtr(Platform::c urrent()->compositorSupport()->createTransformOperations()); 62 OwnPtr<WebTransformOperations> webTransformOperations = adoptPtr(Platform::c urrent()->compositorSupport()->createTransformOperations());
63 if (!webTransformOperations) 63 if (!webTransformOperations)
64 return nullptr; 64 return nullptr;
65 for (size_t j = 0; j < transformOperations.size(); ++j) { 65 for (size_t j = 0; j < transformOperations.size(); ++j) {
66 TransformOperation::OperationType operationType = transformOperations.op erations()[j]->getOperationType(); 66 TransformOperation::OperationType operationType = transformOperations.op erations()[j]->getOperationType();
67 switch (operationType) { 67 switch (operationType) {
68 case TransformOperation::ScaleX: 68 case TransformOperation::ScaleX:
69 case TransformOperation::ScaleY: 69 case TransformOperation::ScaleY:
70 case TransformOperation::ScaleZ: 70 case TransformOperation::ScaleZ:
71 case TransformOperation::Scale3D: 71 case TransformOperation::Scale3D:
72 case TransformOperation::Scale: { 72 case TransformOperation::Scale: {
73 ScaleTransformOperation* transform = static_cast<ScaleTransformOpera tion*>(transformOperations.operations()[j].get()); 73 ScaleTransformOperation* transform = static_cast<ScaleTransformOpera tion*>(transformOperations.operations()[j].get());
74 webTransformOperations->appendScale(transform->x(), transform->y(), transform->z()); 74 webTransformOperations->appendScale(transform->x(), transform->y(), transform->z());
75 break; 75 break;
76 } 76 }
77 case TransformOperation::TranslateX: 77 case TransformOperation::TranslateX:
78 case TransformOperation::TranslateY: 78 case TransformOperation::TranslateY:
79 case TransformOperation::TranslateZ: 79 case TransformOperation::TranslateZ:
80 case TransformOperation::Translate3D: 80 case TransformOperation::Translate3D:
81 case TransformOperation::Translate: { 81 case TransformOperation::Translate: {
82 TranslateTransformOperation* transform = static_cast<TranslateTransf ormOperation*>(transformOperations.operations()[j].get()); 82 TranslateTransformOperation* transform = static_cast<TranslateTransf ormOperation*>(transformOperations.operations()[j].get());
83 webTransformOperations->appendTranslate(floatValueForLength(transfor m->x(), boxSize.width()), floatValueForLength(transform->y(), boxSize.height()), floatValueForLength(transform->z(), 1)); 83 webTransformOperations->appendTranslate(floatValueForLength(transfor m->x(), boxSize.width(), renderView), floatValueForLength(transform->y(), boxSiz e.height(), renderView), floatValueForLength(transform->z(), 1, renderView));
84 break; 84 break;
85 } 85 }
86 case TransformOperation::RotateX: 86 case TransformOperation::RotateX:
87 case TransformOperation::RotateY: 87 case TransformOperation::RotateY:
88 case TransformOperation::Rotate3D: 88 case TransformOperation::Rotate3D:
89 case TransformOperation::Rotate: { 89 case TransformOperation::Rotate: {
90 RotateTransformOperation* transform = static_cast<RotateTransformOpe ration*>(transformOperations.operations()[j].get()); 90 RotateTransformOperation* transform = static_cast<RotateTransformOpe ration*>(transformOperations.operations()[j].get());
91 webTransformOperations->appendRotate(transform->x(), transform->y(), transform->z(), transform->angle()); 91 webTransformOperations->appendRotate(transform->x(), transform->y(), transform->z(), transform->angle());
92 break; 92 break;
93 } 93 }
(...skipping 16 matching lines...) Expand all
110 webTransformOperations->appendMatrix(TransformSkMatrix44Conversions: :convert(m)); 110 webTransformOperations->appendMatrix(TransformSkMatrix44Conversions: :convert(m));
111 break; 111 break;
112 } 112 }
113 case TransformOperation::Perspective: { 113 case TransformOperation::Perspective: {
114 PerspectiveTransformOperation* transform = static_cast<PerspectiveTr ansformOperation*>(transformOperations.operations()[j].get()); 114 PerspectiveTransformOperation* transform = static_cast<PerspectiveTr ansformOperation*>(transformOperations.operations()[j].get());
115 webTransformOperations->appendPerspective(floatValueForLength(transf orm->perspective(), 0)); 115 webTransformOperations->appendPerspective(floatValueForLength(transf orm->perspective(), 0));
116 break; 116 break;
117 } 117 }
118 case TransformOperation::Interpolated: { 118 case TransformOperation::Interpolated: {
119 TransformationMatrix m; 119 TransformationMatrix m;
120 transformOperations.operations()[j]->apply(m, boxSize); 120 transformOperations.operations()[j]->apply(m, boxSize, renderView);
121 webTransformOperations->appendMatrix(TransformSkMatrix44Conversions: :convert(m)); 121 webTransformOperations->appendMatrix(TransformSkMatrix44Conversions: :convert(m));
122 break; 122 break;
123 } 123 }
124 case TransformOperation::Identity: 124 case TransformOperation::Identity:
125 webTransformOperations->appendIdentity(); 125 webTransformOperations->appendIdentity();
126 break; 126 break;
127 case TransformOperation::None: 127 case TransformOperation::None:
128 // Do nothing. 128 // Do nothing.
129 break; 129 break;
130 } // switch 130 } // switch
131 } // for each operation 131 } // for each operation
132 132
133 return webTransformOperations.release(); 133 return webTransformOperations.release();
134 } 134 }
135 135
136 template <class Value, class Keyframe, class Curve> 136 template <class Value, class Keyframe, class Curve>
137 bool appendKeyframeWithStandardTimingFunction(Curve* curve, double keyTime, cons t Value* value, const Value* lastValue, WebKit::WebAnimationCurve::TimingFunctio nType timingFunctionType, const FloatSize&) 137 bool appendKeyframeWithStandardTimingFunction(Curve* curve, double keyTime, cons t Value* value, const Value* lastValue, WebKit::WebAnimationCurve::TimingFunctio nType timingFunctionType, const FloatSize&, RenderView* renderView)
138 { 138 {
139 curve->add(Keyframe(keyTime, value->value()), timingFunctionType); 139 curve->add(Keyframe(keyTime, value->value()), timingFunctionType);
140 return true; 140 return true;
141 } 141 }
142 142
143 template <class Value, class Keyframe, class Curve> 143 template <class Value, class Keyframe, class Curve>
144 bool appendKeyframeWithCustomBezierTimingFunction(Curve* curve, double keyTime, const Value* value, const Value* lastValue, double x1, double y1, double x2, dou ble y2, const FloatSize&) 144 bool appendKeyframeWithCustomBezierTimingFunction(Curve* curve, double keyTime, const Value* value, const Value* lastValue, double x1, double y1, double x2, dou ble y2, const FloatSize&, RenderView* renderView)
145 { 145 {
146 curve->add(Keyframe(keyTime, value->value()), x1, y1, x2, y2); 146 curve->add(Keyframe(keyTime, value->value()), x1, y1, x2, y2);
147 return true; 147 return true;
148 } 148 }
149 149
150 bool isRotationType(TransformOperation::OperationType transformType) 150 bool isRotationType(TransformOperation::OperationType transformType)
151 { 151 {
152 return transformType == TransformOperation::Rotate 152 return transformType == TransformOperation::Rotate
153 || transformType == TransformOperation::RotateX 153 || transformType == TransformOperation::RotateX
154 || transformType == TransformOperation::RotateY 154 || transformType == TransformOperation::RotateY
155 || transformType == TransformOperation::RotateZ 155 || transformType == TransformOperation::RotateZ
156 || transformType == TransformOperation::Rotate3D; 156 || transformType == TransformOperation::Rotate3D;
157 } 157 }
158 158
159 template <> 159 template <>
160 bool appendKeyframeWithStandardTimingFunction<TransformAnimationValue, WebTransf ormKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, doub le keyTime, const TransformAnimationValue* value, const TransformAnimationValue* lastValue, WebKit::WebAnimationCurve::TimingFunctionType timingFunctionType, co nst FloatSize& boxSize) 160 bool appendKeyframeWithStandardTimingFunction<TransformAnimationValue, WebTransf ormKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, doub le keyTime, const TransformAnimationValue* value, const TransformAnimationValue* lastValue, WebKit::WebAnimationCurve::TimingFunctionType timingFunctionType, co nst FloatSize& boxSize, RenderView* renderView)
161 { 161 {
162 bool canBlend = !lastValue; 162 bool canBlend = !lastValue;
163 OwnPtr<WebTransformOperations> operations(toWebTransformOperations(*value->v alue(), boxSize)); 163 OwnPtr<WebTransformOperations> operations(toWebTransformOperations(*value->v alue(), boxSize, renderView));
164 if (!operations) 164 if (!operations)
165 return false; 165 return false;
166 if (!canBlend) { 166 if (!canBlend) {
167 OwnPtr<WebTransformOperations> lastOperations(toWebTransformOperations(* lastValue->value(), boxSize)); 167 OwnPtr<WebTransformOperations> lastOperations(toWebTransformOperations(* lastValue->value(), boxSize, renderView));
168 if (!lastOperations) 168 if (!lastOperations)
169 return false; 169 return false;
170 canBlend = lastOperations->canBlendWith(*operations); 170 canBlend = lastOperations->canBlendWith(*operations);
171 } 171 }
172 if (canBlend) { 172 if (canBlend) {
173 curve->add(WebTransformKeyframe(keyTime, operations.leakPtr()), timingFu nctionType); 173 curve->add(WebTransformKeyframe(keyTime, operations.leakPtr()), timingFu nctionType);
174 return true; 174 return true;
175 } 175 }
176 return false; 176 return false;
177 } 177 }
178 178
179 template <> 179 template <>
180 bool appendKeyframeWithCustomBezierTimingFunction<TransformAnimationValue, WebTr ansformKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, double keyTime, const TransformAnimationValue* value, const TransformAnimationVa lue* lastValue, double x1, double y1, double x2, double y2, const FloatSize& box Size) 180 bool appendKeyframeWithCustomBezierTimingFunction<TransformAnimationValue, WebTr ansformKeyframe, WebTransformAnimationCurve>(WebTransformAnimationCurve* curve, double keyTime, const TransformAnimationValue* value, const TransformAnimationVa lue* lastValue, double x1, double y1, double x2, double y2, const FloatSize& box Size, RenderView* renderView)
181 { 181 {
182 bool canBlend = !lastValue; 182 bool canBlend = !lastValue;
183 OwnPtr<WebTransformOperations> operations(toWebTransformOperations(*value->v alue(), boxSize)); 183 OwnPtr<WebTransformOperations> operations(toWebTransformOperations(*value->v alue(), boxSize, renderView));
184 if (!operations) 184 if (!operations)
185 return false; 185 return false;
186 if (!canBlend) { 186 if (!canBlend) {
187 OwnPtr<WebTransformOperations> lastOperations(toWebTransformOperations(* lastValue->value(), boxSize)); 187 OwnPtr<WebTransformOperations> lastOperations(toWebTransformOperations(* lastValue->value(), boxSize, renderView));
188 if (!lastOperations) 188 if (!lastOperations)
189 return false; 189 return false;
190 canBlend = lastOperations->canBlendWith(*operations); 190 canBlend = lastOperations->canBlendWith(*operations);
191 } 191 }
192 if (canBlend) { 192 if (canBlend) {
193 curve->add(WebTransformKeyframe(keyTime, operations.leakPtr()), x1, y1, x2, y2); 193 curve->add(WebTransformKeyframe(keyTime, operations.leakPtr()), x1, y1, x2, y2);
194 return true; 194 return true;
195 } 195 }
196 return false; 196 return false;
197 } 197 }
198 198
199 template <class Value, class Keyframe, class Curve> 199 template <class Value, class Keyframe, class Curve>
200 PassOwnPtr<WebKit::WebAnimation> createWebAnimation(const KeyframeValueList& val ueList, const CSSAnimationData* animation, int animationId, double timeOffset, C urve* curve, WebKit::WebAnimation::TargetProperty targetProperty, const FloatSiz e& boxSize) 200 PassOwnPtr<WebKit::WebAnimation> createWebAnimation(const KeyframeValueList& val ueList, const CSSAnimationData* animation, int animationId, double timeOffset, C urve* curve, WebKit::WebAnimation::TargetProperty targetProperty, const FloatSiz e& boxSize, RenderView* renderView)
201 { 201 {
202 bool alternate = false; 202 bool alternate = false;
203 bool reverse = false; 203 bool reverse = false;
204 if (animation && animation->isDirectionSet()) { 204 if (animation && animation->isDirectionSet()) {
205 CSSAnimationData::AnimationDirection direction = animation->direction(); 205 CSSAnimationData::AnimationDirection direction = animation->direction();
206 if (direction == CSSAnimationData::AnimationDirectionAlternate || direct ion == CSSAnimationData::AnimationDirectionAlternateReverse) 206 if (direction == CSSAnimationData::AnimationDirectionAlternate || direct ion == CSSAnimationData::AnimationDirectionAlternateReverse)
207 alternate = true; 207 alternate = true;
208 if (direction == CSSAnimationData::AnimationDirectionReverse || directio n == CSSAnimationData::AnimationDirectionAlternateReverse) 208 if (direction == CSSAnimationData::AnimationDirectionReverse || directio n == CSSAnimationData::AnimationDirectionAlternateReverse)
209 reverse = true; 209 reverse = true;
210 } 210 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 } 252 }
253 253
254 double duration = (animation && animation->isDurationSet()) ? animation- >duration() : 1; 254 double duration = (animation && animation->isDurationSet()) ? animation- >duration() : 1;
255 double keyTime = originalValue->keyTime() * duration; 255 double keyTime = originalValue->keyTime() * duration;
256 256
257 if (reverse) 257 if (reverse)
258 keyTime = duration - keyTime; 258 keyTime = duration - keyTime;
259 259
260 bool addedKeyframe = false; 260 bool addedKeyframe = false;
261 if (isUsingCustomBezierTimingFunction) 261 if (isUsingCustomBezierTimingFunction)
262 addedKeyframe = appendKeyframeWithCustomBezierTimingFunction<Value, Keyframe, Curve>(curve, keyTime, originalValue, lastOriginalValue, x1, y1, x2, y 2, boxSize); 262 addedKeyframe = appendKeyframeWithCustomBezierTimingFunction<Value, Keyframe, Curve>(curve, keyTime, originalValue, lastOriginalValue, x1, y1, x2, y 2, boxSize, renderView);
263 else 263 else
264 addedKeyframe = appendKeyframeWithStandardTimingFunction<Value, Keyf rame, Curve>(curve, keyTime, originalValue, lastOriginalValue, timingFunctionTyp e, boxSize); 264 addedKeyframe = appendKeyframeWithStandardTimingFunction<Value, Keyf rame, Curve>(curve, keyTime, originalValue, lastOriginalValue, timingFunctionTyp e, boxSize, renderView);
265 if (!addedKeyframe) 265 if (!addedKeyframe)
266 return nullptr; 266 return nullptr;
267 } 267 }
268 268
269 OwnPtr<WebKit::WebAnimation> webAnimation = adoptPtr(Platform::current()->co mpositorSupport()->createAnimation(*curve, targetProperty, animationId)); 269 OwnPtr<WebKit::WebAnimation> webAnimation = adoptPtr(Platform::current()->co mpositorSupport()->createAnimation(*curve, targetProperty, animationId));
270 270
271 int iterations = (animation && animation->isIterationCountSet()) ? animation ->iterationCount() : 1; 271 int iterations = (animation && animation->isIterationCountSet()) ? animation ->iterationCount() : 1;
272 webAnimation->setIterations(iterations); 272 webAnimation->setIterations(iterations);
273 webAnimation->setAlternatesDirection(alternate); 273 webAnimation->setAlternatesDirection(alternate);
274 274
275 // If timeOffset > 0, then the animation has started in the past. 275 // If timeOffset > 0, then the animation has started in the past.
276 webAnimation->setTimeOffset(timeOffset); 276 webAnimation->setTimeOffset(timeOffset);
277 277
278 return webAnimation.release(); 278 return webAnimation.release();
279 } 279 }
280 280
281 PassOwnPtr<WebKit::WebAnimation> createWebAnimation(const KeyframeValueList& val ues, const CSSAnimationData* animation, int animationId, double timeOffset, cons t FloatSize& boxSize) 281 PassOwnPtr<WebKit::WebAnimation> createWebAnimation(const KeyframeValueList& val ues, const CSSAnimationData* animation, int animationId, double timeOffset, cons t FloatSize& boxSize, RenderView* renderView)
282 { 282 {
283 283
284 284
285 if (values.property() == AnimatedPropertyWebkitTransform) { 285 if (values.property() == AnimatedPropertyWebkitTransform) {
286 OwnPtr<WebTransformAnimationCurve> curve = adoptPtr(Platform::current()- >compositorSupport()->createTransformAnimationCurve()); 286 OwnPtr<WebTransformAnimationCurve> curve = adoptPtr(Platform::current()- >compositorSupport()->createTransformAnimationCurve());
287 return createWebAnimation<TransformAnimationValue, WebTransformKeyframe, WebTransformAnimationCurve>(values, animation, animationId, timeOffset, curve.g et(), WebKit::WebAnimation::TargetPropertyTransform, FloatSize(boxSize)); 287 return createWebAnimation<TransformAnimationValue, WebTransformKeyframe, WebTransformAnimationCurve>(values, animation, animationId, timeOffset, curve.g et(), WebKit::WebAnimation::TargetPropertyTransform, FloatSize(boxSize), renderV iew);
288 } 288 }
289 289
290 if (values.property() == AnimatedPropertyOpacity) { 290 if (values.property() == AnimatedPropertyOpacity) {
291 OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(Platform::current()->com positorSupport()->createFloatAnimationCurve()); 291 OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(Platform::current()->com positorSupport()->createFloatAnimationCurve());
292 return createWebAnimation<FloatAnimationValue, WebFloatKeyframe, WebFloa tAnimationCurve>(values, animation, animationId, timeOffset, curve.get(), WebKit ::WebAnimation::TargetPropertyOpacity, FloatSize()); 292 return createWebAnimation<FloatAnimationValue, WebFloatKeyframe, WebFloa tAnimationCurve>(values, animation, animationId, timeOffset, curve.get(), WebKit ::WebAnimation::TargetPropertyOpacity, FloatSize(), renderView);
293 } 293 }
294 294
295 return nullptr; 295 return nullptr;
296 } 296 }
297 297
298 } // namespace WebCore 298 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698