Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(766)

Unified Diff: Source/core/layout/svg/LayoutSVGImage.cpp

Issue 1219493005: Cleanups to viewport-handling and image invalidation in LayoutSVGImage (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/layout/svg/LayoutSVGImage.h ('k') | Source/core/svg/SVGImageElement.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/layout/svg/LayoutSVGImage.cpp
diff --git a/Source/core/layout/svg/LayoutSVGImage.cpp b/Source/core/layout/svg/LayoutSVGImage.cpp
index 90cdeee1df37ea5dca5368f51d0000ce08474924..9f22f8941089a792bb0b373a2068e9ff657b71e2 100644
--- a/Source/core/layout/svg/LayoutSVGImage.cpp
+++ b/Source/core/layout/svg/LayoutSVGImage.cpp
@@ -88,32 +88,29 @@ static bool containerSizeIsSetForLayoutObject(ImageResource& cachedImage, const
return !image->isSVGImage() || image != cachedImage.imageForLayoutObject(layoutObject);
}
-bool LayoutSVGImage::updateImageViewport()
+void LayoutSVGImage::updateImageContainerSize()
+{
+ ImageResource* cachedImage = m_imageResource->cachedImage();
+ if (!cachedImage || !cachedImage->usesImageContainerSize())
+ return;
+ FloatSize imageViewportSize = computeImageViewportSize(*cachedImage);
+ if (LayoutSize(imageViewportSize) != m_imageResource->imageSize(styleRef().effectiveZoom())
+ || !containerSizeIsSetForLayoutObject(*cachedImage, this)) {
+ m_imageResource->setContainerSizeForLayoutObject(roundedIntSize(imageViewportSize));
+ }
+}
+
+void LayoutSVGImage::updateBoundingBox()
{
- SVGImageElement* image = toSVGImageElement(element());
FloatRect oldBoundaries = m_objectBoundingBox;
- SVGLengthContext lengthContext(image);
+ SVGLengthContext lengthContext(element());
m_objectBoundingBox = FloatRect(
lengthContext.valueForLength(styleRef().svgStyle().x(), styleRef(), SVGLengthMode::Width),
lengthContext.valueForLength(styleRef().svgStyle().y(), styleRef(), SVGLengthMode::Height),
lengthContext.valueForLength(styleRef().width(), styleRef(), SVGLengthMode::Width),
lengthContext.valueForLength(styleRef().height(), styleRef(), SVGLengthMode::Height));
- bool boundsChanged = oldBoundaries != m_objectBoundingBox;
-
- bool updatedViewport = false;
- ImageResource* cachedImage = m_imageResource->cachedImage();
- if (cachedImage && cachedImage->usesImageContainerSize()) {
- FloatSize imageViewportSize = computeImageViewportSize(*cachedImage);
- if (LayoutSize(imageViewportSize) != m_imageResource->imageSize(styleRef().effectiveZoom())
- || !containerSizeIsSetForLayoutObject(*cachedImage, this)) {
- m_imageResource->setContainerSizeForLayoutObject(roundedIntSize(imageViewportSize));
- updatedViewport = true;
- }
- }
-
- m_needsBoundariesUpdate |= boundsChanged;
- return updatedViewport || boundsChanged;
+ m_needsBoundariesUpdate |= oldBoundaries != m_objectBoundingBox;
}
void LayoutSVGImage::layout()
@@ -121,7 +118,8 @@ void LayoutSVGImage::layout()
ASSERT(needsLayout());
LayoutAnalyzer::Scope analyzer(*this);
- updateImageViewport();
+ updateBoundingBox();
+ updateImageContainerSize();
bool transformOrBoundariesUpdate = m_needsTransformUpdate || m_needsBoundariesUpdate;
if (m_needsTransformUpdate) {
@@ -180,18 +178,14 @@ bool LayoutSVGImage::nodeAtFloatPoint(HitTestResult& result, const FloatPoint& p
void LayoutSVGImage::imageChanged(WrappedImagePtr, const IntRect*)
{
- // The image resource defaults to nullImage until the resource arrives.
- // This empty image may be cached by SVG resources which must be invalidated.
- if (SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(this))
- resources->removeClientFromCache(this);
-
- // Eventually notify parent resources, that we've changed.
+ // Notify parent resources that we've changed. This also invalidates
+ // references from resources (filters) that may have a cached
+ // representation of this image/layout object.
LayoutSVGResourceContainer::markForLayoutAndParentResourceInvalidation(this, false);
// Update the SVGImageCache sizeAndScales entry in case image loading finished after layout.
// (https://bugs.webkit.org/show_bug.cgi?id=99489)
- m_objectBoundingBox = FloatRect();
- updateImageViewport();
+ updateImageContainerSize();
f(malita) 2015/07/01 16:39:34 If we're no longer updating the bbox here, is it p
fs 2015/07/01 16:58:13 The image (dimensions) does not affect the viewpor
m_bufferedForeground.clear();
« no previous file with comments | « Source/core/layout/svg/LayoutSVGImage.h ('k') | Source/core/svg/SVGImageElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698