RenderSVGTransformableContainer.cpp [plain text]
#include "config.h"
#include "RenderSVGTransformableContainer.h"
#include "SVGGElement.h"
#include "SVGUseElement.h"
namespace WebCore {
RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGGraphicsElement& element, RenderStyle&& style)
: RenderSVGContainer(element, WTFMove(style))
, m_needsTransformUpdate(true)
, m_didTransformToRootUpdate(false)
{
}
bool RenderSVGTransformableContainer::calculateLocalTransform()
{
SVGGraphicsElement& element = graphicsElement();
SVGUseElement* useElement = nullptr;
if (is<SVGUseElement>(element))
useElement = &downcast<SVGUseElement>(element);
else if (element.isInShadowTree() && is<SVGGElement>(element)) {
SVGElement* correspondingElement = element.correspondingElement();
if (is<SVGUseElement>(correspondingElement))
useElement = downcast<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;
}
}