Modified: trunk/Source/WebCore/ChangeLog (224995 => 224996)
--- trunk/Source/WebCore/ChangeLog 2017-11-17 23:34:09 UTC (rev 224995)
+++ trunk/Source/WebCore/ChangeLog 2017-11-17 23:36:24 UTC (rev 224996)
@@ -1,3 +1,22 @@
+2017-11-17 Simon Fraser <[email protected]>
+
+ 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.
+
2017-11-17 Brent Fulgham <[email protected]>
REGRESSION(r224390): Revert unneeded Ref use.
Modified: trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp (224995 => 224996)
--- trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp 2017-11-17 23:34:09 UTC (rev 224995)
+++ trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp 2017-11-17 23:36:24 UTC (rev 224996)
@@ -64,11 +64,6 @@
return adoptRef(*new FETurbulence(filter, type, baseFrequencyX, baseFrequencyY, numOctaves, seed, stitchTiles));
}
-TurbulenceType FETurbulence::type() const
-{
- return m_type;
-}
-
bool FETurbulence::setType(TurbulenceType type)
{
if (m_type == type)
@@ -77,11 +72,6 @@
return true;
}
-float FETurbulence::baseFrequencyY() const
-{
- return m_baseFrequencyY;
-}
-
bool FETurbulence::setBaseFrequencyY(float baseFrequencyY)
{
if (m_baseFrequencyY == baseFrequencyY)
@@ -90,11 +80,6 @@
return true;
}
-float FETurbulence::baseFrequencyX() const
-{
- return m_baseFrequencyX;
-}
-
bool FETurbulence::setBaseFrequencyX(float baseFrequencyX)
{
if (m_baseFrequencyX == baseFrequencyX)
@@ -103,11 +88,6 @@
return true;
}
-float FETurbulence::seed() const
-{
- return m_seed;
-}
-
bool FETurbulence::setSeed(float seed)
{
if (m_seed == seed)
@@ -116,11 +96,6 @@
return true;
}
-int FETurbulence::numOctaves() const
-{
- return m_numOctaves;
-}
-
bool FETurbulence::setNumOctaves(int numOctaves)
{
if (m_numOctaves == numOctaves)
@@ -129,11 +104,6 @@
return true;
}
-bool FETurbulence::stitchTiles() const
-{
- return m_stitchTiles;
-}
-
bool FETurbulence::setStitchTiles(bool stitch)
{
if (m_stitchTiles == stitch)
@@ -334,10 +304,10 @@
void FETurbulence::fillRegion(Uint8ClampedArray* pixelArray, const PaintingData& paintingData, int startY, int endY)
{
IntRect filterRegion = absolutePaintRect();
- IntPoint point(0, filterRegion.y() + startY);
+ FloatPoint point(0, filterRegion.y() + startY);
int indexOfPixelChannel = startY * (filterRegion.width() << 2);
- int channel;
StitchData stitchData;
+ AffineTransform inverseTransfrom = filter().absoluteTransform().inverse().value_or(AffineTransform());
for (int y = startY; y < endY; ++y) {
point.setY(point.y() + 1);
@@ -344,8 +314,9 @@
point.setX(filterRegion.x());
for (int x = 0; x < filterRegion.width(); ++x) {
point.setX(point.x() + 1);
- for (channel = 0; channel < 4; ++channel, ++indexOfPixelChannel)
- pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(channel, paintingData, stitchData, filter().mapAbsolutePointToLocalPoint(point)));
+ FloatPoint localPoint = inverseTransfrom.mapPoint(point);
+ for (int channel = 0; channel < 4; ++channel, ++indexOfPixelChannel)
+ pixelArray->set(indexOfPixelChannel, calculateTurbulenceValueForPoint(channel, paintingData, stitchData, localPoint));
}
}
}
Modified: trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h (224995 => 224996)
--- trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h 2017-11-17 23:34:09 UTC (rev 224995)
+++ trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h 2017-11-17 23:36:24 UTC (rev 224996)
@@ -39,22 +39,22 @@
public:
static Ref<FETurbulence> create(Filter&, TurbulenceType, float, float, int, float, bool);
- TurbulenceType type() const;
+ TurbulenceType type() const { return m_type; }
bool setType(TurbulenceType);
- float baseFrequencyY() const;
+ float baseFrequencyY() const { return m_baseFrequencyX; }
bool setBaseFrequencyY(float);
- float baseFrequencyX() const;
+ float baseFrequencyX() const { return m_baseFrequencyY; }
bool setBaseFrequencyX(float);
- float seed() const;
+ float seed() const { return m_seed; }
bool setSeed(float);
- int numOctaves() const;
+ int numOctaves() const { return m_numOctaves; }
bool setNumOctaves(int);
- bool stitchTiles() const;
+ bool stitchTiles() const { return m_stitchTiles; }
bool setStitchTiles(bool);
static void fillRegionWorker(void*);
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (224995 => 224996)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.h 2017-11-17 23:34:09 UTC (rev 224995)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h 2017-11-17 23:36:24 UTC (rev 224996)
@@ -43,7 +43,6 @@
void setFilterScale(float scale) { m_filterScale = scale; }
const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
- FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_absoluteTransform.inverse().value_or(AffineTransform()).mapPoint(point); }
RenderingMode renderingMode() const { return m_renderingMode; }
void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }