Index: Source/core/rendering/svg/RenderSVGResourcePattern.cpp |
diff --git a/Source/core/rendering/svg/RenderSVGResourcePattern.cpp b/Source/core/rendering/svg/RenderSVGResourcePattern.cpp |
index 3230e856d3ceaa5f987d7306504bcbb5f1f8fa36..0b7520d1b2653c16c3c95ffe06a1a378fae217c7 100644 |
--- a/Source/core/rendering/svg/RenderSVGResourcePattern.cpp |
+++ b/Source/core/rendering/svg/RenderSVGResourcePattern.cpp |
@@ -43,15 +43,12 @@ public: |
RenderSVGResourcePattern::RenderSVGResourcePattern(SVGPatternElement* node) |
: RenderSVGResourcePaintServer(node) |
, m_shouldCollectPatternAttributes(true) |
+#if ENABLE(OILPAN) |
+ , m_attributesWrapper(PatternAttributesWrapper::create()) |
+#endif |
{ |
} |
-void RenderSVGResourcePattern::trace(Visitor* visitor) |
-{ |
- visitor->trace(m_attributes); |
- RenderSVGResourcePaintServer::trace(visitor); |
-} |
- |
void RenderSVGResourcePattern::removeAllClientsFromCache(bool markForInvalidation) |
{ |
m_patternMap.clear(); |
@@ -82,31 +79,32 @@ PatternData* RenderSVGResourcePattern::patternForRenderer(const RenderObject& ob |
PassOwnPtr<PatternData> RenderSVGResourcePattern::buildPatternData(const RenderObject& object) |
{ |
// If we couldn't determine the pattern content element root, stop here. |
- if (!m_attributes.patternContentElement()) |
+ const PatternAttributes& attributes = this->attributes(); |
+ if (!attributes.patternContentElement()) |
return nullptr; |
// An empty viewBox disables rendering. |
- if (m_attributes.hasViewBox() && m_attributes.viewBox().isEmpty()) |
+ if (attributes.hasViewBox() && attributes.viewBox().isEmpty()) |
return nullptr; |
ASSERT(element()); |
// Compute tile metrics. |
FloatRect clientBoundingBox = object.objectBoundingBox(); |
FloatRect tileBounds = SVGLengthContext::resolveRectangle(element(), |
- m_attributes.patternUnits(), clientBoundingBox, |
- m_attributes.x(), m_attributes.y(), m_attributes.width(), m_attributes.height()); |
+ attributes.patternUnits(), clientBoundingBox, |
+ attributes.x(), attributes.y(), attributes.width(), attributes.height()); |
if (tileBounds.isEmpty()) |
return nullptr; |
AffineTransform tileTransform; |
- if (m_attributes.hasViewBox()) { |
- if (m_attributes.viewBox().isEmpty()) |
+ if (attributes.hasViewBox()) { |
+ if (attributes.viewBox().isEmpty()) |
return nullptr; |
- tileTransform = SVGFitToViewBox::viewBoxToViewTransform(m_attributes.viewBox(), |
- m_attributes.preserveAspectRatio(), tileBounds.width(), tileBounds.height()); |
+ tileTransform = SVGFitToViewBox::viewBoxToViewTransform(attributes.viewBox(), |
+ attributes.preserveAspectRatio(), tileBounds.width(), tileBounds.height()); |
} else { |
// A viewbox overrides patternContentUnits, per spec. |
- if (m_attributes.patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) |
+ if (attributes.patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) |
tileTransform.scale(clientBoundingBox.width(), clientBoundingBox.height()); |
} |
@@ -115,7 +113,7 @@ PassOwnPtr<PatternData> RenderSVGResourcePattern::buildPatternData(const RenderO |
// Compute pattern space transformation. |
patternData->transform.translate(tileBounds.x(), tileBounds.y()); |
- AffineTransform patternTransform = m_attributes.patternTransform(); |
+ AffineTransform patternTransform = attributes.patternTransform(); |
if (!patternTransform.isIdentity()) |
patternData->transform = patternTransform * patternData->transform; |
@@ -133,15 +131,19 @@ SVGPaintServer RenderSVGResourcePattern::preparePaintServer(const RenderObject& |
if (m_shouldCollectPatternAttributes) { |
patternElement->synchronizeAnimatedSVGAttribute(anyQName()); |
+#if ENABLE(OILPAN) |
+ m_attributesWrapper->set(PatternAttributes()); |
+#else |
m_attributes = PatternAttributes(); |
- patternElement->collectPatternAttributes(m_attributes); |
+#endif |
+ patternElement->collectPatternAttributes(mutableAttributes()); |
m_shouldCollectPatternAttributes = false; |
} |
// Spec: When the geometry of the applicable element has no width or height and objectBoundingBox is specified, |
// then the given effect (e.g. a gradient or a filter) will be ignored. |
FloatRect objectBoundingBox = object.objectBoundingBox(); |
- if (m_attributes.patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && objectBoundingBox.isEmpty()) |
+ if (attributes().patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX && objectBoundingBox.isEmpty()) |
return SVGPaintServer::invalid(); |
PatternData* patternData = patternForRenderer(object); |
@@ -159,7 +161,7 @@ PassRefPtr<const SkPicture> RenderSVGResourcePattern::asPicture(const FloatRect& |
ASSERT(!m_shouldCollectPatternAttributes); |
AffineTransform contentTransform; |
- if (m_attributes.patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) |
+ if (attributes().patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) |
contentTransform = tileTransform; |
// Draw the content into a Picture. |
@@ -169,9 +171,9 @@ PassRefPtr<const SkPicture> RenderSVGResourcePattern::asPicture(const FloatRect& |
GraphicsContext recordingContext(nullptr, displayItemList.get()); |
recordingContext.beginRecording(FloatRect(FloatPoint(), tileBounds.size())); |
- ASSERT(m_attributes.patternContentElement()); |
+ ASSERT(attributes().patternContentElement()); |
RenderSVGResourceContainer* patternRenderer = |
- toRenderSVGResourceContainer(m_attributes.patternContentElement()->renderer()); |
+ toRenderSVGResourceContainer(attributes().patternContentElement()->renderer()); |
ASSERT(patternRenderer); |
ASSERT(!patternRenderer->needsLayout()); |