bool RenderSVGImage::updateImageViewport() { SVGImageElement* image = toSVGImageElement(element()); FloatRect oldBoundaries = m_objectBoundingBox; bool updatedViewport = false; SVGLengthContext lengthContext(image); m_objectBoundingBox = FloatRect(image->xCurrentValue().value(lengthContext), image->yCurrentValue().value(lengthContext), image->widthCurrentValue().value(lengthContext), image->heightCurrentValue().value(lengthContext)); // Images with preserveAspectRatio=none should force non-uniform scaling. This can be achieved // by setting the image's container size to its intrinsic size. // See: http://www.w3.org/TR/SVG/single-page.html, 7.8 The ‘preserveAspectRatio’ attribute. if (image->preserveAspectRatioCurrentValue().align() == SVGPreserveAspectRatio::SVG_PRESERVEASPECTRATIO_NONE) { if (ImageResource* cachedImage = m_imageResource->cachedImage()) { LayoutSize intrinsicSize = cachedImage->imageSizeForRenderer(0, style()->effectiveZoom()); if (intrinsicSize != m_imageResource->imageSize(style()->effectiveZoom())) { m_imageResource->setContainerSizeForRenderer(roundedIntSize(intrinsicSize)); updatedViewport = true; } } } if (oldBoundaries != m_objectBoundingBox) { if (!updatedViewport) m_imageResource->setContainerSizeForRenderer(enclosingIntRect(m_objectBoundingBox).size()); updatedViewport = true; m_needsBoundariesUpdate = true; } return updatedViewport; }
void RenderSVGImage::paintForeground(PaintInfo& paintInfo) { RefPtr<Image> image = m_imageResource->image(); FloatRect destRect = m_objectBoundingBox; FloatRect srcRect(0, 0, image->width(), image->height()); SVGImageElement* imageElement = toSVGImageElement(element()); imageElement->preserveAspectRatioCurrentValue().transformRect(destRect, srcRect); bool useLowQualityScaling = false; if (style()->svgStyle()->bufferedRendering() != BR_STATIC) useLowQualityScaling = ImageQualityController::imageQualityController()->shouldPaintAtLowQuality(paintInfo.context, this, image.get(), image.get(), LayoutSize(destRect.size())); paintInfo.context->drawImage(image.get(), destRect, srcRect, CompositeSourceOver, DoNotRespectImageOrientation, useLowQualityScaling); }