Title: [183960] trunk/Source/WebCore
Revision
183960
Author
s...@apple.com
Date
2015-05-07 16:32:45 -0700 (Thu, 07 May 2015)

Log Message

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 Daniel Bates.

Address comments raised by Darin Adler in review.

* platform/graphics/ImageBuffer.cpp:
(WebCore::ImageBuffer::sizeNeedsClamping):
(WebCore::ImageBuffer::clampedSize):
(WebCore::ImageBuffer::isSizeClamped): Deleted.
* platform/graphics/ImageBuffer.h:
The condition for the negative width/height in isSizeClamped() was wrong. Use
FloatSize::isEmpty() instead and rename the function to sizeNeedsClamping().
The new function should return the opposite of the old function return value.
        
* platform/graphics/filters/FilterEffect.cpp:
(WebCore::FilterEffect::apply):
(WebCore::FilterEffect::asUnmultipliedImage):
(WebCore::FilterEffect::asPremultipliedImage):
(WebCore::FilterEffect::copyUnmultipliedImage):
(WebCore::FilterEffect::copyPremultipliedImage):
(WebCore::FilterEffect::createUnmultipliedImageResult):
(WebCore::FilterEffect::createPremultipliedImageResult):
* rendering/FilterEffectRenderer.cpp:
(WebCore::FilterEffectRenderer::updateBackingStoreRect):
(WebCore::FilterEffectRendererHelper::beginFilterEffect):
* rendering/svg/RenderSVGResourceFilter.cpp:
(WebCore::RenderSVGResourceFilter::applyResource):
Call the new function and negate the condition for the return value.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (183959 => 183960)


--- trunk/Source/WebCore/ChangeLog	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/ChangeLog	2015-05-07 23:32:45 UTC (rev 183960)
@@ -1,3 +1,36 @@
+2015-05-07  Said Abou-Hallawa  <sabouhall...@apple.com>
+
+        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 Daniel Bates.
+
+        Address comments raised by Darin Adler in review.
+
+        * platform/graphics/ImageBuffer.cpp:
+        (WebCore::ImageBuffer::sizeNeedsClamping):
+        (WebCore::ImageBuffer::clampedSize):
+        (WebCore::ImageBuffer::isSizeClamped): Deleted.
+        * platform/graphics/ImageBuffer.h:
+        The condition for the negative width/height in isSizeClamped() was wrong. Use
+        FloatSize::isEmpty() instead and rename the function to sizeNeedsClamping().
+        The new function should return the opposite of the old function return value.
+        
+        * platform/graphics/filters/FilterEffect.cpp:
+        (WebCore::FilterEffect::apply):
+        (WebCore::FilterEffect::asUnmultipliedImage):
+        (WebCore::FilterEffect::asPremultipliedImage):
+        (WebCore::FilterEffect::copyUnmultipliedImage):
+        (WebCore::FilterEffect::copyPremultipliedImage):
+        (WebCore::FilterEffect::createUnmultipliedImageResult):
+        (WebCore::FilterEffect::createPremultipliedImageResult):
+        * rendering/FilterEffectRenderer.cpp:
+        (WebCore::FilterEffectRenderer::updateBackingStoreRect):
+        (WebCore::FilterEffectRendererHelper::beginFilterEffect):
+        * rendering/svg/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::applyResource):
+        Call the new function and negate the condition for the return value.
+
 2015-05-07  Anders Carlsson  <ander...@apple.com>
 
         Build fix.

Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp (183959 => 183960)


--- trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp	2015-05-07 23:32:45 UTC (rev 183960)
@@ -36,29 +36,26 @@
 static const float MaxClampedLength = 4096;
 static const float MaxClampedArea = MaxClampedLength * MaxClampedLength;
 
-bool ImageBuffer::isSizeClamped(const FloatSize& size)
+bool ImageBuffer::sizeNeedsClamping(const FloatSize& size)
 {
-    if (size.width() < 0 && size.height() < 0)
+    if (size.isEmpty())
         return false;
 
-    if (size.isEmpty())
-        return true;
-
-    return floorf(size.height()) * floorf(size.width()) <= MaxClampedArea;
+    return floorf(size.height()) * floorf(size.width()) > MaxClampedArea;
 }
 
-bool ImageBuffer::isSizeClamped(const FloatSize& size, FloatSize& scale)
+bool ImageBuffer::sizeNeedsClamping(const FloatSize& size, FloatSize& scale)
 {
     FloatSize scaledSize(size);
     scaledSize.scale(scale.width(), scale.height());
 
-    if (isSizeClamped(scaledSize))
-        return true;
+    if (!sizeNeedsClamping(scaledSize))
+        return false;
 
     // 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;
+    ASSERT(!sizeNeedsClamping(size, scale));
+    return true;
 }
 
 FloatSize ImageBuffer::clampedSize(const FloatSize& size)
@@ -73,8 +70,8 @@
 
     FloatSize clampedSize = ImageBuffer::clampedSize(size);
     scale = FloatSize(clampedSize.width() / size.width(), clampedSize.height() / size.height());
-    ASSERT(isSizeClamped(clampedSize));
-    ASSERT(isSizeClamped(size, scale));
+    ASSERT(!sizeNeedsClamping(clampedSize));
+    ASSERT(!sizeNeedsClamping(size, scale));
     return clampedSize;
 }
 

Modified: trunk/Source/WebCore/platform/graphics/ImageBuffer.h (183959 => 183960)


--- trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/platform/graphics/ImageBuffer.h	2015-05-07 23:32:45 UTC (rev 183960)
@@ -126,8 +126,8 @@
     void setSpaceSize(const FloatSize& space) { m_space = space; }
 
     // These functions are used when clamping the ImageBuffer which is created for filter, masker or clipper.
-    static bool isSizeClamped(const FloatSize&);
-    static bool isSizeClamped(const FloatSize&, FloatSize& scale);
+    static bool sizeNeedsClamping(const FloatSize&);
+    static bool sizeNeedsClamping(const FloatSize&, FloatSize& scale);
     static FloatSize clampedSize(const FloatSize&);
     static FloatSize clampedSize(const FloatSize&, FloatSize& scale);
     static FloatRect clampedRect(const FloatRect&);

Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp (183959 => 183960)


--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp	2015-05-07 23:32:45 UTC (rev 183960)
@@ -147,7 +147,7 @@
     determineAbsolutePaintRect();
     setResultColorSpace(m_operatingColorSpace);
 
-    if (m_absolutePaintRect.isEmpty() || !ImageBuffer::isSizeClamped(m_absolutePaintRect.size()))
+    if (m_absolutePaintRect.isEmpty() || ImageBuffer::sizeNeedsClamping(m_absolutePaintRect.size()))
         return;
 
     if (requiresValidPreMultipliedPixels()) {
@@ -313,7 +313,7 @@
 PassRefPtr<Uint8ClampedArray> FilterEffect::asUnmultipliedImage(const IntRect& rect)
 {
     IntSize scaledSize(rect.size());
-    ASSERT(ImageBuffer::isSizeClamped(scaledSize));
+    ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize));
     scaledSize.scale(m_filter.filterScale());
     RefPtr<Uint8ClampedArray> imageData = Uint8ClampedArray::createUninitialized(scaledSize.width() * scaledSize.height() * 4);
     copyUnmultipliedImage(imageData.get(), rect);
@@ -323,7 +323,7 @@
 PassRefPtr<Uint8ClampedArray> FilterEffect::asPremultipliedImage(const IntRect& rect)
 {
     IntSize scaledSize(rect.size());
-    ASSERT(ImageBuffer::isSizeClamped(scaledSize));
+    ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize));
     scaledSize.scale(m_filter.filterScale());
     RefPtr<Uint8ClampedArray> imageData = Uint8ClampedArray::createUninitialized(scaledSize.width() * scaledSize.height() * 4);
     copyPremultipliedImage(imageData.get(), rect);
@@ -389,7 +389,7 @@
             m_unmultipliedImageResult = m_imageBufferResult->getUnmultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
         else {
             IntSize inputSize(m_absolutePaintRect.size());
-            ASSERT(ImageBuffer::isSizeClamped(inputSize));
+            ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize));
             inputSize.scale(m_filter.filterScale());
             m_unmultipliedImageResult = Uint8ClampedArray::createUninitialized(inputSize.width() * inputSize.height() * 4);
             unsigned char* sourceComponent = m_premultipliedImageResult->data();
@@ -425,7 +425,7 @@
             m_premultipliedImageResult = m_imageBufferResult->getPremultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
         else {
             IntSize inputSize(m_absolutePaintRect.size());
-            ASSERT(ImageBuffer::isSizeClamped(inputSize));
+            ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize));
             inputSize.scale(m_filter.filterScale());
             m_premultipliedImageResult = Uint8ClampedArray::createUninitialized(inputSize.width() * inputSize.height() * 4);
             unsigned char* sourceComponent = m_unmultipliedImageResult->data();
@@ -469,7 +469,7 @@
         return nullptr;
 
     IntSize resultSize(m_absolutePaintRect.size());
-    ASSERT(ImageBuffer::isSizeClamped(resultSize));
+    ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize));
     resultSize.scale(m_filter.filterScale());
     m_unmultipliedImageResult = Uint8ClampedArray::createUninitialized(resultSize.width() * resultSize.height() * 4);
     return m_unmultipliedImageResult.get();
@@ -483,7 +483,7 @@
         return nullptr;
 
     IntSize resultSize(m_absolutePaintRect.size());
-    ASSERT(ImageBuffer::isSizeClamped(resultSize));
+    ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize));
     resultSize.scale(m_filter.filterScale());
     m_premultipliedImageResult = Uint8ClampedArray::createUninitialized(resultSize.width() * resultSize.height() * 4);
     return m_premultipliedImageResult.get();

Modified: trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp (183959 => 183960)


--- trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/rendering/FilterEffectRenderer.cpp	2015-05-07 23:32:45 UTC (rev 183960)
@@ -305,7 +305,7 @@
 
 bool FilterEffectRenderer::updateBackingStoreRect(const FloatRect& filterRect)
 {
-    if (filterRect.isEmpty() || !ImageBuffer::isSizeClamped(filterRect.size()))
+    if (filterRect.isEmpty() || ImageBuffer::sizeNeedsClamping(filterRect.size()))
         return false;
 
     if (filterRect == sourceImageRect())
@@ -401,7 +401,7 @@
     filter->allocateBackingStoreIfNeeded();
     // Paint into the context that represents the SourceGraphic of the filter.
     GraphicsContext* sourceGraphicsContext = filter->inputContext();
-    if (!sourceGraphicsContext || filter->filterRegion().isEmpty() || !ImageBuffer::isSizeClamped(filter->filterRegion().size())) {
+    if (!sourceGraphicsContext || filter->filterRegion().isEmpty() || ImageBuffer::sizeNeedsClamping(filter->filterRegion().size())) {
         // Disable the filters and continue.
         m_haveFilterEffect = false;
         return false;

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (183959 => 183960)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2015-05-07 23:29:15 UTC (rev 183959)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2015-05-07 23:32:45 UTC (rev 183960)
@@ -151,7 +151,7 @@
 
     // Determine scale factor for filter. The size of intermediate ImageBuffers shouldn't be bigger than kMaxFilterSize.
     FloatRect tempSourceRect = absoluteDrawingRegion;
-    ImageBuffer::isSizeClamped(tempSourceRect.size(), scale);
+    ImageBuffer::sizeNeedsClamping(tempSourceRect.size(), scale);
     tempSourceRect.scale(scale.width(), scale.height());
 
     // Set the scale level in SVGFilter.
@@ -166,7 +166,7 @@
     FloatRect subRegion = lastEffect->maxEffectRect();
     // At least one FilterEffect has a too big image size,
     // recalculate the effect sizes with new scale factors.
-    if (!ImageBuffer::isSizeClamped(subRegion.size(), scale)) {
+    if (ImageBuffer::sizeNeedsClamping(subRegion.size(), scale)) {
         filterData->filter->setFilterResolution(scale);
         RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion(*lastEffect);
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to