Changeset 31801

Show
Ignore:
Timestamp:
04/10/08 23:37:30 (15 months ago)
Author:
antti@apple.com
Message:

2008-04-10 Antti Koivisto < antti@apple.com>

Reviewed by Eric.

Redo the SVG animation support.


It does

  • Full SMIL interval timing model including syncbase and event base timing (the hard part).
  • CSS and XML attribute animation.
  • Linear, discrete and spline calcModes.
  • Values animation with keyTimes and keySplines.
  • Link activated animations.
  • Pretty good support for <animate> and <set> animations
  • Basic support for <animateColor>, <animateMotion> and <animateTransform>.

This passes some 35 of the 56 tests in W3C SVG animation test suite, a bunch more
with some subtest failures.

What is still missing

  • Additive animation with multiple animations operating on the same property. This is a major architectural feature in animation code. It shouldn't be too hard to add.
  • Only <animate> implements accumulate.
  • <animateMotion> does not do paths, keypoints, rotate.
  • <animateTransform> does not work correctly in all cases
  • calcMode paced is missing.
  • repeat, beginEvent, endEvent are missing.
  • accesskey() is missing.
  • JS does not see correct values for baseVal/animVal, changing values that are being animted for a script produces wrong results. This problem needs to be solved outside the animation code.
  • Some other stuff I forgot or do not know about.
  • GNUmakefile.am:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/Document.cpp:
  • history/CachedPage.cpp: (WebCore::CachedPage::CachedPage):


Use cache notification mechanism to start/stop animations.

  • svg/SVGAElement.cpp: (WebCore::SVGAElement::defaultEventHandler):


Start target animation on link activation.


  • svg/SVGAnimateColorElement.cpp: (WebCore::SVGAnimateColorElement::applyAnimatedValueToElement): (WebCore::SVGAnimateColorElement::updateAnimatedValue): (WebCore::SVGAnimateColorElement::calculateFromAndToValues): (WebCore::SVGAnimateColorElement::calculateFromAndByValues):
  • svg/SVGAnimateColorElement.h:
  • svg/SVGAnimateElement.cpp: (WebCore::SVGAnimateElement::SVGAnimateElement): (WebCore::parseNumberValueAndUnit): (WebCore::SVGAnimateElement::applyAnimatedValueToElement): (WebCore::SVGAnimateElement::updateAnimatedValue): (WebCore::isColorAttribute): (WebCore::SVGAnimateElement::calculateFromAndToValues): (WebCore::SVGAnimateElement::calculateFromAndByValues):
  • svg/SVGAnimateElement.h: (WebCore::SVGAnimateElement::):
  • svg/SVGAnimateMotionElement.cpp: (WebCore::SVGAnimateMotionElement::SVGAnimateMotionElement): (WebCore::SVGAnimateMotionElement::parseMappedAttribute): (WebCore::SVGAnimateMotionElement::updateAnimatedValue): (WebCore::parsePoint): (WebCore::SVGAnimateMotionElement::calculateFromAndToValues): (WebCore::SVGAnimateMotionElement::calculateFromAndByValues): (WebCore::SVGAnimateMotionElement::applyAnimatedValueToElement): (WebCore::SVGAnimateMotionElement::startedActiveInterval):
  • svg/SVGAnimateMotionElement.h:
  • svg/SVGAnimateTransformElement.cpp: (WebCore::SVGAnimateTransformElement::SVGAnimateTransformElement): (WebCore::SVGAnimateTransformElement::hasValidTarget): (WebCore::SVGAnimateTransformElement::updateAnimatedValue): (WebCore::transformListFor): (WebCore::SVGAnimateTransformElement::applyAnimatedValueToElement): (WebCore::SVGAnimateTransformElement::calculateFromAndToValues): (WebCore::SVGAnimateTransformElement::calculateFromAndByValues): (WebCore::SVGAnimateTransformElement::startedActiveInterval): (WebCore::SVGAnimateTransformElement::parseTransformValue):
  • svg/SVGAnimateTransformElement.h:


Concrete anmation element classes.


  • svg/SVGAnimationElement.cpp: (WebCore::SVGAnimationElement::SVGAnimationElement): (WebCore::SVGAnimationElement::~SVGAnimationElement): (WebCore::parseKeyTimes): (WebCore::parseKeySplines): (WebCore::SVGAnimationElement::parseMappedAttribute): (WebCore::SVGAnimationElement::attributeChanged): (WebCore::SVGAnimationElement::getStartTime): (WebCore::SVGAnimationElement::getCurrentTime): (WebCore::SVGAnimationElement::getSimpleDuration): (WebCore::SVGAnimationElement::beginElement): (WebCore::SVGAnimationElement::beginElementAt): (WebCore::SVGAnimationElement::endElement): (WebCore::SVGAnimationElement::endElementAt): (WebCore::SVGAnimationElement::animationMode): (WebCore::SVGAnimationElement::calcMode): (WebCore::SVGAnimationElement::attributeType): (WebCore::SVGAnimationElement::toValue): (WebCore::SVGAnimationElement::byValue): (WebCore::SVGAnimationElement::fromValue): (WebCore::SVGAnimationElement::attributeName): (WebCore::SVGAnimationElement::isAdditive): (WebCore::SVGAnimationElement::isAccumulated): (WebCore::SVGAnimationElement::hasValidTarget): (WebCore::SVGAnimationElement::targetAttributeIsCSS): (WebCore::SVGAnimationElement::setTargetAttributeAnimatedValue): (WebCore::SVGAnimationElement::targetAttributeBaseValue): (WebCore::solveEpsilon): (WebCore::SVGAnimationElement::currentValuesForValuesAnimation): (WebCore::SVGAnimationElement::startedActiveInterval): (WebCore::SVGAnimationElement::applyAnimation): (WebCore::SVGAnimationElement::unapplyAnimation): (WebCore::SVGAnimationElement::endedActiveInterval):
  • svg/SVGAnimationElement.h: (WebCore::SVGAnimationElement::):


This is pretty much a complete rewrite of the SVGAnimationElement. Timing related functionality
was refactored to SMILTimingElement class that this class now inherits.


  • svg/SVGDocumentExtensions.cpp: (WebCore::SVGDocumentExtensions::startAnimations):
  • svg/SVGElement.cpp: (WebCore::SVGElement::ownerSVGElement):
  • svg/SVGSVGElement.cpp:


We need to reach the <svg> element from <use> too so go out from the shadow tree.


(WebCore::SVGSVGElement::SVGSVGElement):
(WebCore::SVGSVGElement::~SVGSVGElement):
(WebCore::SVGSVGElement::pauseAnimations):
(WebCore::SVGSVGElement::unpauseAnimations):
(WebCore::SVGSVGElement::animationsPaused):
(WebCore::SVGSVGElement::getCurrentTime):
(WebCore::SVGSVGElement::willSaveToCache):
(WebCore::SVGSVGElement::willRestoreFromCache):

  • svg/SVGSVGElement.h: (WebCore::SVGSVGElement::timeContainer):
  • svg/SVGSetElement.cpp: (WebCore::SVGSetElement::applyAnimatedValueToElement): (WebCore::SVGSetElement::calculateFromAndToValues): (WebCore::SVGSetElement::calculateFromAndByValues): (WebCore::SVGSetElement::updateAnimatedValue):
  • svg/SVGSetElement.h:


Concrete anmation element classes.


  • svg/SVGTimer.cpp: Removed.
  • svg/SVGTimer.h: Removed.
  • svg/SVGUseElement.cpp: (WebCore::SVGUseElement::removedFromDocument):
  • svg/TimeScheduler.cpp: Removed.
  • svg/TimeScheduler.h: Removed.


Replaced these with SMILTimeContainer class.


  • svg/animation: Added.
  • svg/animation/SMILTime.cpp: Added. (WebCore::operator+): (WebCore::operator-): (WebCore::operator*):
  • svg/animation/SMILTime.h: Added. (WebCore::SMILTime::SMILTime): (WebCore::SMILTime::unresolved): (WebCore::SMILTime::indefinite): (WebCore::SMILTime::operator=): (WebCore::SMILTime::value): (WebCore::SMILTime::isFinite): (WebCore::SMILTime::isIndefinite): (WebCore::SMILTime::isUnresolved): (WebCore::operator==): (WebCore::operator!=): (WebCore::operator>): (WebCore::operator<): (WebCore::operator>=): (WebCore::operator<=): (WebCore::max): (WebCore::min):


A floating point number with special values "indefinite" and "unresolved". Defines math for those.


  • svg/animation/SMILTimeContainer.cpp: Added. (WebCore::SMILTimeContainer::SMILTimeContainer): (WebCore::SMILTimeContainer::schedule): (WebCore::SMILTimeContainer::unschedule): (WebCore::SMILTimeContainer::elapsed): (WebCore::SMILTimeContainer::isActive): (WebCore::SMILTimeContainer::isPaused): (WebCore::SMILTimeContainer::begin): (WebCore::SMILTimeContainer::pause): (WebCore::SMILTimeContainer::resume): (WebCore::SMILTimeContainer::startTimer): (WebCore::SMILTimeContainer::timerFired): (WebCore::SMILTimeContainer::updateAnimations):
  • svg/animation/SMILTimeContainer.h: Added.


Manages the clock and time line for active animations in a document.


  • svg/animation/SVGSMILElement.cpp: Added. (WebCore::ConditionEventListener::ConditionEventListener): (WebCore::ConditionEventListener::handleEvent): (WebCore::SVGSMILElement::Condition::Condition): (WebCore::SVGSMILElement::SVGSMILElement): (WebCore::SVGSMILElement::~SVGSMILElement): (WebCore::SVGSMILElement::insertedIntoDocument): (WebCore::SVGSMILElement::removedFromDocument): (WebCore::SVGSMILElement::finishParsingChildren): (WebCore::SVGSMILElement::parseOffsetValue): (WebCore::SVGSMILElement::parseClockValue): (WebCore::smilTimeSortFunction): (WebCore::sortTimeList): (WebCore::SVGSMILElement::parseCondition): (WebCore::SVGSMILElement::isTimingElement): (WebCore::SVGSMILElement::parseBeginOrEnd): (WebCore::SVGSMILElement::parseMappedAttribute): (WebCore::SVGSMILElement::attributeChanged): (WebCore::SVGSMILElement::connectConditions): (WebCore::SVGSMILElement::disconnectConditions): (WebCore::SVGSMILElement::reschedule): (WebCore::SVGSMILElement::targetElement): (WebCore::SVGSMILElement::elapsed): (WebCore::SVGSMILElement::restart): (WebCore::SVGSMILElement::fill): (WebCore::SVGSMILElement::xlinkHref): (WebCore::SVGSMILElement::dur): (WebCore::SVGSMILElement::repeatDur): (WebCore::SVGSMILElement::repeatCount): (WebCore::SVGSMILElement::maxValue): (WebCore::SVGSMILElement::minValue): (WebCore::SVGSMILElement::simpleDuration): (WebCore::SVGSMILElement::addBeginTime): (WebCore::SVGSMILElement::addEndTime): (WebCore::SVGSMILElement::findInstanceTime): (WebCore::SVGSMILElement::repeatingDuration): (WebCore::SVGSMILElement::resolveActiveEnd): (WebCore::SVGSMILElement::resolveInterval): (WebCore::SVGSMILElement::resolveFirstInterval): (WebCore::SVGSMILElement::resolveNextInterval): (WebCore::SVGSMILElement::nextProgressTime): (WebCore::SVGSMILElement::beginListChanged): (WebCore::SVGSMILElement::endListChanged): (WebCore::SVGSMILElement::checkRestart): (WebCore::SVGSMILElement::calculateAnimationPercentAndRepeat): (WebCore::SVGSMILElement::calculateNextProgressTime): (WebCore::SVGSMILElement::determineActiveState): (WebCore::SVGSMILElement::progress): (WebCore::SVGSMILElement::notifyDependentsIntervalChanged): (WebCore::SVGSMILElement::createInstanceTimesFromSyncbase): (WebCore::SVGSMILElement::addTimeDependent): (WebCore::SVGSMILElement::removeTimeDependent): (WebCore::SVGSMILElement::handleConditionEvent): (WebCore::SVGSMILElement::beginByLinkActivation):
  • svg/animation/SVGSMILElement.h: Added. (WebCore::SVGSMILElement::timeContainer): (WebCore::SVGSMILElement::): (WebCore::SVGSMILElement::intervalBegin): (WebCore::SVGSMILElement::intervalEnd): (WebCore::SVGSMILElement::Condition::):


This abstract class implements the SMIL timing model. As an output it produces calls
to these virtual functions:


virtual void startedActiveInterval() = 0;
virtual void applyAnimation(float percent, unsigned repeat) = 0;
virtual void unapplyAnimation() = 0;
virtual void endedActiveInterval() = 0;

Location:
trunk/WebCore
Files:
7 added
4 removed
25 modified

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r31797 r31801  
     12008-04-10  Antti Koivisto  <antti@apple.com> 
     2 
     3        Reviewed by Eric. 
     4 
     5        Redo the SVG animation support. 
     6         
     7        It does 
     8        - Full SMIL interval timing model including syncbase and event base timing (the hard part). 
     9        - CSS and XML attribute animation. 
     10        - Linear, discrete and spline calcModes. 
     11        - Values animation with keyTimes and keySplines. 
     12        - Link activated animations. 
     13        - Pretty good support for <animate> and <set> animations 
     14        - Basic support for <animateColor>, <animateMotion> and <animateTransform>. 
     15 
     16        This passes some 35 of the 56 tests in W3C SVG animation test suite, a bunch more 
     17        with some subtest failures. 
     18 
     19        What is still missing 
     20        - Additive animation with multiple animations operating on the same property. This is a 
     21          major architectural feature in animation code. It shouldn't be too hard to add. 
     22        - Only <animate> implements accumulate. 
     23        - <animateMotion> does not do paths, keypoints, rotate. 
     24        - <animateTransform> does not work correctly in all cases 
     25        - calcMode paced is missing. 
     26        - repeat, beginEvent, endEvent are missing. 
     27        - accesskey() is missing. 
     28        - JS does not see correct values for baseVal/animVal, changing values that are being 
     29          animted for a script produces wrong results. This problem needs to be solved outside 
     30          the animation code. 
     31        - Some other stuff I forgot or do not know about. 
     32 
     33        * GNUmakefile.am: 
     34        * WebCore.pro: 
     35        * WebCore.vcproj/WebCore.vcproj: 
     36        * WebCore.xcodeproj/project.pbxproj: 
     37        * dom/Document.cpp: 
     38        * history/CachedPage.cpp: 
     39        (WebCore::CachedPage::CachedPage): 
     40         
     41        Use cache notification mechanism to start/stop animations. 
     42 
     43        * svg/SVGAElement.cpp: 
     44        (WebCore::SVGAElement::defaultEventHandler): 
     45         
     46        Start target animation on link activation. 
     47         
     48        * svg/SVGAnimateColorElement.cpp: 
     49        (WebCore::SVGAnimateColorElement::applyAnimatedValueToElement): 
     50        (WebCore::SVGAnimateColorElement::updateAnimatedValue): 
     51        (WebCore::SVGAnimateColorElement::calculateFromAndToValues): 
     52        (WebCore::SVGAnimateColorElement::calculateFromAndByValues): 
     53        * svg/SVGAnimateColorElement.h: 
     54        * svg/SVGAnimateElement.cpp: 
     55        (WebCore::SVGAnimateElement::SVGAnimateElement): 
     56        (WebCore::parseNumberValueAndUnit): 
     57        (WebCore::SVGAnimateElement::applyAnimatedValueToElement): 
     58        (WebCore::SVGAnimateElement::updateAnimatedValue): 
     59        (WebCore::isColorAttribute): 
     60        (WebCore::SVGAnimateElement::calculateFromAndToValues): 
     61        (WebCore::SVGAnimateElement::calculateFromAndByValues): 
     62        * svg/SVGAnimateElement.h: 
     63        (WebCore::SVGAnimateElement::): 
     64        * svg/SVGAnimateMotionElement.cpp: 
     65        (WebCore::SVGAnimateMotionElement::SVGAnimateMotionElement): 
     66        (WebCore::SVGAnimateMotionElement::parseMappedAttribute): 
     67        (WebCore::SVGAnimateMotionElement::updateAnimatedValue): 
     68        (WebCore::parsePoint): 
     69        (WebCore::SVGAnimateMotionElement::calculateFromAndToValues): 
     70        (WebCore::SVGAnimateMotionElement::calculateFromAndByValues): 
     71        (WebCore::SVGAnimateMotionElement::applyAnimatedValueToElement): 
     72        (WebCore::SVGAnimateMotionElement::startedActiveInterval): 
     73        * svg/SVGAnimateMotionElement.h: 
     74        * svg/SVGAnimateTransformElement.cpp: 
     75        (WebCore::SVGAnimateTransformElement::SVGAnimateTransformElement): 
     76        (WebCore::SVGAnimateTransformElement::hasValidTarget): 
     77        (WebCore::SVGAnimateTransformElement::updateAnimatedValue): 
     78        (WebCore::transformListFor): 
     79        (WebCore::SVGAnimateTransformElement::applyAnimatedValueToElement): 
     80        (WebCore::SVGAnimateTransformElement::calculateFromAndToValues): 
     81        (WebCore::SVGAnimateTransformElement::calculateFromAndByValues): 
     82        (WebCore::SVGAnimateTransformElement::startedActiveInterval): 
     83        (WebCore::SVGAnimateTransformElement::parseTransformValue): 
     84        * svg/SVGAnimateTransformElement.h: 
     85         
     86        Concrete anmation element classes. 
     87         
     88        * svg/SVGAnimationElement.cpp: 
     89        (WebCore::SVGAnimationElement::SVGAnimationElement): 
     90        (WebCore::SVGAnimationElement::~SVGAnimationElement): 
     91        (WebCore::parseKeyTimes): 
     92        (WebCore::parseKeySplines): 
     93        (WebCore::SVGAnimationElement::parseMappedAttribute): 
     94        (WebCore::SVGAnimationElement::attributeChanged): 
     95        (WebCore::SVGAnimationElement::getStartTime): 
     96        (WebCore::SVGAnimationElement::getCurrentTime): 
     97        (WebCore::SVGAnimationElement::getSimpleDuration): 
     98        (WebCore::SVGAnimationElement::beginElement): 
     99        (WebCore::SVGAnimationElement::beginElementAt): 
     100        (WebCore::SVGAnimationElement::endElement): 
     101        (WebCore::SVGAnimationElement::endElementAt): 
     102        (WebCore::SVGAnimationElement::animationMode): 
     103        (WebCore::SVGAnimationElement::calcMode): 
     104        (WebCore::SVGAnimationElement::attributeType): 
     105        (WebCore::SVGAnimationElement::toValue): 
     106        (WebCore::SVGAnimationElement::byValue): 
     107        (WebCore::SVGAnimationElement::fromValue): 
     108        (WebCore::SVGAnimationElement::attributeName): 
     109        (WebCore::SVGAnimationElement::isAdditive): 
     110        (WebCore::SVGAnimationElement::isAccumulated): 
     111        (WebCore::SVGAnimationElement::hasValidTarget): 
     112        (WebCore::SVGAnimationElement::targetAttributeIsCSS): 
     113        (WebCore::SVGAnimationElement::setTargetAttributeAnimatedValue): 
     114        (WebCore::SVGAnimationElement::targetAttributeBaseValue): 
     115        (WebCore::solveEpsilon): 
     116        (WebCore::SVGAnimationElement::currentValuesForValuesAnimation): 
     117        (WebCore::SVGAnimationElement::startedActiveInterval): 
     118        (WebCore::SVGAnimationElement::applyAnimation): 
     119        (WebCore::SVGAnimationElement::unapplyAnimation): 
     120        (WebCore::SVGAnimationElement::endedActiveInterval): 
     121        * svg/SVGAnimationElement.h: 
     122        (WebCore::SVGAnimationElement::): 
     123         
     124        This is pretty much a complete rewrite of the SVGAnimationElement. Timing related functionality 
     125        was refactored to SMILTimingElement class that this class now inherits. 
     126         
     127        * svg/SVGDocumentExtensions.cpp: 
     128        (WebCore::SVGDocumentExtensions::startAnimations): 
     129        * svg/SVGElement.cpp: 
     130        (WebCore::SVGElement::ownerSVGElement): 
     131        * svg/SVGSVGElement.cpp: 
     132         
     133        We need to reach the <svg> element from <use> too so go out from the shadow tree. 
     134         
     135        (WebCore::SVGSVGElement::SVGSVGElement): 
     136        (WebCore::SVGSVGElement::~SVGSVGElement): 
     137        (WebCore::SVGSVGElement::pauseAnimations): 
     138        (WebCore::SVGSVGElement::unpauseAnimations): 
     139        (WebCore::SVGSVGElement::animationsPaused): 
     140        (WebCore::SVGSVGElement::getCurrentTime): 
     141        (WebCore::SVGSVGElement::willSaveToCache): 
     142        (WebCore::SVGSVGElement::willRestoreFromCache): 
     143        * svg/SVGSVGElement.h: 
     144        (WebCore::SVGSVGElement::timeContainer): 
     145        * svg/SVGSetElement.cpp: 
     146        (WebCore::SVGSetElement::applyAnimatedValueToElement): 
     147        (WebCore::SVGSetElement::calculateFromAndToValues): 
     148        (WebCore::SVGSetElement::calculateFromAndByValues): 
     149        (WebCore::SVGSetElement::updateAnimatedValue): 
     150        * svg/SVGSetElement.h: 
     151         
     152        Concrete anmation element classes. 
     153         
     154        * svg/SVGTimer.cpp: Removed. 
     155        * svg/SVGTimer.h: Removed. 
     156        * svg/SVGUseElement.cpp: 
     157        (WebCore::SVGUseElement::removedFromDocument): 
     158        * svg/TimeScheduler.cpp: Removed. 
     159        * svg/TimeScheduler.h: Removed. 
     160         
     161        Replaced these with SMILTimeContainer class. 
     162         
     163        * svg/animation: Added. 
     164        * svg/animation/SMILTime.cpp: Added. 
     165        (WebCore::operator+): 
     166        (WebCore::operator-): 
     167        (WebCore::operator*): 
     168        * svg/animation/SMILTime.h: Added. 
     169        (WebCore::SMILTime::SMILTime): 
     170        (WebCore::SMILTime::unresolved): 
     171        (WebCore::SMILTime::indefinite): 
     172        (WebCore::SMILTime::operator=): 
     173        (WebCore::SMILTime::value): 
     174        (WebCore::SMILTime::isFinite): 
     175        (WebCore::SMILTime::isIndefinite): 
     176        (WebCore::SMILTime::isUnresolved): 
     177        (WebCore::operator==): 
     178        (WebCore::operator!=): 
     179        (WebCore::operator>): 
     180        (WebCore::operator<): 
     181        (WebCore::operator>=): 
     182        (WebCore::operator<=): 
     183        (WebCore::max): 
     184        (WebCore::min): 
     185         
     186        A floating point number with special values "indefinite" and "unresolved". Defines math for those. 
     187         
     188        * svg/animation/SMILTimeContainer.cpp: Added. 
     189        (WebCore::SMILTimeContainer::SMILTimeContainer): 
     190        (WebCore::SMILTimeContainer::schedule): 
     191        (WebCore::SMILTimeContainer::unschedule): 
     192        (WebCore::SMILTimeContainer::elapsed): 
     193        (WebCore::SMILTimeContainer::isActive): 
     194        (WebCore::SMILTimeContainer::isPaused): 
     195        (WebCore::SMILTimeContainer::begin): 
     196        (WebCore::SMILTimeContainer::pause): 
     197        (WebCore::SMILTimeContainer::resume): 
     198        (WebCore::SMILTimeContainer::startTimer): 
     199        (WebCore::SMILTimeContainer::timerFired): 
     200        (WebCore::SMILTimeContainer::updateAnimations): 
     201        * svg/animation/SMILTimeContainer.h: Added. 
     202         
     203        Manages the clock and time line for active animations in a document. 
     204         
     205        * svg/animation/SVGSMILElement.cpp: Added. 
     206        (WebCore::ConditionEventListener::ConditionEventListener): 
     207        (WebCore::ConditionEventListener::handleEvent): 
     208        (WebCore::SVGSMILElement::Condition::Condition): 
     209        (WebCore::SVGSMILElement::SVGSMILElement): 
     210        (WebCore::SVGSMILElement::~SVGSMILElement): 
     211        (WebCore::SVGSMILElement::insertedIntoDocument): 
     212        (WebCore::SVGSMILElement::removedFromDocument): 
     213        (WebCore::SVGSMILElement::finishParsingChildren): 
     214        (WebCore::SVGSMILElement::parseOffsetValue): 
     215        (WebCore::SVGSMILElement::parseClockValue): 
     216        (WebCore::smilTimeSortFunction): 
     217        (WebCore::sortTimeList): 
     218        (WebCore::SVGSMILElement::parseCondition): 
     219        (WebCore::SVGSMILElement::isTimingElement): 
     220        (WebCore::SVGSMILElement::parseBeginOrEnd): 
     221        (WebCore::SVGSMILElement::parseMappedAttribute): 
     222        (WebCore::SVGSMILElement::attributeChanged): 
     223        (WebCore::SVGSMILElement::connectConditions): 
     224        (WebCore::SVGSMILElement::disconnectConditions): 
     225        (WebCore::SVGSMILElement::reschedule): 
     226        (WebCore::SVGSMILElement::targetElement): 
     227        (WebCore::SVGSMILElement::elapsed): 
     228        (WebCore::SVGSMILElement::restart): 
     229        (WebCore::SVGSMILElement::fill): 
     230        (WebCore::SVGSMILElement::xlinkHref): 
     231        (WebCore::SVGSMILElement::dur): 
     232        (WebCore::SVGSMILElement::repeatDur): 
     233        (WebCore::SVGSMILElement::repeatCount): 
     234        (WebCore::SVGSMILElement::maxValue): 
     235        (WebCore::SVGSMILElement::minValue): 
     236        (WebCore::SVGSMILElement::simpleDuration): 
     237        (WebCore::SVGSMILElement::addBeginTime): 
     238        (WebCore::SVGSMILElement::addEndTime): 
     239        (WebCore::SVGSMILElement::findInstanceTime): 
     240        (WebCore::SVGSMILElement::repeatingDuration): 
     241        (WebCore::SVGSMILElement::resolveActiveEnd): 
     242        (WebCore::SVGSMILElement::resolveInterval): 
     243        (WebCore::SVGSMILElement::resolveFirstInterval): 
     244        (WebCore::SVGSMILElement::resolveNextInterval): 
     245        (WebCore::SVGSMILElement::nextProgressTime): 
     246        (WebCore::SVGSMILElement::beginListChanged): 
     247        (WebCore::SVGSMILElement::endListChanged): 
     248        (WebCore::SVGSMILElement::checkRestart): 
     249        (WebCore::SVGSMILElement::calculateAnimationPercentAndRepeat): 
     250        (WebCore::SVGSMILElement::calculateNextProgressTime): 
     251        (WebCore::SVGSMILElement::determineActiveState): 
     252        (WebCore::SVGSMILElement::progress): 
     253        (WebCore::SVGSMILElement::notifyDependentsIntervalChanged): 
     254        (WebCore::SVGSMILElement::createInstanceTimesFromSyncbase): 
     255        (WebCore::SVGSMILElement::addTimeDependent): 
     256        (WebCore::SVGSMILElement::removeTimeDependent): 
     257        (WebCore::SVGSMILElement::handleConditionEvent): 
     258        (WebCore::SVGSMILElement::beginByLinkActivation): 
     259        * svg/animation/SVGSMILElement.h: Added. 
     260        (WebCore::SVGSMILElement::timeContainer): 
     261        (WebCore::SVGSMILElement::): 
     262        (WebCore::SVGSMILElement::intervalBegin): 
     263        (WebCore::SVGSMILElement::intervalEnd): 
     264        (WebCore::SVGSMILElement::Condition::): 
     265         
     266            This abstract class implements the SMIL timing model. As an output it produces calls 
     267            to these virtual functions: 
     268         
     269            virtual void startedActiveInterval() = 0; 
     270            virtual void applyAnimation(float percent, unsigned repeat) = 0; 
     271            virtual void unapplyAnimation() = 0; 
     272            virtual void endedActiveInterval() = 0; 
     273 
    12742008-04-10  Antti Koivisto  <antti@apple.com> 
    2275 
  • trunk/WebCore/GNUmakefile.am

    r31793 r31801  
    17691769        -DENABLE_SVG=1 \ 
    17701770        -I\$(top_srcdir)/WebCore/svg \ 
     1771        -I\$(top_srcdir)/WebCore/svg/animation 
    17711772        -I\$(top_srcdir)/WebCore/svg/graphics \ 
    17721773        -I\$(top_srcdir)/WebCore/svg/graphics/filters 
     
    17901791        WebCore/svg/SVGDocumentExtensions.cpp \ 
    17911792        WebCore/svg/SVGImageLoader.cpp \ 
    1792         WebCore/svg/SVGTimer.cpp \ 
    1793         WebCore/svg/TimeScheduler.cpp \ 
    17941793        WebCore/svg/ColorDistance.cpp \ 
    17951794        WebCore/svg/SVGAElement.cpp \ 
     
    19201919        WebCore/svg/SVGViewSpec.cpp \ 
    19211920        WebCore/svg/SVGZoomAndPan.cpp \ 
     1921        WebCore/svg/animation/SMILTime.cpp \ 
     1922        WebCore/svg/animation/SMILTimeContainer.cpp \ 
     1923        WebCore/svg/animation/SVGSMILElement.cpp \ 
    19221924        WebCore/svg/graphics/filters/SVGFEBlend.cpp \ 
    19231925        WebCore/svg/graphics/filters/SVGFEColorMatrix.cpp \ 
  • trunk/WebCore/WebCore.pro

    r31793 r31801  
    196196                $$PWD/platform/network \ 
    197197                $$PWD/platform/graphics \ 
     198                $$PWD/svg/animation \ 
    198199                $$PWD/svg/graphics \ 
    199200                $$PWD/svg/graphics/filters \ 
     
    14811482        svg/SVGDocumentExtensions.cpp \ 
    14821483        svg/SVGImageLoader.cpp \ 
    1483         svg/SVGTimer.cpp \ 
    1484         svg/TimeScheduler.cpp \ 
    14851484        svg/ColorDistance.cpp \ 
    14861485        svg/SVGAElement.cpp \ 
     
    16101609        svg/SVGViewSpec.cpp \ 
    16111610        svg/SVGZoomAndPan.cpp \ 
     1611        WebCore/svg/animation/SMILTime.cpp \ 
     1612        WebCore/svg/animation/SMILTimeContainer.cpp \ 
     1613        WebCore/svg/animation/SVGSMILElement.cpp \ 
    16121614        svg/graphics/filters/SVGFEBlend.cpp \ 
    16131615        svg/graphics/filters/SVGFEColorMatrix.cpp \ 
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r31797 r31801  
    4141                        <Tool 
    4242                                Name="VCCLCompilerTool" 
    43                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     43                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    4444                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    4545                                UsePrecompiledHeader="2" 
     
    103103                        <Tool 
    104104                                Name="VCCLCompilerTool" 
    105                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     105                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    106106                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    107107                                UsePrecompiledHeader="2" 
     
    164164                        <Tool 
    165165                                Name="VCCLCompilerTool" 
    166                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     166                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    167167                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    168168                                UsePrecompiledHeader="2" 
     
    226226                        <Tool 
    227227                                Name="VCCLCompilerTool" 
    228                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\curl&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cairo&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     228                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\curl&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cairo&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    229229                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    230230                                UsePrecompiledHeader="2" 
     
    289289                        <Tool 
    290290                                Name="VCCLCompilerTool" 
    291                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\curl&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\caro&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     291                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\curl&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\caro&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    292292                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    293293                                UsePrecompiledHeader="2" 
     
    352352                                Name="VCCLCompilerTool" 
    353353                                WholeProgramOptimization="false" 
    354                                 AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;" 
     354                                AdditionalIncludeDirectories="&quot;$(ProjectDir)..\&quot;;&quot;$(ProjectDir)..&quot;;&quot;$(ProjectDir)..\bridge&quot;;&quot;$(ProjectDir)..\bridge\c&quot;;&quot;$(ProjectDir)..\css&quot;;&quot;$(ProjectDir)..\editing&quot;;&quot;$(ProjectDir)..\rendering&quot;;&quot;$(ProjectDir)..\bindings\js&quot;;&quot;$(ProjectDir)..\dom&quot;;&quot;$(ProjectDir)..\history&quot;;&quot;$(ProjectDir)..\html&quot;;&quot;$(ProjectDir)..\loader&quot;;&quot;$(ProjectDir)..\loader\archive&quot;;&quot;$(ProjectDir)..\loader\archive\cf&quot;;&quot;$(ProjectDir)..\loader\icon&quot;;&quot;$(ProjectDir)..\page&quot;;&quot;$(ProjectDir)..\page\win&quot;;&quot;$(ProjectDir)..\platform&quot;;&quot;$(ProjectDir)..\platform\sql&quot;;&quot;$(ProjectDir)..\platform\win&quot;;&quot;$(ProjectDir)..\platform\network&quot;;&quot;$(ProjectDir)..\platform\network\win&quot;;&quot;$(ProjectDir)..\platform\cf&quot;;&quot;$(ProjectDir)..\platform\network\cf&quot;;&quot;$(ProjectDir)..\platform\graphics&quot;;&quot;$(ProjectDir)..\platform\text&quot;;&quot;$(ProjectDir)..\platform\graphics\cairo&quot;;&quot;$(ProjectDir)..\platform\graphics\cg&quot;;&quot;$(ProjectDir)..\platform\graphics\win&quot;;&quot;$(ProjectDir)..\platform\image-decoders&quot;;&quot;$(ProjectDir)..\platform\image-decoders\bmp&quot;;&quot;$(ProjectDir)..\platform\image-decoders\gif&quot;;&quot;$(ProjectDir)..\platform\image-decoders\ico&quot;;&quot;$(ProjectDir)..\platform\image-decoders\jpeg&quot;;&quot;$(ProjectDir)..\platform\image-decoders\png&quot;;&quot;$(ProjectDir)..\platform\image-decoders\xbm&quot;;&quot;$(ProjectDir)..\platform\image-decoders\zlib&quot;;&quot;$(ProjectDir)..\xml&quot;;&quot;$(WebKitOutputDir)\obj\WebCore\DerivedSources&quot;;&quot;$(ProjectDir)..\plugins&quot;;&quot;$(ProjectDir)..\plugins\win&quot;;&quot;$(ProjectDir)..\platform\cairo\pixman\src&quot;;&quot;$(ProjectDir)..\platform\cairo\cairo\src&quot;;&quot;$(ProjectDir)..\svg\graphics&quot;;&quot;$(ProjectDir)..\svg\graphics\cg&quot;;&quot;$(ProjectDir)..\svg\graphics\filters&quot;;&quot;$(ProjectDir)..\kcanvas&quot;;&quot;$(ProjectDir)..\kcanvas\device&quot;;&quot;$(ProjectDir)..\kcanvas\device\quartz&quot;;&quot;$(ProjectDir)..\svg&quot;;&quot;$(ProjectDir)..\storage&quot;;&quot;$(WebKitOutputDir)\include&quot;;&quot;$(WebKitOutputDir)\include\JavaScriptCore&quot;;&quot;$(ProjectDir)..\ForwardingHeaders&quot;;&quot;$(WebKitLibrariesDir)\include&quot;;&quot;$(WebKitLibrariesDir)\include\icu&quot;;&quot;$(WebKitLibrariesDir)\include\iconv&quot;;&quot;$(WebKitLibrariesDir)\include\sqlite&quot;;&quot;$(WebKitLibrariesDir)\include\JavaScriptCore&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders&quot;;&quot;$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility&quot;;&quot;$(WebKitOutputDir)\include\QtMovieWin&quot;;&quot;$(ProjectDir)..\svg\animation&quot;" 
    355355                                PreprocessorDefinitions="__WIN32__;ENABLE_CROSS_DOCUMENT_MESSAGING;ENABLE_DOM_STORAGE;ENABLE_XSLT;ENABLE_XPATH;ENABLE_SVG;ENABLE_SVG_ANIMATION;ENABLE_SVG_AS_IMAGE;ENABLE_SVG_USE;ENABLE_SVG_FOREIGN_OBJECT;ENABLE_SVG_FONTS;WEBCORE_CONTEXT_MENUS;ENABLE_VIDEO" 
    356356                                PrecompiledHeaderThrough="WebCorePrefix.h" 
     
    1457514575                        </File> 
    1457614576                        <File 
    14577                                 RelativePath="..\svg\SVGTimer.cpp" 
    14578                                 > 
    14579                         </File> 
    14580                         <File 
    14581                                 RelativePath="..\svg\SVGTimer.h" 
    14582                                 > 
    14583                         </File> 
    14584                         <File 
    1458514577                                RelativePath="..\svg\SVGTitleElement.cpp" 
    1458614578                                > 
     
    1469014682                                > 
    1469114683                        </File> 
    14692                         <File 
    14693                                 RelativePath="..\svg\TimeScheduler.cpp" 
    14694                                 > 
    14695                         </File> 
    14696                         <File 
    14697                                 RelativePath="..\svg\TimeScheduler.h" 
    14698                                 > 
    14699                         </File> 
     14684                        <Filter 
     14685                                Name="animation" 
     14686                                > 
     14687                                <File 
     14688                                    RelativePath="..\svg\animation\SMILTime.cpp" 
     14689                                    > 
     14690                                </File> 
     14691                                <File 
     14692                                    RelativePath="..\svg\animation\SMILTime.h" 
     14693                                    > 
     14694                                </File> 
     14695                                <File 
     14696                                    RelativePath="..\svg\animation\SMILTimeContainer.cpp" 
     14697                                    > 
     14698                                </File> 
     14699                                <File 
     14700                                    RelativePath="..\svg\animation\SMILTimeContainer.h" 
     14701                                    > 
     14702                                </File> 
     14703                                <File 
     14704                                    RelativePath="..\svg\animation\SVGSMILElement.cpp" 
     14705                                    > 
     14706                                </File> 
     14707                                <File 
     14708                                    RelativePath="..\svg\animation\SVGSMILElement.h" 
     14709                                    > 
     14710                                </File> 
     14711            </Filter> 
    1470014712                        <Filter 
    1470114713                                Name="graphics" 
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r31797 r31801  
    31593159                B28C6A290D00C44800334AA4 /* SVGImageLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28C6A200D00C44800334AA4 /* SVGImageLoader.cpp */; }; 
    31603160                B28C6A2A0D00C44800334AA4 /* SVGImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B28C6A210D00C44800334AA4 /* SVGImageLoader.h */; }; 
    3161                 B28C6A2B0D00C44800334AA4 /* SVGTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28C6A220D00C44800334AA4 /* SVGTimer.cpp */; }; 
    3162                 B28C6A2C0D00C44800334AA4 /* SVGTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = B28C6A230D00C44800334AA4 /* SVGTimer.h */; }; 
    3163                 B28C6A2D0D00C44800334AA4 /* TimeScheduler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28C6A240D00C44800334AA4 /* TimeScheduler.cpp */; }; 
    3164                 B28C6A2E0D00C44800334AA4 /* TimeScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = B28C6A250D00C44800334AA4 /* TimeScheduler.h */; }; 
    31653161                B297BC700B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B297BC6F0B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp */; }; 
    31663162                B2A015A80AF6CD53006BCE0E /* GraphicsContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2A015920AF6CD53006BCE0E /* GraphicsContext.cpp */; }; 
     
    39023898                E49626C30D80D94900E3405C /* PreloadScanner.h in Headers */ = {isa = PBXBuildFile; fileRef = E4D4ABE10D7542F100F96869 /* PreloadScanner.h */; }; 
    39033899                E4AFCFA50DAF29A300F5F55C /* UnitBezier.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AFCFA40DAF29A300F5F55C /* UnitBezier.h */; }; 
     3900                E4AFD00B0DAF335400F5F55C /* SMILTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4AFD0050DAF335400F5F55C /* SMILTime.cpp */; }; 
     3901                E4AFD00C0DAF335400F5F55C /* SMILTime.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AFD0060DAF335400F5F55C /* SMILTime.h */; }; 
     3902                E4AFD00D0DAF335500F5F55C /* SMILTimeContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4AFD0070DAF335400F5F55C /* SMILTimeContainer.cpp */; }; 
     3903                E4AFD00E0DAF335500F5F55C /* SMILTimeContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AFD0080DAF335400F5F55C /* SMILTimeContainer.h */; }; 
     3904                E4AFD00F0DAF335500F5F55C /* SVGSMILElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4AFD0090DAF335400F5F55C /* SVGSMILElement.cpp */; }; 
     3905                E4AFD0100DAF335500F5F55C /* SVGSMILElement.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AFD00A0DAF335400F5F55C /* SVGSMILElement.h */; }; 
    39043906                E4C279580CF9741900E97B98 /* RenderMedia.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4C279560CF9741900E97B98 /* RenderMedia.cpp */; }; 
    39053907                E4C279590CF9741900E97B98 /* RenderMedia.h in Headers */ = {isa = PBXBuildFile; fileRef = E4C279570CF9741900E97B98 /* RenderMedia.h */; }; 
     
    73857387                B28C6A200D00C44800334AA4 /* SVGImageLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGImageLoader.cpp; sourceTree = "<group>"; }; 
    73867388                B28C6A210D00C44800334AA4 /* SVGImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGImageLoader.h; sourceTree = "<group>"; }; 
    7387                 B28C6A220D00C44800334AA4 /* SVGTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTimer.cpp; sourceTree = "<group>"; }; 
    7388                 B28C6A230D00C44800334AA4 /* SVGTimer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGTimer.h; sourceTree = "<group>"; }; 
    7389                 B28C6A240D00C44800334AA4 /* TimeScheduler.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = TimeScheduler.cpp; sourceTree = "<group>"; }; 
    7390                 B28C6A250D00C44800334AA4 /* TimeScheduler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = TimeScheduler.h; sourceTree = "<group>"; }; 
    73917389                B28C6A260D00C44800334AA4 /* xlinkattrs.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = xlinkattrs.in; sourceTree = "<group>"; }; 
    73927390                B297BC6F0B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGPathSegListCustom.cpp; sourceTree = "<group>"; }; 
     
    81458143                E44614130CD6826900FADA75 /* JSTimeRanges.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTimeRanges.h; sourceTree = "<group>"; }; 
    81468144                E4AFCFA40DAF29A300F5F55C /* UnitBezier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnitBezier.h; sourceTree = "<group>"; }; 
     8145                E4AFD0050DAF335400F5F55C /* SMILTime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SMILTime.cpp; sourceTree = "<group>"; }; 
     8146                E4AFD0060DAF335400F5F55C /* SMILTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMILTime.h; sourceTree = "<group>"; }; 
     8147                E4AFD0070DAF335400F5F55C /* SMILTimeContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SMILTimeContainer.cpp; sourceTree = "<group>"; }; 
     8148                E4AFD0080DAF335400F5F55C /* SMILTimeContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SMILTimeContainer.h; sourceTree = "<group>"; }; 
     8149                E4AFD0090DAF335400F5F55C /* SVGSMILElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGSMILElement.cpp; sourceTree = "<group>"; }; 
     8150                E4AFD00A0DAF335400F5F55C /* SVGSMILElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGSMILElement.h; sourceTree = "<group>"; }; 
    81478151                E4B41E010CBF8EAA00AF2ECE /* ProgressEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProgressEvent.cpp; sourceTree = "<group>"; }; 
    81488152                E4B41E020CBF8EAA00AF2ECE /* ProgressEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgressEvent.h; sourceTree = "<group>"; }; 
     
    1104811052                        isa = PBXGroup; 
    1104911053                        children = ( 
     11054                                E46E97860DAAD61B0071E894 /* animation */, 
    1105011055                                B25598860D00D8B800BB825C /* graphics */, 
    1105111056                                B22277CB0D00BF1F0071B782 /* ColorDistance.cpp */, 
     
    1143111436                                B222793B0D00BF210071B782 /* SVGTextPositioningElement.h */, 
    1143211437                                B222793C0D00BF210071B782 /* SVGTextPositioningElement.idl */, 
    11433                                 B28C6A220D00C44800334AA4 /* SVGTimer.cpp */, 
    11434                                 B28C6A230D00C44800334AA4 /* SVGTimer.h */, 
    1143511438                                B222793D0D00BF210071B782 /* SVGTitleElement.cpp */, 
    1143611439                                B222793E0D00BF210071B782 /* SVGTitleElement.h */, 
     
    1147311476                                B2E4EC950D00C22B00432643 /* SVGZoomEvent.h */, 
    1147411477                                B2E4EC960D00C22B00432643 /* SVGZoomEvent.idl */, 
    11475                                 B28C6A240D00C44800334AA4 /* TimeScheduler.cpp */, 
    11476                                 B28C6A250D00C44800334AA4 /* TimeScheduler.h */, 
    1147711478                                B28C6A260D00C44800334AA4 /* xlinkattrs.in */, 
    1147811479                        ); 
     
    1230612307                        tabWidth = 4; 
    1230712308                        usesTabs = 0; 
     12309                }; 
     12310                E46E97860DAAD61B0071E894 /* animation */ = { 
     12311                        isa = PBXGroup; 
     12312                        children = ( 
     12313                                E4AFD0050DAF335400F5F55C /* SMILTime.cpp */, 
     12314                                E4AFD0060DAF335400F5F55C /* SMILTime.h */, 
     12315                                E4AFD0070DAF335400F5F55C /* SMILTimeContainer.cpp */, 
     12316                                E4AFD0080DAF335400F5F55C /* SMILTimeContainer.h */, 
     12317                                E4AFD0090DAF335400F5F55C /* SVGSMILElement.cpp */, 
     12318                                E4AFD00A0DAF335400F5F55C /* SVGSMILElement.h */, 
     12319                        ); 
     12320                        path = animation; 
     12321                        sourceTree = "<group>"; 
    1230812322                }; 
    1230912323                ED501DC90B249F3900AE18D9 /* mac */ = { 
     
    1447314487                                B2227ACE0D00BF220071B782 /* SVGTextPathElement.h in Headers */, 
    1447414488                                B2227AD10D00BF220071B782 /* SVGTextPositioningElement.h in Headers */, 
    14475                                 B28C6A2C0D00C44800334AA4 /* SVGTimer.h in Headers */, 
    1447614489                                B2227AD40D00BF220071B782 /* SVGTitleElement.h in Headers */, 
    1447714490                                B2227AD70D00BF220071B782 /* SVGTransform.h in Headers */, 
     
    1454614559                                51DF6D7E0B92A16D00C2DC85 /* ThreadCheck.h in Headers */, 
    1454714560                                E44613B00CD6331000FADA75 /* TimeRanges.h in Headers */, 
    14548                                 B28C6A2E0D00C44800334AA4 /* TimeScheduler.h in Headers */, 
    1454914561                                9305B24D098F1B6B00C28855 /* Timer.h in Headers */, 
    1455014562                                BCCFBAE80B5152ED0001F1D7 /* Tokenizer.h in Headers */, 
     
    1475914771                                51BE37E00DAEE00E001085FC /* StorageArea.h in Headers */, 
    1476014772                                E4AFCFA50DAF29A300F5F55C /* UnitBezier.h in Headers */, 
     14773                                E4AFD00C0DAF335400F5F55C /* SMILTime.h in Headers */, 
     14774                                E4AFD00E0DAF335500F5F55C /* SMILTimeContainer.h in Headers */, 
     14775                                E4AFD0100DAF335500F5F55C /* SVGSMILElement.h in Headers */, 
    1476114776                        ); 
    1476214777                        runOnlyForDeploymentPostprocessing = 0; 
     
    1617416189                                B2227ACD0D00BF220071B782 /* SVGTextPathElement.cpp in Sources */, 
    1617516190                                B2227AD00D00BF220071B782 /* SVGTextPositioningElement.cpp in Sources */, 
    16176                                 B28C6A2B0D00C44800334AA4 /* SVGTimer.cpp in Sources */, 
    1617716191                                B2227AD30D00BF220071B782 /* SVGTitleElement.cpp in Sources */, 
    1617816192                                B2227AD60D00BF220071B782 /* SVGTransform.cpp in Sources */, 
     
    1624416258                                51DF6D800B92A18E00C2DC85 /* ThreadCheck.mm in Sources */, 
    1624516259                                E44613AF0CD6331000FADA75 /* TimeRanges.cpp in Sources */, 
    16246                                 B28C6A2D0D00C44800334AA4 /* TimeScheduler.cpp in Sources */, 
    1624716260                                93309EA4099EB78C0056E581 /* Timer.cpp in Sources */, 
    1624816261                                854FE7360A2297BE0058D7AD /* Traversal.cpp in Sources */, 
     
    1644216455                                51D0C5160DAA90B7003B3831 /* JSStorageCustom.cpp in Sources */, 
    1644316456                                51BE37DF0DAEE00E001085FC /* StorageArea.cpp in Sources */, 
     16457                                E4AFD00B0DAF335400F5F55C /* SMILTime.cpp in Sources */, 
     16458                                E4AFD00D0DAF335500F5F55C /* SMILTimeContainer.cpp in Sources */, 
     16459                                E4AFD00F0DAF335500F5F55C /* SVGSMILElement.cpp in Sources */, 
    1644416460                        ); 
    1644516461                        runOnlyForDeploymentPostprocessing = 0; 
  • trunk/WebCore/dom/Document.cpp

    r31746 r31801  
    139139#include "SVGZoomEvent.h" 
    140140#include "SVGStyleElement.h" 
    141 #include "TimeScheduler.h" 
    142141#endif 
    143142 
  • trunk/WebCore/history/CachedPage.cpp

    r31341 r31801  
    108108 
    109109    m_document->setInPageCache(true); 
    110  
    111 #if ENABLE(SVG) 
    112     if (m_document && m_document->svgExtensions()) 
    113         m_document->accessSVGExtensions()->pauseAnimations(); 
    114 #endif 
    115110} 
    116111 
  • trunk/WebCore/svg/SVGAElement.cpp

    r30021 r31801  
    4040#include "RenderSVGInline.h" 
    4141#include "ResourceRequest.h" 
     42#include "SVGSMILElement.h" 
    4243#include "SVGNames.h" 
    4344#include "XLinkNames.h" 
     
    139140            target = (getAttribute(XLinkNames::showAttr) == "new") ? "_blank" : "_self"; 
    140141 
    141         String url = parseURL(href()); 
    142         if (!evt->defaultPrevented()) 
     142        if (!evt->defaultPrevented()) { 
     143            String url = parseURL(href()); 
     144            if (url.startsWith("#")) { 
     145                Element* targetElement = document()->getElementById(url.substring(1)); 
     146                if (SVGSMILElement::isTimingElement(targetElement)) { 
     147                    SVGSMILElement* timed = static_cast<SVGSMILElement*>(targetElement); 
     148                    timed->beginByLinkActivation(); 
     149                    evt->setDefaultHandled(); 
     150                    SVGStyledTransformableElement::defaultEventHandler(evt); 
     151                    return; 
     152                } 
     153            } 
    143154            if (document()->frame()) 
    144155                document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, true); 
     156        } 
    145157 
    146158        evt->setDefaultHandled(); 
  • trunk/WebCore/svg/SVGAnimateColorElement.cpp

    r25754 r31801  
    2727 
    2828#include "Document.h" 
    29 #include "TimeScheduler.h" 
    3029#include "PlatformString.h" 
    3130#include "SVGColor.h" 
     
    3534 
    3635namespace WebCore { 
     36     
     37// FIXME: This class needs to die. SVGAnimateElement (which has superset of the functionality) should be instantiated instead. 
    3738 
    3839SVGAnimateColorElement::SVGAnimateColorElement(const QualifiedName& tagName, Document* doc) 
     
    4546} 
    4647 
    47 bool SVGAnimateColorElement::updateAnimationBaseValueFromElement() 
     48void SVGAnimateColorElement::applyAnimatedValueToElement(unsigned repeat) 
    4849{ 
    49     m_baseColor = SVGColor::colorFromRGBColorString(targetAttributeAnimatedValue()); 
    50     m_fromColor = Color(); 
    51     m_toColor = Color(); 
     50    if (isAdditive()) { 
     51        Color baseColor = SVGColor::colorFromRGBColorString(m_savedBaseValue); 
     52        setTargetAttributeAnimatedValue(ColorDistance::addColorsAndClamp(baseColor, m_animatedColor).name()); 
     53    } else 
     54        setTargetAttributeAnimatedValue(m_animatedColor.name()); 
     55} 
     56 
     57bool SVGAnimateColorElement::updateAnimatedValue(float percentage) 
     58{ 
     59    Color oldColor = m_animatedColor; 
     60    m_animatedColor = ColorDistance(m_fromColor, m_toColor).scaledDistance(percentage).addToColorAndClamp(m_fromColor); 
     61    return m_animatedColor != oldColor; 
     62} 
     63     
     64bool SVGAnimateColorElement::calculateFromAndToValues(const String& fromString, const String& toString) 
     65{ 
     66    m_fromColor = SVGColor::colorFromRGBColorString(fromString); 
     67    m_toColor = SVGColor::colorFromRGBColorString(toString); 
    5268    return true; 
    5369} 
    5470 
    55 void SVGAnimateColorElement::applyAnimatedValueToElement() 
     71bool SVGAnimateColorElement::calculateFromAndByValues(const String& fromString, const String& byString) 
    5672{ 
    57     if (isAdditive()) 
    58         setTargetAttributeAnimatedValue(ColorDistance::addColorsAndClamp(m_baseColor, m_animatedColor).name()); 
    59     else 
    60         setTargetAttributeAnimatedValue(m_animatedColor.name()); 
    61 } 
    62  
    63 bool SVGAnimateColorElement::updateAnimatedValue(EAnimationMode animationMode, float timePercentage, unsigned valueIndex, float percentagePast) 
    64 { 
    65     if (animationMode == TO_ANIMATION) 
    66         // to-animations have a special equation: value = (to - base) * (time/duration) + base 
    67         m_animatedColor = ColorDistance(m_baseColor, m_toColor).scaledDistance(timePercentage).addToColorAndClamp(m_baseColor); 
    68     else 
    69         m_animatedColor = ColorDistance(m_fromColor, m_toColor).scaledDistance(percentagePast).addToColorAndClamp(m_fromColor); 
    70     return (m_animatedColor != m_baseColor); 
    71 } 
    72  
    73 bool SVGAnimateColorElement::calculateFromAndToValues(EAnimationMode animationMode, unsigned valueIndex) 
    74 { 
    75     switch (animationMode) { 
    76     case FROM_TO_ANIMATION: 
    77         m_fromColor = SVGColor::colorFromRGBColorString(m_from); 
    78         // fall through 
    79     case TO_ANIMATION: 
    80         m_toColor = SVGColor::colorFromRGBColorString(m_to); 
    81         break; 
    82     case FROM_BY_ANIMATION: 
    83         m_fromColor = SVGColor::colorFromRGBColorString(m_from); 
    84         m_toColor = SVGColor::colorFromRGBColorString(m_by); 
    85         break; 
    86     case BY_ANIMATION: 
    87         m_fromColor = SVGColor::colorFromRGBColorString(m_from); 
    88         m_toColor = ColorDistance::addColorsAndClamp(m_fromColor, SVGColor::colorFromRGBColorString(m_by)); 
    89         break; 
    90     case VALUES_ANIMATION: 
    91         m_fromColor = SVGColor::colorFromRGBColorString(m_values[valueIndex]); 
    92         m_toColor = ((valueIndex + 1) < m_values.size()) ? SVGColor::colorFromRGBColorString(m_values[valueIndex + 1]) : m_fromColor; 
    93         break; 
    94     case NO_ANIMATION: 
    95         ASSERT_NOT_REACHED(); 
    96     } 
    97      
     73    m_fromColor = SVGColor::colorFromRGBColorString(fromString); 
     74    m_toColor = ColorDistance::addColorsAndClamp(m_fromColor, SVGColor::colorFromRGBColorString(byString)); 
    9875    return true; 
    9976} 
  • trunk/WebCore/svg/SVGAnimateColorElement.h

    r31600 r31801  
    3838        SVGAnimateColorElement(const QualifiedName&, Document*); 
    3939        virtual ~SVGAnimateColorElement(); 
    40          
    41         virtual bool updateAnimationBaseValueFromElement(); 
    42         virtual void applyAnimatedValueToElement(); 
    4340 
    4441    protected: 
    4542        virtual const SVGElement* contextElement() const { return this; } 
    4643         
    47         virtual bool updateAnimatedValue(EAnimationMode, float timePercentage, unsigned valueIndex, float percentagePast); 
    48         virtual bool calculateFromAndToValues(EAnimationMode, unsigned valueIndex); 
     44        virtual void applyAnimatedValueToElement(unsigned repeat); 
     45        virtual bool updateAnimatedValue(float percent); 
     46        virtual bool calculateFromAndToValues(const String& fromString, const String& toString); 
     47        virtual bool calculateFromAndByValues(const String& fromString, const String& byString); 
    4948 
    5049    private: 
    5150        Color m_baseColor; 
    5251        Color m_animatedColor; 
    53  
    5452        Color m_toColor; 
    5553        Color m_fromColor; 
  • trunk/WebCore/svg/SVGAnimateElement.cpp

    r28568 r31801  
    22    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org> 
    33                  2004, 2005, 2006 Rob Buis <buis@kde.org> 
     4    Copyright (C) 2008 Apple Inc. All rights reserved. 
    45 
    56    This file is part of the KDE project 
     
    2526#include "SVGAnimateElement.h" 
    2627 
    27 #include "TimeScheduler.h" 
    28 #include "SVGDocumentExtensions.h" 
    29 #include "SVGSVGElement.h" 
     28#include "ColorDistance.h" 
     29#include "SVGColor.h" 
     30#include "SVGParserUtilities.h" 
     31 
     32using namespace std; 
    3033 
    3134namespace WebCore { 
     
    3336SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, Document* doc) 
    3437    : SVGAnimationElement(tagName, doc) 
    35     , m_currentItem(-1) 
     38    , m_propertyType(StringProperty) 
     39    , m_fromNumber(0) 
     40    , m_toNumber(0) 
     41    , m_animatedNumber(numeric_limits<double>::infinity()) 
    3642{ 
    3743} 
     
    4147} 
    4248 
     49static bool parseNumberValueAndUnit(const String& in, double& value, String& unit) 
     50{ 
     51    // FIXME: These are from top of my head, figure out all property types that can be animated as numbers. 
     52    unsigned unitLength = 0; 
     53    String parse = in.stripWhiteSpace(); 
     54    if (parse.endsWith("%")) 
     55        unitLength = 1; 
     56    else if (parse.endsWith("px") || parse.endsWith("pt") || parse.endsWith("em")) 
     57        unitLength = 2; 
     58    else if (parse.endsWith("deg") || parse.endsWith("rad")) 
     59        unitLength = 3; 
     60    else if (parse.endsWith("grad")) 
     61        unitLength = 4; 
     62    String newUnit = parse.right(unitLength); 
     63    String number = parse.left(parse.length() - unitLength); 
     64    if (!unit.isEmpty() && newUnit != unit || number.isEmpty()) 
     65        return false; 
     66    UChar last = number[number.length() - 1]; 
     67    if (last < '0' || last > '9') 
     68        return false; 
     69    unit = newUnit; 
     70    bool ok; 
     71    value = number.toDouble(&ok); 
     72    return ok; 
     73} 
     74 
     75void SVGAnimateElement::applyAnimatedValueToElement(unsigned repeat) 
     76{ 
     77    // FIXME: This is entirely wrong way to do additive. It won't work with 
     78    // multiple animations on the same element. 
     79    // We need to add together all animation contributions per property and 
     80    // then apply in one go. 
     81    String valueToApply; 
     82    if (m_propertyType == NumberProperty) { 
     83        double number = m_animatedNumber; 
     84        // FIXME: This does not work for values animation. 
     85        if (isAccumulated() && repeat) 
     86            number += m_toNumber * repeat; 
     87        if (isAdditive()) { 
     88            double base; 
     89            if (!parseNumberValueAndUnit(m_savedBaseValue, base, m_numberUnit)) 
     90                return; 
     91            number += base; 
     92        } 
     93        valueToApply = String::number(number) + m_numberUnit; 
     94    } else if (m_propertyType == ColorProperty) { 
     95        Color base = SVGColor::colorFromRGBColorString(m_savedBaseValue); 
     96        if (isAdditive()) 
     97            valueToApply = ColorDistance::addColorsAndClamp(base, m_animatedColor).name(); 
     98        else 
     99            valueToApply = m_animatedColor.name(); 
     100    } else 
     101        valueToApply = m_animatedString; 
     102    setTargetAttributeAnimatedValue(valueToApply); 
     103} 
     104 
     105bool SVGAnimateElement::updateAnimatedValue(float percentage) 
     106{ 
     107    if (m_propertyType == NumberProperty) { 
     108        double oldValue = m_animatedNumber; 
     109        m_animatedNumber = (m_toNumber - m_fromNumber) * percentage + m_fromNumber; 
     110        return oldValue == m_animatedNumber; 
     111    }  
     112    if (m_propertyType == ColorProperty) { 
     113        m_animatedColor = ColorDistance(m_fromColor, m_toColor).scaledDistance(percentage).addToColorAndClamp(m_fromColor); 
     114        return true; 
     115    } 
     116     
     117    AnimationMode animationMode = this->animationMode(); 
     118    ASSERT(animationMode == FromToAnimation || animationMode == ToAnimation || animationMode == ValuesAnimation); 
     119    String oldValue = m_animatedString; 
     120    if ((animationMode == FromToAnimation && percentage > 0.5f) || animationMode == ToAnimation || percentage == 1.0f) 
     121        m_animatedString = m_toString; 
     122    else 
     123        m_animatedString = m_fromString; 
     124    return oldValue == m_animatedString; 
     125} 
     126  
     127static bool isColorAttribute(const String& attribute) 
     128{ 
     129    return attribute == "color" || attribute == "fill" || attribute == "stroke"; 
     130} 
     131 
     132bool SVGAnimateElement::calculateFromAndToValues(const String& fromString, const String& toString) 
     133{ 
     134    // FIXME: Needs more solid way determine target attribute type. 
     135    m_propertyType = isColorAttribute(attributeName()) ? ColorProperty : NumberProperty; 
     136    if (m_propertyType == ColorProperty) { 
     137        m_fromColor = SVGColor::colorFromRGBColorString(fromString); 
     138        m_toColor = SVGColor::colorFromRGBColorString(toString); 
     139        if (m_fromColor.isValid() && m_toColor.isValid()) 
     140            return true; 
     141    } else { 
     142        m_numberUnit = String(); 
     143        if (parseNumberValueAndUnit(fromString, m_fromNumber, m_numberUnit)) { 
     144            if (parseNumberValueAndUnit(toString, m_toNumber, m_numberUnit)) 
     145                return true; 
     146        } 
     147    } 
     148    m_fromString = fromString; 
     149    m_toString = toString; 
     150    m_propertyType = StringProperty; 
     151    return true; 
     152} 
     153 
     154bool SVGAnimateElement::calculateFromAndByValues(const String& fromString, const String& byString) 
     155{ 
     156    m_propertyType = isColorAttribute(attributeName()) ? ColorProperty : NumberProperty; 
     157    if (m_propertyType == ColorProperty) { 
     158        m_fromColor = fromString.isEmpty() ? Color() : SVGColor::colorFromRGBColorString(fromString); 
     159        m_toColor = ColorDistance::addColorsAndClamp(m_fromColor, SVGColor::colorFromRGBColorString(byString)); 
     160        if (!m_fromColor.isValid() || !m_toColor.isValid()) 
     161            return false; 
     162    } else { 
     163        m_numberUnit = String(); 
     164        m_fromNumber = 0; 
     165        if (!fromString.isEmpty() && !parseNumberValueAndUnit(fromString, m_fromNumber, m_numberUnit)) 
     166            return false; 
     167        if (!parseNumberValueAndUnit(byString, m_toNumber, m_numberUnit)) 
     168            return false; 
     169        m_toNumber += m_fromNumber; 
     170    } 
     171    return true; 
     172} 
     173 
    43174} 
    44175 
  • trunk/WebCore/svg/SVGAnimateElement.h

    r31600 r31801  
    22    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org> 
    33                  2004, 2005 Rob Buis <buis@kde.org> 
     4    Copyright (C) 2008 Apple Inc. All rights reserved. 
    45 
    56    This file is part of the KDE project 
     
    3839        virtual const SVGElement* contextElement() const { return this; } 
    3940         
    40         virtual bool updateAnimatedValue(EAnimationMode, float timePercentage, unsigned valueIndex, float percentagePast) { return false; } 
    41         virtual bool calculateFromAndToValues(EAnimationMode, unsigned valueIndex) { return false; } 
     41        virtual bool calculateFromAndToValues(const String& fromString, const String& toString); 
     42        virtual bool calculateFromAndByValues(const String& fromString, const String& byString); 
     43        virtual bool updateAnimatedValue(float percentage); 
     44        virtual void applyAnimatedValueToElement(unsigned repeat); 
    4245 
    4346    private: 
    44         int m_currentItem; 
    45  
    46         String m_savedTo; 
     47        enum PropertyType { NumberProperty, ColorProperty, StringProperty }; 
     48        PropertyType m_propertyType; 
     49         
     50        double m_fromNumber; 
     51        double m_toNumber; 
     52        double m_animatedNumber; 
     53        String m_numberUnit; 
     54        Color m_fromColor; 
     55        Color m_toColor; 
     56        Color m_animatedColor; 
     57        String m_fromString; 
     58        String m_toString; 
     59        String m_animatedString; 
    4760    }; 
    4861 
  • trunk/WebCore/svg/SVGAnimateMotionElement.cpp

    r29663 r31801  
    3737SVGAnimateMotionElement::SVGAnimateMotionElement(const QualifiedName& tagName, Document* doc) 
    3838    : SVGAnimationElement(tagName, doc) 
     39    , m_baseIndexInTransformList(0) 
    3940    , m_rotateMode(AngleMode) 
    4041    , m_angle(0) 
    4142{ 
    42     m_calcMode = CALCMODE_PACED; 
    4343} 
    4444 
     
    8787        } 
    8888    } else if (attr->name() == SVGNames::keyPointsAttr) { 
    89         m_keyPoints.clear(); 
    90         parseKeyNumbers(m_keyPoints, attr->value()); 
     89        // FIXME: Implement key points. 
    9190    } else if (attr->name() == SVGNames::dAttr) { 
    9291        m_path = Path(); 
     
    112111} 
    113112 
    114 bool SVGAnimateMotionElement::updateAnimatedValue(EAnimationMode animationMode, float timePercentage, unsigned valueIndex, float percentagePast) 
    115 { 
    116     if (animationMode == TO_ANIMATION) { 
    117         // to-animations have a special equation: value = (to - base) * (time/duration) + base 
    118         m_animatedTranslation.setWidth((m_toPoint.x() - m_basePoint.x()) * timePercentage + m_basePoint.x()); 
    119         m_animatedTranslation.setHeight((m_toPoint.y() - m_basePoint.y()) * timePercentage + m_basePoint.y()); 
    120         m_animatedAngle = 0.0f; 
    121     } else { 
    122         m_animatedTranslation.setWidth(m_pointDiff.width() * percentagePast + m_fromPoint.x()); 
    123         m_animatedTranslation.setHeight(m_pointDiff.height() * percentagePast + m_fromPoint.y()); 
    124         m_animatedAngle = m_angleDiff * percentagePast + m_fromAngle; 
    125     } 
     113bool SVGAnimateMotionElement::updateAnimatedValue(float percentage) 
     114{ 
     115    FloatSize diff = m_toPoint - m_fromPoint; 
     116    m_animatedTranslation.setWidth(diff.width() * percentage + m_fromPoint.x()); 
     117    m_animatedTranslation.setHeight(diff.height() * percentage + m_fromPoint.y()); 
     118    // FIXME: Animate angles 
     119    m_animatedAngle = 0; 
    126120    return true; 
    127121} 
     
    147141    point = FloatPoint(x, y); 
    148142     
    149     // disallow anying except spaces at the end 
     143    // disallow anything except spaces at the end 
    150144    return !skipOptionalSpaces(cur, end); 
    151145} 
    152146 
    153 bool SVGAnimateMotionElement::calculateFromAndToValues(EAnimationMode animationMode, unsigned valueIndex) 
    154 { 
    155     m_fromAngle = 0.0f; 
    156     m_toAngle = 0.0f; 
    157     switch (animationMode) { 
    158     case FROM_TO_ANIMATION: 
    159         parsePoint(m_from, m_fromPoint); 
    160         // fall through 
    161     case TO_ANIMATION: 
    162         parsePoint(m_to, m_toPoint); 
    163         break; 
    164     case FROM_BY_ANIMATION: 
    165         parsePoint(m_from, m_fromPoint); 
    166         parsePoint(m_to, m_toPoint); 
    167         break; 
    168     case BY_ANIMATION: 
    169     { 
    170         parsePoint(m_from, m_fromPoint); 
    171         FloatPoint byPoint; 
    172         parsePoint(m_by, byPoint); 
    173         m_toPoint = FloatPoint(m_fromPoint.x() + byPoint.x(), m_fromPoint.y() + byPoint.y()); 
    174         break; 
    175     } 
    176     case VALUES_ANIMATION: 
    177         parsePoint(m_values[valueIndex], m_fromPoint); 
    178         if ((valueIndex + 1) < m_values.size()) 
    179             parsePoint(m_values[valueIndex + 1], m_toPoint); 
    180         else 
    181             m_toPoint = m_fromPoint; 
    182         break; 
    183     case NO_ANIMATION: 
    184         ASSERT_NOT_REACHED(); 
    185     } 
    186      
    187     m_pointDiff = m_toPoint - m_fromPoint; 
    188     m_angleDiff = 0.0f; 
    189     return (m_pointDiff.width() != 0 || m_pointDiff.height() != 0); 
    190 } 
    191  
    192 bool SVGAnimateMotionElement::updateAnimationBaseValueFromElement() 
    193 { 
    194     if (!targetElement()->isStyledTransformable()) 
    195         return false; 
    196      
    197     m_basePoint = static_cast<SVGStyledTransformableElement*>(targetElement())->getBBox().location(); 
     147bool SVGAnimateMotionElement::calculateFromAndToValues(const String& fromString, const String& toString) 
     148{ 
     149    parsePoint(fromString, m_fromPoint); 
     150    parsePoint(toString, m_toPoint); 
    198151    return true; 
    199152} 
    200  
    201 void SVGAnimateMotionElement::applyAnimatedValueToElement() 
     153     
     154bool SVGAnimateMotionElement::calculateFromAndByValues(const String& fromString, const String& byString) 
     155{ 
     156    parsePoint(fromString, m_fromPoint); 
     157    FloatPoint byPoint; 
     158    parsePoint(byString, byPoint); 
     159    m_toPoint = FloatPoint(m_fromPoint.x() + byPoint.x(), m_fromPoint.y() + byPoint.y()); 
     160    return true; 
     161} 
     162 
     163void SVGAnimateMotionElement::applyAnimatedValueToElement(unsigned repeat) 
    202164{ 
    203165    if (!targetElement()->isStyledTransformable()) 
     
    209171        return; 
    210172     
     173    // FIXME: Handle multiple additive animations. 
    211174    ExceptionCode ec; 
    212     if (!isAdditive()) 
     175    if (isAdditive()) { 
     176        while (transformList->numberOfItems() > m_baseIndexInTransformList) 
     177            transformList->removeItem(transformList->numberOfItems() - 1, ec); 
     178    } else 
    213179        transformList->clear(ec); 
    214      
     180 
    215181    AffineTransform transform; 
    216182    transform.rotate(m_animatedAngle); 
     
    219185        transformList->appendItem(SVGTransform(transform), ec); 
    220186        transformableElement->setTransform(transformList.get()); 
    221         if (transformableElement->renderer()) 
    222             transformableElement->renderer()->setNeedsLayout(true); // should be part of setTransform 
    223187    } 
     188    if (transformableElement->renderer()) 
     189        transformableElement->renderer()->setNeedsLayout(true); // should be part of setTransform 
     190} 
     191 
     192void SVGAnimateMotionElement::startedActiveInterval() 
     193{ 
     194    // FIXME: Make multiple additive animations work. 
     195    SVGAnimationElement::startedActiveInterval(); 
     196    if (!m_animationValid) 
     197        return; 
     198     
     199    SVGStyledTransformableElement* transformableElement = static_cast<SVGStyledTransformableElement*>(targetElement()); 
     200    m_baseIndexInTransformList = transformableElement->transform()->numberOfItems(); 
    224201} 
    225202 
  • trunk/WebCore/svg/SVGAnimateMotionElement.h

    r31600 r31801  
    3737        virtual bool hasValidTarget() const; 
    3838         
    39         virtual bool updateAnimationBaseValueFromElement(); 
    40         virtual void applyAnimatedValueToElement(); 
     39        virtual void applyAnimatedValueToElement(unsigned repeat); 
    4140         
    4241        virtual void parseMappedAttribute(MappedAttribute*); 
     
    4746        virtual const SVGElement* contextElement() const { return this; } 
    4847         
    49         virtual bool updateAnimatedValue(EAnimationMode, float timePercentage, unsigned valueIndex, float percentagePast); 
    50         virtual bool calculateFromAndToValues(EAnimationMode, unsigned valueIndex); 
     48        virtual bool updateAnimatedValue(float percent); 
     49        virtual bool calculateFromAndToValues(const String& fromString, const String& toString); 
     50        virtual bool calculateFromAndByValues(const String& fromString, const String& byString); 
     51         
     52        virtual void startedActiveInterval(); 
    5153         
    5254    private: 
    53         FloatPoint m_basePoint; 
    5455        FloatSize m_animatedTranslation; 
    5556        float m_animatedAngle; 
     
    6162        float m_toAngle; 
    6263         
    63         FloatSize m_pointDiff; 
    64         float m_angleDiff; 
    65          
     64        unsigned m_baseIndexInTransformList; 
     65                 
    6666        Path m_path; 
    6767        Vector<float> m_keyPoints; 
  • trunk/WebCore/svg/SVGAnimateTransformElement.cpp

    r28568 r31801  
    3232#include "SVGSVGElement.h" 
    3333#include "SVGStyledTransformableElement.h" 
     34#include "SVGTextElement.h" 
    3435#include "SVGTransform.h" 
    3536#include "SVGTransformList.h" 
    36 #include "TimeScheduler.h" 
    3737 
    3838#include <math.h> 
     
    4646    : SVGAnimationElement(tagName, doc) 
    4747    , m_type(SVGTransform::SVG_TRANSFORM_UNKNOWN) 
     48    , m_baseIndexInTransformList(0) 
    4849{ 
    4950} 
     
    5556bool SVGAnimateTransformElement::hasValidTarget() const 
    5657{ 
    57     return (SVGAnimationElement::hasValidTarget() && targetElement()->isStyledTransformable()); 
     58    SVGElement* targetElement = this->targetElement(); 
     59    return SVGAnimationElement::hasValidTarget() && (targetElement->isStyledTransformable() || targetElement->hasTagName(SVGNames::textTag)); 
    5860} 
    5961 
     
    7577} 
    7678 
    77 bool SVGAnimateTransformElement::updateAnimatedValue(EAnimationMode animationMode, float timePercentage, unsigned valueIndex, float percentagePast) 
     79bool SVGAnimateTransformElement::updateAnimatedValue(float percentage) 
    7880{ 
    79     if (animationMode == TO_ANIMATION) 
    80         // to-animations have a special equation: value = (to - base) * (time/duration) + base 
    81         m_animatedTransform = SVGTransformDistance(m_baseTransform, m_toTransform).scaledDistance(timePercentage).addToSVGTransform(m_baseTransform); 
    82     else 
    83         m_animatedTransform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(percentagePast).addToSVGTransform(m_fromTransform); 
    84     return (m_animatedTransform != m_baseTransform); 
     81    m_animatedTransform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(percentage).addToSVGTransform(m_fromTransform); 
     82    return true; 
     83} 
     84     
     85static PassRefPtr<SVGTransformList> transformListFor(SVGElement* element) 
     86{ 
     87    ASSERT(element); 
     88    if (element->isStyledTransformable()) 
     89        return static_cast<SVGStyledTransformableElement*>(element)->transform(); 
     90    if (element->hasTagName(SVGNames::textTag)) 
     91        return static_cast<SVGTextElement*>(element)->transform(); 
     92    return 0; 
    8593} 
    8694 
    87 bool SVGAnimateTransformElement::updateAnimationBaseValueFromElement() 
     95void SVGAnimateTransformElement::applyAnimatedValueToElement(unsigned repeat) 
    8896{ 
    89     m_baseTransform = SVGTransform(); 
    90     m_toTransform = SVGTransform(); 
    91     m_fromTransform = SVGTransform(); 
    92     m_animatedTransform = SVGTransform(); 
     97    SVGElement* targetElement = this->targetElement(); 
     98    RefPtr<SVGTransformList> transformList = transformListFor(targetElement); 
     99    ASSERT(transformList); 
     100 
     101    // FIXME: Handle multiple additive tranforms. 
     102    // FIXME: Handle accumulate. 
     103    ExceptionCode ec; 
     104    if (isAdditive()) { 
     105        while (transformList->numberOfItems() > m_baseIndexInTransformList) 
     106            transformList->removeItem(transformList->numberOfItems() - 1, ec); 
     107    } else 
     108        transformList->clear(ec); 
     109    transformList->appendItem(m_animatedTransform, ec); 
    93110     
    94     if (!targetElement()->isStyledTransformable()) 
     111    if (targetElement->renderer()) 
     112        targetElement->renderer()->setNeedsLayout(true); // should really be in setTransform 
     113} 
     114     
     115bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromString, const String& toString) 
     116{ 
     117    m_fromTransform = parseTransformValue(fromString); 
     118    if (!m_fromTransform.isValid()) 
    95119        return false; 
    96      
    97     SVGStyledTransformableElement* transform = static_cast<SVGStyledTransformableElement*>(targetElement()); 
    98     RefPtr<SVGTransformList> transformList = transform->transform(); 
    99     if (!transformList) 
    100         return false; 
    101      
    102     m_baseTransform = transformList->concatenateForType(m_type); 
    103      
    104     // If a base value is empty, its type should match m_type instead of being unknown. 
    105     // It's not certain whether this should be part of SVGTransformList or not -- cying 
    106     if (m_baseTransform.type() == SVGTransform::SVG_TRANSFORM_UNKNOWN) 
    107         m_baseTransform = SVGTransform(m_type); 
    108          
    109     return true; 
     120    m_toTransform = parseTransformValue(toString); 
     121    return m_toTransform.isValid(); 
    110122} 
    111123 
    112 void SVGAnimateTransformElement::applyAnimatedValueToElement() 
     124bool SVGAnimateTransformElement::calculateFromAndByValues(const String& fromString, const String& byString) 
    113125{ 
    114     if (!targetElement()->isStyledTransformable()) 
     126 
     127    m_fromTransform = parseTransformValue(fromString); 
     128    if (!m_fromTransform.isValid()) 
     129        return false; 
     130    m_toTransform = SVGTransformDistance::addSVGTransforms(m_fromTransform, parseTransformValue(byString)); 
     131    return m_toTransform.isValid(); 
     132} 
     133     
     134void SVGAnimateTransformElement::startedActiveInterval() 
     135{ 
     136    // FIXME: Make multiple additive animations work. 
     137    SVGAnimationElement::startedActiveInterval(); 
     138    if (!m_animationValid) 
    115139        return; 
    116140     
    117     SVGStyledTransformableElement* transform = static_cast<SVGStyledTransformableElement*>(targetElement()); 
    118     RefPtr<SVGTransformList> transformList = transform->transform(); 
    119     if (!transformList) 
    120         return; 
    121      
    122     ExceptionCode ec; 
    123     if (!isAdditive()) 
    124         transformList->clear(ec); 
    125      
    126     transformList->appendItem(m_animatedTransform, ec); 
    127     transform->setTransform(transformList.get()); 
    128     if (transform->renderer()) 
    129         transform->renderer()->setNeedsLayout(true); // should really be in setTransform 
    130 } 
    131  
    132 bool SVGAnimateTransformElement::calculateFromAndToValues(EAnimationMode animationMode, unsigned valueIndex) 
    133 { 
    134     switch (animationMode) { 
    135     case FROM_TO_ANIMATION: 
    136         m_fromTransform = parseTransformValue(m_from); 
    137         // fall through 
    138     case TO_ANIMATION: 
    139         m_toTransform = parseTransformValue(m_to); 
    140         break; 
    141     case FROM_BY_ANIMATION: 
    142         m_fromTransform = parseTransformValue(m_from); 
    143         m_toTransform = parseTransformValue(m_by); 
    144         break; 
    145     case BY_ANIMATION: 
    146         m_fromTransform = parseTransformValue(m_from); 
    147         m_toTransform = SVGTransformDistance::addSVGTransforms(m_fromTransform, parseTransformValue(m_by)); 
    148         break; 
    149     case VALUES_ANIMATION: 
    150         m_fromTransform = parseTransformValue(m_values[valueIndex]); 
    151         m_toTransform = ((valueIndex + 1) < m_values.size()) ? parseTransformValue(m_values[valueIndex + 1]) : m_fromTransform; 
    152         break; 
    153     case NO_ANIMATION: 
    154         ASSERT_NOT_REACHED(); 
    155     } 
    156      
    157     return true; 
     141    RefPtr<SVGTransformList> transformList = transformListFor(targetElement()); 
     142    ASSERT(transformList); 
     143    m_baseIndexInTransformList = transformList->numberOfItems(); 
    158144} 
    159145 
    160146SVGTransform SVGAnimateTransformElement::parseTransformValue(const String& value) const 
    161147{ 
     148    if (value.isEmpty()) 
     149        return SVGTransform(m_type); 
    162150    SVGTransform result; 
    163     const UChar* ptr = value.characters(); 
    164     SVGTransformable::parseTransformValue(m_type, ptr, ptr + value.length(), result); // ignoring return value 
     151    // FIXME: This is pretty dumb but parseTransformValue() wants those parenthesis. 
     152    String parseString("(" + value + ")"); 
     153    const UChar* ptr = parseString.characters(); 
     154    SVGTransformable::parseTransformValue(m_type, ptr, ptr + parseString.length(), result); // ignoring return value 
    165155    return result; 
    166156} 
  • trunk/WebCore/svg/SVGAnimateTransformElement.h

    r31600 r31801  
    4242 
    4343        virtual void parseMappedAttribute(MappedAttribute*); 
    44          
    45         virtual bool updateAnimationBaseValueFromElement(); 
    46         virtual void applyAnimatedValueToElement(); 
     44 
     45        virtual void applyAnimatedValueToElement(unsigned repeat); 
    4746 
    4847    protected: 
    4948        virtual const SVGElement* contextElement() const { return this; } 
    5049         
    51         virtual bool updateAnimatedValue(EAnimationMode, float timePercentage, unsigned valueIndex, float percentagePast); 
    52         virtual bool calculateFromAndToValues(EAnimationMode, unsigned valueIndex); 
     50        virtual bool updateAnimatedValue(float percent); 
     51        virtual bool calculateFromAndToValues(const String& fromString, const String& toString); 
     52        virtual bool calculateFromAndByValues(const String& fromString, const String& byString); 
     53         
     54        virtual void startedActiveInterval(); 
     55         
    5356 
    5457    private: 
     
    5760         
    5861        SVGTransform::SVGTransformType m_type; 
     62         
     63        unsigned m_baseIndexInTransformList; 
    5964 
    6065        SVGTransform m_toTransform; 
    6166        SVGTransform m_fromTransform; 
    6267 
    63         SVGTransform m_baseTransform; 
    6468        SVGTransform m_animatedTransform; 
    6569    }; 
  • trunk/WebCore/svg/SVGAnimationElement.cpp

    r31334 r31801  
    33                  2004, 2005, 2006, 2007 Rob Buis <buis@kde.org> 
    44    Copyright (C) 2007 Eric Seidel <eric@webkit.org> 
     5    Copyright (C) 2008 Apple Inc. All rights reserved. 
    56 
    67    This file is part of the KDE project 
     
    2627#include "SVGAnimationElement.h" 
    2728 
     29#include "CSSComputedStyleDeclaration.h" 
     30#include "CSSParser.h" 
    2831#include "CSSPropertyNames.h" 
    2932#include "Document.h" 
     33#include "Event.h" 
     34#include "EventListener.h" 
    3035#include "FloatConversion.h" 
     36#include "HTMLNames.h" 
    3137#include "SVGNames.h" 
    32 #include "SVGParserUtilities.h" 
    33 #include "SVGSVGElement.h" 
    3438#include "SVGURIReference.h" 
    35 #include "TimeScheduler.h" 
    3639#include "XLinkNames.h" 
    37 #include <float.h> 
    38 #include <math.h> 
    39 #include <wtf/MathExtras.h> 
    40 #include <wtf/Vector.h> 
    4140 
    4241using namespace std; 
     
    4443namespace WebCore { 
    4544     
    46 using namespace SVGNames; 
    47  
    4845SVGAnimationElement::SVGAnimationElement(const QualifiedName& tagName, Document* doc) 
    49     : SVGElement(tagName, doc) 
     46    : SVGSMILElement(tagName, doc) 
    5047    , SVGTests() 
    5148    , SVGExternalResourcesRequired() 
    52     , m_targetElement(0) 
    53     , m_connectedToTimer(false) 
    54     , m_currentTime(0.0) 
    55     , m_simpleDuration(0.0) 
    56     , m_fill(FILL_REMOVE) 
    57     , m_restart(RESTART_ALWAYS) 
    58     , m_calcMode(CALCMODE_LINEAR) 
    59     , m_additive(ADDITIVE_REPLACE) 
    60     , m_accumulate(ACCUMULATE_NONE) 
    61     , m_attributeType(ATTRIBUTETYPE_AUTO) 
    62     , m_max(0.0) 
    63     , m_min(0.0) 
    64     , m_end(0.0) 
    65     , m_begin(0.0) 
    66     , m_repetitions(0) 
    67     , m_repeatCount(0) 
    68     , m_animationBegin(DBL_MAX) 
    69     , m_animationEnd(DBL_MAX) 
    70 { 
    71  
     49    , m_animationValid(false) 
     50{ 
    7251} 
    7352 
     
    7554{ 
    7655} 
    77  
    78 bool SVGAnimationElement::hasValidTarget() const 
    79 { 
    80     return targetElement(); 
    81 } 
    82  
    83 SVGElement* SVGAnimationElement::targetElement() const 
    84 { 
    85     if (!m_targetElement) { 
    86         Node *target = 0; 
    87         if (!m_href.isEmpty()) { 
    88             target = document()->getElementById(SVGURIReference::getTarget(m_href)); 
    89         } else if (parentNode()) { 
    90             // TODO : do we really need to skip non element nodes? Can that happen at all? 
    91             target = parentNode(); 
    92             while (target) { 
    93                 if (target->nodeType() != ELEMENT_NODE) 
    94                     target = target->parentNode(); 
    95                 else 
    96                     break; 
    97             } 
     56     
     57static void parseKeyTimes(const String& parse, Vector<float>& result) 
     58{ 
     59    result.clear(); 
     60    Vector<String> parseList; 
     61    parse.split(';', parseList); 
     62    for (unsigned n = 0; n < parseList.size(); ++n) { 
     63        String timeString = parseList[n]; 
     64        bool ok; 
     65        float time = timeString.toFloat(&ok); 
     66        if (!ok || time < 0 || time > 1.f) 
     67            goto fail; 
     68        if (!n) { 
     69            if (time != 0) 
     70                goto fail; 
     71        } else if (time <= result.last()) 
     72            goto fail; 
     73        result.append(time); 
     74    } 
     75    return; 
     76fail: 
     77    result.clear(); 
     78} 
     79 
     80static void parseKeySplines(const String& parse, Vector<UnitBezier>& result) 
     81{ 
     82    result.clear(); 
     83    Vector<String> parseList; 
     84    parse.split(';', parseList); 
     85    for (unsigned n = 0; n < parseList.size(); ++n) { 
     86        Vector<String> parseSpline; 
     87        parseList[n].split(',', parseSpline); 
     88        // The spec says the sepator is a space, all tests use commas. Weird. 
     89        if (parseSpline.size() == 1)  
     90            parseList[n].split(' ', parseSpline); 
     91        if (parseSpline.size() != 4) 
     92            goto fail; 
     93        double curveValues[4]; 
     94        for (unsigned i = 0; i < 4; ++i) { 
     95            String parseNumber = parseSpline[i];  
     96            bool ok; 
     97            curveValues[i] = parseNumber.toDouble(&ok); 
     98            if (!ok || curveValues[i] < 0.0 || curveValues[i] > 1.0) 
     99                goto fail; 
    98100        } 
    99         if (target && target->isSVGElement()) 
    100             m_targetElement = static_cast<SVGElement*>(target); 
    101     } 
    102   
    103     return m_targetElement; 
    104 } 
    105  
    106 float SVGAnimationElement::getEndTime() const 
    107 { 
    108     return narrowPrecisionToFloat(m_end); 
    109 } 
    110  
    111 float SVGAnimationElement::getStartTime() const 
    112 { 
    113     return narrowPrecisionToFloat(m_begin); 
    114 } 
    115  
    116 float SVGAnimationElement::getCurrentTime() const 
    117 { 
    118     return narrowPrecisionToFloat(m_currentTime); 
    119 } 
    120  
    121 float SVGAnimationElement::getSimpleDuration(ExceptionCode&) const 
    122 { 
    123     return narrowPrecisionToFloat(m_simpleDuration); 
    124 } 
    125  
    126 void SVGAnimationElement::parseKeyNumbers(Vector<float>& keyNumbers, const String& value) 
    127 { 
    128     float number = 0.0f; 
    129      
    130     const UChar* ptr = value.characters(); 
    131     const UChar* end = ptr + value.length(); 
    132     skipOptionalSpaces(ptr, end); 
    133     while (ptr < end) { 
    134         if (!parseNumber(ptr, end, number, false)) 
    135             return; 
    136         keyNumbers.append(number); 
    137          
    138         if (!skipOptionalSpaces(ptr, end) || *ptr != ';') 
    139             return; 
    140         ptr++; 
    141         skipOptionalSpaces(ptr, end); 
    142     } 
    143 } 
    144  
    145 static void parseKeySplines(Vector<SVGAnimationElement::KeySpline>& keySplines, const String& value) 
    146 { 
    147     float number = 0.0f; 
    148     SVGAnimationElement::KeySpline keySpline; 
    149      
    150     const UChar* ptr = value.characters(); 
    151     const UChar* end = ptr + value.length(); 
    152     skipOptionalSpaces(ptr, end); 
    153     while (ptr < end) { 
    154         if (!(parseNumber(ptr, end, number, false) && skipOptionalSpaces(ptr, end))) 
    155             return; 
    156         keySpline.control1.setX(number); 
    157         if (!(parseNumber(ptr, end, number, false) && skipOptionalSpaces(ptr, end))) 
    158             return; 
    159         keySpline.control1.setY(number); 
    160         if (!(parseNumber(ptr, end, number, false) && skipOptionalSpaces(ptr, end))) 
    161             return; 
    162         keySpline.control2.setX(number); 
    163         if (!parseNumber(ptr, end, number, false)) 
    164             return; 
    165         keySpline.control2.setY(number); 
    166         keySplines.append(keySpline); 
    167          
    168         if (!skipOptionalSpaces(ptr, end) || *ptr != ';') 
    169             return; 
    170         ptr++; 
    171         skipOptionalSpaces(ptr, end); 
    172     } 
    173 } 
    174  
    175 void SVGAnimationElement::parseBeginOrEndValue(double& number, const String& value) 
    176 { 
    177     // TODO: Don't use SVGStringList for parsing. 
    178     AtomicString dummy; 
    179     RefPtr<SVGStringList> valueList = SVGStringList::create(QualifiedName(dummy, dummy, dummy)); 
    180     valueList->parse(value, ';'); 
    181      
    182     ExceptionCode ec = 0; 
    183     for (unsigned int i = 0; i < valueList->numberOfItems(); i++) { 
    184         String current = valueList->getItem(i, ec); 
    185          
    186         if (current.startsWith("accessKey")) { 
    187             // Register keyDownEventListener for the character 
    188             String character = current.substring(current.length() - 2, 1); 
    189             // FIXME: Not implemented! Supposed to register accessKey character 
    190         } else if (current.startsWith("wallclock")) { 
    191             int firstBrace = current.find('('); 
    192             int secondBrace = current.find(')'); 
    193              
    194             String wallclockValue = current.substring(firstBrace + 1, secondBrace - firstBrace - 2); 
    195             // FIXME: Not implemented! Supposed to use wallClock value 
    196         } else if (current.contains('.')) { 
    197             int dotPosition = current.find('.'); 
    198              
    199             String element = current.substring(0, dotPosition); 
    200             String clockValue; 
    201             if (current.contains("begin")) 
    202                 clockValue = current.substring(dotPosition + 6); 
    203             else if (current.contains("end")) 
    204                 clockValue = current.substring(dotPosition + 4); 
    205             else if (current.contains("repeat")) 
    206                 clockValue = current.substring(dotPosition + 7); 
    207             else { // DOM2 Event Reference 
    208                 int plusMinusPosition = -1; 
    209                  
    210                 if (current.contains('+')) 
    211                     plusMinusPosition = current.find('+'); 
    212                 else if (current.contains('-')) 
    213                     plusMinusPosition = current.find('-'); 
    214                  
    215                 String event = current.substring(dotPosition + 1, plusMinusPosition - dotPosition - 1); 
    216                 clockValue = current.substring(dotPosition + event.length() + 1); 
    217                 // FIXME: supposed to use DOM Event 
    218             } 
    219         } else { 
    220             number = parseClockValue(current); 
    221             if (!isIndefinite(number)) 
    222                 number *= 1000.0; 
    223             // FIXME: supposed to set begin/end time 
    224         } 
    225     }     
     101        result.append(UnitBezier(curveValues[0], curveValues[1], curveValues[2], curveValues[3])); 
     102    } 
     103    return; 
     104fail: 
     105    result.clear(); 
    226106} 
    227107 
    228108void SVGAnimationElement::parseMappedAttribute(MappedAttribute* attr) 
    229109{ 
    230     if (attr->name().matches(XLinkNames::hrefAttr)) 
    231         m_href = attr->value(); 
    232     else if (attr->name() == SVGNames::attributeNameAttr) 
    233         m_attributeName = attr->value(); 
    234     else if (attr->name() == SVGNames::attributeTypeAttr) { 
    235         if (attr->value() == "CSS") 
    236             m_attributeType = ATTRIBUTETYPE_CSS; 
    237         else if (attr->value() == "XML") 
    238             m_attributeType = ATTRIBUTETYPE_XML; 
    239         else if (attr->value() == "auto") 
    240             m_attributeType = ATTRIBUTETYPE_AUTO; 
    241     } else if (attr->name() == SVGNames::beginAttr) 
    242         parseBeginOrEndValue(m_begin, attr->value()); 
    243     else if (attr->name() == SVGNames::endAttr) 
    244         parseBeginOrEndValue(m_end, attr->value()); 
    245     else if (attr->name() == SVGNames::durAttr) { 
    246         m_simpleDuration = parseClockValue(attr->value()); 
    247         if (!isIndefinite(m_simpleDuration)) 
    248             m_simpleDuration *= 1000.0; 
    249     } else if (attr->name() == SVGNames::minAttr) { 
    250         m_min = parseClockValue(attr->value()); 
    251         if (!isIndefinite(m_min)) 
    252             m_min *= 1000.0; 
    253     } else if (attr->name() == SVGNames::maxAttr) { 
    254         m_max = parseClockValue(attr->value()); 
    255         if (!isIndefinite(m_max)) 
    256             m_max *= 1000.0; 
    257     } else if (attr->name() == SVGNames::restartAttr) { 
    258         if (attr->value() == "whenNotActive") 
    259             m_restart = RESTART_WHENNOTACTIVE; 
    260         else if (attr->value() == "never") 
    261             m_restart = RESTART_NEVER; 
    262         else if (attr->value() == "always") 
    263             m_restart = RESTART_ALWAYS; 
    264     } else if (attr->name() == SVGNames::repeatCountAttr) { 
    265         if (attr->value() == "indefinite") 
    266             m_repeatCount = DBL_MAX; 
    267         else 
    268             m_repeatCount = attr->value().toDouble(); 
    269     } else if (attr->name() == SVGNames::repeatDurAttr) 
    270         m_repeatDur = attr->value(); 
    271     else if (attr->name() == SVGNames::fillAttr) { 
    272         if (attr->value() == "freeze") 
    273             m_fill = FILL_FREEZE; 
    274         else if (attr->value() == "remove") 
    275             m_fill = FILL_REMOVE; 
    276     } else if (attr->name() == SVGNames::calcModeAttr) { 
    277         if (attr->value() == "discrete") 
    278             m_calcMode = CALCMODE_DISCRETE; 
    279         else if (attr->value() == "linear") 
    280             m_calcMode = CALCMODE_LINEAR; 
    281         else if (attr->value() == "spline") 
    282             m_calcMode = CALCMODE_SPLINE; 
    283         else if (attr->value() == "paced") 
    284             m_calcMode = CALCMODE_PACED; 
    285     } else if (attr->name() == SVGNames::valuesAttr) { 
    286         m_values.clear(); 
    287         m_values = parseDelimitedString(attr->value(), ';'); 
    288     } else if (attr->name() == SVGNames::keyTimesAttr) { 
    289         m_keyTimes.clear(); 
    290         parseKeyNumbers(m_keyTimes, attr->value()); 
    291     } else if (attr->name() == SVGNames::keySplinesAttr) { 
    292         m_keySplines.clear(); 
    293         parseKeySplines(m_keySplines, attr->value()); 
    294     } else if (attr->name() == SVGNames::fromAttr) 
    295         m_from = attr->value(); 
    296     else if (attr->name() == SVGNames::toAttr) 
    297         m_to = attr->value(); 
    298     else if (attr->name() == SVGNames::byAttr) 
    299         m_by = attr->value(); 
    300     else if (attr->name() == SVGNames::additiveAttr) { 
    301         if (attr->value() == "sum") 
    302             m_additive = ADDITIVE_SUM; 
    303         else if (attr->value() == "replace") 
    304             m_additive = ADDITIVE_REPLACE; 
    305     } else if (attr->name() == SVGNames::accumulateAttr) { 
    306         if (attr->value() == "sum") 
    307             m_accumulate = ACCUMULATE_SUM; 
    308         else if (attr->value() == "none") 
    309             m_accumulate = ACCUMULATE_NONE; 
    310     } else { 
     110    if (attr->name() == SVGNames::valuesAttr) 
     111        attr->value().string().split(';', m_values); 
     112    else if (attr->name() == SVGNames::keyTimesAttr) 
     113        parseKeyTimes(attr->value(), m_keyTimes); 
     114    else if (attr->name() == SVGNames::keySplinesAttr) 
     115        parseKeySplines(attr->value(), m_keySplines); 
     116    else { 
    311117        if (SVGTests::parseMappedAttribute(attr)) 
    312118            return; 
    313119        if (SVGExternalResourcesRequired::parseMappedAttribute(attr)) 
    314120            return; 
    315         SVGElement::parseMappedAttribute(attr); 
    316     } 
    317 } 
    318  
    319 double SVGAnimationElement::parseClockValue(const String& data) 
    320 { 
    321     String parse = data.stripWhiteSpace(); 
    322  
    323     if (parse == "indefinite") 
    324         return DBL_MAX; 
    325  
    326     double result; 
    327  
    328     int doublePointOne = parse.find(':'); 
    329     int doublePointTwo = parse.find(':', doublePointOne + 1); 
    330  
    331     if (doublePointOne != -1 && doublePointTwo != -1) { // Spec: "Full clock values" 
    332         unsigned hours = parse.substring(0, 2).toUIntStrict(); 
    333         unsigned minutes = parse.substring(3, 2).toUIntStrict(); 
    334         unsigned seconds = parse.substring(6, 2).toUIntStrict(); 
    335         unsigned milliseconds = 0; 
    336  
    337         result = (3600 * hours) + (60 * minutes) + seconds; 
    338  
    339         if (parse.find('.') != -1) { 
    340             String temp = parse.substring(9, 2); 
    341             milliseconds = temp.toUIntStrict(); 
    342             result += (milliseconds * (1 / pow(10.0, int(temp.length())))); 
    343         } 
    344     } else if (doublePointOne != -1 && doublePointTwo == -1) { // Spec: "Partial clock values" 
    345         unsigned minutes = parse.substring(0, 2).toUIntStrict(); 
    346         unsigned seconds = parse.substring(3, 2).toUIntStrict(); 
    347         unsigned milliseconds = 0; 
    348  
    349         result = (60 * minutes) + seconds; 
    350  
    351         if (parse.find('.') != -1) { 
    352             String temp = parse.substring(6, 2); 
    353             milliseconds = temp.toUIntStrict(); 
    354             result += (milliseconds * (1 / pow(10.0, int(temp.length())))); 
    355         } 
    356     } else { // Spec: "Timecount values" 
    357         int dotPosition = parse.find('.'); 
    358  
    359         if (parse.endsWith("h")) { 
    360             if (dotPosition == -1) 
    361                 result = parse.substring(0, parse.length() - 1).toUIntStrict() * 3600; 
    362             else { 
    363                 result = parse.substring(0, dotPosition).toUIntStrict() * 3600; 
    364                 String temp = parse.substring(dotPosition + 1, parse.length() - dotPosition - 2); 
    365                 result += (3600.0 * temp.toUIntStrict()) * (1 / pow(10.0, int(temp.length()))); 
    366             } 
    367         } else if (parse.endsWith("min")) { 
    368             if (dotPosition == -1) 
    369                 result = parse.substring(0, parse.length() - 3).toUIntStrict() * 60; 
    370             else { 
    371                 result = parse.substring(0, dotPosition).toUIntStrict() * 60; 
    372                 String temp = parse.substring(dotPosition + 1, parse.length() - dotPosition - 4); 
    373                 result += (60.0 * temp.toUIntStrict()) * (1 / pow(10.0, int(temp.length()))); 
    374             } 
    375         } else if (parse.endsWith("ms")) { 
    376             if (dotPosition == -1) 
    377                 result = parse.substring(0, parse.length() - 2).toUIntStrict() / 1000.0; 
    378             else { 
    379                 result = parse.substring(0, dotPosition).toUIntStrict() / 1000.0; 
    380                 String temp = parse.substring(dotPosition + 1, parse.length() - dotPosition - 3); 
    381                 result += (temp.toUIntStrict() / 1000.0) * (1 / pow(10.0, int(temp.length()))); 
    382             } 
    383         } else if (parse.endsWith("s")) { 
    384             if (dotPosition == -1) 
    385                 result = parse.substring(0, parse.length() - 1).toUIntStrict(); 
    386             else { 
    387                 result = parse.substring(0, dotPosition).toUIntStrict(); 
    388                 String temp = parse.substring(dotPosition + 1, parse.length() - dotPosition - 2); 
    389                 result += temp.toUIntStrict() * (1 / pow(10.0, int(temp.length()))); 
    390             } 
    391         } else 
    392             result = parse.toDouble(); 
    393     } 
    394  
    395     return result; 
    396 } 
    397  
    398 void SVGAnimationElement::finishParsingChildren() 
    399 { 
    400     if (ownerSVGElement()) 
    401         ownerSVGElement()->timeScheduler()->addTimer(this, lround(getStartTime())); 
    402     SVGElement::finishParsingChildren(); 
    403 } 
    404  
    405 String SVGAnimationElement::targetAttributeAnimatedValue() const 
    406 { 
    407     // FIXME: This method is not entirely correct 
    408     // It does not properly grab the true "animVal" instead grabs the baseVal (or something very close) 
    409  
    410     if (!targetElement()) 
    411         return String(); 
    412      
    413     SVGElement* target = targetElement(); 
    414     SVGStyledElement* styled = 0; 
    415     if (target && target->isStyled()) 
    416         styled = static_cast<SVGStyledElement*>(target); 
    417      
    418     String ret; 
    419  
    420     EAttributeType attributeType = static_cast<EAttributeType>(m_attributeType); 
    421     if (attributeType == ATTRIBUTETYPE_AUTO) { 
    422         attributeType = ATTRIBUTETYPE_XML; 
    423  
    424         // Spec: The implementation should match the attributeName to an attribute 
    425         // for the target element. The implementation must first search through the 
    426         // list of CSS properties for a matching property name, and if none is found, 
    427         // search the default XML namespace for the element. 
    428         if (styled && styled->style()) { 
    429             if (styled->style()->getPropertyCSSValue(m_attributeName)) 
    430                 attributeType = ATTRIBUTETYPE_CSS; 
    431         } 
    432     } 
    433      
    434     if (attributeType == ATTRIBUTETYPE_CSS) { 
    435         if (styled && styled->style()) 
    436             ret = styled->style()->getPropertyValue(m_attributeName); 
    437     } 
    438  
    439     if (attributeType == ATTRIBUTETYPE_XML || ret.isEmpty()) 
    440         ret = targetElement()->getAttribute(m_attributeName); 
    441  
    442     return ret; 
    443 } 
    444  
    445 void SVGAnimationElement::setTargetAttributeAnimatedValue(const String& value) 
    446 { 
    447     // FIXME: This method is not entirely correct 
    448     // It does not properly set the "animVal", rather it sets the "baseVal" 
    449     SVGAnimationElement::setTargetAttribute(targetElement(), m_attributeName, value, static_cast<EAttributeType>(m_attributeType)); 
    450 } 
    451  
    452 void SVGAnimationElement::setTargetAttribute(SVGElement* target, const String& name, const String& value, EAttributeType type) 
    453 { 
    454     if (!target || name.isNull() || value.isNull()) 
    455         return; 
    456      
    457     SVGStyledElement* styled = (target && target->isStyled()) ? static_cast<SVGStyledElement*>(target) : 0; 
    458  
    459     EAttributeType attributeType = type; 
    460     if (type == ATTRIBUTETYPE_AUTO) { 
    461         // Spec: The implementation should match the attributeName to an attribute 
    462         // for the target element. The implementation must first search through the 
    463         // list of CSS properties for a matching property name, and if none is found, 
    464         // search the default XML namespace for the element. 
    465         if (styled && styled->style() && styled->style()->getPropertyCSSValue(name)) 
    466             attributeType = ATTRIBUTETYPE_CSS; 
    467         else 
    468             attributeType = ATTRIBUTETYPE_XML; 
    469     } 
    470     ExceptionCode ec = 0; 
    471     if (attributeType == ATTRIBUTETYPE_CSS && styled && styled->style()) 
    472         styled->style()->setProperty(name, value, "", ec); 
    473     else if (attributeType == ATTRIBUTETYPE_XML) 
    474         target->setAttribute(name, value, ec); 
    475 } 
    476  
    477 String SVGAnimationElement::attributeName() const 
    478 { 
    479     return m_attributeName; 
    480 } 
    481  
    482 bool SVGAnimationElement::connectedToTimer() const 
    483 { 
    484     return m_connectedToTimer; 
    485 } 
    486  
    487 bool SVGAnimationElement::isFrozen() const 
    488 { 
    489     return (m_fill == FILL_FREEZE); 
    490 } 
    491  
    492 bool SVGAnimationElement::isAdditive() const 
    493 { 
    494     return (m_additive == ADDITIVE_SUM) || (detectAnimationMode() == BY_ANIMATION); 
    495 } 
    496  
    497 bool SVGAnimationElement::isAccumulated() const 
    498 { 
    499     return (m_accumulate == ACCUMULATE_SUM) && (detectAnimationMode() != TO_ANIMATION); 
    500 } 
    501  
    502 EAnimationMode SVGAnimationElement::detectAnimationMode() const 
    503 { 
    504     if (hasAttribute(SVGNames::valuesAttr)) 
    505         return VALUES_ANIMATION; 
    506     else if ((!m_from.isEmpty() && !m_to.isEmpty()) || (!m_to.isEmpty())) { // to/from-to animation 
    507         if (!m_from.isEmpty()) // from-to animation 
    508             return FROM_TO_ANIMATION; 
    509         else 
    510             return TO_ANIMATION; 
    511     } else if ((m_from.isEmpty() && m_to.isEmpty() && !m_by.isEmpty()) || 
    512             (!m_from.isEmpty() && !m_by.isEmpty())) { // by/from-by animation 
    513         if (!m_from.isEmpty()) // from-by animation 
    514             return FROM_BY_ANIMATION; 
    515         else 
    516             return BY_ANIMATION; 
    517     } 
    518  
    519     return NO_ANIMATION; 
    520 } 
    521  
    522 double SVGAnimationElement::repeations() const 
    523 { 
    524     return m_repetitions; 
    525 } 
    526  
    527 bool SVGAnimationElement::isIndefinite(double value) 
    528 { 
    529     return (value == DBL_MAX); 
    530 } 
    531  
    532 void SVGAnimationElement::connectTimer() 
    533 { 
    534     ASSERT(!m_connectedToTimer); 
    535     ownerSVGElement()->timeScheduler()->connectIntervalTimer(this); 
    536     m_connectedToTimer = true; 
    537 } 
    538  
    539 void SVGAnimationElement::disconnectTimer() 
    540 { 
    541     ASSERT(m_connectedToTimer); 
    542     ownerSVGElement()->timeScheduler()->disconnectIntervalTimer(this); 
    543     m_connectedToTimer = false; 
    544 } 
    545  
    546 static double calculateTimePercentage(double elapsedSeconds, double start, double end, double duration, double repetitions) 
    547 { 
    548     double percentage = 0.0; 
    549     double useElapsed = elapsedSeconds - (duration * repetitions); 
    550      
    551     if (duration > 0.0 && end == 0.0) 
    552         percentage = 1.0 - (((start + duration) - useElapsed) / duration); 
    553     else if (duration > 0.0 && end != 0.0) { 
    554         if (duration > end) 
    555             percentage = 1.0 - (((start + end) - useElapsed) / end); 
    556         else 
    557             percentage = 1.0 - (((start + duration) - useElapsed) / duration); 
    558     } else if (duration == 0.0 && end != 0.0) 
    559         percentage = 1.0 - (((start + end) - useElapsed) / end); 
    560      
    561     return percentage; 
    562 } 
    563  
    564 static inline void adjustPercentagePastForKeySplines(const Vector<SVGAnimationElement::KeySpline>& keySplines, unsigned valueIndex, float& percentagePast) 
    565 { 
    566     if (percentagePast == 0.0f) // values at key times need no spline adjustment 
    567         return; 
    568     const SVGAnimationElement::KeySpline& keySpline = keySplines[valueIndex]; 
    569     Path path; 
    570     path.moveTo(FloatPoint()); 
    571     path.addBezierCurveTo(keySpline.control1, keySpline.control2, FloatPoint(1.0f, 1.0f)); 
    572     // FIXME: This needs to use a y-at-x function on path, to compute the y value then multiply percentagePast by that value 
    573 } 
    574  
    575 void SVGAnimationElement::valueIndexAndPercentagePastForDistance(float distancePercentage, unsigned& valueIndex, float& percentagePast) 
    576 { 
    577     // Unspecified: animation elements which do not support CALCMODE_PACED, we just always show the first value 
    578     valueIndex = 0; 
    579     percentagePast = 0; 
    580 } 
    581  
    582 float SVGAnimationElement::calculateTotalDistance() 
    583 { 
    584     return 0; 
    585 } 
    586  
    587 static inline void caculateValueIndexForKeyTimes(float timePercentage, const Vector<float>& keyTimes, unsigned& valueIndex, float& lastKeyTime, float& nextKeyTime) 
    588 { 
    589     unsigned keyTimesCountMinusOne = keyTimes.size() - 1; 
    590     valueIndex = 0; 
    591     ASSERT(timePercentage >= keyTimes.first()); 
    592     while ((valueIndex < keyTimesCountMinusOne) && (timePercentage >= keyTimes[valueIndex + 1])) 
    593         valueIndex++; 
    594      
    595     lastKeyTime = keyTimes[valueIndex]; 
    596     if (valueIndex < keyTimesCountMinusOne) 
    597         nextKeyTime = keyTimes[valueIndex + 1]; 
    598     else 
    599         nextKeyTime = lastKeyTime; 
    600 } 
    601  
    602 bool SVGAnimationElement::isValidAnimation() const 
    603 { 
    604     EAnimationMode animationMode = detectAnimationMode(); 
    605     if (!hasValidTarget() || (animationMode == NO_ANIMATION)) 
    606         return false; 
    607     if (animationMode == VALUES_ANIMATION) { 
    608         if (!m_values.size()) 
    609             return false; 
    610         if (m_keyTimes.size()) { 
    611             if ((m_values.size() != m_keyTimes.size()) || (m_keyTimes.first() != 0)) 
    612                 return false; 
    613             if (((m_calcMode == CALCMODE_SPLINE) || (m_calcMode == CALCMODE_LINEAR)) && (m_keyTimes.last() != 1)) 
    614                 return false; 
    615             float lastKeyTime = 0; 
    616             for (unsigned x = 0; x < m_keyTimes.size(); x++) { 
    617                 if (m_keyTimes[x] < lastKeyTime || m_keyTimes[x] > 1) 
    618                     return false; 
    619             } 
    620         } 
    621         if (m_keySplines.size()) { 
    622             if ((m_values.size() - 1) != m_keySplines.size()) 
    623                 return false; 
    624             for (unsigned x = 0; x < m_keyTimes.size(); x++) 
    625                 if (m_keyTimes[x] < 0 || m_keyTimes[x] > 1) 
    626                     return false; 
    627         } 
    628     } 
     121        SVGSMILElement::parseMappedAttribute(attr); 
     122    } 
     123} 
     124 
     125void SVGAnimationElement::attributeChanged(Attribute* attr, bool preserveDecls) 
     126{ 
     127    // Assumptions may not hold after an attribute change. 
     128    m_animationValid = false; 
     129    SVGSMILElement::attributeChanged(attr, preserveDecls); 
     130} 
     131 
     132float SVGAnimationElement::getStartTime() const 
     133{ 
     134    return narrowPrecisionToFloat(intervalBegin().value()); 
     135} 
     136 
     137float SVGAnimationElement::getCurrentTime() const 
     138{ 
     139    return narrowPrecisionToFloat(elapsed().value()); 
     140} 
     141 
     142float SVGAnimationElement::getSimpleDuration(ExceptionCode&) const 
     143{ 
     144    return narrowPrecisionToFloat(simpleDuration().value()); 
     145}     
     146     
     147bool SVGAnimationElement::beginElement(ExceptionCode& ec) 
     148{ 
     149    return beginElementAt(0, ec); 
     150} 
     151 
     152bool SVGAnimationElement::beginElementAt(float offset, ExceptionCode& ec) 
     153{ 
     154    addBeginTime(elapsed() + offset); 
    629155    return true; 
    630156} 
    631157 
    632 void SVGAnimationElement::calculateValueIndexAndPercentagePast(float timePercentage, unsigned& valueIndex, float& percentagePast) 
    633 { 
    634     ASSERT(timePercentage <= 1.0f); 
    635     ASSERT(isValidAnimation()); 
    636     EAnimationMode animationMode = detectAnimationMode(); 
    637      
    638     // to-animations have their own special handling 
    639     if (animationMode == TO_ANIMATION) 
    640         return; 
    641      
    642     // paced is special, caculates values based on distance instead of time 
    643     if (m_calcMode == CALCMODE_PACED) { 
    644         float totalDistance = calculateTotalDistance(); 
    645         float distancePercentage = totalDistance * timePercentage; 
    646         valueIndexAndPercentagePastForDistance(distancePercentage, valueIndex, percentagePast); 
    647         return; 
    648     } 
    649      
    650     // Figure out what our current index is based on on time 
    651     // all further calculations are based on time percentages, to allow unifying keyTimes handling & normal animation 
    652     float lastKeyTimePercentage = 0; 
    653     float nextKeyTimePercentage = 0; 
    654     if (m_keyTimes.size() && (m_keyTimes.size() == m_values.size())) 
    655         caculateValueIndexForKeyTimes(timePercentage, m_keyTimes, valueIndex, lastKeyTimePercentage, nextKeyTimePercentage); 
    656     else { 
    657         unsigned lastPossibleIndex = (m_values.size() ? m_values.size() - 1: 1); 
    658         unsigned flooredValueIndex = static_cast<unsigned>(timePercentage * lastPossibleIndex); 
    659         valueIndex = flooredValueIndex; 
    660         lastKeyTimePercentage = flooredValueIndex / (float)lastPossibleIndex; 
    661         nextKeyTimePercentage = (flooredValueIndex + 1) / (float)lastPossibleIndex; 
    662     } 
    663      
    664     // No further caculation is needed if we're exactly on an index. 
    665     if (timePercentage == lastKeyTimePercentage || lastKeyTimePercentage == nextKeyTimePercentage) { 
    666         percentagePast = 0.0f; 
    667         return; 
    668     } 
    669      
    670     // otherwise we decide what percent after that index 
    671     if ((m_calcMode == CALCMODE_SPLINE) && (m_keySplines.size() == (m_values.size() - 1))) 
    672         adjustPercentagePastForKeySplines(m_keySplines, valueIndex, percentagePast); 
    673     else if (m_calcMode == CALCMODE_DISCRETE) 
    674         percentagePast = 0.0f; 
    675     else { // default (and fallback) mode: linear 
    676         float keyTimeSpan = nextKeyTimePercentage - lastKeyTimePercentage; 
    677         float timeSinceLastKeyTime = timePercentage - lastKeyTimePercentage; 
    678         percentagePast = (timeSinceLastKeyTime / keyTimeSpan); 
    679     } 
    680 } 
    681  
    682 bool SVGAnimationElement::updateAnimationBaseValueFromElement() 
    683 { 
    684     m_baseValue = targetAttributeAnimatedValue(); 
    685     return true; 
    686 } 
    687  
    688 void SVGAnimationElement::applyAnimatedValueToElement() 
    689 { 
    690     setTargetAttributeAnimatedValue(m_animatedValue); 
    691 } 
    692  
    693 void SVGAnimationElement::handleTimerEvent(double elapsedSeconds, double timePercentage) 
    694 { 
    695     timePercentage = min(timePercentage, 1.0); 
    696     if (!connectedToTimer()) { 
    697         connectTimer(); 
    698         return; 
    699     } 
    700      
    701     // FIXME: accumulate="sum" will not work w/o code similar to this: 
    702 //    if (isAccumulated() && repeations() != 0.0) 
    703 //        accumulateForRepetitions(m_repetitions); 
    704      
    705     EAnimationMode animationMode = detectAnimationMode(); 
    706      
    707     unsigned valueIndex = 0; 
    708     float percentagePast = 0; 
    709     calculateValueIndexAndPercentagePast(narrowPrecisionToFloat(timePercentage), valueIndex, percentagePast); 
    710          
    711     calculateFromAndToValues(animationMode, valueIndex); 
    712      
    713     updateAnimatedValue(animationMode, narrowPrecisionToFloat(timePercentage), valueIndex, percentagePast); 
    714      
    715     if (timePercentage == 1.0) { 
    716         if ((m_repeatCount > 0 && m_repetitions < m_repeatCount - 1) || isIndefinite(m_repeatCount)) { 
    717             m_repetitions++; 
    718             return; 
    719         } else 
    720             disconnectTimer(); 
    721     } 
    722 } 
    723  
    724 bool SVGAnimationElement::updateAnimatedValueForElapsedSeconds(double elapsedSeconds) 
    725 { 
    726     // FIXME: fill="freeze" will not work without saving off the m_stoppedTime in a stop() method and having code similar to this: 
    727 //    if (isStopped()) { 
    728 //        if (m_fill == FILL_FREEZE) 
    729 //            elapsedSeconds = m_stoppedTime; 
    730 //        else 
    731 //            return false; 
    732 //    } 
    733      
    734     // Validate animation timing settings: 
    735     // #1 (duration > 0) -> fine 
    736     // #2 (duration <= 0.0 && end > 0) -> fine 
    737     // FIXME: This allows indefinite duration for the <set> element, not sure if it should be allowed for others too.  
    738     // FIXME: Value won't naturally animate in this case so keeping the timer repeating is sort of pointless. 
    739     if ((m_simpleDuration <= 0.0 && m_end <= 0.0) || (isIndefinite(m_simpleDuration) && m_end <= 0.0 && !hasTagName(setTag))) 
    740         return false; // Ignore dur="0" or dur="-neg" 
    741      
    742     if (isIndefinite(m_animationBegin)) 
    743         m_animationBegin = m_begin; 
    744      
    745     double percentage = calculateTimePercentage(elapsedSeconds, m_animationBegin, m_end, m_simpleDuration, m_repetitions); 
    746      
    747     if (percentage <= 1.0 || connectedToTimer()) 
    748         handleTimerEvent(elapsedSeconds, percentage); 
    749      
    750     if (elapsedSeconds > m_animationEnd) { 
    751         if (connectedToTimer()) 
    752             disconnectTimer(); 
    753         m_animationEnd = DBL_MAX; 
    754     } 
    755      
    756     return true; // value was updated, need to apply 
    757 } 
    758      
    759 bool SVGAnimationElement::beginElement(ExceptionCode& ec) 
    760 { 
    761     // FIXME: Should this be synchronous? 
    762     return beginElementAt(0, ec); 
    763 } 
    764  
    765 bool SVGAnimationElement::beginElementAt(float offset, ExceptionCode& ec) 
    766 { 
    767     // FIXME: Handle negative offsets correctly. 
    768     // In general we need to make SMIL concepts like "active duration" explicit in the code  
    769     if (offset < 0) 
    770         offset = 0; 
    771      
    772     if (connectedToTimer()) 
    773         return false; 
    774      
    775     m_animationBegin = offset; 
    776     if (ownerSVGElement()) { 
    777         ownerSVGElement()->timeScheduler()->addTimer(this, offset); 
    778         ownerSVGElement()->timeScheduler()->startAnimations(); 
    779         connectTimer(); 
    780     } else 
    781         return false; 
    782  
    783     return false; 
    784 } 
    785  
    786158bool SVGAnimationElement::endElement(ExceptionCode& ec) 
    787159{ 
    788     // FIXME: Should this be synchronous? 
    789160    return endElementAt(0, ec); 
    790161} 
     
    794165    if (offset < 0) 
    795166        return false; 
    796     if (!connectedToTimer()) 
     167     
     168    addEndTime(elapsed() + offset); 
     169    return true; 
     170} 
     171     
     172SVGAnimationElement::AnimationMode SVGAnimationElement::animationMode() const 
     173{ 
     174    // http://www.w3.org/TR/2001/REC-smil-animation-20010904/#AnimFuncValues 
     175 
     176    if (hasTagName(SVGNames::setTag)) 
     177        return ToAnimation; 
     178    if (hasAttribute(SVGNames::valuesAttr)) 
     179        return ValuesAnimation; 
     180    if (!toValue().isEmpty()) 
     181        return fromValue().isEmpty() ? ToAnimation : FromToAnimation; 
     182    if (!byValue().isEmpty()) 
     183        return fromValue().isEmpty() ? ByAnimation : FromByAnimation; 
     184    return NoAnimation; 
     185} 
     186 
     187SVGAnimationElement::CalcMode SVGAnimationElement::calcMode() const 
     188{     
     189    static const AtomicString discrete("discrete"); 
     190    static const AtomicString linear("linear"); 
     191    static const AtomicString paced("paced"); 
     192    static const AtomicString spline("spline"); 
     193    const AtomicString& value = getAttribute(SVGNames::calcModeAttr); 
     194    if (value == discrete) 
     195        return CalcModeDiscrete; 
     196    if (value == linear) 
     197        return CalcModeLinear; 
     198    if (value == paced) 
     199        return CalcModePaced; 
     200    if (value == spline) 
     201        return CalcModeSpline; 
     202    return hasTagName(SVGNames::animateMotionTag) ? CalcModePaced : CalcModeLinear; 
     203} 
     204 
     205SVGAnimationElement::AttributeType SVGAnimationElement::attributeType() const 
     206{     
     207    static const AtomicString css("CSS"); 
     208    static const AtomicString xml("XML"); 
     209    const AtomicString& value = getAttribute(SVGNames::attributeTypeAttr); 
     210    if (value == css) 
     211        return AttributeTypeCSS; 
     212    if (value == xml) 
     213        return AttributeTypeXML; 
     214    return AttributeTypeAuto; 
     215} 
     216 
     217String SVGAnimationElement::toValue() const 
     218{     
     219    return getAttribute(SVGNames::toAttr); 
     220} 
     221 
     222String SVGAnimationElement::byValue() const 
     223{     
     224    return getAttribute(SVGNames::byAttr); 
     225} 
     226 
     227String SVGAnimationElement::fromValue() const 
     228{     
     229    return getAttribute(SVGNames::fromAttr); 
     230} 
     231     
     232String SVGAnimationElement::attributeName() const 
     233{     
     234    return getAttribute(SVGNames::attributeNameAttr).string().stripWhiteSpace(); 
     235} 
     236 
     237bool SVGAnimationElement::isAdditive() const 
     238{ 
     239    static const AtomicString sum("sum"); 
     240    const AtomicString& value = getAttribute(SVGNames::additiveAttr); 
     241    return value == sum || animationMode() == ByAnimation; 
     242} 
     243 
     244bool SVGAnimationElement::isAccumulated() const 
     245{ 
     246    static const AtomicString sum("sum"); 
     247    const AtomicString& value = getAttribute(SVGNames::accumulateAttr); 
     248    return value == sum && animationMode() != ToAnimation; 
     249} 
     250 
     251bool SVGAnimationElement::hasValidTarget() const 
     252{ 
     253    return targetElement(); 
     254} 
     255     
     256bool SVGAnimationElement::targetAttributeIsCSS() const 
     257{ 
     258    AttributeType type = attributeType(); 
     259    if (type == AttributeTypeCSS) 
     260        return true; 
     261    if (type == AttributeTypeXML) 
    797262        return false; 
    798     m_animationEnd = ownerSVGElement()->timeScheduler()->elapsed() + offset; 
    799     return true; 
     263    // FIXME: We should have a map of all SVG properties and their attribute types so we 
     264    // could validate animations better. The spec is very vague about this. 
     265    unsigned id = cssPropertyID(attributeName()); 
     266    // SVG range 
     267    if (id >= CSSPropertyClipPath && id <= CSSPropertyWritingMode) 
     268        return true; 
     269    // Regular CSS properties also in SVG 
     270    return id == CSSPropertyColor || id == CSSPropertyDisplay || id == CSSPropertyOpacity 
     271        || (id >= CSSPropertyFont && id <= CSSPropertyFontWeight)  
     272        || id == CSSPropertyOverflow || id == CSSPropertyVisibility; 
     273} 
     274 
     275void SVGAnimationElement::setTargetAttributeAnimatedValue(const String& value) 
     276{ 
     277    SVGElement* target = targetElement(); 
     278    String attributeName = this->attributeName(); 
     279    if (!target || attributeName.isEmpty() || value.isNull()) 
     280        return; 
     281    ExceptionCode ec; 
     282    if (targetAttributeIsCSS()) { 
     283        // FIXME: This should set the override style, not the inline style. 
     284        // Sadly override styles are not yet implemented. 
     285        target->style()->setProperty(attributeName, value, "", ec); 
     286    } else { 
     287        // FIXME: This should set the 'presentation' value, not the actual  
     288        // attribute value. Whatever that means in practice. 
     289        target->setAttribute(attributeName, value, ec); 
     290    } 
     291} 
     292 
     293String SVGAnimationElement::targetAttributeBaseValue() const 
     294{ 
     295    String attributeName = this->attributeName(); 
     296    if (!targetElement() || attributeName.isEmpty()) 
     297        return String(); 
     298     
     299    SVGElement* target = targetElement(); 
     300    String result; 
     301     
     302    if (targetAttributeIsCSS()) { 
     303        CSSComputedStyleDeclaration computedStyle(target); 
     304        return computedStyle.getPropertyValue(cssPropertyID(attributeName)); 
     305    } else 
     306        result = targetElement()->getAttribute(attributeName); 
     307     
     308    return result; 
     309} 
     310     
     311static inline double solveEpsilon(double duration) { return 1. / (200. * duration); } 
     312     
     313void SVGAnimationElement::currentValuesForValuesAnimation(float percent, float& effectivePercent, String& from, String& to) 
     314{ 
     315    unsigned keyTimesCount = m_keyTimes.size(); 
     316    unsigned valuesCount = m_values.size(); 
     317    ASSERT(m_animationValid); 
     318    ASSERT(valuesCount > 1); 
     319    ASSERT(!keyTimesCount || valuesCount == keyTimesCount); 
     320    ASSERT(!keyTimesCount || (keyTimesCount > 1 && m_keyTimes[0] == 0)); 
     321 
     322    unsigned index; 
     323    for (index = 1; index < keyTimesCount; ++index) { 
     324        if (m_keyTimes[index] >= percent) 
     325            break; 
     326    } 
     327    --index; 
     328     
     329    if (calcMode() == CalcModeDiscrete) { 
     330        if (!keyTimesCount)  
     331            index = percent == 1.0f ? valuesCount - 1 : static_cast<unsigned>(percent * valuesCount); 
     332        from = m_values[index]; 
     333        to = m_values[index]; 
     334        effectivePercent = 0.0f; 
     335        return; 
     336    } 
     337     
     338    float fromPercent; 
     339    float toPercent; 
     340    if (keyTimesCount) { 
     341        fromPercent = m_keyTimes[index]; 
     342        toPercent = m_keyTimes[index + 1]; 
     343    } else {         
     344        index = static_cast<unsigned>(percent * (valuesCount - 1)); 
     345        fromPercent =  static_cast<float>(index) / (valuesCount - 1); 
     346        toPercent =  static_cast<float>(index + 1) / (valuesCount - 1); 
     347    } 
     348     
     349    if (index == valuesCount - 1) 
     350        --index; 
     351    from = m_values[index]; 
     352    to = m_values[index + 1]; 
     353    ASSERT(toPercent > fromPercent); 
     354    effectivePercent = percent == 1.0f ? 1.0f : (percent - fromPercent) / (toPercent - fromPercent); 
     355     
     356    if (calcMode() == CalcModeSpline) { 
     357        ASSERT(m_keySplines.size() == m_values.size() - 1); 
     358        UnitBezier bezier = m_keySplines[index]; 
     359        SMILTime duration = simpleDuration(); 
     360        if (!duration.isFinite()) 
     361            duration = 100.0; 
     362        double t = bezier.solve(effectivePercent, solveEpsilon(duration.value())); 
     363        effectivePercent = narrowPrecisionToFloat(t); 
     364    } 
     365} 
     366     
     367void SVGAnimationElement::startedActiveInterval()