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

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 408543002: Actually paint squashed layers when printing. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Added disabler. Created 6 years, 5 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
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 bool RenderLayer::hasOverflowControls() const 1568 bool RenderLayer::hasOverflowControls() const
1569 { 1569 {
1570 return m_scrollableArea && (m_scrollableArea->hasScrollbar() || m_scrollable Area->hasScrollCorner() || renderer()->style()->resize() != RESIZE_NONE); 1570 return m_scrollableArea && (m_scrollableArea->hasScrollbar() || m_scrollable Area->hasScrollCorner() || renderer()->style()->resize() != RESIZE_NONE);
1571 } 1571 }
1572 1572
1573 void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot, PaintLayerFlags paintFl ags) 1573 void RenderLayer::paint(GraphicsContext* context, const LayoutRect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot, PaintLayerFlags paintFl ags)
1574 { 1574 {
1575 OverlapTestRequestMap overlapTestRequests; 1575 OverlapTestRequestMap overlapTestRequests;
1576 1576
1577 LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBeha vior, LayoutSize(), paintingRoot, &overlapTestRequests); 1577 LayerPaintingInfo paintingInfo(this, enclosingIntRect(damageRect), paintBeha vior, LayoutSize(), paintingRoot, &overlapTestRequests);
1578 paintLayer(context, paintingInfo, paintFlags); 1578 if (shouldPaintLayerInSoftwareMode(context, paintingInfo, paintFlags))
1579 paintLayer(context, paintingInfo, paintFlags);
1579 1580
1580 OverlapTestRequestMap::iterator end = overlapTestRequests.end(); 1581 OverlapTestRequestMap::iterator end = overlapTestRequests.end();
1581 for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it) 1582 for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it)
1582 it->key->setIsOverlapped(false); 1583 it->key->setIsOverlapped(false);
1583 } 1584 }
1584 1585
1585 void RenderLayer::paintOverlayScrollbars(GraphicsContext* context, const LayoutR ect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot) 1586 void RenderLayer::paintOverlayScrollbars(GraphicsContext* context, const LayoutR ect& damageRect, PaintBehavior paintBehavior, RenderObject* paintingRoot)
1586 { 1587 {
1587 if (!m_containsDirtyOverlayScrollbars) 1588 if (!m_containsDirtyOverlayScrollbars)
1588 return; 1589 return;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it) { 1656 for (OverlapTestRequestMap::iterator it = overlapTestRequests.begin(); it != end; ++it) {
1656 if (!boundingBox.intersects(it->value)) 1657 if (!boundingBox.intersects(it->value))
1657 continue; 1658 continue;
1658 1659
1659 it->key->setIsOverlapped(true); 1660 it->key->setIsOverlapped(true);
1660 overlappedRequestClients.append(it->key); 1661 overlappedRequestClients.append(it->key);
1661 } 1662 }
1662 overlapTestRequests.removeAll(overlappedRequestClients); 1663 overlapTestRequests.removeAll(overlappedRequestClients);
1663 } 1664 }
1664 1665
1665 static bool shouldDoSoftwarePaint(const RenderLayer* layer, bool paintingReflect ion)
1666 {
1667 return paintingReflection && !layer->has3DTransform();
1668 }
1669
1670 static inline bool shouldSuppressPaintingLayer(RenderLayer* layer) 1666 static inline bool shouldSuppressPaintingLayer(RenderLayer* layer)
1671 { 1667 {
1672 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC. 1668 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC.
1673 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document 1669 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
1674 // will do a full repaint(). 1670 // will do a full repaint().
1675 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement()) 1671 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement())
1676 return true; 1672 return true;
1677 1673
1678 return false; 1674 return false;
1679 } 1675 }
1680 1676
1681 static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag s paintFlags) 1677 static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag s paintFlags)
1682 { 1678 {
1683 return layer->renderer()->isDocumentElement() && (paintFlags & PaintLayerPai ntingRootBackgroundOnly); 1679 return layer->renderer()->isDocumentElement() && (paintFlags & PaintLayerPai ntingRootBackgroundOnly);
1684 } 1680 }
1685 1681
1686 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const RenderObject* renderer) 1682 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint Flags, const RenderObject* renderer)
1687 { 1683 {
1688 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && renderer->hasClipPath())) ? IgnoreOverf lowClip : RespectOverflowClip; 1684 return (paintFlags & PaintLayerPaintingOverflowContents || (paintFlags & Pai ntLayerPaintingChildClippingMaskPhase && renderer->hasClipPath())) ? IgnoreOverf lowClip : RespectOverflowClip;
1689 } 1685 }
1690 1686
1691 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 1687 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
1692 { 1688 {
1693 // https://code.google.com/p/chromium/issues/detail?id=343772 1689 // https://code.google.com/p/chromium/issues/detail?id=343772
1694 DisableCompositingQueryAsserts disabler; 1690 DisableCompositingQueryAsserts disabler;
1695 1691
1696 if (compositingState() != NotComposited && compositingState() != PaintsIntoG roupedBacking) { 1692 if (compositingState() != NotComposited) {
1697 // The updatingControlTints() painting pass goes through compositing lay ers,
1698 // but we need to ensure that we don't cache clip rects computed with th e wrong root in this case.
1699 if (context->updatingControlTints() || (paintingInfo.paintBehavior & Pai ntBehaviorFlattenCompositingLayers)) { 1693 if (context->updatingControlTints() || (paintingInfo.paintBehavior & Pai ntBehaviorFlattenCompositingLayers)) {
1694 // The updatingControlTints() painting pass goes through compositing layers,
1695 // but we need to ensure that we don't cache clip rects computed wit h the wrong root in this case.
1696 // FIXME: ok, but what about PaintBehaviorFlattenCompositingLayers? That's for printing.
1697 // FIXME: why isn't the code here global, as opposed to being set on each paintLayer() call?
1700 paintFlags |= PaintLayerUncachedClipRects; 1698 paintFlags |= PaintLayerUncachedClipRects;
1701 } else if (!compositedLayerMapping()->paintsIntoCompositedAncestor()
1702 && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingRefle ction)
1703 && !paintForFixedRootBackground(this, paintFlags)) {
1704 // If this RenderLayer should paint into its own backing, that will be done via CompositedLayerMapping::paintContents()
1705 // and CompositedLayerMapping::doPaintTask().
1706 return;
1707 } 1699 }
1708 } else if (viewportConstrainedNotCompositedReason() == NotCompositedForBound sOutOfView) { 1700 } else if (viewportConstrainedNotCompositedReason() == NotCompositedForBound sOutOfView) {
1709 // Don't paint out-of-view viewport constrained layers (when doing prepa inting) because they will never be visible 1701 // Don't paint out-of-view viewport constrained layers (when doing prepa inting) because they will never be visible
1710 // unless their position or viewport size is changed. 1702 // unless their position or viewport size is changed.
1711 return; 1703 return;
1712 } 1704 }
1713 1705
1714 // Non self-painting leaf layers don't need to be painted as their renderer( ) should properly paint itself. 1706 // Non self-painting leaf layers don't need to be painted as their renderer( ) should properly paint itself.
1715 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) 1707 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant())
1716 return; 1708 return;
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
2026 stateSaver.save(); 2018 stateSaver.save();
2027 context->concatCTM(transform.toAffineTransform()); 2019 context->concatCTM(transform.toAffineTransform());
2028 } 2020 }
2029 2021
2030 // Now do a paint with the root layer shifted to be us. 2022 // Now do a paint with the root layer shifted to be us.
2031 LayerPaintingInfo transformedPaintingInfo(this, enclosingIntRect(transform.i nverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBehavior, 2023 LayerPaintingInfo transformedPaintingInfo(this, enclosingIntRect(transform.i nverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBehavior,
2032 adjustedSubPixelAccumulation, paintingInfo.paintingRoot, paintingInfo.ov erlapTestRequests); 2024 adjustedSubPixelAccumulation, paintingInfo.paintingRoot, paintingInfo.ov erlapTestRequests);
2033 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags ); 2025 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags );
2034 } 2026 }
2035 2027
2028 bool RenderLayer::shouldPaintLayerInSoftwareMode(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
2029 {
2030 DisableCompositingQueryAsserts disabler;
2031
2032 return compositingState() == NotComposited
2033 || compositingState() == HasOwnBackingButPaintsIntoAncestor
2034 || context->updatingControlTints()
2035 || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)
2036 || ((paintFlags & PaintLayerPaintingReflection) && !has3DTransform())
2037 || paintForFixedRootBackground(this, paintFlags);
2038 }
2039
2036 void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* conte xt, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 2040 void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* conte xt, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
2037 { 2041 {
2038 if (!hasSelfPaintingLayerDescendant()) 2042 if (!hasSelfPaintingLayerDescendant())
2039 return; 2043 return;
2040 2044
2041 #if ENABLE(ASSERT) 2045 #if ENABLE(ASSERT)
2042 LayerListMutationDetector mutationChecker(m_stackingNode.get()); 2046 LayerListMutationDetector mutationChecker(m_stackingNode.get());
2043 #endif 2047 #endif
2044 2048
2045 RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit); 2049 RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit);
2046 while (RenderLayerStackingNode* child = iterator.next()) { 2050 while (RenderLayerStackingNode* child = iterator.next()) {
2047 RenderLayer* childLayer = child->layer(); 2051 RenderLayer* childLayer = child->layer();
2048 2052 // If this RenderLayer should paint into its own backing or a grouped ba cking, that will be done via CompositedLayerMapping::paintContents()
2049 // Squashed RenderLayers should not paint into their ancestor. 2053 // and CompositedLayerMapping::doPaintTask().
2050 if (childLayer->compositingState() == PaintsIntoGroupedBacking) 2054 if (!childLayer->shouldPaintLayerInSoftwareMode(context, paintingInfo, p aintFlags))
2051 continue; 2055 continue;
2052 2056
2053 if (!childLayer->isPaginated()) 2057 if (!childLayer->isPaginated())
2054 childLayer->paintLayer(context, paintingInfo, paintFlags); 2058 childLayer->paintLayer(context, paintingInfo, paintFlags);
2055 else 2059 else
2056 paintPaginatedChildLayer(childLayer, context, paintingInfo, paintFla gs); 2060 paintPaginatedChildLayer(childLayer, context, paintingInfo, paintFla gs);
2057 } 2061 }
2058 } 2062 }
2059 2063
2060 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer* rootLayer, const LayoutRect& dirtyRect, 2064 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer* rootLayer, const LayoutRect& dirtyRect,
(...skipping 1725 matching lines...) Expand 10 before | Expand all | Expand 10 after
3786 } 3790 }
3787 } 3791 }
3788 3792
3789 void showLayerTree(const blink::RenderObject* renderer) 3793 void showLayerTree(const blink::RenderObject* renderer)
3790 { 3794 {
3791 if (!renderer) 3795 if (!renderer)
3792 return; 3796 return;
3793 showLayerTree(renderer->enclosingLayer()); 3797 showLayerTree(renderer->enclosingLayer());
3794 } 3798 }
3795 #endif 3799 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698