Index: Source/core/rendering/svg/RenderSVGResourceFilter.cpp |
diff --git a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp |
index d8688a862b3afbd7876b1b67ef7dcbc511ebdf44..c45fd68b8cc4aacb1c627a5b25bc98136d8f8b2a 100644 |
--- a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp |
+++ b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp |
@@ -232,7 +232,23 @@ bool RenderSVGResourceFilter::applyResource(RenderObject* object, RenderStyle*, |
// Scale the CTM so the primitive is drawn to filterRes. |
context->scale(filterResScale); |
// Create a resize filter with the inverse scale. |
- imageFilter = builder.buildResize(1 / filterResScale.width(), 1 / filterResScale.height(), imageFilter.get()); |
+ AffineTransform resizeMatrix; |
+ resizeMatrix.scale(1 / filterResScale.width(), 1 / filterResScale.height()); |
+ imageFilter = builder.buildTransform(resizeMatrix, imageFilter.get()); |
+ } |
+ // If the CTM contains rotation or shearing, apply the filter to |
+ // the unsheared/unrotated matrix, and do the shearing/rotation |
+ // as a final pass. |
+ AffineTransform ctm = context->getCTM(); |
+ if (ctm.b() || ctm.c()) { |
+ AffineTransform scaleAndTranslate; |
+ scaleAndTranslate.translate(ctm.e(), ctm.f()); |
+ scaleAndTranslate.scale(ctm.xScale(), ctm.yScale()); |
+ ASSERT(scaleAndTranslate.isInvertible()); |
+ AffineTransform shearAndRotate = scaleAndTranslate.inverse(); |
+ shearAndRotate.multiply(ctm); |
+ context->setCTM(scaleAndTranslate); |
+ imageFilter = builder.buildTransform(shearAndRotate, imageFilter.get()); |
} |
context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, imageFilter.get()); |
return true; |