Chromium Code Reviews| Index: Source/core/platform/graphics/filters/FETurbulence.cpp |
| diff --git a/Source/core/platform/graphics/filters/FETurbulence.cpp b/Source/core/platform/graphics/filters/FETurbulence.cpp |
| index a15127db6f637ebafb9d044ebb651b81a71860f8..2c7e512c97c95d3b2cdba9568b75fd9b26d48c12 100644 |
| --- a/Source/core/platform/graphics/filters/FETurbulence.cpp |
| +++ b/Source/core/platform/graphics/filters/FETurbulence.cpp |
| @@ -26,7 +26,8 @@ |
| #include "config.h" |
| #include "core/platform/graphics/filters/FETurbulence.h" |
| - |
| +#include "SkPerlinNoiseShader.h" |
| +#include "SkRectShaderImageFilter.h" |
| #include "core/platform/graphics/filters/Filter.h" |
| #include "core/platform/text/TextStream.h" |
| #include "core/rendering/RenderTreeAsText.h" |
| @@ -365,7 +366,14 @@ void FETurbulence::applySoftware() |
| return; |
| } |
| - PaintingData paintingData(m_seed, roundedIntSize(filterPrimitiveSubregion().size())); |
| + // FIXME : Ideally, filterPrimitiveSubregion() should do the trick for all cases, but since |
| + // it's currently not being set when an SVG filter is used in CSS, we have to use |
|
Stephen White
2013/06/13 17:28:06
BTW, I think filterPrimitiveSubregion() should now
sugoi
2013/06/13 17:46:33
Done.
|
| + // absolutePaintRect() instead (which includes the zoom factor, unfortunately). |
| + // This code should be reverted to only use filterPrimitiveSubregion() directly |
| + // as soon as it works in all cases. |
| + IntSize noiseSize = roundedIntSize(filterPrimitiveSubregion().size()); |
| + PaintingData paintingData(m_seed, |
| + noiseSize.isEmpty() ? absolutePaintRect().size() : noiseSize); |
| initPaint(paintingData); |
| int optimalThreadNumber = (absolutePaintRect().width() * absolutePaintRect().height()) / s_minimalRectDimension; |
| @@ -402,6 +410,41 @@ void FETurbulence::applySoftware() |
| fillRegion(pixelArray, paintingData, 0, absolutePaintRect().height()); |
| } |
| +SkShader* FETurbulence::createShader(const IntRect& filterRegion) const |
| +{ |
| + const SkISize size = SkISize::Make(filterRegion.width(), filterRegion.height()); |
| + return (type() == FETURBULENCE_TYPE_FRACTALNOISE) ? |
| + SkPerlinNoiseShader::CreateFractalNoise(SkFloatToScalar(baseFrequencyX()), |
| + SkFloatToScalar(baseFrequencyY()), numOctaves(), SkFloatToScalar(seed()), |
| + stitchTiles() ? &size : 0) : |
| + SkPerlinNoiseShader::CreateTubulence(SkFloatToScalar(baseFrequencyX()), |
| + SkFloatToScalar(baseFrequencyY()), numOctaves(), SkFloatToScalar(seed()), |
| + stitchTiles() ? &size : 0); |
| +} |
| + |
| +bool FETurbulence::platformApplySkia() |
| +{ |
| + // For now, only use the skia implementation for accelerated rendering. |
| + if (filter()->renderingMode() != Accelerated) |
| + return false; |
| + |
| + ImageBuffer* resultImage = createImageBufferResult(); |
| + if (!resultImage) |
| + return false; |
| + |
| + const IntRect filterRegion = absolutePaintRect(); |
| + |
| + SkPaint paint; |
| + paint.setShader(createShader(filterRegion))->unref(); |
| + resultImage->context()->drawRect((SkRect)filterRegion, paint); |
| + return true; |
| +} |
| + |
| +SkImageFilter* FETurbulence::createImageFilter(SkiaImageFilterBuilder* builder) |
| +{ |
| + return SkRectShaderImageFilter::Create(createShader(IntRect()), SkRect()); |
| +} |
| + |
| static TextStream& operator<<(TextStream& ts, const TurbulenceType& type) |
| { |
| switch (type) { |
| @@ -409,7 +452,7 @@ static TextStream& operator<<(TextStream& ts, const TurbulenceType& type) |
| ts << "UNKNOWN"; |
| break; |
| case FETURBULENCE_TYPE_TURBULENCE: |
| - ts << "TURBULANCE"; |
| + ts << "TURBULENCE"; |
| break; |
| case FETURBULENCE_TYPE_FRACTALNOISE: |
| ts << "NOISE"; |