| 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)
|
|
|