Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 658603002: 2D canvas: fix shadow rendering with compositing modes that require temp layers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rehash Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved.
9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
10 * 10 *
(...skipping 1393 matching lines...) Expand 10 before | Expand all | Expand 10 after
1404 bool wasDrawingShadows = shouldDrawShadows(); 1404 bool wasDrawingShadows = shouldDrawShadows();
1405 realizeSaves(0); 1405 realizeSaves(0);
1406 modifiableState().m_shadowOffset = offset; 1406 modifiableState().m_shadowOffset = offset;
1407 modifiableState().m_shadowBlur = blur; 1407 modifiableState().m_shadowBlur = blur;
1408 modifiableState().m_shadowColor = color; 1408 modifiableState().m_shadowColor = color;
1409 if (!wasDrawingShadows && !shouldDrawShadows()) 1409 if (!wasDrawingShadows && !shouldDrawShadows())
1410 return; 1410 return;
1411 applyShadow(); 1411 applyShadow();
1412 } 1412 }
1413 1413
1414 void CanvasRenderingContext2D::applyShadow() 1414 void CanvasRenderingContext2D::applyShadow(ShadowMode shadowMode)
1415 { 1415 {
1416 GraphicsContext* c = drawingContext(); 1416 GraphicsContext* c = drawingContext();
1417 if (!c) 1417 if (!c)
1418 return; 1418 return;
1419 1419
1420 if (shouldDrawShadows()) { 1420 if (shouldDrawShadows()) {
1421 c->setShadow(state().m_shadowOffset, state().m_shadowBlur, state().m_sha dowColor, 1421 c->setShadow(state().m_shadowOffset, state().m_shadowBlur, state().m_sha dowColor,
1422 DrawLooperBuilder::ShadowIgnoresTransforms); 1422 DrawLooperBuilder::ShadowIgnoresTransforms, DrawLooperBuilder::Shado wRespectsAlpha, shadowMode);
1423 } else { 1423 } else {
1424 c->clearShadow(); 1424 c->clearShadow();
1425 } 1425 }
1426 } 1426 }
1427 1427
1428 bool CanvasRenderingContext2D::shouldDrawShadows() const 1428 bool CanvasRenderingContext2D::shouldDrawShadows() const
1429 { 1429 {
1430 return alphaChannel(state().m_shadowColor) && (state().m_shadowBlur || !stat e().m_shadowOffset.isZero()); 1430 return alphaChannel(state().m_shadowColor) && (state().m_shadowBlur || !stat e().m_shadowOffset.isZero());
1431 } 1431 }
1432 1432
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1639 { 1639 {
1640 context->fillPath(path); 1640 context->fillPath(path);
1641 } 1641 }
1642 1642
1643 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedFill(const T& area) 1643 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedFill(const T& area)
1644 { 1644 {
1645 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); 1645 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite));
1646 1646
1647 GraphicsContext* c = drawingContext(); 1647 GraphicsContext* c = drawingContext();
1648 ASSERT(c); 1648 ASSERT(c);
1649
1650 CompositeOperator previousOperator = c->compositeOperation();
1651 if (shouldDrawShadows()) {
1652 // unroll into two independently composited passes if drawing shadows
1653 c->beginLayer(1, state().m_globalComposite);
1654 c->setCompositeOperation(CompositeSourceOver);
1655 applyShadow(DrawShadowOnly);
1656 fillPrimitive(area, c);
1657 c->setCompositeOperation(previousOperator);
1658 c->endLayer();
1659 }
1660
1649 c->beginLayer(1, state().m_globalComposite); 1661 c->beginLayer(1, state().m_globalComposite);
1650 CompositeOperator previousOperator = c->compositeOperation(); 1662 applyShadow(DrawForegroundOnly);
1651 c->setCompositeOperation(CompositeSourceOver); 1663 c->setCompositeOperation(CompositeSourceOver);
1652 fillPrimitive(area, c); 1664 fillPrimitive(area, c);
1653 c->setCompositeOperation(previousOperator); 1665 c->setCompositeOperation(previousOperator);
1654 c->endLayer(); 1666 c->endLayer();
1667 applyShadow(DrawShadowAndForeground); // go back to normal shadows
1655 } 1668 }
1656 1669
1657 static void strokePrimitive(const FloatRect& rect, GraphicsContext* context) 1670 static void strokePrimitive(const FloatRect& rect, GraphicsContext* context)
1658 { 1671 {
1659 context->strokeRect(rect); 1672 context->strokeRect(rect);
1660 } 1673 }
1661 1674
1662 static void strokePrimitive(const Path& path, GraphicsContext* context) 1675 static void strokePrimitive(const Path& path, GraphicsContext* context)
1663 { 1676 {
1664 context->strokePath(path); 1677 context->strokePath(path);
1665 } 1678 }
1666 1679
1667 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(cons t T& area) 1680 template<class T> void CanvasRenderingContext2D::fullCanvasCompositedStroke(cons t T& area)
1668 { 1681 {
1669 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); 1682 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite));
1670 1683
1671 GraphicsContext* c = drawingContext(); 1684 GraphicsContext* c = drawingContext();
1672 ASSERT(c); 1685 ASSERT(c);
1686
1687 CompositeOperator previousOperator = c->compositeOperation();
1688 if (shouldDrawShadows()) {
1689 // unroll into two independently composited passes if drawing shadows
1690 c->beginLayer(1, state().m_globalComposite);
1691 c->setCompositeOperation(CompositeSourceOver);
1692 applyShadow(DrawShadowOnly);
1693 strokePrimitive(area, c);
1694 c->setCompositeOperation(previousOperator);
1695 c->endLayer();
1696 }
1697
1673 c->beginLayer(1, state().m_globalComposite); 1698 c->beginLayer(1, state().m_globalComposite);
1674 CompositeOperator previousOperator = c->compositeOperation(); 1699 applyShadow(DrawForegroundOnly);
1675 c->setCompositeOperation(CompositeSourceOver); 1700 c->setCompositeOperation(CompositeSourceOver);
1676 strokePrimitive(area, c); 1701 strokePrimitive(area, c);
1677 c->setCompositeOperation(previousOperator); 1702 c->setCompositeOperation(previousOperator);
1678 c->endLayer(); 1703 c->endLayer();
1704 applyShadow(DrawShadowAndForeground); // go back to normal shadows
1679 } 1705 }
1680 1706
1681 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra dient(float x0, float y0, float x1, float y1) 1707 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra dient(float x0, float y0, float x1, float y1)
1682 { 1708 {
1683 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo int(x0, y0), FloatPoint(x1, y1)); 1709 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo int(x0, y0), FloatPoint(x1, y1));
1684 return gradient.release(); 1710 return gradient.release();
1685 } 1711 }
1686 1712
1687 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createRadialGra dient(float x0, float y0, float r0, float x1, float y1, float r1, ExceptionState & exceptionState) 1713 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createRadialGra dient(float x0, float y0, float r0, float x1, float y1, float r1, ExceptionState & exceptionState)
1688 { 1714 {
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after
2463 2489
2464 unsigned CanvasRenderingContext2D::hitRegionsCount() const 2490 unsigned CanvasRenderingContext2D::hitRegionsCount() const
2465 { 2491 {
2466 if (m_hitRegionManager) 2492 if (m_hitRegionManager)
2467 return m_hitRegionManager->getHitRegionsCount(); 2493 return m_hitRegionManager->getHitRegionsCount();
2468 2494
2469 return 0; 2495 return 0;
2470 } 2496 }
2471 2497
2472 } // namespace blink 2498 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698