| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| index 98b4897eeb82c05a94b3f35f635d057e2afea26b..ff3d2d920050d1dd6bc5f80d5fcbcdb67819f4dd 100644
|
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| @@ -1410,7 +1410,7 @@ void CanvasRenderingContext2D::setShadow(const FloatSize& offset, float blur, RG
|
| applyShadow();
|
| }
|
|
|
| -void CanvasRenderingContext2D::applyShadow()
|
| +void CanvasRenderingContext2D::applyShadow(ShadowMode shadowMode)
|
| {
|
| GraphicsContext* c = drawingContext();
|
| if (!c)
|
| @@ -1418,7 +1418,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();
|
| }
|
| @@ -1648,8 +1648,24 @@ template<CanvasRenderingContext2D::DrawingType drawingType, class T> void Canvas
|
|
|
| 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);
|
| + if (drawingType == Fill) {
|
| + fillPrimitive(area, c);
|
| + } else {
|
| + strokePrimitive(area, c);
|
| + }
|
| + c->setCompositeOperation(previousOperator);
|
| + c->endLayer();
|
| + }
|
| +
|
| + c->beginLayer(1, state().m_globalComposite);
|
| + c->clearShadow();
|
| c->setCompositeOperation(CompositeSourceOver);
|
| if (drawingType == Fill) {
|
| fillPrimitive(area, c);
|
| @@ -1658,6 +1674,7 @@ template<CanvasRenderingContext2D::DrawingType drawingType, class T> void Canvas
|
| }
|
| c->setCompositeOperation(previousOperator);
|
| c->endLayer();
|
| + applyShadow(DrawShadowAndForeground); // go back to normal shadows mode
|
| }
|
|
|
| PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGradient(float x0, float y0, float x1, float y1)
|
|
|