Changeset 85926 in webkit


Ignore:
Timestamp:
May 6, 2011 12:33:18 AM (13 years ago)
Author:
cdn@chromium.org
Message:

2011-05-06 Cris Neckar <cdn@chromium.org>

Reviewed by Dirk Schulze.

Change maxEffectRect to a FloatRect.
https://bugs.webkit.org/show_bug.cgi?id=59551

  • svg/filters/filter-after-transform-crash-expected.txt: Added.
  • svg/filters/filter-after-transform-crash.svg: Added.

2011-05-06 Cris Neckar <cdn@chromium.org>

Reviewed by Dirk Schulze.

Tests for crash when a transform is applied to certain filters.
https://bugs.webkit.org/show_bug.cgi?id=59551

Test: svg/filters/filter-after-transform-crash.svg

  • platform/graphics/filters/FEComposite.cpp: (WebCore::FEComposite::determineAbsolutePaintRect):
  • platform/graphics/filters/FEConvolveMatrix.h: (WebCore::FEConvolveMatrix::determineAbsolutePaintRect):
  • platform/graphics/filters/FEDisplacementMap.h: (WebCore::FEDisplacementMap::determineAbsolutePaintRect):
  • platform/graphics/filters/FEFlood.h: (WebCore::FEFlood::determineAbsolutePaintRect):
  • platform/graphics/filters/FELighting.h: (WebCore::FELighting::determineAbsolutePaintRect):
  • platform/graphics/filters/FETile.h: (WebCore::FETile::determineAbsolutePaintRect):
  • platform/graphics/filters/FETurbulence.h: (WebCore::FETurbulence::determineAbsolutePaintRect):
  • platform/graphics/filters/FilterEffect.cpp: (WebCore::isFilterSizeValid): (WebCore::FilterEffect::determineAbsolutePaintRect): (WebCore::FilterEffect::asUnmultipliedImage): (WebCore::FilterEffect::asPremultipliedImage): (WebCore::FilterEffect::copyUnmultipliedImage): (WebCore::FilterEffect::copyPremultipliedImage): (WebCore::FilterEffect::createUnmultipliedImageResult): (WebCore::FilterEffect::createPremultipliedImageResult):
  • platform/graphics/filters/FilterEffect.h: (WebCore::FilterEffect::maxEffectRect): (WebCore::FilterEffect::setMaxEffectRect):
  • rendering/svg/RenderSVGResourceFilter.cpp:
  • rendering/svg/RenderSVGResourceFilterPrimitive.cpp: (WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):
Location:
trunk
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r85925 r85926  
     12011-05-06  Cris Neckar  <cdn@chromium.org>
     2
     3        Reviewed by Dirk Schulze.
     4
     5        Change maxEffectRect to a FloatRect.
     6        https://bugs.webkit.org/show_bug.cgi?id=59551
     7
     8        * svg/filters/filter-after-transform-crash-expected.txt: Added.
     9        * svg/filters/filter-after-transform-crash.svg: Added.
     10
    1112011-05-04  Philippe Normand  <pnormand@igalia.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r85923 r85926  
     12011-05-06  Cris Neckar  <cdn@chromium.org>
     2
     3        Reviewed by Dirk Schulze.
     4
     5        Tests for crash when a transform is applied to certain filters.
     6        https://bugs.webkit.org/show_bug.cgi?id=59551
     7
     8        Test: svg/filters/filter-after-transform-crash.svg
     9
     10        * platform/graphics/filters/FEComposite.cpp:
     11        (WebCore::FEComposite::determineAbsolutePaintRect):
     12        * platform/graphics/filters/FEConvolveMatrix.h:
     13        (WebCore::FEConvolveMatrix::determineAbsolutePaintRect):
     14        * platform/graphics/filters/FEDisplacementMap.h:
     15        (WebCore::FEDisplacementMap::determineAbsolutePaintRect):
     16        * platform/graphics/filters/FEFlood.h:
     17        (WebCore::FEFlood::determineAbsolutePaintRect):
     18        * platform/graphics/filters/FELighting.h:
     19        (WebCore::FELighting::determineAbsolutePaintRect):
     20        * platform/graphics/filters/FETile.h:
     21        (WebCore::FETile::determineAbsolutePaintRect):
     22        * platform/graphics/filters/FETurbulence.h:
     23        (WebCore::FETurbulence::determineAbsolutePaintRect):
     24        * platform/graphics/filters/FilterEffect.cpp:
     25        (WebCore::isFilterSizeValid):
     26        (WebCore::FilterEffect::determineAbsolutePaintRect):
     27        (WebCore::FilterEffect::asUnmultipliedImage):
     28        (WebCore::FilterEffect::asPremultipliedImage):
     29        (WebCore::FilterEffect::copyUnmultipliedImage):
     30        (WebCore::FilterEffect::copyPremultipliedImage):
     31        (WebCore::FilterEffect::createUnmultipliedImageResult):
     32        (WebCore::FilterEffect::createPremultipliedImageResult):
     33        * platform/graphics/filters/FilterEffect.h:
     34        (WebCore::FilterEffect::maxEffectRect):
     35        (WebCore::FilterEffect::setMaxEffectRect):
     36        * rendering/svg/RenderSVGResourceFilter.cpp:
     37        * rendering/svg/RenderSVGResourceFilterPrimitive.cpp:
     38        (WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):
     39
    1402011-05-06  Luke Macpherson   <macpherson@chromium.org>
    241
  • trunk/Source/WebCore/platform/graphics/filters/FEComposite.cpp

    r84504 r85926  
    188188        // Arithmetic may influnce the compele filter primitive region. So we can't
    189189        // optimize the paint region here.
    190         setAbsolutePaintRect(maxEffectRect());
     190        setAbsolutePaintRect(enclosingIntRect(maxEffectRect()));
    191191        return;
    192192    default:
  • trunk/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h

    r79866 r85926  
    7676    virtual void dump();
    7777
    78     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     78    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    7979
    8080    virtual TextStream& externalRepresentation(TextStream&, int indention) const;
  • trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h

    r80022 r85926  
    5454    virtual void dump();
    5555
    56     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     56    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    5757
    5858    virtual TextStream& externalRepresentation(TextStream&, int indention) const;
  • trunk/Source/WebCore/platform/graphics/filters/FEFlood.h

    r83821 r85926  
    4343    virtual void dump();
    4444
    45     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     45    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    4646
    4747    virtual TextStream& externalRepresentation(TextStream&, int indention) const;
  • trunk/Source/WebCore/platform/graphics/filters/FELighting.h

    r85180 r85926  
    4646    virtual void apply();
    4747
    48     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     48    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    4949
    5050protected:
  • trunk/Source/WebCore/platform/graphics/filters/FETile.h

    r72474 r85926  
    3636    virtual void dump();
    3737
    38     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     38    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    3939
    4040    virtual FilterEffectType filterEffectType() const { return FilterEffectTypeTile; }
  • trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h

    r84911 r85926  
    6666    virtual void dump();
    6767   
    68     virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(maxEffectRect()); }
     68    virtual void determineAbsolutePaintRect() { setAbsolutePaintRect(enclosingIntRect(maxEffectRect())); }
    6969
    7070    virtual TextStream& externalRepresentation(TextStream&, int indention) const;
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r84422 r85926  
    4747}
    4848
     49inline bool isFilterSizeValid(IntRect rect)
     50{
     51    if (rect.width() < 0 || rect.width() > kMaxFilterSize
     52        || rect.height() < 0 || rect.height() > kMaxFilterSize)
     53        return false;
     54    return true;
     55}
     56
    4957void FilterEffect::determineAbsolutePaintRect()
    5058{
     
    5563   
    5664    // SVG specification wants us to clip to primitive subregion.
    57     m_absolutePaintRect.intersect(m_maxEffectRect);
     65    m_absolutePaintRect.intersect(enclosingIntRect(m_maxEffectRect));
    5866}
    5967
     
    105113PassRefPtr<ByteArray> FilterEffect::asUnmultipliedImage(const IntRect& rect)
    106114{
     115    ASSERT(isFilterSizeValid(rect));
    107116    RefPtr<ByteArray> imageData = ByteArray::create(rect.width() * rect.height() * 4);
    108117    copyUnmultipliedImage(imageData.get(), rect);
     
    112121PassRefPtr<ByteArray> FilterEffect::asPremultipliedImage(const IntRect& rect)
    113122{
     123    ASSERT(isFilterSizeValid(rect));
    114124    RefPtr<ByteArray> imageData = ByteArray::create(rect.width() * rect.height() * 4);
    115125    copyPremultipliedImage(imageData.get(), rect);
     
    170180            m_unmultipliedImageResult = m_imageBufferResult->getUnmultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
    171181        else {
     182            ASSERT(isFilterSizeValid(m_absolutePaintRect));
    172183            m_unmultipliedImageResult = ByteArray::create(m_absolutePaintRect.width() * m_absolutePaintRect.height() * 4);
    173184            unsigned char* sourceComponent = m_premultipliedImageResult->data();
     
    203214            m_premultipliedImageResult = m_imageBufferResult->getPremultipliedImageData(IntRect(IntPoint(), m_absolutePaintRect.size()));
    204215        else {
     216            ASSERT(isFilterSizeValid(m_absolutePaintRect));
    205217            m_premultipliedImageResult = ByteArray::create(m_absolutePaintRect.width() * m_absolutePaintRect.height() * 4);
    206218            unsigned char* sourceComponent = m_unmultipliedImageResult->data();
     
    239251    // Only one result type is allowed.
    240252    ASSERT(!hasResult());
     253    ASSERT(isFilterSizeValid(m_absolutePaintRect));
     254
    241255    determineAbsolutePaintRect();
    242256    if (m_absolutePaintRect.isEmpty())
     
    250264    // Only one result type is allowed.
    251265    ASSERT(!hasResult());
     266    ASSERT(isFilterSizeValid(m_absolutePaintRect));
     267
    252268    determineAbsolutePaintRect();
    253269    if (m_absolutePaintRect.isEmpty())
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h

    r76590 r85926  
    3232#include <wtf/RefPtr.h>
    3333#include <wtf/Vector.h>
     34
     35static const float kMaxFilterSize = 5000.0f;
    3436
    3537namespace WebCore {
     
    7577    void setAbsolutePaintRect(const IntRect& absolutePaintRect) { m_absolutePaintRect = absolutePaintRect; }
    7678
    77     IntRect maxEffectRect() const { return m_maxEffectRect; }
    78     void setMaxEffectRect(const IntRect& maxEffectRect) { m_maxEffectRect = maxEffectRect; }
     79    FloatRect maxEffectRect() const { return m_maxEffectRect; }
     80    void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = maxEffectRect; }
    7981
    8082    virtual void apply() = 0;
     
    129131    // The maximum size of a filter primitive. In SVG this is the primitive subregion in absolute coordinate space.
    130132    // The absolute paint rect should never be bigger than m_maxEffectRect.
    131     IntRect m_maxEffectRect;
     133    FloatRect m_maxEffectRect;
    132134    Filter* m_filter;
    133135
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r85406 r85926  
    2828
    2929#include "AffineTransform.h"
     30#include "FilterEffect.h"
    3031#include "FloatPoint.h"
    3132#include "FloatRect.h"
     
    4950#include <wtf/Vector.h>
    5051
    51 static const float kMaxFilterSize = 5000.0f;
    52 
    5352using namespace std;
    5453
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilterPrimitive.cpp

    r83821 r85926  
    129129    absoluteSubregion.intersect(absoluteScaledFilterRegion);
    130130
    131     effect->setMaxEffectRect(enclosingIntRect(absoluteSubregion));
     131    effect->setMaxEffectRect(absoluteSubregion);
    132132    return subregion;
    133133}
Note: See TracChangeset for help on using the changeset viewer.