Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp |
diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
index a1911e5990147f992e81a3511e0192d35fa2bb4a..c61ac1a91e845b4828b335ec2cbf4e04e62bfa90 100644 |
--- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
+++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp |
@@ -1411,7 +1411,7 @@ void CanvasRenderingContext2D::setShadow(const FloatSize& offset, float blur, RG |
applyShadow(); |
} |
-void CanvasRenderingContext2D::applyShadow() |
+void CanvasRenderingContext2D::applyShadow(ShadowMode shadowMode) |
{ |
GraphicsContext* c = drawingContext(); |
if (!c) |
@@ -1419,7 +1419,7 @@ void CanvasRenderingContext2D::applyShadow() |
if (shouldDrawShadows()) { |
c->setShadow(state().m_shadowOffset, state().m_shadowBlur, state().m_shadowColor, |
- DrawLooperBuilder::ShadowIgnoresTransforms); |
+ DrawLooperBuilder::ShadowIgnoresTransforms, DrawLooperBuilder::ShadowRespectsAlpha, shadowMode); |
} else { |
c->clearShadow(); |
} |
@@ -1646,12 +1646,25 @@ template<class T> void CanvasRenderingContext2D::fullCanvasCompositedFill(const |
GraphicsContext* c = drawingContext(); |
ASSERT(c); |
- c->beginLayer(1, state().m_globalComposite); |
+ |
CompositeOperator previousOperator = c->compositeOperation(); |
+ if (shouldDrawShadows()) { |
+ // unroll into two independently composited passes if drawing shadows |
+ c->beginLayer(1, state().m_globalComposite); |
+ c->setCompositeOperation(CompositeSourceOver); |
+ applyShadow(DrawShadowOnly); |
+ fillPrimitive(area, c); |
+ c->setCompositeOperation(previousOperator); |
+ c->endLayer(); |
+ } |
+ |
+ c->beginLayer(1, state().m_globalComposite); |
+ applyShadow(DrawForegroundOnly); |
c->setCompositeOperation(CompositeSourceOver); |
fillPrimitive(area, c); |
c->setCompositeOperation(previousOperator); |
c->endLayer(); |
+ applyShadow(DrawShadowAndForeground); // go back to normal shadows |
} |
static void strokePrimitive(const FloatRect& rect, GraphicsContext* context) |
@@ -1670,12 +1683,25 @@ template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(cons |
GraphicsContext* c = drawingContext(); |
ASSERT(c); |
- c->beginLayer(1, state().m_globalComposite); |
+ |
CompositeOperator previousOperator = c->compositeOperation(); |
+ if (shouldDrawShadows()) { |
+ // unroll into two independently composited passes if drawing shadows |
+ c->beginLayer(1, state().m_globalComposite); |
+ c->setCompositeOperation(CompositeSourceOver); |
+ applyShadow(DrawShadowOnly); |
+ strokePrimitive(area, c); |
+ c->setCompositeOperation(previousOperator); |
+ c->endLayer(); |
+ } |
+ |
+ c->beginLayer(1, state().m_globalComposite); |
+ applyShadow(DrawForegroundOnly); |
c->setCompositeOperation(CompositeSourceOver); |
strokePrimitive(area, c); |
c->setCompositeOperation(previousOperator); |
c->endLayer(); |
+ applyShadow(DrawShadowAndForeground); // go back to normal shadows |
} |
PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGradient(float x0, float y0, float x1, float y1) |