blob: 0d135c7076aad23f76b0176dd53d348f24c76a66 [file] [log] [blame]
/*
Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
2004, 2005 Rob Buis <buis@kde.org>
This file is part of the KDE project
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "config.h"
#if SVG_SUPPORT
#include "SVGAnimateElement.h"
#include "KSVGTimeScheduler.h"
#include "Document.h"
#include "SVGDocumentExtensions.h"
#include "SVGSVGElement.h"
using namespace WebCore;
SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, Document *doc)
: SVGAnimationElement(tagName, doc)
, m_currentItem(-1)
{
}
SVGAnimateElement::~SVGAnimateElement()
{
}
void SVGAnimateElement::handleTimerEvent(double timePercentage)
{
// Start condition.
if (!m_connected) {
// Save initial attribute value...
String attr(targetAttribute());
m_savedTo = attr.deprecatedString();
// Animation mode handling
switch(detectAnimationMode())
{
/* case TO_ANIMATION:
case FROM_TO_ANIMATION:
{
String toColorString(m_to);
m_toColor->setRGBColor(toColorString.impl());
String fromColorString;
if (!m_from.isEmpty()) // from-to animation
fromColorString = m_from;
else // to animation
fromColorString = m_initialColor.name();
m_fromColor->setRGBColor(fromColorString.impl());
// Calculate color differences, once.
Color qTo = m_toColor->color();
Color qFrom = m_fromColor->color();
m_redDiff = qTo.red() - qFrom.red();
m_greenDiff = qTo.green() - qFrom.green();
m_blueDiff = qTo.blue() - qFrom.blue();
break;
}
case BY_ANIMATION:
case FROM_BY_ANIMATION:
{
String byColorString(m_by);
m_toColor->setRGBColor(byColorString.impl());
String fromColorString;
if (!m_from.isEmpty()) // from-by animation
fromColorString = m_from;
else // by animation
fromColorString = m_initialColor.name();
m_fromColor->setRGBColor(fromColorString.impl());
Color qBy = m_toColor->color();
Color qFrom = m_fromColor->color();
// Calculate 'm_toColor' using relative values
int r = qFrom.red() + qBy.red();
int g = qFrom.green() + qBy.green();
int b = qFrom.blue() + qBy.blue();
Color qTo = clampColor(r, g, b);
String toColorString(qTo.name());
m_toColor->setRGBColor(toColorString.impl());
m_redDiff = qTo.red() - qFrom.red();
m_greenDiff = qTo.green() - qFrom.green();
m_blueDiff = qTo.blue() - qFrom.blue();
break;
}
case VALUES_ANIMATION:
break;*/
default:
{
//kdError() << k_funcinfo << " Unable to detect animation mode! Aborting creation!" << endl;
return;
}
}
ownerSVGElement()->timeScheduler()->connectIntervalTimer(this);
m_connected = true;
return;
}
// Calculations...
if (timePercentage >= 1.0)
timePercentage = 1.0;
// int r = 0, g = 0, b = 0;
// if ((m_redDiff != 0 || m_greenDiff != 0 || m_blueDiff != 0) && !m_values)
// calculateColor(timePercentage, r, g, b);
/* else */if (m_values)
{
/* int itemByPercentage = calculateCurrentValueItem(timePercentage);
if (itemByPercentage == -1)
return;
if (m_currentItem != itemByPercentage) // Item changed...
{
// Extract current 'from' / 'to' values
String value1 = String(m_values->getItem(itemByPercentage));
String value2 = String(m_values->getItem(itemByPercentage + 1));
// Calculate r/g/b shifting values...
if (!value1.isEmpty() && !value2.isEmpty())
{
bool apply = false;
if (m_redDiff != 0 || m_greenDiff != 0 || m_blueDiff != 0)
{
r = m_toColor->color().red();
g = m_toColor->color().green();
b = m_toColor->color().blue();
apply = true;
}
String toColorString(value2);
m_toColor->setRGBColor(toColorString.impl());
String fromColorString(value1);
m_fromColor->setRGBColor(fromColorString.impl());
Color qTo = m_toColor->color();
Color qFrom = m_fromColor->color();
m_redDiff = qTo.red() - qFrom.red();
m_greenDiff = qTo.green() - qFrom.green();
m_blueDiff = qTo.blue() - qFrom.blue();
m_currentItem = itemByPercentage;
if (!apply)
return;
}
}
else if (m_redDiff != 0 || m_greenDiff != 0 || m_blueDiff != 0)
{
double relativeTime = calculateRelativeTimePercentage(timePercentage, m_currentItem);
calculateColor(relativeTime, r, g, b);
}*/
}
if (!isFrozen() && timePercentage == 1.0) {
}
if (isAccumulated() && repeations() != 0.0) {
}
// Commit changes!
// End condition.
if (timePercentage == 1.0) {
if ((m_repeatCount > 0 && m_repeations < m_repeatCount - 1) || isIndefinite(m_repeatCount)) {
m_repeations++;
return;
}
ownerSVGElement()->timeScheduler()->disconnectIntervalTimer(this);
m_connected = false;
// Reset...
m_currentItem = -1;
}
}
// vim:ts=4:noet
#endif // SVG_SUPPORT