RenderSVGTransformableContainer.cpp [plain text]
#include "config.h"
#include "RenderSVGTransformableContainer.h"
#include "SVGNames.h"
#include "SVGUseElement.h"
namespace WebCore {
RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGGraphicsElement& element, PassRef<RenderStyle> style)
: RenderSVGContainer(element, WTF::move(style))
, m_needsTransformUpdate(true)
, m_didTransformToRootUpdate(false)
{
}
bool RenderSVGTransformableContainer::calculateLocalTransform()
{
SVGGraphicsElement& element = graphicsElement();
SVGUseElement* useElement = 0;
if (isSVGUseElement(element))
useElement = &toSVGUseElement(element);
else if (element.isInShadowTree() && isSVGGElement(element)) {
SVGElement* correspondingElement = element.correspondingElement();
if (correspondingElement && isSVGUseElement(correspondingElement))
useElement = toSVGUseElement(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;
}
}