Modified: trunk/Source/WebCore/ChangeLog (224976 => 224977)
--- trunk/Source/WebCore/ChangeLog 2017-11-17 19:34:32 UTC (rev 224976)
+++ trunk/Source/WebCore/ChangeLog 2017-11-17 19:39:58 UTC (rev 224977)
@@ -1,3 +1,22 @@
+2017-11-17 Simon Fraser <[email protected]>
+
+ FETurbulence const and inline cleanup
+ https://bugs.webkit.org/show_bug.cgi?id=179832
+
+ Reviewed by Dean Jackson.
+
+ Pass the PaintingData& around as const, and remove some 'inline', letting the compiler
+ decide. Also declare a few variables closer to first use.
+
+ Speeds up FETurbulence by about 1%.
+
+ * platform/graphics/filters/FETurbulence.cpp:
+ (WebCore::FETurbulence::initPaint):
+ (WebCore::FETurbulence::noise2D):
+ (WebCore::FETurbulence::calculateTurbulenceValueForPoint):
+ (WebCore::FETurbulence::fillRegion):
+ * platform/graphics/filters/FETurbulence.h:
+
2017-11-17 Antti Koivisto <[email protected]>
Move destroyLeftoverChildren call to RenderObject::destroy
Modified: trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp (224976 => 224977)
--- trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp 2017-11-17 19:34:32 UTC (rev 224976)
+++ trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp 2017-11-17 19:39:58 UTC (rev 224977)
@@ -165,7 +165,7 @@
return a + t * (b - a);
}
-inline void FETurbulence::initPaint(PaintingData& paintingData)
+void FETurbulence::initPaint(PaintingData& paintingData)
{
float normalizationFactor;
@@ -189,6 +189,7 @@
gradient[1] /= normalizationFactor;
}
}
+
for (int i = s_blockSize - 1; i > 0; --i) {
int k = paintingData.latticeSelector[i];
int j = paintingData.random() % s_blockSize;
@@ -197,6 +198,7 @@
paintingData.latticeSelector[i] = paintingData.latticeSelector[j];
paintingData.latticeSelector[j] = k;
}
+
for (int i = 0; i < s_blockSize + 2; ++i) {
paintingData.latticeSelector[s_blockSize + i] = paintingData.latticeSelector[i];
for (int channel = 0; channel < 4; ++channel) {
@@ -214,7 +216,7 @@
noiseValue -= newValue - 1;
}
-float FETurbulence::noise2D(int channel, PaintingData& paintingData, StitchData& stitchData, const FloatPoint& noiseVector)
+float FETurbulence::noise2D(int channel, const PaintingData& paintingData, StitchData& stitchData, const FloatPoint& noiseVector)
{
struct Noise {
int noisePositionIntegerValue;
@@ -230,8 +232,6 @@
Noise noiseX(noiseVector.x());
Noise noiseY(noiseVector.y());
- float* q;
- float sx, sy, a, b, u, v;
// If stitching, adjust lattice points accordingly.
if (m_stitchTiles) {
@@ -244,12 +244,13 @@
int latticeIndex = paintingData.latticeSelector[noiseX.noisePositionIntegerValue];
int nextLatticeIndex = paintingData.latticeSelector[(noiseX.noisePositionIntegerValue + 1) & s_blockMask];
- sx = smoothCurve(noiseX.noisePositionFractionValue);
- sy = smoothCurve(noiseY.noisePositionFractionValue);
+ float sx = smoothCurve(noiseX.noisePositionFractionValue);
+ float sy = smoothCurve(noiseY.noisePositionFractionValue);
+ float a, b, u, v;
// This is taken 1:1 from SVG spec: http://www.w3.org/TR/SVG11/filters.html#feTurbulenceElement.
int temp = paintingData.latticeSelector[latticeIndex + noiseY.noisePositionIntegerValue];
- q = paintingData.gradient[channel][temp];
+ const float* q = paintingData.gradient[channel][temp];
u = noiseX.noisePositionFractionValue * q[0] + noiseY.noisePositionFractionValue * q[1];
temp = paintingData.latticeSelector[nextLatticeIndex + noiseY.noisePositionIntegerValue];
q = paintingData.gradient[channel][temp];
@@ -265,7 +266,7 @@
return linearInterpolation(sy, a, b);
}
-unsigned char FETurbulence::calculateTurbulenceValueForPoint(int channel, PaintingData& paintingData, StitchData& stitchData, const FloatPoint& point)
+unsigned char FETurbulence::calculateTurbulenceValueForPoint(int channel, const PaintingData& paintingData, StitchData& stitchData, const FloatPoint& point)
{
float tileWidth = paintingData.filterSize.width();
float tileHeight = paintingData.filterSize.height();
@@ -299,6 +300,7 @@
stitchData.height = roundf(tileHeight * baseFrequencyY);
stitchData.wrapY = s_perlinNoise + stitchData.height;
}
+
float turbulenceFunctionResult = 0;
FloatPoint noiseVector(point.x() * baseFrequencyX, point.y() * baseFrequencyY);
float ratio = 1;
@@ -329,7 +331,7 @@
return static_cast<unsigned char>(turbulenceFunctionResult * 255);
}
-inline void FETurbulence::fillRegion(Uint8ClampedArray* pixelArray, PaintingData& paintingData, int startY, int endY)
+void FETurbulence::fillRegion(Uint8ClampedArray* pixelArray, const PaintingData& paintingData, int startY, int endY)
{
IntRect filterRegion = absolutePaintRect();
IntPoint point(0, filterRegion.y() + startY);
Modified: trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h (224976 => 224977)
--- trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h 2017-11-17 19:34:32 UTC (rev 224976)
+++ trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h 2017-11-17 19:39:58 UTC (rev 224977)
@@ -117,10 +117,10 @@
FETurbulence(Filter&, TurbulenceType, float, float, int, float, bool);
- inline void initPaint(PaintingData&);
- float noise2D(int channel, PaintingData&, StitchData&, const FloatPoint&);
- unsigned char calculateTurbulenceValueForPoint(int channel, PaintingData&, StitchData&, const FloatPoint&);
- inline void fillRegion(Uint8ClampedArray*, PaintingData&, int, int);
+ void initPaint(PaintingData&);
+ float noise2D(int channel, const PaintingData&, StitchData&, const FloatPoint&);
+ unsigned char calculateTurbulenceValueForPoint(int channel, const PaintingData&, StitchData&, const FloatPoint&);
+ void fillRegion(Uint8ClampedArray*, const PaintingData&, int, int);
TurbulenceType m_type;
float m_baseFrequencyX;