Index: Source/core/rendering/svg/RenderSVGImage.cpp |
diff --git a/Source/core/rendering/svg/RenderSVGImage.cpp b/Source/core/rendering/svg/RenderSVGImage.cpp |
deleted file mode 100644 |
index 403e3ef66b882ea19661d39bb15df7257c732f36..0000000000000000000000000000000000000000 |
--- a/Source/core/rendering/svg/RenderSVGImage.cpp |
+++ /dev/null |
@@ -1,202 +0,0 @@ |
-/* |
- * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org> |
- * Copyright (C) 2006 Apple Computer, Inc. |
- * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> |
- * Copyright (C) 2007, 2008, 2009 Rob Buis <buis@kde.org> |
- * Copyright (C) 2009 Google, Inc. |
- * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
- * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> |
- * |
- * This library is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU Library General Public |
- * License as published by the Free Software Foundation; either |
- * version 2 of the License, or (at your option) any later version. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- * Library General Public License for more details. |
- * |
- * You should have received a copy of the GNU Library General Public License |
- * along with this library; see the file COPYING.LIB. If not, write to |
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
- * Boston, MA 02110-1301, USA. |
- */ |
- |
-#include "config.h" |
- |
-#include "core/rendering/svg/RenderSVGImage.h" |
- |
-#include "core/layout/ImageQualityController.h" |
-#include "core/layout/LayoutImageResource.h" |
-#include "core/layout/PointerEventsHitRules.h" |
-#include "core/layout/svg/LayoutSVGResourceContainer.h" |
-#include "core/layout/svg/SVGLayoutSupport.h" |
-#include "core/layout/svg/SVGResources.h" |
-#include "core/layout/svg/SVGResourcesCache.h" |
-#include "core/paint/SVGImagePainter.h" |
-#include "core/svg/SVGImageElement.h" |
-#include "platform/LengthFunctions.h" |
-#include "third_party/skia/include/core/SkPicture.h" |
- |
-namespace blink { |
- |
-RenderSVGImage::RenderSVGImage(SVGImageElement* impl) |
- : RenderSVGModelObject(impl) |
- , m_needsBoundariesUpdate(true) |
- , m_needsTransformUpdate(true) |
- , m_imageResource(LayoutImageResource::create()) |
-{ |
- m_imageResource->initialize(this); |
-} |
- |
-RenderSVGImage::~RenderSVGImage() |
-{ |
-} |
- |
-void RenderSVGImage::destroy() |
-{ |
- ImageQualityController::remove(this); |
- m_imageResource->shutdown(); |
- RenderSVGModelObject::destroy(); |
-} |
- |
-FloatSize RenderSVGImage::computeImageViewportSize(ImageResource& cachedImage) const |
-{ |
- if (toSVGImageElement(element())->preserveAspectRatio()->currentValue()->align() != SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_NONE) |
- return m_objectBoundingBox.size(); |
- |
- // Images with preserveAspectRatio=none should force non-uniform |
- // scaling. This can be achieved by setting the image's container size to |
- // its viewport size (i.e. if a viewBox is available - use that - else use intrinsic size.) |
- // See: http://www.w3.org/TR/SVG/single-page.html, 7.8 The 'preserveAspectRatio' attribute. |
- Length intrinsicWidth; |
- Length intrinsicHeight; |
- FloatSize intrinsicRatio; |
- cachedImage.computeIntrinsicDimensions(intrinsicWidth, intrinsicHeight, intrinsicRatio); |
- return intrinsicRatio; |
-} |
- |
-static bool containerSizeIsSetForRenderer(ImageResource& cachedImage, const LayoutObject* renderer) |
-{ |
- const Image* image = cachedImage.image(); |
- // If a container size has been specified for this renderer, then |
- // imageForRenderer() will return the SVGImageForContainer while image() |
- // will return the underlying SVGImage. |
- return !image->isSVGImage() || image != cachedImage.imageForRenderer(renderer); |
-} |
- |
-bool RenderSVGImage::updateImageViewport() |
-{ |
- SVGImageElement* image = toSVGImageElement(element()); |
- FloatRect oldBoundaries = m_objectBoundingBox; |
- |
- SVGLengthContext lengthContext(image); |
- m_objectBoundingBox = FloatRect(image->x()->currentValue()->value(lengthContext), image->y()->currentValue()->value(lengthContext), image->width()->currentValue()->value(lengthContext), image->height()->currentValue()->value(lengthContext)); |
- 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(style()->effectiveZoom()) |
- || !containerSizeIsSetForRenderer(*cachedImage, this)) { |
- m_imageResource->setContainerSizeForRenderer(roundedIntSize(imageViewportSize)); |
- updatedViewport = true; |
- } |
- } |
- |
- m_needsBoundariesUpdate |= boundsChanged; |
- return updatedViewport || boundsChanged; |
-} |
- |
-void RenderSVGImage::layout() |
-{ |
- ASSERT(needsLayout()); |
- |
- updateImageViewport(); |
- |
- bool transformOrBoundariesUpdate = m_needsTransformUpdate || m_needsBoundariesUpdate; |
- if (m_needsTransformUpdate) { |
- m_localTransform = toSVGImageElement(element())->calculateAnimatedLocalTransform(); |
- m_needsTransformUpdate = false; |
- } |
- |
- if (m_needsBoundariesUpdate) { |
- m_bufferedForeground.clear(); |
- |
- m_paintInvalidationBoundingBox = m_objectBoundingBox; |
- SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_paintInvalidationBoundingBox); |
- |
- m_needsBoundariesUpdate = false; |
- } |
- |
- // Invalidate all resources of this client if our layout changed. |
- if (everHadLayout() && selfNeedsLayout()) |
- SVGResourcesCache::clientLayoutChanged(this); |
- |
- // If our bounds changed, notify the parents. |
- if (transformOrBoundariesUpdate) |
- RenderSVGModelObject::setNeedsBoundariesUpdate(); |
- |
- clearNeedsLayout(); |
-} |
- |
-void RenderSVGImage::paint(const PaintInfo& paintInfo, const LayoutPoint&) |
-{ |
- SVGImagePainter(*this).paint(paintInfo); |
-} |
- |
-bool RenderSVGImage::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction) |
-{ |
- // We only draw in the forground phase, so we only hit-test then. |
- if (hitTestAction != HitTestForeground) |
- return false; |
- |
- PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_IMAGE_HITTESTING, request, style()->pointerEvents()); |
- bool isVisible = (style()->visibility() == VISIBLE); |
- if (isVisible || !hitRules.requireVisible) { |
- FloatPoint localPoint; |
- if (!SVGLayoutSupport::transformToUserSpaceAndCheckClipping(this, localToParentTransform(), pointInParent, localPoint)) |
- return false; |
- |
- if (hitRules.canHitFill || hitRules.canHitBoundingBox) { |
- if (m_objectBoundingBox.contains(localPoint)) { |
- updateHitTestResult(result, roundedLayoutPoint(localPoint)); |
- return true; |
- } |
- } |
- } |
- |
- return false; |
-} |
- |
-void RenderSVGImage::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. |
- 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(); |
- |
- m_bufferedForeground.clear(); |
- |
- setShouldDoFullPaintInvalidation(); |
-} |
- |
-void RenderSVGImage::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint&) const |
-{ |
- // this is called from paint() after the localTransform has already been applied |
- LayoutRect contentRect = LayoutRect(paintInvalidationRectInLocalCoordinates()); |
- if (!contentRect.isEmpty()) |
- rects.append(contentRect); |
-} |
- |
-} // namespace blink |