diff options
Diffstat (limited to 'WebCore/rendering/SVGRenderSupport.cpp')
-rw-r--r-- | WebCore/rendering/SVGRenderSupport.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/WebCore/rendering/SVGRenderSupport.cpp b/WebCore/rendering/SVGRenderSupport.cpp index ea087f9..a594410 100644 --- a/WebCore/rendering/SVGRenderSupport.cpp +++ b/WebCore/rendering/SVGRenderSupport.cpp @@ -94,8 +94,17 @@ void SVGRenderBase::prepareToRenderSVGContent(RenderObject* object, RenderObject paintInfo.context->beginTransparencyLayer(opacity); } - if (ShadowData* shadow = svgStyle->shadow()) - paintInfo.context->setShadow(IntSize(shadow->x, shadow->y), shadow->blur, shadow->color); + if (ShadowData* shadow = svgStyle->shadow()) { + int xShift = shadow->x < 0 ? shadow->x : 0; + int yShift = shadow->y < 0 ? shadow->y :0; + int widthShift = shadow->x < 0 ? 0 : shadow->x; + int heightShift = shadow->y < 0 ? 0 : shadow->y; + FloatRect shadowRect = FloatRect(boundingBox.x() + xShift, boundingBox.y() + yShift, + boundingBox.width() + widthShift, boundingBox.height() + heightShift); + paintInfo.context->clip(enclosingIntRect(shadowRect)); + paintInfo.context->setShadow(IntSize(shadow->x, shadow->y), shadow->blur, shadow->color, style->colorSpace()); + paintInfo.context->beginTransparencyLayer(1.0f); + } #if ENABLE(FILTERS) AtomicString filterId(svgStyle->filter()); @@ -163,6 +172,11 @@ void SVGRenderBase::finishRenderSVGContent(RenderObject* object, RenderObject::P float opacity = style->opacity(); if (opacity < 1.0f) paintInfo.context->endTransparencyLayer(); + + // This needs to be done separately from opacity, because if both properties are set, + // then the transparency layers are nested. + if (style->svgStyle()->shadow()) + paintInfo.context->endTransparencyLayer(); } void renderSubtreeToImage(ImageBuffer* image, RenderObject* item) |