Index: Source/core/rendering/svg/SVGRenderSupport.h |
diff --git a/Source/core/rendering/svg/SVGRenderSupport.h b/Source/core/rendering/svg/SVGRenderSupport.h |
index 641e08cb675fe573c9207ce9cc48c824a2f54c4b..f8a1450334fa78e1f52d7043e8d7c341ac80f9c7 100644 |
--- a/Source/core/rendering/svg/SVGRenderSupport.h |
+++ b/Source/core/rendering/svg/SVGRenderSupport.h |
@@ -24,33 +24,28 @@ |
#ifndef SVGRenderSupport_h |
#define SVGRenderSupport_h |
-#include "core/rendering/PaintInfo.h" |
-#include "core/rendering/svg/RenderSVGRoot.h" |
-#include "core/rendering/svg/RenderSVGShape.h" |
-#include "core/rendering/svg/RenderSVGText.h" |
-#include "core/rendering/svg/RenderSVGViewportContainer.h" |
-#include "core/rendering/svg/SVGResources.h" |
-#include "core/rendering/svg/SVGResourcesCache.h" |
- |
namespace WebCore { |
+class AffineTransform; |
class FloatPoint; |
class FloatRect; |
+class GraphicsContext; |
class ImageBuffer; |
class LayoutRect; |
+struct PaintInfo; |
class RenderBoxModelObject; |
class RenderGeometryMap; |
class RenderLayerModelObject; |
class RenderObject; |
class RenderStyle; |
class RenderSVGRoot; |
+class StrokeData; |
class TransformState; |
class SVGRenderSupport { |
public: |
// Shares child layouting code between RenderSVGRoot/RenderSVG(Hidden)Container |
- template <typename RenderObjectType> |
- static void layoutChildren(RenderObjectType*, bool selfNeedsLayout); |
+ static void layoutChildren(RenderObject*, bool selfNeedsLayout); |
// Layout resources used by this node. |
static void layoutResourcesIfNeeded(const RenderObject*); |
@@ -67,8 +62,7 @@ public: |
// Determines whether the passed point lies in a clipping area |
static bool pointInClippingArea(RenderObject*, const FloatPoint&); |
- template <typename RenderObjectType> |
- static void computeContainerBoundingBoxes(const RenderObjectType* container, FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox); |
+ static void computeContainerBoundingBoxes(const RenderObject* container, FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox); |
static bool paintInfoIntersectsRepaintRect(const FloatRect& localRepaintRect, const AffineTransform& localTransform, const PaintInfo&); |
@@ -99,137 +93,6 @@ private: |
static bool layoutSizeOfNearestViewportChanged(const RenderObject* start); |
}; |
-template <typename RenderObjectType> |
-void SVGRenderSupport::computeContainerBoundingBoxes(const RenderObjectType* container, FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox) |
-{ |
- objectBoundingBox = FloatRect(); |
- objectBoundingBoxValid = false; |
- strokeBoundingBox = FloatRect(); |
- |
- // When computing the strokeBoundingBox, we use the repaintRects of the container's children so that the container's stroke includes |
- // the resources applied to the children (such as clips and filters). This allows filters applied to containers to correctly bound |
- // the children, and also improves inlining of SVG content, as the stroke bound is used in that situation also. |
- for (RenderObject* current = container->firstChild(); current; current = current->nextSibling()) { |
- if (current->isSVGHiddenContainer()) |
- continue; |
- |
- const AffineTransform& transform = current->localToParentTransform(); |
- updateObjectBoundingBox(objectBoundingBox, objectBoundingBoxValid, current, |
- transform.mapRect(current->objectBoundingBox())); |
- strokeBoundingBox.unite(transform.mapRect(current->repaintRectInLocalCoordinates())); |
- } |
- |
- repaintBoundingBox = strokeBoundingBox; |
-} |
- |
-template <typename RenderObjectType> |
-void SVGRenderSupport::layoutChildren(RenderObjectType* start, bool selfNeedsLayout) |
-{ |
- bool layoutSizeChanged = layoutSizeOfNearestViewportChanged(start); |
- bool transformChanged = transformToRootChanged(start); |
- HashSet<RenderObject*> notlayoutedObjects; |
- |
- for (RenderObject* child = start->firstChild(); child; child = child->nextSibling()) { |
- bool needsLayout = selfNeedsLayout; |
- bool childEverHadLayout = child->everHadLayout(); |
- |
- if (transformChanged) { |
- // If the transform changed we need to update the text metrics (note: this also happens for layoutSizeChanged=true). |
- if (child->isSVGText()) |
- toRenderSVGText(child)->setNeedsTextMetricsUpdate(); |
- needsLayout = true; |
- } |
- |
- if (layoutSizeChanged) { |
- // When selfNeedsLayout is false and the layout size changed, we have to check whether this child uses relative lengths |
- if (SVGElement* element = child->node()->isSVGElement() ? toSVGElement(child->node()) : 0) { |
- if (element->hasRelativeLengths()) { |
- // When the layout size changed and when using relative values tell the RenderSVGShape to update its shape object |
- if (child->isSVGShape()) { |
- toRenderSVGShape(child)->setNeedsShapeUpdate(); |
- } else if (child->isSVGText()) { |
- toRenderSVGText(child)->setNeedsTextMetricsUpdate(); |
- toRenderSVGText(child)->setNeedsPositioningValuesUpdate(); |
- } |
- |
- needsLayout = true; |
- } |
- } |
- } |
- |
- SubtreeLayoutScope layoutScope(*child); |
- // Resource containers are nasty: they can invalidate clients outside the current SubtreeLayoutScope. |
- // Since they only care about viewport size changes (to resolve their relative lengths), we trigger |
- // their invalidation directly from SVGSVGElement::svgAttributeChange() or at a higher |
- // SubtreeLayoutScope (in RenderView::layout()). |
- if (needsLayout && !child->isSVGResourceContainer()) |
- layoutScope.setNeedsLayout(child); |
- |
- layoutResourcesIfNeeded(child); |
- |
- if (child->needsLayout()) { |
- child->layout(); |
- // Renderers are responsible for repainting themselves when changing, except |
- // for the initial paint to avoid potential double-painting caused by non-sensical "old" bounds. |
- // We could handle this in the individual objects, but for now it's easier to have |
- // parent containers call repaint(). (RenderBlock::layout* has similar logic.) |
- if (!childEverHadLayout && !RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) |
- child->repaint(); |
- } else if (layoutSizeChanged) { |
- notlayoutedObjects.add(child); |
- } |
- } |
- |
- if (!layoutSizeChanged) { |
- ASSERT(notlayoutedObjects.isEmpty()); |
- return; |
- } |
- |
- // If the layout size changed, invalidate all resources of all children that didn't go through the layout() code path. |
- HashSet<RenderObject*>::iterator end = notlayoutedObjects.end(); |
- for (HashSet<RenderObject*>::iterator it = notlayoutedObjects.begin(); it != end; ++it) |
- invalidateResourcesOfChildren(*it); |
-} |
- |
-// Update a bounding box taking into account the validity of the other bounding box. |
-inline void SVGRenderSupport::updateObjectBoundingBox(FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, RenderObject* other, FloatRect otherBoundingBox) |
-{ |
- bool otherValid = other->isSVGContainer() ? toRenderSVGContainer(other)->isObjectBoundingBoxValid() : true; |
- if (!otherValid) |
- return; |
- |
- if (!objectBoundingBoxValid) { |
- objectBoundingBox = otherBoundingBox; |
- objectBoundingBoxValid = true; |
- return; |
- } |
- |
- objectBoundingBox.uniteEvenIfEmpty(otherBoundingBox); |
-} |
- |
-inline void SVGRenderSupport::invalidateResourcesOfChildren(RenderObject* start) |
-{ |
- ASSERT(!start->needsLayout()); |
- if (SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(start)) |
- resources->removeClientFromCache(start, false); |
- |
- for (RenderObject* child = start->slowFirstChild(); child; child = child->nextSibling()) |
- invalidateResourcesOfChildren(child); |
-} |
- |
-inline bool SVGRenderSupport::layoutSizeOfNearestViewportChanged(const RenderObject* start) |
-{ |
- while (start && !start->isSVGRoot() && !start->isSVGViewportContainer()) |
- start = start->parent(); |
- |
- ASSERT(start); |
- ASSERT(start->isSVGRoot() || start->isSVGViewportContainer()); |
- if (start->isSVGViewportContainer()) |
- return toRenderSVGViewportContainer(start)->isLayoutSizeChanged(); |
- |
- return toRenderSVGRoot(start)->isLayoutSizeChanged(); |
-} |
- |
} // namespace WebCore |
#endif // SVGRenderSupport_h |