Changeset 224996 in webkit


Ignore:
Timestamp:
Nov 17, 2017 3:36:24 PM (6 years ago)
Author:
Simon Fraser
Message:

Don't invert a matrix for every channel of every pixel of an FETurbulence filter
https://bugs.webkit.org/show_bug.cgi?id=179829

Reviewed by Dean Jackson.

FETurbulence::fillRegion() called filter().mapAbsolutePointToLocalPoint(point) for each
of the 4 channels on a point, which is stupid.

Fix to invert the matrix once, and then map the point once for each pixel. This reduces
the time in fillRegion() function by about 30%.

  • platform/graphics/filters/FETurbulence.cpp:

(WebCore::FETurbulence::fillRegion):

  • platform/graphics/filters/Filter.h:

(WebCore::Filter::absoluteTransform const):
(WebCore::Filter::mapAbsolutePointToLocalPoint const): Deleted.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r224995 r224996  
     12017-11-17  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Don't invert a matrix for every channel of every pixel of an FETurbulence filter
     4        https://bugs.webkit.org/show_bug.cgi?id=179829
     5
     6        Reviewed by Dean Jackson.
     7       
     8        FETurbulence::fillRegion() called filter().mapAbsolutePointToLocalPoint(point) for each
     9        of the 4 channels on a point, which is stupid.
     10       
     11        Fix to invert the matrix once, and then map the point once for each pixel. This reduces
     12        the time in fillRegion() function by about 30%.
     13
     14        * platform/graphics/filters/FETurbulence.cpp:
     15        (WebCore::FETurbulence::fillRegion):
     16        * platform/graphics/filters/Filter.h:
     17        (WebCore::Filter::absoluteTransform const):
     18        (WebCore::Filter::mapAbsolutePointToLocalPoint const): Deleted.
     19
    1202017-11-17  Brent Fulgham  <bfulgham@apple.com>
    221
  • trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp

    r224977 r224996  
    6565}
    6666
    67 TurbulenceType FETurbulence::type() const
    68 {
    69     return m_type;
    70 }
    71 
    7267bool FETurbulence::setType(TurbulenceType type)
    7368{
     
    7873}
    7974
    80 float FETurbulence::baseFrequencyY() const
    81 {
    82     return m_baseFrequencyY;
    83 }
    84 
    8575bool FETurbulence::setBaseFrequencyY(float baseFrequencyY)
    8676{
     
    9181}
    9282
    93 float FETurbulence::baseFrequencyX() const
    94 {
    95     return m_baseFrequencyX;
    96 }
    97 
    9883bool FETurbulence::setBaseFrequencyX(float baseFrequencyX)
    9984{
     
    10489}
    10590
    106 float FETurbulence::seed() const
    107 {
    108     return m_seed;
    109 }
    110 
    11191bool FETurbulence::setSeed(float seed)
    11292{
     
    11797}
    11898
    119 int FETurbulence::numOctaves() const
    120 {
    121     return m_numOctaves;
    122 }
    123 
    12499bool FETurbulence::setNumOctaves(int numOctaves)
    125100{
     
    128103    m_numOctaves = numOctaves;
    129104    return true;
    130 }
    131 
    132 bool FETurbulence::stitchTiles() const
    133 {
    134     return m_stitchTiles;
    135105}
    136106
     
    335305{
    336306    IntRect filterRegion = absolutePaintRect();
    337     IntPoint point(0, filterRegion.y() + startY);
     307    FloatPoint point(0, filterRegion.y() + startY);
    338308    int indexOfPixelChannel = startY * (filterRegion.width() << 2);
    339     int channel;
    340309    StitchData stitchData;
     310    AffineTransform inverseTransfrom = filter().absoluteTransform().inverse().value_or(AffineTransform());
    341311
    342312    for (int y = startY; y < endY; ++y) {
     
    345315        for (int x = 0; x < filterRegion.width(); ++x) {
    346316            point.setX(point.x() + 1);
    347             for (channel = 0; channel < 4; ++channel, ++indexOfPixelChannel)
    348                 pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(channel, paintingData, stitchData, filter().mapAbsolutePointToLocalPoint(point)));
     317            FloatPoint localPoint = inverseTransfrom.mapPoint(point);
     318            for (int channel = 0; channel < 4; ++channel, ++indexOfPixelChannel)
     319                pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(channel, paintingData, stitchData, localPoint));
    349320        }
    350321    }
  • trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h

    r224977 r224996  
    4040    static Ref<FETurbulence> create(Filter&, TurbulenceType, float, float, int, float, bool);
    4141
    42     TurbulenceType type() const;
     42    TurbulenceType type() const { return m_type; }
    4343    bool setType(TurbulenceType);
    4444
    45     float baseFrequencyY() const;
     45    float baseFrequencyY() const { return m_baseFrequencyX; }
    4646    bool setBaseFrequencyY(float);
    4747
    48     float baseFrequencyX() const;
     48    float baseFrequencyX() const { return m_baseFrequencyY; }
    4949    bool setBaseFrequencyX(float);
    5050
    51     float seed() const;
     51    float seed() const { return m_seed; }
    5252    bool setSeed(float);
    5353
    54     int numOctaves() const;
     54    int numOctaves() const { return m_numOctaves; }
    5555    bool setNumOctaves(int);
    5656
    57     bool stitchTiles() const;
     57    bool stitchTiles() const { return m_stitchTiles; }
    5858    bool setStitchTiles(bool);
    5959
  • trunk/Source/WebCore/platform/graphics/filters/Filter.h

    r223728 r224996  
    4444
    4545    const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
    46     FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_absoluteTransform.inverse().value_or(AffineTransform()).mapPoint(point); }
    4746
    4847    RenderingMode renderingMode() const { return m_renderingMode; }
Note: See TracChangeset for help on using the changeset viewer.