RenderSVGTransformableContainer.cpp [plain text]
#include "config.h"
#if ENABLE(SVG)
#include "RenderSVGTransformableContainer.h"
#include "SVGNames.h"
#include "SVGRenderSupport.h"
#include "SVGStyledTransformableElement.h"
#include "SVGUseElement.h"
namespace WebCore {
RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGStyledTransformableElement* node)
: RenderSVGContainer(node)
, m_needsTransformUpdate(true)
, m_didTransformToRootUpdate(false)
{
}
bool RenderSVGTransformableContainer::calculateLocalTransform()
{
SVGStyledTransformableElement* element = toSVGStyledTransformableElement(node());
SVGUseElement* useElement = 0;
if (element->hasTagName(SVGNames::useTag))
useElement = static_cast<SVGUseElement*>(element);
else if (element->isInShadowTree() && element->hasTagName(SVGNames::gTag)) {
SVGElement* correspondingElement = element->correspondingElement();
if (correspondingElement && correspondingElement->hasTagName(SVGNames::useTag))
useElement = static_cast<SVGUseElement*>(correspondingElement);
}
if (useElement) {
SVGLengthContext lengthContext(useElement);
FloatSize translation(useElement->x().value(lengthContext), useElement->y().value(lengthContext));
if (translation != m_lastTranslation)
m_needsTransformUpdate = true;
m_lastTranslation = translation;
}
m_didTransformToRootUpdate = m_needsTransformUpdate || SVGRenderSupport::transformToRootChanged(parent());
if (!m_needsTransformUpdate)
return false;
m_localTransform = element->animatedLocalTransform();
m_localTransform.translate(m_lastTranslation.width(), m_lastTranslation.height());
m_needsTransformUpdate = false;
return true;
}
}
#endif // ENABLE(SVG)