| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. | 3 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "config.h" | 30 #include "config.h" |
| 31 #include "core/frame/animation/CSSPropertyAnimation.h" | 31 #include "core/frame/animation/CSSPropertyAnimation.h" |
| 32 | 32 |
| 33 #include <algorithm> | 33 #include <algorithm> |
| 34 #include "StylePropertyShorthand.h" | 34 #include "StylePropertyShorthand.h" |
| 35 #include "core/animation/css/CSSAnimations.h" | 35 #include "core/animation/css/CSSAnimations.h" |
| 36 #include "core/css/CSSCrossfadeValue.h" | 36 #include "core/css/CSSCrossfadeValue.h" |
| 37 #include "core/css/CSSImageValue.h" | 37 #include "core/css/CSSImageValue.h" |
| 38 #include "core/css/CSSPrimitiveValue.h" | 38 #include "core/css/CSSPrimitiveValue.h" |
| 39 #include "core/fetch/ImageResource.h" | 39 #include "core/fetch/ImageResource.h" |
| 40 #include "core/frame/animation/AnimationBase.h" | |
| 41 #include "core/rendering/ClipPathOperation.h" | 40 #include "core/rendering/ClipPathOperation.h" |
| 42 #include "core/rendering/RenderBox.h" | 41 #include "core/rendering/RenderBox.h" |
| 43 #include "core/rendering/style/RenderStyle.h" | 42 #include "core/rendering/style/RenderStyle.h" |
| 44 #include "core/rendering/style/ShadowList.h" | 43 #include "core/rendering/style/ShadowList.h" |
| 45 #include "core/rendering/style/StyleFetchedImage.h" | 44 #include "core/rendering/style/StyleFetchedImage.h" |
| 46 #include "core/rendering/style/StyleGeneratedImage.h" | 45 #include "core/rendering/style/StyleGeneratedImage.h" |
| 47 #include "platform/FloatConversion.h" | 46 #include "platform/FloatConversion.h" |
| 48 #include "wtf/Noncopyable.h" | 47 #include "wtf/Noncopyable.h" |
| 49 | 48 |
| 50 namespace WebCore { | 49 namespace WebCore { |
| 51 | 50 |
| 52 template <typename T> | |
| 53 static inline T blendFunc(const AnimationBase*, T from, T to, double progress) | |
| 54 { | |
| 55 return blend(from, to, progress); | |
| 56 } | |
| 57 | |
| 58 static inline float blendFunc(const AnimationBase*, float from, float to, double
progress) | |
| 59 { | |
| 60 return narrowPrecisionToFloat(from + (to - from) * progress); | |
| 61 } | |
| 62 | |
| 63 static inline Color blendFunc(const AnimationBase*, const Color& from, const Col
or& to, double progress) | |
| 64 { | |
| 65 return blend(from, to, progress); | |
| 66 } | |
| 67 | |
| 68 static inline Length blendFunc(const AnimationBase*, const Length& from, const L
ength& to, double progress) | |
| 69 { | |
| 70 return to.blend(from, progress, ValueRangeAll); | |
| 71 } | |
| 72 | |
| 73 static inline BorderImageLength blendFunc(const AnimationBase* anim, const Borde
rImageLength& from, const BorderImageLength& to, double progress) | |
| 74 { | |
| 75 if (from.isNumber() && to.isNumber()) | |
| 76 return BorderImageLength(blendFunc(anim, from.number(), to.number(), pro
gress)); | |
| 77 | |
| 78 if (from.isLength() && to.isLength()) | |
| 79 return BorderImageLength(blendFunc(anim, from.length(), to.length(), pro
gress)); | |
| 80 | |
| 81 // FIXME: Converting numbers to lengths using the computed border | |
| 82 // width would make it possible to interpolate between numbers and | |
| 83 // lengths. | |
| 84 // https://code.google.com/p/chromium/issues/detail?id=316164 | |
| 85 return to; | |
| 86 } | |
| 87 | |
| 88 static inline BorderImageLengthBox blendFunc(const AnimationBase* anim, const Bo
rderImageLengthBox& from, | |
| 89 const BorderImageLengthBox& to, double progress) | |
| 90 { | |
| 91 return BorderImageLengthBox(blendFunc(anim, from.top(), to.top(), progress), | |
| 92 blendFunc(anim, from.right(), to.right(), progress), | |
| 93 blendFunc(anim, from.bottom(), to.bottom(), progress), | |
| 94 blendFunc(anim, from.left(), to.left(), progress)); | |
| 95 } | |
| 96 | |
| 97 static inline LengthSize blendFunc(const AnimationBase* anim, const LengthSize&
from, const LengthSize& to, double progress) | |
| 98 { | |
| 99 return LengthSize(blendFunc(anim, from.width(), to.width(), progress), | |
| 100 blendFunc(anim, from.height(), to.height(), progress)); | |
| 101 } | |
| 102 | |
| 103 static inline LengthPoint blendFunc(const AnimationBase* anim, const LengthPoint
& from, const LengthPoint& to, double progress) | |
| 104 { | |
| 105 return LengthPoint(blendFunc(anim, from.x(), to.x(), progress), blendFunc(an
im, from.y(), to.y(), progress)); | |
| 106 } | |
| 107 | |
| 108 static inline TransformOperations blendFunc(const AnimationBase* anim, const Tra
nsformOperations& from, const TransformOperations& to, double progress) | |
| 109 { | |
| 110 if (anim->isTransformFunctionListValid()) | |
| 111 return to.blendByMatchingOperations(from, progress); | |
| 112 return to.blendByUsingMatrixInterpolation(from, progress); | |
| 113 } | |
| 114 | |
| 115 static inline PassRefPtr<ClipPathOperation> blendFunc(const AnimationBase*, Clip
PathOperation* from, ClipPathOperation* to, double progress) | |
| 116 { | |
| 117 // Other clip-path operations than BasicShapes can not be animated. | |
| 118 if (!from || !to || from->type() != ClipPathOperation::SHAPE || to->type() !
= ClipPathOperation::SHAPE) | |
| 119 return to; | |
| 120 | |
| 121 const BasicShape* fromShape = toShapeClipPathOperation(from)->basicShape(); | |
| 122 const BasicShape* toShape = toShapeClipPathOperation(to)->basicShape(); | |
| 123 | |
| 124 if (!fromShape->canBlend(toShape)) | |
| 125 return to; | |
| 126 | |
| 127 return ShapeClipPathOperation::create(toShape->blend(fromShape, progress)); | |
| 128 } | |
| 129 | |
| 130 static inline PassRefPtr<ShapeValue> blendFunc(const AnimationBase*, ShapeValue*
from, ShapeValue* to, double progress) | |
| 131 { | |
| 132 // FIXME Bug 102723: Shape-inside should be able to animate a value of 'outs
ide-shape' when shape-outside is set to a BasicShape | |
| 133 if (!from || !to || from->type() != ShapeValue::Shape || to->type() != Shape
Value::Shape) | |
| 134 return to; | |
| 135 | |
| 136 const BasicShape* fromShape = from->shape(); | |
| 137 const BasicShape* toShape = to->shape(); | |
| 138 | |
| 139 if (!fromShape->canBlend(toShape)) | |
| 140 return to; | |
| 141 | |
| 142 return ShapeValue::createShapeValue(toShape->blend(fromShape, progress)); | |
| 143 } | |
| 144 | |
| 145 static inline FilterOperations blendFunc(const AnimationBase* anim, const Filter
Operations& from, const FilterOperations& to, double progress) | |
| 146 { | |
| 147 FilterOperations result; | |
| 148 | |
| 149 // If we have a filter function list, use that to do a per-function animatio
n. | |
| 150 if (anim->filterFunctionListsMatch()) { | |
| 151 size_t fromSize = from.operations().size(); | |
| 152 size_t toSize = to.operations().size(); | |
| 153 size_t size = max(fromSize, toSize); | |
| 154 for (size_t i = 0; i < size; i++) { | |
| 155 const FilterOperation* fromOp = (i < fromSize) ? from.operations()[i
].get() : 0; | |
| 156 const FilterOperation* toOp = (i < toSize) ? to.operations()[i].get(
) : 0; | |
| 157 RefPtr<FilterOperation> blendedOp = FilterOperation::blend(fromOp, t
oOp, progress); | |
| 158 if (blendedOp) | |
| 159 result.operations().append(blendedOp); | |
| 160 else | |
| 161 ASSERT_NOT_REACHED(); | |
| 162 } | |
| 163 } else { | |
| 164 // If the filter function lists don't match, we could try to cross-fade,
but don't yet have a way to represent that in CSS. | |
| 165 // For now we'll just fail to animate. | |
| 166 result = to; | |
| 167 } | |
| 168 | |
| 169 return result; | |
| 170 } | |
| 171 | |
| 172 static inline EVisibility blendFunc(const AnimationBase* anim, EVisibility from,
EVisibility to, double progress) | |
| 173 { | |
| 174 // Any non-zero result means we consider the object to be visible. Only at 0
do we consider the object to be | |
| 175 // invisible. The invisible value we use (HIDDEN vs. COLLAPSE) depends on th
e specified from/to values. | |
| 176 double fromVal = from == VISIBLE ? 1. : 0.; | |
| 177 double toVal = to == VISIBLE ? 1. : 0.; | |
| 178 if (fromVal == toVal) | |
| 179 return to; | |
| 180 double result = blendFunc(anim, fromVal, toVal, progress); | |
| 181 return result > 0. ? VISIBLE : (to != VISIBLE ? to : from); | |
| 182 } | |
| 183 | |
| 184 static inline LengthBox blendFunc(const AnimationBase* anim, const LengthBox& fr
om, const LengthBox& to, double progress) | |
| 185 { | |
| 186 // Length types have to match to animate | |
| 187 if (from.top().type() != to.top().type() | |
| 188 || from.right().type() != to.right().type() | |
| 189 || from.bottom().type() != to.bottom().type() | |
| 190 || from.left().type() != to.left().type()) | |
| 191 return to; | |
| 192 | |
| 193 LengthBox result(blendFunc(anim, from.top(), to.top(), progress), | |
| 194 blendFunc(anim, from.right(), to.right(), progress), | |
| 195 blendFunc(anim, from.bottom(), to.bottom(), progress), | |
| 196 blendFunc(anim, from.left(), to.left(), progress)); | |
| 197 return result; | |
| 198 } | |
| 199 | |
| 200 static inline PassRefPtr<SVGLength> blendFunc(const AnimationBase*, PassRefPtr<S
VGLength> from, PassRefPtr<SVGLength> to, double progress) | |
| 201 { | |
| 202 return to->blend(from, narrowPrecisionToFloat(progress)); | |
| 203 } | |
| 204 | |
| 205 static inline PassRefPtr<SVGLengthList> blendFunc(const AnimationBase*, PassRefP
tr<SVGLengthList> passFrom, PassRefPtr<SVGLengthList> passTo, double progress) | |
| 206 { | |
| 207 RefPtr<SVGLengthList> from = passFrom; | |
| 208 RefPtr<SVGLengthList> to = passTo; | |
| 209 | |
| 210 size_t fromLength = from->numberOfItems(); | |
| 211 size_t toLength = to->numberOfItems(); | |
| 212 if (!fromLength) | |
| 213 return !progress ? from->clone() : to->clone(); | |
| 214 if (!toLength) | |
| 215 return progress == 1 ? from->clone() : to->clone(); | |
| 216 | |
| 217 size_t resultLength = fromLength; | |
| 218 if (fromLength != toLength) { | |
| 219 if (!(fromLength % toLength)) | |
| 220 resultLength = fromLength; | |
| 221 else if (!(toLength % fromLength)) | |
| 222 resultLength = toLength; | |
| 223 else | |
| 224 resultLength = fromLength * toLength; | |
| 225 } | |
| 226 RefPtr<SVGLengthList> result = SVGLengthList::create(); | |
| 227 for (size_t i = 0; i < resultLength; ++i) | |
| 228 result->append(to->at(i % toLength)->blend(from->at(i % fromLength), nar
rowPrecisionToFloat(progress))); | |
| 229 return result; | |
| 230 } | |
| 231 | |
| 232 static inline PassRefPtr<StyleImage> crossfadeBlend(const AnimationBase*, StyleF
etchedImage* fromStyleImage, StyleFetchedImage* toStyleImage, double progress) | |
| 233 { | |
| 234 // If progress is at one of the extremes, we want getComputedStyle to show t
he image, | |
| 235 // not a completed cross-fade, so we hand back one of the existing images. | |
| 236 if (!progress) | |
| 237 return fromStyleImage; | |
| 238 if (progress == 1) | |
| 239 return toStyleImage; | |
| 240 | |
| 241 ImageResource* fromImageResource = static_cast<ImageResource*>(fromStyleImag
e->data()); | |
| 242 ImageResource* toImageResource = static_cast<ImageResource*>(toStyleImage->d
ata()); | |
| 243 | |
| 244 RefPtr<CSSImageValue> fromImageValue = CSSImageValue::create(fromImageResour
ce->url(), fromStyleImage); | |
| 245 RefPtr<CSSImageValue> toImageValue = CSSImageValue::create(toImageResource->
url(), toStyleImage); | |
| 246 RefPtr<CSSCrossfadeValue> crossfadeValue = CSSCrossfadeValue::create(fromIma
geValue, toImageValue); | |
| 247 | |
| 248 crossfadeValue->setPercentage(CSSPrimitiveValue::create(progress, CSSPrimiti
veValue::CSS_NUMBER)); | |
| 249 | |
| 250 return StyleGeneratedImage::create(crossfadeValue.get()); | |
| 251 } | |
| 252 | |
| 253 static inline PassRefPtr<StyleImage> blendFunc(const AnimationBase* anim, StyleI
mage* from, StyleImage* to, double progress) | |
| 254 { | |
| 255 if (!from || !to) | |
| 256 return to; | |
| 257 | |
| 258 if (from->isImageResource() && to->isImageResource()) | |
| 259 return crossfadeBlend(anim, toStyleFetchedImage(from), toStyleFetchedIma
ge(to), progress); | |
| 260 | |
| 261 // FIXME: Support transitioning generated images as well. (gradients, etc.) | |
| 262 | |
| 263 return to; | |
| 264 } | |
| 265 | |
| 266 class AnimationPropertyWrapperBase { | 51 class AnimationPropertyWrapperBase { |
| 267 WTF_MAKE_NONCOPYABLE(AnimationPropertyWrapperBase); | 52 WTF_MAKE_NONCOPYABLE(AnimationPropertyWrapperBase); |
| 268 WTF_MAKE_FAST_ALLOCATED; | 53 WTF_MAKE_FAST_ALLOCATED; |
| 269 public: | 54 public: |
| 270 AnimationPropertyWrapperBase(CSSPropertyID prop) | 55 AnimationPropertyWrapperBase(CSSPropertyID prop) |
| 271 : m_prop(prop) | 56 : m_prop(prop) |
| 272 { | 57 { |
| 273 } | 58 } |
| 274 | 59 |
| 275 virtual ~AnimationPropertyWrapperBase() { } | 60 virtual ~AnimationPropertyWrapperBase() { } |
| 276 | 61 |
| 277 virtual bool isShorthandWrapper() const { return false; } | |
| 278 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const = 0; | 62 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const = 0; |
| 279 virtual void blend(const AnimationBase*, RenderStyle*, const RenderStyle*, c
onst RenderStyle*, double) const = 0; | |
| 280 | 63 |
| 281 CSSPropertyID property() const { return m_prop; } | 64 CSSPropertyID property() const { return m_prop; } |
| 282 | 65 |
| 283 virtual bool animationIsAccelerated() const { return false; } | |
| 284 | |
| 285 private: | 66 private: |
| 286 CSSPropertyID m_prop; | 67 CSSPropertyID m_prop; |
| 287 }; | 68 }; |
| 288 | 69 |
| 289 static int gPropertyWrapperMap[numCSSProperties]; | 70 static int gPropertyWrapperMap[numCSSProperties]; |
| 290 static const int cInvalidPropertyWrapperIndex = -1; | 71 static const int cInvalidPropertyWrapperIndex = -1; |
| 291 static Vector<AnimationPropertyWrapperBase*>* gPropertyWrappers = 0; | 72 static Vector<AnimationPropertyWrapperBase*>* gPropertyWrappers = 0; |
| 292 | 73 |
| 293 static void addPropertyWrapper(CSSPropertyID propertyID, AnimationPropertyWrappe
rBase* wrapper) | |
| 294 { | |
| 295 int propIndex = propertyID - firstCSSProperty; | |
| 296 | |
| 297 ASSERT(gPropertyWrapperMap[propIndex] == cInvalidPropertyWrapperIndex); | |
| 298 | |
| 299 unsigned wrapperIndex = gPropertyWrappers->size(); | |
| 300 gPropertyWrappers->append(wrapper); | |
| 301 gPropertyWrapperMap[propIndex] = wrapperIndex; | |
| 302 } | |
| 303 | |
| 304 static AnimationPropertyWrapperBase* wrapperForProperty(CSSPropertyID propertyID
) | 74 static AnimationPropertyWrapperBase* wrapperForProperty(CSSPropertyID propertyID
) |
| 305 { | 75 { |
| 306 int propIndex = propertyID - firstCSSProperty; | 76 int propIndex = propertyID - firstCSSProperty; |
| 307 if (propIndex >= 0 && propIndex < numCSSProperties) { | 77 if (propIndex >= 0 && propIndex < numCSSProperties) { |
| 308 int wrapperIndex = gPropertyWrapperMap[propIndex]; | 78 int wrapperIndex = gPropertyWrapperMap[propIndex]; |
| 309 if (wrapperIndex >= 0) | 79 if (wrapperIndex >= 0) |
| 310 return (*gPropertyWrappers)[wrapperIndex]; | 80 return (*gPropertyWrappers)[wrapperIndex]; |
| 311 } | 81 } |
| 312 return 0; | 82 return 0; |
| 313 } | 83 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 332 return (a->*m_getter)() == (b->*m_getter)(); | 102 return (a->*m_getter)() == (b->*m_getter)(); |
| 333 } | 103 } |
| 334 | 104 |
| 335 protected: | 105 protected: |
| 336 T (RenderStyle::*m_getter)() const; | 106 T (RenderStyle::*m_getter)() const; |
| 337 }; | 107 }; |
| 338 | 108 |
| 339 template <typename T> | 109 template <typename T> |
| 340 class PropertyWrapper : public PropertyWrapperGetter<T> { | 110 class PropertyWrapper : public PropertyWrapperGetter<T> { |
| 341 public: | 111 public: |
| 342 PropertyWrapper(CSSPropertyID prop, T (RenderStyle::*getter)() const, void (
RenderStyle::*setter)(T)) | 112 PropertyWrapper(CSSPropertyID prop, T (RenderStyle::*getter)() const) |
| 343 : PropertyWrapperGetter<T>(prop, getter) | 113 : PropertyWrapperGetter<T>(prop, getter) |
| 344 , m_setter(setter) | |
| 345 { | 114 { |
| 346 } | 115 } |
| 347 | |
| 348 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const | |
| 349 { | |
| 350 (dst->*m_setter)(blendFunc(anim, (a->*PropertyWrapperGetter<T>::m_getter
)(), (b->*PropertyWrapperGetter<T>::m_getter)(), progress)); | |
| 351 } | |
| 352 | |
| 353 protected: | |
| 354 void (RenderStyle::*m_setter)(T); | |
| 355 }; | |
| 356 | |
| 357 class NonNegativeLengthWrapper FINAL : public PropertyWrapper<Length> { | |
| 358 public: | |
| 359 NonNegativeLengthWrapper(CSSPropertyID prop, Length (RenderStyle::*getter)()
const, void (RenderStyle::*setter)(Length)) | |
| 360 : PropertyWrapper<Length>(prop, getter, setter) | |
| 361 { | |
| 362 } | |
| 363 | |
| 364 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 365 { | |
| 366 Length from = (a->*PropertyWrapperGetter<Length>::m_getter)(); | |
| 367 Length to = (b->*PropertyWrapperGetter<Length>::m_getter)(); | |
| 368 (dst->*PropertyWrapper<Length>::m_setter)(to.blend(from, progress, Value
RangeNonNegative)); | |
| 369 } | |
| 370 }; | 116 }; |
| 371 | 117 |
| 372 template <typename T> | 118 template <typename T> |
| 373 class RefCountedPropertyWrapper : public PropertyWrapperGetter<T*> { | 119 class RefCountedPropertyWrapper : public PropertyWrapperGetter<T*> { |
| 374 public: | 120 public: |
| 375 RefCountedPropertyWrapper(CSSPropertyID prop, T* (RenderStyle::*getter)() co
nst, void (RenderStyle::*setter)(PassRefPtr<T>)) | 121 RefCountedPropertyWrapper(CSSPropertyID prop, T* (RenderStyle::*getter)() co
nst) |
| 376 : PropertyWrapperGetter<T*>(prop, getter) | 122 : PropertyWrapperGetter<T*>(prop, getter) |
| 377 , m_setter(setter) | |
| 378 { | 123 { |
| 379 } | 124 } |
| 380 | 125 |
| 381 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const | |
| 382 { | |
| 383 (dst->*m_setter)(blendFunc(anim, (a->*PropertyWrapperGetter<T*>::m_gette
r)(), (b->*PropertyWrapperGetter<T*>::m_getter)(), progress)); | |
| 384 } | |
| 385 | |
| 386 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 126 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 387 { | 127 { |
| 388 if (a == b) | 128 if (a == b) |
| 389 return true; | 129 return true; |
| 390 if (!a || !b) | 130 if (!a || !b) |
| 391 return false; | 131 return false; |
| 392 const T* aValue = (a->*this->m_getter)(); | 132 const T* aValue = (a->*this->m_getter)(); |
| 393 const T* bValue = (b->*this->m_getter)(); | 133 const T* bValue = (b->*this->m_getter)(); |
| 394 if (aValue == bValue) | 134 if (aValue == bValue) |
| 395 return true; | 135 return true; |
| 396 if (!aValue || !bValue) | 136 if (!aValue || !bValue) |
| 397 return false; | 137 return false; |
| 398 return *aValue == *bValue; | 138 return *aValue == *bValue; |
| 399 } | 139 } |
| 400 | |
| 401 protected: | |
| 402 void (RenderStyle::*m_setter)(PassRefPtr<T>); | |
| 403 }; | 140 }; |
| 404 | 141 |
| 405 | 142 |
| 406 class PropertyWrapperClipPath : public RefCountedPropertyWrapper<ClipPathOperati
on> { | |
| 407 public: | |
| 408 PropertyWrapperClipPath(CSSPropertyID prop, ClipPathOperation* (RenderStyle:
:*getter)() const, void (RenderStyle::*setter)(PassRefPtr<ClipPathOperation>)) | |
| 409 : RefCountedPropertyWrapper<ClipPathOperation>(prop, getter, setter) | |
| 410 { | |
| 411 } | |
| 412 }; | |
| 413 | |
| 414 class PropertyWrapperShape : public RefCountedPropertyWrapper<ShapeValue> { | |
| 415 public: | |
| 416 PropertyWrapperShape(CSSPropertyID prop, ShapeValue* (RenderStyle::*getter)(
) const, void (RenderStyle::*setter)(PassRefPtr<ShapeValue>)) | |
| 417 : RefCountedPropertyWrapper<ShapeValue>(prop, getter, setter) | |
| 418 { | |
| 419 } | |
| 420 }; | |
| 421 | |
| 422 class StyleImagePropertyWrapper FINAL : public RefCountedPropertyWrapper<StyleIm
age> { | 143 class StyleImagePropertyWrapper FINAL : public RefCountedPropertyWrapper<StyleIm
age> { |
| 423 public: | 144 public: |
| 424 StyleImagePropertyWrapper(CSSPropertyID prop, StyleImage* (RenderStyle::*get
ter)() const, void (RenderStyle::*setter)(PassRefPtr<StyleImage>)) | 145 StyleImagePropertyWrapper(CSSPropertyID prop, StyleImage* (RenderStyle::*get
ter)() const) |
| 425 : RefCountedPropertyWrapper<StyleImage>(prop, getter, setter) | 146 : RefCountedPropertyWrapper<StyleImage>(prop, getter) |
| 426 { | 147 { |
| 427 } | 148 } |
| 428 | 149 |
| 429 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 150 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 430 { | 151 { |
| 431 // If the style pointers are the same, don't bother doing the test. | 152 // If the style pointers are the same, don't bother doing the test. |
| 432 // If either is null, return false. If both are null, return true. | 153 // If either is null, return false. If both are null, return true. |
| 433 if (a == b) | 154 if (a == b) |
| 434 return true; | 155 return true; |
| 435 if (!a || !b) | 156 if (!a || !b) |
| 436 return false; | 157 return false; |
| 437 | 158 |
| 438 StyleImage* imageA = (a->*m_getter)(); | 159 StyleImage* imageA = (a->*m_getter)(); |
| 439 StyleImage* imageB = (b->*m_getter)(); | 160 StyleImage* imageB = (b->*m_getter)(); |
| 440 return StyleImage::imagesEquivalent(imageA, imageB); | 161 return StyleImage::imagesEquivalent(imageA, imageB); |
| 441 } | 162 } |
| 442 }; | 163 }; |
| 443 | 164 |
| 444 class PropertyWrapperColor FINAL : public PropertyWrapperGetter<Color> { | |
| 445 public: | |
| 446 PropertyWrapperColor(CSSPropertyID prop, Color (RenderStyle::*getter)() cons
t, void (RenderStyle::*setter)(const Color&)) | |
| 447 : PropertyWrapperGetter<Color>(prop, getter) | |
| 448 , m_setter(setter) | |
| 449 { | |
| 450 } | |
| 451 | |
| 452 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 453 { | |
| 454 (dst->*m_setter)(blendFunc(anim, (a->*PropertyWrapperGetter<Color>::m_ge
tter)(), (b->*PropertyWrapperGetter<Color>::m_getter)(), progress)); | |
| 455 } | |
| 456 | |
| 457 protected: | |
| 458 void (RenderStyle::*m_setter)(const Color&); | |
| 459 }; | |
| 460 | |
| 461 class PropertyWrapperAcceleratedOpacity FINAL : public PropertyWrapper<float> { | |
| 462 public: | |
| 463 PropertyWrapperAcceleratedOpacity() | |
| 464 : PropertyWrapper<float>(CSSPropertyOpacity, &RenderStyle::opacity, &Ren
derStyle::setOpacity) | |
| 465 { | |
| 466 } | |
| 467 | |
| 468 virtual bool animationIsAccelerated() const OVERRIDE { return true; } | |
| 469 | |
| 470 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 471 { | |
| 472 float fromOpacity = a->opacity(); | |
| 473 | |
| 474 // This makes sure we put the object being animated into a RenderLayer d
uring the animation | |
| 475 dst->setOpacity(blendFunc(anim, (fromOpacity == 1) ? 0.999999f : fromOpa
city, b->opacity(), progress)); | |
| 476 } | |
| 477 }; | |
| 478 | |
| 479 class PropertyWrapperAcceleratedTransform FINAL : public PropertyWrapper<const T
ransformOperations&> { | |
| 480 public: | |
| 481 PropertyWrapperAcceleratedTransform() | |
| 482 : PropertyWrapper<const TransformOperations&>(CSSPropertyWebkitTransform
, &RenderStyle::transform, &RenderStyle::setTransform) | |
| 483 { | |
| 484 } | |
| 485 | |
| 486 virtual bool animationIsAccelerated() const OVERRIDE { return true; } | |
| 487 | |
| 488 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 489 { | |
| 490 dst->setTransform(blendFunc(anim, a->transform(), b->transform(), progre
ss)); | |
| 491 } | |
| 492 }; | |
| 493 | |
| 494 class PropertyWrapperAcceleratedFilter FINAL : public PropertyWrapper<const Filt
erOperations&> { | |
| 495 public: | |
| 496 PropertyWrapperAcceleratedFilter() | |
| 497 : PropertyWrapper<const FilterOperations&>(CSSPropertyWebkitFilter, &Ren
derStyle::filter, &RenderStyle::setFilter) | |
| 498 { | |
| 499 } | |
| 500 | |
| 501 virtual bool animationIsAccelerated() const OVERRIDE { return true; } | |
| 502 | |
| 503 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 504 { | |
| 505 dst->setFilter(blendFunc(anim, a->filter(), b->filter(), progress)); | |
| 506 } | |
| 507 }; | |
| 508 | |
| 509 class PropertyWrapperShadow FINAL : public AnimationPropertyWrapperBase { | 165 class PropertyWrapperShadow FINAL : public AnimationPropertyWrapperBase { |
| 510 public: | 166 public: |
| 511 PropertyWrapperShadow(CSSPropertyID prop, ShadowList* (RenderStyle::*getter)
() const, void (RenderStyle::*setter)(PassRefPtr<ShadowList>)) | 167 PropertyWrapperShadow(CSSPropertyID prop, ShadowList* (RenderStyle::*getter)
() const) |
| 512 : AnimationPropertyWrapperBase(prop) | 168 : AnimationPropertyWrapperBase(prop) |
| 513 , m_getter(getter) | 169 , m_getter(getter) |
| 514 , m_setter(setter) | |
| 515 { | 170 { |
| 516 } | 171 } |
| 517 | 172 |
| 518 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 173 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 519 { | 174 { |
| 520 const ShadowList* shadowA = (a->*m_getter)(); | 175 const ShadowList* shadowA = (a->*m_getter)(); |
| 521 const ShadowList* shadowB = (b->*m_getter)(); | 176 const ShadowList* shadowB = (b->*m_getter)(); |
| 522 if (shadowA == shadowB) | 177 if (shadowA == shadowB) |
| 523 return true; | 178 return true; |
| 524 if (shadowA && shadowB) | 179 if (shadowA && shadowB) |
| 525 return *shadowA == *shadowB; | 180 return *shadowA == *shadowB; |
| 526 return false; | 181 return false; |
| 527 } | 182 } |
| 528 | 183 |
| 529 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 530 { | |
| 531 (dst->*m_setter)(ShadowList::blend((a->*m_getter)(), (b->*m_getter)(), p
rogress)); | |
| 532 } | |
| 533 | |
| 534 ShadowList* (RenderStyle::*m_getter)() const; | 184 ShadowList* (RenderStyle::*m_getter)() const; |
| 535 void (RenderStyle::*m_setter)(PassRefPtr<ShadowList>); | |
| 536 }; | 185 }; |
| 537 | 186 |
| 538 class PropertyWrapperMaybeInvalidStyleColor FINAL : public AnimationPropertyWrap
perBase { | 187 class PropertyWrapperMaybeInvalidStyleColor FINAL : public AnimationPropertyWrap
perBase { |
| 539 public: | 188 public: |
| 540 PropertyWrapperMaybeInvalidStyleColor(CSSPropertyID prop, StyleColor (Render
Style::*getter)() const, void (RenderStyle::*setter)(const StyleColor&)) | 189 PropertyWrapperMaybeInvalidStyleColor(CSSPropertyID prop, StyleColor (Render
Style::*getter)() const) |
| 541 : AnimationPropertyWrapperBase(prop) | 190 : AnimationPropertyWrapperBase(prop) |
| 542 , m_getter(getter) | 191 , m_getter(getter) |
| 543 , m_setter(setter) | |
| 544 { | 192 { |
| 545 } | 193 } |
| 546 | 194 |
| 547 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 195 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 548 { | 196 { |
| 549 StyleColor fromColor = (a->*m_getter)(); | 197 StyleColor fromColor = (a->*m_getter)(); |
| 550 StyleColor toColor = (b->*m_getter)(); | 198 StyleColor toColor = (b->*m_getter)(); |
| 551 | 199 |
| 552 if (fromColor.isCurrentColor() && toColor.isCurrentColor()) | 200 if (fromColor.isCurrentColor() && toColor.isCurrentColor()) |
| 553 return true; | 201 return true; |
| 554 | 202 |
| 555 return fromColor.resolve(a->color()) == toColor.resolve(b->color()); | 203 return fromColor.resolve(a->color()) == toColor.resolve(b->color()); |
| 556 } | 204 } |
| 557 | 205 |
| 558 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 559 { | |
| 560 StyleColor fromColor = (a->*m_getter)(); | |
| 561 StyleColor toColor = (b->*m_getter)(); | |
| 562 | |
| 563 if (fromColor.isCurrentColor() && toColor.isCurrentColor()) | |
| 564 return; | |
| 565 | |
| 566 (dst->*m_setter)(blendFunc(anim, fromColor.resolve(a->color()), toColor.
resolve(b->color()), progress)); | |
| 567 } | |
| 568 | |
| 569 private: | 206 private: |
| 570 StyleColor (RenderStyle::*m_getter)() const; | 207 StyleColor (RenderStyle::*m_getter)() const; |
| 571 void (RenderStyle::*m_setter)(const StyleColor&); | |
| 572 }; | 208 }; |
| 573 | 209 |
| 574 | 210 |
| 575 class PropertyWrapperVisitedAffectedColor FINAL : public AnimationPropertyWrappe
rBase { | 211 class PropertyWrapperVisitedAffectedColor FINAL : public AnimationPropertyWrappe
rBase { |
| 576 public: | 212 public: |
| 577 PropertyWrapperVisitedAffectedColor(CSSPropertyID prop, Color (RenderStyle::
*getter)() const, void (RenderStyle::*setter)(const Color&), | 213 PropertyWrapperVisitedAffectedColor(CSSPropertyID prop, Color (RenderStyle::
*getter)() const, Color (RenderStyle::*visitedGetter)() const) |
| 578 Color (RenderStyle::*visitedGetter)() const, void (RenderStyle::*visited
Setter)(const Color&)) | |
| 579 : AnimationPropertyWrapperBase(prop) | 214 : AnimationPropertyWrapperBase(prop) |
| 580 , m_wrapper(adoptPtr(new PropertyWrapperColor(prop, getter, setter))) | 215 , m_wrapper(adoptPtr(new PropertyWrapper<Color>(prop, getter))) |
| 581 , m_visitedWrapper(adoptPtr(new PropertyWrapperColor(prop, visitedGetter
, visitedSetter))) | 216 , m_visitedWrapper(adoptPtr(new PropertyWrapper<Color>(prop, visitedGett
er))) |
| 582 { | 217 { |
| 583 } | 218 } |
| 584 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const | 219 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const |
| 585 { | 220 { |
| 586 return m_wrapper->equals(a, b) && m_visitedWrapper->equals(a, b); | 221 return m_wrapper->equals(a, b) && m_visitedWrapper->equals(a, b); |
| 587 } | 222 } |
| 588 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const | |
| 589 { | |
| 590 m_wrapper->blend(anim, dst, a, b, progress); | |
| 591 m_visitedWrapper->blend(anim, dst, a, b, progress); | |
| 592 } | |
| 593 | 223 |
| 594 private: | 224 private: |
| 595 OwnPtr<AnimationPropertyWrapperBase> m_wrapper; | 225 OwnPtr<AnimationPropertyWrapperBase> m_wrapper; |
| 596 OwnPtr<AnimationPropertyWrapperBase> m_visitedWrapper; | 226 OwnPtr<AnimationPropertyWrapperBase> m_visitedWrapper; |
| 597 }; | 227 }; |
| 598 | 228 |
| 599 class PropertyWrapperVisitedAffectedStyleColor FINAL : public AnimationPropertyW
rapperBase { | 229 class PropertyWrapperVisitedAffectedStyleColor FINAL : public AnimationPropertyW
rapperBase { |
| 600 public: | 230 public: |
| 601 PropertyWrapperVisitedAffectedStyleColor(CSSPropertyID prop, StyleColor (Ren
derStyle::*getter)() const, void (RenderStyle::*setter)(const StyleColor&), | 231 PropertyWrapperVisitedAffectedStyleColor(CSSPropertyID prop, StyleColor (Ren
derStyle::*getter)() const, StyleColor (RenderStyle::*visitedGetter)() const) |
| 602 StyleColor (RenderStyle::*visitedGetter)() const, void (RenderStyle::*vi
sitedSetter)(const StyleColor&)) | |
| 603 : AnimationPropertyWrapperBase(prop) | 232 : AnimationPropertyWrapperBase(prop) |
| 604 , m_wrapper(adoptPtr(new PropertyWrapperMaybeInvalidStyleColor(prop, get
ter, setter))) | 233 , m_wrapper(adoptPtr(new PropertyWrapperMaybeInvalidStyleColor(prop, get
ter))) |
| 605 , m_visitedWrapper(adoptPtr(new PropertyWrapperMaybeInvalidStyleColor(pr
op, visitedGetter, visitedSetter))) | 234 , m_visitedWrapper(adoptPtr(new PropertyWrapperMaybeInvalidStyleColor(pr
op, visitedGetter))) |
| 606 { | 235 { |
| 607 } | 236 } |
| 608 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 237 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 609 { | 238 { |
| 610 return m_wrapper->equals(a, b) && m_visitedWrapper->equals(a, b); | 239 return m_wrapper->equals(a, b) && m_visitedWrapper->equals(a, b); |
| 611 } | 240 } |
| 612 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 613 { | |
| 614 m_wrapper->blend(anim, dst, a, b, progress); | |
| 615 m_visitedWrapper->blend(anim, dst, a, b, progress); | |
| 616 } | |
| 617 | 241 |
| 618 private: | 242 private: |
| 619 OwnPtr<AnimationPropertyWrapperBase> m_wrapper; | 243 OwnPtr<AnimationPropertyWrapperBase> m_wrapper; |
| 620 OwnPtr<AnimationPropertyWrapperBase> m_visitedWrapper; | 244 OwnPtr<AnimationPropertyWrapperBase> m_visitedWrapper; |
| 621 }; | 245 }; |
| 622 | 246 |
| 623 // Wrapper base class for an animatable property in a FillLayer | 247 // Wrapper base class for an animatable property in a FillLayer |
| 624 class FillLayerAnimationPropertyWrapperBase { | 248 class FillLayerAnimationPropertyWrapperBase { |
| 625 public: | 249 public: |
| 626 FillLayerAnimationPropertyWrapperBase() | 250 FillLayerAnimationPropertyWrapperBase() |
| 627 { | 251 { |
| 628 } | 252 } |
| 629 | 253 |
| 630 virtual ~FillLayerAnimationPropertyWrapperBase() { } | 254 virtual ~FillLayerAnimationPropertyWrapperBase() { } |
| 631 | 255 |
| 632 virtual bool equals(const FillLayer*, const FillLayer*) const = 0; | 256 virtual bool equals(const FillLayer*, const FillLayer*) const = 0; |
| 633 virtual void blend(const AnimationBase*, FillLayer*, const FillLayer*, const
FillLayer*, double) const = 0; | |
| 634 }; | 257 }; |
| 635 | 258 |
| 636 template <typename T> | 259 template <typename T> |
| 637 class FillLayerPropertyWrapperGetter : public FillLayerAnimationPropertyWrapperB
ase { | 260 class FillLayerPropertyWrapperGetter : public FillLayerAnimationPropertyWrapperB
ase { |
| 638 WTF_MAKE_NONCOPYABLE(FillLayerPropertyWrapperGetter); | 261 WTF_MAKE_NONCOPYABLE(FillLayerPropertyWrapperGetter); |
| 639 public: | 262 public: |
| 640 FillLayerPropertyWrapperGetter(T (FillLayer::*getter)() const) | 263 FillLayerPropertyWrapperGetter(T (FillLayer::*getter)() const) |
| 641 : m_getter(getter) | 264 : m_getter(getter) |
| 642 { | 265 { |
| 643 } | 266 } |
| 644 | 267 |
| 645 virtual bool equals(const FillLayer* a, const FillLayer* b) const | 268 virtual bool equals(const FillLayer* a, const FillLayer* b) const |
| 646 { | 269 { |
| 647 // If the style pointers are the same, don't bother doing the test. | 270 // If the style pointers are the same, don't bother doing the test. |
| 648 // If either is null, return false. If both are null, return true. | 271 // If either is null, return false. If both are null, return true. |
| 649 if ((!a && !b) || a == b) | 272 if ((!a && !b) || a == b) |
| 650 return true; | 273 return true; |
| 651 if (!a || !b) | 274 if (!a || !b) |
| 652 return false; | 275 return false; |
| 653 return (a->*m_getter)() == (b->*m_getter)(); | 276 return (a->*m_getter)() == (b->*m_getter)(); |
| 654 } | 277 } |
| 655 | 278 |
| 656 protected: | 279 protected: |
| 657 T (FillLayer::*m_getter)() const; | 280 T (FillLayer::*m_getter)() const; |
| 658 }; | 281 }; |
| 659 | 282 |
| 660 template <typename T> | 283 template <typename T> |
| 661 class FillLayerPropertyWrapper FINAL : public FillLayerPropertyWrapperGetter<T>
{ | 284 class FillLayerPropertyWrapper FINAL : public FillLayerPropertyWrapperGetter<T>
{ |
| 662 public: | 285 public: |
| 663 FillLayerPropertyWrapper(T (FillLayer::*getter)() const, void (FillLayer::*s
etter)(T)) | 286 FillLayerPropertyWrapper(T (FillLayer::*getter)() const) |
| 664 : FillLayerPropertyWrapperGetter<T>(getter) | 287 : FillLayerPropertyWrapperGetter<T>(getter) |
| 665 , m_setter(setter) | |
| 666 { | 288 { |
| 667 } | 289 } |
| 668 | |
| 669 virtual void blend(const AnimationBase* anim, FillLayer* dst, const FillLaye
r* a, const FillLayer* b, double progress) const OVERRIDE | |
| 670 { | |
| 671 (dst->*m_setter)(blendFunc(anim, (a->*FillLayerPropertyWrapperGetter<T>:
:m_getter)(), (b->*FillLayerPropertyWrapperGetter<T>::m_getter)(), progress)); | |
| 672 } | |
| 673 | |
| 674 protected: | |
| 675 void (FillLayer::*m_setter)(T); | |
| 676 }; | 290 }; |
| 677 | 291 |
| 678 template <typename T> | 292 template <typename T> |
| 679 class FillLayerRefCountedPropertyWrapper : public FillLayerPropertyWrapperGetter
<T*> { | 293 class FillLayerRefCountedPropertyWrapper : public FillLayerPropertyWrapperGetter
<T*> { |
| 680 public: | 294 public: |
| 681 FillLayerRefCountedPropertyWrapper(T* (FillLayer::*getter)() const, void (Fi
llLayer::*setter)(PassRefPtr<T>)) | 295 FillLayerRefCountedPropertyWrapper(T* (FillLayer::*getter)() const) |
| 682 : FillLayerPropertyWrapperGetter<T*>(getter) | 296 : FillLayerPropertyWrapperGetter<T*>(getter) |
| 683 , m_setter(setter) | |
| 684 { | 297 { |
| 685 } | 298 } |
| 686 | |
| 687 virtual void blend(const AnimationBase* anim, FillLayer* dst, const FillLaye
r* a, const FillLayer* b, double progress) const | |
| 688 { | |
| 689 (dst->*m_setter)(blendFunc(anim, (a->*FillLayerPropertyWrapperGetter<T*>
::m_getter)(), (b->*FillLayerPropertyWrapperGetter<T*>::m_getter)(), progress)); | |
| 690 } | |
| 691 | |
| 692 protected: | |
| 693 void (FillLayer::*m_setter)(PassRefPtr<T>); | |
| 694 }; | 299 }; |
| 695 | 300 |
| 696 class FillLayerStyleImagePropertyWrapper FINAL : public FillLayerRefCountedPrope
rtyWrapper<StyleImage> { | 301 class FillLayerStyleImagePropertyWrapper FINAL : public FillLayerRefCountedPrope
rtyWrapper<StyleImage> { |
| 697 public: | 302 public: |
| 698 FillLayerStyleImagePropertyWrapper(StyleImage* (FillLayer::*getter)() const,
void (FillLayer::*setter)(PassRefPtr<StyleImage>)) | 303 FillLayerStyleImagePropertyWrapper(StyleImage* (FillLayer::*getter)() const) |
| 699 : FillLayerRefCountedPropertyWrapper<StyleImage>(getter, setter) | 304 : FillLayerRefCountedPropertyWrapper<StyleImage>(getter) |
| 700 { | 305 { |
| 701 } | 306 } |
| 702 | 307 |
| 703 virtual bool equals(const FillLayer* a, const FillLayer* b) const OVERRIDE | 308 virtual bool equals(const FillLayer* a, const FillLayer* b) const OVERRIDE |
| 704 { | 309 { |
| 705 // If the style pointers are the same, don't bother doing the test. | 310 // If the style pointers are the same, don't bother doing the test. |
| 706 // If either is null, return false. If both are null, return true. | 311 // If either is null, return false. If both are null, return true. |
| 707 if (a == b) | 312 if (a == b) |
| 708 return true; | 313 return true; |
| 709 if (!a || !b) | 314 if (!a || !b) |
| 710 return false; | 315 return false; |
| 711 | 316 |
| 712 StyleImage* imageA = (a->*m_getter)(); | 317 StyleImage* imageA = (a->*m_getter)(); |
| 713 StyleImage* imageB = (b->*m_getter)(); | 318 StyleImage* imageB = (b->*m_getter)(); |
| 714 return StyleImage::imagesEquivalent(imageA, imageB); | 319 return StyleImage::imagesEquivalent(imageA, imageB); |
| 715 } | 320 } |
| 716 }; | 321 }; |
| 717 | 322 |
| 718 | 323 |
| 719 class FillLayersPropertyWrapper FINAL : public AnimationPropertyWrapperBase { | 324 class FillLayersPropertyWrapper FINAL : public AnimationPropertyWrapperBase { |
| 720 public: | 325 public: |
| 721 typedef const FillLayer* (RenderStyle::*LayersGetter)() const; | 326 typedef const FillLayer* (RenderStyle::*LayersGetter)() const; |
| 722 typedef FillLayer* (RenderStyle::*LayersAccessor)(); | |
| 723 | 327 |
| 724 FillLayersPropertyWrapper(CSSPropertyID prop, LayersGetter getter, LayersAcc
essor accessor) | 328 FillLayersPropertyWrapper(CSSPropertyID prop, LayersGetter getter) |
| 725 : AnimationPropertyWrapperBase(prop) | 329 : AnimationPropertyWrapperBase(prop) |
| 726 , m_layersGetter(getter) | 330 , m_layersGetter(getter) |
| 727 , m_layersAccessor(accessor) | |
| 728 { | 331 { |
| 729 switch (prop) { | 332 switch (prop) { |
| 730 case CSSPropertyBackgroundPositionX: | 333 case CSSPropertyBackgroundPositionX: |
| 731 case CSSPropertyWebkitMaskPositionX: | 334 case CSSPropertyWebkitMaskPositionX: |
| 732 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<Length>(&F
illLayer::xPosition, &FillLayer::setXPosition); | 335 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<Length>(&F
illLayer::xPosition); |
| 733 break; | 336 break; |
| 734 case CSSPropertyBackgroundPositionY: | 337 case CSSPropertyBackgroundPositionY: |
| 735 case CSSPropertyWebkitMaskPositionY: | 338 case CSSPropertyWebkitMaskPositionY: |
| 736 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<Length>(&F
illLayer::yPosition, &FillLayer::setYPosition); | 339 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<Length>(&F
illLayer::yPosition); |
| 737 break; | 340 break; |
| 738 case CSSPropertyBackgroundSize: | 341 case CSSPropertyBackgroundSize: |
| 739 case CSSPropertyWebkitBackgroundSize: | 342 case CSSPropertyWebkitBackgroundSize: |
| 740 case CSSPropertyWebkitMaskSize: | 343 case CSSPropertyWebkitMaskSize: |
| 741 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<LengthSize
>(&FillLayer::sizeLength, &FillLayer::setSizeLength); | 344 m_fillLayerPropertyWrapper = new FillLayerPropertyWrapper<LengthSize
>(&FillLayer::sizeLength); |
| 742 break; | 345 break; |
| 743 case CSSPropertyBackgroundImage: | 346 case CSSPropertyBackgroundImage: |
| 744 m_fillLayerPropertyWrapper = new FillLayerStyleImagePropertyWrapper(
&FillLayer::image, &FillLayer::setImage); | 347 m_fillLayerPropertyWrapper = new FillLayerStyleImagePropertyWrapper(
&FillLayer::image); |
| 745 break; | 348 break; |
| 746 default: | 349 default: |
| 747 break; | 350 break; |
| 748 } | 351 } |
| 749 } | 352 } |
| 750 | 353 |
| 751 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 354 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 752 { | 355 { |
| 753 const FillLayer* fromLayer = (a->*m_layersGetter)(); | 356 const FillLayer* fromLayer = (a->*m_layersGetter)(); |
| 754 const FillLayer* toLayer = (b->*m_layersGetter)(); | 357 const FillLayer* toLayer = (b->*m_layersGetter)(); |
| 755 | 358 |
| 756 while (fromLayer && toLayer) { | 359 while (fromLayer && toLayer) { |
| 757 if (!m_fillLayerPropertyWrapper->equals(fromLayer, toLayer)) | 360 if (!m_fillLayerPropertyWrapper->equals(fromLayer, toLayer)) |
| 758 return false; | 361 return false; |
| 759 | 362 |
| 760 fromLayer = fromLayer->next(); | 363 fromLayer = fromLayer->next(); |
| 761 toLayer = toLayer->next(); | 364 toLayer = toLayer->next(); |
| 762 } | 365 } |
| 763 | 366 |
| 764 return true; | 367 return true; |
| 765 } | 368 } |
| 766 | 369 |
| 767 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 768 { | |
| 769 const FillLayer* aLayer = (a->*m_layersGetter)(); | |
| 770 const FillLayer* bLayer = (b->*m_layersGetter)(); | |
| 771 FillLayer* dstLayer = (dst->*m_layersAccessor)(); | |
| 772 | |
| 773 while (aLayer && bLayer && dstLayer) { | |
| 774 m_fillLayerPropertyWrapper->blend(anim, dstLayer, aLayer, bLayer, pr
ogress); | |
| 775 aLayer = aLayer->next(); | |
| 776 bLayer = bLayer->next(); | |
| 777 dstLayer = dstLayer->next(); | |
| 778 } | |
| 779 } | |
| 780 | |
| 781 private: | 370 private: |
| 782 FillLayerAnimationPropertyWrapperBase* m_fillLayerPropertyWrapper; | 371 FillLayerAnimationPropertyWrapperBase* m_fillLayerPropertyWrapper; |
| 783 | 372 |
| 784 LayersGetter m_layersGetter; | 373 LayersGetter m_layersGetter; |
| 785 LayersAccessor m_layersAccessor; | |
| 786 }; | |
| 787 | |
| 788 class ShorthandPropertyWrapper FINAL : public AnimationPropertyWrapperBase { | |
| 789 public: | |
| 790 ShorthandPropertyWrapper(CSSPropertyID property, const StylePropertyShorthan
d& shorthand) | |
| 791 : AnimationPropertyWrapperBase(property) | |
| 792 { | |
| 793 for (unsigned i = 0; i < shorthand.length(); ++i) { | |
| 794 AnimationPropertyWrapperBase* wrapper = wrapperForProperty(shorthand
.properties()[i]); | |
| 795 if (wrapper) | |
| 796 m_propertyWrappers.append(wrapper); | |
| 797 } | |
| 798 } | |
| 799 | |
| 800 virtual bool isShorthandWrapper() const OVERRIDE { return true; } | |
| 801 | |
| 802 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | |
| 803 { | |
| 804 Vector<AnimationPropertyWrapperBase*>::const_iterator end = m_propertyWr
appers.end(); | |
| 805 for (Vector<AnimationPropertyWrapperBase*>::const_iterator it = m_proper
tyWrappers.begin(); it != end; ++it) { | |
| 806 if (!(*it)->equals(a, b)) | |
| 807 return false; | |
| 808 } | |
| 809 return true; | |
| 810 } | |
| 811 | |
| 812 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 813 { | |
| 814 Vector<AnimationPropertyWrapperBase*>::const_iterator end = m_propertyWr
appers.end(); | |
| 815 for (Vector<AnimationPropertyWrapperBase*>::const_iterator it = m_proper
tyWrappers.begin(); it != end; ++it) | |
| 816 (*it)->blend(anim, dst, a, b, progress); | |
| 817 } | |
| 818 | |
| 819 const Vector<AnimationPropertyWrapperBase*> propertyWrappers() const { retur
n m_propertyWrappers; } | |
| 820 | |
| 821 private: | |
| 822 Vector<AnimationPropertyWrapperBase*> m_propertyWrappers; | |
| 823 }; | |
| 824 | |
| 825 class PropertyWrapperFlex FINAL : public AnimationPropertyWrapperBase { | |
| 826 public: | |
| 827 PropertyWrapperFlex() | |
| 828 : AnimationPropertyWrapperBase(CSSPropertyFlex) | |
| 829 { | |
| 830 } | |
| 831 | |
| 832 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | |
| 833 { | |
| 834 // If the style pointers are the same, don't bother doing the test. | |
| 835 // If either is null, return false. If both are null, return true. | |
| 836 if ((!a && !b) || a == b) | |
| 837 return true; | |
| 838 if (!a || !b) | |
| 839 return false; | |
| 840 | |
| 841 return a->flexBasis() == b->flexBasis() && a->flexGrow() == b->flexGrow(
) && a->flexShrink() == b->flexShrink(); | |
| 842 } | |
| 843 | |
| 844 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 845 { | |
| 846 dst->setFlexBasis(blendFunc(anim, a->flexBasis(), b->flexBasis(), progre
ss)); | |
| 847 dst->setFlexGrow(blendFunc(anim, a->flexGrow(), b->flexGrow(), progress)
); | |
| 848 dst->setFlexShrink(blendFunc(anim, a->flexShrink(), b->flexShrink(), pro
gress)); | |
| 849 } | |
| 850 }; | 374 }; |
| 851 | 375 |
| 852 class PropertyWrapperSVGPaint FINAL : public AnimationPropertyWrapperBase { | 376 class PropertyWrapperSVGPaint FINAL : public AnimationPropertyWrapperBase { |
| 853 public: | 377 public: |
| 854 PropertyWrapperSVGPaint(CSSPropertyID prop, const SVGPaint::SVGPaintType& (R
enderStyle::*paintTypeGetter)() const, Color (RenderStyle::*getter)() const, voi
d (RenderStyle::*setter)(const Color&)) | 378 PropertyWrapperSVGPaint(CSSPropertyID prop, const SVGPaint::SVGPaintType& (R
enderStyle::*paintTypeGetter)() const, Color (RenderStyle::*getter)() const) |
| 855 : AnimationPropertyWrapperBase(prop) | 379 : AnimationPropertyWrapperBase(prop) |
| 856 , m_paintTypeGetter(paintTypeGetter) | 380 , m_paintTypeGetter(paintTypeGetter) |
| 857 , m_getter(getter) | 381 , m_getter(getter) |
| 858 , m_setter(setter) | |
| 859 { | 382 { |
| 860 } | 383 } |
| 861 | 384 |
| 862 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 385 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 863 { | 386 { |
| 864 if ((a->*m_paintTypeGetter)() != (b->*m_paintTypeGetter)()) | 387 if ((a->*m_paintTypeGetter)() != (b->*m_paintTypeGetter)()) |
| 865 return false; | 388 return false; |
| 866 | 389 |
| 867 // We only support animations between SVGPaints that are pure Color valu
es. | 390 // We only support animations between SVGPaints that are pure Color valu
es. |
| 868 // For everything else we must return true for this method, otherwise | 391 // For everything else we must return true for this method, otherwise |
| 869 // we will try to animate between values forever. | 392 // we will try to animate between values forever. |
| 870 if ((a->*m_paintTypeGetter)() == SVGPaint::SVG_PAINTTYPE_RGBCOLOR) { | 393 if ((a->*m_paintTypeGetter)() == SVGPaint::SVG_PAINTTYPE_RGBCOLOR) { |
| 871 Color fromColor = (a->*m_getter)(); | 394 Color fromColor = (a->*m_getter)(); |
| 872 Color toColor = (b->*m_getter)(); | 395 Color toColor = (b->*m_getter)(); |
| 873 return fromColor == toColor; | 396 return fromColor == toColor; |
| 874 } | 397 } |
| 875 return true; | 398 return true; |
| 876 } | 399 } |
| 877 | 400 |
| 878 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const OVERRIDE | |
| 879 { | |
| 880 if ((a->*m_paintTypeGetter)() != SVGPaint::SVG_PAINTTYPE_RGBCOLOR | |
| 881 || (b->*m_paintTypeGetter)() != SVGPaint::SVG_PAINTTYPE_RGBCOLOR) | |
| 882 return; | |
| 883 | |
| 884 Color fromColor = (a->*m_getter)(); | |
| 885 Color toColor = (b->*m_getter)(); | |
| 886 | |
| 887 (dst->*m_setter)(blendFunc(anim, fromColor, toColor, progress)); | |
| 888 } | |
| 889 | |
| 890 private: | 401 private: |
| 891 const SVGPaint::SVGPaintType& (RenderStyle::*m_paintTypeGetter)() const; | 402 const SVGPaint::SVGPaintType& (RenderStyle::*m_paintTypeGetter)() const; |
| 892 Color (RenderStyle::*m_getter)() const; | 403 Color (RenderStyle::*m_getter)() const; |
| 893 void (RenderStyle::*m_setter)(const Color&); | |
| 894 }; | 404 }; |
| 895 | 405 |
| 896 template <typename T> | 406 template <typename T> |
| 897 class RefCountedSVGPropertyWrapper : public AnimationPropertyWrapperBase { | 407 class RefCountedSVGPropertyWrapper : public AnimationPropertyWrapperBase { |
| 898 public: | 408 public: |
| 899 RefCountedSVGPropertyWrapper(CSSPropertyID prop, PassRefPtr<T> (RenderStyle:
:*getter)() const, void (RenderStyle::*setter)(PassRefPtr<T>)) | 409 RefCountedSVGPropertyWrapper(CSSPropertyID prop, PassRefPtr<T> (RenderStyle:
:*getter)() const) |
| 900 : AnimationPropertyWrapperBase(prop) | 410 : AnimationPropertyWrapperBase(prop) |
| 901 , m_getter(getter) | 411 , m_getter(getter) |
| 902 , m_setter(setter) | |
| 903 { | 412 { |
| 904 } | 413 } |
| 905 | 414 |
| 906 virtual void blend(const AnimationBase* anim, RenderStyle* dst, const Render
Style* a, const RenderStyle* b, double progress) const | |
| 907 { | |
| 908 (dst->*m_setter)(blendFunc(anim, (a->*m_getter)(), (b->*m_getter)(), pro
gress)); | |
| 909 } | |
| 910 | |
| 911 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE | 415 virtual bool equals(const RenderStyle* a, const RenderStyle* b) const OVERRI
DE |
| 912 { | 416 { |
| 913 if (a == b) | 417 if (a == b) |
| 914 return true; | 418 return true; |
| 915 if (!a || !b) | 419 if (!a || !b) |
| 916 return false; | 420 return false; |
| 917 RefPtr<T> aValue = (a->*this->m_getter)(); | 421 RefPtr<T> aValue = (a->*this->m_getter)(); |
| 918 RefPtr<T> bValue = (b->*this->m_getter)(); | 422 RefPtr<T> bValue = (b->*this->m_getter)(); |
| 919 if (aValue == bValue) | 423 if (aValue == bValue) |
| 920 return true; | 424 return true; |
| 921 if (!aValue || !bValue) | 425 if (!aValue || !bValue) |
| 922 return false; | 426 return false; |
| 923 return *aValue == *bValue; | 427 return *aValue == *bValue; |
| 924 } | 428 } |
| 925 | 429 |
| 926 protected: | 430 protected: |
| 927 PassRefPtr<T> (RenderStyle::*m_getter)() const; | 431 PassRefPtr<T> (RenderStyle::*m_getter)() const; |
| 928 void (RenderStyle::*m_setter)(PassRefPtr<T>); | |
| 929 }; | 432 }; |
| 930 | 433 |
| 931 static void addShorthandProperties() | |
| 932 { | |
| 933 static const CSSPropertyID animatableShorthandProperties[] = { | |
| 934 CSSPropertyBackground, // for background-color, background-position, bac
kground-image | |
| 935 CSSPropertyBackgroundPosition, | |
| 936 CSSPropertyFont, // for font-size, font-weight | |
| 937 CSSPropertyWebkitMask, // for mask-position | |
| 938 CSSPropertyWebkitMaskPosition, | |
| 939 CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, C
SSPropertyBorderLeft, | |
| 940 CSSPropertyBorderColor, | |
| 941 CSSPropertyBorderRadius, | |
| 942 CSSPropertyBorderWidth, | |
| 943 CSSPropertyBorder, | |
| 944 CSSPropertyBorderImage, | |
| 945 CSSPropertyBorderSpacing, | |
| 946 CSSPropertyListStyle, // for list-style-image | |
| 947 CSSPropertyMargin, | |
| 948 CSSPropertyOutline, | |
| 949 CSSPropertyPadding, | |
| 950 CSSPropertyWebkitTextStroke, | |
| 951 CSSPropertyWebkitColumnRule, | |
| 952 CSSPropertyWebkitBorderRadius, | |
| 953 CSSPropertyWebkitTransformOrigin | |
| 954 }; | |
| 955 | |
| 956 for (size_t i = 0; i < WTF_ARRAY_LENGTH(animatableShorthandProperties); ++i)
{ | |
| 957 CSSPropertyID propertyID = animatableShorthandProperties[i]; | |
| 958 StylePropertyShorthand shorthand = shorthandForProperty(propertyID); | |
| 959 if (shorthand.length() > 0) | |
| 960 addPropertyWrapper(propertyID, new ShorthandPropertyWrapper(property
ID, shorthand)); | |
| 961 } | |
| 962 } | |
| 963 | |
| 964 void CSSPropertyAnimation::ensurePropertyMap() | 434 void CSSPropertyAnimation::ensurePropertyMap() |
| 965 { | 435 { |
| 966 // FIXME: This data is never destroyed. Maybe we should ref count it and tos
s it when the last AnimationController is destroyed? | 436 // FIXME: This data is never destroyed. Maybe we should ref count it and tos
s it when the last AnimationController is destroyed? |
| 967 if (gPropertyWrappers) | 437 if (gPropertyWrappers) |
| 968 return; | 438 return; |
| 969 | 439 |
| 970 gPropertyWrappers = new Vector<AnimationPropertyWrapperBase*>(); | 440 gPropertyWrappers = new Vector<AnimationPropertyWrapperBase*>(); |
| 971 | 441 |
| 972 // build the list of property wrappers to do the comparisons and blends | 442 // build the list of property wrappers to do the comparisons and blends |
| 973 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLeft, &Rend
erStyle::left, &RenderStyle::setLeft)); | 443 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLeft, &Rend
erStyle::left)); |
| 974 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyRight, &Ren
derStyle::right, &RenderStyle::setRight)); | 444 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyRight, &Ren
derStyle::right)); |
| 975 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyTop, &Rende
rStyle::top, &RenderStyle::setTop)); | 445 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyTop, &Rende
rStyle::top)); |
| 976 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyBottom, &Re
nderStyle::bottom, &RenderStyle::setBottom)); | 446 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyBottom, &Re
nderStyle::bottom)); |
| 977 | 447 |
| 978 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWidth, &Ren
derStyle::width, &RenderStyle::setWidth)); | 448 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWidth, &Ren
derStyle::width)); |
| 979 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMinWidth, &
RenderStyle::minWidth, &RenderStyle::setMinWidth)); | 449 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMinWidth, &
RenderStyle::minWidth)); |
| 980 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMaxWidth, &
RenderStyle::maxWidth, &RenderStyle::setMaxWidth)); | 450 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMaxWidth, &
RenderStyle::maxWidth)); |
| 981 | 451 |
| 982 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyHeight, &Re
nderStyle::height, &RenderStyle::setHeight)); | 452 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyHeight, &Re
nderStyle::height)); |
| 983 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMinHeight,
&RenderStyle::minHeight, &RenderStyle::setMinHeight)); | 453 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMinHeight,
&RenderStyle::minHeight)); |
| 984 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMaxHeight,
&RenderStyle::maxHeight, &RenderStyle::setMaxHeight)); | 454 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMaxHeight,
&RenderStyle::maxHeight)); |
| 985 | 455 |
| 986 if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled()) | 456 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderLef
tWidth, &RenderStyle::borderLeftWidth)); |
| 987 gPropertyWrappers->append(new PropertyWrapperFlex()); | 457 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderRig
htWidth, &RenderStyle::borderRightWidth)); |
| 458 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderTop
Width, &RenderStyle::borderTopWidth)); |
| 459 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderBot
tomWidth, &RenderStyle::borderBottomWidth)); |
| 460 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginLeft,
&RenderStyle::marginLeft)); |
| 461 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginRight
, &RenderStyle::marginRight)); |
| 462 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginTop,
&RenderStyle::marginTop)); |
| 463 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginBotto
m, &RenderStyle::marginBottom)); |
| 464 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingLeft
, &RenderStyle::paddingLeft)); |
| 465 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingRigh
t, &RenderStyle::paddingRight)); |
| 466 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingTop,
&RenderStyle::paddingTop)); |
| 467 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingBott
om, &RenderStyle::paddingBottom)); |
| 468 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedColor(CSSPropert
yColor, &RenderStyle::color, &RenderStyle::visitedLinkColor)); |
| 988 | 469 |
| 989 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderLef
tWidth, &RenderStyle::borderLeftWidth, &RenderStyle::setBorderLeftWidth)); | 470 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBackgroundColor, &RenderStyle::backgroundColor, &RenderStyle::visitedLinkB
ackgroundColor)); |
| 990 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderRig
htWidth, &RenderStyle::borderRightWidth, &RenderStyle::setBorderRightWidth)); | |
| 991 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderTop
Width, &RenderStyle::borderTopWidth, &RenderStyle::setBorderTopWidth)); | |
| 992 gPropertyWrappers->append(new PropertyWrapper<unsigned>(CSSPropertyBorderBot
tomWidth, &RenderStyle::borderBottomWidth, &RenderStyle::setBorderBottomWidth)); | |
| 993 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginLeft,
&RenderStyle::marginLeft, &RenderStyle::setMarginLeft)); | |
| 994 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginRight
, &RenderStyle::marginRight, &RenderStyle::setMarginRight)); | |
| 995 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginTop,
&RenderStyle::marginTop, &RenderStyle::setMarginTop)); | |
| 996 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyMarginBotto
m, &RenderStyle::marginBottom, &RenderStyle::setMarginBottom)); | |
| 997 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingLeft
, &RenderStyle::paddingLeft, &RenderStyle::setPaddingLeft)); | |
| 998 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingRigh
t, &RenderStyle::paddingRight, &RenderStyle::setPaddingRight)); | |
| 999 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingTop,
&RenderStyle::paddingTop, &RenderStyle::setPaddingTop)); | |
| 1000 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyPaddingBott
om, &RenderStyle::paddingBottom, &RenderStyle::setPaddingBottom)); | |
| 1001 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedColor(CSSPropert
yColor, &RenderStyle::color, &RenderStyle::setColor, &RenderStyle::visitedLinkCo
lor, &RenderStyle::setVisitedLinkColor)); | |
| 1002 | 471 |
| 1003 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBackgroundColor, &RenderStyle::backgroundColor, &RenderStyle::setBackgroun
dColor, &RenderStyle::visitedLinkBackgroundColor, &RenderStyle::setVisitedLinkBa
ckgroundColor)); | 472 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dImage, &RenderStyle::backgroundLayers)); |
| 473 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyListStyle
Image, &RenderStyle::listStyleImage)); |
| 474 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyWebkitMas
kImage, &RenderStyle::maskImage)); |
| 1004 | 475 |
| 1005 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dImage, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayers)); | 476 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyBorderIma
geSource, &RenderStyle::borderImageSource)); |
| 1006 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyListStyle
Image, &RenderStyle::listStyleImage, &RenderStyle::setListStyleImage)); | 477 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyBorderIm
ageSlice, &RenderStyle::borderImageSlices)); |
| 1007 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyWebkitMas
kImage, &RenderStyle::maskImage, &RenderStyle::setMaskImage)); | 478 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyBorderImageWidth, &RenderStyle::borderImageWidth)); |
| 479 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyBorderImageOutset, &RenderStyle::borderImageOutset)); |
| 1008 | 480 |
| 1009 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyBorderIma
geSource, &RenderStyle::borderImageSource, &RenderStyle::setBorderImageSource)); | 481 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyWebkitMas
kBoxImageSource, &RenderStyle::maskBoxImageSource)); |
| 1010 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyBorderIm
ageSlice, &RenderStyle::borderImageSlices, &RenderStyle::setBorderImageSlices)); | 482 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyWebkitMa
skBoxImageSlice, &RenderStyle::maskBoxImageSlices)); |
| 1011 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyBorderImageWidth, &RenderStyle::borderImageWidth, &RenderStyle::setBor
derImageWidth)); | 483 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyWebkitMaskBoxImageWidth, &RenderStyle::maskBoxImageWidth)); |
| 1012 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyBorderImageOutset, &RenderStyle::borderImageOutset, &RenderStyle::setB
orderImageOutset)); | 484 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyWebkitMaskBoxImageOutset, &RenderStyle::maskBoxImageOutset)); |
| 1013 | 485 |
| 1014 gPropertyWrappers->append(new StyleImagePropertyWrapper(CSSPropertyWebkitMas
kBoxImageSource, &RenderStyle::maskBoxImageSource, &RenderStyle::setMaskBoxImage
Source)); | 486 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dPositionX, &RenderStyle::backgroundLayers)); |
| 1015 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyWebkitMa
skBoxImageSlice, &RenderStyle::maskBoxImageSlices, &RenderStyle::setMaskBoxImage
Slices)); | 487 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dPositionY, &RenderStyle::backgroundLayers)); |
| 1016 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyWebkitMaskBoxImageWidth, &RenderStyle::maskBoxImageWidth, &RenderStyle
::setMaskBoxImageWidth)); | 488 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dSize, &RenderStyle::backgroundLayers)); |
| 1017 gPropertyWrappers->append(new PropertyWrapper<const BorderImageLengthBox&>(C
SSPropertyWebkitMaskBoxImageOutset, &RenderStyle::maskBoxImageOutset, &RenderSty
le::setMaskBoxImageOutset)); | 489 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitBac
kgroundSize, &RenderStyle::backgroundLayers)); |
| 1018 | 490 |
| 1019 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dPositionX, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayers
)); | 491 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kPositionX, &RenderStyle::maskLayers)); |
| 1020 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dPositionY, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayers
)); | 492 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kPositionY, &RenderStyle::maskLayers)); |
| 1021 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyBackgroun
dSize, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayers)); | 493 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kSize, &RenderStyle::maskLayers)); |
| 1022 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitBac
kgroundSize, &RenderStyle::backgroundLayers, &RenderStyle::accessBackgroundLayer
s)); | |
| 1023 | 494 |
| 1024 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kPositionX, &RenderStyle::maskLayers, &RenderStyle::accessMaskLayers)); | 495 gPropertyWrappers->append(new PropertyWrapper<LengthPoint>(CSSPropertyObject
Position, &RenderStyle::objectPosition)); |
| 1025 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kPositionY, &RenderStyle::maskLayers, &RenderStyle::accessMaskLayers)); | |
| 1026 gPropertyWrappers->append(new FillLayersPropertyWrapper(CSSPropertyWebkitMas
kSize, &RenderStyle::maskLayers, &RenderStyle::accessMaskLayers)); | |
| 1027 | |
| 1028 gPropertyWrappers->append(new PropertyWrapper<LengthPoint>(CSSPropertyObject
Position, &RenderStyle::objectPosition, &RenderStyle::setObjectPosition)); | |
| 1029 | 496 |
| 1030 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFontSize, | 497 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFontSize, |
| 1031 // Must pass a specified size to setFontSize if Text Autosizing is enabl
ed, but a computed size | 498 // Must pass a specified size to setFontSize if Text Autosizing is enabl
ed, but a computed size |
| 1032 // if text zoom is enabled (if neither is enabled it's irrelevant as the
y're probably the same). | 499 // if text zoom is enabled (if neither is enabled it's irrelevant as the
y're probably the same). |
| 1033 // FIXME: Should we introduce an option to pass the computed font size h
ere, allowing consumers to | 500 // FIXME: Should we introduce an option to pass the computed font size h
ere, allowing consumers to |
| 1034 // enable text zoom rather than Text Autosizing? See http://crbug.com/22
7545. | 501 // enable text zoom rather than Text Autosizing? See http://crbug.com/22
7545. |
| 1035 &RenderStyle::specifiedFontSize, | 502 &RenderStyle::specifiedFontSize)); |
| 1036 &RenderStyle::setFontSize)); | 503 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWeb
kitColumnRuleWidth, &RenderStyle::columnRuleWidth)); |
| 1037 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWeb
kitColumnRuleWidth, &RenderStyle::columnRuleWidth, &RenderStyle::setColumnRuleWi
dth)); | 504 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitColumn
Gap, &RenderStyle::columnGap)); |
| 1038 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitColumn
Gap, &RenderStyle::columnGap, &RenderStyle::setColumnGap)); | 505 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWeb
kitColumnCount, &RenderStyle::columnCount)); |
| 1039 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyWeb
kitColumnCount, &RenderStyle::columnCount, &RenderStyle::setColumnCount)); | 506 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitColumn
Width, &RenderStyle::columnWidth)); |
| 1040 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitColumn
Width, &RenderStyle::columnWidth, &RenderStyle::setColumnWidth)); | 507 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorder
HorizontalSpacing, &RenderStyle::horizontalBorderSpacing)); |
| 1041 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorder
HorizontalSpacing, &RenderStyle::horizontalBorderSpacing, &RenderStyle::setHoriz
ontalBorderSpacing)); | 508 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorder
VerticalSpacing, &RenderStyle::verticalBorderSpacing)); |
| 1042 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWebkitBorder
VerticalSpacing, &RenderStyle::verticalBorderSpacing, &RenderStyle::setVerticalB
orderSpacing)); | 509 gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyZIndex, &Rende
rStyle::zIndex)); |
| 1043 gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyZIndex, &Rende
rStyle::zIndex, &RenderStyle::setZIndex)); | 510 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyOrphans, &Re
nderStyle::orphans)); |
| 1044 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyOrphans, &Re
nderStyle::orphans, &RenderStyle::setOrphans)); | 511 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWidows, &Ren
derStyle::widows)); |
| 1045 gPropertyWrappers->append(new PropertyWrapper<short>(CSSPropertyWidows, &Ren
derStyle::widows, &RenderStyle::setWidows)); | 512 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLineHeight,
&RenderStyle::specifiedLineHeight)); |
| 1046 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyLineHeight,
&RenderStyle::specifiedLineHeight, &RenderStyle::setLineHeight)); | 513 gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyOutlineOffset,
&RenderStyle::outlineOffset)); |
| 1047 gPropertyWrappers->append(new PropertyWrapper<int>(CSSPropertyOutlineOffset,
&RenderStyle::outlineOffset, &RenderStyle::setOutlineOffset)); | 514 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyOut
lineWidth, &RenderStyle::outlineWidth)); |
| 1048 gPropertyWrappers->append(new PropertyWrapper<unsigned short>(CSSPropertyOut
lineWidth, &RenderStyle::outlineWidth, &RenderStyle::setOutlineWidth)); | 515 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyLetterSpacin
g, &RenderStyle::letterSpacing)); |
| 1049 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyLetterSpacin
g, &RenderStyle::letterSpacing, &RenderStyle::setLetterSpacing)); | 516 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWordSpacing,
&RenderStyle::wordSpacing)); |
| 1050 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWordSpacing,
&RenderStyle::wordSpacing, &RenderStyle::setWordSpacing)); | 517 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyTextIndent,
&RenderStyle::textIndent)); |
| 1051 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyTextIndent,
&RenderStyle::textIndent, &RenderStyle::setTextIndent)); | |
| 1052 | 518 |
| 1053 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitPerspe
ctive, &RenderStyle::perspective, &RenderStyle::setPerspective)); | 519 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitPerspe
ctive, &RenderStyle::perspective)); |
| 1054 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitPersp
ectiveOriginX, &RenderStyle::perspectiveOriginX, &RenderStyle::setPerspectiveOri
ginX)); | 520 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitPersp
ectiveOriginX, &RenderStyle::perspectiveOriginX)); |
| 1055 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitPersp
ectiveOriginY, &RenderStyle::perspectiveOriginY, &RenderStyle::setPerspectiveOri
ginY)); | 521 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitPersp
ectiveOriginY, &RenderStyle::perspectiveOriginY)); |
| 1056 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitTrans
formOriginX, &RenderStyle::transformOriginX, &RenderStyle::setTransformOriginX))
; | 522 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitTrans
formOriginX, &RenderStyle::transformOriginX)); |
| 1057 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitTrans
formOriginY, &RenderStyle::transformOriginY, &RenderStyle::setTransformOriginY))
; | 523 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyWebkitTrans
formOriginY, &RenderStyle::transformOriginY)); |
| 1058 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitTransf
ormOriginZ, &RenderStyle::transformOriginZ, &RenderStyle::setTransformOriginZ)); | 524 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyWebkitTransf
ormOriginZ, &RenderStyle::transformOriginZ)); |
| 1059 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderT
opLeftRadius, &RenderStyle::borderTopLeftRadius, &RenderStyle::setBorderTopLeftR
adius)); | 525 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderT
opLeftRadius, &RenderStyle::borderTopLeftRadius)); |
| 1060 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderT
opRightRadius, &RenderStyle::borderTopRightRadius, &RenderStyle::setBorderTopRig
htRadius)); | 526 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderT
opRightRadius, &RenderStyle::borderTopRightRadius)); |
| 1061 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderB
ottomLeftRadius, &RenderStyle::borderBottomLeftRadius, &RenderStyle::setBorderBo
ttomLeftRadius)); | 527 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderB
ottomLeftRadius, &RenderStyle::borderBottomLeftRadius)); |
| 1062 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderB
ottomRightRadius, &RenderStyle::borderBottomRightRadius, &RenderStyle::setBorder
BottomRightRadius)); | 528 gPropertyWrappers->append(new PropertyWrapper<LengthSize>(CSSPropertyBorderB
ottomRightRadius, &RenderStyle::borderBottomRightRadius)); |
| 1063 gPropertyWrappers->append(new PropertyWrapper<EVisibility>(CSSPropertyVisibi
lity, &RenderStyle::visibility, &RenderStyle::setVisibility)); | 529 gPropertyWrappers->append(new PropertyWrapper<EVisibility>(CSSPropertyVisibi
lity, &RenderStyle::visibility)); |
| 1064 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyZoom, &Rende
rStyle::zoom, &RenderStyle::setZoomWithoutReturnValue)); | 530 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyZoom, &Rende
rStyle::zoom)); |
| 1065 | 531 |
| 1066 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyClip, &R
enderStyle::clip, &RenderStyle::setClip)); | 532 gPropertyWrappers->append(new PropertyWrapper<LengthBox>(CSSPropertyClip, &R
enderStyle::clip)); |
| 1067 | 533 |
| 1068 gPropertyWrappers->append(new PropertyWrapperAcceleratedOpacity()); | 534 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyOpacity, &Re
nderStyle::opacity)); |
| 1069 gPropertyWrappers->append(new PropertyWrapperAcceleratedTransform()); | 535 gPropertyWrappers->append(new PropertyWrapper<const TransformOperations&>(CS
SPropertyWebkitTransform, &RenderStyle::transform)); |
| 1070 gPropertyWrappers->append(new PropertyWrapperAcceleratedFilter()); | 536 gPropertyWrappers->append(new PropertyWrapper<const FilterOperations&>(CSSPr
opertyWebkitFilter, &RenderStyle::filter)); |
| 1071 | 537 |
| 1072 gPropertyWrappers->append(new PropertyWrapperClipPath(CSSPropertyWebkitClipP
ath, &RenderStyle::clipPath, &RenderStyle::setClipPath)); | 538 gPropertyWrappers->append(new RefCountedPropertyWrapper<ClipPathOperation>(C
SSPropertyWebkitClipPath, &RenderStyle::clipPath)); |
| 1073 | 539 |
| 1074 gPropertyWrappers->append(new PropertyWrapperShape(CSSPropertyShapeInside, &
RenderStyle::shapeInside, &RenderStyle::setShapeInside)); | 540 gPropertyWrappers->append(new RefCountedPropertyWrapper<ShapeValue>(CSSPrope
rtyShapeInside, &RenderStyle::shapeInside)); |
| 1075 gPropertyWrappers->append(new PropertyWrapperShape(CSSPropertyShapeOutside,
&RenderStyle::shapeOutside, &RenderStyle::setShapeOutside)); | 541 gPropertyWrappers->append(new RefCountedPropertyWrapper<ShapeValue>(CSSPrope
rtyShapeOutside, &RenderStyle::shapeOutside)); |
| 1076 gPropertyWrappers->append(new NonNegativeLengthWrapper(CSSPropertyShapeMargi
n, &RenderStyle::shapeMargin, &RenderStyle::setShapeMargin)); | 542 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyShapeMargin
, &RenderStyle::shapeMargin)); |
| 1077 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyShapeImageTh
reshold, &RenderStyle::shapeImageThreshold, &RenderStyle::setShapeImageThreshold
)); | 543 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyShapeImageTh
reshold, &RenderStyle::shapeImageThreshold)); |
| 1078 | 544 |
| 1079 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyWebkitColumnRuleColor, &RenderStyle::columnRuleColor, &RenderStyle::setCol
umnRuleColor, &RenderStyle::visitedLinkColumnRuleColor, &RenderStyle::setVisited
LinkColumnRuleColor)); | 545 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyWebkitColumnRuleColor, &RenderStyle::columnRuleColor, &RenderStyle::visite
dLinkColumnRuleColor)); |
| 1080 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyWebkitTextStrokeColor, &RenderStyle::textStrokeColor, &RenderStyle::setTex
tStrokeColor, &RenderStyle::visitedLinkTextStrokeColor, &RenderStyle::setVisited
LinkTextStrokeColor)); | 546 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyWebkitTextStrokeColor, &RenderStyle::textStrokeColor, &RenderStyle::visite
dLinkTextStrokeColor)); |
| 1081 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderLeftColor, &RenderStyle::borderLeftColor, &RenderStyle::setBorderLef
tColor, &RenderStyle::visitedLinkBorderLeftColor, &RenderStyle::setVisitedLinkBo
rderLeftColor)); | 547 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderLeftColor, &RenderStyle::borderLeftColor, &RenderStyle::visitedLinkB
orderLeftColor)); |
| 1082 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderRightColor, &RenderStyle::borderRightColor, &RenderStyle::setBorderR
ightColor, &RenderStyle::visitedLinkBorderRightColor, &RenderStyle::setVisitedLi
nkBorderRightColor)); | 548 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderRightColor, &RenderStyle::borderRightColor, &RenderStyle::visitedLin
kBorderRightColor)); |
| 1083 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderTopColor, &RenderStyle::borderTopColor, &RenderStyle::setBorderTopCo
lor, &RenderStyle::visitedLinkBorderTopColor, &RenderStyle::setVisitedLinkBorder
TopColor)); | 549 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderTopColor, &RenderStyle::borderTopColor, &RenderStyle::visitedLinkBor
derTopColor)); |
| 1084 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderBottomColor, &RenderStyle::borderBottomColor, &RenderStyle::setBorde
rBottomColor, &RenderStyle::visitedLinkBorderBottomColor, &RenderStyle::setVisit
edLinkBorderBottomColor)); | 550 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyBorderBottomColor, &RenderStyle::borderBottomColor, &RenderStyle::visitedL
inkBorderBottomColor)); |
| 1085 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyOutlineColor, &RenderStyle::outlineColor, &RenderStyle::setOutlineColor, &
RenderStyle::visitedLinkOutlineColor, &RenderStyle::setVisitedLinkOutlineColor))
; | 551 gPropertyWrappers->append(new PropertyWrapperVisitedAffectedStyleColor(CSSPr
opertyOutlineColor, &RenderStyle::outlineColor, &RenderStyle::visitedLinkOutline
Color)); |
| 1086 | 552 |
| 1087 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyBoxShadow, &R
enderStyle::boxShadow, &RenderStyle::setBoxShadow)); | 553 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyBoxShadow, &R
enderStyle::boxShadow)); |
| 1088 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyWebkitBoxShad
ow, &RenderStyle::boxShadow, &RenderStyle::setBoxShadow)); | 554 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyWebkitBoxShad
ow, &RenderStyle::boxShadow)); |
| 1089 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyTextShadow, &
RenderStyle::textShadow, &RenderStyle::setTextShadow)); | 555 gPropertyWrappers->append(new PropertyWrapperShadow(CSSPropertyTextShadow, &
RenderStyle::textShadow)); |
| 1090 | 556 |
| 1091 gPropertyWrappers->append(new PropertyWrapperSVGPaint(CSSPropertyFill, &Rend
erStyle::fillPaintType, &RenderStyle::fillPaintColor, &RenderStyle::setFillPaint
Color)); | 557 gPropertyWrappers->append(new PropertyWrapperSVGPaint(CSSPropertyFill, &Rend
erStyle::fillPaintType, &RenderStyle::fillPaintColor)); |
| 1092 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFillOpacity,
&RenderStyle::fillOpacity, &RenderStyle::setFillOpacity)); | 558 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFillOpacity,
&RenderStyle::fillOpacity)); |
| 1093 | 559 |
| 1094 gPropertyWrappers->append(new PropertyWrapperSVGPaint(CSSPropertyStroke, &Re
nderStyle::strokePaintType, &RenderStyle::strokePaintColor, &RenderStyle::setStr
okePaintColor)); | 560 gPropertyWrappers->append(new PropertyWrapperSVGPaint(CSSPropertyStroke, &Re
nderStyle::strokePaintType, &RenderStyle::strokePaintColor)); |
| 1095 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStrokeOpacit
y, &RenderStyle::strokeOpacity, &RenderStyle::setStrokeOpacity)); | 561 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStrokeOpacit
y, &RenderStyle::strokeOpacity)); |
| 1096 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyStrokeWidth, &RenderStyle::strokeWidth, &RenderStyle::setStrokeWidth)); | 562 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyStrokeWidth, &RenderStyle::strokeWidth)); |
| 1097 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLengthList>(CS
SPropertyStrokeDasharray, &RenderStyle::strokeDashArray, &RenderStyle::setStroke
DashArray)); | 563 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLengthList>(CS
SPropertyStrokeDasharray, &RenderStyle::strokeDashArray)); |
| 1098 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyStrokeDashoffset, &RenderStyle::strokeDashOffset, &RenderStyle::setStrokeDa
shOffset)); | 564 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyStrokeDashoffset, &RenderStyle::strokeDashOffset)); |
| 1099 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStrokeMiterl
imit, &RenderStyle::strokeMiterLimit, &RenderStyle::setStrokeMiterLimit)); | 565 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStrokeMiterl
imit, &RenderStyle::strokeMiterLimit)); |
| 1100 | 566 |
| 1101 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFloodOpacity
, &RenderStyle::floodOpacity, &RenderStyle::setFloodOpacity)); | 567 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFloodOpacity
, &RenderStyle::floodOpacity)); |
| 1102 gPropertyWrappers->append(new PropertyWrapperColor(CSSPropertyFloodColor, &R
enderStyle::floodColor, &RenderStyle::setFloodColor)); | 568 gPropertyWrappers->append(new PropertyWrapper<Color>(CSSPropertyFloodColor,
&RenderStyle::floodColor)); |
| 1103 | 569 |
| 1104 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStopOpacity,
&RenderStyle::stopOpacity, &RenderStyle::setStopOpacity)); | 570 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyStopOpacity,
&RenderStyle::stopOpacity)); |
| 1105 gPropertyWrappers->append(new PropertyWrapperColor(CSSPropertyStopColor, &Re
nderStyle::stopColor, &RenderStyle::setStopColor)); | 571 gPropertyWrappers->append(new PropertyWrapper<Color>(CSSPropertyStopColor, &
RenderStyle::stopColor)); |
| 1106 | 572 |
| 1107 gPropertyWrappers->append(new PropertyWrapperColor(CSSPropertyLightingColor,
&RenderStyle::lightingColor, &RenderStyle::setLightingColor)); | 573 gPropertyWrappers->append(new PropertyWrapper<Color>(CSSPropertyLightingColo
r, &RenderStyle::lightingColor)); |
| 1108 | 574 |
| 1109 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyBaselineShift, &RenderStyle::baselineShiftValue, &RenderStyle::setBaselineS
hiftValue)); | 575 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyBaselineShift, &RenderStyle::baselineShiftValue)); |
| 1110 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyKerning, &RenderStyle::kerning, &RenderStyle::setKerning)); | 576 gPropertyWrappers->append(new RefCountedSVGPropertyWrapper<SVGLength>(CSSPro
pertyKerning, &RenderStyle::kerning)); |
| 1111 | 577 |
| 1112 if (RuntimeEnabledFeatures::webAnimationsCSSEnabled()) { | 578 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFlexGrow, &R
enderStyle::flexGrow)); |
| 1113 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFlexGrow
, &RenderStyle::flexGrow, &RenderStyle::setFlexGrow)); | 579 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFlexShrink,
&RenderStyle::flexShrink)); |
| 1114 gPropertyWrappers->append(new PropertyWrapper<float>(CSSPropertyFlexShri
nk, &RenderStyle::flexShrink, &RenderStyle::setFlexShrink)); | 580 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyFlexBasis,
&RenderStyle::flexBasis)); |
| 1115 gPropertyWrappers->append(new PropertyWrapper<Length>(CSSPropertyFlexBas
is, &RenderStyle::flexBasis, &RenderStyle::setFlexBasis)); | |
| 1116 } | |
| 1117 | 581 |
| 1118 // TODO: | 582 // TODO: |
| 1119 // | 583 // |
| 1120 // CSSPropertyVerticalAlign | 584 // CSSPropertyVerticalAlign |
| 1121 // | |
| 1122 // Compound properties that have components that should be animatable: | |
| 1123 // | |
| 1124 // CSSPropertyWebkitColumns | |
| 1125 // CSSPropertyWebkitBoxReflect | |
| 1126 | 585 |
| 1127 // Make sure unused slots have a value | 586 // Make sure unused slots have a value |
| 1128 for (unsigned int i = 0; i < static_cast<unsigned int>(numCSSProperties); ++
i) | 587 for (unsigned int i = 0; i < static_cast<unsigned int>(numCSSProperties); ++
i) |
| 1129 gPropertyWrapperMap[i] = cInvalidPropertyWrapperIndex; | 588 gPropertyWrapperMap[i] = cInvalidPropertyWrapperIndex; |
| 1130 | 589 |
| 1131 // First we put the non-shorthand property wrappers into the map, so the sho
rthand-building | |
| 1132 // code can find them. | |
| 1133 size_t n = gPropertyWrappers->size(); | 590 size_t n = gPropertyWrappers->size(); |
| 1134 for (unsigned int i = 0; i < n; ++i) { | 591 for (unsigned int i = 0; i < n; ++i) { |
| 1135 CSSPropertyID property = (*gPropertyWrappers)[i]->property(); | 592 CSSPropertyID property = (*gPropertyWrappers)[i]->property(); |
| 1136 ASSERT_WITH_MESSAGE(RuntimeEnabledFeatures::webAnimationsCSSEnabled() ||
CSSAnimations::isAnimatableProperty(property), "%s is not whitelisted for anima
tion", getPropertyNameString(property).utf8().data()); | 593 ASSERT_WITH_MESSAGE(CSSAnimations::isAnimatableProperty(property), "%s i
s not whitelisted for animation", getPropertyNameString(property).utf8().data())
; |
| 1137 ASSERT(property - firstCSSProperty < numCSSProperties); | 594 ASSERT(property - firstCSSProperty < numCSSProperties); |
| 1138 gPropertyWrapperMap[property - firstCSSProperty] = i; | 595 gPropertyWrapperMap[property - firstCSSProperty] = i; |
| 1139 } | 596 } |
| 1140 | |
| 1141 // Now add the shorthand wrappers. | |
| 1142 addShorthandProperties(); | |
| 1143 } | |
| 1144 | |
| 1145 // Returns true if we need to start animation timers | |
| 1146 bool CSSPropertyAnimation::blendProperties(const AnimationBase* anim, CSSPropert
yID prop, RenderStyle* dst, const RenderStyle* a, const RenderStyle* b, double p
rogress) | |
| 1147 { | |
| 1148 ASSERT(prop != CSSPropertyInvalid); | |
| 1149 | |
| 1150 ensurePropertyMap(); | |
| 1151 | |
| 1152 AnimationPropertyWrapperBase* wrapper = wrapperForProperty(prop); | |
| 1153 if (wrapper) { | |
| 1154 wrapper->blend(anim, dst, a, b, progress); | |
| 1155 return !wrapper->animationIsAccelerated() || !anim->isAccelerated(); | |
| 1156 } | |
| 1157 | |
| 1158 return false; | |
| 1159 } | |
| 1160 | |
| 1161 bool CSSPropertyAnimation::animationOfPropertyIsAccelerated(CSSPropertyID prop) | |
| 1162 { | |
| 1163 ensurePropertyMap(); | |
| 1164 AnimationPropertyWrapperBase* wrapper = wrapperForProperty(prop); | |
| 1165 return wrapper ? wrapper->animationIsAccelerated() : false; | |
| 1166 } | 597 } |
| 1167 | 598 |
| 1168 bool CSSPropertyAnimation::propertiesEqual(CSSPropertyID prop, const RenderStyle
* a, const RenderStyle* b) | 599 bool CSSPropertyAnimation::propertiesEqual(CSSPropertyID prop, const RenderStyle
* a, const RenderStyle* b) |
| 1169 { | 600 { |
| 601 // FIXME: transitions of text-decoration-color are broken |
| 602 if (prop == CSSPropertyTextDecorationColor) |
| 603 return true; |
| 604 |
| 1170 ensurePropertyMap(); | 605 ensurePropertyMap(); |
| 1171 | 606 return wrapperForProperty(prop)->equals(a, b); |
| 1172 AnimationPropertyWrapperBase* wrapper = wrapperForProperty(prop); | |
| 1173 if (wrapper) | |
| 1174 return wrapper->equals(a, b); | |
| 1175 return true; | |
| 1176 } | 607 } |
| 1177 | 608 |
| 1178 CSSPropertyID CSSPropertyAnimation::getPropertyAtIndex(int i, bool& isShorthand) | |
| 1179 { | |
| 1180 ensurePropertyMap(); | |
| 1181 | |
| 1182 if (i < 0 || i >= getNumProperties()) | |
| 1183 return CSSPropertyInvalid; | |
| 1184 | |
| 1185 AnimationPropertyWrapperBase* wrapper = (*gPropertyWrappers)[i]; | |
| 1186 isShorthand = wrapper->isShorthandWrapper(); | |
| 1187 return wrapper->property(); | |
| 1188 } | |
| 1189 | |
| 1190 int CSSPropertyAnimation::getNumProperties() | |
| 1191 { | |
| 1192 ensurePropertyMap(); | |
| 1193 | |
| 1194 return gPropertyWrappers->size(); | |
| 1195 } | |
| 1196 | 609 |
| 1197 } | 610 } |
| OLD | NEW |