<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[183956] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/183956">183956</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-05-07 15:46:43 -0700 (Thu, 07 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Applying a filter on an SVG element, which is larger than 4096 pixels, causes this element to be rendered shifted to the left
https://bugs.webkit.org/show_bug.cgi?id=144335

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2015-05-07
Reviewed by Darin Adler.

Source/WebCore:

When the SVG element is larger than 4096x4096 pixels and it has a filter,
a clipper or a masker, the ImageBuffer which is created for drawing the
sourceGraphicBuffer has to be clamped to this size. The reason for this
clamping is the FilterEffect simply ignores processing any ImageBuffer
larger than this size.

The bug was happening because we did not propagate the clamping logic to
the FilterEffect. The FilterEffect result ImageBuffer was not clamped as
what we do for drawing the sourceGraphicBuffer. If only the destination
point is specified, the GraphicsContext::drawImageBuffer() assumes the
source and the destination images have the same size which is not true
with the clamping.

The fix is to add the clamping logic to the FilterEffect. Two places we
need to change. (1) FilterEffect::createImageBufferResult() has to apply
the same clamping we do in SVGRenderingContext::createImageBuffer(). (2)
FilterEffect::drawingRegionOfInputImage() has to consider the clamping
when mapping from absolute coordinates to the ImageBuffer coordinates.

Tests: svg/filters/big-sized-off-viewport-filter.svg

* platform/graphics/ImageBuffer.cpp:
(WebCore::ImageBuffer::isSizeClamped):
(WebCore::ImageBuffer::clampedSize):
(WebCore::ImageBuffer::clampedRect):
* platform/graphics/ImageBuffer.h:
(WebCore::ImageBuffer::setSpaceSize): Move all the clamping helper methods
from SVGRenderingContext and RenderSVGResourceFilter to the ImageBuffer.

* platform/graphics/filters/FEColorMatrix.cpp:
(WebCore::FEColorMatrix::platformApplySoftware): Use logicalSize() of the
result image instead of using absolutePaintRect(). The later returns the
rectangle of the element without clamping.

* platform/graphics/filters/FETile.cpp:
(WebCore::FETile::platformApplySoftware):
* rendering/svg/RenderSVGResourceClipper.cpp:
(WebCore::RenderSVGResourceClipper::applyClippingToContext):
* rendering/svg/RenderSVGResourceFilter.cpp:
(WebCore::RenderSVGResourceFilter::applyResource):
(WebCore::RenderSVGResourceFilter::fitsInMaximumImageSize): Deleted.
* rendering/svg/RenderSVGResourceFilter.h:
* rendering/svg/RenderSVGResourceGradient.cpp:
(WebCore::createMaskAndSwapContextForTextGradient):
(WebCore::clipToTextMask):
* rendering/svg/RenderSVGResourceMasker.cpp:
(WebCore::RenderSVGResourceMasker::applySVGMask):
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildPattern):
(WebCore::RenderSVGResourcePattern::createTileImage): Make the modifications
which are needed because of moving the clamping helper methods to ImageBuffer
and because of changing the prototype of SVGRenderingContext methods.

* platform/graphics/filters/FilterEffect.cpp:
(WebCore::FilterEffect::drawingRegionOfInputImage): Consider the clamping
when mapping from absolute coordinates to the ImageBuffer coordinates.

(WebCore::FilterEffect::createImageBufferResult): Apply the same clamping
we do in SVGRenderingContext::createImageBuffer() when creating the
FilterEffect result ImageBuffer.

(WebCore::FilterEffect::apply):
(WebCore::FilterEffect::asUnmultipliedImage):
(WebCore::FilterEffect::asPremultipliedImage):
(WebCore::FilterEffect::copyUnmultipliedImage):
(WebCore::FilterEffect::copyPremultipliedImage):
(WebCore::FilterEffect::createUnmultipliedImageResult):
(WebCore::FilterEffect::createPremultipliedImageResult):
(WebCore::FilterEffect::maxFilterArea): Deleted.
(WebCore::FilterEffect::isFilterSizeValid): Deleted.
* platform/graphics/filters/FilterEffect.h: Use the new ImageBuffer clamping
helper methods and delete the local ones.

* platform/graphics/transforms/AffineTransform.cpp:
(WebCore::AffineTransform::scaleNonUniform):
(WebCore::AffineTransform::scale):
(WebCore::AffineTransform::translate):
* platform/graphics/transforms/AffineTransform.h: Add new scale and translate
overloads to AffineTransform.

* rendering/FilterEffectRenderer.cpp:
(WebCore::FilterEffectRenderer::updateBackingStoreRect):
(WebCore::FilterEffectRendererHelper::beginFilterEffect): Code clean up.

* rendering/svg/SVGRenderingContext.cpp:
(WebCore::SVGRenderingContext::calculateScreenFontSizeScalingFactor):
(WebCore::SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem):
Return the AffineTransform instead of passing it through the reference of
an argument.

(WebCore::SVGRenderingContext::createImageBuffer):
(WebCore::SVGRenderingContext::createImageBufferForPattern): Deleted.
Code clean up and method rename.

(WebCore::SVGRenderingContext::clampedAbsoluteTargetRect): Deleted.
(WebCore::SVGRenderingContext::clampedAbsoluteSize): Deleted.
* rendering/svg/SVGRenderingContext.h: Move the clamping helper methods to
the ImageBuffer class.

LayoutTests:

* svg/filters/big-sized-off-viewport-filter-expected.svg: Added.
* svg/filters/big-sized-off-viewport-filter.svg: Added.
Ensure when applying a filter on a large SVG element, the viewport of the
SVG includes the correct drawing part of this element.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsImageBuffercpp">trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsImageBufferh">trunk/Source/WebCore/platform/graphics/ImageBuffer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFEColorMatrixcpp">trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFETilecpp">trunk/Source/WebCore/platform/graphics/filters/FETile.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFilterEffectcpp">trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsfiltersFilterEffecth">trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsAffineTransformcpp">trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsAffineTransformh">trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h</a></li>
<li><a href="#trunkSourceWebCorerenderingFilterEffectRenderercpp">trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceClippercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceFiltercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceFilterh">trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceGradientcpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourceMaskercpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgRenderSVGResourcePatterncpp">trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGRenderingContextcpp">trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGRenderingContexth">trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestssvgfiltersbigsizedoffviewportfilterexpectedsvg">trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter-expected.svg</a></li>
<li><a href="#trunkLayoutTestssvgfiltersbigsizedoffviewportfiltersvg">trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter.svg</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/LayoutTests/ChangeLog        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-05-07  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Applying a filter on an SVG element, which is larger than 4096 pixels, causes this element to be rendered shifted to the left
+        https://bugs.webkit.org/show_bug.cgi?id=144335
+
+        Reviewed by Darin Adler.
+
+        * svg/filters/big-sized-off-viewport-filter-expected.svg: Added.
+        * svg/filters/big-sized-off-viewport-filter.svg: Added.
+        Ensure when applying a filter on a large SVG element, the viewport of the
+        SVG includes the correct drawing part of this element.
+
</ins><span class="cx"> 2015-05-07  Yoav Weiss  &lt;yoav@yoav.ws&gt;
</span><span class="cx"> 
</span><span class="cx">         Handle meta viewport in HTMLPreloadScanner
</span></span></pre></div>
<a id="trunkLayoutTestssvgfiltersbigsizedoffviewportfilterexpectedsvg"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter-expected.svg (0 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter-expected.svg                                (rev 0)
+++ trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter-expected.svg        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 1000 500&quot;&gt;
+  &lt;filter id=&quot;saturate-back&quot;&gt;
+    &lt;feColorMatrix in=&quot;SourceGraphic&quot; type=&quot;saturate&quot; values=&quot;1&quot;/&gt;
+  &lt;/filter&gt;
+  &lt;g filter=&quot;url(#saturate-back)&quot;&gt;
+    &lt;rect x=&quot;-500&quot; y=&quot;0&quot; width=&quot;950&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+    &lt;rect x=&quot;550&quot; y=&quot;0&quot; width=&quot;950&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+  &lt;/g&gt;
+  &lt;rect x=&quot;450&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;100%&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;10&quot;/&gt;
+&lt;/svg&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestssvgfiltersbigsizedoffviewportfiltersvg"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter.svg (0 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter.svg                                (rev 0)
+++ trunk/LayoutTests/svg/filters/big-sized-off-viewport-filter.svg        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 1000 500&quot;&gt;
+  &lt;filter id=&quot;saturate-back&quot;&gt;
+    &lt;feColorMatrix in=&quot;SourceGraphic&quot; type=&quot;saturate&quot; values=&quot;1&quot;/&gt;
+  &lt;/filter&gt;
+  &lt;g filter=&quot;url(#saturate-back)&quot;&gt;
+    &lt;rect x=&quot;-3500&quot; y=&quot;0&quot; width=&quot;3950&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+    &lt;rect x=&quot;550&quot; y=&quot;0&quot; width=&quot;3950&quot; height=&quot;100%&quot; fill=&quot;green&quot;/&gt;
+  &lt;/g&gt;
+  &lt;!-- Ensure the edges of the rectangles are sharp after clamping the filter image and scaling it up --&gt;
+  &lt;rect x=&quot;450&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;100%&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;10&quot;/&gt;
+&lt;/svg&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/ChangeLog        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -1,3 +1,109 @@
</span><ins>+2015-05-07  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Applying a filter on an SVG element, which is larger than 4096 pixels, causes this element to be rendered shifted to the left
+        https://bugs.webkit.org/show_bug.cgi?id=144335
+
+        Reviewed by Darin Adler.
+
+        When the SVG element is larger than 4096x4096 pixels and it has a filter,
+        a clipper or a masker, the ImageBuffer which is created for drawing the
+        sourceGraphicBuffer has to be clamped to this size. The reason for this
+        clamping is the FilterEffect simply ignores processing any ImageBuffer
+        larger than this size.
+        
+        The bug was happening because we did not propagate the clamping logic to
+        the FilterEffect. The FilterEffect result ImageBuffer was not clamped as
+        what we do for drawing the sourceGraphicBuffer. If only the destination
+        point is specified, the GraphicsContext::drawImageBuffer() assumes the
+        source and the destination images have the same size which is not true
+        with the clamping.
+        
+        The fix is to add the clamping logic to the FilterEffect. Two places we
+        need to change. (1) FilterEffect::createImageBufferResult() has to apply
+        the same clamping we do in SVGRenderingContext::createImageBuffer(). (2)
+        FilterEffect::drawingRegionOfInputImage() has to consider the clamping 
+        when mapping from absolute coordinates to the ImageBuffer coordinates.
+        
+        Tests: svg/filters/big-sized-off-viewport-filter.svg
+
+        * platform/graphics/ImageBuffer.cpp:
+        (WebCore::ImageBuffer::isSizeClamped):
+        (WebCore::ImageBuffer::clampedSize):
+        (WebCore::ImageBuffer::clampedRect):
+        * platform/graphics/ImageBuffer.h:
+        (WebCore::ImageBuffer::setSpaceSize): Move all the clamping helper methods
+        from SVGRenderingContext and RenderSVGResourceFilter to the ImageBuffer.
+
+        * platform/graphics/filters/FEColorMatrix.cpp:
+        (WebCore::FEColorMatrix::platformApplySoftware): Use logicalSize() of the
+        result image instead of using absolutePaintRect(). The later returns the
+        rectangle of the element without clamping.
+        
+        * platform/graphics/filters/FETile.cpp:
+        (WebCore::FETile::platformApplySoftware):
+        * rendering/svg/RenderSVGResourceClipper.cpp:
+        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
+        * rendering/svg/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::applyResource):
+        (WebCore::RenderSVGResourceFilter::fitsInMaximumImageSize): Deleted.
+        * rendering/svg/RenderSVGResourceFilter.h:
+        * rendering/svg/RenderSVGResourceGradient.cpp:
+        (WebCore::createMaskAndSwapContextForTextGradient):
+        (WebCore::clipToTextMask):
+        * rendering/svg/RenderSVGResourceMasker.cpp:
+        (WebCore::RenderSVGResourceMasker::applySVGMask):
+        * rendering/svg/RenderSVGResourcePattern.cpp:
+        (WebCore::RenderSVGResourcePattern::buildPattern):
+        (WebCore::RenderSVGResourcePattern::createTileImage): Make the modifications
+        which are needed because of moving the clamping helper methods to ImageBuffer
+        and because of changing the prototype of SVGRenderingContext methods.
+
+        * platform/graphics/filters/FilterEffect.cpp:
+        (WebCore::FilterEffect::drawingRegionOfInputImage): Consider the clamping
+        when mapping from absolute coordinates to the ImageBuffer coordinates.
+
+        (WebCore::FilterEffect::createImageBufferResult): Apply the same clamping
+        we do in SVGRenderingContext::createImageBuffer() when creating the 
+        FilterEffect result ImageBuffer.
+        
+        (WebCore::FilterEffect::apply):
+        (WebCore::FilterEffect::asUnmultipliedImage):
+        (WebCore::FilterEffect::asPremultipliedImage):
+        (WebCore::FilterEffect::copyUnmultipliedImage):
+        (WebCore::FilterEffect::copyPremultipliedImage):
+        (WebCore::FilterEffect::createUnmultipliedImageResult):
+        (WebCore::FilterEffect::createPremultipliedImageResult):
+        (WebCore::FilterEffect::maxFilterArea): Deleted.
+        (WebCore::FilterEffect::isFilterSizeValid): Deleted.
+        * platform/graphics/filters/FilterEffect.h: Use the new ImageBuffer clamping
+        helper methods and delete the local ones.
+
+        * platform/graphics/transforms/AffineTransform.cpp:
+        (WebCore::AffineTransform::scaleNonUniform):
+        (WebCore::AffineTransform::scale):
+        (WebCore::AffineTransform::translate):
+        * platform/graphics/transforms/AffineTransform.h: Add new scale and translate
+        overloads to AffineTransform.
+        
+        * rendering/FilterEffectRenderer.cpp:
+        (WebCore::FilterEffectRenderer::updateBackingStoreRect):
+        (WebCore::FilterEffectRendererHelper::beginFilterEffect): Code clean up.
+        
+        * rendering/svg/SVGRenderingContext.cpp:
+        (WebCore::SVGRenderingContext::calculateScreenFontSizeScalingFactor):
+        (WebCore::SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem):
+        Return the AffineTransform instead of passing it through the reference of
+        an argument.
+        
+        (WebCore::SVGRenderingContext::createImageBuffer):
+        (WebCore::SVGRenderingContext::createImageBufferForPattern): Deleted.
+        Code clean up and method rename.
+        
+        (WebCore::SVGRenderingContext::clampedAbsoluteTargetRect): Deleted.
+        (WebCore::SVGRenderingContext::clampedAbsoluteSize): Deleted.
+        * rendering/svg/SVGRenderingContext.h: Move the clamping helper methods to
+        the ImageBuffer class.
+    
</ins><span class="cx"> 2015-05-07  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         New force-related DOM events should fire in WK1 views
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsImageBuffercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -33,6 +33,56 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+static const float MaxClampedLength = 4096;
+static const float MaxClampedArea = MaxClampedLength * MaxClampedLength;
+
+bool ImageBuffer::isSizeClamped(const FloatSize&amp; size)
+{
+    if (size.width() &lt; 0 &amp;&amp; size.height() &lt; 0)
+        return false;
+
+    if (size.isEmpty())
+        return true;
+
+    return floorf(size.height()) * floorf(size.width()) &lt;= MaxClampedArea;
+}
+
+bool ImageBuffer::isSizeClamped(const FloatSize&amp; size, FloatSize&amp; scale)
+{
+    FloatSize scaledSize(size);
+    scaledSize.scale(scale.width(), scale.height());
+
+    if (isSizeClamped(scaledSize))
+        return true;
+
+    // The area of scaled size is bigger than the upper limit, adjust the scale to fit.
+    scale.scale(sqrtf(MaxClampedArea / (scaledSize.width() * scaledSize.height())));
+    ASSERT(isSizeClamped(size, scale));
+    return false;
+}
+
+FloatSize ImageBuffer::clampedSize(const FloatSize&amp; size)
+{
+    return size.shrunkTo(FloatSize(MaxClampedLength, MaxClampedLength));
+}
+
+FloatSize ImageBuffer::clampedSize(const FloatSize&amp; size, FloatSize&amp; scale)
+{
+    if (size.isEmpty())
+        return size;
+
+    FloatSize clampedSize = ImageBuffer::clampedSize(size);
+    scale = FloatSize(clampedSize.width() / size.width(), clampedSize.height() / size.height());
+    ASSERT(isSizeClamped(clampedSize));
+    ASSERT(isSizeClamped(size, scale));
+    return clampedSize;
+}
+
+FloatRect ImageBuffer::clampedRect(const FloatRect&amp; rect)
+{
+    return FloatRect(rect.location(), clampedSize(rect.size()));
+}
+
</ins><span class="cx"> #if !USE(CG)
</span><span class="cx"> void ImageBuffer::transformColorSpace(ColorSpace srcColorSpace, ColorSpace dstColorSpace)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsImageBufferh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.h (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ImageBuffer.h        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.h        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -123,11 +123,15 @@
</span><span class="cx">     bool copyToPlatformTexture(GraphicsContext3D&amp;, Platform3DObject, GC3Denum, bool, bool);
</span><span class="cx"> 
</span><span class="cx">     FloatSize spaceSize() const { return m_space; }
</span><del>-    void setSpaceSize(const FloatSize&amp; space)
-    {
-        m_space = space;
-    }
</del><ins>+    void setSpaceSize(const FloatSize&amp; space) { m_space = space; }
</ins><span class="cx"> 
</span><ins>+    // These functions are used when clamping the ImageBuffer which is created for filter, masker or clipper.
+    static bool isSizeClamped(const FloatSize&amp;);
+    static bool isSizeClamped(const FloatSize&amp;, FloatSize&amp; scale);
+    static FloatSize clampedSize(const FloatSize&amp;);
+    static FloatSize clampedSize(const FloatSize&amp;, FloatSize&amp; scale);
+    static FloatRect clampedRect(const FloatRect&amp;);
+
</ins><span class="cx"> private:
</span><span class="cx"> #if USE(CG)
</span><span class="cx">     // The returned image might be larger than the internalSize(). If you want the smaller
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFEColorMatrixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -149,7 +149,7 @@
</span><span class="cx"> 
</span><span class="cx">     resultImage-&gt;context()-&gt;drawImageBuffer(in-&gt;asImageBuffer(), ColorSpaceDeviceRGB, drawingRegionOfInputImage(in-&gt;absolutePaintRect()));
</span><span class="cx"> 
</span><del>-    IntRect imageRect(IntPoint(), absolutePaintRect().size());
</del><ins>+    IntRect imageRect(IntPoint(), resultImage-&gt;logicalSize());
</ins><span class="cx">     RefPtr&lt;Uint8ClampedArray&gt; pixelArray = resultImage-&gt;getUnmultipliedImageData(imageRect);
</span><span class="cx"> 
</span><span class="cx">     switch (m_type) {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFETilecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/FETile.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/FETile.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/filters/FETile.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -63,8 +63,8 @@
</span><span class="cx">         tileRect.scale(filter.filterResolution().width(), filter.filterResolution().height());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ImageBuffer&gt; tileImage;
-    if (!SVGRenderingContext::createImageBufferForPattern(tileRect, tileRect, tileImage, ColorSpaceDeviceRGB, filter().renderingMode()))
</del><ins>+    auto tileImage = SVGRenderingContext::createImageBuffer(tileRect, tileRect, ColorSpaceDeviceRGB, filter().renderingMode());
+    if (!tileImage)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     GraphicsContext* tileImageContext = tileImage-&gt;context();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFilterEffectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -36,8 +36,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static const float kMaxFilterArea = 4096 * 4096;
-
</del><span class="cx"> FilterEffect::FilterEffect(Filter&amp; filter)
</span><span class="cx">     : m_alphaImage(false)
</span><span class="cx">     , m_filter(filter)
</span><span class="lines">@@ -55,19 +53,6 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-float FilterEffect::maxFilterArea()
-{
-    return kMaxFilterArea;
-}
-
-bool FilterEffect::isFilterSizeValid(const FloatRect&amp; rect)
-{
-    if (rect.width() &lt; 0 || rect.height() &lt; 0
-        || (rect.height() * rect.width() &gt; kMaxFilterArea))
-        return false;
-    return true;
-}
-
</del><span class="cx"> void FilterEffect::determineAbsolutePaintRect()
</span><span class="cx"> {
</span><span class="cx">     m_absolutePaintRect = IntRect();
</span><span class="lines">@@ -93,8 +78,14 @@
</span><span class="cx"> 
</span><span class="cx"> FloatRect FilterEffect::drawingRegionOfInputImage(const IntRect&amp; srcRect) const
</span><span class="cx"> {
</span><del>-    return FloatRect(FloatPoint(srcRect.x() - m_absolutePaintRect.x(),
-                            srcRect.y() - m_absolutePaintRect.y()), srcRect.size());
</del><ins>+    ASSERT(hasResult());
+
+    FloatSize scale;
+    ImageBuffer::clampedSize(m_absolutePaintRect.size(), scale);
+
+    AffineTransform transform;
+    transform.scale(scale).translate(-m_absolutePaintRect.location());
+    return transform.mapRect(srcRect);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> FilterEffect* FilterEffect::inputEffect(unsigned number) const
</span><span class="lines">@@ -156,7 +147,7 @@
</span><span class="cx">     determineAbsolutePaintRect();
</span><span class="cx">     setResultColorSpace(m_operatingColorSpace);
</span><span class="cx"> 
</span><del>-    if (!isFilterSizeValid(m_absolutePaintRect))
</del><ins>+    if (m_absolutePaintRect.isEmpty() || !ImageBuffer::isSizeClamped(m_absolutePaintRect.size()))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (requiresValidPreMultipliedPixels()) {
</span><span class="lines">@@ -321,8 +312,8 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;Uint8ClampedArray&gt; FilterEffect::asUnmultipliedImage(const IntRect&amp; rect)
</span><span class="cx"> {
</span><del>-    ASSERT(isFilterSizeValid(rect));
</del><span class="cx">     IntSize scaledSize(rect.size());
</span><ins>+    ASSERT(ImageBuffer::isSizeClamped(scaledSize));
</ins><span class="cx">     scaledSize.scale(m_filter.filterScale());
</span><span class="cx">     RefPtr&lt;Uint8ClampedArray&gt; imageData = Uint8ClampedArray::createUninitialized(scaledSize.width() * scaledSize.height() * 4);
</span><span class="cx">     copyUnmultipliedImage(imageData.get(), rect);
</span><span class="lines">@@ -331,8 +322,8 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;Uint8ClampedArray&gt; FilterEffect::asPremultipliedImage(const IntRect&amp; rect)
</span><span class="cx"> {
</span><del>-    ASSERT(isFilterSizeValid(rect));
</del><span class="cx">     IntSize scaledSize(rect.size());
</span><ins>+    ASSERT(ImageBuffer::isSizeClamped(scaledSize));
</ins><span class="cx">     scaledSize.scale(m_filter.filterScale());
</span><span class="cx">     RefPtr&lt;Uint8ClampedArray&gt; imageData = Uint8ClampedArray::createUninitialized(scaledSize.width() * scaledSize.height() * 4);
</span><span class="cx">     copyPremultipliedImage(imageData.get(), rect);
</span><span class="lines">@@ -397,8 +388,8 @@
</span><span class="cx">         if (m_imageBufferResult)
</span><span class="cx">             m_unmultipliedImageResult = m_imageBufferResult-&gt;getUnmultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
</span><span class="cx">         else {
</span><del>-            ASSERT(isFilterSizeValid(m_absolutePaintRect));
</del><span class="cx">             IntSize inputSize(m_absolutePaintRect.size());
</span><ins>+            ASSERT(ImageBuffer::isSizeClamped(inputSize));
</ins><span class="cx">             inputSize.scale(m_filter.filterScale());
</span><span class="cx">             m_unmultipliedImageResult = Uint8ClampedArray::createUninitialized(inputSize.width() * inputSize.height() * 4);
</span><span class="cx">             unsigned char* sourceComponent = m_premultipliedImageResult-&gt;data();
</span><span class="lines">@@ -433,8 +424,8 @@
</span><span class="cx">         if (m_imageBufferResult)
</span><span class="cx">             m_premultipliedImageResult = m_imageBufferResult-&gt;getPremultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
</span><span class="cx">         else {
</span><del>-            ASSERT(isFilterSizeValid(m_absolutePaintRect));
</del><span class="cx">             IntSize inputSize(m_absolutePaintRect.size());
</span><ins>+            ASSERT(ImageBuffer::isSizeClamped(inputSize));
</ins><span class="cx">             inputSize.scale(m_filter.filterScale());
</span><span class="cx">             m_premultipliedImageResult = Uint8ClampedArray::createUninitialized(inputSize.width() * inputSize.height() * 4);
</span><span class="cx">             unsigned char* sourceComponent = m_unmultipliedImageResult-&gt;data();
</span><span class="lines">@@ -459,10 +450,13 @@
</span><span class="cx">     // Only one result type is allowed.
</span><span class="cx">     ASSERT(!hasResult());
</span><span class="cx">     if (m_absolutePaintRect.isEmpty())
</span><del>-        return 0;
-    m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), m_filter.filterScale(), m_resultColorSpace, m_filter.renderingMode());
</del><ins>+        return nullptr;
+
+    FloatSize clampedSize = ImageBuffer::clampedSize(m_absolutePaintRect.size());
+    m_imageBufferResult = ImageBuffer::create(clampedSize, m_filter.filterScale(), m_resultColorSpace, m_filter.renderingMode());
</ins><span class="cx">     if (!m_imageBufferResult)
</span><del>-        return 0;
</del><ins>+        return nullptr;
+
</ins><span class="cx">     ASSERT(m_imageBufferResult-&gt;context());
</span><span class="cx">     return m_imageBufferResult.get();
</span><span class="cx"> }
</span><span class="lines">@@ -471,11 +465,11 @@
</span><span class="cx"> {
</span><span class="cx">     // Only one result type is allowed.
</span><span class="cx">     ASSERT(!hasResult());
</span><del>-    ASSERT(isFilterSizeValid(m_absolutePaintRect));
-
</del><span class="cx">     if (m_absolutePaintRect.isEmpty())
</span><del>-        return 0;
</del><ins>+        return nullptr;
+
</ins><span class="cx">     IntSize resultSize(m_absolutePaintRect.size());
</span><ins>+    ASSERT(ImageBuffer::isSizeClamped(resultSize));
</ins><span class="cx">     resultSize.scale(m_filter.filterScale());
</span><span class="cx">     m_unmultipliedImageResult = Uint8ClampedArray::createUninitialized(resultSize.width() * resultSize.height() * 4);
</span><span class="cx">     return m_unmultipliedImageResult.get();
</span><span class="lines">@@ -485,11 +479,11 @@
</span><span class="cx"> {
</span><span class="cx">     // Only one result type is allowed.
</span><span class="cx">     ASSERT(!hasResult());
</span><del>-    ASSERT(isFilterSizeValid(m_absolutePaintRect));
-
</del><span class="cx">     if (m_absolutePaintRect.isEmpty())
</span><del>-        return 0;
</del><ins>+        return nullptr;
+
</ins><span class="cx">     IntSize resultSize(m_absolutePaintRect.size());
</span><ins>+    ASSERT(ImageBuffer::isSizeClamped(resultSize));
</ins><span class="cx">     resultSize.scale(m_filter.filterScale());
</span><span class="cx">     m_premultipliedImageResult = Uint8ClampedArray::createUninitialized(resultSize.width() * resultSize.height() * 4);
</span><span class="cx">     return m_premultipliedImageResult.get();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsfiltersFilterEffecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -58,9 +58,6 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~FilterEffect();
</span><span class="cx"> 
</span><del>-    static bool isFilterSizeValid(const FloatRect&amp;);
-    static float maxFilterArea();
-
</del><span class="cx">     void clearResult();
</span><span class="cx">     void clearResultsRecursive();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsAffineTransformcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -172,6 +172,16 @@
</span><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+AffineTransform&amp; AffineTransform::scaleNonUniform(double sx, double sy)
+{
+    return scale(sx, sy);
+}
+
+AffineTransform&amp; AffineTransform::scale(const FloatSize&amp; s)
+{
+    return scale(s.width(), s.height());
+}
+
</ins><span class="cx"> // *this = *this * translation
</span><span class="cx"> AffineTransform&amp; AffineTransform::translate(double tx, double ty)
</span><span class="cx"> {
</span><span class="lines">@@ -186,9 +196,9 @@
</span><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-AffineTransform&amp; AffineTransform::scaleNonUniform(double sx, double sy)
</del><ins>+AffineTransform&amp; AffineTransform::translate(const FloatPoint&amp; t)
</ins><span class="cx"> {
</span><del>-    return scale(sx, sy);
</del><ins>+    return translate(t.x(), t.y());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AffineTransform&amp; AffineTransform::rotateFromVector(double x, double y)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsAffineTransformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/platform/graphics/transforms/AffineTransform.h        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -98,9 +98,11 @@
</span><span class="cx">     WEBCORE_EXPORT AffineTransform&amp; scale(double);
</span><span class="cx">     AffineTransform&amp; scale(double sx, double sy); 
</span><span class="cx">     AffineTransform&amp; scaleNonUniform(double sx, double sy);
</span><ins>+    AffineTransform&amp; scale(const FloatSize&amp;);
</ins><span class="cx">     AffineTransform&amp; rotate(double d);
</span><span class="cx">     AffineTransform&amp; rotateFromVector(double x, double y);
</span><span class="cx">     WEBCORE_EXPORT AffineTransform&amp; translate(double tx, double ty);
</span><ins>+    AffineTransform&amp; translate(const FloatPoint&amp;);
</ins><span class="cx">     AffineTransform&amp; shear(double sx, double sy);
</span><span class="cx">     AffineTransform&amp; flipX();
</span><span class="cx">     WEBCORE_EXPORT AffineTransform&amp; flipY();
</span><span class="lines">@@ -172,7 +174,7 @@
</span><span class="cx">     {
</span><span class="cx">         return AffineTransform(1, 0, 0, 1, x, y);
</span><span class="cx">     }
</span><del>-    
</del><ins>+
</ins><span class="cx">     // decompose the matrix into its component parts
</span><span class="cx">     typedef struct {
</span><span class="cx">         double scaleX, scaleY;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingFilterEffectRenderercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -305,14 +305,14 @@
</span><span class="cx"> 
</span><span class="cx"> bool FilterEffectRenderer::updateBackingStoreRect(const FloatRect&amp; filterRect)
</span><span class="cx"> {
</span><del>-    if (!filterRect.isZero() &amp;&amp; FilterEffect::isFilterSizeValid(filterRect)) {
-        FloatRect currentSourceRect = sourceImageRect();
-        if (filterRect != currentSourceRect) {
-            setSourceImageRect(filterRect);
-            return true;
-        }
-    }
-    return false;
</del><ins>+    if (filterRect.isEmpty() || !ImageBuffer::isSizeClamped(filterRect.size()))
+        return false;
+
+    if (filterRect == sourceImageRect())
+        return false;
+
+    setSourceImageRect(filterRect);
+    return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FilterEffectRenderer::allocateBackingStoreIfNeeded()
</span><span class="lines">@@ -401,7 +401,7 @@
</span><span class="cx">     filter-&gt;allocateBackingStoreIfNeeded();
</span><span class="cx">     // Paint into the context that represents the SourceGraphic of the filter.
</span><span class="cx">     GraphicsContext* sourceGraphicsContext = filter-&gt;inputContext();
</span><del>-    if (!sourceGraphicsContext || !FilterEffect::isFilterSizeValid(filter-&gt;filterRegion())) {
</del><ins>+    if (!sourceGraphicsContext || filter-&gt;filterRegion().isEmpty() || !ImageBuffer::isSizeClamped(filter-&gt;filterRegion().size())) {
</ins><span class="cx">         // Disable the filters and continue.
</span><span class="cx">         m_haveFilterEffect = false;
</span><span class="cx">         return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceClippercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -138,11 +138,11 @@
</span><span class="cx">     if (shouldCreateClipperMaskImage &amp;&amp; pathOnlyClipping(context, animatedLocalTransform, objectBoundingBox))
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><del>-    AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer, absoluteTransform);
</del><ins>+    AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer);
</ins><span class="cx"> 
</span><span class="cx">     if (shouldCreateClipperMaskImage &amp;&amp; !repaintRect.isEmpty()) {
</span><del>-        if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, clipperMaskImage, ColorSpaceDeviceRGB, Unaccelerated))
</del><ins>+        clipperMaskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceDeviceRGB, Unaccelerated);
+        if (!clipperMaskImage)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         GraphicsContext* maskContext = clipperMaskImage-&gt;context();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceFiltercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -96,21 +96,6 @@
</span><span class="cx">     return builder;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderSVGResourceFilter::fitsInMaximumImageSize(const FloatSize&amp; size, FloatSize&amp; scale)
-{
-    FloatSize scaledSize(size);
-    scaledSize.scale(scale.width(), scale.height());
-    float scaledArea = scaledSize.width() * scaledSize.height();
-
-    if (scaledArea &lt;= FilterEffect::maxFilterArea())
-        return true;
-
-    // If area of scaled size is bigger than the upper limit, adjust the scale
-    // to fit.
-    scale.scale(sqrt(FilterEffect::maxFilterArea() / scaledArea));
-    return false;
-}
-
</del><span class="cx"> bool RenderSVGResourceFilter::applyResource(RenderElement&amp; renderer, const RenderStyle&amp;, GraphicsContext*&amp; context, unsigned short resourceMode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(context);
</span><span class="lines">@@ -131,8 +116,7 @@
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     // Determine absolute transformation matrix for filter. 
</span><del>-    AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer, absoluteTransform);
</del><ins>+    AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer);
</ins><span class="cx">     if (!absoluteTransform.isInvertible())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="lines">@@ -167,8 +151,8 @@
</span><span class="cx"> 
</span><span class="cx">     // Determine scale factor for filter. The size of intermediate ImageBuffers shouldn't be bigger than kMaxFilterSize.
</span><span class="cx">     FloatRect tempSourceRect = absoluteDrawingRegion;
</span><ins>+    ImageBuffer::isSizeClamped(tempSourceRect.size(), scale);
</ins><span class="cx">     tempSourceRect.scale(scale.width(), scale.height());
</span><del>-    fitsInMaximumImageSize(tempSourceRect.size(), scale);
</del><span class="cx"> 
</span><span class="cx">     // Set the scale level in SVGFilter.
</span><span class="cx">     filterData-&gt;filter-&gt;setFilterResolution(scale);
</span><span class="lines">@@ -182,7 +166,7 @@
</span><span class="cx">     FloatRect subRegion = lastEffect-&gt;maxEffectRect();
</span><span class="cx">     // At least one FilterEffect has a too big image size,
</span><span class="cx">     // recalculate the effect sizes with new scale factors.
</span><del>-    if (!fitsInMaximumImageSize(subRegion.size(), scale)) {
</del><ins>+    if (!ImageBuffer::isSizeClamped(subRegion.size(), scale)) {
</ins><span class="cx">         filterData-&gt;filter-&gt;setFilterResolution(scale);
</span><span class="cx">         RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(*lastEffect);
</span><span class="cx">     }
</span><span class="lines">@@ -201,9 +185,10 @@
</span><span class="cx">     effectiveTransform.scale(scale.width(), scale.height());
</span><span class="cx">     effectiveTransform.multiply(filterData-&gt;shearFreeAbsoluteTransform);
</span><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ImageBuffer&gt; sourceGraphic;
</del><span class="cx">     RenderingMode renderingMode = renderer.frame().settings().acceleratedFiltersEnabled() ? Accelerated : Unaccelerated;
</span><del>-    if (!SVGRenderingContext::createImageBuffer(filterData-&gt;drawingRegion, effectiveTransform, sourceGraphic, ColorSpaceLinearRGB, renderingMode)) {
</del><ins>+
+    auto sourceGraphic = SVGRenderingContext::createImageBuffer(filterData-&gt;drawingRegion, effectiveTransform, ColorSpaceLinearRGB, renderingMode);
+    if (!sourceGraphic) {
</ins><span class="cx">         ASSERT(!m_filter.contains(&amp;renderer));
</span><span class="cx">         filterData-&gt;savedContext = context;
</span><span class="cx">         m_filter.set(&amp;renderer, WTF::move(filterData));
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceFilterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -91,8 +91,6 @@
</span><span class="cx">     virtual const char* renderName() const override { return &quot;RenderSVGResourceFilter&quot;; }
</span><span class="cx">     virtual bool isSVGResourceFilter() const override { return true; }
</span><span class="cx"> 
</span><del>-    bool fitsInMaximumImageSize(const FloatSize&amp;, FloatSize&amp;);
-
</del><span class="cx">     HashMap&lt;RenderObject*, std::unique_ptr&lt;FilterData&gt;&gt; m_filter;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceGradientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -58,12 +58,11 @@
</span><span class="cx">     auto* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(*object);
</span><span class="cx">     ASSERT(textRootBlock);
</span><span class="cx"> 
</span><del>-    AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock, absoluteTransform);
-
</del><ins>+    AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock);
</ins><span class="cx">     FloatRect repaintRect = textRootBlock-&gt;repaintRectInLocalCoordinates();
</span><del>-    std::unique_ptr&lt;ImageBuffer&gt; maskImage;
-    if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskImage, ColorSpaceDeviceRGB, Unaccelerated))
</del><ins>+
+    auto maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, ColorSpaceDeviceRGB, Unaccelerated);
+    if (!maskImage)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     GraphicsContext* maskImageContext = maskImage-&gt;context();
</span><span class="lines">@@ -80,10 +79,10 @@
</span><span class="cx">     auto* textRootBlock = RenderSVGText::locateRenderSVGTextAncestor(*object);
</span><span class="cx">     ASSERT(textRootBlock);
</span><span class="cx"> 
</span><del>-    AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock, absoluteTransform);
</del><ins>+    AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(*textRootBlock);
</ins><span class="cx"> 
</span><span class="cx">     targetRect = textRootBlock-&gt;repaintRectInLocalCoordinates();
</span><ins>+
</ins><span class="cx">     SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, targetRect, imageBuffer, false);
</span><span class="cx"> 
</span><span class="cx">     AffineTransform matrix;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourceMaskercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -63,16 +63,14 @@
</span><span class="cx">         m_masker.set(&amp;renderer, std::make_unique&lt;MaskerData&gt;());
</span><span class="cx"> 
</span><span class="cx">     MaskerData* maskerData = m_masker.get(&amp;renderer);
</span><del>-
-    AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer, absoluteTransform);
-
</del><ins>+    AffineTransform absoluteTransform = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer);
</ins><span class="cx">     FloatRect repaintRect = renderer.repaintRectInLocalCoordinates();
</span><span class="cx"> 
</span><span class="cx">     if (!maskerData-&gt;maskImage &amp;&amp; !repaintRect.isEmpty()) {
</span><span class="cx">         const SVGRenderStyle&amp; svgStyle = style().svgStyle();
</span><span class="cx">         ColorSpace colorSpace = svgStyle.colorInterpolation() == CI_LINEARRGB ? ColorSpaceLinearRGB : ColorSpaceDeviceRGB;
</span><del>-        if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, maskerData-&gt;maskImage, colorSpace, Unaccelerated))
</del><ins>+        maskerData-&gt;maskImage = SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, colorSpace, Unaccelerated);
+        if (!maskerData-&gt;maskImage)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         if (!drawContentIntoMaskImage(maskerData, colorSpace, &amp;renderer))
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgRenderSVGResourcePatterncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -70,20 +70,19 @@
</span><span class="cx"> 
</span><span class="cx">     // If we couldn't determine the pattern content element root, stop here.
</span><span class="cx">     if (!m_attributes.patternContentElement())
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     // An empty viewBox disables rendering.
</span><span class="cx">     if (m_attributes.hasViewBox() &amp;&amp; m_attributes.viewBox().isEmpty())
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     // Compute all necessary transformations to build the tile image &amp; the pattern.
</span><span class="cx">     FloatRect tileBoundaries;
</span><span class="cx">     AffineTransform tileImageTransform;
</span><span class="cx">     if (!buildTileImageTransform(renderer, m_attributes, patternElement(), tileBoundaries, tileImageTransform))
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><del>-    AffineTransform absoluteTransformIgnoringRotation;
-    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer, absoluteTransformIgnoringRotation);
</del><ins>+    AffineTransform absoluteTransformIgnoringRotation = SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(renderer);
</ins><span class="cx"> 
</span><span class="cx">     // Ignore 2D rotation, as it doesn't affect the size of the tile.
</span><span class="cx">     SVGRenderingContext::clear2DRotation(absoluteTransformIgnoringRotation);
</span><span class="lines">@@ -95,13 +94,13 @@
</span><span class="cx">         static_cast&lt;float&gt;(m_attributes.patternTransform().yScale()));
</span><span class="cx"> 
</span><span class="cx">     // Build tile image.
</span><del>-    std::unique_ptr&lt;ImageBuffer&gt; tileImage = createTileImage(m_attributes, tileBoundaries, absoluteTileBoundaries, tileImageTransform, clampedAbsoluteTileBoundaries);
</del><ins>+    auto tileImage = createTileImage(m_attributes, tileBoundaries, absoluteTileBoundaries, tileImageTransform, clampedAbsoluteTileBoundaries);
</ins><span class="cx">     if (!tileImage)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Image&gt; copiedImage = tileImage-&gt;copyImage(CopyBackingStore);
</span><span class="cx">     if (!copiedImage)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><span class="cx">     // Build pattern.
</span><span class="cx">     auto patternData = std::make_unique&lt;PatternData&gt;();
</span><span class="lines">@@ -233,11 +232,9 @@
</span><span class="cx"> 
</span><span class="cx"> std::unique_ptr&lt;ImageBuffer&gt; RenderSVGResourcePattern::createTileImage(const PatternAttributes&amp; attributes, const FloatRect&amp; tileBoundaries, const FloatRect&amp; absoluteTileBoundaries, const AffineTransform&amp; tileImageTransform, FloatRect&amp; clampedAbsoluteTileBoundaries) const
</span><span class="cx"> {
</span><del>-    clampedAbsoluteTileBoundaries = SVGRenderingContext::clampedAbsoluteTargetRect(absoluteTileBoundaries);
-
-    std::unique_ptr&lt;ImageBuffer&gt; tileImage;
-
-    if (!SVGRenderingContext::createImageBufferForPattern(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, tileImage, ColorSpaceDeviceRGB, Unaccelerated))
</del><ins>+    clampedAbsoluteTileBoundaries = ImageBuffer::clampedRect(absoluteTileBoundaries);
+    auto tileImage = SVGRenderingContext::createImageBuffer(absoluteTileBoundaries, clampedAbsoluteTileBoundaries, ColorSpaceDeviceRGB, Unaccelerated);
+    if (!tileImage)
</ins><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     GraphicsContext* tileImageContext = tileImage-&gt;context();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGRenderingContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -39,8 +39,6 @@
</span><span class="cx"> #include &quot;SVGResources.h&quot;
</span><span class="cx"> #include &quot;SVGResourcesCache.h&quot;
</span><span class="cx"> 
</span><del>-static int kMaxImageBufferSize = 4096;
-
</del><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> static inline bool isRenderingMaskImage(const RenderObject&amp; object)
</span><span class="lines">@@ -204,14 +202,13 @@
</span><span class="cx"> 
</span><span class="cx"> float SVGRenderingContext::calculateScreenFontSizeScalingFactor(const RenderObject&amp; renderer)
</span><span class="cx"> {
</span><del>-    AffineTransform ctm;
-    calculateTransformationToOutermostCoordinateSystem(renderer, ctm);
</del><ins>+    AffineTransform ctm = calculateTransformationToOutermostCoordinateSystem(renderer);
</ins><span class="cx">     return narrowPrecisionToFloat(sqrt((pow(ctm.xScale(), 2) + pow(ctm.yScale(), 2)) / 2));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(const RenderObject&amp; renderer, AffineTransform&amp; absoluteTransform)
</del><ins>+AffineTransform SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(const RenderObject&amp; renderer)
</ins><span class="cx"> {
</span><del>-    absoluteTransform = currentContentTransformation();
</del><ins>+    AffineTransform absoluteTransform = currentContentTransformation();
</ins><span class="cx"> 
</span><span class="cx">     float deviceScaleFactor = renderer.document().deviceScaleFactor();
</span><span class="cx">     // Walk up the render tree, accumulating SVG transforms.
</span><span class="lines">@@ -237,53 +234,53 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     absoluteTransform.scale(deviceScaleFactor);
</span><ins>+    return absoluteTransform;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SVGRenderingContext::createImageBuffer(const FloatRect&amp; targetRect, const AffineTransform&amp; absoluteTransform, std::unique_ptr&lt;ImageBuffer&gt;&amp; imageBuffer, ColorSpace colorSpace, RenderingMode renderingMode)
</del><ins>+std::unique_ptr&lt;ImageBuffer&gt; SVGRenderingContext::createImageBuffer(const FloatRect&amp; targetRect, const AffineTransform&amp; absoluteTransform, ColorSpace colorSpace, RenderingMode renderingMode)
</ins><span class="cx"> {
</span><span class="cx">     IntRect paintRect = calculateImageBufferRect(targetRect, absoluteTransform);
</span><span class="cx">     // Don't create empty ImageBuffers.
</span><span class="cx">     if (paintRect.isEmpty())
</span><del>-        return false;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><del>-    IntSize clampedSize = clampedAbsoluteSize(paintRect.size());
-    std::unique_ptr&lt;ImageBuffer&gt; image = ImageBuffer::create(clampedSize, 1, colorSpace, renderingMode);
-    if (!image)
-        return false;
</del><ins>+    FloatSize scale;
+    FloatSize clampedSize = ImageBuffer::clampedSize(paintRect.size(), scale);
</ins><span class="cx"> 
</span><del>-    GraphicsContext* imageContext = image-&gt;context();
-    ASSERT(imageContext);
</del><ins>+    auto imageBuffer = ImageBuffer::create(clampedSize, 1, colorSpace, renderingMode);
+    if (!imageBuffer)
+        return nullptr;
</ins><span class="cx"> 
</span><del>-    imageContext-&gt;scale(FloatSize(static_cast&lt;float&gt;(clampedSize.width()) / paintRect.width(),
-                                  static_cast&lt;float&gt;(clampedSize.height()) / paintRect.height()));
-    imageContext-&gt;translate(-paintRect.x(), -paintRect.y());
-    imageContext-&gt;concatCTM(absoluteTransform);
</del><ins>+    AffineTransform transform;
+    transform.scale(scale).translate(-paintRect.location()).multiply(absoluteTransform);
</ins><span class="cx"> 
</span><del>-    imageBuffer = WTF::move(image);
-    return true;
</del><ins>+    GraphicsContext* imageContext = imageBuffer-&gt;context();
+    ASSERT(imageContext);
+    imageContext-&gt;concatCTM(transform);
+
+    return imageBuffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SVGRenderingContext::createImageBufferForPattern(const FloatRect&amp; absoluteTargetRect, const FloatRect&amp; clampedAbsoluteTargetRect, std::unique_ptr&lt;ImageBuffer&gt;&amp; imageBuffer, ColorSpace colorSpace, RenderingMode renderingMode)
</del><ins>+std::unique_ptr&lt;ImageBuffer&gt; SVGRenderingContext::createImageBuffer(const FloatRect&amp; targetRect, const FloatRect&amp; clampedRect, ColorSpace colorSpace, RenderingMode renderingMode)
</ins><span class="cx"> {
</span><del>-    IntSize imageSize(roundedIntSize(clampedAbsoluteTargetRect.size()));
-    IntSize unclampedImageSize(roundedIntSize(absoluteTargetRect.size()));
</del><ins>+    IntSize clampedSize = roundedIntSize(clampedRect.size());
+    IntSize unclampedSize = roundedIntSize(targetRect.size());
</ins><span class="cx"> 
</span><span class="cx">     // Don't create empty ImageBuffers.
</span><del>-    if (imageSize.isEmpty())
-        return false;
</del><ins>+    if (clampedSize.isEmpty())
+        return nullptr;
</ins><span class="cx"> 
</span><del>-    std::unique_ptr&lt;ImageBuffer&gt; image = ImageBuffer::create(imageSize, 1, colorSpace, renderingMode);
-    if (!image)
-        return false;
</del><ins>+    auto imageBuffer = ImageBuffer::create(clampedSize, 1, colorSpace, renderingMode);
+    if (!imageBuffer)
+        return nullptr;
</ins><span class="cx"> 
</span><del>-    GraphicsContext* imageContext = image-&gt;context();
</del><ins>+    GraphicsContext* imageContext = imageBuffer-&gt;context();
</ins><span class="cx">     ASSERT(imageContext);
</span><span class="cx"> 
</span><span class="cx">     // Compensate rounding effects, as the absolute target rect is using floating-point numbers and the image buffer size is integer.
</span><del>-    imageContext-&gt;scale(FloatSize(unclampedImageSize.width() / absoluteTargetRect.width(), unclampedImageSize.height() / absoluteTargetRect.height()));
</del><ins>+    imageContext-&gt;scale(FloatSize(unclampedSize.width() / targetRect.width(), unclampedSize.height() / targetRect.height()));
</ins><span class="cx"> 
</span><del>-    imageBuffer = WTF::move(image);
-    return true;
</del><ins>+    return imageBuffer;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGRenderingContext::renderSubtreeToImageBuffer(ImageBuffer* image, RenderElement&amp; item, const AffineTransform&amp; subtreeContentTransformation)
</span><span class="lines">@@ -322,18 +319,6 @@
</span><span class="cx">         imageBuffer.reset();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FloatRect SVGRenderingContext::clampedAbsoluteTargetRect(const FloatRect&amp; absoluteTargetRect)
-{
-    const FloatSize maxImageBufferSize(kMaxImageBufferSize, kMaxImageBufferSize);
-    return FloatRect(absoluteTargetRect.location(), absoluteTargetRect.size().shrunkTo(maxImageBufferSize));
-}
-
-IntSize SVGRenderingContext::clampedAbsoluteSize(const IntSize&amp; absoluteSize)
-{
-    const IntSize maxImageBufferSize(kMaxImageBufferSize, kMaxImageBufferSize);
-    return absoluteSize.shrunkTo(maxImageBufferSize);
-}
-
</del><span class="cx"> void SVGRenderingContext::clear2DRotation(AffineTransform&amp; transform)
</span><span class="cx"> {
</span><span class="cx">     AffineTransform::DecomposedType decomposition;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGRenderingContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h (183955 => 183956)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h        2015-05-07 22:35:56 UTC (rev 183955)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h        2015-05-07 22:46:43 UTC (rev 183956)
</span><span class="lines">@@ -71,17 +71,14 @@
</span><span class="cx">     void prepareToRenderSVGContent(RenderElement&amp;, PaintInfo&amp;, NeedsGraphicsContextSave = DontSaveGraphicsContext);
</span><span class="cx">     bool isRenderingPrepared() const { return m_renderingFlags &amp; RenderingPrepared; }
</span><span class="cx"> 
</span><del>-    static bool createImageBuffer(const FloatRect&amp; paintRect, const AffineTransform&amp; absoluteTransform, std::unique_ptr&lt;ImageBuffer&gt;&amp;, ColorSpace, RenderingMode);
-    // Patterns need a different float-to-integer coordinate mapping.
-    static bool createImageBufferForPattern(const FloatRect&amp; absoluteTargetRect, const FloatRect&amp; clampedAbsoluteTargetRect, std::unique_ptr&lt;ImageBuffer&gt;&amp;, ColorSpace, RenderingMode);
</del><ins>+    static std::unique_ptr&lt;ImageBuffer&gt; createImageBuffer(const FloatRect&amp; targetRect, const AffineTransform&amp; absoluteTransform, ColorSpace, RenderingMode);
+    static std::unique_ptr&lt;ImageBuffer&gt; createImageBuffer(const FloatRect&amp; targetRect, const FloatRect&amp; clampedRect, ColorSpace, RenderingMode);
</ins><span class="cx"> 
</span><span class="cx">     static void renderSubtreeToImageBuffer(ImageBuffer*, RenderElement&amp;, const AffineTransform&amp;);
</span><span class="cx">     static void clipToImageBuffer(GraphicsContext*, const AffineTransform&amp; absoluteTransform, const FloatRect&amp; targetRect, std::unique_ptr&lt;ImageBuffer&gt;&amp;, bool safeToClear);
</span><span class="cx"> 
</span><span class="cx">     static float calculateScreenFontSizeScalingFactor(const RenderObject&amp;);
</span><del>-    static void calculateTransformationToOutermostCoordinateSystem(const RenderObject&amp;, AffineTransform&amp; absoluteTransform);
-    static IntSize clampedAbsoluteSize(const IntSize&amp;);
-    static FloatRect clampedAbsoluteTargetRect(const FloatRect&amp; absoluteTargetRect);
</del><ins>+    static AffineTransform calculateTransformationToOutermostCoordinateSystem(const RenderObject&amp;);
</ins><span class="cx">     static void clear2DRotation(AffineTransform&amp;);
</span><span class="cx"> 
</span><span class="cx">     static IntRect calculateImageBufferRect(const FloatRect&amp; targetRect, const AffineTransform&amp; absoluteTransform)
</span></span></pre>
</div>
</div>

</body>
</html>