| Index: Source/core/paint/SVGImagePainter.cpp
|
| diff --git a/Source/core/paint/SVGImagePainter.cpp b/Source/core/paint/SVGImagePainter.cpp
|
| index c57b326cf9abf42b18276dc39d71898f9e9ab883..05e5a88680539893858e1461ae2b3b0562d27c02 100644
|
| --- a/Source/core/paint/SVGImagePainter.cpp
|
| +++ b/Source/core/paint/SVGImagePainter.cpp
|
| @@ -42,10 +42,10 @@ void SVGImagePainter::paint(PaintInfo& paintInfo)
|
|
|
| SVGRenderingContext renderingContext(&m_renderSVGImage, childPaintInfo);
|
| if (renderingContext.isRenderingPrepared()) {
|
| - if (m_renderSVGImage.style()->svgStyle().bufferedRendering() == BR_STATIC && renderingContext.bufferForeground(m_renderSVGImage.bufferedForeground()))
|
| + if (m_renderSVGImage.style()->svgStyle().bufferedRendering() == BR_STATIC && bufferForeground(childPaintInfo))
|
| return;
|
|
|
| - paintForeground(m_renderSVGImage, childPaintInfo);
|
| + paintForeground(childPaintInfo);
|
| }
|
| }
|
|
|
| @@ -53,18 +53,56 @@ void SVGImagePainter::paint(PaintInfo& paintInfo)
|
| ObjectPainter(m_renderSVGImage).paintOutline(childPaintInfo, IntRect(boundingBox));
|
| }
|
|
|
| -void SVGImagePainter::paintForeground(RenderSVGImage& renderer, PaintInfo& paintInfo)
|
| +static IntSize estimateBufferSize(const AffineTransform& transform, const IntSize& boundingBox)
|
| {
|
| - RefPtr<Image> image = renderer.imageResource()->image();
|
| - FloatRect destRect = renderer.objectBoundingBox();
|
| + // This is supposed to be the exact same calculation as GraphicsContext::createRasterBuffer performs.
|
| + int estimatedWidth = static_cast<int>(ceil(boundingBox.width() * transform.xScale()));
|
| + int estimatedHeight = static_cast<int>(ceil(boundingBox.height() * transform.yScale()));
|
| + return IntSize(estimatedWidth, estimatedHeight);
|
| +}
|
| +
|
| +bool SVGImagePainter::bufferForeground(PaintInfo& paintInfo)
|
| +{
|
| + FloatRect boundingBox = m_renderSVGImage.objectBoundingBox();
|
| + OwnPtr<ImageBuffer>& imageBuffer = m_renderSVGImage.bufferedForeground();
|
| + IntSize expandedBoundingBox = expandedIntSize(boundingBox.size());
|
| +
|
| + // Invalidate an existing buffer if the scale is not correct.
|
| + if (imageBuffer) {
|
| + IntSize estimatedBufferSize = estimateBufferSize(paintInfo.context->getCTM(), expandedBoundingBox);
|
| + if (estimatedBufferSize != imageBuffer->size())
|
| + imageBuffer.clear();
|
| + }
|
| +
|
| + // Create a new buffer and paint the foreground into it.
|
| + if (!imageBuffer) {
|
| + imageBuffer = paintInfo.context->createRasterBuffer(expandedBoundingBox);
|
| + if (!imageBuffer)
|
| + return false;
|
| +
|
| + GraphicsContext* bufferedRenderingContext = imageBuffer->context();
|
| + bufferedRenderingContext->translate(-boundingBox.x(), -boundingBox.y());
|
| + PaintInfo bufferedInfo(paintInfo);
|
| + bufferedInfo.context = bufferedRenderingContext;
|
| + paintForeground(bufferedInfo);
|
| + }
|
| +
|
| + paintInfo.context->drawImageBuffer(imageBuffer.get(), boundingBox);
|
| + return true;
|
| +}
|
| +
|
| +void SVGImagePainter::paintForeground(PaintInfo& paintInfo)
|
| +{
|
| + RefPtr<Image> image = m_renderSVGImage.imageResource()->image();
|
| + FloatRect destRect = m_renderSVGImage.objectBoundingBox();
|
| FloatRect srcRect(0, 0, image->width(), image->height());
|
|
|
| - SVGImageElement* imageElement = toSVGImageElement(renderer.element());
|
| + SVGImageElement* imageElement = toSVGImageElement(m_renderSVGImage.element());
|
| imageElement->preserveAspectRatio()->currentValue()->transformRect(destRect, srcRect);
|
|
|
| InterpolationQuality interpolationQuality = InterpolationDefault;
|
| - if (renderer.style()->svgStyle().bufferedRendering() != BR_STATIC)
|
| - interpolationQuality = ImageQualityController::imageQualityController()->chooseInterpolationQuality(paintInfo.context, &renderer, image.get(), image.get(), LayoutSize(destRect.size()));
|
| + if (m_renderSVGImage.style()->svgStyle().bufferedRendering() != BR_STATIC)
|
| + interpolationQuality = ImageQualityController::imageQualityController()->chooseInterpolationQuality(paintInfo.context, &m_renderSVGImage, image.get(), image.get(), LayoutSize(destRect.size()));
|
|
|
| InterpolationQuality previousInterpolationQuality = paintInfo.context->imageInterpolationQuality();
|
| paintInfo.context->setImageInterpolationQuality(interpolationQuality);
|
|
|